novafabric.ai/demo

See it work

The whole capability surface, in order. One page, no signup, and the validation below runs in your browser against the real schema.

Everything on this page uses artifacts from the repository — a real capture fixture and the published run-capsule.schema.json. Where something is experimental, it says so. Nothing here is a mock-up of a feature that does not exist.

Watch it end to end

Seven minutes, recorded live on an Azure VM against Azure OpenAI with the signing key held in an Azure Key Vault HSM: capture, seal, nova verify, two tamper attempts caught and named, then the same run in the dashboard. The commands and their output are verbatim from that run — re-rendered on screen for legibility, not re-run or edited; the dashboard sections are real screenshots of the same run. The narration is a synthetic voice generated locally with Piper (MIT), not a cloud service.

Prefer your own terminal? pip install novafabric then nova capture python your_agent.py. The whole tour below takes about five minutes for real.

Interactive demos

One per primitive, each on its own page. They run in your browser on fixtures from the repository and do not talk to a server.

01/

Capture any command

works today

NovaFabric wraps a process. Not a framework integration, not a decorator you add to every call site — a wrapper around whatever you already run. A shell script, a notebook cell, an agent, a SLURM training job.

nova — bash
$ nova capture python review.py --diff examples/sample.diff ✓ Capsule written: ~/.novafabric/capsules/01KR5SQZPDGTKE3MDP3ZRX8WP1 trace.jsonl ✓ spans recorded model-calls.jsonl ✓ 2 LLM calls tool-calls.jsonl ✓ 2 tool invocations env.lock ✓ environment snapshot redaction-proof.json ✓ secret scan: 0 findings

The run exits with its own exit code. If NovaFabric fails, your workload still runs — never blocking the user's work is an architectural invariant, not a setting.

02/

Inspect the capsule — and try to break it

works today

Below is the manifest from that capture, validated against the real JSON Schema 2020-12 file from the repository. Ajv compiles the schema in your browser and reports what it finds.

A green check a website could have hard-coded proves nothing, so: break it. Delete a required field, change a type, put a nonsense value in an enum. If the check stayed green, this demo would be worthless — and for a project selling verifiable evidence, an unfalsifiable demo would be the wrong thing to ship.

TRY TO BREAK IT

invalid — undefined errors
{
  "schema_version": "0.1.0",
  "novafabric_version": "0.6.12",
  "run_id": "01KR5SQZPDGTKE3MDP3ZRX8WP1",
  "created_at": "2026-04-15T10:00:00+00:00",
  "finished_at": "2026-04-15T10:00:04+00:00",
  "duration_ms": 4127,
  "command": [
    "python",
    "review.py",
    "--diff",
    "examples/sample.diff"
  ],
  "exit_code": 0,
  "status": "success",
  "capture_mode": "cli-wrapper",
  "working_directory": "~/projects/code-review-agent",
  "host": {
    "arch": "x86_64",
    "os": "linux",
    "python": "3.12.4",
    "cpu_count": 16,
    "memory_bytes": 67108864000,
    "gpu": [],
    "hostname_redacted": true
  },
  "trace_ref": "trace.jsonl",
  "trace_root_span_id": "0123456789abcdef",
  "model_calls_ref": "model-calls.jsonl",
  "tool_calls_ref": "tool-calls.jsonl",
  "assets_ref": "assets.jsonl",
  "environment_ref": "env.lock",
  "replay_policy_ref": "replay.yaml",
  "redaction_proof_ref": "redaction-proof.json",
  "lineage_ref": "lineage.jsonl",
  "model_call_count": 2,
  "tool_call_count": 2,
  "mutating_tool_count": 0,
  "inputs": [
    {
      "name": "diff",
      "path": "inputs/sample.diff",
      "content_hash": "sha256:2a8439e85cae440ff7e28be7009b7056ccff0597d706a093a7e0c44e90f022b7",
      "size_bytes": 1240,
      "media_type": "text/x-diff"
    }
  ],
  "outputs": [
    {
      "name": "review",
      "path": "outputs/review.md",
      "content_hash": "sha256:5d93970a885c44d5babc3cf3dabcbcbd275e1c3df1fdd020f76126bc14bf5819",
      "size_bytes": 612,
      "media_type": "text/markdown"
    }
  ],
  "metadata": {
    "agent": "code-review-agent@0.1.0",
    "prompt": "code-review-prompt@0.1.0"
  }
}

The same check runs locally as nova validate <run-id>.

03/

Replay it

works today

A replay inspects the capsule, or re-runs it with supported model calls served from the recording, and writes a replay result. The experimental intervention mode also writes a counterfactual capsule you can diff against the original. There are five modes; what each one does is below.

ModeRe-runs the command?Best for
forensicno — read-onlyAudit and post-incident inspection
mockedyes — supported OpenAI / Anthropic replies served from the capsule; tools run liveCI and regression testing
semanticno — scores the recorded model responsesRemote LLMs that drift
exactno — reports whether a byte-exact re-run is possibleLocal / on-prem models
intervention (experimental)yes — one captured event substitutedCounterfactual root-cause

The limitation, stated up front. NovaFabric does not claim byte-exact replay of remote LLM calls. That needs a deterministic environment and a per-call seed — realistic for a local model, not for a hosted endpoint that can change under you. For remote models that drift, semantic mode scores how similar the recorded responses are on a 0.0–1.0 scale. If you have seen “deterministic replay” advertised for hosted models, this is what the honest version of that claim looks like.

04/

Diff two runs

works today

Something changed between Tuesday and Wednesday and the git diff is empty. Structural diff compares two capsules — outputs, environment, recorded files — rather than diffing log text.

nova — bash
$ nova diff RUN_A RUN_B Diff: 01KR5SQZPDGTKE3MDP3ZRX8WP1 → 01KR5T2A9WKPN6M3T8VZCJDR4Y changed=2 added=0 removed=0 Outputs: ~ outputs/review.md ~ model-calls.jsonl
05/

Trace lineage

works today

A directed provenance graph over runs, assets, and artifacts. It answers the three questions people actually ask:

SQLite by default. Kuzu, Postgres, AGE, and JanusGraph backends exist for cluster scale and are experimental.

06/

Export evidence anyone can verify

works today

The payoff. A signed bundle an auditor verifies offline, with no NovaFabric installed — only sha256sum and an ed25519 verifier. Evidence only its own tool can check is not evidence; it is a database row. An RFC 3161 timestamp is opt-in (--timestamp).

nova — bash
$ nova export-evidence ~/.novafabric/capsules/01KR5SQZPDGTKE3MDP3ZRX8WP1/ -o evidence.zip ✓ evidence.zip (in-toto DSSE, signed with your local Ed25519 key) $ nova verify evidence.zip ✓ every artifact digest recomputed ✓ signature valid
07/───THE REST OF THE SURFACE

Beyond the core loop. Everything below is implemented; the experimental label means the interface may still move, not that it is vapour.

Asset registry

works today

Versioned models, prompts, datasets and agent configs as name@version, pinned to a git SHA, with eval-gated promotion.

HPC / SLURM capture

works today

No daemon, no root, no privileged access. Compute-node hot paths write to a local spool, never a database.

Compliance exports

experimental

EU AI Act Annex IV, NIST AI RMF, GDPR Art. 30, NIS2, HIPAA, CycloneDX AI-BOM. Evidence workflows — not legal certification.

Cost & energy attribution

experimental

Per-run LLM cost from a local pricing catalog, and energy-anchored action receipts.

Local dashboard

experimental

nova serve --experimental. Read-only, binds to 127.0.0.1 only.

Server mode

experimental

Multi-user REST API, Postgres, object store, tenancy with row-level security.

Cluster-scale collector

experimental

Node spools, parent/child capsules, object capsule store, four lineage backends.

Knowledge graph & diagnosis

experimental

Capsule knowledge graph, causal-graph attribution, counterfactual root-cause search.

CLI reference: nova kg: the capsule knowledge graph

Run the whole thing yourself

nova — bash
$ pip install novafabric $ nova capture python my_agent.py $ nova validate <run-id> $ nova replay <run-id> --mode forensic $ nova diff <run-a> <run-b> $ nova export-evidence ~/.novafabric/capsules/<run-id>/ -o evidence.zip

If any of that does not work for you, that is a bug and we want to hear about it — not a sign you did it wrong.

full walkthrough →documentation →source →