SlotFix gives tradespeople a public booking page and a schedule on their phone. Customers book a slot, pay a deposit, and the job appears in the app. It is in development.
Two surfaces, one backend
The booking page is a Next.js site that customers open from a link. The schedule is an Expo app for the tradesperson. Both talk to the same NestJS API, so a booking made on the web shows up on the phone straight away.
Deposits with Stripe, and the in-app purchase question
A deposit protects a tradesperson from no-shows. Customers pay it with Stripe on the booking page. Apple's in-app purchase rules were a real question here, since SlotFix also has a mobile app, so I wrote the decision down as an ADR: what is sold, who pays, where the payment happens, and why that fits the rules.
Self-hosted
The whole stack runs on Docker Compose behind Caddy, which handles HTTPS certificates. It is one server I can read end to end, with predictable cost for a product that has to stay cheap for small businesses.
CI
GitHub Actions runs lint, type checks and tests on every push, and builds the images that get deployed. A change reaches the server the same way every time.
Why the booking page is on the web
A customer booking a plumber once will not install an app to do it. The booking page has to open from a text message or a Google listing and work on any phone, so it is a website. The tradesperson uses the app every day, so they get the native schedule, push notifications for new bookings and a view that works offline on site.
Splitting it this way also keeps payments out of the app, which is the other half of the in-app purchase decision.
Where it stands
SlotFix is in development for iOS and Android. It moves to “In review” once it is submitted.


