Quickstart
Truss is self-hosted. The fastest way to a running instance is one command, which pulls the published images and brings up the whole stack (API, dashboard, Postgres, auth, storage, cache). You do not need to clone the repository.
Prerequisites
Section titled “Prerequisites”- Docker and Docker Compose v2 (
docker compose version) - About 2 GB of free disk for the images on first run
That’s all. Node, Postgres, and the auth services run inside the stack.
1. Install
Section titled “1. Install”curl -fsSL https://raw.githubusercontent.com/binarysquadd/truss/main/install.sh | shThis downloads the Compose file into ./truss, generates strong random secrets, and starts
everything. Re-running is safe.
Download the Compose file and an env template, fill in secrets, and start:
curl -fsSLO https://raw.githubusercontent.com/binarysquadd/truss/main/docker-compose.selfhosted.ymlcurl -fsSL https://raw.githubusercontent.com/binarysquadd/truss/main/.env.selfhosted.example -o .env.selfhosted
# generate each GENERATE_* secret in .env.selfhosted, e.g. with: openssl rand -hex 32
docker compose -f docker-compose.selfhosted.yml --env-file .env.selfhosted up -dGive it a minute to run migrations and become healthy.
2. Log in
Section titled “2. Log in”Open the dashboard at http://localhost:3000.
On first boot Truss seeds a default admin (the way Grafana and Argo CD do) so you can sign in right away:
-
Email:
admin@truss.local -
Password: printed once to the API logs —
Terminal window docker compose -f docker-compose.selfhosted.yml logs truss-api | grep "Default admin"
Change it immediately under Settings → Account → Change Password.
3. Create an API key
Section titled “3. Create an API key”In the dashboard, go to Settings → API Keys → Create. Pick service_role for full
server-side access. The full secret is shown once, so copy it.
4. Make your first API call
Section titled “4. Make your first API call”curl http://localhost:3000/v1/status \ -H "apikey: truss_sk_your_key_here"const res = await fetch('http://localhost:3000/v1/status', { headers: { apikey: 'truss_sk_your_key_here' },});const status = await res.json();console.log(status.database.table_count);The dashboard and API are served on the same origin (:3000); Nginx proxies /v1 and /api
to the backend, so you point clients at one URL.
What’s next?
Section titled “What’s next?”- Self-Hosting — run it for production: Helm, TLS, hardening, backups
- Configuration — every environment variable explained
- API Keys —
anonvsservice_role, rotation, scoping - Database — SQL-over-HTTP, Auto-REST, pgvector, full-text search