Simple Speed Reader

27 views
Skip to first unread message

Liberty Lover

unread,
Aug 26, 2026, 11:37:33 PM (11 days ago) Aug 26
to Eiffel Users
"Come listen to my story ... " (next reply comment)

New program for speed-reading a document based on an idea from a Facebook Reel that popped up on my feed.

Liberty Lover

unread,
Aug 26, 2026, 11:45:28 PM (11 days ago) Aug 26
to eiffel...@googlegroups.com
# The Night Build

*How simple_speed_reader went from a 55-second video to a tested, installed Windows
application in six and a half hours of wall clock — and what Design by Contract, a
pure-Eiffel toolkit, and a rolling conversation had to do with it.*

*Simple Eiffel ecosystem, 2026-08-26.*

---

## The seed

At 16:00 the input was a phone recording of someone else's speed reader: one word at a
time on a black screen, a red letter pinned dead center with tick marks above and below,
a `SPEED: 595 WPM` readout ramping past 800. Fourteen extracted frames later the
mechanics were on the table. The red letter is Spritz's *Optimal Recognition Point* —
pin it at a fixed screen X and the eye never saccades; the word does the moving. The
frames even yielded the pivot law by observation: length 1 pivots letter 1; 2–5 pivot
letter 2; 6–9 letter 3; 10–13 letter 4; 14 and up letter 5. That table went into a
contract before the evening was out, and one frame — "words," pivoting its *o* —
later refuted the first draft of it. The video was the spec, and the spec was testable.

## The turn that made it worth building

The obvious product was a drill toy. The owner's correction, minutes in: *this is not
about drilling but about actually reading.* That reframing had scientific teeth.
Schotter, Tran and Rayner showed in 2014 that RSVP's core harm is eliminating
*regressions* — the quiet backward glances that repair comprehension. Every word-stream
app on GitHub ignores that finding. So the spine of this one became the thing the
science demanded: one key out of the stream onto a readable context page, click the
word where comprehension was last solid, resume *there* at a crawl, ramp back up.
Getting lost costs seconds, not chapters.

The second demand was older: Robinson's SQ3R (1941) — survey and question *before*
reading. The owner asked for comprehension quizzes generated from any text before it is
read, reviewable in advance like a table of contents. A local model writes them; every
question must carry a quote verified **verbatim** against the text, or it is discarded
and counted. Speed without retention is a party trick. This reader keeps a ledger.

image.png

## The morning method

The Simple Eiffel spec kit ran first: a seven-step research phase (nineteen minutes —
five comparable readers surveyed, none closing the comprehension loop) and an
eight-step specification (thirty-nine minutes — 27 classes, every requirement traced,
contracts drafted before any code existed). The speed governor's invariant *is* the
product rule: `Min_wpm <= current <= target <= comfy_max`. The recovery command's
postcondition *is* the science: resume re-ramps from recovery speed. When the
specification says READY, implementation is transcription with a compiler holding the
pen.

One hard fact reshaped the architecture during specification: the ecosystem's Ollama
client is synchronous curl. So every model call lives in a separate worker *process*
the GUI spawns and polls by mailbox file — the pump can never meet a blocking call,
by construction.

## The build hour

Code began around 17:00. At 17:24 the engine — tokenizer, ORP law, timing model with
scholarly linger classes, deadline pacer, speed governor, session state machine —
passed **26 of 26 contract-assault tests, finalized, on the first F_code build**. At
17:37 the three-posture GUI was smoke-launched: running is only the stream; paused is
the readable context page; stopped is the cockpit. The smoke test itself caught a
crash (a timer armed before the native window existed — the precondition said so), and
that is the point: in this shop the contracts stay armed in finalized test builds, and
they earn their keep in the field.

## The feedback engine

From 17:53 onward the owner hand-tested and the requests came as fast as they could be
typed — thirty-three of them by night's end, each one logged in a rolling design story
the moment it landed. Drive switching in the file dialog. Typed paths. A freeze that
forensics traced to `DIRECTORY.exists` probing dead network drive letters (the fix:
`GetLogicalDrives`, which touches no media). UTF-8 mojibake that turned out to be an
ecosystem library bug, found on screen and logged upstream. A drawn VCR deck with a
brake pedal wearing the automotive brake-warning glyph — press and hold, and speed
*glides* to a crawl while a fisheye ribbon of the surrounding words flows along; drag
left to scrub backward; release and it eases home, politely restoring any pinned
speed. Explorer drag-and-drop. PDFs through Poppler, DLL-isolated so its private
cairo can never shadow the toolkit's. Speed tiers on the +/− keys. A crossfade mode
whose fade windows scale with the word's own display slot, so it self-attenuates at
speed. A word cloud, colorizing the ribbon by significance and opening as a scoped
Document / Section / Paragraph drawer. Edge tabs that peek on hover and pin on click.
The app's own icon — the word *read* with its lawful red *e* — in the title bar.

image.png

There was an intermission for church. The clock kept honest.

## What the contracts caught

Design by Contract is usually sold on theory. Here is one evening's docket. A
postcondition cursor shadowing a local: compile error, not a mystery. Void-safety's
VEVI rule forcing two-phase widget construction — every attached attribute set before
any agent may capture `Current`. A precondition on `set_fast_timer` that turned a
would-be silent failure into a named crash with the fix in its message. And three
separate bites from `STRING_32.to_string_8`, whose precondition rejects the first
non-ASCII character — the last one when a Greek word, δόξα, met the word cloud's
stopword gate. The fix was one guarded line; the crash text became a named regression
test asserting the *right* behavior (Greek terms rank in the cloud, as a theology
corpus deserves); and the lesson is now an oracle gotcha every future session reads
before writing code.

## What the ecosystem gained

The owner's standing doctrine — *factor abstractions back to the parent libraries as a
courtesy to the problem space* — turned one application's needs into thirteen
platform features, each landed with the parent library's own test suite green:

- **simple_widgets** — `give_focus` (programmatic keyboard focus); `handle_release`
  (the capture hears the pointer let go — the brake pedal's enabler); SW_CANVAS grown
  into a full-agent surface (keys, chars, release, shell drops, hover — the app's own
  surface class dissolved to nothing); `triangle_fill` and `arc_stroke` on the painter
  (glyph apps stay out of the cairo context); a drive-chip row and typed-path
  navigation in the file dialog.
- **simple_shell** — `logical_drives_mask` (drive letters without touching media);
  the stepping keys joined the pump's whitelist with `WM_SYSKEYDOWN` handled at last;
  `shell_set_window_icon` (a finalized Eiffel binary carries no resources — the icon
  loads from the multi-size .ico beside the exe).

Suites at close: widgets 198/198, shell 13/13, engine 41/41.

image.png

or this ...

image.png

## Where it landed

A dark-only Windows reader, every pixel its own: the video-faithful stage with the red
pivot; ramp, hold, back-offs, and keyboard speed tiers; the recovery loop; micro-replay;
an analog brake; paragraph, section, and start-over navigation on a drawn deck; a
colorized fisheye ribbon; a scoped word cloud; scholarly timing that lingers on
Hebrew and Greek and never fakes a pivot on them; an optional foreign-script skip;
crossfade pacing; drag-and-drop and PDF intake; a local-AI comprehension quiz with a
verbatim-quote honesty gate; a SQLite ledger of every sitting — dialed speed, achieved
speed, rewinds, quiz score; crash-safe bookmarks and continue-where-you-left-off; a
7-second-compile Inno installer that ships two exes, the Poppler family, and an
uninstaller that asks before touching your reading history and never asks silently.

**The numbers:** one afternoon and evening; 6 hours 27 minutes of tracked wall clock
from video to the final feature; 41 commits across three repositories; roughly 6,900
lines of contracted Eiffel in the application alone; 252 tests green across the stack;
a 12 MB installer that compiles in under eight seconds.

## The row that waits

The timeline file that tracked all of this ends with one deliberately empty row:
**LARRY APPROVES**. The clock stops only there. After it: the hardening pass, the
GitHub repository under simple-eiffel with the installer attached to a Release, and a
1.0 tag.

The last screenshot of the night showed the ribbon reading a real essay — *Jesus*,
*temple*, *courts* burning by significance around the paused word — under a title bar
wearing the app's own mark. The owner's verdict on the evening: *perfect*.

---

*The unabridged engineering record — thirty-three asks and answers, every decision
dated — lives in `.eiffel-workflow/DESIGN_STORY.md` beside the research and
specification documents that started the day.*

On Wed, Aug 26, 2026 at 11:37 PM Liberty Lover <rix....@gmail.com> wrote:
"Come listen to my story ... " (next reply comment)

New program for speed-reading a document based on an idea from a Facebook Reel that popped up on my feed.

--
You received this message because you are subscribed to the Google Groups "Eiffel Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to eiffel-users...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/eiffel-users/ddfad9b0-44d8-453d-adac-3e693f6933c5n%40googlegroups.com.

Liberty Lover

unread,
Aug 27, 2026, 12:10:54 AM (11 days ago) Aug 27
to eiffel...@googlegroups.com
A video of the software running against the NIGHT BUILD md file


Liberty Lover

unread,
Aug 27, 2026, 1:01:42 AM (11 days ago) Aug 27
to eiffel...@googlegroups.com
The Github repo is here.

Liberty Lover

unread,
Aug 27, 2026, 1:22:56 AM (11 days ago) Aug 27
to eiffel...@googlegroups.com
I quickly realized that I would like to see more than one word at a time, so I had Claude add a feature to increase the number of words before and behind the primary center word based on pressing 1-9, where 1 puts just the primary word being read and 2-9 adds progressively more words to the stream.

Here is a video demonstrating the new feature.

Reply all
Reply to author
Forward
0 new messages