Denna Spec is an open standard for storing protocol configuration, parameters, and governance documents as structured, validated, and publicly versioned JSON files.
The Problem
Every DeFi protocol manages data that is too important to live in a spreadsheet β wallet addresses, rate spreads, eligibility rules, governance articles. Yet that is exactly where most of it ends up.
When a rate changes, who changed it? When? Why? Spreadsheets and Notion pages don't answer these questions. Git does.
A typo in a wallet address or an out-of-range rate can go unnoticed for weeks. Without a schema, there is no automated check.
Every team that wants to consume your parameters builds a custom integration. There is no standard format to build tools against.
Notion, Google Sheets, and Confluence store your data on their servers. Your protocol's parameters shouldn't depend on a SaaS vendor.
Mental Models
Not a developer? Here are four analogies that capture what Denna does and why it matters for protocols and financial systems.
Before IBAN, every bank had its own account number format. After IBAN, any bank software anywhere in the world could validate an account number and understand its structure without needing custom logic per country or institution. Denna does the same for protocol data: any tool that understands Denna can read and validate any Denna file, regardless of which protocol created it.
When a developer changes code, it goes through a pull request: a description of what changed, a review by a teammate, and a permanent record of who approved it and when. Denna brings this same discipline to data. When a rate changes or a wallet address is updated, it goes through a pull request β reviewed, automatically validated, and recorded forever in a public history that anyone can audit.
AT Protocol powers Bluesky. Its core insight: standardize how data is structured, and any app built on that standard gains interoperability for free. Denna applies this idea to protocol configuration. Build a governance UI once and it works with any protocol that publishes Denna files. Build a risk dashboard once and it connects to any Denna-powered parameter store β no custom integration per protocol.
Sky's Atlas is a constitutional document for a DeFi protocol. Today it is a website β readable by humans but invisible to software. With Denna, each article and clause becomes a structured data point that governance tools can query, reference, and validate against. The constitution becomes machine-readable without losing human readability. Any change to any article goes through a pull request with full review history.
How It Works
Denna Spec is built on GitHub and JSON Schema β two technologies already trusted by millions of developers and organizations worldwide.
.denna-spec.json file
Your data β wallet addresses, rates, governance articles β goes into a structured
JSON file. It includes a metadata block that identifies what it is
and a $schema pointer that says what rules it must follow.
A JSON Schema file defines exactly what your data must look like: which fields are required, what format addresses must use, what range a rate must fall within. Use official Denna schemas or write your own.
A GitHub Action runs on every pull request and checks every
.denna-spec.json file against its schema automatically.
Invalid changes are rejected. Valid ones go through your normal review and
approval process, creating a permanent audit trail.
The same rate parameters β before Denna and after.
## SSR Spread
| Parameter | Value | Description |
|------------------|-------|-----------------|
| SUSDS_SPREAD_BPS | 30 | sUSDS spread |
| Fallback SSR | 4.5% | used when... |
| BASE_RATE | 4.66% | fallback rate |
No validation. No history.
No tool can parse this reliably.
{
"$schema": "../schemas/rates.schema.json",
"metadata": {
"id": "shared-rates",
"kind": "io.denna.defi.rates",
"lastUpdated": "2026-02-21"
},
"rates": {
"ssrSpread": { "value": 30, "unit": "bps" },
"fallbackSsr": { "value": 4.5, "unit": "percent" }
}
}
Schema Ecosystem
Denna Spec's schema ecosystem is open. Use official schemas from Denna as a starting point, extend them, or build entirely custom ones for your protocol β no central registry required.
Maintained at schemas.denna.io. Uses the io.denna.* namespace.
Your own schemas using your reverse-domain namespace. Host them anywhere accessible by URL.
io.denna, io.sky, com.spark).
This makes kinds globally unique without a central registry β the same approach used by AT Protocol.
The Standard
The complete technical specification. Uses RFC 2119 keywords (MUST, SHOULD, MAY).
Denna Spec is a convention for expressing any structured data as self-describing JSON files validated
by JSON Schema.
A Denna file (.denna-spec.json) is a JSON document containing a metadata block
that identifies what it is, and any number of domain-defined fields containing the actual data.
Its structure is validated by a standard JSON Schema referenced via the $schema field.
Denna does not replace JSON Schema β it is a thin orchestration layer on top of it. JSON Schema handles all structural validation. Denna defines the conventions JSON Schema alone cannot express: file naming, a standard metadata block, semantic value types, a schema namespace convention, and organizational guidance.
.denna-spec.json.config.denna-spec.json, pnl-params.denna-spec.json, stablecoin-addresses.denna-spec.json..denna-spec.json extension to be discovered by validators and CI pipelines.A Denna file MUST be a valid JSON object containing the following top-level fields:
{
"$schema": "path/or/uri/to/schema.json",
"metadata": { }
}
Beyond $schema and metadata, all other fields are defined by the
domain schema referenced in $schema. The domain schema MAY define any additional
fields using any names.
$schema REQUIRED
A string containing a relative path or absolute URI to a JSON Schema file that validates the
entire Denna file. This is standard JSON Schema behavior β it enables IDE auto-completion,
inline validation, and tells validators which schema to use.
The referenced schema MUST validate the complete file including metadata and
all domain content fields.
metadata REQUIREDAn object describing the file's identity and provenance.
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | REQUIRED | Unique kebab-case identifier within the repository. Pattern: ^[a-z0-9]+(-[a-z0-9]+)*$ |
| name | string | REQUIRED | Human-readable display name. |
| kind | string | REQUIRED | Reverse-domain kind identifier. See Section 3. |
| description | string | OPTIONAL | Brief description of the file contents. |
| version | string | OPTIONAL | Semantic Version of the data (e.g., 1.0.0). SHOULD be incremented when data changes. |
| lastUpdated | date | OPTIONAL | ISO 8601 date when data was last verified (YYYY-MM-DD). |
| tags | string[] | OPTIONAL | Freeform tags for categorization and filtering. |
| source | object | OPTIONAL | Provenance. MAY contain repository (string) and references (array; use file:line format, e.g., src/lib/constants.ts:17). |
Any fields beyond $schema and metadata are defined by the domain schema. Common naming conventions:
| Field Name | Typical Use |
|---|---|
| parameters | Numeric configuration values, rates, flags |
| addresses | Contract or token address registries |
| chains | Blockchain network configuration |
| allocations | Asset positions or fund deployments |
| content | Document body or article text |
| sections | Governance document sections or clauses |
The metadata.kind field is a reverse-domain identifier that uniquely classifies
the type of data. It follows a naming convention inspired by
AT Protocol NSIDs.
A kind MUST consist of at least three dot-separated segments. The first two SHOULD identify the schema publisher in reverse-domain order.
io.denna.defi.prime-config
^^ ^^^^^ ^^^^ ^^^^^^^^^^^^
| | | name
| | namespace
| domain
TLD
Pattern: ^[a-z][a-z0-9]*(\.[a-z][a-z0-9-]*){2,}$
| Namespace | Usage |
|---|---|
| io.denna.* | Official schemas published by Denna |
| io.denna.defi.* | DeFi protocol schemas (prime config, rates, allocations) |
| io.denna.governance.* | Governance and document schemas |
| io.denna.finance.* | Financial parameter schemas |
| {org-domain}.* | Custom schemas by an organization |
Reusable type definitions are available at spec.denna.io/schemas/v1/denna-types.schema.json. Import via $ref in domain schemas.
{ "value": "0x1601843c5e9bc251a3272907010afa41fa18347e", "format": "evm" }
{ "value": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "format": "solana" }
| Format | Description |
|---|---|
| evm | Ethereum and all EVM-compatible chains (Base, Arbitrum, Optimism, Avalancheβ¦) |
| solana | Solana. Base58-encoded public key. |
| cosmos | Cosmos SDK chains. Bech32 with human-readable prefix. |
| bitcoin | Bitcoin P2PKH, P2SH, or Bech32. |
| aptos | Aptos. 32-byte hex with 0x prefix. |
| sui | Sui. 32-byte hex with 0x prefix. |
| tron | Tron. Base58Check starting with T. |
{ "value": 30, "unit": "bps" } // basis points
{ "value": 4.5, "unit": "percent" } // percentage
{ "value": 1000000000, "currency": "USD" }
{ "value": 24, "unit": "months" }
{ "value": 7, "unit": "days" }
"2026-01-01" // ISO 8601 β YYYY-MM-DD
"ethereum" // lowercase: base, arbitrum, optimism, solana, avalancheβ¦
A domain schema is a JSON Schema file that defines the complete structure of a Denna file for a specific use case. Domain schemas:
$schema, metadata, and all domain content fields.$ref from https://spec.denna.io/schemas/v1/denna-types.schema.json.schemas/v1/, schemas/v2/).Denna Spec is designed around an open schema ecosystem. Any organization can publish schemas. No central registry is required.
schemas.denna.io, using the io.denna.* namespace.metadata.version to track data changes over time.schemas/v1/, schemas/v2/).$schema field.$schema field and validate the entire file against the resolved schema.$schema is missing or cannot be resolved, the file MUST be treated as invalid.spark/config.denna-spec.json{
"$schema": "https://schemas.denna.io/v1/defi/prime-config.schema.json",
"metadata": {
"id": "spark-config",
"name": "Spark",
"kind": "io.denna.defi.prime-config",
"version": "1.0.0",
"lastUpdated": "2026-02-21",
"source": { "repository": "primes-parameters", "references": ["src/lib/constants.ts:12"] }
},
"chains": [
{
"id": "ethereum",
"almProxy": { "value": "0x1601843c5e9bc251a3272907010afa41fa18347e", "format": "evm" },
"vaultProxy": { "value": "0x691a6c29e9e96dd897718305427ad5d534db16ba", "format": "evm" },
"features": { "alm": true, "psm3": false }
}
],
"allocations": {
"ethereum": [
{
"contract": { "value": "0x4dedf26112b3ec8ec46e7e31ea5e123490b05b8b", "format": "evm" },
"protocol": "SparkLend",
"type": "atoken",
"underlying": "DAI"
}
]
}
}
.github/workflows/validate.ymlname: Validate Denna Spec Files
on:
pull_request:
paths: ['**/*.denna-spec.json', 'schemas/**']
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: daocraft/denna-spec@v1
with:
patterns: "**/*.denna-spec.json"
exclude: "_template/**"
FAQ
sections for governance documents, rates for financial parameters, chains for protocol configuration.
.denna-spec.json file to change a rate or update an address is straightforward. Tools built on top of Denna (like governance UIs) can provide a no-code editing experience, so non-developers can propose changes through a web interface without ever touching JSON directly.
.denna-spec.json file against its schema. If a change is invalid β a malformed address, a missing required field, a rate in the wrong format β the check fails and the PR cannot be merged until the issue is corrected. This catches errors before they can reach production systems.
.denna-spec.json files have a $schema field pointing to a valid JSON Schema.