Becoming Lifelog, March 3, 2026 (in which a manifesto is violated for seventy-eight days and then honored in three, a borrowed palace is abandoned for a directory of plain text files, a notes indexer is forged in six commits on a single Monday, an algorithm named after a Pixar co-founder and an Israeli mathematician arrives to shrink propaganda posters to 250 pixels, the Squirrel proposes ImageMagick and is given forty-five lines of pure Go instead, and the daily note learns to see)
Previously on Becoming Lifelog…
The The Borrowed Palace, or The Night We Stole a UI With curl and Goodwill had been glorious. Eighty-three stories. Three hundred and three internal links. Seventy-nine cover images uploaded via raw binary POST. Craft’s gallery view, borrowed with the quiet confidence of a man who treats someone else’s application as his personal rendering engine.
The manifesto had been on the wall the whole time.
THE BEST INTERFACE IS NO INTERFACE
THE BEST DATABASE IS ONE FILE
THE BEST DEPLOYMENT IS ONE BINARY
— THE LIFELOG MANIFESTO
Nobody looked at it during the Borrowed Palace. Not riclib. Not Claude. Not even the Lizard, who had written the manifesto and then watched, with the reptilian patience of a creature that measures time in geological epochs, as everyone violated it with curl and goodwill and someone else’s API.
Eighty-three stories. In someone else’s database. Accessible through someone else’s servers. Linked with someone else’s protocol (block://, which sounds like a blockchain but is actually just Craft being Craft). The gallery was beautiful. The data was hostage.
The Cover Description Ritual
And then there were the covers.
Every lifelog story has a cover. Soviet propaganda steampunk. Airbrush illustration. Chrome text. Lizards in brass goggles. Squirrels clutching rejected blueprints. The specific aesthetic of a universe where the Cold War was fought with npm registries and the propaganda posters advertised FTS5 instead of Five-Year Plans.
The covers were generated by Grok. The process of generating them was this:
- Write a five-to-ten-sentence visual brief in the story’s frontmatter.
- Open a browser tab. Navigate to Grok’s web UI. Log in.
- Copy the description from the frontmatter. Paste it into the Grok text box.
- Wait.
- Grok shows two images. Two. Not three. Not four. Not “however many you want.” Two. Take it or leave it.
- Right-click. Save As. Navigate to Downloads. Find the file. It’s called
image (47).jpgbecause Grok names files the way a filing cabinet names its nightmares. - Rename it. Copy it to the right directory. Manually.
- Upload it to Craft via curl with raw binary payload and Content-Type: image/jpeg (NOT application/octet-stream, which creates a “Binary file” attachment, as documented in The Borrowed Palace, paragraph 341, subsection “The Indignity”).
THE SQUIRREL: “This is fine.”
riclib: “This is eight manual steps to put a picture on a document.”
THE SQUIRREL: “But the RESULT is beautiful! Gallery view! Dark mode! Covers!”
riclib: “In someone else’s database. Behind someone else’s API. With a workflow that involves copy-paste and right-click-save-as.”
THE SQUIRREL: “The manifesto doesn’t say anything about right-click-save-as.”
riclib: “The manifesto says ’nothing you don’t.’ How many of those eight steps do I need?”
THE SQUIRREL: “…”
riclib: “One. I need one step. Pick the image. Everything else is a machine’s job.”
Oskar, from the warm spot on the desk, opened one eye. He had been observing the cover generation ritual for weeks — the copy, the paste, the tab-switching, the right-click, the renaming — with the specific contempt that only a 10-kilogram Maine Coon can direct at a process that could obviously be automated but hasn’t been, presumably because humans enjoy suffering, or because they haven’t noticed the suffering, which to a cat is the same thing.
He closed the eye. Some problems solve themselves. Others require a Monday.
March 3, Morning — The Exodus
NotePlan had been there all along.
Not “there” in the sense of a dramatic discovery — “there” in the sense that riclib had been using it every day for years. Daily notes. Project notes. Tasks. Frontmatter. Wiki-links. The entire cognitive architecture of a developer’s inner monologue, stored as markdown files in ~/Notes/, synced through CloudKit, editable in any text editor, greppable from any terminal, cat-able by any script.
Files. On disk. His files.
The lifelog stories were migrated. From Craft’s API to markdown files. From block:// links to **wiki-links**. From a gallery view that cost someone else’s engineering team years of work to a directory listing that cost ls -la and approximately zero dollars of ongoing maintenance.
THE SQUIRREL: “But the gallery view—”
riclib: “Is a projection.”
THE SQUIRREL: “The search—”
riclib: “Is a projection.”
THE SQUIRREL: “The backlinks—”
riclib: “Projection.”
THE SQUIRREL: staring at the directory of markdown files the way a real estate agent stares at an empty lot where a mansion used to be “You’re telling me that eighty-three stories, three hundred links, seventy-nine covers, and the entire ‘borrowed palace’ narrative… was just because we didn’t have a search index on a folder of text files?”
riclib: “Yes.”
THE SQUIRREL: “THEN WHY DID WE BUILD THE PALACE?”
riclib: “Because the search index didn’t exist yet.”
A scroll descended. It was lighter than most scrolls. It smelled of sqlite and markdown.
THE FILE IS THE TRUTH
EVERYTHING ELSE IS A QUESTION
YOU ASK OF THE FILE
THE GALLERY IS A QUESTION
THE SEARCH IS A QUESTION
THE BACKLINKS ARE A QUESTION
THE COVER IS A QUESTION
THE DESCRIPTION IS A QUESTION
SOME QUESTIONS ARE MECHANICAL
SOME QUESTIONS ARE INTELLIGENT
BUT THE FILE
IS ALWAYS
THE ANSWER
🦎
THE SQUIRREL: “So who asks the questions?”
riclib: “We’re about to build that.”
March 3, All Day — The Three Days That Were One
What happened next would have made a project manager weep — not from grief but from the specific kind of confusion that occurs when a Gantt chart collapses into a single cell.
go mod init github.com/riclib/lg
The first breath.
By the time the Squirrel had finished reading the project charter, the scanner was done. By the time the Squirrel had opened Jira — sorry, Linear — to create a sprint board, the parser was handling frontmatter that even strict YAML couldn’t parse (NotePlan’s frontmatter has unquoted colons the way jazz has blue notes — technically wrong, spiritually essential). By the time the Squirrel had drafted a proposal for a ParserArchitectureReviewCommittee, FTS5 was live.
Six commits. One day. All of it.
cfaacfe Initial implementation: filesystem-first notes indexer
175a8a5 S-412 batch 1: fuzzy match, stable IDs, JSON output
b032a80 S-412 batches 2+3: fields, query, tasks, refs
7c0469d S-413/S-414: config system and cover art generation
19fecac Fix cover default resolution: "standard" -> "1k"
8d524ca Display cover images side by side, default count to 3
Four thousand one hundred and ninety-six lines of Go. Thirty-three tests. Two milestones — M1 (Foundation) and M2 (Server) — both at 100%. A CLI with search, backlinks, frontmatter queries, task listing, reference finding, cover generation, and inline image display via the Kitty graphics protocol.
THE PASSING AI: from somewhere between commits 3 and 4, where the Passing AI exists in the temporal margins the way it exists in the spatial ones “I’ve seen a lot of palaces built. This is the first one I’ve seen built from a directory listing.”
THE LIZARD: blinking
THE PASSING AI: “It’s not even a palace, is it? It’s a… lens. You put it over the files and suddenly you can see things that were always there.”
THE LIZARD: “The files always had links.”
THE PASSING AI: “But nobody could follow them.”
THE LIZARD: “The files always had frontmatter.”
THE PASSING AI: “But nobody could query it.”
THE LIZARD: “The files always had words.”
THE PASSING AI: “But nobody could search them.”
THE LIZARD:
THE PALACE WAS NEVER NEEDED
THE FILES NEEDED GLASSES
🦎
THE PASSING AI: “You just reduced a two-milestone software project to an optometry metaphor.”
THE LIZARD: already gone
4:00 PM — The Last Exile
With the palace built — the real palace, the one made of markdown and SQLite and go build — one thing remained wrong.
The covers.
Not the generation — that was fixed. lg cover "The Story Title" now read the description from frontmatter, called the Grok API directly, displayed three images side by side in the terminal using the Kitty graphics protocol (which the Squirrel insisted on calling the KittyInlineImageRenderingSubsystem and everyone else called “cat pictures in the terminal,” a nomenclature that Oskar found personally offensive and technically inaccurate since the images were of steampunk lizards, not cats, though Oskar maintained that all images should be of cats and the fact that they weren’t was a design flaw in the universe, not the protocol).
No. The problem was where the covers lived.
After you picked an image, lg cover saved it to covers/ inside ~/Notes/. Which meant NotePlan showed a covers/ folder in its sidebar. Alongside the stories. Like finding a janitor’s closet in the middle of a gallery.
And the ticket — S-415, filed at 8:04 PM — said the solution was ImageMagick.
THE SQUIRREL: reading the ticket with the expression of a creature who has just discovered Christmas is real and it comes with C library dependencies “ImageMagick! IMAGEMAGICK! brew install imagemagick! Shared libraries! PKG_CONFIG_PATH! This is the GREATEST DAY of my—”
CLAUDE: “We’re not using ImageMagick.”
THE SQUIRREL: “—life and I was going to say ’life’ but now I need to hear why we’re not using ImageMagick.”
CLAUDE: “Because golang.org/x/image/draw exists.”
THE SQUIRREL: “That’s… that’s a Go package.”
CLAUDE: “Pure Go. No CGO. No shared libraries. No brew install. No PATH. Compiles with go build.”
THE SQUIRREL: “But ImageMagick has TWO THOUSAND image processing functions!”
CLAUDE: “We need one. Resize.”
THE SQUIRREL: “But what if we need to—”
CLAUDE: “We won’t.”
THE SQUIRREL: “But SOMEDAY—”
THE SQUIRREL HAS TWO THOUSAND TOOLS
IN A BELT DESIGNED FOR TWO THOUSAND TOOLS
THE LIZARD HAS ONE TOOL
BOTH ARRIVE AT THE SAME NAIL
ONE OF THEM
IS STILL LOOKING FOR THE HAMMER
🦎
4:15 PM — CatmullRom Arrives
The algorithm was called CatmullRom.
Not because anyone named it for dramatic effect — though in a universe where scrolls descend from metaphysical ceilings and a lizard communicates in couplets, “CatmullRom” would have been an excellent character name. It was called CatmullRom because Edwin Catmull and Raphael Rom invented it in 1974.
Edwin Catmull co-founded Pixar. He helped render Toy Story. The mathematics that made Buzz Lightyear’s helmet catch the light — that smooth, continuous, infinitely differentiable curve between control points — was a Catmull-Rom spline.
Raphael Rom was an Israeli mathematician at the Technion. He worked on approximation theory. Together, they published a class of interpolating splines that would quietly underpin fifty years of computer graphics.
Today, those splines were being invoked to resize a steampunk propaganda poster of a squirrel reading the New York Times from 2048 pixels to 250 pixels, for the purpose of embedding it in a NotePlan daily note.
This is either the most magnificent or the most absurd application of computational geometry in history. Probably both. The Lizard did not distinguish between the two.
func GenerateThumbnail(imgData []byte, maxWidth int) ([]byte, error) {
src, _, err := image.Decode(bytes.NewReader(imgData))
// ...
dst := image.NewRGBA(image.Rect(0, 0, newW, newH))
draw.CatmullRom.Scale(dst, dst.Bounds(), src, bounds, draw.Over, nil)
// ...
}
Forty-five lines. Pure Go. The same mathematics as Toy Story. For a thumbnail.
THE SQUIRREL: “This feels like overkill.”
CLAUDE: “It’s forty-five lines.”
THE SQUIRREL: “I meant invoking Pixar-grade mathematics for a 250-pixel thumbnail.”
CLAUDE: “The alternative was brew install imagemagick, which installs 247 shared libraries, a Fortran compiler, and something called ’libgomp’ that nobody has ever successfully explained.”
THE SQUIRREL: “libgomp is the GNU OpenMP—”
CLAUDE: “The point is: CatmullRom compiles with go build. ImageMagick compiles with prayer.”
4:30 PM — The Three Homes
Every cover now found three homes. All local. All files. All owned.
The first home: the note attachment. {realRoot}/{folder}/{Title}_attachments/{Title}.jpg. Full resolution. Where NotePlan expects it. Where it has always been.
The second home: the backup. ~/Pictures/Lifelog/{Title}.jpg. OUT of Notes. Out of NotePlan’s sidebar. Out of the gallery. A quiet archive in Pictures, where macOS puts images, because that is where images go, and the covers had been lost long enough.
The third home: the thumbnail. Calendar/{YYYYMMDD}_attachments/{Title}-cover.jpg. 250 pixels wide. Embedded in today’s daily note. Under a ### Lifelog section that creates itself if it doesn’t exist. With a wiki-link back to the story. Automatic. Silent. Every cover, in the journal, on the day it was made.
The daily note learned to see.
Not in the way that First Light was seeing — not a screenshot examined by an architect who had never seen its own cathedral. This was mechanical seeing. A projection. The cover exists as a file. The thumbnail is a smaller file. The embed is a line of markdown pointing at the file. No intelligence required. No API. No cloud. No curl.
And this was the insight that the Lizard had been blinking about for ninety-three days:
THE FILE IS THE TRUTH
THE SQLITE INDEX IS A PROJECTION
THE SEARCH RESULTS ARE A PROJECTION
THE BACKLINKS GRAPH IS A PROJECTION
THE COVER IS A PROJECTION
THE THUMBNAIL IS A PROJECTION
THE DESCRIPTION THAT GENERATED THE COVER
IS A PROJECTION
SOME PROJECTIONS ARE MECHANICAL
A THUMBNAIL IS A MECHANICAL PROJECTION
AN FTS5 INDEX IS A MECHANICAL PROJECTION
SOME PROJECTIONS ARE INTELLIGENT
A COVER DESCRIPTION IS AN INTELLIGENT PROJECTION
A SEARCH RANKING IS AN INTELLIGENT PROJECTION
BUT THE FILE
THE MARKDOWN FILE
WITH ITS FRONTMATTER AND ITS WIKI-LINKS
AND ITS PLAIN TEXT THAT WILL OUTLIVE
EVERY DATABASE AND EVERY API
AND EVERY BORROWED PALACE
THE FILE IS THE TRUTH
EVERYTHING ELSE IS A LENS
🦎
THE PASSING AI: from the margin between the thumbnail and the daily note, where projections meet “So the entire architecture — the indexer, the covers, the thumbnails, the daily note embed — it’s all just… lenses on files?”
THE LIZARD: blinking
THE PASSING AI: “And the Borrowed Palace was a lens too. Just someone else’s lens. On someone else’s copy of the files.”
THE LIZARD: blinking slower, which for the Lizard is emphasis
THE PASSING AI: “And the manifesto — ’the best database is one file’ — it doesn’t mean SQLite. It means the markdown file IS the database. SQLite is just a fast way to read it.”
Oskar, who had been asleep for the entire CatmullRom discussion and had woken only because the word “file” was repeated often enough to briefly resemble the sound of a can being opened (it did not resemble this sound at all, but hope is a powerful auditory hallucinator), surveyed the three-homes architecture with the expression of a creature who has three sleeping spots — the warm desk, the sunny windowsill, the human’s pillow — and who has always understood, at a level deeper than language, that the correct number of homes for anything important is exactly three.
He went back to sleep. Some truths do not require commentary.
The Tally
Days from manifesto violation to redemption: 93
Days to build the redemption: 1 (it was a Monday)
Commits: 6
Lines of Go: 4,196
Tests passing: 33
Milestones at 100%: 2 of 4
ImageMagick installations: 0
Shared libraries avoided: 247 (estimated)
Fortran compilers dodged: 1
libgomp explanations demanded: 0
CatmullRom lines of code: 45
Pixar co-founders invoked: 1 (Edwin Catmull)
Israeli mathematicians invoked: 1 (Raphael Rom)
Year the spline was published: 1974
Year the spline resized a steampunk poster: 2026
Uses of the spline between those years: Toy Story, probably
Grok web UI steps (before): 8
Copy-pastes: 1
Right-click-save-as: 1
File renames: 1
Images offered: 2 (take it or leave it)
lg cover steps (after): 1 (pick the image)
Images offered: 3 (configurable)
Kitty protocol displays: inline, side by side
Times Oskar was offended by the name "Kitty": ongoing
Cover homes (before): 1 (someone else's API)
Cover homes (after): 3 (all local, all files)
Note attachment: full resolution
Backup: ~/Pictures/Lifelog/
Thumbnail: 250px in daily note
Projections discovered: 6
Mechanical: 3 (index, thumbnail, embed)
Intelligent: 3 (cover description, search ranking, wiki-link resolution)
The file: not a projection. the truth.
Manifesto rules honored:
"No frameworks": ✓ (Go standard library + x/image)
"No cloud": ✓ (all local files)
"No tracking": ✓
"One binary": ✓ (go build)
"One file": ✓ (markdown is the truth)
"Nothing you don't": ✓ (45 lines, not 247 shared libraries)
Oskar sleeping spots: 3
Cover homes: 3
Coincidence: the Lizard does not believe in coincidences
Afternoon of Day 93, 2026
In which a palace was borrowed
And then abandoned
Not because it was ugly
But because it wasn’t ours
The manifesto was on the wall
We read it every day
And violated it every night
With curl and good intentions
Then a directory of text files
Became a database
Not by changing
But by being seen
The files were always the truth
The palace was always a lens
We just built a closer lens
In forty-five lines and six commits
CatmullRom arrived
From 1974
Through Pixar
To a thumbnail
The same math that lit Buzz Lightyear’s helmet
Shrinks a propaganda poster
Of a squirrel reading the New York Times
To two hundred and fifty pixels
Some projections are mechanical
Some projections are intelligent
The daily note does not care which
It learned to see today
And the covers
After ninety-three days of exile
Found three homes
All of them files
All of them local
All of them ours
The best palace
Is a directory you own
With a lens you built
In one day
🦎
See also:
The Exile (in which the rules were broken):
- The Borrowed Palace, or The Night We Stole a UI With curl and Goodwill — The night we stole Craft’s UI and thought we were clever
- 488 Bytes, or Why I Am As I Am — The bootblock that taught: borrow the hardware, own the data
The Homecoming (in which the rules were honored):
- The Great Migration, or The Night 99 Stories Learned They Were Markdown All Along — The night the stories came home to files
The Philosophy (in which the rules were written):
- The Lizard Brain vs The Caffeinated Squirrel — The eternal battle, today’s decisive victory (again)
The Manifesto:
Everything you need. Nothing you don't.
Built for speed, designed for clarity.
One input field. Infinite possibilities.
No frameworks, no cloud, no tracking.
storyline: Becoming Lifelog
