How I Built an Esoteric Mini App 100% Powered by AI Agents (and Why Tarot Bots Are Not Just About Magic)
Launched a Telegram Mini App for fortune‑telling without programming in 6 days.
Introduction I don’t know Python, JavaScript, Dockerfiles, and I can’t always tell `async` from `sync`. But I have VS Code, Copilot/Cline, product logic, and a stubborn desire to catch the wave. At the end of 2025 I launched a Telegram Mini App for divination: Tarot, numerology, compatibility by date/photo. The MVP launch took 6 days. No hiring, no courses, no lines of code written by me personally. Below is an honest breakdown of the process, fail‑fails, funny cases, and the numbers that resulted. Stack and methodology: “vibe‑coding” as a production system My “technology stack”: - Interaction language: prompts in Russian + English tech tasks for the agent - Agents: Cline (primary code generator), Copilot (completion/refactoring) - Backend: Python, aiogram 3, FastAPI, sqlite, later Google Sheets API - Infra: VPS (Ubuntu), Docker, Nginx, Let’s Encrypt, Cloudflare - Front: Telegram Mini App (HTML/JS), Vue 3 + Vite, generation via prompts - Payments: Telegram Stars, YooKassa (for web), test sandboxes How it worked: 1. I wrote a spec in the format: Role‑Task‑Expected result‑Constraints‑answer template 2. The agent generated files, I ran docker compose up , watched the logs 3. Error — copy the trace — paste it to the agent — receive a fix — repeat 4. Deploy: git push + docker compose pull && docker compose up -d This is not “no‑code”. It is “prompt‑code”. The difference in responsibility: I’m in charge of architecture, validation, and product decisions. The AI handles syntax and patterns. Architecture in 3 days (what the MVP looked like) User → Telegram Web App (Vue) → /api/v1/reading → FastAPI → AI Provider (OpenAI/Anthropic) → Cache (Redis/SQLite) → Response → UI - Input: birth date, gender, photo (optional) - Processing: prompt template → LLM → JSON parsing → HTML rendering - Delivery: inline buttons, result sharing, referral link - Payment: Stars for a one‑off spread, subscription 399₽/month for unlimited Everything was assembled in 72 hours. Another 48 hours went into polishing UX and working around Mini App bridge bugs. 5 mistakes that cost me time and money 1. I trusted the AI with async logic without understanding the event loop The agent wrote asyncio.sleep() inside a synchronous handler. The bot froze with 10+ concurrent users. The logs were silent because I hadn’t enabled aiogram logging. How I fixed it: forcibly added import logging , turned on logging.basicConfig(level=DEBUG) , asked the agent to rewrite everything with async def + a Semaphore to limit parallel LLM requests. 2. Ignoring the provider’s rate limits On launch day we got 300 requests. OpenAI returned 429 Too Many Requests. The bot started returning empty cards. How I fixed it: added a simple Redis cache for 24 h (key: hash of date + query), set up a queue on Celery (later simplified to asyncio.Queue ), hooked a fallback provider. 3. Subscription instead of one‑shot I thought, “LTV will grow with a subscription”. Users thought, “I need one reading for today”. Conversion to subscription was 1.2%, churn on day 3 was 68%. How I fixed it: switched to one‑shot via Stars, kept subscription as a “VIP mode” with extended spreads and priority generation. Conversion rose to 4.1%, retention to 14 days. 4. No disclaimer and moderation Telegram doesn’t ban esotericism, but Apple/Google require a warning about “entertainment purpose” when embedding a Mini App in a web‑view. Without it I would have been blocked trying to integrate into VK or the App Store. How I fixed it: added a mandatory checkbox “Results are for entertainment only” + a filter for prohibited topics (health, finance, suicide) via a system prompt. 5. Versioning prompts instead of code I tweaked prompts “on the fly”, not saving history. After a week I stopped understanding why the old spread gave “The Chariot” and the new one gave “The Hanged Man”. How I fixed it: extracted all prompts into .json files, added Git commits, introduced a simple /admin reload_prompts . Now each prompt has a version and A/B testing via a flag in the DB. Funny and non‑obvious moments Tarot for developers: The agent once generated a deck “IT Tarot” instead of the classic. Cards: The 404, Merge Conflict, Legacy Code, The Hotfix. Users laughed, but conversion jumped by 12%. Kept it as an Easter egg. Cat photo instead of avatar: A user uploaded a cat picture for compatibility. The LLM replied: “Your aura is felinoid. Karma indicator: 9 lives. Recommendation: don’t share food.” The screenshot went to three chats. Virality ×4. Agent spent 2 hours debugging a quote: SyntaxError: EOL while scanning string literal . I sent the trace, the agent suggested rewriting the architecture, updating dependencies, changing OS. After an hour I noticed a missing " in .env . The agent isn’t at fault—I didn’t give it the file context. A test payment that became real Forgot to switch YooKassa from sandbox to test. Made 10 “test” payments with my own card. Money was taken. Support refunded, but the sting remained. Rule #1: STARS = sandbox, FIAT = test‑mode, LIVE = only after checklist . MVP: 6 days, 0 lines of my code, ~1 200 prompts - First month: 42 300 ₽ (Stars + YooKassa), 890 active users, CAC ~0 ₽ (organic + referral) - Second month: 118 000 ₽, cache optimization, A/B prompt rollout - Third month: 154 000 ₽, stable 14‑day retention, 22 % referral sales - What didn’t work: - VK Mini App (less traffic, harder moderation) - Subscription as the primary model - Voice generation (expensive, slow, users read the text)