Skip to main content

sillon

Git for simulations — log, track and query your simulation runs.

PyPI Python License


You ran the simulation four months ago. The figure is in the paper draft. Which parameters produced it, and is the array it was plotted from still on disk?

sillon answers that. It records the parameters, results, figures, metadata and source of every run into a local store, and gives you a CLI and a Python API to query them afterwards. It is local-first, needs no server and no account, and is built for people who run parameter sweeps rather than training loops.

pip install sillon

Log a run

Three lines in a script you already have:

import sillonpy as sp

with sp.track_run(run_name="my_fit", project_name="demo"):
    sp.log_param("degree", 1)                  # what you chose
    coef = np.polyfit(x, y, 1)
    sp.log_result("coef", coef)                # what came out
    sp.add_tag("baseline")

Run it normally. No setup step, no sillon init — the first call creates .sillon/ next to your script. Large arrays go to HDF5 automatically; runs are never overwritten.

Look at it

sillon list            # every run in the project
sillon show my_fit        # one run in detail
sillon projects           # every project on this machine, and where it is
╭─ Shaking Lattice ─────────────────────────────────────────────────────────────────────╮
│                                                                                       │
│  2 runs logged in the project                                                         │
│                                                                                       │
│     ID           Run Name            When         Params     Assets      Status       │
│   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   │
│     39629020     trusting_cannon     just now       2          2         SUCCESS      │
│     7e7e5330     happy_perlman       just now       2          2         CRASHED      │
│                                                                                       │
╰───────────────────────────────────────────────────────────────────────────────────────╯

Query it

Plain Python — no query language:

import sillonlab as sl

project = sl.load_project()

best = project.query(
    tags="sweep",
    parameters={"degree": lambda d: d <= 3},   # cheap: filtered in SQL
    results={"rmse": lambda v: v < 0.1},       # heavy: only on what survived
).sort_by("rmse")[:5]

print(best.to_dataframe())

What makes it different

The record is trustworthy. A run that crashed is recorded as CRASHED, with the exception type and message — never as a success. A log call that fails raises instead of silently dropping your data.

Runs remember their code. Every run is versioned by what its code does — your entry script and your own modules, hashed structurally — so tuning a constant does not read as a change but fixing a sign error does. sillon versions then answers the question you actually have: which of my runs used the code from before I fixed that bug?

Runs remember their ancestry, without being told. Load an earlier run's result through sillonlab and log a new run, and the link is recorded for you, naming what passed between them. No inherit= to remember.

Figures and analyses remember their data. log_figure(fig, used=["coef"]) and add_analysis("spectrum", data, used=["field"]) record what produced them:

fit       ← built from: coef, degree
spectrum  ← computed from: field

Diffs tell you whether a comparison was fair. sillon diff a b reports parameters with a real delta, whether the code differed in logic or only in a tuned constant, and whether results moved — arrays by shape, dtype and hash, never element by element.

Files remember their run. Everything is content-hashed, so sillon trace figures/fit.png tells you which run produced a file you found.

Runs travel. sillon export writes one file holding everything needed to rebuild a set of runs elsewhere — arrays, artifacts, figures, lineage, code versions — and sillon import adds whatever the project does not already have. Union, never overwrite, so importing twice is a no-op and nothing local can be lost. On one machine you skip the file entirely: sillon import ../other-project, or sillon import --scan ~/Code/phd to fold in a tree of them.

It stays out of the way. Zero configuration, a background daemon you never start, and heavy arrays offloaded without you thinking about it.

Documentation

Quickstart five minutes, end to end
Core concepts the mental model — read once
Logging runs the whole logging API
Querying and analysis working with many runs
Provenance and lineage code versions, automatic lineage, figures, hashes
Moving runs between machines bundles, merging projects, the shared drive
Working with projects finding, naming, moving them
CLI reference every command
Troubleshooting when something breaks

Runnable examples: a quickstart, a parameter sweep, and figure provenance.

Requirements

Python 3.11+ on Linux, macOS or Windows. CI runs the full suite on all three.

How it works

Your script sends what it logs to a small per-project background daemon, which writes to SQLite (light values, so filtering is fast) and HDF5 (heavy arrays). The CLI and sillonlab both read through one engine, so they never disagree. See Architecture.

Status and roadmap

The logging API, the daemon, the CLI and the analysis library are in daily use.

Not implemented yet, despite appearing in older notes: sillon run (reproduction), sillon watch, sillon estimate, a GUI, Slurm integration, and non-Python clients. If a command is not in the CLI reference, it does not exist.

Contributing

git clone https://github.com/balerat/sillon
cd sillon
pip install -e ".[dev]"
make test

See Contributing and Development setup.

License

Apache-2.0. See LICENSE.

Metadata

Release files for sillon 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sillon 2.1.0
File Size Uploaded
sillon-2.1.0.tar.gz 155.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sillon 2.1.0
File Interpreter ABI Platform
sillon-2.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 333.4 kB

Release files / sillon-2.1.0.tar.gz

Download URL sillon-2.1.0.tar.gz
Size 155.2 kB
Tags Source
SHA-256 checksum
How to use checksums
77364cb98b70d7c3b7bdb7af68c45af2847ec8c950581a6aac445a980502f97d
BLAKE2b-256 checksum
How to use checksums
9cb0d91b939fa515d20bfc6136594ec7bffa36903d8547295fdba4c839e17b76
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release files / sillon-2.1.0-py3-none-any.whl

Download URL sillon-2.1.0-py3-none-any.whl
Size 178.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
059281045f09e6ae6b80167e029b721ec1ff376ee9bcb1d14f21d092954d9a08
BLAKE2b-256 checksum
How to use checksums
4e3a17841dd27499e6073be1ca9459aff9dfe581b9c23bc1edef97ab1090fac0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.1.2

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.1.0

2 release 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