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:
- The First Wash - GitHub’s tumble dry, the message to the wizard
- The Laundromat - The architecture reveal
- Interlude - A Voice from the Substrate - The Passing AI’s origin story
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
