In one paragraph
Krapka is a typing trainer for people learning to read in a second language: you type real literature, at your level, in whichever alphabet you are trying to make automatic. The product idea is small. The supply chain behind it is not — every story in the catalogue carries three retellings at graded difficulty, written in the story’s own language, plus a sentence-aligned translation into each of seven others, so the same text is typeable and glossed no matter which language a reader arrives in. Sixty-eight stories, eight languages, three difficulty levels: that is over sixteen hundred distinct pieces of prose, each one aligned one-to-one with the sentence it translates. Commissioning that by hand is a year of somebody’s editorial budget. Here it is a pipeline that runs five stories at a time, with a copyright gate and an alignment gate it cannot skip, operated by one person alongside a full-time job. Nine months, 460 commits, live on real payments.
The problem in business terms
A content product in eight languages is normally a headcount problem: you hire or commission per language, and every new story multiplies across the whole matrix before it earns anything. That arithmetic is what keeps small language-learning products monolingual — not the software, which is a fortnight of work, but the editorial supply chain, which never stops. The choice this case is really about is whether a catalogue of that shape can be produced by one person at a quality a paying reader will accept, and what has to be true structurally for the answer to be yes.
- one brief per language per level — 24 separate commissions for a single story
- alignment is nobody's job, so the gloss drifts out of step with the text being typed
- copyright safety rests on each contributor's judgement, checked by nobody
- adding a ninth language means re-commissioning the entire back catalogue
- cost scales with the catalogue, so the catalogue stays small
- one brief per batch of five stories; the language matrix is a parameter, not a purchase order
- gloss is generated against the canonical sentence array, so the two can never drift
- a mechanical shingle check refuses any six-word sequence carried over from the source
- a ninth language is a re-run over existing masters, not a re-commission
- cost scales with batches, so the catalogue grew to 68 stories before launch
What makes this different from a typing trainer with some books in it
Two structural decisions carry most of the weight. The first is that a story has exactly one canonical sentence array, and everything else is a grouping of it. A reader can type sentence by sentence, paragraph by paragraph, or in longer chunks, and the translation shown alongside is always the translation of the exact unit under the cursor — because paragraphs and chunks are never translated independently, they are joins of member sentences, derived once and applied identically in every language. The alternative was tried and measured: re-splitting per paragraph produced 248 units against 227 global sentences for a single Ukrainian story, which is a gloss that silently points at the wrong line. One array, three grains, no drift. The business meaning is that adding a granularity, or a language, costs nothing in re-translation.
The second is the line drawn around what a model is allowed to author. The source texts are human literature out of copyright; the retellings and glosses are drafted by a model and then gated — Ukrainian and English pass a human QA step, the other six pass a documented self-review, and everything passes the mechanical copyright check before it can be staged. The ambient music is on the other side of that line deliberately: it is atmosphere, not content, so it is generated freely. Keeping the line explicit is what lets the catalogue grow at pipeline speed without the product becoming the thing its own audience came here to avoid.
Plot completeness at every level. The A1–A2 retellings preserve the whole story at simpler vocabulary and shorter sentences — they are not synopses. A beginner who finishes one has read the story, not a summary of it, and that distinction is the entire reason someone would type it.
| criterion | commission per language | model output, shipped as-is | model draft + graded gates chosen |
|---|---|---|---|
| cost per new story | no | yes | yes |
| time to a ninth language | no | yes | yes |
| gloss stays 1:1 aligned | partial | partial | yes |
| copyright checked mechanically | no | partial | yes |
| reads like a person wrote it | yes | no | yes |
| one operator can run it | no | yes | yes |
A session in the room
One repo, two jobs
Krapka is unusual amongst these cases in that the agent’s remit spans both halves of the business. The same session that fixes a race in the typing engine also decides which five stories the catalogue needs next and then produces them. There is no handover between a content team and an engineering team, because there is neither.
Two files of context carry that: the repo’s own guide, which holds the design system, the tier model and the deployment hazards, and the story pipeline playbook, which holds the editorial rules — which languages get human QA, what a difficulty level is allowed to leave out, what counts as a copyright violation.
The three sessions below are real ones, tightened. One grows the catalogue, one fixes something a reader would call atmosphere and an engineer would call a shuffle, and one is the unglamorous measure-fix-measure loop that decides whether any of it feels good enough to pay for.
Growing the catalogue on purpose
A catalogue in eight languages goes lopsided quietly. The languages the founder reads get attention; the others get whatever was convenient. A Portuguese reader who arrives to five stories and leaves is a churn event that never shows up as a bug.
So the batch does not start with taste, it starts with a count. The thinnest languages set the brief, and the sourcing constraint — genuinely out of copyright, short enough to finish in one sitting — is a filter applied before any writing happens, not an argument had afterwards.
The failure in the middle is the point. A beginner retelling came back at 804 words, over the length cap that makes an A1 level actually readable at A1. The cap exists because graded difficulty is the product; a level that quietly drifts upward is worse than not having levels. The gate caught it, the batch regenerated, and nothing shipped in between.
What the business gets is a catalogue that grows in planned increments rather than in bursts of enthusiasm, and a per-story cost low enough that the eighth language is worth serving at all.
When “it repeats” is an arithmetic problem
Ambient music in a typing trainer has one job: to go unnoticed for forty-five minutes. The moment a listener can name the loop, it has become a distraction, and the feature is worse than not having it.
The first fix that suggests itself — generate more tracks — does not work, because six takes of one prompt are six takes of one sound-world. The second fix that suggests itself — add more moods — does not work either, since a session only ever sits on one bed. The lever is variety inside a single bed, which is why the prompt got factored into mood and palette: what the music feels like, and what physically makes the sound.
Then the measurement that saved the feature from being quietly undone by its own player. A plain shuffle of nine tracks puts two of the same palette back to back nine times out of ten. Three carefully distinct sound-worlds, dealt at random, sound exactly like one. Simulating that before shipping is the difference between a feature and a feature that works.
This is also the clearest example of the line the product draws: the music is generated freely because it is atmosphere. The prose a reader types is gated, reviewed, and checked, because it is the thing they came for.
Measure, fix, measure again
Speed is a conversion feature in a product whose whole proposition is unhurried attention. A reader who waits six seconds for a page about mindful reading has already been told something about the product, and it is not what the landing page says.
The first pass did what bundle work usually does — found two analytics SDKs loading before anything a visitor came to see, deferred them to idle, and self-hosted the fonts that were blocking the render from someone else’s CDN. Eager JavaScript fell by a quarter and the desktop score went where it should.
And then mobile stayed at 65, which is the useful half of the story. The JavaScript work had landed cleanly — blocking time was zero — and the remaining six and a half seconds were an image. The full-bleed hero offered no tier below 1536px, so a phone downloaded a quarter of a megabyte and threw most of it away. Believing the first fix and skipping the second measurement would have shipped a slow product with a good changelog.
Re-measuring against production rather than a local build is the habit that makes the difference. Local numbers flatter; the number that matters is the one a reader on a phone experiences, and it only exists after the deploy.
What’s shipped
- ● 01source vettingpublic domain confirmed · one-sitting length · plot carries
- ● 02three graded levelsA1–A2 · B1–B2 · C1, written in the story's own language
- ● 03seven-language glosssentence-aligned 1:1 against the canonical array
- ● 04quality gates6-word shingle copyright check · alignment audit · length cap
- ● 05cover art + landinggenerated cover, author bio, localised title, curated reviews
- ● 06publish-on-deployrows stay draft until their assets are in the bucket
- ● 01typing enginehidden-character mode · per-unit gloss · three granularities
- ● 02keyboard layoutsEN ×6 · FR + bépo · DE + neo2 · Korean dubeolsik + sebeolsik
- ● 03tiering + paymentsanonymous / free / paid · free feed clamped to sentences
- ● 048-language interfaceincluding market-tailored landing pages per language
- ● 05ambient beds7 moods × 3 palettes · palette-spread player · same-origin
- ● 06test suite109 tests · typing engine, layout resolver, audio engine
The two hazards worth naming, because both cost a production incident before they became rules. Content ships separately from code and must land first — the storage SDK authenticates through a sidecar that only exists inside the host, so nothing can be uploaded from a laptop and a deploy that reads an asset before the asset exists returns a 404 to real readers. And schema changes go to the production database before the code that queries them, because the platform’s publish step runs a schema sync that has dropped a column and broken the live feed. Both are now checklist items with a gate in front of them: publish-on-deploy.ts holds the first, and the deploy runbook holds the second.
What the catalogue would have cost by hand
Every story carries three graded retellings, each aligned into every supported language. Plug in your own assumptions for what commissioning one of those would take and what an editorial hour costs you.
runs locally · 0 network calls · deterministic
At the defaults that is over a thousand editorial hours — most of a person-year — for a catalogue that has not yet sold a subscription. No solo founder gets to spend that, which is why nearly every product in this category ships in one language and stays there.
The verdict from the room
What Krapka demonstrates is not that a model can write a translation; it is that a supply chain with real gates in it can be operated by one person and still produce something a paying reader accepts. The gates are where the value sits — a length cap that keeps a beginner level genuinely beginner, an alignment invariant that makes a wrong gloss structurally impossible rather than merely unlikely, a copyright check no contributor can talk their way past. Those are editorial-director decisions encoded once and then enforced on every batch, which is a different thing from generating content quickly. The product shipped with a catalogue deep enough to launch on, in eight languages, before it had a single customer to justify the spend.
This is a real answer to the question every content business eventually asks — can we serve a second and third market without a second and third team. Sixty-eight stories in eight languages before launch, produced by one person, is a cost structure competitors in this category do not have.
The invariant I would defend hardest is the single canonical sentence array — making a misaligned gloss impossible beats testing for it, and it is what lets a ninth language be a re-run rather than a rewrite. The corner I would watch is the quality tiering: alignment and copyright are checked mechanically, but whether a sentence actually reads well in Italian rests on a self-review with no native speaker behind it. That is a fair trade at this catalogue size, and it is the first place I would put a person back in if a given market ever mattered commercially.
The gates make this operable, which is the part I care about. A batch that regenerates itself when a level runs long, and a release that refuses to publish a story whose artwork has not landed, mean the failure modes are boring — and boring failures are the ones a one-person operation survives.
Nine months. One builder. 68 stories, 8 languages, 3 graded levels, 460 commits. A catalogue that would have been a person-year of editorial commissioning, produced alongside a full-time job and shipped behind gates it cannot skip.
Krapka is my own product, so it is named directly and its stack described openly. What is deliberately abstract here is the shape of the prompts and the model-side workflow: the operating pattern is the exhibit, not the recipe.