OnKeel / The engine whitepaper

Keep the work.
Check every byte.

KEEL records a digital work's files and versions, offers onchain and hybrid storage paths, checks recovered files, and opens the work in an isolated browser environment. It can also issue collectible tokens that point to the work.

8
components, each with one job
3
ways to deliver: Inline, Hybrid, Raw
2
chains: Ethereum and Tezos
1
Shell that checks before it runs
Start reading
Contents

How KEEL fits together

Five components store, check and open the work. Three more handle the collectible token. Each one does a single job.

This guide follows one example throughout. Tidal Study is a fictional generative drawing: a small p5.js sketch that depends on one specific version of the p5 library.

THE WORK · STORED, CHECKED, OPENED Your filessketch.js + p5 1.9 ⌂ Holdstores the bytes Indexlists pieces + Marks Cruciblechecks what arrived Shell + Harnessruns it in the Cage THE COLLECTIBLE · ONLY IF YOU RELEASE TOKENS ◈ Diecollection contract Slab #7token in a wallet Sleevestandard metadata Hostswallets, galleries presentation binding opens the Shell
The work and the collectible are separate records. The token (Slab) points to the work's inventory in the Index; it doesn't contain the files. A host that displays the token opens the work through the Shell, which checks the files before running them.
ComponentJobIn Tidal Study
HoldStores file bytes and the instructions for reassembling them.The sketch and p5 1.9 are stored as separate objects.
IndexRecords the work's inventory: which objects, which versions, which Marks."Revision 1 = this sketch + this exact p5 build."
CrucibleCompares recovered files with their declared sizes and fingerprints (Marks).Rejects a sketch that was altered in transit.
HarnessComposes the work with its Parts and runs it inside the Cage.Loads p5 1.9, then the sketch.
ShellThe interface that opens around the work. It owns the checks and the K control.A viewer opens K to see which files passed.
DieThe collection contract. It records supply, ownership and minting rules.A series of 100.
SlabA collectible token issued by a Die.Tidal Study #7 in a collector's wallet.
SleeveStandard metadata that wallets and marketplaces read.Name, preview image and interactive link.

What makes KEEL different

A token that links to a file records where the file was. A KEEL work records exactly what the work is.

A TOKEN THAT LINKS TO A FILE A KEEL WORK Token #7tokenURI A URLserver or gateway sketch.jswhatever is there today p5 from a CDN?assumed, not recorded Slab #7binding Index recordexact pieces + Marks ⌂ HOLD sketch.js · Mark a1… p5 1.9.0 · pinned Shell · canonical version Checked, then runin the Cage
The work includes everything needed to open it. Every file, the exact version of every dependency, and the program that opens it are stored and fingerprinted. Any compatible viewer can recover them later, check them and run them.

The work

Runtimes

A runtime is the program that opens a kind of work, such as a drawing library, a game engine or a media player. Everything the runtime needs is declared and travels with the work.

Kind of workWhat travels with itRuntime ID
Image, video, 3D (GLB)The original file and the registered display Partstatic-media
Generative drawingThe sketch, the exact drawing library and any seed utilityp5
3D worldScene code, models, textures and the rendererthree
Game / WASMThe compiled program, engine, data and required contextdoom-wasm
FlashThe original SWF plus the compatible Ruffle player and its resourcesflash-ruffle
Custom HTMLThe entry document and every script, style and asset it loadshtml

Parts & modules

A Part is a reusable component a work depends on, such as a library, decoder, model or data file. Each Part has its own identity, version and reuse terms. The SDK calls them modules.

You find a Part by name and bind it by Mark. A name like "p5" tells you what it does. Its Mark, the fingerprint of its bytes, tells you exactly which build you selected. Every work that uses it points to the same stored copy.

IN THE HOLD · ONE COPY EACH WORKS THAT USE THEM p5 1.9.0Mark 3f1a…c02 p5 2.0.0 · released laterMark 9c07…e41 · new identity Tidal Studyown sketch · pinned to 1.9.0 Harbor Linesown sketch · pinned to 1.9.0 Salt Gridown sketch · follow-latest (opt-in) A new workown sketch · pinned to 2.0.0 pinned dashed = moves only by an allowed update
A new library release doesn't change existing works. Each version is a separate stored object with its own Mark. Pinned works stay on the version they chose. A follow-latest binding can move to a newer version, but only through an allowed update that you can see.
  • Binding. A work binds each Part by stored object ID, Mark and size on the selected chain. If a dependency can't be resolved exactly, preparation stops.
  • Reuse terms. Each Part carries its own license (open, paid, restricted or submission-based).
  • Inlays. An Inlay is an attached component that contributes to another work, such as an item equipped on a game character. It keeps its own identity, and the host work's rules still apply.

Storage & delivery

The Hold

The Hold is KEEL's native onchain storage. It cuts files into small pieces, stores them, records the order for joining them, and checks the result on the way back out.

1 · CUT2 · CAST3 · WELD4 · RECOVER5 · CHECK sketch.js.gz S1 S2 S3 Slugs · each ≤ 23,000 B carrier ← S1 carrier ← S2 carrier ← S3 EVM: an Ingot contractTezos: a big_map entry Weld 1 2 3 ordered join≤ 128 children, depth ≤ 16 S1 · S2 · S3 in order decompress sketch.js (restored) decoder must be adeclared Part ✓ packed: size + Mark ✓ restored: size + Mark accepted → open
Cut, cast, weld, recover, check. The Weld keeps the pieces in order. The check runs twice, first on the compressed bytes and again on the restored bytes. The work opens only if both checks pass. Limits shown are for the current EVM Hold and can differ by contract version.
  • One work = many objects. The sketch, the library, music, models and textures are stored as separate objects. Welds join pieces or smaller objects into larger ones. Together they form the object graph, which is the work's assembly plan.
  • Reuse. If twenty works use the same exact library, they all point to one library object in the Hold, and each work only adds its own sketch. You only pay to store a Part if it isn't already on that network.
  • Immutable. Stored content objects never change. A new version is a new object with a new Mark (see Revisions).
Technical detail: EVM and Tezos Hold implementations

EVM. KeelHold stores bytes in Ingots (small contracts whose runtime code is the data, with a stop byte at the front), uses ordered descriptors, and bounds Welds. Current limits: a Slug holds at most 23,000 bytes, castSlugs takes at most 3 payloads per call, a Weld has at most 128 children, and read depth is at most 16. haulObject reconstructs uncompressed objects. For a compressed object, read each Slug with readSlug, join them in order, decompress, then check the declared decoded size and Mark.

Compression. none, gzip, deflate or Brotli. The small p5 path uses the registered gzip profile. Brotli needs its decoder declared as a Part on the selected chain.

Tezos. Native Slugs are stored in a big_map, a large onchain key–value store. KeelHoldOnchFS also implements the published OnchFS interface (read_chunk, create_file, create_directory, read_file, get_inode_at).

Carriers

A carrier is where a file's bytes are kept. Carriers differ in what has to stay online, and every carrier is checked the same way.

WHERE THE BYTES ARE KEPT ONE CHECK FOR ALL Native Holdavailable as long as the chain is IPFS / declared mirroravailable while someone pins it HTTPS cacheavailable while the server is up Mark checksize + fingerprint Matchesaccepted Different bytesrejected
The carrier decides whether you can get the file. The Mark decides whether it's the right file. A work can keep checked copies on several carriers, so if one goes offline another can serve the same bytes.
Experimental: Wake

Wake is an experimental carrier that puts payloads in Ethereum transaction history instead of in the Hold's contracts. Contracts can't read that history, so the bytes can only be recovered by an offchain reader that can access historical chain data or a verified archive.

Inline, Hybrid & Raw

Storage decides where the bytes live. Delivery decides how they reach the browser. These are separate choices, and Inline and Hybrid can both read from the same native Hold.

TOKEN READ RETURNSTHEN THE BROWSERRESULT Inline1 read Complete documentShell + p5 + sketch Nothing more to fetcheverything arrived Shell checks, then opensbytes from the Hold Hybrid1 + N reads Small Shell + graphobject references only RPC reads × Nexact objects from the Hold Shell checks, then openshost must allow RPC reads IPFSexternal ipfs:// referencedocument or graph Gateway fetchprovider must be online Checks, then opensbytes from IPFS Rawno Shell Artifact descriptorpoints at the media Original mediaread directly Opens directlyno Shell, no K control
Inline and Hybrid read the same Hold. Inline returns everything in one read. Hybrid opens a small Shell first and fetches each object in a separate RPC read, so the host page has to allow those reads.
  • Inline puts together one complete document from stored Shell fragments, shared Parts and your file.
  • Direct media. A standalone image, video or self-contained 3D model uses the original file and the registered display Part.

The SDK recommends Inline or Hybrid from the measured size (see read size). The final choice is yours.

Technical detail: Inline encoding

When HTML sits inside a metadata document, the compact saver escapes only what the outer document requires, so it avoids extra layers of Base64. Raw-percent Inline assembly needs a registered builder with matching fragments on the chosen chain. The Base64 and percent builders each use their own format.

Opening & trust

Shell, Harness & Cage

The Shell checks the work's files, then runs the creator's code inside the Cage, an isolated browser frame. The checks stay outside the Cage, so the artwork can't change its own verdict.

HOST PAGE · A GALLERY OR MARKETPLACE · ITS OWN RULES DECIDE WHAT CAN RUN KEEL SHELL · CANONICAL VERSION Harnessresolves the exact graph Crucible checkssizes + Marks, before mount K controlshows files and verdicts the Seam: a checked, limited boundary CAGE · SANDBOXED IFRAME sketch.jscreator code p5 1.9.0Part ✕ no wallet ✕ no open network ✕ can't edit its own verdict checked bytes (the Haul) read-only context Accord check Knock (request)
Three boundaries, each with its own rules. The host decides what can run on its page. The Shell verifies the files and mounts the work. The Cage runs creator code with no wallet access. A Knock is a request only, and it's granted only if every party allows it (the Accord).

How a work opens

  1. Resolve the committed canonical Shell and the work's exact object graph.
  2. Check the stored lengths and Marks.
  3. Decode within the declared limits, then check the decoded lengths and Marks.
  4. Mount the creator content in an opaque child iframe (the Cage).

Presentation choices

PresentationWhat it means
Default KEEL ShellCanonical resource checks and protected K controls. The normal creator path.
Registered creator shellAn explicitly selected shell that declares its own behavior.
Raw artifactDirect access to the committed media or code, with no Shell around it.

The standard Shell is shared. Each work references the registered copy and doesn't pay to upload its own player. The host still has the final say: it controls which scripts, media and network requests can run on its page. That's why one Slab can be interactive in one gallery and show only a thumbnail in another.

Permissions: Guard, Knock, Accord

A Guard declares what the work may do. A Knock is a request from the work across the Seam, and the request alone grants nothing. The Accord is the set of permissions that the artist, the included Parts, the host and the chain all allow. The strictest one wins.

CapabilityArtist asksParts allowHost allowsShell supportsAccord
Read declared files✓✓✓✓Granted
Read-only chain context✓✓✓✓Granted
Open network request✓✓✕—Denied
Wallet signing✓——✕Denied

Verification

A Mark is a fingerprint (hash) computed from a file's bytes. The Crucible recomputes the Mark for every recovered file and compares it, along with the file size, to what the work declared.

Try it · change one word

Expected Mark
computing…
Received Mark
computing…
Verdict
Clean

SHA-256, computed in your browser. One changed word changes the whole fingerprint. A full check (a Pour) also verifies sizes, and the files that pass (the Haul) are what the work opens with.

Verdicts

Rawnot yet checked Cleandeclared checks passed Slagrejected: bytes differ Stalesuperseded in this view Burnedretired by an authorized action Marks + sizes match recovered, but different newer revision current unreachable: stays Raw an event, not a check result
"Couldn't reach it" and "reached it, but it's wrong" are different outcomes. An unreachable file stays Raw, so try another carrier. A mismatch is Slag and the bytes are rejected. A Stale revision can still be the correct pinned version for an older Slab.

Release

Collections & minting

A Die is the collection contract. It mints Slabs, the tokens collectors hold, under release rules that are set separately from the Die.

KEEL's creator factory deploys a separate, immutable contract for each creator, owned by whoever created it. A shared ERC-1155 contract is the alternative: each creator's items get their own ID range.

ShapeMeaningStandard
One-of-oneOne token, one holderERC-721 · FA2
SeriesMany individually numbered tokensERC-721 · FA2
EditionOne item, many identical copiesERC-1155

Not on TezosCreator editions aren't currently available through the Tezos tools.

Release rules

MechanismBehavior
Direct mintCreator mints to a named recipient.
Mint campaignOwn supply, price, eligibility and wallet limits.
OneMint dropOrdered stages sharing one allocation.
FRAY auctionA bidder against a patron coalition decides unique vs edition (details).
reserved shared pool · 90 10 Stage 1 · early supporters Stage 2 · public, gets whatever is left in the pool 010100 direct mint to collaborators Die supply cap: no route mints past it
Tidal Study, 100 tokens. The release plan splits the Die's supply. Each stage draws from what's left, and the contract enforces the cap.

Resale. KeelMarket handles ERC-721 resale in native ETH. A listed token sits in escrow until it's bought or the listing is cancelled. A sale moves the token. Supply and the stored work don't change.

Launch workflow

The launchpad ties the artwork, the collection, the mint rules and the collector page into one release plan. You can rehearse the whole release on a test network, which keeps its own separate tokens and records.

Planfiles, Parts, supply Previewreal composition Wallet reviewchain, calls, value Publishtx 1…n + record Read-backbytes from chain timeout / crash Inspect recordreceipts + state Reconcilesettle unknown steps resume same job New upload or mintduplicates finished steps
A timeout doesn't mean the operation failed. The response may have been lost while the transaction went through. Settle the existing job against its receipts before retrying. Starting over can mint or upload twice.
StepWhat it establishes
PlanArtwork, Parts, storage, presentation, supply, price, access and timing in one place.
PreviewThe real composition runs locally. The plan then confirms every Part exists on the target chain.
ReviewNew bytes vs reused Parts, destination contracts and cost.
PublishCan take several transactions. Progress is saved in a recovery record.
Read-backBytes and bindings fetched from the chain. A receipt only shows the transaction was included in a block.
Technical detail: what the recovery record holds

The exact account, network, plan digest, operation sequence, cursor, transaction and batch identifiers, and the recovery envelope issued by the server. Confirm the receipt and state before retrying a submission whose outcome is unknown.

Costs & read size

You pay to store new bytes only. Separately, everything a token returns must fit in one read, and that decides whether a work uses Inline or Hybrid.

CostCovers
New bytesThis work's own files and records. Parts already on the chain are reused at no extra cost.
Collection & mintCreating a Die and minting Slabs.
Shared setupOne-time infrastructure that later works reuse.
WHAT ONE TOKEN READ RETURNS 01 MB2 MB Inline limit 1.75 MB ceiling 2 MB Tidal Study4 KB sketch p5 preview image fits → Inline + texturessame sketch p5 preview image textures 1.1 MB → Hybrid
What has to fit is the whole read, not your file. The 4 KB sketch goes out with p5, the Shell, a preview and metadata. Adding textures pushes the total past 2 MB, so the work uses Hybrid, where the browser fetches each piece in its own read. Sizes are illustrative.
Technical detail: EVM reader budgets

Automatic Inline up to 1,750,000 compressed asset bytes. Full tokenURI ceiling 2,000,000 bytes. Read gas ceiling min(60,000,000, latest block gas limit).

FRAY auctions

FRAY is an auction between one bidder and a coalition of patrons. If the bidder wins, the work is released as a unique token. If the coalition clears the target, it's released as an edition.

Try it · simplified economic mode

Assumes equal pricing, enough edition supply, and no rounding. Real auctions follow their published terms.

The clearing rule

Each patron declares a maximum contribution, called a cap. The coalition clears if some group of patrons can each afford the same share of the target: the target divided by the group size. With four patrons capped at 25, a target of 100 clears at 25 each. A fifth patron capped at 10 would lower the share to 20, which is more than their cap, so they're left out.

Contract boundary: FrayAuctionIssuer

The auction house runs bidding and payouts. FrayAuctionIssuer (in keel-mint-access) then mints whichever outcome won, unique or edition, from allocations reserved in advance.

Change & preservation

Revisions & freezes

Changing a work creates a new revision. Earlier revisions stay identifiable, and unchanged files are reused rather than stored again.

Revision 1 Revision 2 · fixes a color sketch · Mark a1… p5 1.9.0 · Mark 3f1a… sketch · Mark b2… (new) p5 1.9.0 · Mark 3f1a… same object, not re-uploaded Slab #7 · pinnedStale here, still correct Slab #12 · follow-latestresolves to revision 2
Only changed files need new storage. The planner prepares a graph revision and reuses the unchanged objects already on the selected chain. Pinned tokens stay on their revision.

A freeze applies to one specific thing

ActionWhat becomes fixed
Artifact freezeThe artifact's revision history. No further revisions.
Registry binding freezeThe specified selection only, such as which revision a binding points to.
Shell freezeThe selected revision of a shell record.
Closed saleNo new purchases. Allocations already reserved may still need to be fulfilled.

Hold objects never change. Registries only ever add revisions.

Adding a storage copy. A large work can use an external carrier now and add a native onchain copy later. Because the Marks are the same, the new copy is provably the same work.

Preserving existing work

Onchaininator recovers the files an existing token points to and stores checked copies with KEEL. Each copy stays linked to the original collection and token.

  1. Find the actual files. Follow the token's metadata to the original artwork, scripts and Parts. A preview image may not be the full-resolution or interactive work. Record any missing or unsupported files explicitly.
  2. Store checked copies. Keep the original network, contract, token ID and source URI beside the preserved objects.
  3. Respect the original contract. If it can't be updated, the preserved copy is recorded separately and linked to it.

Ethereum, Tezos & Anchors

The components and their jobs are the same on both chains. What differs is the underlying machinery: contract language, storage format, token interface and wallet operations.

Ethereum / EVMTezos
HoldSlugs in Ingot contracts, joined by WeldsSlugs in a big_map. The OnchFS-compatible carrier is an alternative.
Die / SlabERC-721 (series) or ERC-1155 (editions)FA2. Editions aren't available yet.
Sleeve metadatatokenURI/uri. The work is usually in animation_url.TZIP-21: artifactUri, displayUri, thumbnailUri, formats
ContractsSoliditySmartPy, compiled to Michelson
Addresses0x…KT1…
Wallet reviewDestination, calldata, ETH valueDestination, entrypoint, typed parameters, tez amount
Inline publishingAvailableNot yetFull workflow not available

Every network is separate, EVM networks included. A Part published on Sepolia doesn't exist on Base, even at an address that looks identical.

Anchors: one work, several chains

Portable rootone fingerprint over the Marks Ethereum publicationHold objects · Die 0x… · Slab #7holds the original token Tezos copyHold objects at KT1… (own addresses)no token moves here Anchor · native check Anchor · proof or attestation Grip = 2chains holding an Anchor
Content identity can be copied across chains. Ownership can't. The Marks and the portable root stay the same when exact copies go to another chain. Each copy has its own addresses and transaction evidence. Grip only counts Anchors, so check each Anchor's evidence and whether its files can actually be retrieved.

The evidence behind an Anchor is either checked directly, verified from chain proofs, or vouched for by named attestors. Cross-chain minting is a separate, opt-in operation.

Technical detail: Tezos Shell operations

keel-tezos-shell-prepare (SDK and MCP) builds Micheline parameters to register, update or freeze a Shell record. It returns an unsigned operation for you to sign.

Discovery

Index, search & profiles

The Index is an onchain protocol record of a work's inventory. The site's indexer is separate software that follows contract events so it can serve search results. Search can fall behind the chain, but the chain itself is always current.

Chaincontracts emit events Site indexersupported events only Search indexfast, may lag Gallery & searchfind things Direct chain readstate at one block Verify & decideown? mint? bytes? events lag RPC read follow the evidence
Use search to find things and chain reads to confirm them. If a mint has a successful receipt but doesn't show in search, the indexer is probably behind. Check the token directly. Don't mint a replacement.
Technical detail: event identity

The indexer identifies each event by network, emitting contract, transaction and log position, and it handles replays and chain reorganizations. New contract families need explicit support before they show up in search.

Artist profiles

A profile has a username, public name, bio and image. It's tied to the artist's creator account, so every collection that account creates links back to it. Artists admitted to the platform's program carry an Approved label.

Tools

SDK

The SDK gives your code the same functions the KEEL interfaces use. It can describe a project, check inputs, resolve Parts, build previews and prepare contract data for review.

PackagePurpose
@keel/sdkPlanning, validation, presentation and contract helpers
@keel/builderLocal builds, verification, cost models and upload plans
@keel/protocolPortable types, canonical data and integrity
@keel/viewerResource recovery and presentation reconstruction
@keel/studio-coreShared Studio workflow primitives
@keel/mcpTool and resource server for assistants

Plan a project

Describe what you know. The planner keeps those decisions and returns the questions still open, the modules required and the tools to use next.

import { planKeelProject } from "@keel/sdk/engine";

const plan = planKeelProject({ title: "Tidal Study", outcome: "explore", runtime: "p5" });

console.log(plan.nextQuestions);     // decisions still open
console.log(plan.modules.required);  // p5 + KEEL's seeded-random Part
console.log(plan.nextTools);         // e.g. analysis, library discovery

Next, resolve each required Part to an exact version on the selected chain, build the intended Shell and resource composition, preview it, and keep the identities of both source and output. Anything missing on that chain is reported by name.

Publishing your own Part

A new renderer, decoder or library becomes a reusable Part once it's built, tested against its real dependencies, and given attribution and usage terms. The module CLI prepares it on your machine. plan shows the new bytes and any existing Parts it reuses, and publishing is a separate step.

keel module init ./my-module
keel module build ./my-module
keel module plan ./my-module

Check what a Studio supports

Each Studio publishes the networks, staging limits and publication paths it supports. Read it before uploading or preparing a wallet action.

import { fetchStudioCapabilities } from "@keel/sdk";

async function inspectStudio(studioUrl) {
  const studio = await fetchStudioCapabilities(studioUrl);
  return studio.chains.map(({ network, status, reason }) => ({ network, status, reason }));
}
// Reads capabilities only. Nothing is uploaded or published.

Environment

The source workspace needs Node.js 22+ and pnpm 10.15.0. The root import includes Node-only code. In a web page, import the browser entry point for your task: /engine, /presentation, /contract-controls or /abi. /inline-viewer-graph is for Node-side preparation.

# inside your keel-sdk checkout
pnpm install
pnpm build
# then run examples from a package that links the SDK — no chain publication happens

Chain data

A work can use values read from a contract. For example, a portrait of a game character can glow brighter when the character's health is high, and can show a shield the character has equipped. The SDK reads the values when the work is built and passes them to the artwork as named variables.

Try it · sample data, not a live read

  • It runs first. A small generated script runs in the data phase (weight −32768), before the runtime and your artwork.
  • It's a snapshot. The prepared data records the chainId and blockNumber it was read at. Reopening the build uses those same values. If the work should follow later changes, you have to design a refresh or publish a new revision. Whether the work captures a moment or keeps changing is an artistic decision, so tell collectors which it is.
  • Supported types. Static bool, address, bytes32 and integer types. Dynamic strings, bytes and arrays are refused. Wide integers are kept as decimal text.
// The prepared data module runs before this artwork.
const glow = Number(KEEL.data.health) / 100;   // 0 → dim, 1 → full glow
if (KEEL.data.shielded) drawShield();

SDK: readOnchainData performs the reads, buildOnchainDataFragment generates the script, and assertOnchainDataRoundTrip checks what it publishes. The MCP equivalent is keel-onchain-data-prepare.

MCP

MCP (Model Context Protocol) lets an AI assistant call KEEL's tools with structured inputs. The assistant can inspect, build and prepare. Signing always happens in your wallet, outside the assistant.

YOUR MACHINESTUDIO · SERVERYOUR WALLET AssistantMCP client KEEL MCP server--workspace ./proj analyze · build · verify · cost · planstays local (builds write output files) prepare wallet requestunsigned data, nothing sent stage / draft · scoped token Stage + draftsuploads selected files unsigned request Sign · submit · spendyou approve
Know when data leaves your machine. Analysis and planning stay local. Staging uploads the selected files to the Studio's temporary storage, and a draft tool can edit a private draft. Those are real actions even though no transaction happens. Signing only ever happens in your wallet.
StageTools
Discoverkeel-engine-catalog keel-project-decisions keel-contract-controls
Prepareanalyze media-optimize build verify cost upload-plan
Parts & shellkeel-library-search module-resolve module-lock keel-shell-search
Studiokeel-studio-capabilities keel-studio-draft keel-studio-stage-project
EVM releasekeel-creator-collection-prepare wallet-request-prepare publish-plan
FRAYfray-auction-intake fray-stage-project
Chain datakeel-onchain-data-prepare (returns source + inlineModuleDeclaration for keel-inline-prepare)
Tezos shellkeel-tezos-shell-prepare

Request tools/list from your server to see each tool's exact input and output schemas.

Connect

Build the keel-sdk checkout first (see SDK). Then point your MCP client at the built server and your project folder. File operations can't go outside the workspace path.

{
  "mcpServers": {
    "keel": {
      "command": "node",
      "args": [
        "/path/to/keel-sdk/packages/mcp/dist/cli.js",
        "--workspace",
        "/path/to/your-project"
      ]
    }
  }
}
  • The scoped Studio credential goes in the server's environment as KEEL_STUDIO_AGENT_TOKEN, never in tool arguments. Draft edits check the expected revision before saving.
  • Staging normally selects keel-verification-shell by leaving out viewer. Setting viewer: "none" selects no shell.
  • Planning alone needs no Studio endpoint. Staging and drafts do.

Example request

"Inspect my Tidal Study project. Keep my Tezos choice. Find the Parts it needs, tell me which route is supported, and build a local preview. Show me the decisions that are left."

Editor

The desktop editor puts the work, its collection, contract controls, wallets and an assistant in one workspace. Download coming soon

AreaWhat it does
Files & notesKeeps the editable project and your saved decisions together.
PreviewShows supported local media and runs HTML works in an isolated view.
PartsBrowses the runtime and protocol catalogs.
ContractsLinks contracts by network and address, shows their controls, and prepares unsigned changes.
WalletsInstalled EVM wallets and Tezos wallet connections. Signing stays in the wallet.
AssistantShares only the context you select with the configured provider.
Saved workspaceLocal records that are checked so a save can't overwrite a newer one.
Technical detail: persistence and credentials

Workspace records are stored in SQLite with revision checks, and imported objects are content-addressed. API credentials are encrypted by the operating system and stored outside project memory.

PlannedEditor and SDK plugins will add specialized tools to this workspace, such as a collection admin page, a custom inspector or a workflow for a particular medium.

Reference

Contract map

KEEL calls its contracts Rites. Each is a set of rules the chain enforces. There are 19 contract module families, grouped below by job. Which ones are deployed varies by chain.

Storage & records
⌂keel-hold
Slugs, Welds, immutable objects, Index presentation records
⚒keel-artifacts
Artifacts, revisions, Harness compositions, links, seeds
⛬keel-graph
Relationships, Parts, libraries, module reviews
keel-codecs
Decoders for proof and resource formats
keel-web3-url
Serves content through web3:// URLs
Opening & checks
▣keel-harness
Builds the selected shell and resource presentation
▓keel-crucible
Collection checks, attestations, fingerprints, preservation evidence
keel-presentation
A token's presentation or visual state
▢keel-sleeve
Token metadata via a shared resolver
Collections & sales
◈keel-die
Issues tokens; creator collections, renderer bindings
keel-mint-access
Mint routes, campaigns, drops, FRAY issuance
keel-market
Marketplace sale operations
keel-creator-identity
Creator profiles, commitments, attribution
Cross-chain
⟟keel-anchors
Evidence for copies on other carriers and chains
keel-cross-chain-mint
Publication jobs; separately authorized cross-chain mints
Attachments & rights
keel-equipment
Equipment inventory, reservations, constrained duplication
keel-stake
Custody for stake workflows
keel-ip-control
Scoped rights; wrapper custody and execution rules
Foundation
⚓keel-kernel
Shared access-control and encoding primitives

A single job can span several contracts and some browser code. KeelIndex handles active presentation records. KeelArtifactRegistry handles artifact revisions. KeelHarnessRegistry assembles artifact slots and token forks. KeelArtifactTokenRenderer builds metadata for creator collections. The site's search indexer is separate from all of these.

Platform-level settings belong to a manager contract that requires approval from two-thirds of its governors. Creator-owned records, such as collections and creator shells, stay under the creator's control, separate from the platform shells the manager maintains.

Common operations

JobEVMTezos
Store a SlugcastSlugcast_slug
Recover a SlughaulSlughaul_slug
Join piecesweldObjectweld_object
Recover an objecthaulObjecthaul_object
Register a HarnessforgeHarnessforge_harness
Build Harness HTMLharnessHTMLharness_html
Register an artifactforgeArtifactnative schema differs
Create a DiecastDie (KeelFactory); creator factory has its own API—
Strike a SlabThe chosen Die's authorized mint function, not a plain transfer

Reads return existing information. Writes propose a change and need a signed transaction. "Prepare" means building data for you to review later. The same function name can take different inputs in another contract version or on another chain, so check the ABI or the entrypoint schema.

Glossary

Ownership & rules

Rite
KEEL's word for a smart contract: published rules the chain enforces.
Die
The collection contract. It records Slabs, owners or balances, supply and presentation bindings.
Slab
A collectible token in a wallet. It points to a work but doesn't contain it.
FRAY
KEEL's auction: one bidder against a patron coalition.

Storage

Hold
Native onchain storage for file bytes and the instructions for reassembling them.
Slug
One small piece of a larger file, at most 23,000 bytes on EVM.
Ingot
An EVM contract whose code holds one Slug. Tezos uses big_maps instead.
Weld
An ordered join that assembles Slugs or objects into a larger object.
Mark
A file's fingerprint (digest, hash). Change one byte and the Mark changes.
Index
The sealed inventory of a work's pieces and Marks. It isn't the site's search indexer.
Carrier
Where stored bytes are kept and how they're retrieved.
Wake
Experimental recovery from Ethereum transaction history.

Opening & checking

Crucible
The verification layer. It compares recovered files with declared sizes and Marks.
Pour
One run through the Crucible's checks.
Haul
The resources that passed the checks and are used to open the work.
Harness
The composition that runs the work: resources, runtime context, isolated environment.
Shell
The interface that opens around the work. The canonical Shell owns the checks and the K control.
Cage
The isolated browser frame where creator code runs, with no wallet and no open network.
Sleeve
Standard-format metadata that wallets and marketplaces understand.

Permissions

Seam
The checked, limited boundary around the Cage.
Knock
A request made by the work through the Seam. It grants nothing by itself.
Guard
The declared limits on what the work may do.
Accord
The permissions that the artist, Parts, host and chain all allow. The strictest wins.

Reuse & preservation

Parts
Reusable components (modules) with their own identities and terms.
Inlays
Attached components that contribute to another work under its rules.
Anchor
A record tying a revision to evidence on another chain or carrier.
Grip
The number of chains holding an Anchor for a work.

Verdicts

Raw
Not yet checked.
Clean
The declared checks passed.
Stale
Superseded in the current view. It may still be the correct pinned version.
Slag
Failed verification and was rejected.
Burned
Deliberately retired by an authorized action.

General terms

Artifact
An identified work, separate from any token pointing to it.
Revision
One recorded version of a work or presentation.
Manifest
The structured inventory of files, their Marks and how they relate.
Metadata
Descriptive information and media references for a work or token.
RPC
A service that apps use to read a chain or send operations to it.
ABI
The machine-readable list of an EVM contract's functions and inputs.
Receipt / read-back
Proof a transaction was included / fetching and checking the actual result.
Seed
A recorded input that makes a generative result reproducible.

Troubleshooting

Start from what you can see. Always keep your original files, your selected network and the existing recovery record.

The work or a Part won't load

SymptomCheck next
Missing Part or catalog recordConfirm the exact version and its binding on the selected chain, then resolve the missing Part.
Network or RPC read failsCheck the declared provider and whether the host allows that read path.
Mark or length mismatchReject the bytes and recover the declared revision from a valid carrier.
Blank view, files verifyCheck runtime dependencies, browser features and errors in the creator's code.
Only a thumbnail appearsThe host may not support interactive presentation. Test in the host you're targeting.
Hybrid work blank in one galleryThat host probably blocks RPC reads. Storage may be fine. Choose a presentation the host supports.

Other problems

SymptomCheck next
Mint, edit or claim refusedNetwork and account first. Then the operation's rules: supply, timing, access, current ownership, required role. A freeze can't be undone from a presentation control.
Transaction or upload stuckKeep the job. Look up receipts and actual state, reconcile, then resume the same publication.
Minted but not in searchThe indexer may be behind. Read the token from the chain directly. Don't mint a replacement.
SDK / MCP: route unavailableRead the blockers it returns. Check that the Studio exposes the route and that the Parts exist on the selected chain. Some operations only work on certain networks.
MCP server won't startBuild the SDK checkout first. Check the --workspace path, the Node version and the tools/list schemas. Staging needs a Studio endpoint that accepts uploads.

Reporting an issue

Include the guide or operation you followed, the network, the work revision, public contract and token references, the resource that failed, the exact error, and whether it happens locally or only in a particular host. Never include signing secrets or private credentials.