Getting Started
Welcome to the Business Platform developer guide. This page walks you through setting up a local development environment and covers important first-run behaviour you need to be aware of.
Prerequisites
Before you begin, make sure you have the following installed:
- Node.js (check
.nvmrcorpackage.jsonfor the required version) - npm (ships with Node.js)
- MongoDB (local instance or a connection string to a remote instance)
- Git
Installation
Clone the repository and install dependencies:
git clone <repository-url>
cd business-platform
npm ci
Running the Application Locally
Start the backoffice development server:
npm run dev
The application will be available at http://localhost:5173 by default.
First-Run: Promoting a User to Platform Owner
When running the application in development mode, the first user to register is automatically eligible to become the platform owner. The platform owner has full administrative access to the platform.
How It Works
- Start the application in development mode.
- Register the first user account via the normal registration flow.
- The server detects that exactly one user exists in the database and generates a one-time promotion token.
- A URL is printed to the server log (stdout) in the following format:
[DEV] First user registered! Make them a platform owner:
[DEV] http://localhost:5173/api/admin/dev/platform-owner/<token>
- Open that URL in your browser (or
curlit). The user will be promoted to platform owner immediately.
Endpoint Details
| Property | Value |
|---|---|
| Method | GET |
| Path | /api/admin/dev/platform-owner/[token] |
| Available in | Development mode only |
| Token expiry | 10 minutes from registration |
| User count requirement | Exactly 1 user must exist in the database |
Constraints and Error Cases
- Production unavailable — The endpoint returns
404 Not Foundwhen the application is not running in development mode. - Token expired — Tokens are valid for 10 minutes. If the token has expired, the endpoint returns
403 Forbiddenwith the message"Invalid or expired token". Re-register or restart the server to obtain a new token. - Token already used — Each token is single-use. Once consumed it is deleted from memory; re-using it will return
403 Forbidden. - More than one user exists — If more than one user has registered, the endpoint returns
403 Forbiddenwith the message"This endpoint only works when there is exactly 1 user". This is a deliberate safety guard to prevent accidental privilege escalation.
Example
# Copy the URL from the server log and open it, e.g.:
curl http://localhost:5173/api/admin/dev/platform-owner/a1b2c3d4...
# Success response:
# { "success": true, "message": "User has been promoted to platform owner" }
Note: This flow relies entirely on in-memory token storage. Restarting the server will invalidate any pending tokens.
Development Utilities
Email Sending
In development mode (and during E2E tests), outbound emails are not delivered. Instead, the full email content is printed to the server log:
[DEV] Would send this mail:
{ "to": "...", "subject": "...", ... }
with this config:
{ ... }
This allows you to inspect verification links, invitation emails, and other transactional messages without needing an SMTP server.
Environment Modes
The application uses isDevelopment() to gate behaviour that should never run in production. Any feature or endpoint guarded by this check (including the platform owner promotion endpoint above) is automatically disabled when the NODE_ENV is not development.
Always verify your environment configuration before running the application to ensure development-only features are not exposed.