A marketplace platform connecting home chefs with food lovers in Singapore. Discover authentic home-cooked meals from talented local chefs and book unique dining experiences in the comfort of their homes.
Potluck is also available as native mobile apps — book a home chef on the go:
- iOS (App Store): https://apps.apple.com/app/id6759842391
- Android (Google Play): https://play.google.com/store/apps/details?id=io.potluckhub.app
Potluck solves the problem of finding authentic, home-cooked meals by connecting passionate home chefs with people who want to experience genuine local cuisine. Whether you're craving Peranakan, Malay, Japanese, Korean, or Indian food, Potluck lets you book a dining experience directly with a home chef in Singapore.
- Explore Chefs - Browse home chefs by cuisine type, location, ratings, and price range
- Search & Filter - Find exactly what you're looking for with real-time search and category filters
- Book Dining Experiences - Select from chef's available dates and time slots
- Chef Profiles - View detailed menus, reviews, ratings, and social media links
- Booking System - Request bookings with guest count and special dietary requirements
- HitPay Checkout - Pay by PayNow QR or credit/debit card (HitPay) — one shared checkout backend used by the website and both mobile apps, with server-side pricing (menu × guests + 4% platform fee, SGD) and signature-verified webhooks
- Chef Subscriptions (HitPay Recurring Billing) - Free, Basic (S$10/mo), Pro (S$20/mo)
and Unlimited (S$30/mo) plans, signed up on
/become-chefand auto-charged monthly by card; plus a ⭐ Featured Chef add-on (S$15/mo) for featured placement and priority in search - Self-serve Cancellation - Chefs cancel anytime at
/subscribe/manage; no refunds — benefits run to the end of the paid month, then the account returns to the Free plan and menus beyond the free limit are auto-deactivated - Chef Verification (site visit) - Every Verified badge is earned through an in-person
kitchen visit (one-time S$50 verification fee, paid by PayNow/card at
/become-chef/verification-fee); the process is public at /chef-verification - Chef Applications - Home cooks apply at
/become-chef/apply(cuisine chips, story, signature dishes) and are reviewed in the admin before the site visit - User Accounts - Email/password and Sign in with Google; sessions shared across the booking and subscription flows
- Featured & Verified Badges - Trust badges on explore cards and chef pages; featured chefs surface first, on the website and in both mobile apps
- Guest Reviews - Write and read chef reviews (shared
/api/reviewsendpoint across web, iOS and Android, with verified-booking tagging and admin moderation) - Admin CMS - Password-protected
/adminfor blog posts, categories, checkout orders, chef subscriptions, applications, verification fees, review moderation and payment settings
- Next.js 15 - React framework with App Router
- React 19 - UI library with latest features
- Tailwind CSS 4 - Utility-first CSS framework
- TypeScript - Type-safe JavaScript
- Fastify - Fast Node.js web framework
- Drizzle ORM - TypeScript ORM
- PostgreSQL - Relational database
The native iOS & Android apps live in separate repositories and are already on the App Store / Play Store. This repo contains the web, API, and shared packages only.
- Turborepo - Monorepo build system
- pnpm - Fast, disk space efficient package manager
- Coolify - Self-hosted deployment (on Hostinger, via Docker)
potluck/
├── apps/
│ ├── web/ # Next.js frontend application
│ │ ├── app/ # App Router pages
│ │ └── ...
│ └── api/ # Fastify backend API
│ ├── src/
│ │ ├── db/ # Database schema & migrations
│ │ └── routes/ # API endpoints
│ └── ...
├── packages/
│ └── shared/ # Shared types, constants, utilities
├── turbo.json # Turborepo configuration
└── package.json # Root workspace config
- Node.js >= 20.0.0
- pnpm >= 9.0.0
-
Clone the repository
git clone https://github.com/alfredang/potluck.git cd potluck -
Install dependencies
pnpm install
-
Set up environment variables
# Single example env file at the repo root covers web + API cp .env.example .env -
Configure environment variables — open
.envand set at minimum:DATABASE_URL=postgresql://user:password@host/database NEXT_PUBLIC_SITE_URL=http://localhost:3000 ADMIN_PASSWORD=choose-a-strong-password
Payment provider keys (
HITPAY_*) are optional in development — see PAYMENT-SETUP.md for the full step-by-step payment configuration guide. -
Set up the database
# Push schema to database pnpm db:push # Seed sample data (optional) pnpm db:seed
-
Start development servers
pnpm dev
This starts:
- Web app at
http://localhost:3000 - API at
http://localhost:3001
- Web app at
| Command | Description |
|---|---|
pnpm dev |
Start all apps in development mode |
pnpm build |
Build all apps for production |
pnpm lint |
Run ESLint on all packages |
pnpm typecheck |
Run TypeScript type checking |
pnpm db:push |
Push database schema changes |
pnpm db:seed |
Seed database with sample data |
pnpm db:studio |
Open Drizzle Studio |
pnpm --filter @homechef/web seed:blog |
Seed blog categories + posts |
pnpm --filter @homechef/web migrate:orders |
Create the checkout orders table (idempotent; the app also self-migrates on first checkout) |
The web app and API are self-hosted on Coolify (Docker, on Hostinger). Each app
ships with a Dockerfile; Coolify builds and deploys automatically on push to main.
- In Coolify, create an application from this Git repository for each service
(
apps/webandapps/api), using the includedDockerfile. - Configure the environment variables below in each service.
- Push to
main— Coolify rebuilds and redeploys.
Set these in each Coolify service (full list with comments in .env.example):
DATABASE_URL- PostgreSQL connection string (production uses a Coolify-hosted Postgres 17)NEXT_PUBLIC_SITE_URL- Canonical site URL (drives SEO tags and payment redirect URLs)ADMIN_PASSWORD- Access to the/adminCMS and orders dashboard- HitPay credentials (
HITPAY_API_KEY,HITPAY_SALT,HITPAY_MODE) are not env vars — they're stored encrypted in the database and managed at/admin/settings JWT_ACCESS_SECRET,JWT_REFRESH_SECRET- Auth tokens (API)
The production payment setup (HitPay account, API key/salt, sandbox testing,
go-live checklist) is documented step-by-step in
PAYMENT-SETUP.md. All three platforms — web, iOS, and
Android — share the same checkout endpoints (/api/checkout), so payments are
configured once for everything. HitPay is the only payment provider — Stripe/
PayPal checkout was removed in Aug 2026 — and powers three payment types:
- One-time booking checkout (
/api/checkout, PayNow QR + card) - Recurring chef subscriptions (
/api/subscribe, card — Basic/Pro/Unlimited- the Featured Chef add-on), cancellable at
/subscribe/manage
- the Featured Chef add-on), cancellable at
- One-time S$50 chef verification fee (
/api/verification-fee, PayNow QR + card)
- Provision a PostgreSQL database (any provider, or self-hosted).
- Copy the connection string to
DATABASE_URL. - Run
pnpm db:pushto create tables (the checkoutorderstable also self-creates on first use).
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
