Lightweight experiment tracking — drop-in compatible with TensorBoard and W&B APIs.
Project description
vibetrack
Lightweight experiment tracking — drop-in compatible with TensorBoard and W&B APIs.
No cloud. No account. No signup. Just a single SQLite file.
Why vibetrack?
| TensorBoard | W&B | vibetrack | |
|---|---|---|---|
| Storage | tfevents files | Cloud (paid tiers) | Single SQLite DB |
| Account required | No | Yes | No |
| AI agent integration (MCP) | No | No | Built-in |
| Distributed torchrun support | Manual | Manual | Automatic (rank-0 only) |
| Single-port server (web + API + ingest) | No | N/A | Yes |
| Viewer backends | Web only | Web only | Web, Gradio, Telegram, Console, MCP |
| System metrics | Via plugin | Built-in | Built-in (CPU, GPU, memory, disk) |
| Remote HTTP logging | No | Yes (cloud) | Yes (self-hosted, token auth) |
| Zero mandatory dependencies | No | No | Yes |
Install
pip install vibetrack # default
pip install vibetrack[all] # all optional backends
Quick start
TensorBoard-style API
from vibetrack import SummaryWriter
writer = SummaryWriter("runs/exp1", project_folder="my_project")
for step in range(100):
writer.add_scalar("loss", 1.0 / (step + 1), step)
writer.add_scalar("acc", step / 100, step)
writer.close()
W&B-style API
import vibetrack
vibetrack.init(project="my_project", name="run_1", config={"lr": 0.01, "epochs": 50})
for step in range(100):
vibetrack.log({"loss": 1.0 / (step + 1), "acc": step / 100})
vibetrack.finish()
Launch the dashboard
vibetrack
# -> Web UI + MCP server + ingest endpoint on http://0.0.0.0:6006
API reference
SummaryWriter
from vibetrack import SummaryWriter
writer = SummaryWriter("runs/exp1", name="experiment_name", project_folder="project/")
# Scalars
writer.add_scalar("loss", 0.5, step=0)
writer.add_scalars("metrics", {"train_loss": 0.5, "val_loss": 0.6}, step=0)
# Images — accepts file paths, numpy arrays, or PIL Images
writer.add_image("samples", "path/to/image.png", step=0)
# Audio — accepts file paths or numpy waveforms
writer.add_audio("speech", waveform_array, step=0, sample_rate=16000)
# Video
writer.add_video("rollout", "path/to/video.mp4", step=0)
# Artifacts — any file with optional metadata
writer.add_artifact("checkpoint", "model.pt", step=0, metadata={"val_acc": 0.95})
# Text
writer.add_text("notes", "Training started with lr=0.01", step=0)
# Histograms
writer.add_histogram("weights", weight_tensor, step=0)
# Hyperparameters
writer.add_hparams({"lr": 0.01, "batch_size": 32}, {"best_acc": 0.95})
writer.close()
W&B-compatible module API
import vibetrack
from vibetrack import Image, Audio, Video, Artifact
vibetrack.init(project="nlp", name="bert-finetune", config={"lr": 3e-5})
# Log scalars
vibetrack.log({"loss": 0.3, "acc": 0.92})
# Log media with wrapper types
vibetrack.log({"sample": Image("output.png")})
vibetrack.log({"audio": Audio("clip.wav", sample_rate=22050)})
vibetrack.log({"demo": Video("result.mp4")})
vibetrack.log({"model": Artifact("best_model.pt", metadata={"epoch": 10})})
# Access config
vibetrack.config["lr"] # 3e-5
vibetrack.finish()
Comparison and analysis
from vibetrack import RunReader
from vibetrack.compare import compare_scalars, compare_hparams, summary_table
reader = RunReader("my_project/")
experiments = reader.experiments()
# Summary table — last value of each tag per experiment
summary_table(experiments, tags=["loss", "acc"])
# Compare scalars with smoothing
compare_scalars(experiments, "loss", smoothing="ema", weight=0.6)
# Side-by-side hyperparameter comparison
compare_hparams(experiments)
Smoothing
from vibetrack import smooth, ema, moving_average, gaussian
smoothed = ema(values, weight=0.6) # Exponential moving average
smoothed = moving_average(values, window=10) # Uniform window
smoothed = gaussian(values, sigma=2.0) # Gaussian kernel
smoothed = smooth(values, method="ema", weight=0.6) # Unified dispatcher
Distributed training (torchrun)
vibetrack automatically detects RANK / LOCAL_RANK environment variables. Only rank 0 logs data — all other ranks get a silent no-op writer.
torchrun --nproc_per_node=4 --nnodes=2 train.py
# train.py — no code changes needed
from vibetrack import SummaryWriter
writer = SummaryWriter("runs/distributed", project_folder="project/")
# Only rank 0 writes to the database. Other ranks silently skip.
writer.add_scalar("loss", loss.item(), step)
writer.close()
Force all ranks to log:
writer = SummaryWriter("runs/distributed", rank="all")
Remote logging over HTTP
vibetrack's built-in ingest endpoints accept metrics from remote machines:
# Server (included in default web server)
vibetrack my_project/ --token mysecret
# -> Ingest at http://host:6006/{project}/listen/log
# Remote client
import requests
requests.post("http://server:6006/my_project/listen/log", json={
"experiment": "remote_run",
"step": 42,
"scalars": {"loss": 0.3, "acc": 0.91},
"texts": {"note": "checkpoint saved"},
}, headers={"Authorization": "Bearer mysecret"})
Upload media:
requests.post("http://server:6006/my_project/listen/media",
data={"experiment": "remote_run", "tag": "sample", "step": "0", "type": "image"},
files={"file": open("output.png", "rb")},
headers={"Authorization": "Bearer mysecret"},
)
System metrics
Built-in collection of CPU, GPU, memory, and disk metrics. Runs in a background thread.
writer = SummaryWriter("runs/exp1", system_metrics_interval=3600) # every hour (default)
Collected metrics: system/cpu_percent, system/mem_used_gb, system/disk_free_gb, gpu/utilization, gpu/memory_used_gb, gpu/temperature, and automatic alerts when resources are critically low.
MCP server (AI agent integration)
The web dashboard includes an MCP (Model Context Protocol) server at /vibetrack_mcp, enabling AI agents like Claude to query your experiment data directly.
Available MCP tools: list_experiments, get_experiment_tags, get_scalars, get_texts, get_images, get_audio, get_hparams, get_histograms, summary, compare_hparams_tool
MCP resources: vibetrack://experiments, vibetrack://experiments/{name}, vibetrack://experiments/{name}/scalars/{tag}, etc.
Standalone MCP server:
vibetrack --viewer mcp --project-folder my_project/
CLI
vibetrack # default
vibetrack [PROJECT_FOLDER] # Launch dashboard (web + MCP + ingest)
vibetrack --port 8080 # Custom port
vibetrack --host 127.0.0.1 # Bind to localhost only (by default it is open on LAN IP)
vibetrack --token SECRET # Protect ingest endpoints
vibetrack --listen 0.0.0.0:9009 # Standalone server on separate port
vibetrack migrate PROJECT_FOLDER # Merge legacy per-run DBs into project DB
Configuration
Settings are stored in ~/.vibetrack/config.json (global) or per-project via the API:
{
"smoothing": "ema",
"smooth_weight": 0.6,
"system_metrics_interval": 3600,
"web": {
"theme": "light",
"auto_refresh": 5,
"image_play_fps": 2
}
}
License
Apache 2.0
Project details
Release history Release notifications | RSS feed
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 vibetrack-0.1a0.tar.gz.
File metadata
- Download URL: vibetrack-0.1a0.tar.gz
- Upload date:
- Size: 96.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf8b12b018390d55deff22f5cc668f68692dfc03c8e1ea322f61f46721e089b4
|
|
| MD5 |
78993cb7a2394345ec64c49d6d99be57
|
|
| BLAKE2b-256 |
dd79cf8b5e7fdd3134ce3b020b9df7de2db831b62cd1bfeac44f9afc58cb07a0
|
Provenance
The following attestation bundles were made for vibetrack-0.1a0.tar.gz:
Publisher:
publish.yml on chroneus/vibetrack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibetrack-0.1a0.tar.gz -
Subject digest:
bf8b12b018390d55deff22f5cc668f68692dfc03c8e1ea322f61f46721e089b4 - Sigstore transparency entry: 1217828602
- Sigstore integration time:
-
Permalink:
chroneus/vibetrack@00a2dd16538e86e50f662edb6aa5b7443b6ff632 -
Branch / Tag:
refs/tags/v0.1a0 - Owner: https://github.com/chroneus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@00a2dd16538e86e50f662edb6aa5b7443b6ff632 -
Trigger Event:
release
-
Statement type:
File details
Details for the file vibetrack-0.1a0-py3-none-any.whl.
File metadata
- Download URL: vibetrack-0.1a0-py3-none-any.whl
- Upload date:
- Size: 78.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb1fcfffbe53a76e875124afee2972ca5eaa36ac44b3fe4377ec71fd5e68e047
|
|
| MD5 |
506c0dfb0abaf33e10da11baf3af5170
|
|
| BLAKE2b-256 |
b90d8f45bec6273828fa349ae166adf998d5661cf0c9774ea30c0fa527701da8
|
Provenance
The following attestation bundles were made for vibetrack-0.1a0-py3-none-any.whl:
Publisher:
publish.yml on chroneus/vibetrack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vibetrack-0.1a0-py3-none-any.whl -
Subject digest:
cb1fcfffbe53a76e875124afee2972ca5eaa36ac44b3fe4377ec71fd5e68e047 - Sigstore transparency entry: 1217828607
- Sigstore integration time:
-
Permalink:
chroneus/vibetrack@00a2dd16538e86e50f662edb6aa5b7443b6ff632 -
Branch / Tag:
refs/tags/v0.1a0 - Owner: https://github.com/chroneus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@00a2dd16538e86e50f662edb6aa5b7443b6ff632 -
Trigger Event:
release
-
Statement type: