Skip to main content

Strata

PyPI Python versions License CI Pre-commit Docker Docs codecov OpenSSF Scorecard

Strata is a content-addressed computation graph with an interactive notebook UI.

Every cell output is a versioned artifact keyed by its provenance: source, inputs, and environment. Strata reads each cell's AST to build the dependency graph automatically, so re-running a notebook is mostly a series of cache hits. Touch one cell and the cascade re-executes only the cells that depend on it. Identical inputs produce the same artifact whether the second run comes a minute later or a year later, on the same machine or a different one.

Prompt cells make AI calls first-class DAG nodes, cached by template, inputs, and model config. # @worker gpu-fly dispatches a cell to a remote GPU. # @mount data s3://bucket/prefix ro makes an S3 prefix available as a local pathlib.Path inside the cell. The whole notebook is plain .py files plus a manifest, so commits are git-diffable and there are no JSON blobs or execution metadata bleeding into the history.

Docs: bearing-research.github.io/strata

Give your coding agent a cached scratchpad

Coding agents explore by writing throwaway python -c and /tmp scripts: invisible, uncached, redone every session. Point one at Strata instead and it uses a persistent, cached notebook as its scratchpad: every snippet becomes a content-addressed cell, so the expensive step it ran ten turns ago is still a cache hit now, a human can watch it work live, and the work is a git-diffable directory instead of discarded scripts.

Install it as a one-command Claude Code plugin (needs the strata CLI on PATH; uv tool install strata-notebook):

/plugin marketplace add bearing-research/strata
/plugin install strata-scratchpad@strata

Does the agent reach for it instead of a scratch script? There's an eval that measures exactly that (evals/agent_notebook/): in the un-primed sessions tested so far it reaches for the notebook every time, and building the eval caught real bugs. Small sample, and honest about it. See Driving a notebook with a coding agent.

Highlights

  • agent scratchpad: a Claude Code plugin makes a coding agent use a cached notebook cell for throwaway Python instead of /tmp scripts - one-call add-and-run, and unchanged work is never recomputed
  • remote cells over SSH (0.6.0): hand a coding agent an SSH target and it provisions a strata-worker on the box, opens a secure tunnel, and routes heavy cells there, cached by provenance like everything else - connect_ssh_worker in-tool or strata agent --worker-ssh user@host, with # @worker local to keep a cell on this machine
  • content-addressed: every cell output is keyed by source + inputs + environment - identical work hits the cache forever
  • reactive: edit a cell, the cascade re-runs only the downstream cells that depend on it
  • dag-from-ast: Strata reads each cell's AST to wire upstream/downstream - no decorators, no manual edges
  • dag-view: the dependency graph renders alongside the cells - double-click any node to jump to its source
  • ambient client (0.3.0): every cell gets a ready strata client in its namespace - publish and consume artifacts across cells with no boilerplate
  • registry in the UI (0.3.0): promote and approve named artifacts from a notebook dashboard - pending-approval queue, alias chips, and model ← features ← scan ← table lineage
  • git-friendly: notebooks are plain .py files plus a TOML manifest - readable diffs, no JSON blobs
  • prompt cells: LLM calls are first-class DAG nodes, {{ variable }} interpolation from upstream cells, cached by template + inputs + model config
  • SQL cells: named connections, bind-parameter templating, drivers for DuckDB / SQLite / Postgres / Snowflake / BigQuery
  • R cells (0.2.0): Python and R cells share a DAG; cross-language Arrow exchange means a pandas.DataFrame is a data.frame for the next cell. First-class in the UI - Add-R-cell menu, an R environment panel with one-click renv bootstrap + package install, automatic renv::restore() on open, and inline plots (ggplot2 / base graphics render to PNG). Runs headlessly too - strata run executes R cells for CI
  • loop cells: # @loop max_iter=N carry=state iterates a cell with explicit carry between steps - each iteration is its own artifact
  • variant sweep (0.4.0): a variant group can run in sweep mode - every variant executes and the downstream cell receives a {variant_name: value} dict, for comparing models / hyperparameters / prompts side by side in one cell (switch mode runs only the active variant)
  • cell unit tests (0.4.0): a 🧪 Tests panel on any Python cell runs real pytest against the cell's defs and upstream inputs (def test_x(cell): assert cell.featurize(cell.trips)…) - assertion rewriting, fixtures, and parametrize all work; the toggle doubles as a health badge (✓ 4/4, red on fail, · stale when the cell changed)
  • MCP server (0.5.0): expose a running notebook session to an external coding agent (Claude Code, any MCP client) at /mcp - the agent reads, runs, authors, and manages dependencies against a warm session, and you watch it happen live in the browser or the terminal viewer. claude mcp add --transport http strata http://localhost:8765/mcp. Personal-mode only, behind the [mcp] extra
  • interactive widgets + app view (0.5.0): a widget cell is a declarative control panel (slider / number / dropdown / checkbox / text); each control is an input downstream cells consume, and with ⚡ Live on, dragging one recomputes the cells that depend on it. Open a notebook as a read-only app (/app/<id>), embed that app view in another site as an <iframe>, or export a frozen, self-contained snapshot (strata export --app-view)
  • interactive data viewer (0.5.0): DataFrame outputs render in a grid you can page, sort, filter, and search - backed by the full cached artifact, not a 20-row preview - with CSV / Parquet export (in the web UI and the terminal viewer)
  • per-variant fan-out (0.5.0): # @per_variant runs a cell once per variant of a sweep group - each variant its own artifact, cache entry, and worker dispatch, so adding a variant only runs the new instance
  • terminal viewer (0.4.0): strata-notebook-tui attaches to a running notebook and renders it live in the terminal - cells flip status as they run, syntax-highlighted source, tables and markdown rendered, a layered DAG view (d), and an Agent tab that streams an AI agent's reasoning as it drives the notebook. Read-only - watch an agent (or a run-all) work in one terminal from another. Ships behind the [tui] extra (uv tool install "strata-notebook[tui]")
  • agent CLI (0.4.0): the strata command drives a notebook end to end - inspect (cell list/show, dag, status), run one cell at a time (cell run/test), and author (cell add/edit/rm/mv, cell annotate, dep add/rm) - all with --format json and stable exit codes. Works offline against a notebook directory or against a live session on a running server (--server/--session), so an agent builds and runs a notebook the same way whether or not a server is up
  • agent on-ramp: strata agent ./nb is one command that stands up an MCP-enabled server, opens a session, writes .mcp.json + a CLAUDE.md working agreement, and attaches the terminal viewer - point a coding agent (Claude Code) at a live notebook and watch it build cells. The notebook doubles as the agent's persistent, cached scratchpad: unchanged cells (even a leaf cell that only prints) replay instantly instead of recomputing, so exploration is captured and watchable instead of thrown away in /tmp. A cell whose point is a side effect or a fresh value opts out with # @nocache
  • distributed: # @worker gpu-fly dispatches a single cell to a remote box - bring your own compute
  • mounts: # @mount data s3://bucket/prefix ro makes any S3 / GCS / Azure prefix a local pathlib.Path
  • isolated envs: every notebook gets its own uv-managed .venv/, locked and reproducible
  • auto-install: missing import in a cell? one click adds the package via uv and re-runs
  • headless: strata run ./my-notebook for CI and scheduled execution - same DAG, same cache
  • also a library: the materialization layer is exposed via HTTP + a StrataClient, usable from any Python process
  • slim client package (0.3.0): pip install strata-client pulls only httpx + pyarrow - use the store from any pipeline or service, no server install
  • production-ready: Iceberg-aware scans, trusted-proxy auth, multi-tenancy, S3 / GCS / Azure / local blob backends

Quick Start

Both paths below run in personal mode: single-user, writes enabled, no proxy auth. For multi-tenant or hosted deployments, see Deployment Modes.

# Docker. docker-compose.yml sets personal mode for you.
docker compose up -d --build
# Then open http://localhost:8765

# Or install via uv (recommended). Fetches the wheel from PyPI into a
# uv-managed tool env at ~/.local/share/uv/tools/strata-notebook with
# the CLI on PATH. Plain `pip install` is not supported - Strata refuses
# to start outside a uv-managed env (see Requirements below).
uv tool install strata-notebook
strata-notebook
# Then open http://localhost:8765

For the full inventory of installed commands (strata-notebook, strata, strata-worker, python -m strata), see the Commands reference.

Source builds - git clone + uv sync - work too and are documented in Installation; needed only if you're modifying Strata itself.

Requirements

  • uv ≥ 0.8 - install via the uv installer (curl -LsSf https://astral.sh/uv/install.sh | sh on macOS/Linux; PowerShell installer on Windows). Strata refuses to start outside a uv-managed environment: the startup check looks for the uv = <version> marker that uv writes to pyvenv.cfg. uv tool install, uv add, and uv run all produce envs with this marker; plain pip install into a hand-rolled python -m venv does not, and Strata will refuse to start there. Conda and pip-venv users need to install uv and re-launch from a uv-managed env - existing data and other environments are untouched. uv fetches a matching Python for you, so you don't need Python pre-installed.

Source build (only if you're building Strata itself from a git clone, not using PyPI or Docker):

  • Rust toolchain (rustup) - for maturin to compile the native extension. PyPI wheels skip this step.
  • Node 26+ / npm - for the frontend npm ci && npm run build step. PyPI wheels bundle the prebuilt SPA.
  • Python 3.12+ is handled automatically by uv sync.

Windows: uv tool install strata-notebook works directly. Source builds work via WSL2 (smoother) or native Windows (uv + rustup + Node have Windows installers).

Why uv at runtime: the notebook subsystem shells out to uv to manage per-notebook .venv/ directories, and the project's dev workflow assumes uv as the install path. Failing fast at startup with a clear message beats a confusing subprocess error later.

The Cache Advantage

Every notebook platform re-executes from scratch when you change one cell. Strata doesn't. The artifact store deduplicates by provenance hash. If the code and inputs haven't changed, the result is served instantly.

First run:     load data (10s) → clean (3s) → train (20s) → evaluate (1s)  = 34s
Change model:  load data (✓)   → clean (✓)  → train (20s) → evaluate (1s)  = 21s
Re-run:        load data (✓)   → clean (✓)  → train (✓)   → evaluate (✓)   = <1s

This isn't a feature bolted on. It's the architecture. Every cell execution is a materialize(inputs, transform, environment) → artifact operation, and the cache is correct by construction because it's keyed on content, not time.

Even a leaf cell that only prints is cached: its console output is keyed by the same provenance hash, so an unchanged re-run replays the output instantly rather than executing again. That makes the notebook a good scratchpad - a coding agent's exploratory snippets stop recomputing. Cells that must always run (a side effect, a live API call, a fresh random draw) opt out with # @nocache.

Distributed Execution

Each cell can declare which worker it runs on via a single annotation:

# @worker my-gpu
embeddings = model.encode(abstracts, batch_size=256)

You define workers in notebook.toml. Each one points at an HTTP endpoint that implements the Strata executor protocol. A worker can be a GPU box on RunPod, a DataFusion cluster on Fly, a beefy EC2 instance, or anything else that speaks HTTP. The notebook routes the cell to the declared worker at execution time, and the UI shows a live "dispatching to my-gpu" badge while it runs.

No deployment code, no infrastructure glue. Bring your own compute, one annotation per cell.

Source Annotations

Every piece of per-cell metadata is a comment directive in the cell's source. The source is the single canonical place for cell config: annotations always win over any stored defaults.

# @name Extract embeddings
# @worker gpu-fly
# @timeout 600
# @env MODEL_PATH=/models/bge-large
# @mount dataset s3://corpus/2024-q4 ro
embeddings = model.encode(dataset / "abstracts.jsonl")

Diagnostics fire on open, reload, and after an edit settles: worker_unknown, mount_uri_unsupported, mount_shadows_notebook, timeout_not_numeric, env_malformed. They surface as a pill in the cell header and log structured warnings for headless runs.

Mounts

Mounts bind a remote URI to a local path inside the cell. Supported schemes: file://, s3://, gs://, az://. Credentials flow through fsspec options: set anon = true for public buckets, or drop it to use the standard credential chain.

[[mounts]]
name = "taxi_zones"
uri = "s3://nyc-tlc/misc"
mode = "ro"
options = { anon = true }

Inside the cell, taxi_zones is a pathlib.Path. Strata materializes it on first read and caches the bytes locally for the session.

Examples

Example What it shows
pandas_basics Linear DataFrame chain, caching, staleness propagation, per-cell unit tests
iris_classification End-to-end ML, DAG branching, mixed output types
titanic_ml Feature engineering + model comparison
s3_mount Reading a public S3 bucket via a mount
arxiv_classifier Distributed execution via @worker + Modal GPU + Fly cluster
markdown_showcase Markdown cells, dynamic Markdown(...) outputs, security cases
library_cells Cross-cell library code: pure module cells, mixed runtime+library cells, the limits
news_alpha_trader Multi-stage trading pipeline with prompt cells and structured LLM outputs
review_triage Prompt cell with # @output_schema - structured, schema-validated LLM output
r_mtcars_analysis Pure-R notebook - mtcars regression with inline ggplot2 / base-graphics plots
r_lm_vs_sklearn Cross-language R + Python - R lm() vs scikit-learn over shared Arrow data
sql_orders_report SQL cells over a local SQLite warehouse, mixing SQL / Python / markdown
widget_playground Widget cell (control panel) driving a downstream cell, with # @live reactivity
model_variants Variant groups - alternative training cells sharing one DAG slot (switch mode)
model_variants_sweep Variant sweep mode - run every variant and compare them in one downstream cell
loop_hill_climb # @loop / # @loop_until iteration with carry and per-iteration artifacts
data_viewer Interactive data viewer - page / sort / filter / search the full cached artifact
agent_demo A coding agent builds the notebook live; only the eval re-runs when the model caches

Known rough edges

Strata is young and a few surfaces are explicitly exploratory. The core (materialization, artifact store, DAG, caching, headless run) is stable in the alpha sense; these are the bits where the API or coverage is still moving:

  • Prompt-cell API. Streaming, conversation memory, and structured-output validation are not yet finalized - expect breaking changes in 0.x.
  • SQL cell cloud drivers. DuckDB / SQLite / PostgreSQL are exercised in CI. BigQuery and Snowflake adapters ship but lack integration test coverage; pin a Strata version in production until that lands. MotherDuck and MySQL are planned but not yet implemented.
  • Wire / on-disk formats. notebook.toml, .strata/runtime.json, and the artifact cache layout may change between minor versions during 0.x. Rely on the Python API surface, not the file shapes.

Library usage

Strata's HTTP API exposes the materialization layer directly, driveable from Python via StrataClient. Useful for direct table scans, custom transforms, and headless workflows; the notebook executor is a separate pipeline that writes to the same artifact store. The client talks to a running Strata server, so this workflow has two steps: start the server, then call it from your code.

# 1. Install + start the server (in a uv-managed env).
uv tool install strata-notebook
strata-notebook

# 2. In your own project, install the slim client - a separate package
#    (httpx + pyarrow only, no server deps, plain pip is fine) - and
#    point it at the running server:
pip install strata-client
from strata_client import StrataClient

client = StrataClient(base_url="http://localhost:8765")
artifact = client.materialize(
    inputs=["file:///warehouse#db.events"],
    transform={"executor": "scan@v1", "params": {"columns": ["id", "value"]}},
)
table = client.fetch(artifact.uri)  # Arrow table, cached by provenance

The server provides: provenance-based deduplication, immutable versioned artifacts, lineage tracking, Iceberg table scanning with row-group caching, pluggable blob storage (local/S3/GCS/Azure), multi-tenancy, trusted-proxy auth, and an executor protocol for external compute.

Library docs →


Architecture

┌─────────────────────────────────────────────┐
│ Notebook UI (Vue.js + WebSocket)            │
│ cells, DAG view, AI assistant, workers      │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ Notebook Backend (FastAPI)                  │
│ session, cascade, executor, prompt cells    │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ Strata Core                                 │
│ materialize, artifacts, lineage, dedupe     │
└─────────────────────────────────────────────┘

The notebook is an orchestration layer over Core. It decides what to run next (cascade planning, staleness tracking). The cell harness is an executor. Core decides whether results already exist and persists them.

Development

uv sync --all-extras                   # Install deps + build Rust extension (matches CI)
uv run pytest                          # Run all tests
uv run pre-commit run --all-files      # Lint + format
cd frontend && npm run dev             # Frontend dev server (hot reload)

License

Apache 2.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strata_notebook-0.6.0.tar.gz (1.2 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

strata_notebook-0.6.0-cp312-abi3-win_amd64.whl (2.3 MB view details)

Uploaded CPython 3.12+Windows x86-64

strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.4 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.3 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

strata_notebook-0.6.0-cp312-abi3-macosx_11_0_arm64.whl (2.3 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

strata_notebook-0.6.0-cp312-abi3-macosx_10_12_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

Details for the file strata_notebook-0.6.0.tar.gz.

File metadata

  • Download URL: strata_notebook-0.6.0.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for strata_notebook-0.6.0.tar.gz
Algorithm Hash digest
SHA256 463738d18869e84fa8d22b0998c7d18c8ee7904c2de4662a2ca1d33e8fc9f61c
MD5 69a129b36ff2f6f49232a059fc452b1b
BLAKE2b-256 f0846966ee08e6eafd7ffa2434dde3ba6d3a4751d572d162a497f79a04405c42

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0.tar.gz:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strata_notebook-0.6.0-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for strata_notebook-0.6.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5341d8686c21a8572361524cf3991727eff8627e8fdb2ad24d3c2bfa9423a6ae
MD5 90d7fea24e0d4622e85a8528b32e9a32
BLAKE2b-256 edc05d4e57e5fdfa52d9d5270d889bc122ba17c11e3e09063aebe6c8af2fda73

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0-cp312-abi3-win_amd64.whl:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e5483f527af212d9c229817f9779b0d387c4407eb98fca2fba2b40a5649cd113
MD5 4cb4b8375ebad10bdfc37801fec1d951
BLAKE2b-256 a4844e9463ac693c4db8da9e143d5fa9245145c1e39d4c9dabe269d656044bd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 965740927134d393385622ee5a3f84e8c8aa42e4e757166012543915e641ea28
MD5 d3b273a30618ab60dc659de1e3a27ccd
BLAKE2b-256 4c95a676b586098c731ca67ae55aa3cce68bb16f1684508233573cdd3e517307

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strata_notebook-0.6.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for strata_notebook-0.6.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a01ffe997178a7a75635f03cbf097e4070db99699bc0b507979a20a870d70f31
MD5 8b5ac142c920a56aed1689cef9f1e3ed
BLAKE2b-256 9d77a393a11b306472f01cbda1e7664a5697fb9b4469266bb405589765af1c42

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file strata_notebook-0.6.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for strata_notebook-0.6.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e1c0c1be6c243243325f6781cc57334cb7f9f719afdf08e53e8a9753f53f047c
MD5 3692c12b3ef344b72bed3383c9b92a6a
BLAKE2b-256 cd24412772cadb887efa41278399a877587ca16cea824289910802e92f680b52

See more details on using hashes here.

Provenance

The following attestation bundles were made for strata_notebook-0.6.0-cp312-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on bearing-research/strata

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.6.0 This release

6 files

0.5.0

6 files

0.4.0

6 files

0.3.0

6 files

0.2.0

6 files

0.1.0

6 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page