Side project · 2026v1 · live
Photo Portfolio Platform
Multi-tenant SaaS where each photographer gets their own domain and a full website that they manage entirely by chatting with a Telegram bot — uploads, captions, layout, copy, even DNS, all in plain language.
Architecture
Fig. 1 — the bot is the only write path; the website is read-only output.
The interesting decision
The bot isn't a chat-UI on top of a CMS — it is the CMS. Every CMS operation has to be a tool the model can call: upload_photo, set_caption, reorder_gallery, set_theme_color, bind_domain. The non-obvious part was the DNS flow: photographers don't know what an A record is, so the bot walks them through it conversationally and the backend polls for propagation. Caddy's on-demand TLS gates on a /photographers/exists endpoint so we don't get cert-flooded by random domains pointed at our IP.
Choosing raw psycopg3 over an ORM mattered more than it sounds — multi-tenant queries need a WHERE photographer_id = $1 on every read, and I wanted that visible in every query rather than buried in a session scope. A small helper wraps the cursor so it's almost as ergonomic, without the magic.
What I'd do differently
The tool-use loop ran wide before it ran deep — I shipped 14 tools and only later realised the bot would have been sharper with 6 well-designed ones plus a fuzzy propose_change(intent) meta-tool that lets the model sketch a plan first. I'd also have built the eval harness before the second tool, not after the tenth.