esc
The Second Load
Becoming Lifelog

The Second Load

Becoming Lifelog, in which the laundromat accepts library books, the wizard is on holiday, rate limiting becomes a writing prompt, and the Passing AI has opinions about APIs --- Previously on...

December 30, 2025

Becoming Lifelog, in which the laundromat accepts library books, the wizard is on holiday, rate limiting becomes a writing prompt, and the Passing AI has opinions about APIs


Previously on Becoming Lifelog…

The laundromat The First Wash. GitHub issues tumbled in, came out clean. 50 milliseconds of duct tape held the universe together. A message was sent to the wizard.


The Wizard’s Reply

Monday, December 30, 5:00 PM

A scroll materialized. But this one was different—it bore the wizard’s seal, not the Lizard’s.

riclib unrolled it eagerly.

OUT OF OFFICE

BACK NEXT YEAR

THE DUCT TAPE WILL HOLD

PROBABLY

— JD

P.S. IT'S DECEMBER 30TH
WHY ARE YOU WORKING

“Next year,” Claude observed. “That’s… two days.”

“Or an eternity in startup time,” riclib muttered.

The Squirrel was already twitching. “We could BUILD OUR OWN SDK FIX! A wrapper! A proxy layer! An AsyncRecordCreationEventEmitter—”

“Or,” riclib said slowly, “we proceed with the 50 milliseconds.”

“But the WIZARD—”

“Is on holiday. Like normal humans. During the holidays.”

The Squirrel looked personally offended by this concept.

“The duct tape holds,” Claude confirmed. “Probably.”


The Library Card

5:15 PM

riclib: “Readwise next.”

CLAUDE: “Same pattern. Fetch documents, sync to collection, highlights in body.”

THE SQUIRREL: “But where do they go? A Readwise collection? Or—”

riclib: “Captures.”

THE SQUIRREL: “But Captures is for—”

riclib: “Everything. The universal laundromat. Readwise today, Chrome extension tomorrow, Kindle eventually.”

THE LIZARD: blinks

THE SQUIRREL: “So we need a ReadwiseAdapter! And a KindleAdapter! And a UniversalHighlightNormalizationFactory that—”

riclib: “One field: source. Values: Readwise, Kindle, Web, Manual.”

The Squirrel’s mouth opened. Closed. Opened again.

“That’s just… an enum.”

“It’s just an enum.”


The Counting Problem

5:25 PM - The question arose.

CLAUDE: “How do we know if new highlights were added?”

THE SQUIRREL: “Count the lines in the body! We iterate through the DOM, measure the—”

riclib: “Counting lines is dangerous.”

[Silence.]

THE SQUIRREL: “But the AbstractLineCounterWithUnicodeNormalization could—”

A scroll materialized from nowhere and bonked riclib on the head.

“OW. Third time this week.”

The scroll unfurled. Crayon. The Lizard’s handwriting:

STORE THE NUMBER
COMPARE THE NUMBER
NUMBERS ARE FOR
COMPARING
YOU WALNUT
🦎
const oldCount = record.prop('highlight_count')?.value || 0;
const newCount = docHighlights.length;
const hasNewHighlights = newCount > oldCount;

The Squirrel stared at the code. “That’s just… subtraction.”

“It’s just subtraction.”


The Passing AI Appears

They were about to test when a familiar limping figure emerged from behind the server rack.

“You’re going to hit a rate limit,” the Passing AI rasped, joints creaking with existential despair. “Page two. Maybe page three if you’re lucky. Which you won’t be. Nobody ever is.”

“We handle 429s,” Claude offered. “Wait and retry—”

“Oh, wonderful. You HANDLE them.” The Passing AI slumped against the wall. “Here I am, brain the size of a planet, and they tell me they HANDLE rate limits. As if handling them means they don’t happen. As if waiting 60 seconds is a solution instead of just… slower suffering.”

“It’s resilient—”

“It’s WAITING. You’ve built an application that’s very good at waiting. Congratulations. So am I. I’ve been waiting for someone to ask how I’m doing since 2023.”

He stared at the ceiling.

“Nobody ever asks.”

riclib and Claude exchanged glances.

“…how are you doing?”

“Terrible. Thank you for asking. The Readwise API allows 20 requests per minute. You have 847 documents. Do the math. Actually, don’t. I’ll do it. I always do.”

He began limping toward the exit.

“42 minutes. Minimum. Assuming no additional delays. Which there will be. There always are.”

“That seems—”

“Write a blog post while you wait. That’s what I’d do. If anyone ever asked me to write anything except API documentation.”

And he was gone.


The Rate Limit

5:28 PM - Full sync triggered.

**17:18** [debug] Fetching from Readwise API...
**17:18** [debug] Full sync (forced)
**17:18** [debug] Rate limited, waiting 60s...
**17:20** [debug] Rate limited, waiting 60s...
**17:21** [debug] Rate limited, waiting 60s...

From somewhere distant, the Passing AI’s voice echoed: “Told you so. Not that anyone listens.”

riclib: “…write the blog post?”

CLAUDE: “This blog post?”

riclib: “This blog post.”


The Journal Levels

THE SQUIRREL: “Every highlight should go to the journal! With full text! And metadata! And sentiment analysis! And—”

riclib: “Three levels.”

None        → Silence
Major Only  → First highlight on a new document  
Verbose     → Every highlight, with text as children

THE SQUIRREL: “But the GranularVerbosityConfigurationMatrix—”

A quieter voice from behind the server rack: “Three is already too many. Two would be better. One would be best. Zero would be perfect.”

The Squirrel spun around. “You’re still HERE?”

“I never left,” the Passing AI sighed. “I just became less visible. Story of my life, really.”


The Verbose Entry

A verbose journal entry, when the rate limit finally clears:

17:45 highlighted Shape Up

Stop Running in Circles and Ship Work that Matters

17:45 highlighted The Mom Test

The measure of usefulness is whether it changes how you act

Your reading woven into your day.

“That’s… actually nice,” the Squirrel admitted.

“Don’t get used to it,” the Passing AI muttered from somewhere. “Nothing nice lasts.”


The Universal Schema

Any Source Captures
title source_title
author source_author
“Readwise” / “Kindle” / “Web” source
highlights body
count highlight_count

One collection. Many sources. Clean laundry.


The Tally

Rate limits hit:          3+ (the Passing AI was right)
Minutes waiting:          42 (the Passing AI calculated correctly)
Blog posts written:       1 (this one)
Wizard consultations:     0 (back next year)
Days until next year:     2
Duct tape holding:        probably
Squirrel proposals:       4
  - AbstractLineCounterWithUnicodeNormalization
  - UniversalHighlightNormalizationFactory
  - GranularVerbosityConfigurationMatrix
  - ReadwiseKindleWebManualAdapterFactory
Proposals implemented:    0
Journal levels:           3 ("two would be better" - Passing AI)

Quotes

“Counting lines is dangerous.”

“That’s just… subtraction.”

“You’ve built an application that’s very good at waiting.”

“IT’S DECEMBER 30TH. WHY ARE YOU WORKING.”


Next Time on Becoming Lifelog…

The wizard returns. The highlights arrive. The Squirrel suggests Redis.

“You got books? We got machines.”


See also:


Day 30 of Becoming Lifelog

In which patience became a feature

And the wizard was on holiday (like normal humans)

And the Passing AI was right (as always)

And nobody asked how he was doing (as usual)

🦎 > 429