3–6 events a week in five places at once. A free-text message to a Telegram bot becomes branded posters (post + story), a channel post, the afisha on omhome.space, an Instagram post and a weekly letter to partners — with a ✅ on every action and edits by reply. Gemini + Playwright + Telegram + Instagram API.
OmHome runs 3–6 events a week: kirtans, films, board games, tea evenings, talks, practices. Each one lives in five places at once — the @omhome_thai channel, Instagram (a post and a story), the afisha on omhome.space, friendly chats, and direct messages to partners who repost. It used to be the same manual work every time: duplicate the Figma layout, drop in a photo, fit the title, export two frames (post and story), rewrite the caption for each platform and send it five times. Something slipped regularly: the story never got posted, the event was missing from the site, the chats got the announcement late.
Now an announcement is one message to a bot from a phone, written the way you'd write to a friend.
"On Thursday at six Dasha is running mantra yoga, her Instagram is au_darya, Saturday is the usual kirtan, Sunday at five we play Hat, sign-ups with @Wasyaphi" — that's enough. Gemini turns it into structure (date, time, title, subtitle, description), prints how it understood it, and from there everything follows the normal path. When Gemini is overloaded, a fallback Llama on Cloudflare takes over. If a recurring event has no description at all ("Saturday is the usual kirtan"), the stored kirtan description is used.
Telegram handles in the text become t.me/... on Instagram so no random person gets tagged; a note like "her Instagram is au_darya" becomes an @au_darya mention — but only on Instagram, never in the channel or on the site.
The Figma posters moved into an HTML template rendered by Playwright: the same arch with a photograph, the waves in the background, the golden sparkles and the typography. Two formats at once — 1080×1350 for the post and 1080×1920 for the story, with a footer reading "omhome.space · Telegram: t.me/omhome_thai". The title is fitted to one line, and the format ("film screening", "board game", "talk") sits above it in small type.
Colour is fixed per event type, sampled from the original posters: kirtan — deep green, cinema — ocean, games — midnight blue, practices — sea, tea — olive, talks — brown. So the channel feed reads as one series rather than a pile of unrelated images.
The photo is chosen in this order: the one attached to the message → the next one in line from the category folder (history in history.json, so the same shot doesn't repeat back to back) → if there's nothing, Gemini writes a scene for the event and FLUX on Cloudflare Workers AI draws it. Several dates for one event make one poster with a range — "26/10 to 01/11" — and one post.
With --send every action is its own question in the chat with the bot: the channel post, the site update, the Instagram post, the repost into each chat, the letter to a partner. The preview arrives with the image and the caption and two buttons — "✅ Publish" / "❌ No, fix it" — so it can be approved from a phone. No answer within six hours means no.
On ❌ the bot asks: "What should I fix?" Reply in plain words — "19:30", "subtitle: with Sasha", "shorten the description" — or just send a photo: Gemini applies the edit, the poster, the caption and the site entry are rebuilt, and the preview comes again. "🗑 Cancel" removes the event everywhere, the site included. If publishing fails, the chat gets the reason, not just "exited with code 1".
Once approved, the bot commits events.json and the fresh posters to GitHub itself — Vercel rebuilds omhome.space and the "Upcoming events" block shows the same posters as the channel. Instagram runs after the site: the API downloads the image from a URL, so the poster must already be online, and the bot waits for exactly that version of it to appear. After the post it sends a reminder with the link — to share it to a story.
Friendly chats and partners don't get one message per event but one letter a week: a warm first-person opening, a lively paragraph about the week's main event with its poster, and below it "Also this week:" — the rest as a list, each linking to its own post in the channel. The bot remembers that link at the moment of publishing. A bot can't message a person first, so the letter goes from my own account through Telethon — with a different greeting each time, never the same one twice in a row.
The bot runs on Railway and pulls a fresh main before each announcement, so code changes land without a redeploy.
The product and the code entirely: the poster template, announcement parsing, integrations with Telegram, Instagram, GitHub and Telethon, approval with buttons, the weekly digest. 2026. This is OmHome's back office — and the same approach is what I offer businesses as process automation.