
I built RunTrace, a small local-first CLI for preserving the context behind ML experiments — looking for honest feedback
Hi r/mlops,
I’m a student working on machine-learning experiments, and I kept running into a very ordinary problem: after several runs, I could no longer answer exactly which Git commit, configuration, and Python environment had produced a particular result.
I built RunTrace to address that problem.
RunTrace is a small, open-source, local-first Python CLI that records the reproducibility context around an experiment. Its scope is intentionally narrow: it is not trying to replace MLflow, Weights & Biases, or another full experiment-tracking platform.
It currently records:
- Git commit, branch, detached-HEAD state, and dirty state
- Python, operating system, architecture, and installed package versions
- Optional NVIDIA GPU, driver, and CUDA information
- A YAML configuration file, its SHA-256 hash, and its parsed values
- The command associated with the experiment
A typical workflow looks like this:
pip install ml-runtrace
ml-runtrace init
ml-runtrace snapshot \
--name baseline \
--config config.yaml \
--command "python train.py --config config.yaml"
ml-runtrace list
ml-runtrace show <run-id>
ml-runtrace diff <run-a> <run-b>
Snapshots are stored locally as readable YAML files under .runtrace/runs/. There is no account, server, or automatic upload.
There are also some deliberate limitations:
- It does not execute the recorded command.
- It does not currently track metrics, checkpoints, or model artifacts.
- It records that a Git working tree is dirty, but it does not save source patches.
- Explicit configuration values are stored in the snapshot, so users should inspect a snapshot before sharing it.
The project is still early, and I am trying not to add features without understanding whether they solve a real problem.
I would particularly appreciate feedback on these questions:
- Does this solve a useful gap, or is it too narrow compared with existing workflows?
- Is readable local YAML a sensible storage default?
- What missing metadata or edge cases would prevent you from using it?
- Is the
init → snapshot → list/show → diffworkflow understandable?
GitHub:
https://github.com/Corvus-226/RunTrace
Development note: I used Codex as a coding assistant during implementation. I handled the project scope, reviewed the changes, and managed the issue, pull-request, testing, CI, and release decisions. I am mentioning this because I would rather be transparent about how the project was built.
Critical feedback is genuinely welcome. If the idea is redundant, the defaults are wrong, or part of the workflow is unnecessarily complicated, I would rather learn that now than keep expanding it in the wrong direction.