CoWorkHQ
Booking and management for coworking spaces: conflict-free desk and room booking, QR check-in, payments and billing, on web and native mobile.
The idea
Most small coworking spaces run on a spreadsheet, a WhatsApp group and a notebook at the front desk. Rooms get double-booked, pay-per-visit members are billed by counting entries by hand, and nobody really knows how full the place is.
CoWorkHQ puts all of that in one place. Members find a desk or room, pay for it and check in at the door. Operators manage their locations, staff, events and revenue. It’s built as a marketplace, so many coworking businesses can list their spaces and customers book across all of them.
I wanted it on the web and as a real native app without writing the business logic twice. That decided the architecture: a monorepo where both clients share one API client, one set of types and one set of rules, and only the UI is platform-specific.
Tech stack
- React
- Vite
- Expo
- React Native
- TypeScript
- TanStack Query
- Tailwind CSS
- NativeWind
- Express
- Prisma
- PostgreSQL
- Supabase Auth
- Razorpay
- Turborepo
- pnpm
Scope
- A pnpm + Turborepo monorepo: Vite web app, Expo mobile app and Express API, sharing core logic and TypeScript types.
- Email/password and Google sign-in through Supabase. The API verifies the token and enforces every role and permission check itself; hiding screens is only a convenience.
- Conflict-free booking guaranteed by a PostgreSQL constraint, not a UI check. Reschedule or cancel any time before it starts.
- Razorpay payments. The slot is held for 15 minutes while someone pays, settled exactly once from the redirect, the webhook or a server-side check, and refunded automatically if it can’t be kept.
- Search and filter by location, type, seats, price, amenities and live availability for a chosen time, sorted by distance with “near me”.
- Check-in for members and a front-desk mode for staff; pay-per-visit billing counts check-ins.
- Marketplace roles: a platform admin, organisation admins, and staff with per-person permissions (front desk, spaces, events, revenue, booking for customers).
- Monthly billing statements, revenue per organisation, community events with RSVPs, and a ⌘K command palette on web.
- Mobile isn’t a port. Booking and tables are rebuilt for touch: tap an hour on a day grid instead of dragging across a week calendar.
Limitations
- Every online payment lands in one platform Razorpay account, so paying organisations out is manual.
- Spaces have no photos yet; the data model has none, so each one gets a generated plate.
- No GST invoices, no partial refunds, and no email or push notifications.
- The QR pass is a reference to show at the desk, not a door key, and mobile shows it as text rather than a QR code.
- Team and platform admin panels are web-only; mobile shows the team read-only.
- The API is written as a long-lived server but deployed serverless, so cold starts make the first requests slow.
What's next
- Automatic payouts to each organisation with Razorpay Route.
- GST-compliant invoices, receipts and partial refunds.
- Booking reminders and check-in nudges by email and push.
- Space photos through object storage, and an occupancy dashboard for operators.
- Door hardware integration, so the pass actually opens the door.
- Move the API to a long-lived host like Railway or Render to get rid of cold starts.