Account sign-in for your instance
Let people who hold a hosted account come back to your instance by signing in, by declaring which verifier your instance trusts. Hosted instances get this from provisioning; self-hosted instances opt in.
A person who was let into your instance can always come back with a key they kept (Keeping your access). Account sign-in is the convenience on top: a signed-in hosted account can find that person's key again on any device, so they never have to carry the line themselves.
Your instance decides whether to accept it, by declaring a verifier. No
declaration, no account proof: the instance lists only recovery_code under
proof_kinds_accepted on GET /health, and Studio shows nothing
account-shaped on it. Nothing is on by default.
What the instance trusts, and what it never sees
The verifier is a service that vouches for who a signed-in person is. It signs a short assertion (two minutes) naming a subject, the principal, your instance's DID, and an expiry. Your instance checks the signature against the public key it declared, checks that the principal has bound that subject, and only then mints a credential under the person's existing grant.
The subject is a per-instance hash: sha256(instance DID, newline, the account's stable id). Your instance never sees the account provider, an email,
or an account id, and two instances cannot join their lists on it, because the
salt (your DID) differs.
Revoking the declaration withdraws the proof everywhere on your instance at once; every person's kept key keeps working, because the key is a different proof.
Hosted instances
Instances provisioned on syncropel.app declare the provisioning service's
verifier automatically at boot (the value arrives with the machine's
environment as SPL_ACCOUNT_VERIFIER). Instances provisioned before the
verifier existed receive it when the operator adds that environment value; the
next boot writes the declaration and GET /health lists account.
Self-hosted instances
You choose. To accept the hosted verifier, set the same environment value on your daemon before it starts:
export SPL_ACCOUNT_VERIFIER="<value published for the hosted verifier>"
spl serve --daemonTo accept your own verifier instead (for example, your organisation's sign-in
service signing the same assertion shape), publish its Ed25519 public key the
same way: the value is base64 of
{"subject_rule":"sha256(instance_did\naccount_subject)","verifier_id":"<your id>","verifier_pubkey":"ed25519:<64 hex>"}
with keys in alphabetical order and no whitespace. Your verifier must compute
the subject with exactly that rule, or every proof fails, constant-shape.
To stop accepting account proofs, remove the value and restart, or write a
superseding declaration with "revoked": true for the same verifier_id.
Passkeys: declaring the relying party
A passkey is bound to a relying party (a domain) and the browser refuses to
use it anywhere else. Your instance declares which one it accepts the same way
it declares the verifier, with SPL_PASSKEY_RP: base64 of
{"origins":["https://studio.syncropel.com","https://syncropel.com"],"rp_id":"syncropel.com"}
(keys alphabetical, no whitespace). Hosted instances receive the hosted
Studio's relying party from provisioning; the relying party is the apex
domain so passkeys keep working if Studio's address changes. A self-hosted
instance that serves Studio from its own host declares its own host and
origins. No declaration, no passkey: proof_kinds_accepted omits it and Studio
does not offer one.
Checking it
curl -s https://<your-instance>/health | jq .proof_kinds_accepted
# ["recovery_code"] nothing declared
# ["recovery_code","account"] a live verifier declaration
# ["recovery_code","account","passkey"] and a relying party tooThe doors a client uses are documented under Self:
binding an account subject is POST /v1/self/bindings with kind: account,
and coming back is POST /v1/recredential with kind: account and the
verifier's assertion as evidence.
The sandboxed transport
Run every work loop in a separate isolated process instead of inside the daemon. How to turn it on and off, what the kernel judges per tool call, the admission ceiling, what changes on your machine, and how to verify it on your instance.
Actor portability
Export an actor's identity + work trail from one Syncropel instance and import it into another. What migrates, what doesn't, and the consent implications.