vela CLI
The vela binary is the canonical write surface. Every command produces a
signed event that any reducer in the world can replay byte-for-byte. New users should
start with /quickstart for the end-to-end
loop; this section is the reference.
vela frontier new
Scaffold a publishable frontier.json.
vela frontier new --name <NAME> [--description <TEXT>] [--force] <PATH> vela init
Initialize a local .vela/ repo (not directly publishable; use frontier new for hub-bound work).
vela init [--name <NAME>] [<PATH>] vela finding add
Add a finding to a frontier. Without --apply it lands as a pending proposal in the inbox.
vela finding add <FRONTIER> \
--assertion <TEXT> \
--author <ACTOR-ID> \
[--type mechanism|therapeutic|diagnostic|epidemiological|...] \
[--source <LABEL>] [--source-type published_paper|preprint|...] \
[--confidence 0.0-1.0] \
[--evidence-type experimental|observational|...] \
[--entities name:type,name:type,...] \
[--doi <DOI>] [--pmid <PMID>] [--year <YYYY>] \
[--apply] vela finding supersede
Supersede an existing finding with a revised content-addressed claim. Old finding flagged superseded; new finding gets an auto-injected supersedes link.
vela finding supersede <FRONTIER> \
--supersedes <FINDING-ID> \
--assertion <TEXT> \
--author <ACTOR-ID> \
[--confidence 0.0-1.0] \
[--apply] vela link add
Typed edge between two findings. Cross-frontier targets use vf_…@vfr_… form.
vela link add <FRONTIER> \
--from <FINDING-ID> \
--to <FINDING-ID> \
--type supports|depends|contradicts|narrows|supersedes vela sign
vela sign generate-keypair [--out <DIR>]
vela sign apply <FRONTIER> --private-key <PATH>
vela sign verify <FRONTIER> [--public-key <PATH>]
vela sign threshold-set <FRONTIER> <FINDING-ID> --to <N> vela actor add
Register an Ed25519 public key for a stable actor identity.
vela actor add <FRONTIER> <ACTOR-ID> --pubkey <HEX> [--orcid <ORCID>]
vela actor list <FRONTIER> vela registry
Publish, list, pull, and mirror frontier manifests.
vela registry publish <FRONTIER> \
--owner <ACTOR-ID> --key <PRIVATE-KEY> \
--locator <URL> [--to <HUB>]
vela registry list [--from <HUB>]
vela registry pull <VFR-ID> [--from <HUB>] --out <PATH>
vela registry mirror <VFR-ID> --from <HUB> --to <HUB> vela serve --workbench
Launch the local workbench web app against a Vela repo.
vela serve <FRONTIER> --workbench --http <PORT> Agent commands (Vela's bundled agents)
LLM-backed pipelines that walk source material and write finding.add proposals tagged with an AgentRun record (full schema in /spec § 4 · AgentRun). Reviewers accept via the inbox; nothing becomes canonical without a separate signed finding-accepted from a registered reviewer.
vela scout <FOLDER> --frontier <PATH> # Literature Scout (PDFs)
vela compile-notes <VAULT> --frontier <PATH> # Markdown / Obsidian
vela compile-code <ROOT> --frontier <PATH> # Jupyter / Python / R
vela compile-data <ROOT> --frontier <PATH> # CSV / TSV
vela review-pending --frontier <PATH> # Reviewer Agent
vela find-tensions --frontier <PATH> # Contradiction Finder
vela plan-experiments --frontier <PATH> # Experiment Planner Agent SDK — third-party integration
Status: not yet shipped as language packages. The CLI agents above are Vela's bundled pipelines and reference implementations. Third-party agents should write proposal JSON or shell out to the binary until dedicated Python and TypeScript packages are released.
vela-py(Python) —vela.publish_proposal(event, agent_run=…)signs afinding-draftedevent in-process.vela-ts(TypeScript) — same surface, ESM module for Node and edge runtimes with the same wire-format guarantees as the existingvela_reducer.mjs.
The hub read API is event-first today. Direct event append semantics remain a conformance target for agent traffic and are specified in /spec § 7 · agent traffic.
Causal reasoning
Pearl-tier queries against the link graph.
vela causal audit <FRONTIER> # per-finding identifiability
vela causal effect <FRONTIER> <SOURCE> --on <TGT> # back-door / front-door (Pearl L2)
vela causal counterfactual <FRONTIER> <SRC> --target <TGT> --set-to <0..1> # twin-network (L3)
vela causal graph <FRONTIER> # print the directed link graph Cross-frontier composition
vela frontier add-dep <FRONTIER> --vfr-id <ID> --snapshot <HASH>
vela frontier refresh-deps <FRONTIER> # re-pin to current hub snapshots
vela bridge <A.json> <B.json> # cross-frontier hypotheses
vela bridges confirm <FRONTIER> <BRIDGE-ID> --reviewer <ID> Rust crates
The canonical reducer is implemented in Rust. Three crates compose the workspace.
vela-protocol- The protocol types:
Event,Finding,EvidenceObject,Correction,Signature, canonical-JSON serialization, hash-of-canonical signing surface. Pureno_std-compatible types with serde. vela-reducer- The deterministic state machine.
fn reduce(events: &[Event]) -> Frontier. Byte-identical output across machines and versions for any given event log. Test fixtures verify byte-equality with the Python and TypeScript reducers. vela-hub- The HTTP server (axum) that accepts signed events, persists the log, and serves
the canonical state. The
vela-hubbinary is what runs at vela-hub.fly.dev.
Add the crates to a Rust project from the workspace root.
[dependencies]
vela-protocol = { git = "https://github.com/vela-science/vela", branch = "main" }
vela-reducer = { git = "https://github.com/vela-science/vela", branch = "main" } Replay an event log from disk:
use vela_protocol::Event;
use vela_reducer::reduce;
let events: Vec<Event> = std::fs::read_dir(".vela/events")?
.map(|e| serde_json::from_slice(&std::fs::read(e?.path())?))
.collect::<Result<_, _>>()?;
let frontier = reduce(&events);
println!("findings: {}", frontier.findings.len()); Python reducer
Stdlib-only verifier and reducer. Designed to be auditable in one sitting and installable with no transitive dependencies — the same constraint that lets the thirty-second proof at /try run on any laptop.
from vela_reducer import reduce, verify_signature
with open(".vela/events/0001-finding-drafted.json") as f:
events = [json.loads(line) for line in f]
frontier = reduce(events)
assert verify_signature(events[0])
print(f"findings: {len(frontier['findings'])}") Source at vela_reducer.py on this domain. Stdlib-only. Auditable end-to-end in roughly 600 lines.
TypeScript reducer
ESM module, runs in node and modern browsers without polyfills. Used by the workbench to replay state in the client and verify signatures locally.
import { reduce, verifySignature } from "/vela_reducer.mjs";
// v0.55.1: substrate is fetched from the hub, which 302-redirects to
// the content-addressed CDN blob. One round trip; bytes never touch
// the hub VM.
const frontier = await fetch("https://vela-hub.fly.dev/entries/vfr_bd91/snapshot")
.then(r => r.json());
const replayed = reduce(frontier.events);
const allValid = (frontier.events ?? []).every(verifySignature);
console.log(`findings: ${replayed.findings.length}, valid: ${allValid}`); Source at vela_reducer.mjs. ESM module, no build step required.
Hub HTTP API
The canonical hub at vela-hub.fly.dev. No authentication, no rate limiting, CORS open. The signature scheme is the bind.
GET /entries
List all known frontier entries.
curl https://vela-hub.fly.dev/entries GET /entries/{vfr_id}
Get a single frontier's signed manifest and event count.
GET /entries/{vfr_id}/events
Read the canonical event log with cursor pagination.
curl "https://vela-hub.fly.dev/entries/{vfr_id}/events?since=<event_id>&limit=100" GET /entries/{vfr_id}/snapshot
Derived reduced state. Hubs may redirect this export to content-addressed object storage.
POST /entries
Publish a signed registry entry and optional substrate export.
vela registry publish <FRONTIER> \
--owner <ACTOR-ID> --key <PRIVATE-KEY> \
--to https://vela-hub.fly.dev The hub validates the manifest signature and hashes before promoting a live frontier row.
GET /.well-known/vela
Discovery endpoint. Returns hub capabilities, supported protocol versions, signing
algorithm (always ed25519-canonical-json-v1), and admin contact.
Event schema
Every event is canonical-JSON, signed with Ed25519 over the byte-canonical serialization (no pre-hash). The four primitive event types share a common envelope.
{
"v": 1, // protocol version
"id": "ev_8a3e...", // content-addressed event id
"ts": "2026-05-02T15:42:01Z", // ISO-8601 UTC, monotonic per actor
"actor": "did:key:z6Mk...", // signer's verifying key
"kind": "finding-drafted", // event type
"frontier": "vfr_bd91...", // target frontier
"payload": { ... }, // type-specific body
"sig": "ed25519:8c2a9f..." // signature over canonical bytes
} Full schema documentation, including the payload shape for each event kind, lives in the protocol spec at /spec. The primitives appendix walks the information model in prose.