Petank Mini App: vibecoding a club to production
Taking vibecoding to production: a club Mini App with autotests, race-condition guards and 152-FZ compliance, live inside Telegram.
2026
rafl.digital is my studio for sports vibecoding — products for sport and club life that I build myself and take all the way to real production. The first of them is the Petank Mini App for a Moscow pétanque club: an app inside Telegram that walks a player through the whole cycle — find a game, sign up as a team, pay, get a QR ticket, see the bracket, and come back for the next game.
A club running sign-ups and payments by hand
The club ran sign-ups for its weekly games in Telegram chats and reconciled payments by hand. With fifteen-plus teams per game that turns into a mess: who signed up, who dropped out, who paid — all of it held together by one organiser's attention. That scheme doesn't scale, and it barely keeps players between games — you play, and until next time you don't think about the club.

The task was to build a product ready for live users and for Russian regulation. Under Federal Law 152-FZ, players' personal data — phone numbers, emails — has to sit on infrastructure inside Russia, and that was designed into the architecture from day one. Vibecoding, for me, is the way to walk from idea to production alone, without assembling a team for an MVP.
How the app is built
The whole app is written in one language — TypeScript: the frontend, the server logic, the Telegram bots and the database schema. For solo development that's the thing that pays off — no switching between technologies, types reused from the database all the way to the button. The stack is Next.js 15, PostgreSQL, Drizzle, two grammY bots, all infrastructure in Yandex Cloud under Docker Compose.
Two bots from one image
The app has two Telegram bots — that's how a platform rule gets around. Telegram won't let a bot message a user in private until the user has pressed "start" on that exact bot, so the user-facing @petankclub_bot holds everything visible: the app button, payment, pushes. The admin @petankregistration_bot lives in a working group with "Confirm / Reject" cards. Both are one Docker image; the role is chosen by a BOT_ROLE variable — the token gives the identity, the role gives the behaviour.
Reliability over beauty
The reply to a user never depends on whether the bot is alive that second: signed up means signed up, and the notification catches up through the notifications_outbox bus. The race for the last spot is settled by a row lock on the event in the database — two simultaneous requests queue up at the DB level. Notifications are committed in the same transaction as their trigger, so a phantom "New registration" card never appears on a rollback.

- Team sign-up in two taps: the system tracks spots, the "one player, one team" rule and the waiting list
- Online payment inside Telegram with a 54-FZ receipt, plus one-tap admin confirmation of SBP transfers
- Tournament bracket — generated an hour before the game and updated live on tournament day
- Retention mechanics: auto-reminders, a personal schedule, and a "pétanque vs AI" mini-game with a leaderboard
Can you build a production app with vibecoding?
Yes — the Petank Mini App was built with vibecoding and runs in production with 152-FZ compliance and 400+ autotests. Vibecoding speeds up the path from idea to a working screen, but what makes a product production-grade is the stuff only visible on live users: guarding the race for a spot, a notification bus with retries, an idempotent tournament scheduler, rolling back a bad deploy on a failed smoke check. That's engineering discipline on top of speed — and rafl.digital builds products exactly that way.

What production taught
The most valuable thing in a production story is the rake you step on. Cloud billing once quietly stopped the machines: the account was on a trial plan showing "0 ₽ due", and nobody was tracking spend. When the starter grant burned out, the cloud shut the VM down — the public IP went to another customer, and for a week the domain pointed at someone else's server. Cured with a static IP, a move to self-hosted Postgres, and balance alerts. The "add to calendar" button was rewritten three times — iOS, Safari and the Telegram wrapper each broke a trivial .ics file in their own way.
What is vibecoding, in plain words?
Vibecoding is development in tandem with an AI assistant: the human sets intent and architecture, the AI writes and edits the code under their control. The speed comes from routine coding going to the AI, while decisions about architecture and quality stay with the engineer.
How does the Petank Club app work?
The Petank Mini App lives inside Telegram and takes a player from sign-up to tournament: team, payment, QR ticket, bracket. Technically it's Next.js 15, PostgreSQL and two grammY bots in one Docker image, with infrastructure in Yandex Cloud. Built at rafl.digital, a sports vibecoding studio.
What is the rafl.digital studio?
rafl.digital is Igor Selenov's sports vibecoding studio. Products for sport and club life are built with vibecoding and taken to real production — the first was the Petank Mini App for a Moscow pétanque club. It's part of the RAFL ecosystem alongside the production studio rafl.studio.
How is 152-FZ handled in the app?
152-FZ compliance was designed into the Petank Mini App from day one. Infrastructure — the database and files — sits in Russia's Yandex Cloud, and personal data never leaves the country. External analytics get only anonymised events — email and phone never reach them, guaranteed at the type level.
Why does the app run inside Telegram?
The Petank Mini App lives inside Telegram: the club's audience is already there, and no separate install or sign-up is needed. A player opens it from a bot button, and the whole path — sign-up, payment, ticket — stays in one messenger. For a club product that removes the main barrier to entry.
Other projects
Content Strategy for Forbes Club
Bringing order to a strong media brand's content: a short outside engagement gave Forbes Club a content-marketing strategy and the marketing team to run it.
Aesthetics of Russian Football: built from scratch
Russian football as visual culture — a media outlet, a studio and a creator community, all launched from scratch with no outside money.
Yandex Go for Business: media, not a corporate channel
Small business doesn't trust ads — it trusts stories. So 'Yandex Go for Business' was rebuilt from a corporate channel into a media outlet: editorial team, real business scenarios, and Zaurych.