Dehradun's home services platform β book a verified professional in under a minute.
Live site Β· API docs Β· Report an issue
Helpet connects households in Dehradun with vetted professionals for cleaning, plumbing, electrical work, AC repair, carpentry and 120+ other services. Customers browse a curated catalogue, pick a slot, and pay after the job is done. Admins run the whole catalogue, booking pipeline and payment ledger from a built-in dashboard.
This repository is the full product: a Next.js 16 storefront and admin panel, a FastAPI REST backend, and a PostgreSQL database.
![]() |
![]() |
| Catalogue β every category, searchable | Service detail β options, pricing, what's included |
Booking β 7-day slot picker, geolocated address, and a running total that already includes the platform fee
![]() |
![]() |
![]() |
| Mobile-first throughout β the same flows at 390Β px | ||
| Feature | What it does |
|---|---|
| π Passwordless-first auth | Email OTP login via Resend, JWT sessions, and password reset β with role-based access for customers, providers and admins |
| π Deep service catalogue | Categories β services β sub-services, each with its own pricing, discount and platform fee, reorderable by drag-and-drop |
| π Real booking flow | 7-day slot picker that hides past times, one-tap address fill from device geolocation, and notes per booking |
| πΈ Transparent pricing | Platform fee computed server-side and folded into the booking total, so the quote a customer sees is the amount that is recorded |
| β Reviews & notifications | Ratings gated on completed bookings the reviewer actually owns, one per booking, plus an in-app notification feed |
| π Admin dashboard | Manage users, services, categories, bookings and payments with pagination and status controls |
| πΌ Runtime OG images | Every page renders its own 1200Γ630 social/search thumbnail via next/og, using the real service photo when one exists |
| π SEO built in | JSON-LD (LocalBusiness, Organization, WebSite, Breadcrumb, Service), dynamic sitemap with image extensions, and robots.txt |
flowchart TB
subgraph client["Client"]
UI["Next.js 16 Β· App Router<br/>React 19 Β· Tailwind v4"]
end
subgraph vercel["Vercel"]
RSC["Server Components Β· ISR<br/>sitemap Β· robots Β· OG images"]
end
subgraph backend["FastAPI Β· /api/v1"]
AUTH["Auth<br/>JWT + OTP"]
CORE["Services Β· Bookings<br/>Payments Β· Reviews"]
ADMIN["Admin<br/>stats Β· moderation"]
end
subgraph data["Data & Providers"]
PG[("PostgreSQL<br/>Supabase")]
CLOUD["Cloudinary<br/>image CDN"]
MAIL["Resend<br/>transactional email"]
end
UI --> RSC
RSC -->|"REST"| CORE
UI -->|"REST Β· axios"| AUTH
UI -->|"REST Β· axios"| CORE
UI -->|"REST Β· axios"| ADMIN
AUTH --> PG
CORE --> PG
ADMIN --> PG
AUTH --> MAIL
CORE --> CLOUD
| Layer | Choice |
|---|---|
| Frontend | Next.js 16 (App Router, Turbopack), React 19, TypeScript 5 |
| Styling | Tailwind CSS v4, Framer Motion, Lucide icons |
| Backend | FastAPI, SQLAlchemy, Alembic, Pydantic v2 |
| Database | PostgreSQL (Supabase) |
| Auth | JWT (python-jose), bcrypt via passlib, email OTP |
| Media | Cloudinary, with f_auto,q_auto transforms applied at request time |
| Resend | |
| Analytics | Microsoft Clarity |
| Hosting | Vercel (frontend) Β· containerised FastAPI (backend) |
Prerequisites β Node 20+, Python 3.13, and a PostgreSQL database.
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# create backend/.env β see "Environment variables" below
alembic upgrade head
python seed.py # optional: loads demo catalogue + users
uvicorn app.main:app --reloadAPI runs at http://localhost:8000 β interactive docs at /docs, ReDoc at /redoc.
cd frontend
npm install
# create frontend/.env.local β see "Environment variables" below
npm run devApp runs at http://localhost:3000.
Environment variables
backend/.env
| Variable | Required | Notes |
|---|---|---|
DATABASE_URL |
β | PostgreSQL connection string |
SECRET_KEY |
β | JWT signing secret |
APP_NAME |
β | Defaults to Helpet |
DEBUG |
β | Defaults to true |
ACCESS_TOKEN_EXPIRE_MINUTES |
β | Defaults to 20160 (14 days) |
RESEND_API_KEY |
β | Omit in development β OTPs print to the console |
RESEND_FROM_EMAIL |
β | Defaults to the Resend onboarding sender |
CLOUDINARY_CLOUD_NAME |
β | Required only for image uploads |
CLOUDINARY_API_KEY |
β | Required only for image uploads |
CLOUDINARY_API_SECRET |
β | Required only for image uploads |
FRONTEND_URL |
β | Extra CORS origins, comma-separated |
frontend/.env.local
| Variable | Required | Notes |
|---|---|---|
NEXT_PUBLIC_API_URL |
β | e.g. http://localhost:8000/api/v1 |
NEXT_PUBLIC_APP_URL |
β | Canonical site URL β drives metadataBase, sitemap and JSON-LD |
NEXT_PUBLIC_CLARITY_ID |
β | Analytics; omitted in development |
API reference
All routes are prefixed with /api/v1.
Auth β /auth
| Method | Path | Description |
|---|---|---|
POST |
/register |
Create an account |
POST |
/login |
Password login β JWT |
GET |
/me |
Current user from token |
POST |
/otp/send |
Send a one-time code |
POST |
/otp/verify-login |
Exchange OTP for JWT |
POST |
/otp/verify-email |
Confirm email ownership |
POST |
/password-reset/request Β· /password-reset/confirm |
Reset flow |
Services β /services
| Method | Path | Description |
|---|---|---|
GET |
/categories Β· / Β· /{id} |
Public catalogue reads |
POST PUT DELETE |
/categories, /, /{id} |
Admin catalogue writes |
PUT |
/categories/reorder Β· /reorder |
Persist drag-and-drop order |
POST PUT DELETE |
/{id}/sub-services/β¦ |
Manage sub-services |
Bookings β /bookings
| Method | Path | Description |
|---|---|---|
POST |
/ |
Create a booking (server computes the platform fee) |
GET |
/my Β· /{id} |
Customer's bookings |
PUT DELETE |
/{id} |
Update or cancel |
GET |
/ |
All bookings (admin) |
Payments β /payments Β· Reviews β /reviews Β· Notifications β /notifications
| Method | Path | Description |
|---|---|---|
POST |
/payments/offline |
Confirm a COD/UPI booking |
GET |
/payments/my Β· /payments/{id} |
Payment history |
POST |
/reviews/ |
Review a completed booking |
GET |
/reviews/my Β· /reviews/provider/{id} |
Read reviews |
GET PUT |
/notifications/my Β· /{id}/read Β· /read-all |
Notification feed |
Admin β /admin
| Method | Path | Description |
|---|---|---|
GET |
/stats |
Dashboard counters |
GET PUT DELETE |
/users⦠|
Paginated users, status and role changes |
GET PUT |
/bookings⦠· /payments⦠|
Paginated pipelines with status updates |
Helpet/
βββ backend/
β βββ app/
β β βββ api/v1/endpoints/ # auth Β· services Β· bookings Β· payments Β· reviews Β· admin
β β βββ core/ # config Β· security Β· email Β· dependencies
β β βββ db/ # engine Β· session Β· base
β β βββ models/ # SQLAlchemy tables
β β βββ schemas/ # Pydantic request/response contracts
β β βββ services/ # auth Β· booking Β· notification Β· storage
β βββ alembic/versions/ # migrations
β βββ tests/ # pytest suite
β βββ seed.py # demo data
β
βββ frontend/
βββ src/app/
β βββ (public pages) # home Β· categories Β· services Β· book Β· payment
β βββ admin/ # dashboard Β· users Β· services Β· bookings Β· payments
β βββ opengraph-image.tsx # runtime social/search thumbnails
β βββ sitemap.ts # dynamic sitemap with image extensions
β βββ robots.ts
βββ src/components/ # shared UI
βββ src/lib/ # api client Β· og-image Β· seo-data Β· image resolver
The backend ships a pytest suite covering auth, services, bookings, payments, reviews, notifications and admin routes. Tests run against a dedicated helpet_test database β created and torn down per session, never your development data.
cd backend
source .venv/bin/activate
pytestThe frontend deploys to Vercel, wired to this repository β every pull request gets its own preview deployment, and merges to master ship to production. The backend runs as a container (Dockerfile + start.sh), applying migrations on boot before serving with Gunicorn/Uvicorn workers.
No open-source licence is granted. Β© Helpet India β all rights reserved.
Built in Dehradun, Uttarakhand π






