Data posture and deployment
Your machines, your record: what the product asks of your infrastructure, what runs centrally, and what it asks you to own.
Your machines, your record. Saphan Studio's execution model is your fleet: the control plane and the runners are machines you own or rent, the record lives in a store on infrastructure you control — an embedded file by default, PostgreSQL when you configure it — and nothing the product runs on a runner listens beyond loopback. The management surfaces bind to loopback by default; widening a bind is a deliberate act, and an ambiguous or unprotected address is refused rather than read as "every interface".
Distribution is deliberately boring. For a fleet machine — a runner, or a machine you
dispatch work to — the one-line install, a deb, an rpm, or the macOS installer delivers the same
four binaries: the CLI (saphan), the agent (saphan-agent), the console (saphan-gateway) and
the server (saphan-server). The packages start no services, write no configuration and touch no
home directory, and every scripted path verifies checksums before anything lands
(Deployment). What runs is inspectable; what is installed is enumerable.
Centrally, the product is a set of processes rather than a single daemon, and each is started by an explicit verb or by the supervisor units you choose to register:
saphan-server— the mailbox and chat integrations, the act authority that verifies a person's passkey before an act is recorded, and the read-only projection of the record.saphan-gateway— the versioned client contract under/v1, and the console screens. Stateless by construction: it owns no database, decision cache or session.saphan-oauth— the OAuth 2.1 authorization server: a standalone issuer publishing its own discovery documents and key set, with seat and client administration. Its issuer name comes from configuration and from no request header, and like an external identity provider it reaches the engine only through the human-gated issuer trust list, never by being present. ⚠ No release artifact carries it today.
Central servers says what each one needs from you.
Identity is the only thing a hosted service should touch. The product doctrine for
Saphan-operated convenience services is fixed and simple: identity passes; data never.
Hosted components exist to make authentication and authorization convenient — they are not a
channel for repository content. ⚠ In this release the browser setup page signs the owner in
through the Saphan portal; a site that wants no outside call at all sets the machine up from a
terminal with saphan install instead.
Deployment postures. Solo runs everything on one machine, management surface on loopback. Team adds shared identity and remote reach; Enterprise differs by features, not by scale caps: the customer's own identity provider behind the issuer trust list (an external provider authenticates; authorization vocabulary and actor binding remain the engine's), and a central PostgreSQL record. ⚠ This release sets up Solo only; Team and Enterprise cannot be chosen at setup yet.
What we ask you to own. Egress control is closed by default: a run reaches only its
backend's model hosts and its declared toolchain registries, and a machine that cannot enforce that
refuses the run rather than running it open. A run is opened only by an explicit, recorded
--egress-open "<reason>". It is still one layer: egress control at your network boundary remains
your responsibility, and runners should hold nothing beyond their own scope
(Egress control is the operator's chapter,
its limits the auditor's statement).
Deployment
What an install is here: which programs a machine gets, which of them run centrally, and which route delivers each.
Machines that are not in the same room
Running work on machines elsewhere, over a private overlay network between them: what joining gives a machine, what it does not give, and what the fleet can see about each one.