Skip to content
← All projects

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.