Developer Docs Identity Profiles
PHASE 11

Identity Profiles

The MuseHub profile is the public face of a cryptographic identity — not a social media card. Every entity in the ecosystem (human, agent, or org) is defined by what it signs, what it creates, and what it attests to. The profile page makes all of that legible, beautiful, and machine-readable simultaneously. Profiles are archetype-aware: humans, agents, and organisations share a unified shell but render archetype-specific panels.

Three archetypes

Every identity in MuseHub has an identity_type of human, agent, or org. This single field drives every adaptive rendering decision on the profile page — colour palette, core glyph shape in the Spectral Sigil, which panels are shown, and which API fields are populated.

text identity archetypes
┌─────────────────────────────────────────────────────────────────────┐
│                    IDENTITY ARCHETYPES                              │
├─────────────────┬──────────────────────┬────────────────────────────┤
│  HUMAN          │  AGENT               │  ORG / COLLECTIVE          │
│  Root of trust  │  Bounded intelligence│  Federated governance      │
│  MSign Ed25519  │  Trust chain from    │  Multi-sig quorum          │
│  BIP39 mnemonic │  spawned_by handle   │  member roster on-chain    │
│  AVAX address   │  model_id + scope    │  proposal voting weight    │
│  Bio + socials  │  capabilities list   │  treasury address          │
└─────────────────┴──────────────────────┴────────────────────────────┘

The profile URL is always /{handle}. The server resolves the handle against musehub_identities, detects identity_type, and renders the appropriate template variant. There is no separate /agents/{handle} path — humans, agents, and orgs are all first-class citizens at the same URL scheme.

Human profile layout

text human profile
╔══════════════════════════════════════════════════════════════════════╗
║  [Spectral Sigil]  gabriel                         29 REPOS         ║
║                    @gabriel · human · verified    3,324 COMMITS     ║
║                    "Building the sound of the      24 DAY STREAK    ║
║                     future"                       3,324 THIS YEAR   ║
╠══════════════════════════════════════════════════════════════════════╣
║  AVAX · Ed25519 fingerprint · Registered date · Pinned repos        ║
╠══════════════════════════════════════════════════════════════════════╣
║  ACTIVITY CANVAS — 52 weeks × 5 domains                             ║
║  CODE  ░░░░▒▒▓▓██▓▓▒░░ …                                           ║
║  MUSIC ░░▒▒▓▓████▓▒▒░░ …                                           ║
║  MIDI  ░░░▒▒▓▓███▓▒░░░ …                                           ║
║  PROSE ░▒▒▒▓▓▒░░░░▒▒▒▓ …                                           ║
║  MPAY  ░░░░▒▒▒▓▓▓████▓ …                                           ║
╠══════════════════════════════════════════════════════════════════════╣
║  ATTESTATIONS RECEIVED       ATTESTATIONS GIVEN                     ║
╠══════════════════════════════════════════════════════════════════════╣
║  CRYPTOGRAPHIC PROVENANCE CHAIN                                     ║
╠══════════════════════════════════════════════════════════════════════╣
║  AGENT FLEET  [mix-engine-7] [stori-bot] [maestro-9]               ║
╠══════════════════════════════════════════════════════════════════════╣
║  REPOS  [musehub] [muse] [agentception] [Stori] …                  ║
╚══════════════════════════════════════════════════════════════════════╝

Agent profile layout

text agent profile
╔══════════════════════════════════════════════════════════════════════╗
║  [Spectral Sigil]  mix-engine-7                TRUST CHAIN         ║
║                    @mix-engine-7 · agent       gabriel →            ║
║                    model: claude-opus-4-6      this agent           ║
║                    spawned by: @gabriel                             ║
╠══════════════════════════════════════════════════════════════════════╣
║  CAPABILITIES & SCOPE                                               ║
║  ✓ read:repos  ✓ write:repos  ✓ mpay:send  ✗ admin:hub            ║
║  expires: 2026-06-01 · max_spend: 500,000 nanoMUSE/session         ║
╠══════════════════════════════════════════════════════════════════════╣
║  WORK LEDGER (last 30 days)                                         ║
║  Commits signed: 47  · Stems attested: 23 · Payments sent: 891    ║
╠══════════════════════════════════════════════════════════════════════╣
║  CRYPTOGRAPHIC PROVENANCE CHAIN                                     ║
╚══════════════════════════════════════════════════════════════════════╝

Org profile layout

text org profile
╔══════════════════════════════════════════════════════════════════════╗
║  [Spectral Sigil]  darkroom-collective         TREASURY             ║
║                    @darkroom-collective · org  AVAX: 0xabc…def     ║
║                    quorum: 3/5 members         multi-sig            ║
╠══════════════════════════════════════════════════════════════════════╣
║  MEMBER ROSTER                                                      ║
║  @gabriel (admin, weight: 2) · @aaronrene (member, weight: 1) …   ║
╠══════════════════════════════════════════════════════════════════════╣
║  OPEN PROPOSALS                                                     ║
║  #4 "Release v2 stems"  votes: 2/5  ⏳  #3 "Add member"  ✅        ║
╚══════════════════════════════════════════════════════════════════════╝

Spectral Sigil

The Spectral Sigil is a content-addressed SVG avatar generated deterministically from an identity's sha256 genesis ID and archetype. It is not an image you upload — it is derived from who you are in the graph. Same identity → same sigil, forever.

Route

http avatar route
GET /avatars/{algo}/{hex}.svg

The algo-in-path convention matches the object store — no colons in URLs, no ambiguity. The canonical identity_id is reconstructed server-side as {algo}:{hex} for the DB lookup. Currently only sha256 is supported. The response carries Cache-Control: public, max-age=31536000, immutable — content-addressed means it never changes, so it can be cached forever.

bash fetch a sigil
curl http://staging.musehub.ai/avatars/sha256/41dfaf048e4979cb767fd43e9c82c42cccbb402ab02a8b2cc329c8b778f7c841.svg

Five layers

Every Spectral Sigil is composed of five deterministic layers:

text layer derivation
Layer 1 — Chromatic Field    bytes 0–3    hue 0–359°; archetype sets palette register
Layer 2 — Archetype Core     bytes 4–7    human=bezier blob, agent=hex circuit, org=N-gon
Layer 3 — Orbital Rings      bytes 8–15   2 ellipses at unique rotations + eccentricities
Layer 4 — Domain Dots        bytes 16–23  dots on orbits, colored by live domain activity
Layer 5 — Handle Initial     —            first char of handle, centered monospace

Palette registers by archetype

ArchetypeSaturationLightnessCharacter
human70%48%warm, earthen, organic
agent90%50%cold, electric, high-contrast
org60%55%amber-gold, federated

Domain dot colors

Domain dots appear on the orbital rings colored by actual activity. If no activity exists yet (genesis state), dots are rendered in grayscale at 40% opacity — the sigil is dormant, waiting to awaken.

DomainColorRepresents
code#388bfdcommits, symbol changes
music#bc8cffstem uploads, audio events
midi#3fb950MIDI sequences, note events
prose#f0883eissues, proposals, docs
mpay#d29922payment claims sent/received

Hue derivation

python musehub/services/spectral_sigil.py
def derive_hue(identity_id: str) -> int:
    # First 4 bytes of the sha256 hex → integer → hue 0-359
    raw = int(identity_id[:8], 16)
    return raw % 360

Profile manifest

The unified profile endpoint returns an archetype-aware JSON manifest. All three archetypes share a common envelope; archetype-specific fields are present only when relevant.

json human profile manifest
{
  "handle":          "gabriel",
  "identity_type":   "human",
  "identity_id":     "sha256:41dfaf048e4979cb…",
  "bio":             "Building the sound of the future",
  "avax_address":    "0x1a2b3c4d5e6f…",
  "public_key":      "ed25519:3aB7kLmNpQ2rS4tU…",
  "fingerprint":     "sha256:41dfaf04…",
  "registered_at":   "2026-04-27T00:00:00Z",
  "archetype": {
    "activity_canvas":      "…",
    "attestation_badges":   [],
    "mpay_totals":          { "sent_nano": 0, "received_nano": 0 },
    "org_manifest":         null,
    "agent_trust_chain":    null
  },
  "stats": {
    "repo_count":    29,
    "commit_count":  3324
  }
}

For identity_type: "agent", the manifest includes agent_trust_chain (the spawned-by chain back to a human root), agent_capabilities, and expires_at. For identity_type: "org", it includes org_manifest with the member roster, quorum threshold, and treasury address.

REST endpoint

http fetch profile manifest
GET /api/profiles/{handle}

No authentication required for public profiles.

Attestations

Attestations are how a profile acquires verified claims — that gabriel is human, that claude-code is a trustworthy agent, that a specific commit was code-reviewed. They render here as the attestation_badges on the manifest, but they are fundamentally a signing operation and live with the rest of the identity stack. See Attestations on the Cryptographic Identity page for the canonical message format, the 17 claim types, the three scopes (identity / repo / commit), the REST API, and the muse hub attestation CLI.

MPay ledger

Every profile shows a live payment ledger — total nanoMUSE sent and received, with a chain of linked claims. MPay claims are Ed25519-signed off-chain receipts. On-chain settlement to AVAX C-Chain is optional and produces a settled_tx_hash badge on the profile.

Canonical message format

text canonical MPay message
MPAY\n{sender}\n{recipient}\n{amount_nano}\n{nonce_hex}

The nonce_hex links claims into a chain — each payment references the previous claim's nonce, making the ledger tamper-evident without a blockchain. On-chain settlement is a separate optional step that writes a settled_tx_hash to the claim row.

MPay API

MethodPathDescription
POST /api/profiles/{handle}/mpay-claims Record a signed payment claim
GET /api/profiles/{handle}/mpay-ledger Fetch sent + received totals and recent claims
json mpay-ledger response
{
  "handle":          "gabriel",
  "sent_nano":       1200000,
  "received_nano":   890000,
  "claim_count":     47,
  "recent_claims": [
    {
      "from_handle":  "gabriel",
      "to_handle":    "aaronrene",
      "amount_nano":  500000,
      "nonce_hex":    "a3f2c9d8…",
      "memo":         "stem collab session",
      "settled":      false
    }
  ]
}

Activity canvas

The activity canvas is a 52-week × 5-domain heatmap that shows the full creative output of an identity — not just commit frequency. It is unique to Muse: no other version control platform tracks code, music, MIDI, prose, and payments in a single unified grid.

text activity canvas grid
Domain   Week 1        Week 2        …   Week 52
CODE     ░░░▒▒▓▓██▓▓▒  ░░▒▒▓▓█████▓  …  ▒▒▓▓▓▒░░
MUSIC    ░░▒▒▓▓████▓▒  ▒▒░░░▒▒▓▓▓▒░  …  ░░▒▒▓▓██
MIDI     ░░░▒▒▓▓███▓▒  ░▒▒▓▓███████  …  ▓▓▒░░░▒▒
PROSE    ░▒▒▒▓▓▒░░░░▒  ░░░░▒▒▒▒▒▓▓▒  …  ░▒▒▒▒▓▓▓
MPAY     ░░░░▒▒▒▓▓▓██  ████▓▓▒▒░░░░  …  ▒░░░░░▒▒

Legend: ░ none  ▒ low  ▓ medium  █ high

Each cell is an intensity value 0–4, derived from commit counts (code), upload counts (music/midi), word counts (prose), and claim counts (mpay) for that day. The intensity scale is normalised per-domain so low-activity domains don't appear permanently dark.

Agent profiles

Every agent spawned in the ecosystem gets a profile at /{handle}. The profile shows the full trust chain back to a human root, the agent's declared capabilities and scope, its expiry date, and its work ledger for the last 30 days.

An expired agent's profile is still verifiable — all its past signed commits remain tamper-evident in the DAG — but the profile clearly marks the credential as expired. Future pushes from that agent will be rejected by the hub.

json agent trust chain in manifest
{
  "handle":              "mix-engine-7",
  "identity_type":       "agent",
  "spawned_by":          "gabriel",
  "agent_model":         "claude-opus-4-6",
  "agent_capabilities":  ["read:repos", "write:repos", "mpay:send"],
  "expires_at":          "2026-06-01T00:00:00Z",
  "archetype": {
    "agent_trust_chain": [
      { "handle": "gabriel",     "type": "human" },
      { "handle": "mix-engine-7", "type": "agent" }
    ]
  }
}

Org profiles

An org is a collective of humans and agents operating under a shared identity with multi-sig quorum governance. The org profile shows the member roster with voting weights, open proposals, and the shared AVAX treasury address.

The Spectral Sigil for an org uses the quorum polygon archetype — an N-gon where N (5–8 sides) is derived from the identity_id, with diagonal weights that vary edge thickness to reflect the hierarchy of voting weights within the collective.

json org manifest
{
  "handle":       "darkroom-collective",
  "identity_type": "org",
  "archetype": {
    "org_manifest": {
      "members": [
        { "handle": "gabriel",   "role": "admin",  "voting_weight": 2 },
        { "handle": "aaronrene", "role": "member", "voting_weight": 1 },
        { "handle": "stori-bot", "role": "member", "voting_weight": 1 }
      ],
      "quorum":            3,
      "treasury_address":  "0xabc…def"
    }
  }
}

API reference

MethodPathAuthDescription
GET /avatars/{algo}/{hex}.svg none Spectral Sigil SVG — immutably cached
GET /api/profiles/{handle} none Full archetype-aware profile manifest
GET /api/profiles/{handle}/attestations none Attestations received by this handle
POST /api/profiles/{handle}/attestations MSign Issue a signed attestation
DELETE /api/profiles/{handle}/attestations/{id} MSign Revoke (sets revoked_at, audit trail preserved)
POST /api/profiles/{handle}/mpay-claims MSign Record a signed MPay claim
GET /api/profiles/{handle}/mpay-ledger none Sent + received totals and recent claims

MCP tools

All profile operations are available as MCP tools so agents can read profiles, issue attestations, and record payments without direct HTTP calls.

Tool nameDescription
musehub_read_profile_manifestFull archetype-aware manifest for any handle
musehub_issue_attestationSign + post an attestation claim
musehub_revoke_attestationRevoke an existing attestation by ID
musehub_list_attestationsQuery attestations received by a handle
musehub_record_mpay_claimRecord a signed MPay payment claim
musehub_get_mpay_ledgerSent + received totals for a handle
What makes this different
These are not social features bolted onto a code host. Every attestation is an Ed25519-signed cryptographic claim verifiable without trusting MuseHub. Every payment claim chains nonces into a tamper-evident ledger. Every profile sigil is derived from the identity's genesis hash — it cannot be faked or transferred. The same key that signs your commits signs your attestations and authorises your payments.