Working system · Operating case study
LETO: Learning That Arrives Ready
The architecture and operating profile of a daily learning system built from local authoring, scheduled cloud generation, and a three-minute PWA session.
TL;DR
LETO (LEarn TOday) turns a subject defined once into a short daily learning session. A local authoring pipeline compiles the habit. Each night, a scheduled cloud job researches the topic, writes a ten-question quiz and its rationale, and renders a short audio briefing. The learner opens the finished session the next morning.
The system combines a local multi-agent authoring pipeline, a Google Cloud batch job, immutable objects in Cloud Storage, Cloud Text-to-Speech, and a small PWA behind Identity-Aware Proxy. This article documents that architecture, its workload, and its operating cost. The system is deployed and used daily; what it does not yet claim is measured learning effectiveness. That evaluation is future work and is scoped explicitly in Section 7.
1. Why build this?
A chat-based learning routine asks the learner to choose a topic, formulate a prompt, judge the response, and preserve continuity. That is useful for exploration, but it adds friction to a small task repeated every day.
The deeper issue is not the number of steps but their kind: the chat loop quietly assigns the learner a second job, daily curriculum designer and quality controller. The interaction becomes a task to maintain rather than a habit to keep.
LETO began as a way to prepare for a Swiss naturalization knowledge test through steady exposure to history and civics. The learner defines a habit once; the system then chooses daily material, incorporates recent performance, writes the session, and publishes it before the learner arrives. The same pipeline now supports subjects such as German grammar.
In daily use: a real question
A representative German grammar item asks:
Ich kann heute Abend nicht ins Kino gehen, ____ ich noch viel arbeiten muss.
weil·dass·obwohl·wenn→ correct: weil
All four distractors are subordinating conjunctions that send the verb to the end of the clause, so the item tests meaning rather than revealing the answer through word order. This example shows the intended construction quality. It is not evidence of retention or learning progress, which LETO does not yet measure longitudinally.
2. Rooted in the Quiet Wire thesis
The Quiet Wire framework for Lower Cognitive Footprint AI asks a specific question: not whether AI can produce an answer cheaply, but whether it can reduce the total attention a person spends reaching an outcome, prompting, steering, judging, and remembering included.
LETO applies this as a separation in time. All decisions that require judgment, including audience, language, focus areas, and pacing, are made once, when the habit is authored. All recurring work, including research, generation, and continuity, is delegated to a nightly job. What remains for the learner each morning is only the finished material. The measure of success is that the daily interaction contains no decisions at all.
Design rule
The daily interface is intentionally not configurable. Authoring holds the choices; the session holds the material.
3. Architecture
LETO has three operating stages connected by files: a habit is authored once, generated nightly, and consumed on demand. Cloud Storage is the boundary between them. No stage needs another stage to be online at request time.
Intent is compiled once. Production runs at night. The learner reads finished files.
3.1 The Skill Factory: one-time local authoring
The Skill Factory is a separate local project built with Google’s Agent Development Kit. It uses a local Gemma model through Ollama and vector retrieval over reference literature to compile a habit from the user’s requirements.
Three roles form a Generator-Critic pipeline:
- Drafter. Produces the pedagogical strategy: audience, pacing, focus, grounding anchors, and the downstream prompt.
- Auditor. Checks that strategy against the retrieved sources and the user’s constraints. A failure returns specific corrections to the Drafter.
- Compiler. Translates the approved strategy into the strict JSON blueprint consumed by the nightly engine.
The Auditor can reject a draft and return corrections. The Compiler is checked separately by Python’s JSON parser, which returns exact syntax errors. Reference passages are retrieved through local embeddings and ADK’s memory abstraction. The validated habit brief is then written to Cloud Storage for the nightly engine.
3.2 The nightly engine: one research loop, one generation call
Daily production runs as a Cloud Run Job. Cloud Scheduler invokes it in the Europe/Zurich time zone; the process writes the day’s artifacts and exits.
For each habit, the job performs two model phases:
- Research. A tool-using agent searches Wikipedia, reads the results, and decides whether further searches are needed. Tool responses are capped so retrieval cannot grow the prompt without bound.
- Generation. One Gemini 2.5 Flash call, constrained by a response schema, produces the ten questions, theme assignments, a rationale for the day’s choices, and the podcast script together.
The generation prompt includes the habit brief, performance by theme, recent answered history, prior rationales, and fresh research. A rolling 30-day window bounds context and cost.
3.3 Agents only where they earn their place
| Task | Mechanism used | Reason |
|---|---|---|
| JSON formatting | Native structured output | The platform already solves the format contract. |
| Theme balancing | Deterministic counts | This is arithmetic, not model judgment. |
| Quiz / rationale / script consistency | One generation call | One decision cannot drift out of sync across separate calls. |
| Factual grounding | One scoped research agent | Retrieval changes the quality of the artifact and earns its cost. |
Prose facts use retrieval. Numeric performance uses aggregation. Recent rationales use a chronological window. Each mechanism follows the shape of its data.
3.4 Speech rendering
A separate module sends the script to Cloud Text-to-Speech and writes the MP3. Paragraph breaks become measured pauses, and voice selection follows the habit language. German uses Chirp 3 HD; French and English use Neural2. Content remains separable from audio rendering.
3.5 The daily surface
The delivery side is a Go service that embeds a Vite and React frontend into the compiled binary. One deployable contains the API and the interface, preventing version drift and keeping cold start small. The Cloud Run Service scales to zero when nobody is using it.
The PWA presents a habit hub, the day’s session, and the result. Questions advance one at a time; grading and statistics stay server-side. It is installable but has no service worker: an earlier offline layer conflicted with Identity-Aware Proxy by caching responses across authentication boundaries.
3.6 State: immutable files, no database
Configuration, sessions, history, rationales, audio, and statistics are deterministically named objects in one Cloud Storage bucket. Immutable dated files make each day inspectable; only the latest aggregate statistics file is mutable. “Today” is calculated explicitly in Europe/Zurich. At this scale, a database would add cost and operational surface without solving a current need.
3.7 Security and delivery
Identity-Aware Proxy and IAM enforce access before requests reach the Go service. A Workspace group holds the IAP access role, while service identities and Application Default Credentials authorize cloud calls. The application contains no password store or credential-handling code.
The generator and application have separate containers and path-filtered Cloud Build triggers. Build identities remain inside the project’s IAM boundary.
4. Performance
| Path | Observed characteristic | User consequence |
|---|---|---|
| Habit authoring | Local multi-agent run; seconds to a few minutes depending on critic retries. | Paid once per habit and never placed on the daily path. |
| Nightly generation | Tens of seconds per habit for research, generation, speech, and storage. | Completes before the learner arrives; model latency is invisible. |
| Delivery cold start | Sub-second for the small Go binary with embedded frontend. | The first daily visit does not feel like starting an AI system. |
| Session path | No model call. The service reads finished JSON and MP3 objects. | The daily experience is stable and predictable. |
The performance strategy is architectural rather than algorithmic: remove AI latency from the user’s critical path. A model can take tens of seconds overnight and still produce an interface that feels immediate in the morning.
5. Cost: bounded and auditable
The cost model uses explicit units: model tokens, speech characters, serverless execution time, and stored bytes. Rates change, so the durable value is the method and the workload volume. Figures below use Google Cloud’s published pricing available in July 2026.
5.1 One-time authoring
The Skill Factory runs locally through Ollama. It creates embeddings, retrieves reference material, and performs the Generator-Critic loop without cloud inference. Its cloud-model cost is therefore zero; the remaining cost is local electricity and the time spent defining the habit.
5.2 Recurring model budget
| Phase | Input | Output | Role |
|---|---|---|---|
| Research loop | ≈6,000 tokens | ≈800 tokens | Retrieve and compress grounding facts. |
| Structured generation | ≈45,000 tokens | ≈3,500 tokens | Quiz, themes, rationale, and narration. |
| Total | ≈51,000 | ≈4,300 | One complete daily artifact. |
At current Gemini 2.5 Flash rates, that volume is roughly one to a little over two US cents per day, depending on whether output is billed as standard text or thinking output. The resulting model cost is approximately $0.30–$0.70 per habit per month. Early in a habit’s life, before the 30-day context window fills, it is lower; after 30 days it plateaus.
5.3 Speech budget
A two-to-three-minute script is roughly 2,500 characters. At list price, that is about $0.075 for Chirp 3 HD or $0.040 for Neural2. At one daily habit, monthly usage is approximately 75,000 characters, well inside the first one million characters included for each of those voice classes. Effective TTS cost at personal scale is therefore zero under the published allowance.
5.4 Monthly total
| Component | Personal-scale monthly cost |
|---|---|
| Gemini 2.5 Flash | ≈$0.30–$0.70 |
| Cloud Text-to-Speech | $0 within the published character allowance |
| Cloud Run Job and Service | Typically within the serverless free tier at this duty cycle |
| Cloud Storage and operations | Negligible for a few megabytes of personal material |
| Scheduler, IAP, and IAM | No material charge at this scale |
| Total | Under $1 per active habit per month |
The estimate is not a universal price guarantee. Region, output mode, free-tier eligibility, and product pricing can change. It is a transparent statement about this workload: no database floor, no always-on compute, bounded context, one useful agent loop, one generation call, and speech volume far below the allowance.
5.5 Scaling and tenancy
Cost grows approximately linearly with active habits because each nightly run is independent. The access layer supports a Workspace group, but the data model remains single-tenant: statistics are shared rather than namespaced per person. Per-user isolation is future work.
6. Roadmap
- Measure learning outcomes. Track retention, question quality, factual error, repetition, and progress across months.
- Expand factual grounding. Add document retrieval for domains with authoritative, reusable reference material.
- Add real-resource tests. Exercise storage, range requests, timezone behavior, and IAM against dedicated test resources.
- Test larger-scale economics. Observe where speech allowances, concurrency, and context volume change the personal cost model.
A separate e-ink companion currently exists only as a Mac-based simulation. Physical deployment on a Raspberry Pi Zero 2 W would require measured power, display, and small-model quality results, so it is not treated as evidence for the production system.
7. Current evidence and limits
LETO is deployed and used as a daily personal system. The accompanying video shows the operational outcome end to end: a generated habit appears in the installed PWA, the session opens, the briefing plays, and the quiz is ready to complete. The implemented evidence also covers scheduled generation, authentication, storage, multilingual output, and a workload-based cost estimate under one dollar per active habit per month.
This demonstrates that the complete system works; it does not yet establish long-term educational effectiveness. There is no longitudinal retention measure or reviewed error rate yet, and fact-heavy subjects carry more verification risk than rule-based grammar. Until those measurements exist, LETO should be read as a working system and operating case study rather than a validated learning intervention.
Authored once · generated nightly · approximately three minutes to complete
Sources
Architecture details and workload volumes are taken from the implemented LETO system. Current service behavior and pricing should always be checked against primary documentation: