Case study · 2026

A rooftop cinema that takes bookings without box-office staff

DARK is a 24-seat rooftop cinema. We built an app that opens right inside Telegram (a Telegram Mini App), a website and a bot so guests book without messaging the venue: they choose a night and seats, decide which seats come with a thermos of something hot, get a ticket with a booking code and, if plans change, cancel the booking themselves. The cinema is fictional; the product is real and running.

Client
DARK, a rooftop cinema
Format
Telegram Mini App, website, bot
Languages
Russian, English
Status
Showcase project: the cinema is fictional, the product is live
DARK

What the cinema gets

The owners don’t have to answer questions about free seats, write bookings in a notebook or work out from messages how many thermoses of something hot to brew for a screening.

0
messages to the owners to book seats
1
booking for a group of up to six, with a thermos only for those who want one
0
seats sold twice: the database won’t accept a second booking for a taken seat

the site and the app show the same number of free seats: it comes from one database

01 / The problem

Bookings by direct message take time and mix up seats

At a small venue, bookings usually come in by direct message: a guest writes, one of the owners checks a notebook and replies. Each booking takes several messages: which night, how many seats, where to sit, whether a thermos is needed.

If two people answer the messages, the same seat can end up promised to two guests. A cancellation sent by message is easy to miss, and the seat stays empty all evening. Thermoses are counted from memory, so more or fewer get brewed than were ordered.

With the app, guests book and cancel seats on their own, and the owners only have to meet people at the door.

02 / How booking works

Guests get from the programme to a ticket on their own

An example: a guest books two seats for Thursday, adds a thermos to one of them and gets a ticket with a booking code.

02 / How booking works01 / 04

The guest sees how many seats are left at each screening

The app opens right inside Telegram with no sign-up: Telegram already knows who is booking. The programme shows the film, the date, a start time worked out from when it gets dark and the number of free seats. Nobody has to ask or answer whether seats are left.

Programme

Khersonskaya 14 · the roof

season is on
22:10Thu 27 August

Wings of Desire

1987 · West Germany · Wim Wenders · 128 min

The angels in this film sit on rooftops and listen to what people below are thinking. We open every season with it, out of professional courtesy.

20 seats left

22:10Fri 28 August

Piter FM

2006 · Russia · Oksana Bychkova · 84 min

A film about losing a phone in this city and finding a person instead. The courtyard below looks much as it does on screen.

the whole roof is free

03 / What the business gets

What the cinema stops doing by hand

Guests book without sending the owners a single message

The number of free seats is on the site and in the app, and the way up to the roof is on the ticket. The owners don’t have to answer “any seats on Friday?” or “how do I find you?”

One seat never goes to two guests

The database won’t accept a second booking for a taken seat, even if two people tap “Take” at the same moment. Nobody has to sort out at the door whose seat it is.

Guests cancel on their own, and the seats go straight back on sale

A booking can be cancelled with a button on the ticket until the screening starts. The seats go back on sale with no help from the owners, and another guest can take them.

Every thermos ordered is in a booking, so nobody counts them from messages

A thermos is chosen seat by seat and saved with the booking. The evening’s thermos count is kept in the database, and the ticket tells the guest their thermos will be waiting at the door.

Each screening’s start time is worked out from when it gets dark

Films on the roof start when the sun is 12° below the horizon: before that, black on the wall looks navy blue. That moment shifts every evening, so every screening’s start time is calculated in advance for the whole season from the sun’s position over the roof. The owners don’t have to work it out week by week.

Guests book in a minute

The app opens right inside Telegram, which already knows who is booking, so there’s no sign-up. Booking one seat takes three taps: the screening, the seat and the “Take · 900 ₽” button.

04 / Design

The app is always dark so it doesn’t dazzle neighbours on the roof

The app is always dark, even with Telegram’s light theme: guests open it on a dark roof, and a bright screen would distract their neighbours from the film.

The website is laid out like a printed programme: screenings with the number of free seats, the roof plan and the prices. The site takes the free-seat count from the same database as the app, so it’s the same in both places. Guests decide on the site whether to go, and the booking button opens the app in Telegram.

  • Before booking, the site answers the usual questions: what a seat includes, what the thermos costs, what happens if it rains and how to pay. There’s no reason to message the owners about any of it.
  • Next to each seat number the ticket says where the seat is, “by the parapet” or “by the chimney”, so guests find their seats in the dark on their own and nobody has to show them the way.
Any seat can be taken off sale for every screening: it stays on the plan in the app and on the site, but nobody can book it. At DARK, seat T1 by the chimney is closed this way: the cat sits there.

05 / Reliability

No seat can be sold twice

If two people pick the same seat at the same moment, it goes to whoever booked first, and the other is told it’s already taken.

The rule is written into the database itself: it won’t accept a second booking for the same seat and screening, even if the Telegram Mini App gets something wrong. Only cancelling the first booking frees the seat.

The database takes all the seats of one booking at once: if even one is already taken, none go through. Otherwise a group of three would get two seats and still have to message the owners about where to put the third.

The guest is told the seat has just been taken: it lights up on the plan and drops out of the selection, the other picked seats stay, and another one can be chosen straight away. If the guest taps twice, or a bad connection sends the request again, no second booking appears, so the owners never have to remove extra ones.

A group gets all the seats it picked or none of them, so it never has to be seated by hand.

06 / Scope

What the project includes

Telegram Mini App

  • Programme with the free-seat count
  • Roof plan, up to six seats at a time
  • A thermos can be added to any seat in a booking
  • Ticket with the booking code, seats, address and the way up to the roof
  • Cancellation by the guest, with the seats straight back on sale
  • “Tickets” tab: all of a guest’s bookings, upcoming, past and cancelled
  • “Getting there” tab: where the entrance is, what to bring, what happens if it rains
  • Russian and English: the language comes from Telegram’s settings and can be switched
  • Rain postponement: the owner sends the bot a command, the screening moves to the nearest free night with the same seats and codes, and the bot tells everyone with a booking

Website and bot

  • Programme with the free-seat count from the same database as the app
  • Roof plan and prices: a seat, or a seat with a thermos
  • Answers before booking: what happens if it rains, what to wear, why the sound is in headphones, how to pay
  • Booking buttons that open the app in Telegram
  • Russian and English versions
  • Bot: a greeting, a /help reply on how to find the entrance and what to bring, and a button that opens the app

Foundation

  • Next.js on Cloudflare Workers: the site, app and bot run as one service
  • Neon Postgres: the database itself won’t let a seat be sold twice
  • Each screening’s start time calculated from the sun’s position over the roof
  • Bookings tied to the Telegram account, so no sign-up or passwords

07 / Honestly

What is made up here and what the product doesn’t have yet

DARK is a showcase project: the cinema is invented to show booking at work.

The address, prices and film programme are placeholders.

There is no online payment: a showcase project has no legal entity or payment provider, so people pay on the roof. Booking needs no prepayment, and a guest who neither comes nor cancels leaves the seat empty and unpaid.

There is no admin panel for the owners: the guest list and the evening’s thermos count exist only in the database, so there’s nothing to check the code a guest gives at the door against. A developer sets up screenings, takes seats off sale and changes prices.

The bot sends no booking confirmation or screening reminder: the ticket lives only in the app. It writes to guests only when the owner postpones a screening for rain with a command in the chat with the bot.

Screenings are set up for August and September only, when the nights are already dark and the roof isn’t cold yet. The rest of the year the programme is empty and there’s nothing to book.

Need the same kind of seat booking?

This kind of booking suits any venue that sells seats for a particular evening: film screenings, concerts, talks, dinners. We’ll build booking without messages and the guarantee that no seat is sold twice the same way as here, and put the evening’s guest list in an admin panel or in Telegram. The first conversation is free: we’ll go through how you take bookings now and tell you what you actually need.