Run Northstack 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.13 or a later 22 release, or Node.js 24.11 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 northstack-full-stack for the full stack, or next to the app's folder for the Backend API package.
Before you start: install Node.js 22.9 or newer and run corepack enable once (on Node.js 25 and newer, which leave Corepack out, run npm install -g corepack first).
Open the terminal next to the app's folder, where you extracted the ZIP.
| App | Folder | Address |
|---|---|---|
| API | back-end | localhost:8000Local |
| Workspace dashboard | dashboard | localhost:3031Local |
| Public website | website | localhost:3030Local |
Start the API first: the dashboard reads all of its data from it, and the website's contact form and licence checkout call it.
Start the API
Install and configure
.env.exampleworks as it is on your own computer: SQLite in./database.sqlite, the API on port8000, and the website (http://localhost:3030) and the dashboard (http://localhost:3031) allowed to call it.Terminalcorepack enable cd back-end yarn install cp .env.example .envHaving trouble?Create the database
yarn seedcreatesdatabase.sqliteand its tables, the platform roles and settings, the sample workspace Forma Studio (12 projects with their boards, 8 members, 2 invitations, a Pro subscription with three invoices, an API key, the activity of the last weeks and three assistant conversations), a second workspace for its owner, and 732 organizations behind the platform figures. It finishes by printing the accounts to sign in with. Dates follow the day you seed. Running it again on a database that already has accounts adds no account or workspace and gives the built-in platform roles their permissions back.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 on your own computer: SQLite in./database.sqlite, the API on port8000, and the website (http://localhost:3030) and the dashboard (http://localhost:3031) allowed to call it.Terminalcorepack enable cd northstack-backend yarn install cp .env.example .envHaving trouble?Create the database
yarn seedcreatesdatabase.sqliteand its tables, the platform roles and settings, the sample workspace Forma Studio (12 projects with their boards, 8 members, 2 invitations, a Pro subscription with three invoices, an API key, the activity of the last weeks and three assistant conversations), a second workspace for its owner, and 732 organizations behind the platform figures. It finishes by printing the accounts to sign in with. Dates follow the day you seed. Running it again on a database that already has accounts adds no account or workspace and gives the built-in platform roles their permissions back.Terminalinnorthstack-backendyarn seedStart the server
Terminalinnorthstack-backendyarn devExpected result: localhost:8000/
Having trouble?api/ healthLocal answers with "status":"ok"and"database":"up".
Every seeded account signs in with the password NorthstackDemo26!: owner@northstack.example, admin@northstack.example, member@northstack.example, billing@northstack.example, platform@northstack.example and support@northstack.example.
Start the workspace dashboard
In a second terminal:
Install and configure
The copied
.envpoints the dashboard at the API on port8000and its live permission updates on the same server.Terminalcd dashboard yarn install cp .env.example .envStart it and sign in
Terminalindashboardyarn devExpected result: localhost:3031Local opens the sign-in form. Sign in with
Having trouble?owner@northstack.exampleand the passwordNorthstackDemo26!.
Start the workspace dashboard
The API is not part of this package. On its own, the dashboard runs on its built-in sample data: start it without a .env file.
Install and start it on sample data
With no
.env,NEXT_PUBLIC_API_BASE_URLis empty and every screen answers from the sample data in your browser.Terminalcorepack enable cd northstack-dashboard yarn install yarn devExpected result: localhost:3031Local opens the sign-in form with a Sample data notice at the bottom. Any password signs in:
Having trouble?owner@northstack.exampleopens the owner's workspace, and each seeded email opens its role.Connect it to the API
With the Northstack API running on
http://localhost:8000/api, stopyarn dev, copy the example settings and start it again. If your API runs somewhere else, setNEXT_PUBLIC_API_BASE_URL(with/api) andNEXT_PUBLIC_WEBSOCKET_BASE_URL(without it) in.envto its address.Terminalinnorthstack-dashboardcp .env.example .env yarn devExpected result: Sign in with
Having trouble?owner@northstack.exampleand the passwordNorthstackDemo26!, which a seeded API accepts. The Sample data notice is gone.
Start the public website
In a third terminal:
Install and configure
Every value in the copied
.envis optional: it points the website at the API on port8000and the dashboard on3031.Terminalcd website yarn install cp .env.example .envStart it
Terminalinwebsiteyarn devExpected result: localhost:3030Local opens the website in English; Arabic is at
Having trouble?/ar.
Start the public website
The API is not part of this package. On its own, the website runs on its built-in sample data: start it without a .env file.
Install and start it on sample data
With no
.env,NEXT_PUBLIC_API_BASE_URLis empty: the contact form and the licence checkout answer in your browser and send nothing.Terminalcorepack enable cd northstack-website yarn install yarn devExpected result: localhost:3030Local opens the website with a Sample data notice at the bottom of every page; Arabic is at
Having trouble?/ar.Connect it to the API
With the Northstack API running on
http://localhost:8000/api, stopyarn dev, copy the example settings and start it again. If your API runs somewhere else, setNEXT_PUBLIC_API_BASE_URLin.envto its address, including/api.Terminalinnorthstack-websitecp .env.example .env yarn devExpected result: The Sample data notice is gone, and the contact form and the checkout reach your API.
Having trouble?
Other ports
Without Docker the ports are set in the files. The website's dev and start scripts in package.json pass -p 3030; for another port run yarn next dev -p 3040 (or yarn next start -p 3040 after yarn build). The dashboard reads PORT from its .env (PORT=3041), and starts on 3031 without one. With the API, add a moved frontend's address to CORS_ORIGIN in the API's .env, and set it there as WEBSITE_URL for the website, or as DASHBOARD_URL and FRONTEND_URL for the dashboard; set the frontend's own NEXT_PUBLIC_SITE_URL or NEXT_PUBLIC_BASE_URL to match. To move the API, set PORT, PUBLIC_API_URL and PUBLIC_MEDIA_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
DASHBOARD_URL=http://localhost:3031
WEBSITE_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 with the sample data, and start it. yarn seed:prod is the compiled yarn seed.
yarn build
yarn seed:prod
yarn start:prodOn a server, start empty
yarn seed:prod loads the sample accounts with their published password, so use it on your own computer only. On a server run yarn admin:create:prod instead: the tables and your own Platform admin, with no sample data. After an update, yarn schema:prod brings the tables up to the new code.
Production build of the frontends
In each frontend's folder, stop yarn dev, build once and start. The website serves on 3030 and the dashboard on 3031.
yarn build
yarn startThe frontends compile their NEXT_PUBLIC_* values in at build time, so run yarn build again after changing .env. 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 seedyarn reset empties every table and keeps them, and yarn drop drops every table; run yarn seed after either to fill the database again. On MySQL, where there is no file to delete, start over with:
yarn reset
yarn seedCommands
| Task | API | Dashboard | Website |
|---|---|---|---|
| Install | yarn install | yarn install | yarn install |
| Dev server | yarn dev (8000) | yarn dev (3031) | yarn dev (3030) |
| Production build | yarn build | yarn build | yarn build |
| Production start | yarn start:prod | yarn start | yarn start |
| Seed the sample data | yarn seed (built: yarn seed:prod) | not needed | not needed |
| Create or update the tables, no data | yarn schema (built: yarn schema:prod) | not needed | not needed |
| The first Platform admin, no sample data | yarn admin:create (built: yarn admin:create:prod) | not needed | not needed |
| Empty every table | yarn reset | not needed | not needed |
| Drop every table | yarn drop | not needed | not needed |
| Type check | part of yarn build | yarn typecheck | yarn typecheck |
| Lint | yarn lint | yarn lint | yarn lint |