Skip to content

Guides

Multi-device memory

Two ways to run Sigil on more than one machine. They solve different problems.

Shared databaseDevice pairing
HowEvery install points at the same PostgresOne master holds the data; followers dial it over Iroh
NeedsA Postgres reachable from every machineOnly the master needs a database
Access controlNone — the connection string is the keyPer-device roles and namespace grants, revocable
Best forYour own machines, managed PostgresA device you don’t fully trust, or one that can’t reach your DB

Start with the shared database. Pairing is the answer when you need revocable, scoped access.

There is no protocol. Point two installs at the same Postgres and they share one brain.

Terminal window
# on every machine
sigil init --url "postgres://user:pass@ep-foo.neon.tech/sigil?sslmode=require"

The second machine runs migrations, finds the schema already current, and starts reading. A fact captured on your laptop surfaces in the next prompt on your server. Consistency is whatever Postgres gives you, which is plenty for personal memory.

  • Laptop and desktop. One memory, no manual sync.
  • Local dev plus a cloud agent. A triage agent on a VPS writes “fixed prod issue X by patching Y”; your morning prompt already knows.
  • Multi-agent workflows. Claude Code, Codex, and a custom agent all hitting the same brain, each write attributed to the agent and device that made it.

By default each install reads only its own namespace. When two installs deliberately write under different namespaces but should still see each other:

defaults.searchNamespaces = ["*"] # or an explicit list

Set it in Settings → General, or per-query with --all-namespaces.

Pairing gives one machine (the master) the database, and lets other devices reach it over an encrypted peer connection — with a role, an expiry, and a revoke button.

Terminal window
sigil pair create --name laptop-b --role writer --ttl 600
Pairing code created — share this with "laptop-b":
code: 7Q2K-9FMD-XR41
master nodeId: k51qzi5uqu5d...
role: writer
namespaces: (all)
expires at: 2026-08-14T17:12:00Z
On the joining device, run:
sigil join k51qzi5uqu5d... 7Q2K-9FMD-XR41 --name laptop-b

The plaintext code is printed once and never stored. Hand it over out of band.

RoleGrants
readerRead-only — search, status
writerRead and write — remember, ingest (default)
adminFull access, including device management

Restrict which namespaces a device can touch with --ns:

Terminal window
sigil pair create --name ci-runner --role reader --ns engineering --ttl 300
Terminal window
sigil join <master-node-id> <pairing-code> --name laptop-b

Iroh resolves the master’s transport details automatically. Override them when you need to:

Terminal window
sigil join <node-id> <code> --addresses 10.0.0.5:4433 --relay https://relay.example
sigil join <node-id> <code> --lite # lite-follower: proxy everything, store nothing locally

Joining flips this install’s network mode to follower (or lite-follower) and records the master’s node id.

Terminal window
sigil pair list # outstanding codes
sigil pair revoke <id> # kill a code, or a paired device

The dashboard’s Devices screen shows the same thing with pending codes, roles, and last-seen times.

Some facts are true on exactly one machine. A local path, a port number, a piece of hardware. Sharing them across devices makes memory actively wrong.

Terminal window
sigil visibility <fact-id> device # only the machine that wrote it
sigil visibility <fact-id> shared # everywhere (the default)
sigil visibility <fact-id> agent # only the agent that wrote it

Sigil’s extractor scopes obvious cases on its own. visibility is the correction. Changes take effect on the next read, on every device.

See Provenance and visibility.

Every fact records which agent and which device wrote it. That’s what makes a shared brain debuggable rather than a soup — the dashboard’s Activity screen filters by agent, and sigil why shows the pods a fact came through.

GoodWatch out for
NeonServerless, generous free tier, pgvector one clickCold starts on the free plan add latency to the first search
Supabasepgvector preinstalled, easyConnection limits on small plans
Self-hosted on a VPS/NASNo third party, no limitsYou operate it, and every device needs to reach it
RDS / Cloud SQLBoring and reliablepgvector needs a parameter group change

Whatever you pick: use sslmode=require, and treat the connection string as a credential. It is the only thing standing between someone and your entire memory.