Run Northstack locally
Get your package running on your computer, with Docker.
For the Full Stack package
Before you start: install and open Docker Desktop, or Docker Engine with Compose.
View requirementsDownload your template
Open My templates and download the ZIP for your package.
Expected result: A file named like
northstack-full-stack-….zipis in your downloads.Unzip and open the folder
Open a terminal where the ZIP is, extract it and move into the
northstack-full-stackfolder. On Windows, you can extract it in File Explorer instead, then open a terminal in the folder.Terminalunzip -q northstack-full-stack-*.zip cd northstack-full-stack lsExpected result: The folder lists
Having trouble?back-end,dashboard,websiteanddocker-compose.yml, besideREADME.md,QUICKSTART.mdandLICENSE.md.Start the apps
Build and start the API, the public website and the workspace dashboard. Nothing has to be configured first. The first start builds three images and fills the database with the sample workspaces, which takes a few minutes; later starts take seconds.
Terminalinnorthstack-full-stackdocker compose up --buildA port is already in use?
If the start stops with
A port is already in useports are not available,address already in useorport is already allocated, another program uses 3030, 3031 or 8000. Either stop it, or create a file named.envin thenorthstack-full-stackfolder, besidedocker-compose.yml, with the port you need, such asADMIN_PORT=3041(SITE_PORTfor the website,API_PORTfor the API). Rundocker compose up --buildagain and open the app on its new port.Expected result: The three services keep running and the log stops scrolling. Leave this terminal open.
Having trouble?Open the public website
Open localhost:3030Local. English is at
/enand Arabic at/ar. The website has no accounts of its own: its Live demo buttons open the dashboard's sign-in.Expected result: The website opens on its home page. The pricing page sells the two licences through the site's own checkout, which charges nobody until the API has payment keys.
Having trouble?Sign in to the dashboard
Open localhost:3031Local. Sign in with
owner@northstack.exampleand the passwordNorthstackDemo26!. Every seeded account uses that password; change them before the stack is reachable from the internet.Expected result: The dashboard opens on Forma Studio's Workspace overview, with its projects, this month's usage, the project activity chart and the launch checklist.
Having trouble?
Take a tour
What the sample workspace looks like once everything runs.
| Account | Where | |
|---|---|---|
| Owner of Forma Studio: every workspace page and action, billing, the roles matrix and deleting the workspace; also an admin of Monogram | owner@northstack.example | Dashboard |
| Admin: projects, team and invitations, workspace settings, API keys and the activity log; the roles read only, no billing | admin@northstack.example | Dashboard |
| Member: projects and tasks, and the assistant; the team, the roles and the settings to read, no billing | member@northstack.example | Dashboard |
| Billing: the subscription, plan changes and invoices; the team, the roles and the settings to read; no projects (the overview leaves them out too) and no assistant | billing@northstack.example | Dashboard |
| Platform admin: every organization, user, staff member, platform role and setting | platform@northstack.example | Dashboard |
| Support: every platform page read only, and report exports | support@northstack.example | Dashboard |
Every account signs in with the password NorthstackDemo26!. These are local demo accounts only: on a server, start empty with SEED_SAMPLE_DATA=false and your own Platform admin (Starting empty).
The seed adds Forma Studio on the Pro plan, with 12 projects and their task boards, 8 members, 2 open invitations, three invoices, an API key, the activity of the last weeks and three past conversations with the assistant, and a second workspace, Monogram, that the owner switches to from the workspace switcher. Behind the platform administration there are 732 organizations in all, so every list and figure opens full. A new account made on the sign-up page goes through onboarding and creates its own workspace.
Stop and start again
Press Ctrl+C in the terminal to stop the apps, or run this from the northstack-full-stack folder. Your data, the database and the uploads, is kept in the northstack-data volume.
northstack-full-stackdocker compose downStart again with the same command as step 3. Without --build it reuses the images you already built.
northstack-full-stackdocker compose upKeep your data
docker compose down -v also deletes the data volume. The next start seeds a fresh copy of the sample workspaces, and everything you created is gone.
Run the public website
This package is the public website on its own. With no API it runs on its built-in sample data: the contact form and the licence checkout answer in your browser, and nothing is sent anywhere. To use the Northstack API instead, build it with the API's address. The API is a separate package and is not in this download.
Unzip and open the folder
Terminalunzip -q northstack-website-*.zip cd northstack-website lsExpected result: The folder has a
Having trouble?Dockerfile, apackage.jsonand theQUICKSTART.mdguide.Build the image
On its own, with no API: the empty
NEXT_PUBLIC_API_BASE_URLbuilds the site on its sample data.Terminalinnorthstack-websitedocker build -t northstack-website --build-arg NEXT_PUBLIC_API_BASE_URL= .With the Northstack API on
http://localhost:8000/apiand the dashboard onhttp://localhost:3031, build without arguments:Terminalinnorthstack-websitedocker build -t northstack-website .With your own API and domains, the
NEXT_PUBLIC_*values are compiled into the JavaScript the browser loads, so they are build arguments:Terminalinnorthstack-websitedocker build -t northstack-website --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-domain.com --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_DASHBOARD_URL=https://app.your-domain.com .Having trouble?Start it
If port
3030is taken, change the number on the left of-p, for example-p 3040:3030, and open that port instead. With an API, also build withNEXT_PUBLIC_SITE_URL=http://localhost:3040, and add that address to the API'sCORS_ORIGINandWEBSITE_URL.Terminalinnorthstack-websitedocker run -p 3030:3030 northstack-websiteExpected result: localhost:3030Local opens the website. English is at
Having trouble?/en, Arabic at/ar. Built with no API, a Sample data notice at the bottom of every page says so.
With an API on your computer, inside the container localhost is the container itself. The browser still reaches the API, but for the checkout and its receipt to be complete when the server renders them, tell the website's server where the API is. --add-host makes host.docker.internal work on Linux; Docker Desktop already has it.
northstack-websitedocker run -p 3030:3030 -e API_INTERNAL_URL=http://host.docker.internal:8000/api --add-host=host.docker.internal:host-gateway northstack-websiteRun the workspace dashboard
This package is the workspace dashboard on its own. With no API it runs on its built-in sample data in your browser, where any password signs in. To use the Northstack API instead, build it with the API's address. The API is a separate package and is not in this download.
Unzip and open the folder
Terminalunzip -q northstack-dashboard-*.zip cd northstack-dashboard lsExpected result: The folder has a
Having trouble?Dockerfile, apackage.jsonand theQUICKSTART.mdguide.Build the image
On its own, with no API: the empty
NEXT_PUBLIC_API_BASE_URLbuilds the dashboard on its sample data.Terminalinnorthstack-dashboarddocker build -t northstack-dashboard --build-arg NEXT_PUBLIC_API_BASE_URL= .With the Northstack API on
http://localhost:8000/api(its live updates onhttp://localhost:8000) and the website onhttp://localhost:3030, build without arguments:Terminalinnorthstack-dashboarddocker build -t northstack-dashboard .With your own API and domains, give the addresses the browser reaches them on:
Terminalinnorthstack-dashboarddocker build -t northstack-dashboard --build-arg NEXT_PUBLIC_API_BASE_URL=https://api.your-domain.com/api --build-arg NEXT_PUBLIC_BASE_URL=https://app.your-domain.com --build-arg NEXT_PUBLIC_WEBSITE_URL=https://www.your-domain.com .Having trouble?Start it and sign in
If port
3031is taken, change the number on the left of-p, for example-p 3041:3031, and open that port instead. With an API, also build withNEXT_PUBLIC_BASE_URL=http://localhost:3041, add that address to the API'sCORS_ORIGIN, and set it as the API'sDASHBOARD_URLandFRONTEND_URL.Terminalinnorthstack-dashboarddocker run -p 3031:3031 northstack-dashboardExpected result: localhost:3031Local opens the sign-in form. On sample data any password signs in, and
Having trouble?owner@northstack.exampleopens the owner's workspace. Against a seeded API, sign in withowner@northstack.exampleand the passwordNorthstackDemo26!.
Run the API
This package is the NestJS API on its own, on a SQLite file kept in a Docker volume, northstack-api-data, with the uploads. The public website and the workspace dashboard are separate packages and are not in this download.
Unzip and open the folder
Terminalunzip -q northstack-backend-*.zip cd northstack-backend lsExpected result: The folder has a
Having trouble?Dockerfile, adocker-entrypoint.sh, apackage.jsonand theQUICKSTART.mdguide.Start it with the sample data
A new volume is seeded once with the sample workspaces and the accounts below, and every later start keeps what is there. On a server, start it empty instead with
-e SEED_SAMPLE_DATA=false(Starting empty). If port8000is taken, change the number on the left of-p, for example-p 8010:8000, and add-e PUBLIC_API_URL=http://localhost:8010 -e PUBLIC_MEDIA_URL=http://localhost:8010/mediaso the links it writes (media, invoice downloads) use the new port too. Your frontends must then point athttp://localhost:8010/api.Terminalinnorthstack-backenddocker run -p 8000:8000 -v northstack-api-data:/data northstack-apiExpected result: localhost:8000/
Having trouble?api/ healthLocal answers with "status":"ok"and"database":"up".
The seeded accounts are owner@northstack.example, admin@northstack.example, member@northstack.example, billing@northstack.example, platform@northstack.example and support@northstack.example, all with the password NorthstackDemo26!. Sign in with POST /api/auth/login, or from a Northstack dashboard.
The container accepts the website on http://localhost:3030 and the dashboard on http://localhost:3031. On other addresses, pass CORS_ORIGIN (both, comma separated), FRONTEND_URL and DASHBOARD_URL (the dashboard) and WEBSITE_URL (the website) with -e. Pass your keys the same way, only the ones you need:
northstack-backenddocker run -p 8000:8000 -v northstack-api-data:/data -e GOOGLE_API_KEY=your-key northstack-apiDo not pass --env-file .env with a copy of .env.example: it sets NODE_ENV=development over the image's production default, which lets the API change the database schema by itself on every start. Without a JWT_SECRET of your own, or with the example one, the container generates a secret and keeps it in the volume, so sign-ins survive a restart.
To start over with fresh sample data, remove the container first (docker rm -f with its name), then delete the volume with docker volume rm northstack-api-data.