Detect, visualize, and reduce DevOps toil
Project description
Toil Radar
📡 Detect, quantify, and reduce SRE/DevOps toil — from signals your team already produces.
Toil is manual, repetitive, automatable operational work. The SRE handbook says to keep it under 50% of engineering time — but almost nobody measures it. Toil Radar estimates it from structural signals in git history and GitHub Actions, not keyword guessing, and tells you what to automate first.
What it detects
From git history (works offline):
| Signal | What it means |
|---|---|
revert |
Reverts and rollbacks — bad changes reached mainline |
hotfix_merge |
Merges from hotfix/emergency branches |
quick_fix |
Same author re-touching the same file within 2 hours with a corrective message — fix-the-fix churn, not normal iteration |
Out-of-hours work (nights/weekends) doesn't create noise as its own signal — it amplifies the weight of real events, because a Saturday-night rollback costs more than a Tuesday-morning one.
From GitHub Actions (via gh, optional):
| Signal | What it means |
|---|---|
ci_rerun |
Workflow runs with run_attempt > 1 — someone babysat flaky CI |
manual_dispatch |
workflow_dispatch runs — someone pushed a button that could be automated |
Every event gets an estimated cost in minutes. Rescans never double-count — events are deduplicated by commit hash / run id.
Install
pip install toil-radar # CLI only, zero dependencies
pip install "toil-radar[dashboard]" # + Streamlit dashboard
Usage
# Scan a repository (add --no-github to skip the gh API)
toil-radar scan /path/to/repo
toil-radar scan . --days 60
# Report: estimated hours, trend, hotspots, automation candidates
toil-radar summary
toil-radar summary --repo /path/to/repo --days 90
# Web dashboard
toil-dashboard
You can scan multiple repos into the same database — summary aggregates across all of them, or filter with --repo.
Example output
Toil Radar - last 120 days - all repos
============================================================
Estimated toil: 6.2h (~1% of one engineer's time) trend vs prior 120d: up 24%
Out-of-hours events: 13 (nights/weekends)
signal events est. hours
------------------------------------------------
rapid follow-up fixes 17 5.9
CI re-runs 1 0.3
Churn hotspots (same file touched in many commits):
pyproject.toml (10 commits)
setup.py (4 commits)
Top automation candidates:
1. rapid follow-up fixes: 17 events, ~5.9h
Fix-the-fix churn means feedback arrives too late - add the missing
linter, type check, or test that would catch these pre-push.
e.g. "fix: explicitly include only toil_radar package in build" (2026-04-09)
2. CI re-runs: 1 events, ~0.3h
Re-run workflows usually mean flaky tests or flaky infra - quarantine
the flakiest jobs and fix them; every re-run is babysitting.
e.g. "Publish to PyPI re-run (attempt 3)" (2026-03-30)
(That's real output from scanning this repo. The packaging churn was, in fact, toil.)
Why structural signals instead of keywords?
Grepping commit messages for "fix" or "deploy" flags most normal development work and makes the numbers meaningless. Structural signals — an actual Revert "..." commit, a merge from a hotfix/* branch, the same file patched twice in 30 minutes, a CI run re-attempted three times — are things that only happen when somebody was doing operational cleanup. Low noise, defensible numbers.
How the cost estimate works
Each signal type has a conservative per-event weight (revert 45 min, hotfix merge 60 min, quick fix 15 min, CI re-run 10 min per extra attempt, manual dispatch 10 min), multiplied ×1.5 out of hours. See WEIGHTS in toil_radar/git_signals.py. The point isn't per-minute accuracy — it's a consistent metric you can trend over time and use to rank what to automate first.
Development
git clone https://github.com/amrutp24/toil-radar
cd toil-radar
pip install -e ".[dashboard,dev]"
pytest
Roadmap
- PagerDuty / Opsgenie ingestion (repeated alerts = the strongest toil signal)
- Deploy→fix→deploy loop detection
- Per-team / per-author views
- Export to Prometheus metrics for long-term trending
License
MIT — see LICENSE
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
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 toil_radar-0.2.0.tar.gz.
File metadata
- Download URL: toil_radar-0.2.0.tar.gz
- Upload date:
- Size: 20.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6956270c4503d87f2525906e51e55fa9b45ab0bc80e8b2de0cb1f7796ecb9a2
|
|
| MD5 |
06f8b0b75edac4a5f7b597d271f57e44
|
|
| BLAKE2b-256 |
1a7d58fb7d8845b68f14f23c676e2950d54cc2f493999a9bd484e49c9c9a20af
|
File details
Details for the file toil_radar-0.2.0-py3-none-any.whl.
File metadata
- Download URL: toil_radar-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81294be48dc655e5765d25f2f01e31e42ce7bca207994ffaf0d0be62beb885ec
|
|
| MD5 |
4d28d01a779d617e39e6fcbb51192d05
|
|
| BLAKE2b-256 |
bbfc2cfff0b9d54cb711343ad5a727b833419a573eb84c953134cfc7265e9f84
|