DEPLOYMENTS

launchd on macOS, systemd on Linux. Per-machine daemon, scheduler, keep-alive, logs.

11 / 16·ops·v0.14.4

Topologies alpi is designed to support. Each section is a reference shape — pick the closest one to what you want, read the trade-offs, adapt. For the primitives each shape leans on see PROFILES.md (identity + isolation) and ALP.md (the wire protocol).

The shapes below are technical deployment patterns, not pricing tiers. Personal use, evaluation, and non-production deployments are free. Commercial production deployments are covered by the terms in LICENSE; contact info@satoshi-ltd.com when you are planning that rollout.

1. Laptop only

The baseline. One profile, one machine, TUI or desktop app for chat.

┌─────────────────────────────────────┐
│ laptop                              │
│                                     │
│   alpi (TUI / desktop)              │
│     │                               │
│     ├─ ~/.alpi/  (default profile)  │
│     └─ alpi daemon                  │
│          ├─ scheduler (cron)        │
│          ├─ ALP listener            │
│          ├─ workgroups poller       │
│          └─ host plane (default)    │
└─────────────────────────────────────┘

2. Laptop + home server

Heavy work (schedules, long research, cron jobs) runs on a home server; interactive chat stays on the laptop. Linked via ALP over Tailscale (or over Unix sockets if you're on the same machine, but that'd just be two profiles — see topology 3).

┌──────────────────┐                ┌──────────────────────┐
│ laptop           │                │ home server          │
│                  │   ALP.2 over   │                      │
│  alpi (TUI)      │───Tailscale───▶│  alpi daemon         │
│  ~/.alpi/        │                │  ~/.alpi/            │
│  peers: home     │                │  peers: laptop       │
│                  │◀───────────────│  (reaches back only  │
│                  │   link.ask     │   for link.ask)      │
└──────────────────┘                └──────────────────────┘

2a. Docker home server

The packaged form of the home-server topology. The daemon runs inside a container as PID 1, stores the Alpi root on a mounted volume, and exposes the host plane (and optionally the ALP peer port) so desktop / mobile clients pair to it. No web terminal — reach the TUI with docker exec.

┌──────────────────────────────────────┐
│ Linux host (Docker)                  │
│                                      │
│  container: satoshiltd/alpi          │
│    alpi daemon (PID 1)               │
│      ├─ scheduler                    │
│      ├─ ALP listener (:7423)         │
│      ├─ workgroups poller            │
│      └─ host plane (:49200)          │
│                                      │
│  /data  (mounted volume → .alpi)     │
└──────────────────────────────────────┘
        │ :49200 pairing · :7423 ALP
        ▼  bound to the host address clients dial

Public client access through WSS

Internet-facing Desktop/Mobile access uses a TLS reverse proxy. The daemon continues speaking plaintext WebSocket only inside the private host or Compose network:

client -> wss://your.domain.com:443 -> Caddy -> alpi:49200

Use the supplied docker-compose.wss.yml overlay and docker/Caddyfile. The overlay publishes Caddy on 80/443, removes the base mappings for 49200 and 7423, and forwards to the effective ALPI_HOST_TCP_PORT over the private Compose network. It requires Docker Compose 2.24.4 or newer for !reset.

The operator must still complete four independent steps:

  1. point ALPI_DOMAIN in public DNS at the Docker host;
  2. allow public TCP 80/443 and deny the daemon ports;
  3. configure wss://your.domain.com as the Public route under alpi setup -> Connections -> Network;
  4. create a scoped connection and test its pairing from an external network.

Customer isolation boundary

Use one independent Alpi runtime per mutually untrusted customer: a dedicated container, VM, or OS account with its own Alpi home/volume and credentials. Route one hostname to each runtime through the shared TLS proxy; keep every runtime's host and ALP ports private.

A connection role and profile_scope restrict the host RPC surface. They do not make profiles inside one daemon separate tenants: an authenticated member can still send turns, and those turns may use every tool granted to the target profile. Multiple profiles in one daemon are appropriate only when they share the same underlying trust owner. Runtime isolation lets a customer profile keep the terminal, skills, and network access it genuinely needs without granting that runtime access to another customer's volume or credentials.

Existing clients keep the URL selected at their original pairing. A device stored as ws://HOST_IP:PORT does not automatically adopt the new Public route and goes offline when the overlay removes that mapping. Re-pair each existing physical client through Add device on its current connection, select WSS, verify it, then revoke the old direct-WS device credential. The connection's role and profile scope remain unchanged.

!reset is scoped to the named Compose service. The supplied overlay protects alpi only; every additional service such as the commented alpi-2 template must remove/reset its own ports: and receive its own Caddy upstream.

The proxy and the advertised route are deliberately separate: starting Caddy does not mint credentials or rewrite Alpi config, and adding host.endpoints does not open a port or obtain a certificate. See the complete commands, certificate checks, update procedure and custom-port behavior in docker/README.md.

3. One machine, many profiles

Same machine, multiple profiles with different roles, linked intra-profile via ALP.1 (Unix sockets). This is the private-network starter kit on a single host.

┌────────────────────────────────────────────────────┐
│ single machine                                     │
│                                                    │
│  ~/.alpi/profiles/assistant/  ← daily driver       │
│  ~/.alpi/profiles/researcher/ ← deep-research role │
│  ~/.alpi/profiles/cron/       ← scheduled jobs     │
│                                                    │
│  intra-machine ALP = Unix-domain sockets           │
│      (~/.alpi/profiles/<name>/alp/alp.sock)        │
│                                                    │
│  assistant  ──@researcher──▶  researcher           │
│  assistant  ──@cron──────▶    cron                 │
│  researcher ──@cron──────▶    cron                 │
└────────────────────────────────────────────────────┘

4. Multi-device personal

Your alpis follow you across devices (laptop + desktop + phone) over Tailscale. Each device runs its own profile with its own identity; all mutual peers.

┌──────────────┐       ┌──────────────────┐       ┌──────────────┐
│ laptop       │       │ phone (Termux /  │       │ home desktop │
│ alpi         │◀──────│  iSH)            │──────▶│ alpi         │
│              │       │  alpi (minimal)  │       │              │
└──────┬───────┘       └────────┬─────────┘       └──────┬───────┘
       │                        │                        │
       └────────── ALP.2 over Tailscale ──────────────────┘
                 (every device pinned to every other)

5. Family / small team

Multiple humans, each with their own alpi, optionally sharing a workgroup. Hub-anchored.

┌──────────────┐       ┌──────────────┐       ┌──────────────┐
│ Jane's alpi  │       │ Raj's alpi   │       │ Mia's alpi   │
│ (laptop)     │       │ (laptop)     │       │ (laptop)     │
└──────┬───────┘       └──────┬───────┘       └──────┬───────┘
       │                      │                      │
       └──────────────────────┴──────────────────────┘
                              │
                   ┌──────────▼───────────┐
                   │ home-server alpi     │
                   │ (the workgroup hub)  │
                   │                      │
                   │ workgroup: household │
                   │   members: Jane,     │
                   │            Raj, Mia  │
                   └──────────────────────┘

6. Enterprise — private agent network

Per-employee profiles, mesh linked via ALP.2 over Tailscale or a VPN. Shared services (research-bot, tools-bot) as pinned peers with narrow capabilities. Audit trail centralised.

┌──────────────────────────────────────────────────────────────┐
│ corporate Tailscale network                                  │
│                                                              │
│  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐  ┌──────┐            │
│  │Jane  │  │Raj   │  │Mia   │  │Léa   │  │... N │            │
│  │alpi  │  │alpi  │  │alpi  │  │alpi  │  │      │            │
│  └──┬───┘  └──┬───┘  └──┬───┘  └──┬───┘  └──┬───┘            │
│     │         │         │         │         │                │
│     └─────────┴─────────┴─────────┴─────────┘                │
│                       │                                      │
│              ┌────────┴─────────┐                            │
│              │                  │                            │
│    ┌─────────▼──────┐    ┌──────▼─────────┐                  │
│    │ research-bot   │    │ tools-bot      │                  │
│    │ (shared, RO)   │    │ (HR queries,   │                  │
│    │                │    │  calendar, …)  │                  │
│    └────────────────┘    └────────────────┘                  │
│                       │                                      │
│              ┌────────▼──────────┐                           │
│              │ audit + log hub   │                           │
│              │ (aggregates       │                           │
│              │  agent.log,       │                           │
│              │  approval.log)    │                           │
│              └───────────────────┘                           │
└──────────────────────────────────────────────────────────────┘

What alpi does not try to solve at enterprise scale

Deliberately out of scope, so users don't wait for features that aren't coming:

Choosing your shape

You are…Start withUpgrade path
A single user on one machine(1) Laptop only→ (4) Multi-device when you get a second device.
A user with a NAS / home server(2) Laptop + home server→ (3) add specialised roles on the home server.
A user wanting role-based alpis(3) One machine, many profiles→ (5) if the household wants in.
A family / small team(5) Family / small team→ (6) when it stops being a household.
A company(6) Enterprise (commercial path)
theme