Static sites.
Run from Telegram.

No dashboards, no plugins. Send a message, the site updates.

See it happen

One bot.
Two sides.

Pick a view: what you do as the owner, or what a visitor sees.

You, in Telegram
Phoenix bot
online
📝 New post
Canal at golden hour 🌅
18:44✓✓
🎥 youtu.be/… evening walk
📍 Prinsengracht 263
✅ Live → amsterdam.krll.nl
Try tapping the buttons. The site updates for real.
Your site, live
One message per part: text, photo, video link and map pin all land in the same post.
Anna, on the site
You, in Telegram
Phoenix bot
online
🆕 Mark · Sep 8 · parking question, answered ✓
🆕 Lea · Sep 10 · booked the walking tour
🆕 New booking, Anna · Sep 12 · 2 guests
«Is sunset time still free?»

✅ Confirm ✓ Confirmed
Anna fills a normal web form. No Telegram needed on her side. The request lands in your bot, you confirm in one tap.
Samples

What this can look like

Three starter layouts.

Why this stack?

No lock-in.
No subscriptions.

Your content lives in Git, your site lives on any host. You own every layer.

Opens instantly
The server just sends a file. No code runs per request, nothing to slow it down.
Nothing to break into
No database, no admin panel, no login page. Just static files. Nothing for attackers to target.
Git is the backup Git is a system that saves every version of your files, like an unlimited undo history. Nothing is ever truly lost.
Every post is a commit. History, rollback, and portability built in by default.
How it works
01
Send a message
Text, photo, video link or location in Telegram. The bot assembles them into one post.
02
The site rebuilds itself
Hugo, Astro, or any static generator turns it into plain HTML pages, in milliseconds, automatically.
03
Goes live
Straight to your own server. Your domain, your files: nothing rented, nothing locked in.

Same result. Here's the full stack underneath. Infrastructure as code, automated end to end.

01
Provision with Ansible
One playbook turns a bare VPS into production: Nginx, TLS, firewall, users. Need a second region? Re-run it elsewhere in minutes.
02
Message → commit
The Telegram bot turns each message into a structured Git commit. Git is the single source of truth: every change versioned and reversible.
03
CI/CD on every push
GitHub Actions picks up the commit: your generator builds the site, output is validated, artifacts cached. Zero manual steps.
04
Ship & stay up
Rsync ships only the diff over SSH. Nginx serves the static files directly. Add Cloudflare or any CDN in front if you want edge caching, but nothing depends on it.
How it started

A site that fits
in a chat

Someone came to me for a site they could run themselves and host for free. I had already built with Hugo, so I agreed and shaped it around what they asked for. The real decisions started later, when the site needed a calendar and a contact form.

Our own form and calendar
The ready-made route would have taken a day: one external service for the form, another for the calendar. I turned it down. Form submissions carry people's personal data, and they would have landed on someone else's servers, while the calendar wanted a subscription on top. We wrote our own: slower to start, but the data never leaves our perimeter and the bill does not grow with traffic.
Keeping it in-house
At first the site sat on free static hosting, and that was enough. The moment it needed our own form and calendar, free hosting stopped being an option: we needed a server running our own code. The second fork was whose infrastructure that would be. The more external layers, the more failures you cannot influence and rules that change without you. The VPS was already there, so everything moved onto it. The price of that choice: running the server myself, updates, TLS, firewall, monitoring. In exchange the site no longer depends on someone else's decision across the ocean.
An entrance, not a dashboard
Posts went through GitHub, and calendar edits through a separate form exposed to the internet behind a password. It worked, but it made the owner go where he did not want to go, and it kept an extra door open. I moved the entrance into Telegram. The door closed, and publishing stopped needing me: the owner sends a message from his phone and the site rebuilds itself. The system's state arrives in the same chat.
The hard part
The hardest part was not in Telegram but in git. The bot writes files as its own user, I write as mine, and that has to line up locally and on the server without breaking ownership on files that already exist. Then backups that actually restore rather than merely run, and the ability to stand the whole system up from scratch on an empty machine. That took longer than publishing posts ever did.
  • One of the sites running on this: 261 posts, around a hundred published by the bot itself.
  • One evening we moved between git hosts. The live site never noticed.
  • Running since 2022, and through Telegram since the end of 2023.

Today a setup like this is nearly a couple of clicks. That suits me: I know what sits under that button, because I built every layer by hand.

Get involved

Want it on
your site?

Try it on your site

Blog, portfolio, photo journal, same stack, your content. Tell me a bit about it and I'll help you get it running.

Get in touch