Install the ordo server
Set up your own ordo server with the installer or run it from source. This guide covers requirements, settings, updates, and what the app reports.
On this page
1. Quick install
On a Linux or macOS machine, run:
curl -fsSL https://ordo.axolet.com/install | bash
The script checks Node.js and pnpm, offering to install pnpm if needed. It downloads the latest release into ~/ordo, verifies its published SHA-256 checksum, and opens the setup wizard. The wizard asks about the port, accounts, sign-up codes, mail, network, and whether to start the server. It shows a summary, then writes a commented apps/server/.env, installs dependencies, builds the server, and creates the SQLite database. Release files are downloaded before setup begins.
https://ordo.axolet.com/install is the installer script. You can read it before piping it into bash.
Flags
--yesSkip every question. Settings take their defaults, and the server is left stopped. For scripts and CI; combine with the setup flags below.
--release v0.3.1Install a specific version instead of the latest stable.
ORDO_DIR=/opt/ordoAn environment variable, set before the command, that chooses the install folder. The default is
~/ordo. The folder must be empty or new.--port 8080With
--yes, answer individual wizard questions on the command line. The same works for--registration,--email-verification,--smtp-url,--trust-proxy, and--startor--no-start(by default the server is left stopped).uninstallStops the server and removes the install folder, database included. It asks first;
--yesskips the question and--dry-runshows what would happen. A database stored outside the folder is left in place.--helpPrints the full usage.
Unattended, with settings
curl -fsSL https://ordo.axolet.com/install | bash -s -- --yes --port 8080 --trust-proxy 1
Start the server when it finishes:
cd ~/ordo/apps/server
NODE_ENV=production pnpm start
From another terminal, check that it responds. Use the port you chose during setup (the default is 3000):
curl http://127.0.0.1:3000/api/server/info
To keep the server running after you close the terminal, see the systemd unit at deploy/systemd-ordo.service.example. The repo also has nginx and Caddy HTTPS examples in deploy/. For a full walkthrough, including each wizard question, see docs/SERVER-SETUP.md.
2. Requirements
- A Linux or macOS machine
For example, a VPS, a home server, or a Raspberry Pi that stays on.
- Node.js 22.13 or newer
Check with
node -v. If needed, install it from nodejs.org. - pnpm 11
Optional. If it is missing, the installer offers to install it for you, pinned to the version the release expects.
- A free port
Default 3000. The installer suggests the next one if something already sits there.
- SMTP credentials
Optional. Without mail, sign-up codes print to the server log.
Nothing else: the database is SQLite (a file), the web server is built in, and the two secrets — JWT_SECRET for signing sessions and LIBRARY_KEK for wrapping per-library encryption keys — are generated for you during setup.
3. Manual install
To run from source instead of a release, you need Node.js 22.13+ and pnpm 11. Clone the repo and install:
git clone https://github.com/axoletlabs/ordo
cd ordo
pnpm install
Generate the Prisma client and start the server in development:
pnpm --filter @ordo/server db:generate
pnpm --filter @ordo/server dev
For the Android app from the same checkout:
pnpm --filter @ordo/shared build
pnpm --filter @ordo/mobile start
Settings and environment
Every server setting lives in apps/server/.env, and apps/server/.env.example documents each key with its default — a fresh checkout works without editing anything. The keys you are most likely to touch:
PORT,LISTEN_HOSTThe port the server listens on (default 3000) and the address it binds.
127.0.0.1is this machine only;0.0.0.0adds the LAN.REGISTRATION_ENABLEDAllow sign-ups after the first account. The first account can always register, so a private instance can still be created.
EMAIL_VERIFICATION_REQUIREDRequire a one-time email code when signing up. Without mail configured, the code prints to the server log.
SMTP_URL,SMTP_FROM,SMTP_REQUIREDThe SMTP connection URL, the sender address people see, and whether mail failures are errors instead of falling back to the log.
TRUST_PROXYSet to
1when nginx, Caddy, or Cloudflare sits in front, so rate limiting sees real visitor addresses.JWT_SECRET,LIBRARY_KEKThe two generated secrets: one signs sessions, one wraps per-library encryption keys. Losing them invalidates sessions or encrypted libraries, so back them up.
In production, start with NODE_ENV=production pnpm start from apps/server, as in section 1.
4. Keeping it updated
From the install folder. Your .env, the database, automatic pre-migration backups, and avatars are kept; a running server is stopped, migrated, and started again:
cd ~/ordo
./scripts/deploy-server update
The menu lists published versions — move with the arrow keys, or type a tag to jump straight to it. Non-interactive: ./scripts/deploy-server update --yes [--release v0.3.1].
Back up apps/server/prisma/ordo.db and apps/server/.env, which contains the secrets. If avatars are stored on the filesystem, back up their directory too: by default, apps/server/prisma/ordo-avatars, or the path set by AVATAR_DIR. Restore the files and run ./scripts/deploy-server once to apply any pending migrations, including to an older database file.
To remove ordo entirely: curl -fsSL https://ordo.axolet.com/install | bash -s -- uninstall. It asks first, stops the server, and deletes the folder and its database; a database stored outside the folder is left in place.
5. ordo Cloud or your server
New installs of the app sign into ordo Cloud, operated by Axolet. To keep your library on your own machine instead, choose Use your own server on the sign-in screen, agree that you operate it, and enter the address — for example https://ordo.example.com behind a proxy, or http://192.168.1.20:3000 on your LAN.
You can switch later under Settings → Hosting. Switching signs you out, and libraries are not copied between servers: your ordo Cloud library stays on ordo Cloud, and your self-hosted library stays on your server.
When you run your own server, you are responsible for keeping it online, updated, and backed up. Axolet does not operate it. On the network side, the server binds 127.0.0.1 by default — for anything internet-facing, put nginx or Caddy in front and set TRUST_PROXY=1. Ready-made configs live in the repo’s deploy/ folder.
6. Telemetry
The official production app sends anonymous daily counts to ordo Cloud so Axolet can see whether installs are opening and reaching a server. A server you host receives none of this telemetry. The report does not include your server’s address or hosting mode.
The daily payload has exactly six fields:
{
"installId": "11111111-1111-4111-8111-111111111111",
"day": "2026-09-30",
"opens": 3,
"timeouts": 0,
"serverErrors": 0,
"signInFailures": 0
}
The install ID is a random UUID created and stored on the device — not an account or device ID. Counters are cumulative for a UTC day, capped at 500, and flushed with a 15-minute gap when they change; retries merge by maximum, never by addition. The client reports only on the production build channel, outside development.
Deliberately excluded: app version, exact event timestamps, startup timing buckets, platform, hosting mode, account or sign-in flags, bookmark content, account ID, email, device name, and the address of any server — yours included. The connection’s IP address is used by the rate limiter and is not stored on the record. The data is anonymous daily counters, so there is no retention job; the full telemetry documentation lists every field, and the privacy policy covers ordo Cloud.