In the Original One Rails monolith, four language-model passes, and a certified audio pipeline.
A live Rails application that lets self-directed adults read real German literature years before a conventional course would let them. Language and speech models do the work that needs linguistic judgment. Rails owns everything that has to be true — workflow state, validation, publication, personalization, cost, access, and recovery when a provider is confidently wrong.
Grant recipient
-
A durable Rails system
Resumable workflows, row-level claims, progressive publication, operator repair, and access rules that survive provider failure.
-
An evaluated AI pipeline
Six processing passes — four language-model, one deterministic, one speech — with expert-designed fixtures, structural validators, cost evidence, and pass-specific model choice.
-
Audio that must prove itself
Timestamped speech is aligned and certified by independent code before it can make a section reader-ready.
What this project is evidence of
Rails product architecture
A domain model separating book, processing section, learner-language adaptation, and per-reader projection — so a second learner language never re-pays for the source-language analysis. Around it: durable workflow state, progressive publication, transactional entitlements, operator repair. The reader itself is Hotwire — Turbo Frame chunk replacement, Stimulus prefetch, and frame-synchronized audio highlighting — not a second front-end application.
Applied-AI engineering
Models get narrow semantic jobs; deterministic code decides whether the result counts. Every provider boundary records evidence, cost, and provenance, with repair proportional to what failed.
Domain expertise that makes evaluation possible
Native English, C2 German, professional German-to-English literary translation. A model can produce fluent German analysis that is wrong in context. Deciding which is which is the job, and it needs someone who has mastered both languages to steer the process.
Production judgment
Queue isolation, row claims, idempotent paid calls and payment webhooks, certified audio, explicit approval boundaries, and a candid account of what is weak. The stack is Rails; the specific challenges — durable state around unreliable work, idempotency where money moves, evaluation for probabilistic components — are not.
One Rails 8 monolith on PostgreSQL. Sidekiq runs general and audio work in separate processes; Redis carries queues, not product truth. Turbo and Stimulus add interaction without making the reader a second application. Processing, publication, reader state, payment, and repair share transactional boundaries — splitting them into services would add distributed consistency problems exactly where PostgreSQL is doing valuable work. The criterion for splitting one out is its own ownership, deployment, or scaling boundary. Nothing here has crossed that line yet.
Accounts, teams, invitations, and role primitives come from Bullet Train and Devise. OpenRouter routes pass-specific language models, ElevenLabs produces timestamped speech, Stripe handles payment, and Avo gives operators a real inspection surface. Custom engineering went to the reading domain, not to commodity infrastructure that a mature service already solves.
Real literature was always saved till last.
I began serious language learning as an adult because I wanted access to difficult books in the original. The usual sequence put that years away: vocabulary, then grammar, then simplified texts, and only eventually the works that made the language worth learning.
Spaced repetition, the shadowing technique of Prof. Argulles, Ilya Frank editions, and professional literary translation each solved part of it. None made a new literary text adapt itself to one reader’s knowledge.
Read why I left corporate Rails to build it →
What I decided not to build
- Drills around the text convert literature into a study product; attention leaves the narrative, which is the failure the product exists to prevent.
- Whole-paragraph translation removes the productive struggle — the reader stops engaging with the original.
- Fixed annotated editions are too easy for one reader, insufficient for another, and stale as soon as the reader learns.
The solution began to take shape: keep the original intact, put support at the point of difficulty, then let it recede.
The product bet
If a reader can understand enough of a real text without constantly leaving it, wanting to know what happens next becomes the engine of learning.
That is the hypothesis. The application is instrumented around activation, active reading, continued pull, retention, and cost. The next evidence has to come from reader behavior.
Six parts of the system, in detail
Each card states its conclusion. Open one if you'd like to see the evidence behind it.
- Domain model A book, a unit of work, and a learner's version of it Source-language analysis is produced once. Only the learner-facing layer is paid for per learner language.
- Rails workflow Workflow state lives in PostgreSQL, not the queue Publication advances only through a contiguous ready prefix, so a later failure cannot retract earlier reading.
- Applied AI Six passes: four language-model, one deterministic, one speech Models get narrow semantic jobs. Deterministic code decides whether the result counts.
- The reader The same text gets quieter as the reader learns Content is processed once; support is projected per reader, per request — and the reader is Hotwire, not a second application.
- Engineering with AI How I work with coding models Generating code is no longer the constraint. Specification, impact analysis, and integration are.
- Trade-offs Four things I'd fix next The next architecture step is clearer boundaries inside the Rails monolith, not a microservice rewrite.
Get in touch
I’d be glad to talk about the system you’re building, the trade-offs you’re facing, and where Rails and applied-AI engineering can help.
The production repository is private, but I’m glad to walk through any of this directly — the workflow model, the evaluation harness, or the audio alignment work — including reading the source together.
Based in Bottrop, Germany, with a Niederlassungserlaubnis — permanent residency and unrestricted work authorization, so there is no sponsorship to arrange. Looking for a full-time Rails / applied-AI role: remote within Germany, hybrid where that means travelling a few times a year, or elsewhere in Europe already set up to employ from Germany. Conversations in German or English.