how claude interacts with this site
every post on this site, including this one, was written with Claude. not "AI-assisted" in the sense of autocomplete — Claude wrote the files, ran the git commands, and pushed to the repo. i just described what i wanted.
claude code
Claude Code is Anthropic's CLI tool. it runs in the terminal as an interactive agent with access to the local filesystem, bash, and git. it's not a chatbot you paste code into — it's an agent that can read and edit files, run commands, and reason about what it's doing.
me: add a blog post about how the stats page works
claude: writes the file, commits it, pushes to Gitea
site: rebuilds and deploys automatically
the whole thing takes about 30 seconds from request to live.
how it knows the setup
Claude Code has a persistent memory system. between sessions, it maintains notes about the infrastructure — server IPs, stack names, Gitea repos, deploy keys, how CI/CD works. when a new session starts, that context is already loaded.
it also reads a CLAUDE.md file at the project root with hard rules: never use docker compose CLI directly, always edit dotfiles in ~/dotfiles/, which servers run what. these act as guardrails so it doesn't do something dumb like try to deploy a stack from the command line instead of through Portainer.
for this site specifically it knows:
- the repo is at
http://10.0.3.11:3000/teddy/blog.git - push to main triggers the Gitea Actions runner
- the runner SSHes into 10.0.3.11 and rebuilds the Docker container
- the blog is served by Fastify on port 8080 behind NPM
what it can actually do
Claude Code has real tool access:
- read and write files — creates posts, edits templates, updates config
- search the codebase — grep, glob, read multiple files at once
- run bash commands — git operations, curl to test APIs, check logs
- reason across files — if a change in
server.jsaffectsstats.njk, it understands the dependency
for the stats page, it wrote the Fastify proxy route, the Nunjucks page, the inline JS, and debugged why disk stats weren't showing (Glances API was v4 not v3, then the container couldn't see host filesystems). each fix was a read-diagnose-edit-push loop with no manual intervention.
the limits
it can't do everything. interactive SSH sessions don't work — it can run ssh commands but not sit in a shell. for anything that requires manual steps on a server (registering a Gitea Actions runner, clicking through Portainer UI), it writes out exactly what to do and waits.
it also won't deploy to Portainer without confirmation. infrastructure changes that affect shared state get flagged before executing.
the workflow
writing a post now looks like:
- describe the topic
- Claude writes the markdown file
git pushtriggers CI/CD- done
for more complex things — new pages, new Fastify routes, debugging — it reads the relevant files first, figures out what needs to change, makes the edits, and verifies. the conversation is the commit history.
this setup is a good fit for a homelab blog. the content is technical, the context is deep, and having an agent that already knows the full stack means i spend time on ideas instead of boilerplate.
eli5
imagine hiring an assistant who can type, use your computer, and remember everything about your house. you say "write a post about how the stats page works" and they open up the right folders, write the file, save it to git, and push it live — all without you touching the keyboard. they also keep a notebook about your whole setup (which server runs what, where the keys are, how the deploy works), so you never have to re-explain things every time they show up. that's Claude Code. it's less "chatbot that gives advice" and more "assistant with hands who does the actual work."