Skip to content
alfredangPublic

Repository files navigation

Potluck

Next.js React TypeScript Tailwind CSS PostgreSQL Payments Coolify App Store Play Store

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.

Live Demo

https://potluckhub.io

Potluck — home screen

Get the App

Potluck is also available as native mobile apps — book a home chef on the go:

Download on the App Store Get it on Google Play

About

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.

Key Features

  • 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-chef and 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/reviews endpoint across web, iOS and Android, with verified-booking tagging and admin moderation)
  • Admin CMS - Password-protected /admin for blog posts, categories, checkout orders, chef subscriptions, applications, verification fees, review moderation and payment settings

Tech Stack

Frontend

Backend

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.

Infrastructure

  • Turborepo - Monorepo build system
  • pnpm - Fast, disk space efficient package manager
  • Coolify - Self-hosted deployment (on Hostinger, via Docker)

Project Structure

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

Getting Started

Prerequisites

  • Node.js >= 20.0.0
  • pnpm >= 9.0.0

Installation

  1. Clone the repository

    git clone https://github.com/alfredang/potluck.git
    cd potluck
  2. Install dependencies

    pnpm install
  3. Set up environment variables

    # Single example env file at the repo root covers web + API
    cp .env.example .env
  4. Configure environment variables — open .env and 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.

  5. Set up the database

    # Push schema to database
    pnpm db:push
    
    # Seed sample data (optional)
    pnpm db:seed
  6. Start development servers

    pnpm dev

    This starts:

    • Web app at http://localhost:3000
    • API at http://localhost:3001

Available Scripts

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)

Deployment

Deploy with Coolify

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.

  1. In Coolify, create an application from this Git repository for each service (apps/web and apps/api), using the included Dockerfile.
  2. Configure the environment variables below in each service.
  3. Push to main — Coolify rebuilds and redeploys.

Environment Variables

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 /admin CMS 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)

Payments

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
  • One-time S$50 chef verification fee (/api/verification-fee, PayNow QR + card)

Database Setup

  1. Provision a PostgreSQL database (any provider, or self-hosted).
  2. Copy the connection string to DATABASE_URL.
  3. Run pnpm db:push to create tables (the checkout orders table also self-creates on first use).

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT

Releases

Packages

Contributors

Languages