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

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.2
File Size Uploaded Provenance Actions
sillon-2.1.2.tar.gz 155.3 kB With provenance Details for sillon-2.1.2.tar.gz

Built distribution (wheel)

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

Total release size: 333.5 kB

Release files / sillon-2.1.2.tar.gz

Download URL sillon-2.1.2.tar.gz
Size 155.3 kB
Tags Source
SHA-256 checksum
How to use checksums
0d7244b52620eb9a7a9eef1c775eb9820cbc8e76d868375514b21d863e72fc7b
BLAKE2b-256 checksum
How to use checksums
920c68a2790b92db9be8f2a4319f2aeaae7d7ceb8ef4457be47993735057a33d
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 17, 2026.

Transparency log

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

Download URL sillon-2.1.2-py3-none-any.whl
Size 178.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
922f9ecc572ef8eae5a7e094f6bbc7810a0e7f2d7203a019f9626acbc42cc245
BLAKE2b-256 checksum
How to use checksums
e8bd61fe7e7f5b12d25498cb6ca3085cc84ceb659d6605c45a50ca28fd2ed6c0
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 17, 2026.

Transparency log

Security for sillon 2.1.2

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.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for sillon-2.1.2.tar.gz

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 17, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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