Libretto
Roadmap
Feature inventory · 108 items · 13 tracks
-
108
Total rows
108 still in the plan · 0 dropped
-
19
Verified on device
13 built, not device-verified
-
0
In progress
Started, not judgeable yet
-
76 / 0
Not started / blocked
7 XL rows still unsplit
-
36
Need Dylan
No session can close these alone
- 19 verified on device (17.6%)
- 13 built, awaiting the device (12%)
- 76 remaining
- 0 dropped, out of the denominator
Where we are
The next session of each run, the one row a session could open the repo and start today, and everything wrong with the build Dylan is already holding.
H1 — the personal app
Session 1 next · 4 rows · 15 sessions in the run
PL5 · PL6 · SN9 · PL7
H2 — the public app
Session 101 next · 1 rows · 10 sessions in the run
PL8
H2.5 — camera gaze
Session 201 next · 1 rows · 4 sessions in the run
G3
- Next actionable
- PL5 · git-LFS decision + configuration (or audio masters kept out of the repo, documented) (S · S1)
- The floor
- Nothing is wrong with the APK Dylan holds.
How to read this
States
- Verified on device 19
- Built, and a human confirmed it on the physical device.
- Built, not device-verified 13
- In the repo, tests green, only the emulator has seen it. Looks done, is not.
- In progress 0
- Started, incomplete, not judgeable yet.
- Planned 76
- Has a cut point, not started.
- Blocked 0
- Cannot move until something outside the row moves.
- Dropped 0
- Decided against. Kept so nobody re-files it; never counts as progress.
Effort
- S 33 open
- fits alongside other work
- M 34 open
- most of a session
- L 15 open
- a full focused session
- XL 7 open
- does not fit in one session — must be split before it is numbered
7 XL rows are still unsplit — a planning defect, not work: D2, D3, D4, D5, D6, D7, D8.
Flags
- Floor
- Wrong or missing on the APK Dylan already holds. Not the bar — the floor.
- Needs Dylan
- A decision, an account, a purchase or a sitting. No session can finish it alone.
- Ultra review
- Warrants /code-review ultra. A recommendation, never auto-run.
- Ultracode
- Run the session with the ultracode multi-agent workflow.
Who runs the session
- Fable
- Planning sessions only: builds the plan, makes sure Opus follows it.
- Opus
- Opus takes charge of the whole session.
- Opus + Sonnet
- Sonnet builds the mechanical parts, Opus supervises and reviews the diff.
Roadmap, dashboard & process
Verified 90.9% · 11 rows
This site, the session loop (/start, /end), hygiene and research.
- 10 verified on device
- 1 built, not device-verified
- M1 Blueprint: VISION, ARCHITECTURE, SCORE_TIMELINE_SCHEMA, PREPROCESSOR, ROADMAP L
Cut point: Docs committed and cross-linked; stack pinned (Flutter, Android first).
More
Evidence:
f0a390d, 72209daProved by: docs · 2026-06-21
- M2 Sideloadable demo APK (release, debug-signed; no ADB needed) S
Cut point: Dylan installs it on the S25 without a computer.
More
Evidence:
0704cc3 · build/app/outputs/flutter-apk/app-release.apk (v4 on 2026-07-05)Proved by: installed; no clear verdict yet (2026-09-20) · 2026-07-04
- M3 Outside product review folded into the docs (6 points) S
Cut point: Sustained-read exit, loop-fatigue sourcing, Phase-4 gate, H2 hypothesis, H2.5 rung, LFS/OGG flags all in the docs.
More
Evidence:
0704cc3Proved by: docs · 2026-07-04
- M4 Jev (TypeSafe AI) research + the two-mode decision M Ultracode Fable high S0
Cut point: Report saved under docs/research; two-mode rule in ARCHITECTURE; JevTagger row in the plan.
More
Evidence:
docs/research/JEV-2026-09-20.mdProved by: docs · 2026-09-20
- M5 Strategy research: soundtrack generators, arrangement, artists, competition, hardware, licensing L Ultracode Fable high S0
Cut point: Brief saved with verified/refuted claims; decisions written into the plan rows below.
More
Evidence:
docs/research/STRATEGY-2026-09-20.mdProved by: docs · 2026-09-20
- M6 Roadmap site (this) — inventory, derivation, brief, session plan, paper theme L Ultracode Fable high S0
Cut point: `npm run gate` green; both views render; every session card carries MODEL/EFFORT/ULTRACODE/ULTRA-REVIEW tags and a cut point.
More
Evidence:
roadmap/ · npm run gate green (23 tests, astro check 0/0/0) · release 20260920192748Proved by: gate + https://libretto.tinkr.es/sessions 200 from outside · 2026-09-20
- M7 Management dashboard at /admin (books & licences, stems, competition, research) M Fable high S0
Cut point: Four data-driven admin pages behind nginx basic auth.
More
Evidence:
roadmap/src/pages/admin/* · https://libretto.tinkr.es/admin/Proved by: /admin/ = 401 without password, 200 with; four pages render · 2026-09-20
- M8 libretto.tinkr.es live: Cloudflare A record, nginx block, certbot, deploy script with neighbour check M Fable high S0
Cut point: `curl -sI https://libretto.tinkr.es` = 200 from outside; /admin/ = 401 without password; neighbours unchanged.
More
Evidence:
deploy/deploy-roadmap.sh --cert · cert expires 2026-12-19Proved by: curl from outside: / 200, /admin/ 401; neighbours 200/302/200/200 · 2026-09-20
- M9 /start and /end wired to the plan (digest script, brief-first briefing, inventory step, Sonnet cleanup agent) M Fable high S0
Cut point: `bash .claude/scripts/start-check.sh` prints "Session 1 next" in one call; /end moves rows + regenerates + redeploys.
More
Evidence:
.claude/scripts/start-check.sh · ~/.claude-personal/commands/{start,end}.md · .claude/agents/cleanup.mdProved by: digest prints the brief first in one call · 2026-09-20
- M10 Context hygiene: CLAUDE.md ≤ 6 KB, GOTCHAS.md, one-line memory index, ROADMAP.md as history S Fable high S0
Cut point: Before/after byte counts in BUILD_LOG; nothing lost (grep-able).
More
Evidence:
BUILD_LOG 2026-09-20: CLAUDE.md 15,943→4,367 B; MEMORY.md 11,434→1,964 B; docs/GOTCHAS.md 14,118 BProved by: byte counts + grep of moved titles · 2026-09-20
- M11 Standing rule: every question through the AskUserQuestion tool S Fable high S0
Cut point: One line in the global CLAUDE.md + a feedback memory.
More
Evidence:
memory/feedback-questions-via-question-tool.mdProved by: docs · 2026-09-20
Sonic core (Phase 1)
Verified 25% · 16 rows
Real beds in the mixer and the on-device verdict that gates everything downstream.
- 4 verified on device
- 4 built, not device-verified
- 8 planned
- SN1 flutter_soloud mixer: all voices alive, 16 ms equal-power crossfade ticker L
Cut point: A crossfade between two looping stems feels like a score transition on a device.
More
Evidence:
ffbae74 · lib/mixer/audio_mixer.dartProved by: Pixel 7: Dylan — "the transition feels good" · 2026-06-22
- SN2 Cue sequencer with 1200 ms hysteresis (no mix flapping) S
Cut point: Jitter test passes; no audible flapping on device.
More
Evidence:
ffbae74 · lib/mixer/cue_sequencer.dartProved by: jitter test + Pixel 7 · 2026-06-22
- SN3 Mixer debug screen with live per-stem gain bars + source-family selector S
Cut point: Gains visible live; family switch rebuilds the mixer.
More
Evidence:
ffbae74, 3358344 · lib/app/mixer_debug_screen.dartProved by: Pixel 7 · 2026-06-22
- SN4 Placeholder stem generator (seam-free synthetic WAV pads) S
Cut point: 7 loop-safe placeholder beds render and loop without clicks.
More
Ugly on purpose; re-voiced caricature-distinct on 2026-07-05 so timing can be judged.
Evidence:
ffbae74, ae225c5 · tool/gen_placeholder_stems.pyProved by: Pixel 7 + emulator · 2026-06-22
- SN5 stems.json v2 + source-family A/B harness (placeholder / cc0 / ai, role ids family-agnostic) M
Cut point: Swapping a family needs zero change in cue/sequencer/mixer code; families A/B live from the debug screen.
More
Evidence:
3358344 · lib/stems/stem_bank.dart, assets/stems/stems.jsonProved by: analyze/test/APK green; never heard with real audio · 2026-06-22
- SN6 Seamless-loop prep tool (equal-power tail→head crossfade) S
Cut point: Any raw clip becomes a click-free loop.
More
Evidence:
3358344 · tool/make_seamless_loop.pyProved by: synthetic input only · 2026-06-22
- SN7 Sourcing pack: Freesound CC0 searches + ElevenLabs SFX prompts, D-minor beds S
Cut point: Dylan can source a full role set from the document alone.
More
Evidence:
3358344, 0704cc3 · tool/phase1_real_stems_sourcing.mdProved by: doc · 2026-06-22
- SN8 80 scene-level cues for Frankenstein + caricature-distinct placeholder voices M
Cut point: Mood changes land mid-chapter at story beats; moods sound different from each other.
More
Evidence:
ae225c5 · tool/gen_frankenstein_timeline.pyProved by: emulator: cue flipped mid-chapter; S25 verdict pending · 2026-07-05
- SN9 make_seamless_loop.py: downbeat-snap pre-pass (allin1) + concat mode for multi-take beds M Opus + Sonnet high S1
Cut point: 2-3 short takes stitch into one 60-120 s bed with loop points on downbeats; tests on synthetic takes.
More
allin1 + Demucs are MIT. Never madmom pretrained weights (CC-BY-NC-SA).
- SN10 APK v5 with the four AI families S Opus high S2
Cut point: Release APK built and handed to Dylan.
- SN11 CC0 family: Dylan's Freesound picks per role, loop-prepped, provenance in stems.json M Needs Dylan Opus high S3
Cut point: 7 CC0 beds with Freesound ids + licence recorded.
Waiting on:
SN9· make_seamless_loop.py: downbeat-snap pre-pass (allin1) + concat mode for multi-take beds - SN12 Source-family A/B verdict on the S25 (CC0 vs best AI family) M Needs Dylan Opus high S3
Cut point: A family is chosen and the reason written to memory + BUILD_LOG.
Waiting on:
ST1· Generator shoot-out: Stable Audio 3 Small (local), Stable Audio 2.5 API, Eleven Music v2, ACE-Step — 7 roles each - SN13 Mood-at-right-beats verdict, round 2 (80-cue timeline on real beds) S Needs Dylan Opus high S3
Cut point: Dylan confirms changes land at story beats and moods are distinct, or a named fix list exists.
- SN14 Phase 1 exit: 45-60 min sustained read without loop fatigue M Needs Dylan Opus high S3
Cut point: Dylan reads 45-60 min on the S25 and the score never pulls him out; Phase 1 declared closed.
More
THE gate: Phase 4 (SC4+) does not start before this.
- SN15 APK v6 (reader polish + chosen family as default) S Opus + Sonnet high S5
Cut point: Release APK built and handed to Dylan.
- SN16 APK v7 (library + polish) S Opus + Sonnet high S10
Cut point: Release APK built and handed to Dylan and the test group.
Soundtrack program
Verified 0% · 6 rows
AI generators, adaptive arrangement, commissioned packs, author-recommended artists.
- 6 planned
- ST1 Generator shoot-out: Stable Audio 3 Small (local), Stable Audio 2.5 API, Eleven Music v2, ACE-Step — 7 roles each L Opus high S2
Cut point: Families ai_sa3 / ai_sa25 / ai_11m / ai_ace in stems.json, loop-prepped, selectable from the debug screen.
Waiting on:
SN9· make_seamless_loop.py: downbeat-snap pre-pass (allin1) + concat mode for multi-take bedsMore
First real AI audio in Libretto — what Dylan disliked so far was the synthetic placeholders. Recipe + do-not-use list in tool/phase1_real_stems_sourcing.md.
- ST2 Key-adherence + cost report per generator (D minor held? USD per bed, minutes per bed) S Opus high S2
Cut point: docs/research/GENERATORS-<date>.md with a table; spend ≤ 30 USD.
- ST3 ScoreArrangement design (horizontal re-sequencing on SoLoud 4.1 scheduled play + loop points) for artist tracks S Opus xhigh S7
Cut point: ARCHITECTURE section written: segments (allin1/Demucs) → per-mood loops + transitions; what stays hand-authored.
- ST4 Composer commission #1 (work-for-hire): 8-10 roles, 60-120 s evolving beds, 24-bit/48k WAV, key/tempo sheet, stingers L Needs Dylan Opus high S108
Cut point: Pack delivered and accepted; contract signed (WFH, derivative-work right explicit); 5-20k USD band.
Waiting on:
SN14· Phase 1 exit: 45-60 min sustained read without loop fatigueMore
Indie-tier rate anchor 400-2,000 USD per finished minute (GameSoundCon 2025).
- ST5 Arrangement of the commissioned pack through the ScoreArrangement pipeline M Opus high S108
Cut point: Pack becomes a stems.json family and drives a whole book.
Waiting on:
ST3· ScoreArrangement design (horizontal re-sequencing on SoLoud 4.1 scheduled play + loop points) for artist tracks - ST6 Author-recommended artist outreach (first author + first artist agreed in principle) M Needs Dylan
Cut point: One author names an artist; one artist says yes to a scoped pack.
Waiting on:
CA8· Artist letters: author-recommended artists shortlist + outreach template
Reading experience
Verified 27.3% · 11 rows
EPUB rendering, reading position, comfort, the reader UX (Phases 2-3 follow-through).
- 3 verified on device
- 3 built, not device-verified
- 5 planned
- R1 EPUB reader (flutter_epub_viewer / epub.js), WebView isolated to lib/reader L
Cut point: Seed EPUB renders and paginates on a device.
More
Evidence:
b29ed63 · lib/reader/reader_screen.dartProved by: Pixel 7 · 2026-06-23
- R2 ReadingPositionSource keystone: chapterId = spine-CFI prefix, percentThroughBook = epub.js progress M
Cut point: Position survives a font reflow; hermetic unit tests green.
More
Evidence:
b29ed63 · lib/position/Proved by: Pixel 7: 50.00% / /6/30 held across reflow; 11 tests · 2026-06-23
- R3 Home screen (Mixer | Reader) + mixer bootstrap moved verbatim S
Cut point: Both screens reachable on device.
More
Evidence:
b29ed63 · lib/app/home_screen.dartProved by: Pixel 7 · 2026-06-23
- R4 Chapter-anchored cue lookup (`bookFromChapter`) with fallback to book percent M
Cut point: Conductor prefers chapter geometry when chapter ids match; non-regressive otherwise.
More
DORMANT: reader emits CFI-spine ids (/6/30), timeline uses slugs (chapter-5). R7 lights it up.
Evidence:
12fe1a1Proved by: 30 tests · 2026-07-01
- R5 Open from device: file_picker → plain reader for personal EPUBs (no score) S
Cut point: A picked .epub renders; personal books never enter the repo.
More
allowScriptedContent:true is a live surface for user-supplied books → PL8 before H2.
Evidence:
12fe1a1Proved by: analyze + tests · 2026-07-01
- R6 ReaderTheme (bg + ink always together) + reading UX redesign (comfort sheet, score strip, debug toggle) M
Cut point: Text renders in Dark/Sepia/Light; theme switches live; debug chrome hidden by default.
More
Evidence:
3d98829 · lib/reader/reader_theme.dart, test/reader_theme_test.dartProved by: emulator release; regression test · 2026-07-05
- R7 Reader CFI-spine → timeline-slug mapping (lights up the chapter-anchored lookup) M Opus + Sonnet high S5
Cut point: Conductor takes the chapter path on the real Frankenstein EPUB; verified against its CFIs on device in the next sitting.
- R8 Font-size change debounce S Opus + Sonnet high S5
Cut point: Rapid font taps no longer race the async reflow.
- R9 Reading-speed smoother on the position source S Opus + Sonnet high S5
Cut point: A fast page-flip does not jump the mix.
- R10 Default ambient bed for device-opened (unscored) books S Opus + Sonnet high S5
Cut point: Opening a personal EPUB plays a calm bed instead of silence.
- R11 Small cleanups: `.single` → `.firstOrNull` in open-from-device; Phase-2 debug app bar off the scored screen S Opus + Sonnet high S5
Cut point: Both gone; analyze + tests green.
Score pipeline (Phase 4)
Verified 0% · 9 rows
The offline preprocessor: parse, tag, merge into scene cues, validate.
- 3 built, not device-verified
- 6 planned
- SC1 Score timeline model + strict loader/validator + Frankenstein seed (Gutenberg #84) M
Cut point: Timeline JSON validates; `cueAt(book)` unit-tested; golden asset test green.
More
Evidence:
1c0c8de · lib/timeline/score_timeline.dartProved by: 8 tests + golden asset · 2026-06-30
- SC2 Score conductor: reading position → cue → mixer through the MixSink seam M
Cut point: First cue commits immediately; later cues obey the 1200 ms hysteresis; unit-testable without SoLoud.
More
Evidence:
1c0c8de · lib/timeline/score_conductor.dartProved by: 3 tests; emulator init chain · 2026-06-30
- SC3 Scored reader screen (session owner: StemBank → mixer → timeline → conductor) M
Cut point: Reading Frankenstein changes the mix live.
More
Evidence:
1c0c8de · lib/app/scored_reader_screen.dartProved by: emulator; S25 pending · 2026-06-30
- SC4 preprocessor/ Python subproject: EPUB parse → paragraphs with chapter + char offsets M Ultra review Ultracode Opus xhigh S6
Cut point: Frankenstein parses into a paragraph table whose offsets match the reader's chapter geometry.
Waiting on:
SN14· Phase 1 exit: 45-60 min sustained read without loop fatigueMore
Hard-gated on the Phase 1 sonic verdict (review point, 2026-07-04).
- SC5 ModelTagger interface + ClaudeTagger (Opus 4.8 default, Batch API + prompt caching) M Ultra review Ultracode Opus xhigh S6
Cut point: One chapter tagged {mood, intensity, tempo, confidence} per paragraph; cost logged.
Waiting on:
SN14· Phase 1 exit: 45-60 min sustained read without loop fatigue - SC6 Strict schema validation of the generated cue JSON S Opus xhigh S6
Cut point: Generated output passes the same validator the app loads with.
- SC7 Smoothing + merge of paragraph tags into per-scene cues M Ultracode Opus xhigh S7
Cut point: Auto cue count and boundaries are in the same order of magnitude as the hand 80-cue timeline; diff reviewed.
Waiting on:
SC5· ModelTagger interface + ClaudeTagger (Opus 4.8 default, Batch API + prompt caching) - SC8 Stem + transition assignment and full-timeline validator M Ultracode Opus xhigh S7
Cut point: A complete auto Frankenstein score-timeline.json loads in-app and drives the mixer on the emulator.
- SC10 Model taste-test: Opus 4.8 vs Haiku 4.5 vs Jev on golden chapters — agreement, calibration, cost, latency L Needs Dylan Opus high S8
Cut point: Default tagger chosen and written into PREPROCESSOR.md; best auto timeline listened to on device.
Waiting on:
SC8· Stem + transition assignment and full-timeline validator
H1 finish line (Phase 5)
Verified 0% · 7 rows
Seed library, comfort settings, the whole-book read that closes H1.
- 7 planned
- P1 Two more public-domain books (Gutendex) scored end-to-end M Opus + Sonnet high S9
Cut point: Two new timelines generated, validated, packaged as assets.
Waiting on:
SC8· Stem + transition assignment and full-timeline validator - P2 Library screen: pick a book, resume position M Opus + Sonnet high S9
Cut point: Three scored books selectable; position restored per book.
- P3 Master volume + mood-intensity control S Opus + Sonnet high S10
Cut point: Both persist and apply live.
- P4 Sleep timer (fade out, stop) S Opus + Sonnet high S10
Cut point: Timer fades the mix and stops the engine.
- P5 Crossfade + hysteresis tuning knobs (debug) with sane defaults S Opus + Sonnet high S10
Cut point: Defaults chosen from the S3 verdict; knobs hidden behind the debug toggle.
- P6 Persisted comfort settings + first-run defaults S Opus + Sonnet high S10
Cut point: Font, theme, volume survive a restart; first run opens on a sensible page.
- P7 H1 exit: Dylan reads a whole book with Libretto and reaches for it again L Needs Dylan Opus high S12
Cut point: Verdict recorded in VISION/BUILD_LOG; H1 declared done.
Waiting on:
SN14· Phase 1 exit: 45-60 min sustained read without loop fatigue
Build, security & platforms
Verified 22.2% · 9 rows
Forks, git-LFS, OGG, scripted-content sandbox, iOS.
- 2 verified on device
- 2 built, not device-verified
- 5 planned
- PL1 Flutter toolchain + Android app skeleton (es.tinkr.libretto) M
Cut point: Empty app builds, runs on the Pixel 7 emulator, `flutter test` green.
More
Evidence:
ccee4f8Proved by: emulator run + test · 2026-06-22
- PL2 Vendored fork: flutter_inappwebview_android (AGP 9 proguard fix) M
Cut point: Debug + release APK build on AGP 9.0.1.
More
Frozen fork; drop when upstream fixes or AGP pinned to 8.x.
Evidence:
b29ed63 · third_party/flutter_inappwebview_androidProved by: APK builds; runs on device · 2026-06-23
- PL3 Vendored fork: file_picker 11.0.2 (AGP 9 + builtInKotlin=false Kotlin fix) S
Cut point: Release APK builds with file_picker on AGP 9.
More
Evidence:
0704cc3 · third_party/file_picker/FORK.mdProved by: APK builds · 2026-07-04
- PL4 INTERNET permission in the main manifest (release-only WebView spinner fixed) S
Cut point: Release APK renders the reader (no eternal spinner).
More
Evidence:
3aa8aceProved by: emulator, release build · 2026-07-04
- PL5 git-LFS decision + configuration (or audio masters kept out of the repo, documented) S Opus + Sonnet high S1
Cut point: A 300 MB WAV drop cannot produce a bad commit; the rule is in CLAUDE.md.
- PL6 OGG-in-app decision + one OGG seamless loop proven on SoLoud S Opus + Sonnet high S1
Cut point: Decision written (WAV master / OGG shipped or WAV only) with the APK-size numbers behind it.
- PL7 Fork drop check: upstream flutter_inappwebview_android + file_picker on AGP 9 S Opus + Sonnet high S1
Cut point: Either a fork is dropped, or FORK.md records why not and the next check date.
- PL8 Scripted-content sandbox for user-supplied EPUBs L Ultra review Ultracode Opus xhigh S101
Cut point: A hostile EPUB fixture cannot run script; user books still render.
More
HIGH before any stranger loads a book. allowScriptedContent:true today.
- PL9 iOS platform: flutter create --platforms ios, signing, TestFlight build L Needs Dylan Opus high S102
Cut point: A TestFlight build installs on an iPhone; WAV/OGG loops verified on iOS.
More
Needs an Apple developer account and a cloud Mac.
Books, licences & partners
Verified 0% · 5 rows
Public-domain sources, licensing partners, the legal edges of "score your own books".
- 5 planned
- C1 Admin Books table fed from the same book manifest the app ships S Opus + Sonnet high S9
Cut point: One manifest, two readers (app + /admin/books).
- C2 Catalog content model: licence, source, provenance, timeline version per title M Opus + Sonnet high S105
Cut point: Every catalog title carries a machine-checked licence + source; Gutendex import script.
- C3 Licensing partner scoping: PublishDrive / Ingram CoreSource / Draft2Digital — deal shape, revenue share, DRM obligations M Needs Dylan Opus high S109
Cut point: A written comparison and one opened conversation.
- C4 Soundstripe app-embedding licence quote (the one stock catalog built for apps) S Needs Dylan Opus high S109
Cut point: Quote in hand; go/no-go against a commission.
- C5 Legal read: format-shifting / personal-use scoring under Costa Rica Law 6683, US DMCA §1201, EU S Needs Dylan
Cut point: A one-page note by a lawyer; user-facing claims adjusted.
More
DRM stripping is never a path; "Open from device" stays scoped to files the user legally holds DRM-free.
Crowdfunding & marketing media
Verified 0% · 10 rows
Device render, media, test-user approvals, the campaign itself.
- 10 planned
- CA1 Friends & family test group installs APK v7 S Needs Dylan Opus high S11
Cut point: At least 3 people reading with Libretto and reporting.
Waiting on:
SN16· APK v7 (library + polish) - CA2 Two books driven to "100% approved" by Dylan and the test group L Needs Dylan Opus high S11
Cut point: Fix list → fixes → re-approval; both books signed off.
More
Campaign gate, half 1.
- CA3 Industrial-design brief for the H3 reader (form, display, camera/IR placement, audio) M Needs Dylan Opus + Sonnet high S13
Cut point: One-page brief approved by Dylan.
Waiting on:
G2· Gaze accuracy log + go/no-go note for the device concept - CA4 3D render / mockup of the device L Needs Dylan Opus + Sonnet high S13
Cut point: Render set (front, side, in-hand) approved by Dylan.
More
Campaign gate, half 2.
- CA5 Marketing media: stills + a short video of the app and the render M Needs Dylan Opus + Sonnet high S13
Cut point: Media folder ready for a campaign page and social posts.
- CA6 Landing section on libretto.tinkr.es (public-facing, not the roadmap) S Opus + Sonnet high S13
Cut point: A visitor understands the product in 20 seconds.
- CA7 Campaign page draft + reward tiers M Needs Dylan Opus high S14
Cut point: Kickstarter draft with tiers, goal 2-8k USD for one commissioned stem pack.
Waiting on:
CA4· 3D render / mockup of the device - CA8 Artist letters: author-recommended artists shortlist + outreach template M Needs Dylan Opus high S14
Cut point: Five names with a one-page pitch each; rights reality (sync + master) explained in the letter.
- CA9 Campaign goal + timeline decision S Needs Dylan Opus high S14
Cut point: Goal, launch window (H2 beta) and fallback written down.
- CA10 Crowdfunding campaign launch L Needs Dylan
Cut point: Campaign live at H2 beta with the approved books and render.
Waiting on:
CA2· Two books driven to "100% approved" by Dylan and the test group ·CA4· 3D render / mockup of the device ·CA7· Campaign page draft + reward tiers
H2 public app
Verified 0% · 8 rows
Store, accounts, payments, onboarding, legal, launch.
- 8 planned
- PU1 Accounts + sync (positions, library) L Ultra review Opus xhigh S104
Cut point: Sign in on two devices; position and library follow.
- PU2 Catalog + scored packs (public-domain seed library, downloadable timelines) M Opus + Sonnet high S105
Cut point: Catalog lists ≥ 10 scored public-domain books.
Waiting on:
P2· Library screen: pick a book, resume position - PU3 Payments + "score your own books" subscription (Play Billing / App Store / Stripe web) L Needs Dylan Ultra review Ultracode Opus max S106
Cut point: A test purchase unlocks scoring; refunds + cancellation paths proven.
Waiting on:
O3· Online mode: "score as you read" chapter-ahead tagging with offline fallback + app mode switch ·PU1· Accounts + sync (positions, library) - PU4 Onboarding flow M Opus + Sonnet high S107
Cut point: A stranger reaches a scored page within 60 s of install.
- PU5 Store assets (icon, screenshots, listing copy) S Needs Dylan Opus + Sonnet high S107
Cut point: Assets approved by Dylan.
- PU6 Privacy policy, terms, support channel M Needs Dylan Opus + Sonnet high S107
Cut point: Published pages; support inbox answered.
- PU7 Public beta + launch checklist M Needs Dylan Opus high S110
Cut point: Play internal test → open beta; checklist all green.
Waiting on:
PL8· Scripted-content sandbox for user-supplied EPUBs ·PU1· Accounts + sync (positions, library) - PU8 Trademark "Libretto" (name + logo) S Needs Dylan
Cut point: Filing submitted.
H2 online mode & scoring service
Verified 0% · 3 rows
"Score as you read" for unscored books; the preprocessor as a service.
- 3 planned
- O1 JevTagger: second ModelTagger over TypeSafe Jev (Choice on the mood enum, Score for intensity) M Needs Dylan Opus high S8
Cut point: Tags a golden chapter through the Jev API with calibrated confidence per paragraph.
Waiting on:
SC5· ModelTagger interface + ClaudeTagger (Opus 4.8 default, Batch API + prompt caching)More
Needs Dylan's Jev waitlist key. Cloud-only, text-only; never in the live reading loop.
- O2 Scoring service: the preprocessor as an authenticated, rate-limited VPS endpoint with a job queue L Ultra review Ultracode Opus xhigh S103
Cut point: An EPUB posted to the endpoint returns a validated timeline; abuse limits proven.
Waiting on:
SC8· Stem + transition assignment and full-timeline validator - O3 Online mode: "score as you read" chapter-ahead tagging with offline fallback + app mode switch L Ultra review Ultracode Opus xhigh S103
Cut point: An unscored EPUB gets a score while reading; airplane mode still reads with the default bed.
Waiting on:
O2· Scoring service: the preprocessor as an authenticated, rate-limited VPS endpoint with a job queue
Camera gaze (H2.5)
Verified 0% · 5 rows
Phone-camera gaze as a ReadingPositionSource; the gate before hardware money.
- 5 planned
- G1 Camera-gaze smoke test: MediaPipe iris → regression → coarse gaze → throwaway CameraGazePositionSource feeding ScoreConductor L Ultracode Opus xhigh S4
Cut point: Gaze drives a cue change end-to-end on video, on the S25 or a laptop webcam.
More
Moved up from H2.5 on 2026-09-20: cheap, no purchase, shapes the device render. Frames never leave the device.
- G2 Gaze accuracy log + go/no-go note for the device concept S Opus xhigh S4
Cut point: Measured error (cm / lines) at reading distance written to docs/research.
- G3 Gaze + page-estimate fusion, calibration flow, confidence gating L Ultracode Opus max S201
Cut point: Fused position beats the page estimate alone on a 20-minute read; falls back cleanly in bad light.
Waiting on:
G1· Camera-gaze smoke test: MediaPipe iris → regression → coarse gaze → throwaway CameraGazePositionSource feeding ScoreConductor - G4 On-device reading-behaviour heuristics (skim / re-read / pause) → intensity nudges M Opus high S202
Cut point: Nudges are audible, subtle, and computed entirely on-device.
Waiting on:
G3· Gaze + page-estimate fusion, calibration flow, confidence gating - G5 H2.5 verdict sitting: does gaze → score feel magical? M Needs Dylan Opus high S203
Cut point: Verdict written; H3 capital gate opened or closed.
Waiting on:
G4· On-device reading-behaviour heuristics (skim / re-read / pause) → intensity nudges
H3 device
Verified 0% · 8 rows
The eye-tracking e-reader. Epics only until H2.5 de-risks the thesis.
- 8 planned
- D1 Android e-ink reader as test device (Boox Go 7 / Palma 2, or Hisense A9 for a front camera) + APK on e-ink M Needs Dylan Opus high S204
Cut point: Libretto reads on e-ink with acceptable refresh and audio out.
More
Kindle jailbreak ruled out for Flutter (2026-09-20): flutter-pi needs DRM/KMS.
- D2 OS decision: gaze on a coprocessor (embedded Linux) vs on the main SoC (Android/AOSP) XL Needs Dylan
Cut point: Decision memo with power, cost and vision-stack trade-offs; prototypes stay on Android until then.
Waiting on:
G5· H2.5 verdict sitting: does gaze → score feel magical? - D3 Device prototype: IR gaze module, display, audio, battery XL Needs Dylan
Cut point: A bench prototype reads a book with gaze-driven score.
Waiting on:
D2· OS decision: gaze on a coprocessor (embedded Linux) vs on the main SoC (Android/AOSP)More
Ground truth: Pupil Labs Core (~3.6k EUR) or Gazepoint GP3 HD (~2.7k USD). Consumer Tobii is not licensed for gaze data.
- D4 ODM RFQs (RK3566-class e-ink boards) + open-hardware references (Open Book Touch, Modos Flow) XL Needs Dylan
Cut point: Three quotes with MOQ and NRE; one reference board on the bench.
Waiting on:
D2· OS decision: gaze on a coprocessor (embedded Linux) vs on the main SoC (Android/AOSP) - D5 Word-level cue anchoring (gaze precision → cue timing on the dot) XL Needs Dylan
Cut point: Cues fire within one line of the intended word on the device.
Waiting on:
D3· Device prototype: IR gaze module, display, audio, battery - D6 On-device reflex classifier over gaze features (only if a local System-One / open-weight model exists) XL Needs Dylan
Cut point: A local model classifies reading state under 20 ms on the device; no frame leaves it.
Waiting on:
D3· Device prototype: IR gaze module, display, audio, batteryMore
Conditional epic from the Jev research: cloud reflex models are the wrong shape for this loop.
- D7 Funding (crowdfunding proceeds, loan, or investment) for a production run XL Needs Dylan
Cut point: Capital secured for the first run.
Waiting on:
CA10· Crowdfunding campaign launch ·D3· Device prototype: IR gaze module, display, audio, battery - D8 Manufacturing + fulfilment of the first run XL Needs Dylan
Cut point: Devices in backers' hands.
Waiting on:
D7· Funding (crowdfunding proceeds, loan, or investment) for a production run