Зміст
Коротко
Ярослав (SwairIt) за півтора місяця виріс із todo-листа на FastAPI у «студію» з п'яти продуктів під одним доменом getdoday.ru — без жодного рядка React, ~76 000 рядків коду та 1200+ тестів. На Habr — розбір архітектури, вибору HTMX і граблів Telegram Mini App.
Що сталося
Під getdoday.ru живуть: todo з вебом і Mini App, кабінет репетиторів Lessio, шкільне Q&A Razbery, тренажер ПДР і гра Tap Tower. Усе — один FastAPI-моноліт з PostgreSQL, Jinja2, HTMX 2, Alpine.js і Tailwind через CDN.
Автор свідомо відмовився від React: серверний рендер, підміна фрагментів HTML через hx-swap замість JSON-API та віртуального DOM. Структура — за фічами (app/tasks/, app/pdd/), а не за шарами; спільні модулі auth, billing і бот перевикористовуються.
З граблів Mini App — чотири історії на години налагодження. themeParams з SDK ламає темну палітру на світлій темі Telegram — рішення: власна тема та явний перемикач. DNS на проді резолвив api.telegram.org у недоступну адресу — знадобився monkey-patch на кількох рівнях (socket, asyncio, httpcore). З кількох дата-центрів Telegram відповідав лише один IP. post_init у python-telegram-bot v21 через присвоєння після build() мовчки ігнорується — потрібен білдер.
Telegram Stars — модель single-merchant: гроші лише на баланс вашого бота, маркетплейс «одні платять — інші отримують» неможливий. Для кількох платних вертикалей автор ввів entitlement (pdd_pro окремо від глобального Pro).
Чому це важливо
Кейс показує, що CRUD-інтерфейси та мультипродуктовий бекенд можна зібрати без SPA-стеку. HTMX на мобільних виявився відгукуванішим за частину React-застосунків — менше серіалізації та парсингу JS. Для розробників Telegram-екосистеми стаття — чесний список продакшен-граблів, яких немає в офіційній документації.
Процес: mypy --strict, ruff, pre-commit, CI на GitHub Actions, деплой cron-poll ~60 секунд після push.
На практиці
- Для CRUD і адмінок розгляньте HTMX + серверний рендер замість SPA за замовчуванням.
- Організуйте моноліт за фічами зі спільною інфраструктурою, не копіюйте auth і billing.
- У Mini App не копіюйте themeParams навсліп — зафіксуйте власну палітру.
- На VPS перевіряйте доступність IP Telegram curl-ом; патч DNS може потребувати кількох шарів.
- Для Stars одразу закладайте single-merchant і модель прав (entitlement на продукт).
- Колбеки бібліотек задавайте через білдер, не через присвоєння після збірки.
Підсумок
Це не «HTMX проти React», а історія про те, як один розробник із Python-фокусом довів п'ять продуктів до продакшену з жорсткою типізацією та тестами. Граблі Telegram і Stars — особливо цінні. Повний розбір із цифрами — на Habr.