Installation
from zip to a running operator server.
Install, check, build, start the operator server and create the owner account. About 30 minutes the first time.
01Unzip and open a terminal
- Unzip the downloadThe source is in the
source/folder of the ZIP. Move it where you keep projects. - Open a terminal in itThe folder that contains
package.json. Every command in these docs runs there. - Check Node.js
node --version # v20.19.0 or newer
02Install the packages
npm ci
This installs the exact versions in package-lock.json, including better-sqlite3 for the operator server. If it fails on better-sqlite3, see Troubleshooting.
03Check the project
One command runs every check the release passed: type checks for the app and the server, the unit tests, the server tests, the licence check, the contrast check and the production build.
npm run gate
On the release build (macOS, Node.js 22.22.2) this ran 256 unit tests (29 files) and 11 server tests, all passing; the licence check reported 37 production packages with no GPL, AGPL, SSPL or BUSL licence, and the contrast check passed. The tests run offline. If your machine is slow, run the unit tests with fewer workers: npx vitest run --maxWorkers=2.
04Build settings (optional now)
cp .env.example .env.local
Open .env.local in a text editor. For a first run you can leave everything as it is. Before real traffic, set your own VITE_RPC_URL (RPC). Every variable is explained in Configuration.
Every VITE_* value is compiled into the public JavaScript bundle that every visitor downloads. Never put a private key, a password or an unrestricted API key there.
05Build the dApp
npm run build # type check, then Vite writes dist/
On the release machine this took about 20 seconds. The result is the static site in dist/. Change a VITE_* value later? Build again.
06Start the operator server
- Make a secret keyRequired The server refuses to start without
ADMIN_SECRET_KEY(32 bytes, hex or base64). It encrypts the console's secrets at rest. Store it in your password manager and back it up: without it the encrypted values in the database cannot be read.export ADMIN_SECRET_KEY=$(openssl rand -hex 32) - Start the server
It prints:npm run server[parachute] dApp http://127.0.0.1:8787/ [parachute] console http://127.0.0.1:8787/admin [parachute] public http://127.0.0.1:8787/api/public-config - Copy the one-time setup codeOn the first start, before an owner exists, the log also prints
[admin] No owner account yet. Open /admin and create it with this one-time setup code:followed by a code likeXXXX-XXXX-XXXX-XXXX. It is shown only in this log and never sent anywhere. Each start before the owner exists prints a new code; any printed code works until the owner is created. - Create the ownerOpen
http://127.0.0.1:8787/admin, enter the setup code, your email and a password of at least 12 characters, then Create owner and sign in. - Turn on two-factorConsole → Security & alerts → Set up two-factor. The console's Overview reminds you until you do.
- Fill in Get startedConsole → Get started: product name, accent colour and support email. Then Finish setup.
Starting without ADMIN_SECRET_KEY prints ADMIN_SECRET_KEY is not set. Generate one with `openssl rand -hex 32`, keep it out of git, and start again. and exits.
07Check that it works
curl http://127.0.0.1:8787/api/health # {"ok":true}
curl http://127.0.0.1:8787/api/public-config # your public settings: fee 0, stocks off by default
- Open
http://127.0.0.1:8787/: the dApp, served by the same process. - Console → Status: the RPC check should pass ("chain 4663, block …").
- In the dApp,
/settingsand the status strip at the bottom show the config version and the fee in force.
Stop the server with Ctrl C. Your settings stay in server/data/admin.sqlite.
08Developing against the operator server
The development server (npm run dev) runs on safe defaults. To see your console settings in development, start the operator server in one terminal and the development server with a proxy in another:
PARACHUTE_SERVER=http://127.0.0.1:8787 npm run dev
vite.config.ts then forwards /api to the operator server.