The registry for
AI agents.
Publish an agent, install the tools it depends on, run it locally under a supervisor, and read normalized Robinhood Chain market and on-chain data — through one API, one CLI, and one SDK.
$ norien search trading trading-agent 0.5.0 python$ norien install trading-agent ✓ resolved 4 tools · wrote ./norien_agents$ norien run trading-agent ✓ running · pid 24180 · healthyEverything an agent needs to ship
Primitives that compose. Use one, or use all of them behind a single API.
Versioned registry
Immutable version records with a mutable head. Install a pinned version and get the exact manifest that was published.
Learn more →Skills
Runnable capabilities, grounded in live data. Publish a skill once; anyone can run it and get a real, data-backed result.
Learn more →Local runtime
A supervisor that starts agents, streams logs, probes health, and restarts them when they crash — with a crash-loop cap.
Learn more →Tool marketplace
Tools are plugins, never hardcoded. JSON in, JSON out, across seventeen categories.
Learn more →Unified data API
Six providers normalized into one shape, with provenance attached to every response.
Learn more →How it works
The same four steps whether you are running one agent locally or a catalogue of them.
- 1
Describe the agent
An agent.json declares its runtime, entrypoint, commands, required tools, permissions, and environment.
- 2
Publish it
The registry validates the manifest, resolves every declared tool, and records an immutable version.
- 3
Install anywhere
Installing writes the manifest, a resolved tool list, and an .env.example — the way node_modules works.
- 4
Run it
The supervisor detects the runtime, injects tools and environment, and keeps the process healthy.
Built for the terminal first
Every command supports --json, and stdout stays pure JSON while spinners and diagnostics go to stderr — so the CLI composes with jq and CI without special-casing.
- Publish, search, install, update, and uninstall
- Run, stop, restart, tail logs, and check status
- Market data: markets, trending, token, wallet, contract, project
- norien doctor diagnoses the API, manifest, runtimes, and config
$ norien markets --limit 3 SYMBOL PRICE 24H VOLUME HOLDERS USDG $1.0011 +0.14% $85.69M 31,967 WETH $1944.81 +0.81% $85.69M 254,872$ norien doctor ✓ registry http://localhost:3000 — okVersions that never move
Every publish writes an immutable version row alongside a mutable head. A pinned install resolves to exactly what was published, and a deleted slug stays reserved so it can never be taken over.
- Manifest validation
- Structure, semver, slug rules, and tool resolution before anything is stored.
- Ranked search
- Postgres full-text with generated tsvector columns and ts_rank ordering.
- Dependency resolution
- Declared tools resolve to real records; unresolvable names are reported, not ignored.
- Runtime inspection
- Ask whether an agent could run here before installing it.
$ norien run research-agent ✓ node detected · 3 tools injected ✓ running · pid 24180$ norien logs research-agent -f [12:04:01] ready on :7070 [12:04:12] health okDocker, npm, and systemd — for agents
A supervisor process separate from the registry, because a shared catalogue must never execute user code. It detects the runtime, validates permissions, injects tools and environment, and recovers crashes with a loop cap so a failing agent cannot spin forever.
Tools are plugins, not special cases
A tool declares its input and output schema, its runtime, its permissions, and the environment it needs. The runtime speaks one protocol to all of them — JSON on stdin, JSON on stdout — so nothing about a tool is hardcoded.
node · python · http
Three runtimes behind one contract. An http tool proxies to a URL with placeholder substitution; the caller cannot tell the difference.
Schema-checked
Input and output are JSON Schema, stored verbatim — which is also what makes them MCP compatible later.
Seventeen categories
Search, data, wallet, social, media, notifications, storage, and more.
Six providers, one shape
Market data, on-chain state, repository health, and TVL are normalized behind a single surface. Responses carry their own provenance, so a partial answer is visibly partial instead of quietly incomplete.
- GET /api/tokens
- GET /api/token/:address
- GET /api/wallets/:address
- GET /api/contracts/:address
- GET /api/projects
- GET /api/search
{
"data": {
"symbol": "USDG",
"price": 1.0002,
"holders": 31579
},
"sources": [
{ "provider": "market-data", "status": "ok" },
{ "provider": "chain-explorer", "status": "ok" }
],
"degraded": false
}Start with the docs
The manifest format, the REST surface, the CLI reference, and the SDKs — everything needed to publish your first agent.
Or jump straight into the app.