Open-source restaurant reservation management system for high-turnover, small-seat restaurants
Status: π§ Early Development - API Backend Phase
SeatKit is a modern, modular reservation management system built specifically for small restaurants (14-20 seats) with high turnover. Originally deployed as an iOS Swift app for a Japanese-Venetian restaurant in Venice, weβre rebuilding it as an open-source TypeScript web application.
node --version)pnpm --version)git clone https://github.com/seatkit/seatkit.git
cd seatkit
pnpm install
This installs all dependencies for the monorepo workspace.
The API uses Google Cloud Secret Manager in production, but for local development you have three options:
.env File (Recommended for Contributors)Create packages/api/.env manually:
# Database
DATABASE_URL=postgresql://localhost:5432/seatkit_dev
TEST_DATABASE_URL=postgresql://localhost:5432/seatkit_test
# Supabase (use local Supabase or public test instance)
SUPABASE_URL=http://localhost:54321
SUPABASE_PUBLISHABLE_KEY=your-local-key
SUPABASE_SECRET_KEY=your-local-key
The Fastify server will automatically fall back to .env if GCP authentication fails.
If you have access to the projectβs GCP account:
# Authenticate with Google Cloud
gcloud auth application-default login
# Set project ID
export GOOGLE_CLOUD_PROJECT=seatkit-dev
# Secrets will be fetched automatically on startup
pnpm dev
Note: You need IAM permissions (roles/secretmanager.secretAccessor) on the project to access secrets.
Set up your own GCP project and secrets:
cd packages/api
# Edit the script with your credentials
pnpm secrets:setup
# Then set your project ID
export GOOGLE_CLOUD_PROJECT=your-project-id
This uploads secrets to your GCP project. See SECURITY.md for details.
# Create databases
createdb seatkit_dev
createdb seatkit_test
# Run migrations
cd packages/api
pnpm db:migrate
pnpm db:migrate:test
# From root
pnpm build
This builds all TypeScript packages in dependency order.
pnpm test
# API server (port 3001)
cd packages/api
pnpm dev
Visit http://localhost:3001/health to verify the API is running.
seatkit/
βββ packages/
β βββ types/ # β
Zod schemas + TypeScript types
β βββ utils/ # β
Shared utilities (date, money, database)
β βββ api/ # π§ Fastify backend + Drizzle ORM
β βββ engine/ # π Business logic (coming soon)
β βββ ui/ # π React components (coming soon)
β βββ web/ # π Next.js frontend (coming soon)
βββ docs/ # Architecture decision records & guides
βββ .github/workflows/ # CI/CD pipelines
| Legend: β Complete | π§ In Progress | π Planned |
# Install dependencies
pnpm install
# Build all packages
pnpm build
# Run linting
pnpm lint
# Run type checking
pnpm typecheck
# Run tests
pnpm test
# Run tests in watch mode
pnpm --filter @seatkit/api test:watch
# Clean all build artifacts
pnpm clean
# Work on a specific package
cd packages/api
# Start dev server
pnpm dev
# Run migrations
pnpm db:migrate
# Open Drizzle Studio (database GUI)
pnpm db:studio
For real-time type checking during development:
# Watch all packages
pnpm typecheck:watch
# Or watch specific package
cd packages/types
pnpm typecheck:watch
See DEVELOPMENT.md for detailed development guidelines.
SeatKit uses a modern monorepo architecture with:
z.coerce.date() for unified Date objects across API/DB layersOk / Err) for type-safe error handlingSee ARCHITECTURE.md for complete technical details.
# Run all tests
pnpm test
# Run tests for specific package
pnpm --filter @seatkit/types test
pnpm --filter @seatkit/utils test
API tests require a PostgreSQL test database and use GCP Secret Manager for credentials:
cd packages/api
# Authenticate with Google Cloud (required)
gcloud auth application-default login
export GOOGLE_CLOUD_PROJECT=seatkit-dev
# Run API tests with automatic database setup
pnpm test:local
What test:local does:
Alternative: Run tests manually:
# Set up test database first
pnpm db:migrate:test
# Then run tests
TEST_DATABASE_URL="postgresql://localhost:5432/seatkit_test" pnpm test
# Or in watch mode
TEST_DATABASE_URL="postgresql://localhost:5432/seatkit_test" pnpm test:watch
Tests use a separate PostgreSQL database (seatkit_test) to avoid affecting development data:
createdb seatkit_testtest:local or manually with pnpm db:migrate:testSeatKit uses Google Cloud Secret Manager for production secrets. For local development:
Contributors: Use a local .env file (no GCP account needed)
Core Team: Authenticate with gcloud auth application-default login
Your Own Setup: Run pnpm secrets:setup to configure your GCP project
Production and development secrets are stored with environment prefixes:
seatkit-dev-supabase-urlseatkit-dev-supabase-publishable-keyseatkit-dev-supabase-secret-keyseatkit-dev-database-urlReplace dev with prod for production secrets.
GOOGLE_CLOUD_PROJECT is set).env file (in development mode)See SECURITY.md for security policies and best practices.
We welcome contributions! This project is in early development, so thereβs plenty to do.
git checkout -b feat/amazing-feature)pnpm test && pnpm lint)git commit -m "feat: add amazing feature")git push origin feat/amazing-feature)See DEVELOPMENT.md for coding standards.
@seatkit/types)@seatkit/utils)See docs/FEATURES.md for complete roadmap.
This project is licensed under the Apache License 2.0 - see LICENSE.md for details.
See NOTICE.md for third-party software attributions.
Built with β€οΈ for small restaurants