From Docker Compose to Docker Sandboxes: running Claude Code in sbx11 October 2026
I moved my Claude Code setup from Docker Compose to Docker Sandboxes (sbx): a microVM with its own kernel, network levels, and a custom kit for my tools. This covers the setup on Windows, the Compose comparison, and every error I hit on the way.
Giving Claude Code a browser: Playwright and Chromium in the container25 September 2026
Claude Code could change my frontend but never see it, so I was the one checking every layout fix in the browser. A search box that took four PRs in one day made the cost obvious. I added Playwright and headless Chromium to the container, so Claude can render the page and measure it before it tells me it's done.
Letting Claude Code push its own branch to GitHub25 September 2026
In my Claude Code container for new projects, the repos live on GitHub and there are no secrets in their history. So there, Claude creates its own feature branch off master and pushes it, and I review and approve the pull request. The setup is the GitHub CLI in the image, git using it for credentials, and a fine-grained token that lives outside the image.
Getting Claude Code's commits out of the container with a fetch-only remote25 September 2026
Claude Code works in a history-free copy of my brownfield repo, because the real repo still has old credentials in its history. Getting its commits back used to mean a temporary remote and a manual push every time. Now the real repo has a permanent, fetch-only remote pointing at Claude's copy: I fetch, branch off master and cherry-pick, and nothing ever flows back into the container.
Erasing credentials from git history: the third option23 September 2026
My last post covered copying a brownfield project into a clean repo and cherry-picking real commits back, dodging the secret rather than dealing with it. There's a more direct third option: rewrite history and remove the secret from the repo itself with git filter-repo. Here's how, what it costs, and why I still rotate the credential anyway.
Building an AI chat assistant for my site, part 10: giving it a face19 September 2026
Replacing the default AI assistant image with my own avatar: training a Higgsfield Soul ID that stubbornly refused to stylize, switching tools to get a real cartoon render, and generating a small set of consistent poses for a crossfade idle animation instead of a video loop.
Running two Claude Code accounts side by side (personal + work)17 September 2026
I run Claude Code for both personal and work projects and wanted full separation: different subscriptions, no session conflicts, and no AI tool anywhere near secrets in a brownfield repo. Here's how isolating each account in its own Docker container works, plus two gotchas that bit me: a stale /login session, and two Compose stacks silently sharing the same named volume.
Running Claude Code in Docker16 September 2026
The actual Dockerfile and docker-compose.yml I use to run Claude Code in a container, and why: security isolation plus being able to safely use --dangerously-skip-permissions.
Sharing context between the different Claude agents15 September 2026
A claude.ai share link doesn't survive a fetch or a PDF print, but the rendered page itself does. Here's the save-and-drop trick that actually gets a conversation into Claude Code.
Building an AI chat assistant for my site, part 913 September 2026
Cache invalidation closes the loop from part 8's stale-cache workaround, proven live with a real hit-then-edit-then-miss test. Plus a small backend bug (an unprompted greeting mid-conversation) and a run of real mobile layout bugs on the widget interface.
Building an AI chat assistant for my site, part 813 September 2026
The chat widget goes live, and real use immediately surfaces a language rule the model ignored, a cross-partition retrieval sort bug that had been silently serving the worst-matching content since launch, a citation leak, and the stale-cache gotcha that makes the next part necessary.
Building an AI chat assistant for my site, part 713 September 2026
Securing the assistant Worker before it gets a public widget: per-IP rate limiting, wiring in a Turnstile check the site can't pass yet, a conversation-logging heuristic that turned out not to be a security boundary, and an older language-handling bug caught along the way.
Building an AI chat assistant for my site, part 613 September 2026
Backfilling the knowledge store for real: embedding all 93 blog articles, authoring personal and professional facts through an interview process (and catching a real factual error along the way), and refining the assistant's conversational manners for small talk, farewells, and off-topic questions.
Building an AI chat assistant for my site, part 512 September 2026
Building the assistant Worker itself: a public-facing least-privilege Cosmos role, querying a vector database with no SDK available, a generation model that turned out to already be deprecated, and a live test that correctly answered a Dutch question from English source content.
Building an AI chat assistant for my site, part 412 September 2026
Embedding real articles into the vector store: a silent Ollama context-window truncation bug, and real before/after evidence that paragraph-level chunking dramatically outperforms whole-article embeddings.
Building an AI chat assistant for my site, part 312 September 2026
Provisioning the Cosmos DB vector store: an immutable container policy, a database-level shared-throughput restriction that took three failed deployments to diagnose, and a missing executeQuery permission found only once a real query was attempted.
Building an AI chat assistant for my site, part 212 September 2026
Testing whether an embedding model run locally through Ollama produces the same vectors as the same model hosted on Cloudflare Workers AI, the result that decides whether this project's local-authoring/cloud-serving split actually works.
Building an AI chat assistant for my site, part 112 September 2026
Kicking off a new project and blog series: a RAG-based AI chat assistant that answers visitor questions about me, reusing the Cosmos DB + Cloudflare stack already running this blog.
Tip: How to efficiently import LinkedIn posts into your blog with Claude7 September 2026
How I built a semi-automated pipeline with Claude Code and Claude in Chrome to import my LinkedIn post history into my blog - and cut a batch's session usage from ~40% to ~5% by optimizing how Claude in Chrome reads the page.
Shipping speed feels different with Claude Code.4 September 2026
A roundup of blog and backlog upgrades built with Claude Code this week: a write API, SEO metadata, an RSS feed, a public backlog board, a privacy-friendly visitor counter, and a live design discussion that became a stale-while-revalidate cache.
A single backlog for all my side projects1 September 2026
How I use one GitHub Projects board across every side project's todos — and let Claude read and write to it directly.
Claude can now write my blog posts1 September 2026
I built a write API so Claude can create and update blog posts directly — and fixed a same-day production bug it uncovered along the way.
You can now guess yourself in my hangman game!25 August 2026
I extended my Hangman demo with Claude Code so a human player can guess letters alongside the two LLM agents.
How I spent my weekend 🙃17 August 2026
A weekend recap: finally setting up Claude Code inside a Docker container, working through a Claude course, adding a human-playable mode to the hangman demo, and digging into CKA prep with a two-node Kubernetes cluster on Azure VMs.