Follow a single request through the platform we've built — from the apps in your hand, through one secure gateway, into the microservices and the vendors behind each one.
Two first-class apps share one backend. A request begins here — a tap to book, to pay, or to search — carrying a signed login from Firebase.
Dark-mode web app: sign up with email or Google, discover with AI-powered natural-language search, onboard payouts via Stripe Connect, book, and post to the social feed.
Native iOS (17+) with 80+ screens: discovery, booking, the artist calendar, place-owner tools, real-time messaging, and push notifications.
Before any application code runs, the request hits our gateway. It checks the Firebase login against the Identity service and stamps each request with a trusted internal user — so every service downstream can simply trust who's asking.
A self-hosted Caddy instance is the single front door for the whole platform. It routes traffic to the right service and enforces authentication once, at the edge — no third-party vendor sits in this path.
From the gateway, the request reaches one of our services. Each owns a single job and its own data, and each leans on a focused set of dependencies — shown on every card below.
The canonical record of who every user is, and the security checkpoint for the system. It verifies the Firebase login the gateway hands it and maps it to a trusted internal identity, provisioning new users just in time.
The heart of the product: salons and rentable spaces, artist profiles with services and pricing, the full appointment lifecycle, availability, reviews, and the social feed. It also powers natural-language space search and publishes events to the rest of the system.
All money movement runs through here. Stripe Connect onboarding gets place owners and artists paid directly, appointment charges pre-authorize and capture, and rent billing settles on a schedule — with every Stripe webhook verified.
Keeps everyone in the loop in real time. It consumes events off the bus, streams live updates to connected apps over WebSocket, and fires mobile push notifications that deep-link straight to the right booking or chat.
Real-time chat between clients, artists, and place owners — with typing indicators, read receipts, and access control so people can only message through handles their organization owns. No third-party vendor is involved; it runs on our own real-time stack.
Transactional email and preferences — welcome messages, organization invitations, and availability reminders — driven off the same event bus, with per-user subscription controls and one-click unsubscribe.
Seven commercial vendors handle the hard, undifferentiated problems — so our engineering stays focused on the marketplace itself. Everything else (the gateway, the data layer, ticketing) we run ourselves.
Services never reach into each other's databases. Each owns its own schema, and they coordinate by passing events over a stream — so payments, notifications, and email stay decoupled and scale on their own.
One managed database with an isolated schema per service, so each team owns its data with clean boundaries.
The backbone that carries events between services and powers live WebSocket channels for notifications and chat.
The entire platform runs on Render, deploying automatically from Git with separate staging and production environments.