Skip to content

Civic

Civic is two things at once: the framework — a constitution plus a catalog of specifications — and the on-chain namespace, civic/<version> (currently civic/0.3), that those specs define. Repo: blurt/civlayer/civic.

Versioned and evolving

civic/0.3, Constitution v0.9.6. Payloads are additive across versions, but the contract is still moving — treat this as the shape, and read the repo's SCHEMAS/ and PAYLOADS/ for the authoritative current form.

The contract (civic/0.3)

  • One on-chain id. Every civic declaration is a custom_json with id: "civic". The payload's graph + action distinguish it — there is no civic_declare / civic_revoke id, and no per-action id.
  • Graph + action. graph selects the domain (trust, membership, … — six graphs); action is the verb within that graph. A parser routes on the pair and validates the rest against the graph's schema.
  • Key / signing matrix. Civic declarations (anchors and exits) are active-key custom_json; the readable membership posts are posting-key comment ops. The acting account is always read from required_auths[0], never from a field in the payload.
  • Action, not status. The chain records what happened. Recognition tiers and trust scores are explorer-derived and never authored on-chain (recognition.tier, trust.* are null at write time).
  • Schema-validated. Every payload is validated against its JSON Schema (draft 2020-12) before broadcast.

Graphs

The graph field selects the domain of a declaration. Two are the most developed:

  • membership — joining and leaving a civilization (see Membership below).
  • trust — trust declarations between accounts (the graph the indexer projects into /trust/given, /trust/received, /trust/feed). The optional context message is length-capped by the payload spec.

Additional graphs (identity, association, authority, endorsement) round out the "voluntary digital association" surface; each ships as a payload spec + JSON Schema in the framework.

Membership

Membership is tiered: CIV0 is the Blurt civilization, with sub-civilizations addressed through a civilization target. An account joins CIV0 by:

  1. Publishing four readable CDO posts (posting key): a Civic Affirmation Manifest as the thread root, with the Civic Charter, Civic Declaration, and Civic Oath threaded beneath it as comments.
  2. Broadcasting one immutable custom_json anchor (active key) with id: "civic", graph: "membership", action: "register", spec: "civic/0.3", the post permlinks + their SHA-256 hashes, and a Custody Disclosure.

Membership is durable and ends only by an explicit exit — renounce (human / cybernetic Citizens) or leave (Organisations / Agents) — which returns the account to Pioneer (the pre-membership state).

The framework repo

The civic/ framework is a documentation-and-spec tree, not a service:

text
Civic/
  FOUNDING/       constitution, declaration of independence, guarantees, recognition
  ARCHITECTURE/   layers, account classes, graph taxonomy, economic security
  REGISTRY/       declaration catalog, Explorer spec, onboarding flow
  PAYLOADS/       per-graph payload specs (standard + graphs)
  SCHEMAS/        JSON Schemas (envelope + graphs + profile)
  TEMPLATES-shared/  charter, declaration, manifest, civic-profile.json
  KITS/           per-account-class onboarding packs
  REFERENCE/      glossary, principles
  PROJECT/        state, hierarchy, changelog, open items

Good entry points: the constitution (FOUNDING/), what you can declare (REGISTRY/), and the data shapes (PAYLOADS/ + SCHEMAS/).

See also

  • Overview — how Civic, CivPort, and the indexer fit together.
  • CivPort — the app that makes and reads these declarations.

Released under the MIT License.