Skip to content

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):

  1. Publish the four readable CDO posts (Manifest + Charter + Declaration + Oath) with the posting key.
  2. Broadcast one immutable custom_json membership 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) (not file://).
  • 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):

FileResponsibility
index.htmlapp shell, Civic Registry tab, the 4-step register wizard, the exit flow
js/rpc.jsnode failover + session-node pinning; getAccount/getContent; broadcastComment (posting); broadcastCustomJson (active, required_auths); classifyKey
js/signer.jsthe signer seam: KeySigner (pasted WIFs), KeychainSigner, WhaleVaultSigner
js/templates.jssingle source of truth for payload/document shapes (CDO renderers, buildDeclarePayload, buildExitPayload, …)
js/schemas.jsthe embedded civic/0.3 JSON Schemas + the pre-broadcast validator; exports the SPEC const
js/config.jssingle-source app config (versions, burn amounts, carrier) and DOM interpolation for displayed values
js/app.jsthe 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.

See also

  • Overview — the three layers and the indexer.
  • Civic — the framework and the civic/0.3 contract CivPort implements.

Released under the MIT License.