The problem
AI character chat apps forget. They keep a rolling context window, so the character that knew your name last week greets you like a stranger today. The illusion that makes roleplay worth doing collapses the moment continuity breaks — and every user notices, because they were the one who told it something that mattered.
Who it's for
Japanese-speaking readers and writers of interactive fiction who want a character relationship that accumulates, not a chatbot that resets. Alys ships in Japanese.
What it does
Alys is an iOS app for conversational fiction with AI characters.
- Streaming chat that renders in three distinct voices — narration, inner voice, and spoken dialogue — each typeset differently, revealed with a length-aware typewriter that always finishes a turn within six seconds.
- Memory in three tiers. Short-term is the last 24 hours of raw log. Mid-term is a structured ledger of settled facts, open questions, and the state of the relationship, rewritten by the model every turn. Long-term is embedding retrieval (multilingual-e5-large, 1024-dim, cosine) scoped to character x user and deliberately independent of which conversation you are in — so what you told a character in one thread reaches them in the next.
- Continuity that is enforced, not requested. A supervisor records only what was settled and is contractually barred from deciding the future. State changes are applied only when the model's quoted evidence literally appears in the accepted text. Repetition is caught mechanically — normalized hashing plus character 5-gram overlap — because LLM-based repeat detection was measured to miss cases.
- Turn any scene into an illustration, generated from the conversation's own context by a self-hosted SDXL service and dropped inline into the chat.
- Steer the scene: regenerate a reply, stop generation mid-stream, take a silent turn, ask the character to continue alone, rewind to any earlier message, bookmark individual lines, or pull three AI-suggested things you might say.
- A community around the characters: browse, rank, and search public characters, follow creators, comment, and — for safety — report and block at every level.
How it makes money
Chatting is free and unlimited. Coins are spent on exactly one optional thing: generating a scene illustration, at 15 coins each. Coins are consumable in-app purchases sold through RevenueCat — three packs at 200 / 500 / 1,000 coins. Every new account receives 100 coins on email verification, which is six illustrations, so the paid feature is tried before it is bought. There is no subscription and no advertising.
What's different
Most character apps compete on model choice. Alys competes on what the model is given. The prompt is assembled with its invariant prefix first so that provider prompt-caching actually hits — reordering it would make every turn cost full price. Prompt text lives in plain files outside the code, never in it. The design system is 39 colour tokens and 8 permitted font sizes, each transcribed from a measured value, and enforced by roughly 60 custom inspectors — nine of which deliberately break the code to prove the inspectors still fail. Privacy is in the code path, not the policy: provider routing always sends data_collection: "deny", and that flag is not configurable by environment variable.
Challenges we ran into
Our own checks lied to us, repeatedly. A colour rule was written correctly and still lost to a more specific one. A guard counted zero violations because it had never been pointed at the directory where the violations were. A test asserted that a string appears "nowhere" while reading a hard-coded list of files. Each time the dashboard was green and the screen was wrong.
The price ladder inverted itself. Apple's Japanese price table has no JPY 750 point, so our 500-coin pack landed at JPY 700 and became a better per-coin deal than the 1,000-coin pack. Buying more cost more per coin. We moved the large pack to JPY 1,400 to make the ladder monotonic again.
Stopping a stream lost what had already been written. The screen re-read history 41ms after the user pressed stop; the server finished writing 572ms later. The text the user had typed disappeared and only came back if they reopened the room.
What we learned
An inspector that cannot fail is a lie. We now keep scripts whose only job is to break the source and prove the corresponding check goes red. Nine of them. We also keep a document titled "The limits of inspection" listing four cases where the tooling reported zero while the screen was wrong — because "zero violations" is not the same claim as "the screen is correct".
The free grant is the paywall. Every account gets 100 coins on email verification — six illustrations — so the first purchase decision is made by someone who already knows exactly what they are buying.
Measure before you claim. Every number in this submission came from running the thing. Where we have no measurement — post-launch revenue, conversion — we say so instead of estimating.
Built With
- amazon-ses
- ansible
- argon2
- deepseek
- docker
- expo-router
- expo.io
- fastapi
- gemma
- ios
- keychain
- minio
- next.js
- nginx
- openrouter
- playwright
- postgresql
- python
- react
- react-native
- revenuecat
- server-sent-events
- stable-diffusion-xl
- typescript
Log in or sign up for Devpost to join the conversation.