Local-first, zero-server experiment tracking for researchers
Project description
bathos
Public alpha — experimental software. bathos is under active development and should be considered a work in progress. APIs, catalog schema, and CLI commands may change between releases without a deprecation period. It is used in production by the author, but expect rough edges and missing features. Feedback and bug reports welcome.
Local-first, zero-server experiment tracking for researchers working across multiple projects and SLURM clusters.
Never lose track of what ran, what it produced, or whether results are still valid.
Install
uv tool install bathos
Quick start
# Register this project (creates .bth.toml + scripts/ skeleton)
bth init
# Run and track an experiment
bth run scripts/experiments/benchmark_tip3p.py -- --n-steps 1000 --out outputs/run1.parquet
# Query recent runs
bth ls --since 7d
bth show <run-id>
# Check catalog runs for git-drift freshness
bth check [--status <status>] [--check-outputs]
# Escape hatch: raw DuckDB SQL against the catalog
bth sql "SELECT project_slug, count(*) FROM runs GROUP BY 1"
bth run flags
v0.3+ flags:
--agent-mode collaborative|autonomous— declare whether this run is agent-driven--derived-from <run-id>— record parent run for lineage tracking--campaign <campaign-id>— associate this run with a campaign--no-sidecar— bypass sidecar enforcement (use for ad-hoc runs)
CLI Reference
Core commands:
bth init— initialize bathos in a projectbth run— execute and track an experimentbth ls— list recent runsbth show <run-id>— display run detailsbth find— search runs by criteriabth sql— raw DuckDB query against catalogbth check— check catalog runs for git-drift freshnessbth lineage <run-id>— show ancestor chain following parent_run_id linksbth sprint-audit [--hours N]— audit recent runs across all registered projectsbth lint [--project-root PATH]— check scripts/ for naming conventions and missing sidecarsbth new-experiment <name>— scaffold a new experiment script and sidecarbth migrate— upgrade cool-tier Parquet fragments to current schema versionbth export— export the using-bathos skill and register MCP server
bth remote — Manage sync remotes
bth remote add <name> <url>— add an SSH remote for catalog syncbth remote list— list configured remotesbth remote remove <name>— remove a remotebth remote test <name>— test SSH connectivity to a remote
bth campaign — Manage experiment campaigns (v0.3+)
bth campaign create <id> --hypothesis <text>— create a new campaignbth campaign add <run-id> --campaign <id>— associate a run with a campaignbth campaign ls— list campaignsbth campaign show <id>— show campaign details and runsbth campaign review <id>— statistical summary and anomaly detectionbth campaign conclude <id> --outcome <label>— close campaign with outcome
Script conventions
bth init scaffolds the following structure in your project:
| Directory | Purpose | Naming | Tracked |
|---|---|---|---|
scripts/experiments/ |
Typer experiment runners | verb_noun.py |
Yes |
scripts/analysis/ |
Post-hoc analysis and plots | verb_noun.py |
Optional |
scripts/validation/ |
Correctness checks | verb_noun.py |
Optional |
scripts/benchmarks/ |
Performance benchmarks | verb_noun.py |
Yes |
scripts/data/ |
Data pipeline / conversion | verb_noun.py |
No |
scripts/slurm/ |
SLURM job files + env helpers | verb_noun.slurm |
Via wrapper |
scripts/debug/ |
Debug specific issues | YYMMDD_desc.py |
No |
scripts/explore/ |
Open-ended investigation | YYMMDD_desc.py |
No |
scripts/scratch/ |
Catchall / ephemeral | YYMMDD_desc.py |
No (gitignored) |
Python decorator
For Typer-based scripts that want direct integration:
import bth
@bth.experiment(name="benchmark_tip3p", tags=["tip3p", "nvt"])
def main(n_steps: int, out: Path):
...
SLURM
bth init generates a scripts/slurm/_bth_env.sh helper. Source it in job scripts to get automatic provenance capture for batch runs.
Catalog
All runs land in ~/.bth/catalog/ as DuckDB + Parquet. Query with bth ls, bth find, or raw bth sql.
Documentation
Full documentation is available at https://bathos.readthedocs.io.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bathos-0.3.1.tar.gz.
File metadata
- Download URL: bathos-0.3.1.tar.gz
- Upload date:
- Size: 255.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a29973ba1d31976f152164ee1f2035a88f3b5ff8c8911a005ea4e9b392a6473b
|
|
| MD5 |
17b7068615734361b905c2dd440492e0
|
|
| BLAKE2b-256 |
aeebd1fd4e8464f1fce1e2ebf7af8eac0cdf96de157337f894ac7fb22b22f781
|
File details
Details for the file bathos-0.3.1-py3-none-any.whl.
File metadata
- Download URL: bathos-0.3.1-py3-none-any.whl
- Upload date:
- Size: 72.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.15 {"installer":{"name":"uv","version":"0.11.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07461f296317eeb796ec8f3fa15073365ede9790269f9d13cf48148b8490756d
|
|
| MD5 |
ba760476487d6f3a62591e042d5972e6
|
|
| BLAKE2b-256 |
b2695dc352ad3c7ee72f5e55ff79e15b1bc3b280b3e3994517c80f80d44043c1
|