Getting started
Install Openfront Restaurant, create your first admin user, and seed a demo restaurant.
If you want the shortest path to a working restaurant, this is it. The app can be running in a few minutes, and the onboarding flow can seed menu data, kitchen stations, floors, sections, tables, and payment providers for you.
What you need
- Node.js 20 or newer
- PostgreSQL
- A
SESSION_SECRETthat is at least 32 characters long - Stripe keys if you want card checkout on day one
You can explore most of the platform without Stripe, but the storefront card flow and Stripe-based payment screens will not complete until Stripe is configured.
Install and boot the project
Clone the repository
git clone https://github.com/openshiporg/openfront-restaurant.git
cd openfront-restaurantInstall dependencies
npm installAdd your environment variables
Create a .env file in the project root.
# Required
DATABASE_URL="postgresql://username:password@localhost:5432/openfront_restaurant"
SESSION_SECRET="replace-this-with-a-long-random-string-of-32-chars-or-more"
# Recommended for storefront and card payments
STRIPE_SECRET_KEY="sk_test_..."
STRIPE_WEBHOOK_SECRET="whsec_..."
NEXT_PUBLIC_STRIPE_KEY="pk_test_..."
STRIPE_PUBLISHABLE_KEY="pk_test_..."
# Optional PayPal adapter setup
NEXT_PUBLIC_PAYPAL_CLIENT_ID="your-paypal-client-id"
PAYPAL_CLIENT_SECRET="your-paypal-client-secret"
PAYPAL_WEBHOOK_ID="your-paypal-webhook-id"
NEXT_PUBLIC_PAYPAL_SANDBOX="true"
# Optional AI assistant
OPENROUTER_API_KEY="sk-or-v1-..."
OPENROUTER_MODEL="anthropic/claude-3.5-sonnet"
OPENROUTER_MAX_TOKENS="4000"
# Optional customer self-signup
PUBLIC_SIGNUPS_ALLOWED="true"
# Optional file storage
S3_BUCKET_NAME="your-bucket"
S3_REGION="us-east-1"
S3_ACCESS_KEY_ID="your-key"
S3_SECRET_ACCESS_KEY="your-secret"
S3_ENDPOINT="https://your-s3-endpoint"
# Optional email
SMTP_FROM="no-reply@example.com"
SMTP_HOST="smtp.example.com"
SMTP_PORT="587"
SMTP_USER="smtp-user"
SMTP_PASSWORD="smtp-password"
SMTP_STORE_LINK="http://localhost:3000"Start the app
npm run devThis command builds the Keystone schema, applies migrations, and starts the Next.js dev server.
Create your first admin and seed the restaurant
Create the initial user
If the database is empty, go to:
http://localhost:3000/dashboard/initCreate your first admin account there.
Sign in to the dashboard
After the first user exists, the main dashboard lives at:
http://localhost:3000/dashboardRun onboarding
The sidebar includes onboarding cards for a fresh install. Use that flow to seed:
- store settings
- menu categories and items
- modifiers
- kitchen stations
- floors, sections, and tables
- payment providers
The seed data is restaurant-specific and lives in features/platform/onboarding/lib/seed.json.
Open the key surfaces
Once onboarding finishes, you can jump straight into the main workflows:
- Storefront:
http://localhost:3000/ - POS:
http://localhost:3000/dashboard/platform/pos - Service floor:
http://localhost:3000/dashboard/platform/service-floor - KDS:
http://localhost:3000/dashboard/platform/kds - Reports:
http://localhost:3000/dashboard/platform/reports
What gets created during onboarding
The out-of-the-box seed is intentionally practical. It gives you a burger-restaurant setup with:
- branded store settings and hours
- kitchen stations like Grill, Fryer, Salad, Bar, Dessert, and Prep
- a main floor plus sections
- a table layout with capacities and coordinates
- featured items, burgers, chicken, sides, drinks, and desserts
- Stripe, PayPal, and manual payment-provider records
That is enough to test the storefront, POS, KDS, reports, and floor workflows without building everything from scratch.
Good first checks after boot
Check the storefront
Open the homepage and confirm you can:
- browse categories
- open an item customization modal
- add items to the bag
- open the checkout modal
Check the staff tools
Open the dashboard and make sure you can:
- create a POS order
- see it in Orders
- sync it into the KDS
- move through the payment screen
Check localization
If you changed currency, locale, or timezone in store settings, confirm those changes show up in:
- storefront prices
- payment screens
- reports
- footer hours
Common setup mistakes
- Short
SESSION_SECRET: the app expects a secret with at least 32 characters. - Missing Stripe publishable key: the checkout modal reads
NEXT_PUBLIC_STRIPE_KEY, and some storefront components still fall back toSTRIPE_PUBLISHABLE_KEY, so set both. - No store settings: the storefront depends on the singleton
StoreSettingsrecord. Onboarding is the easiest way to create it. - Expecting PayPal parity on day one: the adapter is in the codebase, but Stripe is the safer first launch path today.