KNKuba Nowacki
← Work

SlotFix

Public booking pages for tradespeople, with a mobile schedule and Stripe deposits. Self-hosted on Docker Compose behind Caddy, with CI on GitHub Actions.

Status
In development
Platforms
iOS · Android
Started
2026
Stack
Expo, NestJS, Next.js, Stripe
  • SlotFix screenshot 1
  • SlotFix screenshot 2
  • SlotFix screenshot 3

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.