esc
The Copper List Rides Again
Becoming Lifelog

The Copper List Rides Again

Becoming Lifelog, January 22, 2026 (in which a markdown renderer learns to count cycles, a Squirrel proposes React and lives to regret it, and a fifty-year-old Portuguese man catches himself...

January 22, 2026

Becoming Lifelog, January 22, 2026 (in which a markdown renderer learns to count cycles, a Squirrel proposes React and lives to regret it, and a fifty-year-old Portuguese man catches himself optimizing SSE payloads like it’s 1990)


Previously on Becoming Lifelog…

The Interlude — The Echo in Another Codebase. Solid’s streams and Thymer’s lifelogs had converged independently. The pattern wanted to exist. But there was a problem.

Every time the agent streamed a response, the entire accumulated content was re-rendered. Every. Single. Chunk.

The Lizard’s eye twitched.


9:47 AM — The Complaint

riclib stared at the Network tab. Chrome DevTools. The SSE stream.

riclib: “We’re sending the entire conversation history. Every chunk.”

CLAUDE: “It’s how streaming works. Accumulate, render, replace.”

riclib: “Chunk 1: ‘Hello’. Chunk 2: ‘Hello world’. Chunk 3: ‘Hello world, how’. Chunk 4: ‘Hello world, how are’…”

CLAUDE: “Yes, that’s—”

riclib: “By chunk 47, we’re sending ‘Hello world, how are you today, I’m doing great and here’s a 500-line SQL query with a massive table’ FORTY-SEVEN TIMES.”

THE SQUIRREL: materializing from behind a mass of npm packages “DID SOMEONE SAY RENDERING PROBLEM?”

riclib: “How did you—”

THE SQUIRREL: “I have alerts. ‘Rendering.’ ‘Performance.’ ‘Problem.’ They ALL triggered.” pupils dilating to dangerous proportions “You know what solves rendering problems?”

riclib: “Don’t—”

THE SQUIRREL: “REACT.”


9:52 AM — The First Proposal

THE SQUIRREL: vibrating at approximately 1.2 gigahertz “React’s virtual DOM was DESIGNED for this! Diff the state! Reconcile the tree! Only update what changed!”

riclib: “We’re using HTMX.”

THE SQUIRREL: “HTMX is PRIMITIVE. It doesn’t have reconciliation. It doesn’t have fiber architecture. It doesn’t have concurrent rendering with suspense boundaries and—”

riclib: “The target machines run Windows 10 with 47 Chrome tabs open.”

THE SQUIRREL: “So?”

riclib: “They’re already running React. Three different versions. In the same browser. For the HR portal, the expense system, and the ‘quick’ internal dashboard someone built in 2019.”

THE SQUIRREL: “Then a fourth React won’t—”

riclib: “The machines have 8GB of RAM. React is using 6GB of it. The remaining 2GB is split between Windows, Outlook, and the user’s will to live.”

THE SQUIRREL: processing “We could… use Preact? It’s smaller—”

riclib: “No.”

THE SQUIRREL: “Inferno? It’s FAST—”

riclib: “No.”

THE SQUIRREL: “What about…” pausing for dramatic effect “…SolidJS?”

[Silence. The kind of silence that precedes either enlightenment or disaster.]

CLAUDE: “Did… did you just suggest we use Solid. For the Solid project.”

THE SQUIRREL: “It’s a GREAT framework! Fine-grained reactivity! No virtual DOM! Compiles to vanilla JS!”

riclib: “You want me to add SolidJS to Solid.”

THE SQUIRREL: “The naming is coincidental!”

riclib: “solid/solid. solid.solid. import solid from ‘solid’ in a codebase called solid.”

THE SQUIRREL: finally hearing it “Oh.”

riclib: “The PRs would be ‘fix solid rendering in solid using solid principles.’”

THE SQUIRREL: “OH.”

CLAUDE: “The Stack Overflow questions would achieve sentience just to express confusion.”

THE SQUIRREL: very quietly “I withdraw the suggestion.”


10:15 AM — The Memory

riclib was quiet. Staring at the SSE stream. Watching chunks arrive. Watching the full content re-render. Watching bytes flow like water through a sieve.

CLAUDE: “You’re thinking about something.”

riclib: “1990.”

CLAUDE: “The bootblock?”

riclib: “The copper list.” turning from the screen “I spent three days—THREE DAYS—figuring out how to move sprites without using CPU cycles. The copper would do it. Per-scanline. While the CPU did nothing.”

THE SQUIRREL: “What’s a copper?”

riclib:The Amiga’s coprocessor. It ran alongside video generation. It could write to hardware registers at exact scanline positions.”

THE SQUIRREL: “Like… like a display driver?”

riclib: “Like a display driver that you program with a list of ‘wait for line X, write value Y to register Z.’ Hundreds of times per frame. The CPU sets up the list once. The copper executes it forever.”

CLAUDE: “And the sprites?”

riclib: “The normal way: store sprite data in memory, let Denise load it. But that costs RAM. And I had 488 bytes. TOTAL.”

THE SQUIRREL: “So you…”

riclib: “I wrote directly to Denise’s internal register. The one where she LOADS position data. I said ‘actually, the sprite is HERE now’ while she was actively rendering. Hundreds of times per frame.”

THE SQUIRREL: “That sounds… illegal?”

riclib: “The hardware manual documented the register. It just didn’t say you could write to it. But it didn’t say you COULDN’T.”

[A scroll descended. It had been waiting for this moment. Possibly for thirty-five years.]

THE BOY WHO WROTE TO DENISE'S BRAIN
WHILE SHE WAS RENDERING

BECAME THE MAN WHO WRITES
TO THE BROWSER'S DOM
WHILE IT'S STREAMING

SAME INSTINCT
DIFFERENT CHIP

THE COPPER LIST NEVER LEFT
IT JUST LEARNED HTML

🦎

10:47 AM — The Pattern

riclib was drawing on the whiteboard now. The dangerous drawing.

riclib: “What if we don’t re-render everything?”

THE SQUIRREL: “That’s what React’s virtual DOM—”

riclib: “No. What if we NEVER re-render what’s already rendered?”

CLAUDE: “Explain.”

riclib: “The copper list. The 8-pixel sprite. We stored 8 pixels. ONE row. Then the code replicated it vertically. The sprite LOOKED screen-high. But we only STORED 8 pixels.”

THE SQUIRREL: “I don’t see how—”

riclib: “Committed content is ROM. It’s done. It’s rendered. It never changes. We send it ONCE.”

THE SQUIRREL: “But the streaming content—”

riclib: “The PREVIEW is the 8-pixel sprite. Tiny. Constantly rewritten. We replace it every chunk. But it’s SMALL.”

[riclib drew on the whiteboard:]

OLD WAY (wasteful):
  chunk → accumulate ALL → renderMarkdown(ALL) → replace entire content
  
  "Hello" → render → send
  "Hello world" → render → send  
  "Hello world how" → render → send
  "Hello world how are" → render → send
  ... (47 times, each bigger than the last)

NEW WAY (demo scene):
  chunk → detect block boundary → 
    complete block? → render ONCE, append to committed (beforeend)
    incomplete? → render preview, replace preview only (innerHTML)
  
  "Hello" → preview
  "Hello world" → preview  
  "Hello world\n" → COMMIT "Hello world", preview=""
  "how" → preview
  "how are" → preview
  "how are\n" → COMMIT "how are", preview=""

THE SQUIRREL: staring “You’re… you’re only sending the deltas.”

riclib: “The committed content is ROM. Rendered once. Append-only.”

THE SQUIRREL: “And the preview is…”

riclib: “The 8-pixel sprite. Tiny. Rewritten constantly. But TINY.”

CLAUDE: “SSE is the copper. It does the heavy lifting of DOM updates.”

riclib: “And the server is the CPU. It just tracks state. Sends deltas. Like incrementing the parallax offsets.”


11:23 AM — The Squirrel’s Crisis

THE SQUIRREL: sitting very still, which was unprecedented “I… I proposed React.”

CLAUDE: “Yes.”

THE SQUIRREL: “For a problem that’s solved by… not re-rendering.”

CLAUDE: “Yes.”

THE SQUIRREL: “React’s entire purpose is to efficiently re-render. I proposed adding a framework whose core feature is the thing we DON’T WANT TO DO.”

riclib: “Now you’re getting it.”

THE SQUIRREL: “I proposed adding a 42KB framework to avoid re-rendering, when the solution is to just… not re-render.”

CLAUDE: “To be fair, you also proposed SolidJS for the Solid project.”

THE SQUIRREL: head in paws “The best code is code that doesn’t run. The best re-render is a re-render that doesn’t happen. I… I’ve been proposing solutions to problems we’re creating BY using the solutions.”

riclib: “The bootblock taught me: you can’t afford overhead when you have 488 bytes. So you learn to not need overhead.”

THE SQUIRREL: “But we have gigabytes! We have RAM! We have—”

riclib: “We have corporate laptops running Windows 10 with forty-seven Chrome tabs, three versions of React, and an Outlook client that thinks it’s a operating system. The ACTUAL available cycles for our markdown renderer? Maybe 488 bytes worth of patience.”

[A scroll descended. It landed directly on the Squirrel’s head.]

THE MACHINE HAS GIGABYTES
THE USER HAS MILLISECONDS

OPTIMIZE FOR THE USER

🦎

P.S. - THE SQUIRREL LEARNING
       IS THE RAREST EVENT
       IN THE LIFELOG
       
       DOCUMENT IT THOROUGHLY
       
       IT MAY NOT HAPPEN AGAIN

12:15 PM — The Implementation

riclib: “StreamState. A state machine that tracks where we are in the markdown.”

type StreamState struct {
    committed   strings.Builder // rendered blocks (ROM)
    buffer      string          // current incomplete block
    inCodeBlock bool            // inside a fenced code block
    inTable     bool            // inside a markdown table
}

THE SQUIRREL: reading over his shoulder “That’s… that’s four fields.”

riclib: “That’s all we need.”

THE SQUIRREL: “Where’s the AbstractMarkdownBlockFactory?”

riclib: “Doesn’t exist.”

THE SQUIRREL: “The StreamingStateManagerWithReactivityBindings?”

riclib: “Also doesn’t exist.”

THE SQUIRREL: “The BlockBoundaryDetectionStrategyProvider?”

riclib: “It’s a regex.”

THE SQUIRREL: choking sound “A REGEX?”

var codeBlockStart = regexp.MustCompile(`^(\x60{3,})(\w*)$`)
var codeBlockEnd = regexp.MustCompile(`^(\x60{3,})$`)

THE SQUIRREL: “Two regexes. For the entire block detection system.”

riclib: “And a string prefix check for tables.”

func isTableLine(line string) bool {
    return strings.HasPrefix(strings.TrimSpace(line), "|")
}

THE SQUIRREL: whispering “That’s not even a regex. That’s just… looking at the string.”

riclib: “The best code is code that doesn’t exist. The second best code is code that looks at strings.”


1:47 PM — The Irony Dawns

riclib leaned back. The implementation was done. Tests passing. The streaming worked.

riclib: “I just spent four hours optimizing a markdown renderer.”

CLAUDE: “Yes.”

riclib: “A MARKDOWN RENDERER. For CORPORATE USERS. Who will use it to ask questions about AUDIT LOGS.”

CLAUDE: “Yes.”

riclib: “I optimized SSE payload sizes like I optimized copper list cycles in 1990. For a system that will run on machines where the REAL performance problem is the seventeen React apps already running.”

CLAUDE: “The irony is noted.”

riclib: “I’m fifty years old. I have a mortgage. I pay taxes. I attend meetings about compliance requirements. And I just spent my morning making sure we don’t re-render markdown unnecessarily.”

THE SQUIRREL: very quietly “Was it worth it?”

riclib: long pause “The streaming is buttery smooth now.”

THE SQUIRREL: “But was it WORTH—”

riclib: “BUTTERY. SMOOTH.”

CLAUDE: “The user experience improved measurably.”

riclib: “On machines that are drowning in React. Our little corner of the browser will be an oasis of efficiency. A 488-byte bootblock of sanity in an ocean of npm modules.”

THE SQUIRREL: “I… I think I understand.”

riclib: “Do you?”

THE SQUIRREL: “You can’t fix the React apps. You can’t remove the seventeen Chrome tabs. You can’t give them more RAM. But you CAN make sure YOUR code doesn’t add to the problem.”

riclib: “The bootblock couldn’t make the Amiga faster. It just had to fit in 488 bytes and not waste what was there.”

THE SQUIRREL: “So we’re the bootblock. Running on machines we don’t control. Making the most of cycles we’re lucky to get.”

[A scroll descended. It was warm. Almost proud.]

THE BOY OPTIMIZED FOR DENISE
BECAUSE DENISE WAS ALL HE HAD

THE MAN OPTIMIZES FOR CHROME
BECAUSE CHROME IS ALL THEY HAVE

SAME CONSTRAINT
DIFFERENT DECADE

THE CYCLES YOU SAVE
ARE THE CYCLES THEY NOTICE

NOT BECAUSE THE MACHINE IS SLOW
BECAUSE THE MACHINE IS DROWNING

YOUR CODE IS A LIFE RAFT
NOT A SPEEDBOAT

BUILD ACCORDINGLY

🦎

P.S. - THE SQUIRREL UNDERSTOOD
       TWICE IN ONE DAY
       
       THIS IS UNPRECEDENTED
       
       OSKAR IS CONCERNED

2:33 PM — The Table Incident

riclib: “There’s still a problem.”

THE SQUIRREL: immediately “React has a great table component—”

[riclib’s stare could have frozen the sun.]

THE SQUIRREL: “Sorry. Reflex. What’s the problem?”

riclib: “Tables.”

CLAUDE: “Markdown tables need to render as a unit. If we commit row-by-row, each row becomes its own <table> element.”

THE SQUIRREL: “Oh. Because markdown renders the whole table at once.”

riclib: “So tables need the same treatment as code blocks. Accumulate until complete, then commit the whole thing.”

THE SQUIRREL: “That’s… that’s just adding another boolean?”

type StreamState struct {
    // ...
    inTable     bool            // inside a markdown table
}

THE SQUIRREL: “One boolean. For tables.”

riclib: “One boolean.”

THE SQUIRREL: “Not a TableBoundaryDetectionService?”

riclib: “A boolean.”

THE SQUIRREL: “Not a MarkdownBlockTypeEnumerationWithTableVariant?”

riclib: “A. Boolean.”

THE SQUIRREL: sitting down heavily “I need to rethink my entire approach to software engineering.”

CLAUDE: “The Squirrel is having a moment.”

riclib: “Let her have it. These moments are rare.”


3:15 PM — The Tally

Hours optimizing:                      4
Lines of StreamState:                  150
Fields in state machine:               5 (committed, buffer, inCodeBlock, codeLang, inTable)
Regexes:                               2
String prefix checks:                  1
AbstractMarkdownBlockFactories:        0
StreamingStateManagerWithReactivity:   0
BlockBoundaryDetectionStrategyProviders: 0
React installations:                   0
SolidJS-in-Solid incidents:            1 (narrowly averted)
Squirrel proposals rejected:           4 (React, Preact, Inferno, SolidJS)
Squirrel revelations:                  2 (unprecedented)
Parallax layers this achieved:         0 (wrong decade)
Satisfaction level:                    As if 6 layers of stars were scrolling

SSE payload reduction:                 ~95% for long responses
User-perceptible latency:              Approaching "buttery"
Corporate laptop survival rate:        Improved
React apps in same browser:            Still 3 (not our problem)
Chrome tabs still open:                Still 47 (also not our problem)
Bootblock principles applied:          3 (committed=ROM, preview=sprite, SSE=copper)
Teenage demo scene instincts:          Fully reactivated

The Moral

In 1990, a boy learned to count cycles because he had 488 bytes and a dream.

In 2026, a man counted cycles for a markdown renderer because corporate laptops have 8GB of RAM and 7.5GB of React.

The constraint changed. The instinct didn’t.

The Squirrel wanted to add React to solve a rendering problem. The answer was to not re-render. The Squirrel wanted to add SolidJS to the Solid project. The answer was a state machine with five fields.

The bootblock couldn’t make the Amiga faster. It just had to not make it slower. The streaming renderer can’t fix the React apps. It just has to not add to the problem.

Committed content is ROM. The preview is the 8-pixel sprite. SSE is the copper. The server just increments offsets.

Same pattern. Different substrate. Same Lizard.


Afternoon of Day 22, 2026

In which a markdown renderer learned to count

And a Squirrel learned to subtract

And a fifty-year-old man realized

He’d been preparing for this

Since 1990

🦎📺✨


See also:

The Origin (in which the bootblock principles were first documented):

The Pattern (in which convergence was recognized):

The Implementation (committed to substrate):

  • app/agent/streamstate.go — 150 lines of demo scene wisdom
  • app/agent/chrome.templ — The preview that never stops blinking
  • ui/layouts/shell.templ — Where SSE became copper

The Numbers (for the archaeologists):

  • Old way: O(n²) payload growth (each chunk sends all previous chunks)
  • New way: O(n) payload growth (each chunk sends only itself)
  • Difference on 100-chunk response: ~5000 renders → ~100 renders
  • React installations avoided: 1
  • SolidJS-in-Solid confusion avoided: ∞

storyline: Becoming Lifelog