fedorthinks
All work
Production2026

Tovayo — a free AI front desk for small businesses

An open-source AI receptionist for the small service businesses that live in messaging — salons, tutors, coaches, astrologers. It answers customers, books and reschedules real appointments, collects whatever a booking needs, and sends reminders — 24/7, in the customer's language — over a Telegram bot the owner connects in one paste. Multi-tenant, model-agnostic, hexagonal Python/FastAPI backend + Next.js dashboard, webhook-primary / polling-fallback transport, sensitive actions gated by Airlock. Free to self-host or use hosted, free, at tovayo.com.

Role
Solo — design, implementation, tests
Stack
Python · FastAPI · PostgreSQL · Next.js · Telegram Bot API · OpenRouter · Hexagonal architecture · Docker · Railway
Period
2026

Self-host in one command, or use it hosted for free at tovayo.com:

docker compose up

The problem, in one sentence

A huge number of small businesses run entirely on messaging — a salon, a tutor, a coach, an astrologer — and they lose bookings for one boring reason: they can't reply fast enough.

A customer writes "can I come tomorrow afternoon?" at 11pm. By the time the owner sees it, they've booked elsewhere. The owner is busy doing the actual work — cutting hair, teaching, reading charts — not sitting on the phone. A real receptionist costs more than the business makes; the existing CRMs are clunky and want a monthly bill for software the owner never opens.

What Tovayo does

Tovayo is an AI receptionist that lives on the channel the customer already uses — a Telegram bot the owner connects by pasting one token. From then on it:

  • Answers from the business's own services, prices, hours, and FAQ — never makes things up.
  • Books, reschedules, and cancels real appointments, with double-booking protection enforced in the database, not hoped for in a prompt.
  • Collects what the booking needs before confirming — a birth date and place for an astrologer, a goal for a coach — configured per service.
  • Sends reminders before each appointment so the no-shows stop.
  • Steps aside on command. The owner can jump into any conversation and reply as themselves; the AI goes quiet until they hand it back.
  • Speaks four languages out of the box (English, Spanish, Russian, Chinese), in the customer's own language.

It's two ways to run, both free: take the open source and run it anywhere — including commercially — or use the hosted service at tovayo.com, free and unlimited.

Where the engineering is

The interesting part isn't the chat; it's everything around it that makes the chat trustworthy.

Real bookings, not a simulated calendar. Availability is computed from each service's working hours, lead time, and buffers; the actual write is guarded by a Postgres exclusion constraint, so two customers racing for the same 14:00 slot can't both win. The assistant proposes times by calling a find_availability tool and books by calling book — it never invents a slot.

The model is hijackable, so money-shaped actions are gated. Tovayo dogfoods Airlock: cancellations, reschedules, and anything sensitive pause for the owner to approve in the dashboard before they execute. A prompt-injected or mistaken model can suggest a refund; it can't perform one on its own.

Multi-tenant and model-agnostic. One deployment serves many businesses, each with its own bot, schedule, prompt, and (optionally) its own LLM key. The model is reached through an OpenRouter-style adapter behind a LlmProvider protocol — swap the model in config, no code change.

A transport that survives reality. Telegram delivers updates two ways. Tovayo prefers webhooks (a push to the public API) and falls back to polling per bot — the same webhook_set flag partitions them, so a bot whose webhook didn't register is still served by the poller and never by both. Webhooks need a domain; polling needs nothing, so it also runs right after docker compose up on a laptop.

Built to the same standard as everything else here. Hexagonal architecture with the boundaries enforced by import-linter, dependencies injected through protocols with in-memory fakes (not mocks), Pydantic and Zod at the edges, mypy --strict and tsc clean, and a coverage gate. The backend is FastAPI; the owner dashboard is Next.js (en/es/ru/zh); auth is email or Google OAuth; it deploys to Railway as API + worker + Telegram poller + Postgres.

Why it's free and open

A receptionist shouldn't be a subscription a one-person business can't justify. The code is open so anyone can run it, read it, and trust it; the hosted version is free so the people who need it most — who don't want to touch a server — get it anyway. Conversations are stored so the assistant has context, and an owner can delete their account and every trace of their data at any time, irreversibly. The honesty is the point.