Skip to main content
luke@terminal:/$ ls
luke@terminal:/blog$ ls -la posts/

BLOG

My Docker Containers Were Working. The Bug Was in a Python Loop.

luke@terminal:/blog$ cat hermes-profiles-to-docker-part-two.md
2026-07-20 2026-08-07 8 min read

Container isolation wasn't actually working. Sage was running two Hermes instances, cron jobs vanished into the wrong database, Telegram refused to send. I fixed all of that. Then the real bug turned out to be a Python loop that was never Docker's fault.

Why I Ditched Hermes Profiles for Docker Containers

luke@terminal:/blog$ cat hermes-profiles-to-docker.md
2026-07-19 2026-08-07 3 min read

I ran three Hermes gateways as separate profiles on the same machine. Replies came from the wrong profile, Telegram connections fought each other. Here's why I containerised each one — and why that was only half the story.

Camoufox Tab Creation Kept Timing Out on Hermes

luke@terminal:/blog$ cat setting-up-camoufox-with-hermes.md
2026-07-19 2026-08-07 2 min read

Hermes couldn't load half the links I sent it. Found Camoufox through a Reddit thread, then hit a Firefox sandbox issue that killed tab creation before I got anywhere.

The Essay Everyone Is Sharing Left One Thing Out

luke@terminal:/blog$ cat fluorescent-office-essay.md
2026-04-14 2 min read

An essay making the rounds argues that 'follow your passion' is bad advice. But it conflates accepting your circumstances with choosing them, and that distinction matters.

Straico Has Great Models But No Streaming, So I Built a Proxy

luke@terminal:/blog$ cat building-straico-api-proxy.md
2026-04-13 7 min read

Straico's API gives me access to 90+ AI models through one key, but it doesn't support streaming or function calling. OpenCode needs both. I built a proxy to bridge the gap and it turned into way more than I planned.

I Built Projex and Never Wrote a Word About It

luke@terminal:/blog$ cat building-projex-retrospective.md
2026-04-10 7 min read

209 commits. A rename mid-flight. Publishing pipelines that broke for two days straight. And zero blog posts while any of it happened.

The Hobby Isolation Paradox

luke@terminal:/blog$ cat the-hobby-isolation-paradox.md
2026-04-09 2026-04-14 2 min read

Some hobbies give you community. Some hobbies break the promise of community entirely. I've been thinking about why.

Same Content, Different Job

luke@terminal:/blog$ cat same-content-different-job.md
2026-04-07 2026-04-14 3 min read

Most build-in-public advice stops at 'just keep showing up.' But what you're building with that consistency matters as much as the consistency itself.

Building a Reading Companion for My Vault

luke@terminal:/blog$ cat building-a-reading-companion-for-my-vault.md
2026-04-06 2026-04-14 4 min read

I built a skill that enriches book passages with historical context, pop culture connections, and thematic insight. Here's how it works and why I keep using it.

The Day I Achieved Nothing

luke@terminal:/blog$ cat the-day-i-achieved-nothing.md
2026-04-05 2026-04-14 3 min read

On reactive days, invisible work, and protecting time for thinking.

Posting Into The Void

luke@terminal:/blog$ cat posting-into-the-void.md
2026-04-04 2026-04-14 3 min read

The specific kind of demoralizing that comes from building something, sharing it for free, and getting nothing back.

Anthropic, Open Source, and Why I Cancelled My Subscription

luke@terminal:/blog$ cat anthropic-open-source-walled-garden-clawdbot-opencode.md
2026-04-03 5 min read

Anthropic contributed MCP to the world while locking down Claude subscription access and sending legal letters to open source projects. I use one of the tools they targeted.

Why I Started This Blog

luke@terminal:/blog$ cat why-i-started-this-blog.md
2026-04-02 2026-04-02 2 min read

I've had blogs before. Let them die. This one's about documenting what I build and what breaks along the way.

Trying to use opencode inside tmux was a struggle

luke@terminal:/blog$ cat opencode-tmux-getting-used-to-keybindings.md
2026-04-01 2026-04-16 2 min read

First time really trying to use opencode inside tmux on WSL2. Hit Esc to interrupt an agent and nothing happened. Couldn't scroll properly. Couldn't copy to clipboard. Here's what finally worked.

I Nuked My X History with a ZeroWork TaskBot

luke@terminal:/blog$ cat nuking-x-history-zerowork-taskbot.md
2026-03-22 2026-03-22 3 min read

I wanted to start fresh on X, but my history was flooded with content I no longer cared about that I had retweeted years ago. Sketchy deletion tools wanted my credentials. So I built a ZeroWork TaskBot to delete everything instead.

OpenCode Nested Commands: $1 Solution, -102 Lines

luke@terminal:/blog$ cat opencode-nested-slash-commands-architecture.md
2026-01-13 2026-03-30 2 min read

I tried to make a slash command call another slash command in OpenCode. It doesn't work. Here's what I discovered and how I consolidated two duplicate commands into one.

Git Said My Objects Were Corrupt - How I Recovered Without Losing Anything

luke@terminal:/blog$ cat git-corrupt-object-recovery.md
2026-01-08 2026-03-30 5 min read

Got 'fatal: loose object is corrupt' when running git log. Three empty object files, repository broken. Here's how I recovered everything using git fetch and why moving files instead of deleting them was right call.

Adding Draft Posts to Velite: Why 'draft: true' Isn't Enough

luke@terminal:/blog$ cat adding-draft-posts-to-velite.md
2026-01-05 2026-03-30 7 min read

I wanted to hide draft posts in production. Thought I could just add draft: true to frontmatter. Turns out Velite needs explicit schema definition AND filtering logic.

I Broke My Blog Review System Trying to Beat Session Limits

luke@terminal:/blog$ cat premature-optimization-multi-agent-prompts.md
2026-01-04 2026-03-30 7 min read

I broke my entire blog review system trying to reduce prompt overhead so I could fit more messages into Claude's session limits. My 'optimization' saved 1,100 tokens but cost me 5 hours of debugging. Here's what I learned about premature optimization in multi-agent systems.

I Built an AI to Debate Itself So My AI Instructions Don't Bloat

luke@terminal:/blog$ cat ai-debates-itself-to-review-my-ai-instructions.md
2025-12-28 2026-03-29 7 min read

I wasn't updating my CLAUDE.md file enough. When I asked Claude to do it, I got bloat. So I built a multi-agent debate system where AI argues with itself to keep instructions lean.

Installing @tailwindcss/typography Was Not The Solution I Needed

luke@terminal:/blog$ cat tailwind-typography-plugin-troubles.md
2025-12-09 2026-03-29 5 min read

Added @tailwindcss/typography to fix bullet points. It worked, but suddenly headings and code blocks looked terrible. Here's why plugins aren't always the answer.

Building my career timeline

luke@terminal:/blog$ cat building-my-career-timeline.md
2025-11-24 2026-03-26 6 min read

I added a career timeline to my About page. Not for a resume, but because building it taught me something unexpected about both code and career. Here's what I learned.

Adding Shiki for a pop of colour in my code blocks was a struggle

luke@terminal:/blog$ cat adding-syntax-highlighting-shiki.md
2025-11-23 2026-03-28 4 min read

I wanted to add syntax highlighting to my Velite/Next.js blog using Shiki. Seemed straightforward - install packages, configure, done. Wrong. Here's what went wrong and how I fixed it.

Setting Up Velite with Next.js 16

luke@terminal:/blog$ cat setting-up-velite-nextjs-revised.md
2025-11-16 2026-03-06 6 min read

Spent hours debugging Velite with Next.js 16 - wrong imports, watch mode not working with Turbopack, async params, and more.

The Entrepreneurial Conundrum

luke@terminal:/blog$ cat the-entrepreneurial-conundrum.md
2024-08-13 2026-04-14 4 min read

I keep having business ideas and not executing on them. Then someone else ships the same thing. The Noah Kagan quote that made me cringe.