Start

Install

Install Omnesis yourself with one command, or ask a local coding agent to guide you across the devices you choose. The gateway usually runs on an always-on computer. Its installer installs the CLI, sets up TLS, registers the gateway and a collector as services, and downloads an embedding model. A second machine that only collects, or one running an agent harness, uses the same installer with a role flag.

The installer can deliver Omnesis in two ways:

Method Flag The host needs Choose it when
Source (default) Node 24, git, about 3.5 GB of memory; a C/C++ toolchain on Linux You want the default: a checkout of the release, built on the machine.
Docker --docker Docker with the Compose plugin You want containers and no Node on the host. Release images are not published yet; see Docker.

Requirements

macOS The Apple sources read local databases, so the collector needs Full Disk Access. The installer opens the settings pane for it; you can also grant it later. See Full Disk Access.

Guided install with an agent

If you have a coding agent with terminal access on the computer where you want to begin, copy this prompt into it. The full install prompt asks the agent to inspect the machine, help you choose a gateway and any additional collectors, then walk through Tailscale, phones, and browser capture one step at a time. It uses the same installer and checks each part before moving on. You choose which devices and sources to add.

Help me install Omnesis across the devices I choose. Read https://omnesis.dev/install-prompt.md and follow it.

You can also read the agent instructions before pasting the prompt. The agent will need you for account sign-ins, permissions, and steps on other devices.

One-command install

❯ curl -fsSL https://omnesis.dev/install.sh | sh

The script runs as your user. It uses sudo only for Linux prerequisites (Node, git and build tools) when they are missing, and on Linux to make you the machine's Tailscale operator when tailscale cert refuses your user. Before it changes anything, it prints the role, delivery method and release it is about to install; --dry-run stops there. Then it:

  1. Checks the platform: macOS or Linux, amd64 or arm64. Anything else is refused.
  2. Installs Node 24 if needed: Homebrew on macOS, NodeSource on Linux.
  3. For a Linux source install, installs make, C/C++ compilers and Python 3 if they are missing.
  4. Installs the newest stable release of the omnesis CLI (a checkout in ~/omnesis), with the command at ~/.local/bin/omnesis. If that directory is not on your PATH, it adds it once to the profile file your shell reads, marked as added by the installer, and tells you the command that makes it available in the current terminal.
  5. Sets up TLS: a Tailscale certificate when Tailscale is running, a mkcert certificate with --mkcert, and otherwise the gateway's own self-signed certificate. Certificates explains what each one means for browsers and phones.
  6. Sets up encryption at rest when the machine has a usable OS keyring, and asks what to do when it has none (see First run).
  7. Registers the gateway and the collector as user services (launchd agents on macOS, systemd user units on Linux) and starts them.
  8. Downloads the embedding model you chose, so semantic search works from the start.
  9. If codex is installed, offers to set up the agent with a ChatGPT sign-in (see First run).
  10. Prints the exact command another machine runs to join this gateway, as a collector or an agent-harness host, with the gateway's URL and certificate fingerprint, and how to mint the pairing code that command asks for.
  11. Ends with a warning when the gateway has no Tailscale certificate, naming the AI agents that cannot connect to the certificate it serves.
Choose the certificate for the agents you want to connect. Without a Tailscale certificate or a domain of your own, the gateway serves its self-signed certificate, and Claude Code, ChatGPT and the Claude apps cannot connect to it. OpenClaw, Hermes and the phone apps work as they are, and Codex works with one setting, SSL_CERT_FILE, which the portal shows. With a mkcert certificate, Claude Code and Codex each need a one-time trust setting. ChatGPT and the Claude apps connect from their providers' servers, so they also need the gateway published. To move to a Tailscale certificate later, set up Tailscale with MagicDNS and HTTPS certificates, then run omnesis tls provision.

Roles

With no role flag the installer sets up the gateway machine, as above. Each run installs one role.

Role What it installs
(no flag) The gateway machine: gateway, collector, TLS, encryption at rest, embedding model, services.
--collector A collector for a gateway on another machine: the CLI, a pairing with that gateway, and the collector service. No gateway, embedding model or index.
--openclaw / --hermes An agent-harness machine: the CLI, then a pairing with a gateway on another machine and the harness's Omnesis plugin. The harness must already be installed; the installer never installs it. On a machine that already runs Omnesis, the role uses the CLI that is there and leaves the install and its services as they are. See OpenClaw and Hermes.
--client-only The CLI alone, for a machine you only query from.
--docker The gateway machine as containers, or with --collector a collector in a container. The harness roles are refused, because their plugin runs inside the harness itself. See Docker.

The collector and harness roles take the gateway's address and ask for a pairing code, which you mint on the gateway host with omnesis devices pair --kind collector (or --kind agent for a harness), or in the portal under Settings → Devices:

❯ curl -fsSL https://omnesis.dev/install.sh | sh -s -- --collector --gateway-url https://gateway.example.io:7600 --trust-fingerprint sha256:<fingerprint>

Pairing code:

Collector studio-mini is online.

Leave out --gateway-url and the installer looks for a gateway on the local network, shows you what answered and its certificate fingerprint, and asks before pairing. If nothing answers, or there is no terminal to confirm with, it stops and asks you to name the gateway. Setup → Collector on another machine explains each step and the commands underneath.

Installer flags

Pass flags after sh -s --, as in the examples above. The role flags are in Roles.

Flag Effect
--version X.Y.Z Install an exact release (source tag or Docker image).
--commit <full-sha> Source installs only: install an exact 40-character commit available from the configured repository. Intended for controlled testing between releases.
--edge Install the main branch from source. Docker installs release images only, so it refuses this flag.
--source-dir <dir> Where a source install is checked out (environment: OMNESIS_SOURCE_DIR). Default ~/omnesis.
--force Allow an existing checkout to move to an older release.
--port <port> Gateway port. Default 7600. Moving an installed gateway to another port names every device paired from another machine, which still dials the old port, and prints what points each one at the new port.
--mkcert Use a mkcert certificate instead of Tailscale, covering the host name and its current network addresses.
--no-tls Skip TLS setup; the gateway keeps its self-signed certificate.
--tls-cert <path>, --tls-key <path>, --tls-ca <path> With --docker: serve a certificate you issued. See TLS in Docker.
--build With --docker: build the images from the checkout this script came from instead of pulling published ones.
--hardened, --no-hardened Linux with systemd: run the gateway under a dedicated system account, with its own state in /var/lib/omnesis-gateway. The installer prints the root command that does it and does not run it. Refused while a gateway service of yours is registered. --no-hardened keeps the gateway under your account without asking. See Hardened gateway.
--embedder <id> Install this embedding model instead of asking. List the ids with omnesis model catalog --role embed, which needs no running gateway.
--no-model Install no embedding model; search is keyword-only until you add one.
--no-keyring Don't set up encryption at rest.
--keyring-passphrase-file <path> When no OS keyring is usable, set up encryption at rest with the passphrase in this file instead of asking.
--no-service Don't register services; you start the daemons yourself. Refused with --docker, which registers none.
--no-modify-path Leave your shell profile alone and print the PATH line to add instead.
--gateway-url <url> With a collector or harness role: the gateway to pair with. Without it, the local network is searched and you confirm what answered.
--trust-fingerprint sha256:… With a collector or harness role: accept the gateway only if its certificate has this fingerprint.
--code <code> With a collector or harness role: the pairing code, for an unattended install. Without it you are asked, which keeps the code out of shell history.
--dry-run Check the flags and platform, print what would be installed, and exit without changing anything.
--no-prompt Never ask. Optional choices take their default, and a required choice stops and names the flag it needs. A sudo password prompt also fails immediately.
OMNESIS_NETWORK_TIMEOUT_SECONDS Environment variable: how long a download may stall before it is retried or fails. Default 300 seconds, at most one day.

scripts/install.sh documents every flag in its header.

First run

The installer may ask up to five questions. It reads the answers from your terminal, not from standard input, because under curl … | sh standard input is the script itself. Each has a flag, so an unattended install can answer in advance.

Question When it is asked Answer it in advance with
Run the gateway as a dedicated account? First, on a Linux host with systemd that has no gateway yet. Optional. --hardened or --no-hardened
Which embedding model? Every gateway install except a hardened one, unless the model is served by an HTTP backend. Required. --embedder <id> or --no-model
What to do without a keyring? Only when the machine has no usable OS keyring. Required. --keyring-passphrase-file <path> or --no-keyring
Set up the agent with Codex? When codex is installed and the agent has no model yet. Optional. Nothing; an unattended install skips it.
Which address should other machines use? After a self-signed or mkcert gateway starts. Optional. Nothing; an unattended install keeps the default.

Embedding model. The installer lists the models built into the CLI, marks a default (the model this machine already uses, or the recommended one), and takes a number. You answer before anything is downloaded, registered or started. --no-model leaves search keyword-only.

No usable keyring. This happens on a headless Linux machine with no unlocked login keyring, or on a Mac whose login keychain is locked. Encryption at rest needs a key the machine can keep, so the installer offers three answers: continue without encryption at rest, protect the key with a generated passphrase file, or stop so you can unlock a keyring first.

The passphrase option creates an owner-only passphrase file, prints a recovery code once (write it down), and configures the services to use it. An install without encryption at rest can add it later with omnesis secure, which backs up, encrypts what is on disk and restarts the gateway. See Encryption at rest.

Codex. The offer appears once an ordinary gateway is healthy, when a codex command is on your PATH and the agent has no model. The installer never runs that command; it only takes it as a sign the offer is relevant. If you accept, Omnesis signs in to ChatGPT with a device code in its own private Codex home, never copying another installation's credentials. It assigns codex/gpt-5.6-luna to the agent only if your account's model list includes it. A failed sign-in or check leaves the agent unassigned and prints how to retry.

Accepting turns on remote inference for the whole gateway: conversation context, relevant Omnesis data and tool results are sent to OpenAI, and any other remote model you configure later is allowed too. Collector, harness, client-only, Docker and hardened installs, and installs with --no-service, never make this offer.

Address for other machines. The installer lists the names and network addresses in the gateway's certificate. Choose one the other machine can reach. It is saved as OMNESIS_GATEWAY_URL and used in the join commands it prints. The default is omnesis.local for a self-signed certificate and <hostname>.local for mkcert; an IP address works on a network without mDNS.

Without a terminal (a container build, a provisioning script, a systemd unit), the installer cannot ask the required questions and refuses rather than choosing for you. Pass their flags and it runs unattended.

Open the portal

Open the portal at the address the installer printed: https://<magicdns-name>:7600/portal/ after a Tailscale certificate, otherwise https://localhost:7600/portal/. With the self-signed certificate your browser warns once; accept it. The portal asks for a pairing code, which you mint on the gateway host:

# the code the portal asks for

❯ omnesis devices pair --kind portal

# are the services up?

❯ omnesis service status

# follow the gateway log

❯ omnesis service logs gateway -f

The CLI on the gateway host needs no login: it uses the gateway's bootstrap admin token. On a Docker install the daemons are containers, so use the docker compose commands under Docker in place of omnesis service.

A phone and a browser are optional. Pair the iOS or Android app by scanning a code from omnesis devices pair --kind ios (or --kind android); see Setup → Phones. The Omnesis Browser Capture extension pairs with omnesis devices pair --kind browser and needs a certificate the browser trusts; see Setup → Browser extension.

Add your first source

❯ omnesis sources add gmail

# or run it bare for an interactive picker across all sources

❯ omnesis sources add

For Google, a wizard walks you through creating your own OAuth client, which takes about five minutes once per install. There is no shared client: your credentials and tokens stay on your machines.

In the portal, use + Add source on the Sources page. Adding, pausing and removing sources is covered in Managing sources, and the full catalogue, with what each source needs, is on Available sources.

Docker

The gateway and collector images are not published yet, so --docker cannot pull them and the install stops. Until they are, use the default source install. To try the Docker stack anyway, run the installer from a checkout of this repository with sh scripts/install.sh --docker --build, which builds the images on the machine.

The Docker install is the same installer with a flag. The gateway and the collector run as containers from published images tagged by release. The host needs Docker with the Compose plugin, curl and a POSIX shell; no Node, checkout or compiler. The installer uses release images only, so it refuses --edge; --version X.Y.Z selects an exact release.

❯ curl -fsSL https://omnesis.dev/install.sh | sh -s -- --docker

It writes ~/.config/omnesis/docker-compose.yml, pulls the images, starts the gateway, waits for it to answer /health, and starts the collector, which pairs itself. The config directory is mounted into the containers at the same absolute path, so the data, the token, the certificate and the compose file are all readable on the host, and a path means the same thing inside and outside the containers.

omnesis on this host is a wrapper that runs the CLI inside the container: the gateway's, or the collector's on a machine that only collects. The source, device, model, TLS, query and update commands on this site work unchanged. The daemons are containers rather than services, so manage them with docker compose instead of omnesis service:

❯ omnesis sources add gmail

❯ omnesis status

# the containers themselves: ps, logs -f, restart

❯ docker compose -f ~/.config/omnesis/docker-compose.yml ps

❯ docker compose -f ~/.config/omnesis/docker-compose.yml logs -f

With no version flag, the installer asks the image registry for its tags, picks the highest stable release available for every image the stack needs, and records that tag so updates and rollbacks are repeatable. OMNESIS_IMAGE_REPO changes the registry used for both the lookup and the pull. Updating is omnesis update, as on any other install.

Tag discovery works only on registries that allow anonymous reads. For a private registry, log Docker in first, then pin an exact release with --version. Paste the token only at Docker's password prompt, never on the installer's command line:

❯ docker login registry.example.com

# enter the registry credentials at Docker's password prompt

❯ curl -fsSL https://omnesis.dev/install.sh | OMNESIS_IMAGE_REPO=registry.example.com/omnesis sh -s -- --docker --version X.Y.Z

The account you log in with must itself have access to the image. If access is denied, the installer prints the docker login <registry> command to run; it never runs that command or reads the token itself.

A second machine that only collects can run its collector in a container too:

❯ curl -fsSL https://omnesis.dev/install.sh | sh -s -- --docker --collector --gateway-url https://<gateway-host>:7600 --trust-fingerprint sha256:<fingerprint>

TLS in Docker

Under Docker the gateway serves its own self-signed certificate unless you give it one. That is enough for the CLI, the phone apps and collectors. It is not enough for browsers or the browser extension, which cannot connect through it at all. For those, issue a certificate on the host and hand it to the container, as below. The container cannot reach the host's Tailscale daemon or install a mkcert authority in your browser, so --mkcert and --no-tls are refused under --docker.

The self-signed certificate covers localhost, the gateway's mDNS names, the service name gateway that the collector container dials, and the host names and LAN addresses the installer passes in. The banner prints the join command for another machine with --trust-fingerprint. A certificate minted earlier is kept, because paired phones and collectors pin it. If it no longer covers the host's name or addresses, omnesis tls renew --force mints a new one, and every phone and collector paired with the old one must pair again.

  1. Issue on the hostTailscale or mkcert writes the certificate, its key and, for a private authority, the root CA into ~/.config/omnesis/tls/
  2. Installer checksThe --tls-* files sit in the config directory, the key matches, and the certificate is valid and names a host
  3. Mounted into the containersthe config directory, at the same path
  4. Gateway container serves itand answers to every name the certificate covers

Inside the compose network

  1. Collector and updaterdial https://<name>:7600 and verify the name, trusting rootCA.pem when you passed --tls-ca

From outside

  1. Browser, extension, phonesdial https://<name>:<published port>; a browser trusts it through a public chain or the authority you installed
You issue the certificate on the host; the installer checks it, the containers see it through the mounted config directory, and every client, inside or outside Docker, reaches the gateway by a name the certificate covers.

With Tailscale on the host, issue the certificate for the machine's MagicDNS name. The host needs what a native install needs: it has joined the tailnet, with MagicDNS and HTTPS certificates enabled. On Linux, tailscale cert runs as root unless your user is the machine's Tailscale operator (tailscale set --operator=$USER); a key written under sudo belongs to root, so chown both files to your user before installing. A publicly chained certificate like this one needs no --tls-ca, and phones paired against it keep working when it renews.

❯ mkdir -p ~/.config/omnesis/tls

❯ tailscale cert --cert-file ~/.config/omnesis/tls/tailscale.crt --key-file ~/.config/omnesis/tls/tailscale.key studio.tail-example.ts.net

❯ curl -fsSL https://omnesis.dev/install.sh | sh -s -- --docker --tls-cert ~/.config/omnesis/tls/tailscale.crt --tls-key ~/.config/omnesis/tls/tailscale.key

With mkcert, issue the certificate for the names you will use and pass the authority's root with --tls-ca. Your browser needs that root installed once, and phones pair against the certificate by fingerprint.

❯ mkcert -cert-file ~/.config/omnesis/tls/mkcert.crt -key-file ~/.config/omnesis/tls/mkcert.key studio-northstar.local localhost

❯ cp "$(mkcert -CAROOT)/rootCA.pem" ~/.config/omnesis/tls/

❯ curl -fsSL https://omnesis.dev/install.sh | sh -s -- --docker --tls-cert ~/.config/omnesis/tls/mkcert.crt --tls-key ~/.config/omnesis/tls/mkcert.key --tls-ca ~/.config/omnesis/tls/rootCA.pem

The installer refuses a file outside the config directory or linked from elsewhere, the gateway's own tls/cert.pem and key.pem, a key that does not match, an expired certificate, one that chains to no trusted root (unless --tls-ca names its authority), and one that names no specific host. A host that only collects (--docker --collector) takes --tls-ca alone, to verify a gateway behind a private authority.

Renewing is up to you: re-issue into the same files with the tool that made them. The gateway picks the new certificate up within the hour, or at once after omnesis tls reload, without a restart. A later run of the installer without the flags keeps the certificate it recorded. What a renewal means for paired clients is in Clients that pinned the old certificate.

What a container cannot do

From source

For development, run the two daemons directly from a checkout:

❯ git clone https://github.com/omnesis-dev/Omnesis.git

❯ cd Omnesis && npm install

# terminal 1

❯ npm run gateway

# terminal 2

❯ npm run collector

# any CLI command

❯ npm run cli -- status

npm run gateway and npm run collector are the checkout's equivalents of omnesis gateway serve and omnesis collector run. npm run collector and npm run cli trust the gateway's self-signed certificate for you. To run them as supervised services instead of in two terminals, use npm run cli -- service install.

To change Omnesis rather than only run it, read the contribution guide first. It covers the repository layout, the checks a pull request must pass, and the tests each kind of change needs.

Uninstall

Removing Omnesis reverses the install you made. Your data stays in the config directory until you delete it, so take a backup first if you may want it back.

1. On a second machine, remove its device from the gateway first. For a collector, move or detach the sources it hosts (see Managing sources), then on the gateway host run omnesis devices revoke <device> --forget, which deletes the device and is refused while it still hosts sources. Revoking a harness machine's device also signs its agent out of its connection.

2. Stop and remove the services and the software, by install shape:

Install Remove it with
Source (default) omnesis service uninstall, then rm -rf ~/omnesis ~/.local/lib/omnesis and rm -f ~/.local/bin/omnesis (use your --source-dir if you set one).
Docker docker compose -f ~/.config/omnesis/docker-compose.yml --profile update down --rmi all, then rm -f ~/.local/bin/omnesis.
Hardened gateway sudo omnesis-gateway-admin uninstall, which removes the service and the releases but keeps /var/lib/omnesis-gateway and the passphrase in /etc/omnesis-gateway. Delete both yourself when you no longer need the data. Remove your own collector and CLI as for a source install.
Client only As for a source install; there are no services.

The installer may also have added a PATH line to your shell profile, under the comment # Added by the Omnesis installer; delete both lines. On a harness machine, remove the Omnesis plugin from OpenClaw or Hermes the way that harness removes plugins.

3. Delete the data and keys, if you want them gone. rm -rf ~/.config/omnesis removes the data, tokens, credentials and, with a passphrase file, the key that opens them. With an OS keyring, the root key is stored there under the service name dev.omnesis: on macOS, run security delete-generic-password -s dev.omnesis until it reports that nothing was found; on Linux, run secret-tool clear service dev.omnesis. On a Mac, also remove the collector from Full Disk Access in System Settings.