I'm editing this website from my phone right now. Not through some CMS. Not through GitHub's mobile app. I'm literally just texting a Telegram bot.
I text the bot. Claude edits the files. I refresh the preview URL and the changes are there. Instantly. Hot reload handles it.
This wasn't in my 2026 expectations. But I love it.
(Inspired by Jankees van Woezik's post, a friend who built something similar first.)
How it works
I've got a Telegram bot running on Railway. It's maybe 200 lines of TypeScript. When I send it a message, here's what happens:
- Bot pulls latest from the staging branch
- Runs Claude Code SDK with my message as the prompt
- Claude reads CLAUDE.md (has my writing style and project rules)
- Claude makes the changes (usually editing MDX files)
- Changes appear instantly in the live preview via hot reload
The whole thing takes like 30 seconds. I can be anywhere, think of a blog post idea, and just text it. "Write a post about that Railway setup we did." Done. I refresh the preview URL and it's there.
The preview runs next dev inside the same Docker container where Claude edits files. Same volume, same filesystem. When Claude saves a file, Next.js hot reload picks it up immediately. No build step, no staging deploy, nothing.
When I'm happy with the changes, I can text the bot to push to staging or just push straight to main. Or I can keep editing and iterate in the live preview first.
The Claude Code SDK part
This is the magic piece. I'm using Anthropic's Claude Code SDK, which is the same thing that powers the CLI. But instead of running it locally, it's running in a Docker container on Railway.
The SDK gives you a streaming API. You pass it a prompt, a working directory, and some options, and it just works. It has access to the same tools as the CLI: Read, Write, Edit, Grep, Glob. I limited it to just those five because I don't want it running random bash commands.
const conversation = query({
prompt: userMessage,
options: {
cwd: repoPath,
systemPrompt: {
type: "preset",
preset: "claude_code",
append: SYSTEM_PROMPT_APPEND,
},
tools: { type: "preset", preset: "claude_code" },
allowedTools: ["Read", "Edit", "Write", "Glob", "Grep"],
maxTurns: 30,
maxBudgetUsd: 5,
},
});
That append part is where I inject custom instructions. It tells Claude this is Wes's website, where the blog posts are, and to read CLAUDE.md first. That file has my writing voice, formatting rules, all of it. So the bot writes like me.
Why Railway
I needed this running somewhere cheap and reliable. Railway is perfect for this. I just love the UX and the CLI works really well.
The setup is dead simple. Dockerfile, railway.toml, push to GitHub, connect the repo in Railway, done. It rebuilds on every push to the bot's source code. The staging environment for the actual website is also on Railway, separate service.
What I'm using it for
Mostly blog posts. I'll have an idea, text it to the bot, and it writes a draft. Sometimes I give it feedback and it revises. Other times I just deploy it.
I also use it for small fixes. "Fix that typo in the about page." "Update the project list with the new thing." Stuff that would normally require me to open my laptop, pull up VSCode, make the change, commit, push. Now I just text it.
It's made me way more likely to actually publish stuff. The friction is gone. Idea to live site in under a minute if I want.
The code is on GitHub
The whole bot setup is in the repo under /bot. It's not complicated. Telegraf for the Telegram bot, Claude Code SDK for the AI part, some git commands to handle commits and pushes. That's it.
If you want to build something similar, the Claude Code SDK is the key piece. It's still early, but it works really well for this kind of thing. Headless editing, no human in the loop, just give it instructions and let it go.
I'm probably going to build more bots like this for other projects. The pattern is super reusable. Any codebase where you want to make programmatic edits, this works.