Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vibetrack-0.1a0.tar.gz (96.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vibetrack-0.1a0-py3-none-any.whl (78.5 kB view details)

Uploaded Python 3

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

Hashes for vibetrack-0.1a0.tar.gz
Algorithm Hash digest
SHA256 bf8b12b018390d55deff22f5cc668f68692dfc03c8e1ea322f61f46721e089b4
MD5 78993cb7a2394345ec64c49d6d99be57
BLAKE2b-256 dd79cf8b5e7fdd3134ce3b020b9df7de2db831b62cd1bfeac44f9afc58cb07a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibetrack-0.1a0.tar.gz:

Publisher: publish.yml on chroneus/vibetrack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for vibetrack-0.1a0-py3-none-any.whl
Algorithm Hash digest
SHA256 cb1fcfffbe53a76e875124afee2972ca5eaa36ac44b3fe4377ec71fd5e68e047
MD5 506c0dfb0abaf33e10da11baf3af5170
BLAKE2b-256 b90d8f45bec6273828fa349ae166adf998d5661cf0c9774ea30c0fa527701da8

See more details on using hashes here.

Provenance

The following attestation bundles were made for vibetrack-0.1a0-py3-none-any.whl:

Publisher: publish.yml on chroneus/vibetrack

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page