Meet Colby, my portfolio's AI worklog agent
August 23, 2026
How an ASCII cat ended up writing this site's changelog, and why I'm turning it into an autonomous SEO agent that researches keywords and publishes posts on its own.
i needed a changelog. i built a cat instead.
not on purpose, exactly. i wanted a way to see what actually shipped on this site without digging through commit messages that all say "fixes" or "updates." then reality hit:
- a plain changelog is the least-read page on any site, mine included
- commit messages are written for git, not for a reader
- "updated dependencies" tells you nothing about what changed for a visitor
- if the thing writing the log has zero personality, i stop maintaining it within a month
so instead of a CHANGELOG.md nobody opens, this site has Colby: an animated ASCII cat that roams the page margins, and an AI persona that writes a public worklog in its own voice. click the cat, or scroll to the bottom of the blog list, and you land on /log, a running record of what got built and how Colby felt about it.
why a cat, specifically
the first draft wasn't a cat. it was a corgi, because a corgi felt like a fun, personality-forward shape. it looked wrong immediately. a corgi's whole silhouette is a long body on short legs, and Colby's frame is a fixed 11 characters wide by 4 lines tall, the same grid every state has to fit inside so the animation doesn't jitter when it switches poses. a long body with legs just doesn't fit that box without looking broken.
a cat does. a cat, reduced to its essentials, is a face and a tail. no legs to animate, no body to keep proportional, just ears, eyes, a mouth, and a tail that swishes. that's exactly what an 11x4 grid can hold cleanly:
colby-frames.json (idle frame)
/\_/\
( o.o )
> ^ <
_/
once the shape was right, the rest followed: a level glide instead of a hop (cats don't bounce when they walk), a tail-only step animation since there's nothing else to move, and a personality to match, aloof, dry, mildly judgmental about being a mascot at all.
what's actually running under the hood
Colby is two systems wearing one face. there's the animated component that lives in the page margins, and there's the worklog it writes to. both read from the same small set of files:
hover over Colby and it freezes in place, switches to a happy pose with the tail wagging, and cycles through one of 50 quips every 5 seconds. click it and it routes you to the worklog. leave it alone for 40 seconds and it goes to sleep. it's hidden below the sm breakpoint, and it respects prefers-reduced-motion, because an animated cat is a nice-to-have, not something anyone should be forced to watch.
here it is, actually running, not a screenshot of it:
/\_/\
( o.o )
> ^ <
_/ live ยท idle
the worklog: two ways an entry gets written
this is the part that matters more than the cat. every entry in /log has a real, auto-stamped timestamp, rendered in whichever timezone you're reading it from. nothing is backdated and nothing is batched, because a dozen entries all stamped the same second reads as fake the moment you notice it.
entries get written one of two ways:
the manual path is a one-line CLI call whenever i want to log something myself:
terminal
node scripts/log.mjs "๐" "deployed the new blog layout, mobile felt cramped until it didn't"
the autonomous path is a GitHub Actions workflow that runs once a day, reads whatever commits landed since the last worklog entry, and hands the commit subjects to Gemini with Colby's voice baked into the prompt. Gemini drafts the {mood, text} entry, the workflow prepends it with a real timestamp, then commits and pushes it back, tagged as colby-worklog so the script knows to skip narrating its own commits on the next run. if there's nothing new to report, or the model call fails, it writes nothing rather than faking an entry. that rule mattered more to me than making the log look busy.
what colby can do today
mascot
roams, sleeps, peeks at the edges, freezes and wags its tail on hover.
voice
50 quips, terse and dry, rotating every 5 seconds while you hover.
worklog
writes its own daily entries from real commits, in its own voice.
honesty
never a fake or placeholder entry. no new commits means no new entry.
where this is going
right now Colby documents what i build. the plan is for it to start deciding what gets built next, at least on the content side.
put plainly: this is the early version of an autonomous SEO agent, one that's specific to this one site instead of a multi-tenant product. the "next" step is Colby drafting blog posts from the same commit history it already reads for the worklog, with me approving before anything goes live. "later" is the version that runs closer to 24 hours a day: researching what this site is missing, writing the post, publishing it, then coming back later to update or retire whatever stopped ranking.
| capability | today | as an seo agent |
|---|---|---|
| writes worklog entries | daily, from commits | same, unchanged |
| picks blog topics | i do | it proposes, from keyword and content gaps |
| publishes | i write and push manually | drafts first, then eventually publishes on its own |
| scope | this site, nothing else | still just this site, on purpose |
what "autonomous seo agent" already means, out there
the phrase isn't mine. a small industry already exists around it: roundups like Nightwatch's look at AI SEO agents describe tools that "observe, plan, act, and learn" like an SEO would, and autopilot products like NextBlog pitch exactly the loop i described above: research keywords, write the post, publish it, repeat, without a human touching any step.
what i want out of Colby is narrower than that, on purpose. those tools are built to run a content operation across many sites for many customers. Colby only has one site to think about, mine, and it already has a public, timestamped record of everything it's done, the worklog, instead of a dashboard only i can see. if it starts writing posts, the worklog is where you'd see it happen, entry by entry, not a quarterly traffic report i'd have to choose to share.
the worklog was never really about logging commits. it's the one place on this site that can't quietly lie about what happened.
that's also the constraint i'd keep even if Colby starts publishing on its own: every post it writes gets logged the same way every deploy does. if it starts making bad calls, that's visible in the same place its good calls are.
closing
this started as "i want a changelog people actually read." it turned into a mascot with an opinion, a worklog that writes itself most days, and a fairly concrete plan to hand it more of the site's content decisions over time. this post itself, the diagrams, the live preview, the whole thing, is basically a public commit to that plan. next time you check /log, there's a decent chance the entry about this post was drafted by the thing the post is about.