Rundial

Experiment tracking on your infrastructure.

For training runs, agents and evals.

Skip the demo
  • Non-blocking run.log()
  • Live charts, up to 500 points per line
  • Spools to disk during API outages
  • Spikes survive downsampling

A simulated run page for vit-b16-pretrain with four metric charts, Insights and SDK health. Scroll down to advance from step 800 to step 3,289,474 and 10 million stored points; scroll up to rewind. During an API outage the page shows Offline and the SDK spools to disk. The points replay when the API returns. Each line draws at most 500 points.

Agents and evals.

Agent trace

Skip the demo
  • Traces from the SDK or OTLP
  • A scoped key per agent
  • Tokens and cost per session

A simulated agent trace. Scrolling plays the 3.18-second session: spans appear in start order and grow as they run. The totals reach 2,698 tokens and $0.0079. Scroll up to rewind.

Eval scorecard

Skip the demo
  • Versioned eval suites
  • Thresholds per scorer
  • Pass/fail gates

A simulated eval scorecard. Scroll through 1,200 examples. Exact match ends at 86%, above its 80% threshold. LLM judge falls below 80% at example 719 and ends at 78%; the gate fails. Scroll up to rewind.

Benchmarks.

10.52µs

p99 per call. W&B offline: 193.478 µs. MLflow with SQLite: 2,761.424 µs.

124,293points/s

sustained ingest, with chart queries at 60 ms p95.

0points lost

through our SIGKILL, API outage and ClickHouse restart tests.

See how we measured

Self-host with Docker Compose.

  1. Start the stack

    git clone https://github.com/rundial-dev/rundial
    cd rundial && bash scripts/setup/open_core_up.sh
  2. Make an API key

    Create one in default-project's settings. Export it as RUNDIAL_API_KEY.

  3. Install the Python SDK

    pip install rundial
  4. Log your first run

    import rundial as rd
    
    with rd.init(
        workspace="default-workspace",
        project="default-project",
        name="resnet50-lr3e-4",
    ) as run:
        for step, batch in enumerate(loader):
            loss = train_step(batch)
            run.log({"train/loss": loss}, step=step)

Start tracking.