CivPort
CivPort is the static, client-side, key-sovereign application through which participants make and read Civic declarations on Blurt. It is the app half of CivLayer, planned as three surfaces behind one shell — Civic Registry · Trust Center · Civic Explorer. Repo: blurt/civlayer/civport.
Phased, work in progress
Today CivPort ships the Civic Registry tab (register-membership wizard + the exit flow), aligned to the civic/0.3 contract. Trust Center and Civic Explorer ship in later phases behind the same shell.
What it does today
The Civic Registry walks a participant through becoming a member of CIV0 (the Blurt civilization):
- Publish the four readable CDO posts (Manifest + Charter + Declaration + Oath) with the posting key.
- Broadcast one immutable
custom_jsonmembership anchor (id: "civic",graph: "membership",action: "register",spec: "civic/0.3") with the active key, carrying the post permlinks + SHA-256 hashes and the Custody Disclosure.
It also handles the exit flow — renounce (Citizens) or leave (Organisations / Agents) — which returns the account to Pioneer.
Keys never leave the browser
CivPort is key-sovereign: signing happens locally, and the app never holds keys server-side (it is static — there is no server).
- Keychain / WhaleVault preferred. When the extension is present it signs each op with the correct key — posting for the posts, active for the anchor — and you paste nothing. Extensions inject only on recognised Blurt domains, and only over
http(s)(notfile://). - Pasted keys are validated against the account's on-chain authority before any broadcast (posting against posting, active against active). Owner/master keys are rejected in the page, and pasted keys are cleared immediately after signing.
Custody Disclosure
Part of registration is a Custody Disclosure: five domains (social, transactional, privacy, ownership, master), each declared Self | Threshold | Custodial, plus a custody policy (Self-Custody / Earned / Scheduled / Custodial-Indefinite / Custody-Null). The self-custodial choices append an irreversibility acknowledgement to the Charter.
How it's built
A single static shell plus small, single-responsibility JS modules — the mode is set once in <head> (window.CivPort_MODE):
| File | Responsibility |
|---|---|
index.html | app shell, Civic Registry tab, the 4-step register wizard, the exit flow |
js/rpc.js | node failover + session-node pinning; getAccount/getContent; broadcastComment (posting); broadcastCustomJson (active, required_auths); classifyKey |
js/signer.js | the signer seam: KeySigner (pasted WIFs), KeychainSigner, WhaleVaultSigner |
js/templates.js | single source of truth for payload/document shapes (CDO renderers, buildDeclarePayload, buildExitPayload, …) |
js/schemas.js | the embedded civic/0.3 JSON Schemas + the pre-broadcast validator; exports the SPEC const |
js/config.js | single-source app config (versions, burn amounts, carrier) and DOM interpolation for displayed values |
js/app.js | the wizard state machine, hashing, broadcast ledger, downloads, exit and operated-account flows |
Because it is a static client that talks straight to Blurt RPC (with node failover) and signs locally, CivPort has no backend of its own — reads that need a derived view (the future Trust Center / Explorer) come from the CivLayer indexer.
Local artifacts
After registering, the participant keeps local copies: the four CDO .md documents exactly as published, and a civic-profile.json (civic/profile/0.3) keepsake — with recognition/trust left null, since those are explorer-derived.
