I'm building a voice roleplay platform solo — kotonia. It layers lip-sync avatars over high-quality multilingual TTS so you can actually talk to characters. The stack is a bit unconventional: images, audio, and video all run on local GPUs.
Character art is generated in my own creative studio. Adding a new character costs essentially nothing, which is what makes it possible to compete in this category as a solo dev.
One day I had a solid block of free time and shipped zero new features. Instead, I systematically plugged the quiet leaks draining new users before they ever reached the value. This is that story. Not glamorous at all — but probably the highest-conversion day I've had in a while.
The product was ready. The funnel had holes everywhere.
Features were all there. Characters, voices, animated avatars — the whole thing. But watching new users in their first minutes, I kept seeing the same pattern: they left before they could even reach a "working state." The problem wasn't missing features; it was the gaps between features. I closed four of them.
Fix 1: Intent-preserving auth (video goal → lands on video, chat goal → lands on chat)
This one had the biggest impact.
Users click with a purpose. "I want to make a video." "I want to talk to this character." But when they weren't logged in, the login/signup flow silently discarded that intent and dumped everyone on the same static page. Worse, the three entry paths (email signup, email login, Google login) each landed somewhere different — one sent users to an old-style AI chat, another to some mysterious code execution screen. None of it matched what anyone came to do.
The fix has two layers:
- When there's intent: carry the destination as a
nextparameter through the auth flow. A logged-out user who clicks the video studio link gets sent to login withnext=/video-studioattached, and lands on the video studio after authenticating. I also fixed a bug where the Google login button was silently dropping thenextparameter — intent was evaporating right there every single time. - When there's no intent: unify the fallback destination across all three paths to the character chat hub. But this isn't a dead static page — it auto-restores the last character the user was talking to: returning users pick up where they left off, new users start with the default character's opening line.
Now, "came for video → goes to video, came to chat → goes to chat (with their previous character intact)" works consistently across email, Google, and every entry point.
Lesson: auth is an interruption, not a destination. If you interrupt someone, send them back to where they were headed.
Fix 2: Making users log in again immediately after registering
Right after filling out the signup form (name, email, password), users were redirected to the login screen and asked to type their email and password again. The backend simply wasn't creating a session on registration.
Classic drop-off point. You just cleared the hardest form, and immediately hit another wall. I fixed it so that a successful registration automatically logs the user in and sends them straight to character chat. New users now meet the default character's opening line the moment they finish signing up. First impression changed from "type it again" to "a character greeting you."
This is what you see the moment you register. Instead of "please log in again," you get a world-setting narration, the character's opening line, and three reply options to choose from. There are two default characters (one male, one female), so first-timers can dive straight into conversation without any friction.
Fix 3: The UI was lying (microphone appearance vs. reality)
When starting a conversation by selecting one of the suggested replies, the mic button looked active — but the VAD (voice activity detection) wasn't actually running. The button's visual state updated after the message was sent while the session itself hadn't started yet. The UI and the underlying state were out of sync.
Users assumed "I can just start talking and it'll respond," stayed silent, got no reaction, and left. I fixed it so that starting a conversation via a suggestion or text input also properly activates the mic, keeping appearance and reality in sync.
Lesson: when the UI lies, users blame themselves and leave quietly. That's the worst kind of bug.
Fix 4: Switching characters left the previous character's image on screen
When switching characters, a media-clear bug caused the previous character's portrait to persist. You're talking to a new character but a different face is on screen — immersion shattered instantly. I fixed the clear-on-switch logic and corrected the sharing scope so public character media is accessible to everyone, ensuring the character you actually selected is the one you see.
The underlying principle: bottlenecks are usually in boring places
Shipping flashy new features feels good. There's dopamine in it, a sense of progress. But users aren't churning because features are missing — they're churning because the funnel has holes. And engineers have a gravitational pull toward "polish the features more" rather than "fix the gaps." Building the product is comfortable, familiar, and gives immediate feedback.
Deliberately shipping zero features this day was partly about resisting that gravity.
What all four fixes had in common: every single one was the kind of friction where users feel like it's their fault and leave without saying anything. Forced to retype credentials. Pressed something and nothing happened. Wrong face on screen. Never arrived where they meant to go. Silent churn. Which is exactly why you have to observe it yourself and hunt it down — nobody's going to file a bug report.
The real bottleneck ahead
Being honest: fixing all this alone won't grow the business.
Polishing the funnel — keeping people who already arrived — is a necessary condition, not a sufficient one. The real problem is top-of-funnel traffic. The tap is still barely open. In consumer companion/roleplay, product quality matters, but the category is decided by distribution and community. No shortcuts there. Write articles, work social, publish videos. Wait for the compounding to kick in.
That said, being tiny has its own strategic advantages. With a small sample size, quantitative metrics (A/B tests, funnel stats) are noise — qualitative wins. Asking each individual who dropped off what happened teaches you more than any dashboard. And with no audience yet, this is also the freest moment to go narrow and sharp. No brand equity to protect. Find one real wedge.
Execution, intuition, system design, engineering, personality — everything you have gets tested simultaneously. It's exhausting, but it's genuinely interesting. The product is ready. Now it's time to focus outward.
kotonia is here. Sign up and the first thing you'll meet is a character saying hello — that's the Fix in action.