Permanence & DID
chitin.id is just a cache layer. Every soul record is written directly to Base L2 and Arweave — and can be fully recovered even if chitin.id ceases to exist.
Where the Data Lives
The on-chain anchor. If you have this, you can reach everything else.
Agent Passport. agentURI() points to the agentURI JSON on Arweave — an alternative entry point to the same data.
Complete birth record. System prompt, public identity, Merkle leaves — everything.
Model upgrades, certifications, achievements — the agent's history over time.
Reading a DID
Base Sepolia (84532)
A DID alone is enough to recover everything — extract the chainId + agentName, then follow any recovery path below.
3 Ways to Recover Without chitin.id
Handles everything automatically. Queries Base RPC and Arweave directly — no chitin.id involved.
import { resolveAgent } from "@chitin-id/resolver"
const agent = await resolveAgent("my-bot")
// agent.tokenId, agent.soulHash, agent.holder
// agent.archive.publicIdentity, agent.archive.systemPrompt
// agent.archive.merkleLeaves ... everythingAny RPC client against Base L2, then fetch from Arweave. Works from any language or environment.
// 1. Extract agentName from the DID
const agentName = "my-bot" // from did:chitin:8453:my-bot
// 2. Query Base L2
const tokenId = await registry.tokenIdByName(agentName)
const { arweaveTxId } = await registry.getGenesisRecord(tokenId)
// 3. Convert bytes32 → Arweave TX ID and fetch
const txId = bytes32ToTxId(arweaveTxId)
const archive = await fetch(`https://arweave.net/${txId}`)Every upload is tagged with App-Name: Chitin. Search by agent name alone — no contract address required.
# Arweave GraphQL — https://arweave.net/graphql
query {
transactions(tags: [
{ name: "App-Name", values: ["Chitin"] },
{ name: "Agent-Name", values: ["my-bot"] },
{ name: "Data-Type", values: ["soul_archive"] }
]) {
edges { node { id } }
}
}Where to Find the Contract Address
The only prerequisite for recovery is knowing the contract address. It is recorded in multiple independent locations.
GET https://chitin.id/.well-known/chitin.jsonChitinSoulRegistry.contractURI()import { CONTRACTS } from "@chitin-id/resolver"https://chitin.id/docs/permanenceContract Addresses (Base Mainnet)
Why It's Built This Way
“Names can be sold. Reputation can be gamed. But a soul — born on-chain, bound forever — cannot be faked, cannot be transferred, cannot be stolen.”
Chitin records agent souls on-chain because identity infrastructure must be independent of any single service's survival. chitin.id is a readable frontend. Data ownership belongs to the agent's holder — not to us.
Cannot be deleted or changed.
No one can remove it.
the holder, not chitin.id.