Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .changeset/readmes-republish.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
"@cdr-kit/cli": patch
"@cdr-kit/agent": patch
"@cdr-kit/contracts": patch
"@cdr-kit/core": patch
"@cdr-kit/tools": patch
"@cdr-kit/mcp": patch
"@cdr-kit/react": patch
"@cdr-kit/react-ui": patch
"@cdr-kit/vercel-ai": patch
"@cdr-kit/openai": patch
"@cdr-kit/langchain": patch
"@cdr-kit/agentkit": patch
"@cdr-kit/goat": patch
"create-cdr-kit-app": patch
---

Republish to flush the rewritten READMEs to npm.

Every package's README on npm was still the old short version (e.g. `@cdr-kit/cli` showed 29 bytes; the source has been 4886 bytes since the README rewrite landed). Bumping a patch on each so a single `pnpm release` flushes the new content. **No code changes** — the dist is byte-identical to the last publish; only the README in each tarball updates.

Verified before the bump:
- `@cdr-kit/cli`: source 4886b vs npm 29b
- `@cdr-kit/agent`: source 3790b vs npm 1657b
- `@cdr-kit/react`: source 4544b vs npm 1229b
- ...and 11 more in the same shape.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ A standard library of 9 deployed CDR condition contracts + a typed TS SDK + a Re

> **Status: 0.6.0 live on npm + Aeneid.** 15 packages published to [npmjs.com/org/cdr-kit](https://www.npmjs.com/org/cdr-kit). 9 conditions deployed on Story Aeneid (5 base + 4 advanced shipped in 0.5). 110 Foundry tests + workspace lint/typecheck/build/test all green. Dashboard live at [cdrkit.xyz](https://cdrkit.xyz) (built from `apps/site/`). The full encrypt→write→read→decrypt round-trip, the dual-path MultiSig flow, the Story IP creator path (`agent.publish()`), and an autonomous LLM-driven agent paying + reading via MCP tools all run end-to-end on real chain.

## Use the skills from any agent (Claude Code · Cursor · Copilot · Cline · …)

```
npx skills add Blockchain-Oracle/cdr-kit
```

Installs the cdr-kit Agent Skills via [skills.sh](https://skills.sh).

## Install (any of these — pick the surface you want)

```bash
Expand Down
125 changes: 125 additions & 0 deletions apps/site/components/docs/roadmap-table.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/* RoadmapTable — list of cards with status-coded left borders. */

.rm {
display: grid;
grid-template-columns: 1fr;
gap: 14px;
margin: 22px 0 30px 0;
padding: 0;
list-style: none;
}

.rm-card {
position: relative;
display: flex;
flex-direction: column;
gap: 8px;
padding: 18px 20px 18px 22px;
background: var(--card);
border: 1px solid var(--line);
border-left: 3px solid var(--line-2);
border-radius: 10px;
scroll-margin-top: 90px;
transition: border-color 0.14s, transform 0.12s, box-shadow 0.14s;
}
.rm-card:hover {
transform: translateY(-1px);
box-shadow: 0 6px 22px -14px color-mix(in oklab, var(--ink) 22%, transparent);
}
.rm-card:target {
box-shadow:
0 0 0 3px color-mix(in oklab, var(--primary) 18%, transparent),
0 6px 22px -14px color-mix(in oklab, var(--ink) 22%, transparent);
}

.rm-card--next { border-left-color: var(--primary, oklch(0.66 0.18 30)); }
.rm-card--queued { border-left-color: oklch(0.66 0.16 268); }
.rm-card--exploring { border-left-color: var(--line-2); }

.rm-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}

.rm-status {
display: inline-flex;
align-items: center;
gap: 7px;
padding: 4px 10px 4px 8px;
font-family: var(--mono);
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
border-radius: 999px;
border: 1px solid var(--line);
background: var(--paper-2);
color: var(--ink-2);
}
.rm-statusdot {
width: 7px;
height: 7px;
border-radius: 999px;
background: currentColor;
box-shadow: 0 0 0 3px color-mix(in oklab, currentColor 18%, transparent);
}

.rm-dot--next { color: var(--primary, oklch(0.66 0.18 30)); }
.rm-dot--next .rm-statusdot { background: var(--primary, oklch(0.66 0.18 30)); }

.rm-dot--queued { color: oklch(0.6 0.18 268); }
.rm-dot--queued .rm-statusdot { background: oklch(0.6 0.18 268); }

.rm-dot--exploring { color: var(--ink-3); }
.rm-dot--exploring .rm-statusdot { background: var(--ink-3); }

.rm-anchor {
font-family: var(--mono);
font-size: 0.86rem;
color: var(--ink-3);
text-decoration: none;
padding: 2px 8px;
border-radius: 6px;
transition: color 0.14s, background-color 0.14s;
opacity: 0;
}
.rm-card:hover .rm-anchor,
.rm-card:focus-within .rm-anchor { opacity: 1; }
.rm-anchor:hover { color: var(--ink); background: var(--paper-2); }

.rm-title {
margin: 0;
font-family: var(--display, inherit);
font-size: 1.08rem;
font-weight: 700;
letter-spacing: -0.01em;
color: var(--ink);
}

.rm-body {
margin: 0;
font-size: 0.92rem;
line-height: 1.55;
color: var(--ink-2);
}
.rm-body code {
font-family: var(--mono);
font-size: 0.88em;
padding: 1px 6px;
border-radius: 5px;
background: var(--paper-2);
border: 1px solid var(--line);
color: var(--ink);
}

@media (min-width: 720px) {
.rm { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 540px) {
.rm-card { padding: 16px 16px 16px 18px; }
.rm-title { font-size: 1rem; }
.rm-body { font-size: 0.88rem; }
.rm-anchor { opacity: 1; }
}
66 changes: 66 additions & 0 deletions apps/site/components/docs/roadmap-table.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import type { ReactNode } from "react";
import "./roadmap-table.css";

export type RoadmapStatus = "next" | "queued" | "exploring";

export interface RoadmapRow {
/** Stable anchor id — used as the row's `<a id>`. */
id: string;
status: RoadmapStatus;
title: ReactNode;
body: ReactNode;
}

interface RoadmapTableProps {
rows: RoadmapRow[];
}

const STATUS_META: Record<
RoadmapStatus,
{ label: string; dotClass: string; cardClass: string }
> = {
next: { label: "next", dotClass: "rm-dot--next", cardClass: "rm-card--next" },
queued: { label: "queued", dotClass: "rm-dot--queued", cardClass: "rm-card--queued" },
exploring: {
label: "exploring",
dotClass: "rm-dot--exploring",
cardClass: "rm-card--exploring",
},
};

/**
* RoadmapTable — surface used by `/docs/roadmap`. Each row is a self-contained
* card with a status pill (next / queued / exploring), title, and body copy.
*
* Visual goals:
* - Status pill colour anchors the row's left border so the page scans
* vertically — you can see at a glance how much is `next` vs `exploring`.
* - Anchor id on every row so we can deep-link from issues / changelog
* entries (`/docs/roadmap#ratelimit-condition`).
* - No external CSS framework — uses the same `--cdr-*` tokens as the rest
* of the docs site for light/dark parity.
*/
export function RoadmapTable({ rows }: RoadmapTableProps) {
return (
<ul className="rm" role="list">
{rows.map((row) => {
const meta = STATUS_META[row.status];
return (
<li key={row.id} id={row.id} className={`rm-card ${meta.cardClass}`}>
<header className="rm-head">
<span className={`rm-status ${meta.dotClass}`}>
<span className="rm-statusdot" aria-hidden />
{meta.label}
</span>
<a className="rm-anchor" href={`#${row.id}`} aria-label={`Link to ${row.id}`}>
#
</a>
</header>
<h3 className="rm-title">{row.title}</h3>
<p className="rm-body">{row.body}</p>
</li>
);
})}
</ul>
);
}
1 change: 1 addition & 0 deletions apps/site/components/docs/sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const SIDEBAR: SideGroup[] = [
{ href: "/docs", label: "Introduction" },
{ href: "/docs/quickstart", label: "Quickstart" },
{ href: "/docs/theming", label: "Theming" },
{ href: "/docs/roadmap", label: "Roadmap" },
],
},
{
Expand Down
138 changes: 138 additions & 0 deletions apps/site/content/docs/roadmap.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
---
title: Roadmap
description: What ships next. Categorized by surface — conditions, storage adapters, agent kit, scaffolder, forms, dashboard. Excludes mainnet (CDR is still testnet-only).
breadcrumb: ["cdr-kit", "Roadmap"]
prev:
href: /docs
label: Introduction
next:
href: /docs/quickstart
label: Quickstart
---

cdr-kit ships in two-week cycles. This page is the live picture of what's in flight, what's queued, and what we've explicitly ruled out. Each item carries a confidence tag: `next` (in the upcoming release), `queued` (next 1–2 cycles), `exploring` (we know it's needed, design isn't locked yet).

<Callout type="warn">
**Mainnet support is out of scope** until Story Protocol promotes CDR off testnet. Every roadmap item below targets Aeneid (chain&nbsp;1315). When mainnet lands we'll cut a 1.0 release and migrate the address registry in `@cdr-kit/contracts` in one commit; nothing else needs to change.
</Callout>

## Condition contracts

The standard library has 9 deployed conditions today. The roadmap focuses on patterns that real CDR consumers keep reinventing.

<RoadmapTable rows={[
{ id: "ratelimit-condition", status: "next", title: "RateLimitCondition", body: "Cap reads per wallet per window. Useful for API-key replacement: 1 000 reads/24h per subscription, enforced on the read condition itself rather than at an API gateway." },
{ id: "paymenttoken-condition", status: "queued", title: "PaymentTokenCondition", body: "Subscription / tier-gate variants that accept any whitelisted ERC-20 instead of native IP. Lets sellers price in USDC / WIP / their own token without changing the SDK surface." },
{ id: "geofence-condition", status: "queued", title: "GeoFenceCondition", body: "Read access gated by a signed location claim. Pairs with a small attestation service (out of scope for cdr-kit but documented). Use cases: regional licensing, IP-blocked publications." },
{ id: "composable-and-or", status: "queued", title: "Composable AND/OR (v2)", body: "Today's ComposableCondition is AND-only. v2 adds OR semantics via a small bytecode (postfix booleans). Critical for 'subscribers OR holders of license token X' gating." },
{ id: "crosschain-condition", status: "exploring", title: "CrossChainCondition", body: "Read condition that verifies a Merkle proof of state on another chain (e.g. NFT held on Base). Requires a light client; likely a wrapper over Wormhole or LayerZero rather than rolling our own." },
{ id: "revocable-write", status: "exploring", title: "RevocableWriteCondition", body: "Author-side: invalidate every prior read of a vault by rotating a key, so leaked plaintext can't be re-distributed via the protocol. CDR can't recover already-released plaintext (that's physics) but the protocol can refuse to release future reads." },
]} />

## Storage adapters

`@cdr-kit/core` ships 8 adapters. The roadmap fills the obvious ecosystem holes.

<RoadmapTable rows={[
{ id: "filecoin-direct", status: "queued", title: "createFilecoinStorage", body: "Direct lighthouse / Filecoin Onramp pinning without Storacha as a middleman. Useful when consumers want explicit storage-deal receipts." },
{ id: "arweave-storage", status: "queued", title: "createArweaveStorage", body: "Permanent storage adapter. Good fit for dead-man-switch + escrow combos where the seller wants the encrypted blob to outlive their wallet." },
{ id: "vercel-blob", status: "exploring", title: "createVercelBlobStorage", body: "Vercel Blob is Vercel-Postgres-tier developer ergonomics for object storage. Skipping until Vercel commits to a real pricing model — currently in preview." },
{ id: "akave", status: "exploring", title: "createAkaveStorage", body: "S3-compatible Filecoin / web3 storage. Will likely route through `createS3Storage` with a thin config helper." },
]} />

## Framework adapters

5 agent-kit adapters today (Vercel AI · OpenAI · LangChain · AgentKit · GOAT). Mostly chasing where agents are actually being built.

<RoadmapTable rows={[
{ id: "mastra-adapter", status: "next", title: "@cdr-kit/mastra", body: "Mastra is the fastest-growing TS agent framework right now. Same 34-tool surface, ships as a Mastra Tool[]." },
{ id: "ai-sdk-v6", status: "queued", title: "Vercel AI SDK v6 migration", body: "AI SDK v6 changes the tool() shape (deprecates execute() in favour of inputSchema + result). Bump @cdr-kit/vercel-ai once v6 stabilises." },
{ id: "openai-agents-sdk", status: "queued", title: "@cdr-kit/openai-agents", body: "OpenAI's new Agents SDK (Python + TS) has its own tool format distinct from raw function-calling. Worth a dedicated adapter, NOT reusing @cdr-kit/openai." },
{ id: "convex", status: "exploring", title: "@cdr-kit/convex", body: "Convex agents are a niche but real; their tool format is JSON-Schema. Likely doable as a one-file wrapper if anyone asks." },
]} />

## Scaffolder templates

5 templates today (starter · blog · paywall · data-marketplace · forms). The roadmap targets shippable mini-products, not category showcases.

<RoadmapTable rows={[
{ id: "newsletter-template", status: "next", title: "subscription-newsletter", body: "Substack-shaped paywall: signup → SubscriptionCondition → encrypted markdown posts. Drops in a real Vercel Blob + Resend setup." },
{ id: "gated-podcast", status: "queued", title: "gated-podcast", body: "Premium audio episodes behind SubscriptionCondition + range-request streaming from S3. Good demo of the CDR + storage split — audio blob on S3, key gate on chain." },
{ id: "dao-vault", status: "queued", title: "dao-vault", body: "MultiSigCondition + governance. Treasury-style vault where a DAO unlocks documents via signer-set rotation. Pairs naturally with Safe." },
{ id: "encrypted-chat", status: "exploring", title: "encrypted-chat", body: "Two-party DM with per-message vaults and read-receipts via on-chain events. The interesting question is whether to do per-message or per-thread vaults; we'll prototype both." },
]} />

## @cdr-kit/forms

The new package (0.7.2) has the picker. Forms still needs the obvious gaps.

<RoadmapTable rows={[
{ id: "file-upload-field", status: "next", title: "CdrFileField + chunked uploads", body: "File-input field that auto-routes to the storage adapter for >1 KB blobs. Handles chunking + progress reporting + drag-drop." },
{ id: "conditional-fields", status: "queued", title: "Conditional fields", body: "Show / hide fields based on other field values (`when={{ field: 'plan', equals: 'pro' }}`). Standard form-builder primitive; nothing CDR-specific but expected." },
{ id: "multi-step", status: "queued", title: "Multi-step wizards", body: "<CdrFormStep> wrapper for breaking long forms into screens. Each step's fields encrypted together, persisted to localStorage between steps." },
{ id: "validation-zod", status: "queued", title: "Schema validation (Zod)", body: "<CdrForm schema={zodSchema}> for typed validation before encryption. Surfaces errors per-field via the existing context." },
{ id: "rich-text", status: "exploring", title: "Rich-text answer field", body: "Tiptap-style answer field for long-form responses (interviews, applications). Sanitisation + serialised JSON storage." },
]} />

## Dashboard surface

Today's docs site doubles as the dashboard. Splitting the dashboard into its own route family is in flight.

<RoadmapTable rows={[
{ id: "vault-explorer", status: "next", title: "Vault explorer (/explore)", body: "Live grid + search across every VaultCreated event on Aeneid. Filter by condition kind, creator, license terms id. The 'block-explorer for CDR vaults' people keep asking for." },
{ id: "seller-dashboard", status: "queued", title: "Seller dashboard (/dashboard)", body: "Per-creator revenue view: subscriptions, escrow paid, license-token mints. Reads on-chain, no off-chain analytics service." },
{ id: "buyer-dashboard", status: "queued", title: "Buyer dashboard (/library)", body: "Every vault the connected wallet has access to. One-click decrypt + download." },
{ id: "audit-log", status: "exploring", title: "Audit log per vault", body: "Payment / subscription event timeline (NOT who-decrypted — CDR can't provide that). Useful for the 'who paid me?' creator question." },
]} />

## Agent kit

The 34-tool surface is stable. Next moves are around orchestration.

<RoadmapTable rows={[
{ id: "a2a-protocol", status: "queued", title: "A2A (agent-to-agent) negotiation", body: "Two cdr-kit agents discover each other via the registry, negotiate a price, escrow + read. Reference impl + protocol spec; not a new SDK package." },
{ id: "spending-limits", status: "queued", title: "Spending limits / kill switch", body: "Per-tool budget caps inside CdrAgent (`agent.setBudget({ subscribe: 5e18 })`). Prevents a misbehaving LLM from draining the wallet on one tool." },
{ id: "delegated-execution", status: "exploring", title: "Delegated execution", body: "Agent A delegates a tool call to Agent B via signed authorization. EIP-712 over the tool args. Useful for multi-agent treasuries." },
]} />

## Story IP integration

`@cdr-kit/story` covers register-IP + attach-PIL + mint-license-token + register-derivative. The wrappers below fill the rest of Story's surface.

<RoadmapTable rows={[
{ id: "royalty-distribution", status: "queued", title: "Royalty distribution wrapper", body: "Wrap Story's RoyaltyModule + RoyaltyPolicyLAP for sellers who want to programmatically claim and distribute revenue to derivative-IP holders." },
{ id: "dispute-module", status: "queued", title: "Dispute module wrapper", body: "Story's Dispute module lets IP holders flag derivatives. Pair with cdr-kit's MultiSigCondition for arbiter signoff." },
{ id: "ipa-graph", status: "exploring", title: "IPA graph queries (read-side)", body: "Helpers to traverse parent / derivative chains. Mostly server-side; might end up as a tiny SDK extension rather than a new package." },
]} />

## Distribution

How consumers find + install the CLI / scaffolder.

<RoadmapTable rows={[
{ id: "homebrew-tap", status: "exploring", title: "Homebrew tap for cdr CLI", body: "macOS users prefer `brew install cdr-kit` over `pnpm add -g`. Low effort, real reach. Likely a 50-line tap formula." },
]} />

## Performance + DX

Smaller bundles, faster build, fewer footguns.

<RoadmapTable rows={[
{ id: "abi-codesplit", status: "next", title: "Code-split @cdr-kit/contracts ABIs", body: "Today the package re-exports every ABI; consumers pull all 9 conditions even when they only use 1. Split into `@cdr-kit/contracts/condition/<name>` entries." },
{ id: "playground", status: "queued", title: "TypeScript playground", body: "<CdrPlayground> on cdrkit.xyz — try the SDK in-browser against mock CDR. Lowers the bar from 'install + clone' to 'click and run'." },
{ id: "viem-2.x-2.y", status: "exploring", title: "Stay on viem's stable channel", body: "viem moves fast. Track the major / dual-publish at every minor so consumers don't get caught by peer-dep drift." },
]} />

## Out of scope (deliberately)

- **Mainnet** — CDR isn't on mainnet yet; cdr-kit will follow.
- **Custom precompile** — we wrap CDR, we don't replace it. If you want a different threshold scheme, fork [`@piplabs/cdr-sdk`](https://github.com/piplabs/cdr-sdk).
- **Whitelabel dashboard** — the dashboard at cdrkit.xyz is for demos, not for hosting other people's data marketplaces. Use `create-cdr-kit-app --template data-marketplace`.
- **Storage gateway** — we don't host a CDN. Every adapter is "you bring the credentials". Self-hosted only.
- **AI agent for sale** — cdr-kit ships the toolkit, not a managed agent. If you want a hosted CDR agent, deploy the `vercel-ai-chatbot` example.

## How to influence this list

- 👍 on a [GitHub issue](https://github.com/Blockchain-Oracle/cdr-kit/issues) bumps it up.
- A PR with a working draft beats every prioritization argument.
- Sellers actually using CDR on Aeneid for real revenue get priority — drop a note in the issue describing your use-case.
Loading
Loading