Run Ticketory locally
Install and start each app with Node.js and Yarn, one terminal per app.
For the Full Stack package
Before you start: install Node.js 22 or newer and run corepack enable once (on Node.js 25 and newer, which leave Corepack out, run npm install -g corepack first). No database server is needed.
Open every terminal where the commands below expect it: inside ticketory-full-stack for the full stack, or next to the app's folder for a single-app package.
| App | Folder | Address |
|---|---|---|
| API | back-end | localhost:8000Local |
| Public website | storefront | localhost:3030Local |
| Organiser dashboard | admin-dashboard | localhost:3031Local |
Start the API first: both frontends read all of their data from it.
Start the API
Install and configure
.env.exampleworks as it is for local development: SQLite on port8000.Terminalcorepack enable cd back-end yarn install cp .env.example .envHaving trouble?Create the database
yarn seedchecks that every seeded picture is present underpublic/media, then createsdatabase.sqlite, its tables and four sample organisers, each a workspace: 29 permissions, the Owner, Manager, Finance and Check-in roles, 9 venues, 36 events (22 on the website), 1,145 orders, 14 staff accounts and an attendee with eight orders. It finishes by printing the Owner's and the attendee's sign-ins. Dates follow the day you seed. Running it again adds no rows and never resets a password, but it puts the four built-in roles back to their default permissions.Terminalinback-endyarn seedStart the server
Terminalinback-endyarn devExpected result: localhost:8000/
Having trouble?api/ healthLocal answers with "status":"ok"and"database":"up".
Start the API
Install and configure
.env.exampleworks as it is for local development: SQLite on port8000.Terminalcorepack enable cd ticketory-backend yarn install cp .env.example .envHaving trouble?Create the database
yarn seedchecks that every seeded picture is present underpublic/media, then createsdatabase.sqlite, its tables and four sample organisers, each a workspace: 29 permissions, the Owner, Manager, Finance and Check-in roles, 9 venues, 36 events (22 on the website), 1,145 orders, 14 staff accounts and an attendee with eight orders. It finishes by printing the Owner's and the attendee's sign-ins. Dates follow the day you seed. Running it again adds no rows and never resets a password, but it puts the four built-in roles back to their default permissions.Terminalinticketory-backendyarn seedStart the server
Terminalinticketory-backendyarn devExpected result: localhost:8000/
Having trouble?api/ healthLocal answers with "status":"ok"and"database":"up".
Start the public website
In a second terminal:
Install and configure
The copied
.envpoints the website at the API on port8000.Terminalcd storefront yarn install cp .env.example .envStart it
Terminalinstorefrontyarn devExpected result: localhost:3030Local opens the website in English with the sample events; Arabic is at
Having trouble?/ar.
Start the public website
The API is not part of this package. Start it first; the copied .env expects it at http://localhost:8000/api.
Install and configure
If your API runs somewhere else, set
NEXT_PUBLIC_API_BASE_URLin.envto its address, including/api.Terminalcorepack enable cd ticketory-website yarn install cp .env.example .envHaving trouble?Start it
Terminalinticketory-websiteyarn devExpected result: localhost:3030Local opens the website with the events from your API; Arabic is at
Having trouble?/ar.
Start the organiser dashboard
In a third terminal:
Install and configure
The copied
.envpoints the dashboard at the API and its live notifications on port8000.Terminalcd admin-dashboard yarn install cp .env.example .envStart it and sign in
yarn devfirst copies the map library's worker intopublic/maplibre/, then starts the dashboard.Terminalinadmin-dashboardyarn devExpected result: localhost:3031Local opens the sign-in form. Sign in with
Having trouble?owner@example.testand the passwordDemoOnly!2026.
Start the organiser dashboard
The API is not part of this package. Start it first; the copied .env expects it at http://localhost:8000/api.
Install and configure
If your API runs somewhere else, set
NEXT_PUBLIC_API_BASE_URL(with/api) andNEXT_PUBLIC_WEBSOCKET_BASE_URL(without it) in.envto its address.Terminalcorepack enable cd ticketory-dashboard yarn install cp .env.example .envHaving trouble?Start it and sign in
Terminalinticketory-dashboardyarn devExpected result: localhost:3031Local opens the sign-in form. Sign in with
Having trouble?owner@example.testand the passwordDemoOnly!2026, which a seeded API accepts.
Other ports
Without Docker the ports are fixed in the files. The website's dev and start scripts in package.json pass -p 3030, and the dashboard's pass -p 3031: change the number there to move one, then add the new address to CORS_ORIGIN in the API's .env, and set STOREFRONT_URL there to a moved website, or FRONTEND_URL to a moved dashboard. To move the API, set PORT, PUBLIC_MEDIA_URL and PUBLIC_API_URL in its .env to the same number, and NEXT_PUBLIC_API_BASE_URL in both frontends (the dashboard's NEXT_PUBLIC_WEBSOCKET_BASE_URL too).
Production build
The same folders, built once and then started. First set the API's .env for production: with NODE_ENV=production the API never changes the tables on start, and it refuses to start while JWT_SECRET is empty or still the example value, or while CORS_ORIGIN is empty.
NODE_ENV=production
JWT_SECRET=paste-the-generated-secret-here
CORS_ORIGIN=http://localhost:3030,http://localhost:3031
FRONTEND_URL=http://localhost:3031
STOREFRONT_URL=http://localhost:3030
PUBLIC_API_URL=http://localhost:8000
PUBLIC_MEDIA_URL=http://localhost:8000/mediaGenerate the secret with node -e "console.log(require('crypto').randomBytes(48).toString('hex'))". Then, in the API's folder, build it, create its tables once, and start it. yarn seed:prod adds the sample organisers and their accounts; yarn db:sync:prod in its place creates empty tables with no accounts.
yarn build
yarn seed:prod
yarn start:prodProduction build of the frontends
In each frontend's folder, build once and start. The website serves on 3030 and the dashboard on 3031.
yarn build
yarn startThe frontends compile their .env in at build time, so run yarn build again after changing it. Before you deploy anywhere public, read the deployment guide.
Start over with fresh demo data
Stop the API, then delete the database file and seed it again, in the API's folder. This deletes everything you created.
rm -f database.sqlite* && yarn seedIn PowerShell:
Remove-Item database.sqlite*; yarn seed