All work

Built while running the café

M80 Esports café app

A counter app for Mobil80’s gaming café, to replace hand-written session times and bills and keep customer records.

Role
Sole Flutter developer
When
Nov 2024 – Feb 2025
Status
Never launched
Platforms
Android
Built with
Flutter, Riverpod, Cloud Firestore, AWS Amplify, Amazon Cognito

In October 2024 I started managing M80 Esports, Mobil80’s gaming café in Vidyaranyapura, Bengaluru. By November I was writing an app for it.

Inside the M80 Esports café. A row of gaming PCs on pink LED-lit desks with players seen from behind, two racing-simulator rigs with steering wheels and bucket seats on the right, and the M80 Esports neon sign on the wall.

Why I built it

Customers would walk in, sit at any free device and start playing without telling anyone. I wrote down start and end times by hand and worked out the bill from the duration.

The rate depended on the device. A PC, a PS5 on the TV or the projector and the racing simulators were all priced differently, and people moved between them in the same visit. Snacks and drinks went on top. Some of those bills ended in arguments.

Then a console was stolen, and there were no customer details to work out who took it.

What it does

It’s one Flutter app for staff and customers. Customers sign in with their phone number and an OTP and see which devices are free.

For staff, each device card shows whether it’s free and, if it isn’t, how long the session has run and what it costs so far. Staff search for a customer by name or number, put them on a device and start the session. Ending it writes the time and cost to the bill.

The bill shows play cost, snacks and drinks, an extra-player charge, any discount and the customer’s previous balance. Staff can take payment split between cash and bank, mark it pay later, or put it on credit if the customer has enough tier points (one per hour played). A pending-bills screen settles several unpaid bills for one customer at once, and an income screen shows each day’s cash, bank and total.

Staff can add a customer at the counter with a name and phone number, and when that person later signs in with the same number, the app links them to the same record. That was my answer to the stolen console. Nobody can be put on a device without a record and a phone number, and staff can block a customer and note the reason.

How it works

Pricing

Each device type (PC, TV, projector, racing simulator, Nintendo, Meta) has its own hourly price points, and on most of them each extra hour costs less than the one before. Inside an hour the cost scales between that hour’s price and the next, so a 75-minute session isn’t charged as two full hours. PCs also have a cap for very long sessions.

Switching devices

Each customer has a wallet balance, and a negative balance means they owe money. If staff add someone who is already playing in a group on another device, the app charges their share of the time so far to their wallet and takes them off the old bill. If they were playing alone, staff end that session first, and pay later moves the amount into the wallet. The final bill shows the previous balance, so a PC session and a PS5 session at different rates still end up as one payment.

Stock

Snacks and drinks come out of stock when they’re added to an open bill. If staff change a quantity later, only the difference is applied, so editing a bill doesn’t count an item twice.

Data

The first version, in November 2024, read its data from an AWS AppSync API. In December I started moving the data to Firestore and kept phone OTP sign-in on Amazon Cognito through Amplify. I used Riverpod for state. Play time comes from the start time saved on the device record, not a timer on the phone, so a session survives an app restart.

What didn’t get built

I had planned seat booking for customers. The Book button only shows a “coming soon” message, and the price list page is empty.

Where it is now

In February 2025 I moved into development at Mobil80 and started working on live client projects. The café app stopped partway through a refactor into feature folders, and it never launched.

I rewrote big parts of it along the way. Three of the seven commits are checkpoints I took before a rewrite, and the last month of work was never committed.