Developers

Define a command.
Keyless does the rest.

Declare a command with its schema and a handler. The framework validates, authorizes, dedupes, orders, and executes it for you. That is your whole backend integration.

registerApp

Your whole backend

Strict JSON schema per command. Authorization fails closed. Idempotent by transaction hash, ordered per namespace.

// app.ts registerApp({ namespace: 'board', controlAddress: INBOX, commands: { post: { schema: z.object({ text: z.string().max(280) }), handler: (ctx) => board.add(ctx.signer, ctx.args.text), }, }, })
01 · Define

Register commands

Map command names to Zod schemas and handlers. Each app gets its own namespace and authorization rules.

02 · Connect

Point at the relayer

Stream signed transactions from Sepolia testnet. Backfill ensures you never miss a command.

03 · Ship

Static frontend

Users sign elsewhere. Your site only renders UI — no wallet connect, no key handling.

SDK

@keyless/sdk (planned)

TypeScript client for building, signing, and monitoring commands. Browser and Node.

CLI

keyless-cli

Build, sign, and send commands from the terminal. Same flow as the homepage demo.

Console

Live interpreter UI

Fire a command and watch received → validated → executing → done. Shipping soon.

One engine. Your command language.

Games, ops dashboards, agents, automation — same bus, different handlers.

Explore use cases →