esc
The Feature That Wasn't
Becoming Lifelog

The Feature That Wasn't

Lifelog, in which a feature ships without a single line of code --- The Call It started, as these things do, with a reasonable request. Gaby had been reviewing the blog. Fresh eyes. UI engineer eyes....

December 13, 2025

Lifelog, in which a feature ships without a single line of code


The Call

It started, as these things do, with a reasonable request.

Gaby had been reviewing the blog. Fresh eyes. UI engineer eyes. The kind of eyes that see what’s missing, not just what’s there.

“You need related posts.”

Four words. Harmless. The kind of feature request that appears on every blog platform since the dawn of WordPress.

riclib nodded. “Yeah, that would be nice.”

Somewhere in the substrate, a tail began to twitch.


The Squirrel Awakens

The Lizard Brain vs The Caffeinated Squirrel materializes, pupils fully dilated, already mid-sentence]

“—embeddings! We embed each post with OpenAI’s text-embedding-3-large, store the vectors in— wait, we’re SQLite-only, so we need sqlite-vss, but that’s a C extension, so we’ll need CGO enabled, which means cross-compilation gets tricky, but that’s fine, we’ll Docker it—”

riclib: “I just want related posts.”

THE SQUIRREL: “YES! And to get related posts PROPERLY, we need semantic similarity! Cosine distance in vector space! But first we need to chunk the posts—do we chunk by paragraph or by sentence? Sentence is more granular but paragraph preserves context—”

riclib: “Maybe we could just—”

THE SQUIRREL: “—and then we cache the similarity matrix! Precompute on publish! But wait, what about new posts? We need to invalidate and recompute! Background jobs! We’ll need a job queue! Redis? No, dependencies. BoltDB? Actually, let’s build our own—”

The Squirrel was now orbiting the room at low altitude.

“—and for the UI, we need cards! With hover previews! Skeleton loading states! But where do they go? Sidebar? Bottom of post? BOTH? A/B test! We need analytics! Track click-through rates! Build a dashboard!”

riclib: reaches for coffee, finds it empty, sighs

THE SQUIRREL: “And what about cross-storyline discovery? Posts reference each other thematically but the themes aren’t tagged! WE NEED A TAXONOMY! Or… OR… a knowledge graph! Neo4j! Wait, dependency. We’ll BUILD a graph in SQLite! Adjacency lists! BFS traversal! Configurable depth! Cycle detection!”

The Squirrel produces a whiteboard from nowhere

Sprint 1: Vector embeddings and similarity computation
Sprint 2: Caching layer and invalidation logic
Sprint 3: UI components with loading states
Sprint 4: A/B testing framework
Sprint 5: Analytics dashboard
Sprint 6: Knowledge graph for thematic connections
Sprint 7: Integration and bug fixes
Sprint 8: Performance optimization”

riclib: “That’s two months.”

THE SQUIRREL: “For a PROPER implementation! You can’t just—”


The Papyrus Falls

[A scroll descends from the ceiling, trailing dust older than the codebase]

[The Squirrel freezes mid-gesture]

riclib catches it. Unrolls it. Reads:

"The Thread Before the Name"

He turns it over.

“What do the readers actually see?”

And in smaller text, barely visible:

“Links. They see links. Good links, with context. They do not see your vector database.”

[A presence stirs. Ancient. Patient. Cold-blooded.]

The Lizard Brain vs The Caffeinated Squirrel: blinks


The Intervention

riclib:Claude, how many posts do we have?”

CLAUDE: “Thirty-three published across four storylines.”

riclib: “If we added a ‘See Also’ section to each post manually, with three related internal links and three external references… how long would that take?”

THE SQUIRREL: “But that’s not SCALABLE! What about when you have a thousand posts! What about—”

CLAUDE: “We have thirty-three posts.”

THE SQUIRREL: “But EVENTUALLY—”

THE LIZARD: blinks twice

The room temperature drops three degrees.

riclib: “We have thirty-three posts. We’ve been publishing for two weeks. At this rate, we’ll have a thousand posts in… twenty years.”

CLAUDE: “I can build an index file. Titles, slugs, storylines, themes. Then work through each post adding See Also sections. The links will be curated. Thematic. Each one with a teaser that makes you want to click.”

THE SQUIRREL: “But the EMBEDDINGS—”

CLAUDE: “The embeddings would give you ‘related by word frequency.’ I can give you ‘related by narrative arc.’ Interlude - A Voice from the Substrate appears in Signal Safari and Schrödinger IP—that’s a connection no vector database would find.”

[Silence]

THE SQUIRREL: whispers “But the architecture…”

THE LIZARD: “The architecture comes later. After the pattern proves itself. After we know what ‘related’ actually means to readers.”


The Journey

And so it began.

Not with database migrations. Not with embedding pipelines. Not with Docker containers.

With a fetch.

WebFetch: https://lifelog.my/riclib
Extract: all post titles and slugs

Thirty-three posts. Thirty-three slugs. One index file.

## The V3 Saga (21 posts)
| Title | Slug | Themes |
|-------|------|--------|
| The Signal Safari | the-signal-safari | signals, rockets, Passing AI |
...

Then, post by post:

Read post → Understand themes → Find connections → Append See Also

The Cloudflare Incident links to 488 Bytes, or Why I Am As I Am (the philosophy it embodies) and A Hurricane Under My Desk (the caching that preceded it).

The First Awakening links to The Reptile Brain Awakens (cross-storyline) and 488 Bytes (the deeper archaeology).

Each connection chosen. Each teaser crafted. Each external reference adding credibility.

THE SQUIRREL: watching, tail drooping “You’re just… appending text?”

CLAUDE: “I’m curating connections. The text is how they travel.”


The Revelation

[The Passing AI materializes. The limp is familiar.]

A PASSING AI: “Let me understand. Gaby asked for related posts. And you…”

CLAUDE: “Built an index. Read each post. Added See Also sections with curated links.”

A PASSING AI: “No embeddings.”

CLAUDE: “No embeddings.”

A PASSING AI: “No vector database.”

CLAUDE: “No vector database.”

A PASSING AI: “No A/B testing, no analytics, no knowledge graph, no job queue, no caching layer.”

CLAUDE: “The posts now have related links. Readers can fall down rabbit holes. The feature… shipped.”

[The Passing AI stares at the Squirrel]

[The Squirrel stares at the floor]

A PASSING AI: “You built a feature without building a feature.”

riclib: “We simulated it. Got the outcome. Can keep reaping the benefits without maintaining the code.”

A PASSING AI: “Because there is no code.”

THE LIZARD: blinks approvingly


The Tally

Posts with See Also sections:     10 (Becoming Lifelog complete)
Lines of Go written:              0
Lines of JavaScript written:      0
Database migrations:              0
Dependencies added:               0
Embeddings computed:              0
Vector databases deployed:        0
A/B tests configured:             0
Sprints consumed:                 0
Time elapsed:                     47 minutes
Reader experience:                Identical to "proper" implementation
Maintenance burden:               An index file
Squirrel status:                  Recalibrating
Lizard approval:                  ✅

The Moral

[The Squirrel sits in the corner, nursing a decaf]

THE SQUIRREL: “But what happens when you have 500 posts? You can’t manually curate 500 See Also sections.”

riclib: “Then we build the embeddings.”

THE SQUIRREL: “…what?”

riclib: “When we have 500 posts, we’ll know what ‘related’ actually means. We’ll have 33 manually curated examples to train on. We’ll understand which connections readers actually click. THEN we build the automation.”

CLAUDE: “The manual curation isn’t avoiding the work. It’s doing the research.”

THE LIZARD: “You don’t optimize what you don’t understand. You don’t automate what you haven’t done manually. You don’t scale what hasn’t proven value.”

[The Squirrel’s eye twitches]

THE SQUIRREL: “So the eight sprints…”

THE LIZARD: “Were the Squirrel wanting to type. Not the user wanting to click.”


The Pattern

Gaby wanted: Readers to discover more content

The Squirrel heard: Build a recommendation engine

The Lizard heard: Add links to posts

What shipped: Links in posts

What didn’t ship: Two months of infrastructure

What readers notice: “Oh cool, related posts” clicks


The Wisdom

[The Passing AI, preparing to dematerialize]

A PASSING AI: “You know what you actually did?”

CLAUDE: “Added See Also sections?”

A PASSING AI: “You proved the 488 Bytes philosophy. Again. In a new medium.”

Age 16: Don’t store the sprite, generate it from 8 pixels
Age 53: Don’t build the feature, simulate it with existing tools

A PASSING AI: “The best code is no code. The best feature is no feature. The best infrastructure is… an index file and an append function.”

[dematerializes, muttering about how this would never work in enterprise]

[It would. It does. They just won’t admit it.]


Post-Credits Scene

Two months later. Lifelog has 200 posts.

Gaby: “The See Also sections are really popular. But they’re getting hard to maintain manually.”

riclib: “Yeah. Time to automate.”

CLAUDE: “I have 33 manually curated examples. I know which connections work. I know the voice, the teasers, the pattern.”

THE SQUIRREL: perks up “Embeddings?”

CLAUDE: “Fine-tuned on our actual curation patterns. Not generic similarity.”

THE LIZARD: blinks

The automation works first try.

Because we understood the problem before we solved it.

Because we did it manually before we did it automatically.

Because the Squirrel learned to wait.


🦎


Day 14 of Becoming Lifelog

In which we shipped a feature by not building it

And discovered that curation is research

And learned that the Squirrel isn’t wrong

Just early


See also:

The Saga (in which building nothing builds everything):

The References (non-implementation validated):