BarberShop is a marketplace platform that connects customers looking for a barber, salon or spa with service providers running those establishments.
This repository is a monorepo containing every part of the product:
barbershop/
├── apps/
│ ├── mobile/ React Native app (Expo SDK 54) — customers *and* providers
│ └── web/ The marketing site and knowledge base — Vite + React
├── services/
│ └── api/ Django + DRF REST API
├── docs/ Architecture notes, ADRs, development and migration guides
└── .github/ CI workflows
BarberShop used to ship two React Native apps — one for customers, one for service providers. That was confusing: two downloads, two logins, two sets of bugs, two brands. There is now a single app that adapts to who you are. A user picks their role at sign-up and the navigation, dashboard and data all reshape around it.
| Path | What it is | Stack |
|---|---|---|
apps/mobile |
The mobile app for customers and service providers | Expo SDK 54 · RN 0.81 · expo-router · TS |
apps/web |
The public marketing site and knowledge base | Vite · React · TypeScript · Vitest |
services/api |
REST API, business logic, geospatial barber search, payments | Django 5.2 · DRF · PostGIS · PostgreSQL |
docs |
Architecture decisions, API usage, development and migration | Markdown |
Each has its own README with the setup steps and the conventions that are easy to
get wrong: services/api ·
apps/mobile · apps/web.
Start with services/api/README.md if you have never run this before — the
PostGIS prerequisite fails in a way that does not mention PostGIS.
Everything is driven by a small set of make targets. Run make help to see them all.
git clone https://github.com/Irfanwani/barbershop.git
cd barbershop
make setup # install backend, app and website dependencies
make dev-api # run the Django API on http://127.0.0.1:8000
make dev-app # run the Expo app on your simulator/device
make dev-web # serve the marketing site on :4173
make lint # ruff + eslint, all three services
make typecheck # mypy + tsc, all three services
make test # every test suitemake lint and make typecheck cover the backend, the app and the website.
CI runs the same set, so a green local run means the same thing a green CI run
means.
Detailed, per-service instructions live in docs/DEVELOPMENT.md.
Backend — Django 5.2 · Django REST Framework · django-rest-knox · PostGIS · PostgreSQL · Razorpay · Gunicorn · WhiteNoise · drf-spectacular
Mobile — Expo SDK 54 · React Native 0.81 · expo-router · TypeScript · TanStack Query · Zustand · NativeWind · expo-secure-store
Website — Vite and React, with a searchable knowledge base covering the whole product step. Deployable to anything that serves files.
Every push runs ci.yml, which will:
- lint and typecheck the API with ruff and mypy
- run the pytest suite against a throwaway PostGIS database
- typecheck, lint and test the app with tsc, eslint and Jest, then bundle it for iOS, Android and web — a missing asset only shows up otherwise
- test the site and check every asset it references is actually served
- generate the OpenAPI schema and fail if the committed copy is stale
This platform was three separate repositories until 2026. They are archived and read-only; their history and issues are intact.
| Repository | Now |
|---|---|
servicebarbershop |
The app, and the source of the branding. |
barbershopui |
The separate provider app. |
barbershopbackend |
The backend; its git history is preserved in services/api. |
Moving production data across is covered in
docs/MIGRATION.md. The migration is one-way by design —
the legacy schema stored post-commission prices and had no booking lifecycle,
so there is no faithful way to write it back.
Please read CONTRIBUTING.md. Commits follow
Conventional Commits.
MIT © Irfan Wani