Work/aj-bikes-app
In daily production useAJ bikes
An entire bike workshop in one phone app. Jobs, stock, assets, revenue and online bookings. Adam opens it every morning instead of paperwork and phone calls.
- ERP a CRM
- Mobilná appka
- Sklad
- Online rezervácie
- Foto zákazky
- every day
- in the owner’s hands
- 6
- booking form languages
- 1 system
- instead of paper and phone calls

A bike workshop system that replaced paper, spreadsheets and a paid booking platform. It saves the workshop roughly €3,200 a year in software and runs in daily use.
Where the problem was
Adam repaired bikes and at the same time kept in his head who brought in what, what was due back when, how much it would cost and whether it had been paid. Some of it was on paper in the workshop, some in his head, some in messages on his phone.
When he was at lunch or under a bike, the customer could not get through. When they did get through, Adam put down his tools and went looking for a scrap of paper. And when the end of the month came and he wanted to know whether the whole thing had been worth it, he had nothing to work it out from.
What was needed
Not an “orders app”. Adam needed one place where the whole business lived. He also needed customers to be able to book for themselves, without him.
What I built
It is not just a CRM. It is the workshop’s entire operating system in one app on a phone:
- Repairs from drop-off to pickup. Every bike has a status, line items, a price and photos, and the status changes with a swipe.
- Customers and their bikes with QR codes, so a scan tells Adam instantly whose bike it is and what has already been done to it.
- Stock with goods-in, goods-out and a warning when something is running low. A part is written off automatically the moment it is used on a repair.
- Fixed assets including depreciation. Tools and machines are recorded the same way as everything else.
- Takings, profit and hourly rate. How much the business made, how much was left of it and what an hour of work brings in.
- Counter sales kept separate from repairs, but in the same figures.
- Photos and videos of repairs straight from the app, so the state a bike arrived in is documented.
- Online bookings from a live form on the website, landing straight in the system.
The booking form is a separate part that runs at a public address and comes in six languages. The customer picks a service, a date and a time. They only see the slots that are genuinely free, because the system checks it against Adam’s calendar.
What it brought
Adam runs the workshop from his phone. A customer books at midnight without waking anyone, and a confirmation arrives by e-mail with a calendar invite.
The paper in the workshop is gone. In its place Adam now has what he did not have at all before. He can say how much he made this month, how much is in progress in the workshop and what is sitting in stock.
Why it does not cost a monthly fee
This is the part most people overlook. Booking platforms and service systems usually charge tens of euros a month per user, and those fees keep running even in a month when the business has no work.
AJ Bikes runs on infrastructure that, at this size of operation, sits inside the free tiers — and that goes for the database, the hosting and the e-mail sending. Adam does not pay per user, does not pay per booking and does not pay for doing well. And should he ever want to leave, the whole system and the data are his.
On the booking platform he had been paying for, he saved a thousand euros. Add in the other tools the app replaced and it comes to three thousand two hundred euros the business kept. That is not a one-off discount but a sum that does not get spent again every following year.
Exactly the same can be done for anyone who today pays a monthly fee for a tool that does half of what they need.
Under the hood
The app is built in React and wrapped with Capacitor into a native Android application, so Adam has it on his phone like any other. Supabase and Postgres hold the data; photos and videos go to Cloudflare R2 European storage via temporary links that expire after a while.
The booking form talks to the system exclusively through server functions that include rate limiting and a bot trap, so a database error never reaches the outside. Available slots are formed by merging weekly opening hours, exceptions and busy times from Google Calendar, and if the calendar were unavailable the system falls back to its own data instead of stopping.
The database is backed up every day and the backups are verified by restoring them into a clean environment. Not “we have backups”, but we know we can restore from them. An automated check also runs every two hours to confirm the booking form is reachable.