Enginery
Artifacts / Pitch

Lettura: the daily chapter, in an app instead of an email

An email sender cannot tell whether you read yesterday's, so it keeps sending. Keep both ends of the loop, replace the middle with a queue that holds exactly one live item.

Made

05 Sept 2026

Format

Shape Up pitch, written 2026-09-05

Shape Up format. Two-weekend appetite. One user, and that is the point.

Problem

The loop is three steps and two of them already work. A vocabulary app on my phone grows the words I know. A writing session turns those words into a story chapter I can actually read, verified against that word list and rendered to audio. Then the chapter is emailed, and email is where it breaks.

An email sender cannot tell whether yesterday’s chapter was done. So it sends again. The inbox fills with duplicates, and on a walk there is no answer to the only question that matters, which is which one is next. Two weeks into having a newborn that looked like fourteen unworked emails and a review schedule advanced thirteen times without a single listen.

I want to go back to learning Italian, not to managing a mailbox.

Appetite

Two weekends, small batch. One for the backend and the script that feeds it, one for the phone app. Sideloaded, one user, no store listing.

If the app has not replaced both email senders by the end of the second weekend, stop, and keep a much cheaper fix instead: teach the sender to stop when a reply comes back.

Solution

Keep both ends. Replace the middle. The vocabulary app is untouched. Chapter writing, coverage checking against my known words, and audio rendering stay exactly as they run today. What changes is where a finished chapter goes. Instead of an email, it is pushed to a small backend that holds the queue, and a one-screen phone app reads the head of that queue.

The app opens on today’s chapter: title, a play button that keeps playing on the lock screen, the text underneath, the glossary at the bottom. Two ways to finish it: Fatto (done) or Ancora (still hard, keep it another day). One text box, for a word I had to guess. Fatto is the only thing that advances the queue. A notification at half six in the morning says the chapter’s name and nothing else.

Below today sits everything already finished, newest first, each one readable and playable again, because a chapter heard a fourth time is doing a job a fresh one cannot.

What the app never shows is the chapter after today. The queue holds one live item by construction, so “which one is next” is answered by opening the app, and “what did I do last” by scrolling down.

Refilling the queue is the writing session, unchanged. When the app is two chapters from empty, a morning job refreshes the word list and files one nudge. The next volume gets written against that boundary, verified, rendered, and published behind today’s chapter, where it stays invisible until I reach it.

Rabbit holes

  • Push notifications. Server push is a weekend on its own. The app schedules its own daily local notification instead. Never in scope.
  • Ranged audio. iOS will not play audio the server cannot serve in byte ranges. A sibling project hit exactly this. Serve ranges correctly on day one and test on a real phone, not in a browser.
  • Auth. One bearer token, baked into the app and the publishing script. Not accounts, not a login screen.
  • The six recurring listening tracks. Their rotation schedule is a second scheduler hiding inside the first. Load them as ordinary queue items I can re-add by hand, and do not port the schedule in this cycle.
  • Tap to look up a word. A word is typed, not tapped. Typing is a signal too, and it is one afternoon cheaper.

No-gos

Other users. Filotto, which is parked and runs on a different graph. Any language model in the delivery path. Cloud text to speech, since the audio is rendered locally. Linking to Paroletta. Replacing the vocabulary app. Anything the email did not already do, except Fatto.

The rest of the argument

Get updates

Occasional notes on what's happening at Enginery. No spam, no marketing.