Clean up stale and duplicate Grafana dashboards in one place
See every dashboard across every folder, spot the stale ones, the clones and the broken ones, then retag, move or retire them without hunting.
I want an app for cleaning up Grafana dashboard sprawl. The main view is an inventory table of every dashboard across all folders, one row per dashboard, with columns for title, folder, tags, last updated, who last edited it, and how many saved versions it has.
Build the inventory from Grafana's Search Dashboards and Folders to enumerate dashboards, and List Folders to resolve folder names and populate the folder filter. Enrich each row with Get Dashboard by UID so you have the current version number, the updated timestamp, and the last editor. Get version counts from List Dashboard Versions, either lazily per row or in a background pass. Cache the enriched inventory so the table loads fast when I reopen the app, with a Refresh button that rebuilds it.
Above the table put filters and quick chips for the three sprawl patterns I care about: dashboards nobody has touched in six months (make the window configurable), dashboards with no tags at all, and near-duplicate titles that suggest someone cloned a dashboard instead of using a template variable. Detect near-duplicates by normalizing titles, so lowercase them, strip punctuation, and strip trailing numbers and environment or region suffixes like prod, staging, or us-east-1, then group rows whose normalized titles match or are very close. Show the group size on the row so I can see at a glance that a dashboard is one of six similar ones. Also let me filter by folder and by tag, and sort by last updated and by version count.
Clicking a row opens a detail panel. It pulls the full dashboard with Get Dashboard by UID and shows the panel list and template variables, shows the edit history from List Dashboard Versions with who changed what and when, and diffs the last two versions with Compare Dashboard Versions so I can tell whether recent activity was a real change or a cosmetic save. The panel also cross-references every data source referenced anywhere in the dashboard JSON, including panel targets, template variables, and annotations, against List Data Sources, and flags any panel pointing at a data source that no longer exists. That is the fastest signal that a dashboard is actively broken, so surface it as a badge on the inventory row too.
From a row or from the detail panel I can act. Retag a dashboard or move it into a different folder with Update Dashboard, keeping the rest of the dashboard JSON intact and preserving the version so I do not clobber someone else's edit. Delete a dead dashboard with Delete Dashboard by UID, always behind an explicit confirmation step that names the dashboard and its folder and requires a second deliberate click. File a cleanup ticket in Linear with Create Issue, prefilled with the dashboard title, folder, last edited date, the reason it was flagged, and a link back to the dashboard, assigned to the last editor when their Grafana identity matches a Linear user and left unassigned with the editor named in the description when it does not. Let me pick the Linear team once in settings and reuse it for every ticket.
Add a Review this dashboard button on every row that kicks off a background agent. The agent reads the dashboard JSON with Get Dashboard by UID, walks the history with List Dashboard Versions and Compare Dashboard Versions, checks the referenced data sources against List Data Sources, and looks at the other dashboards in its near-duplicate group. It decides whether the dashboard is stale, a redundant clone, actively broken, or healthy and worth keeping, then writes back a short verdict with a recommended action, one of keep, retag, merge into a named sibling, or retire, plus a one-line reason. Store the verdict against the dashboard UID with the time of the review so it renders as a badge and tooltip on the row, let me re-run a review later, and let me select a batch of rows and kick off reviews for all of them with the rows updating as each verdict lands.
The people using this are the platform or observability owners doing a periodic cleanup pass, so optimize for working through a long list. Keep the table dense and scannable, remember my filter state between visits, show a running count of how many dashboards fall into each flagged category, and make deletion clearly the last resort next to retagging, moving, and filing a ticket.
What does this prompt do?
- Builds one searchable table of every dashboard in your Grafana instance, showing which folder it lives in, its tags, when it was last edited, who edited it, and how many times it has been saved.
- Filters down to the problem cases in a click: dashboards nobody has touched in six months, dashboards with no tags at all, and near-identical titles that suggest someone copied a dashboard instead of reusing one.
- Opens any dashboard in a side panel with its full edit history, a comparison of the last two changes, and a warning when a chart points at a data connection that no longer exists.
- Gives you a Review button on every row that hands the dashboard to a background assistant, which reads it end to end and writes back a short verdict: keep it, retag it, merge it into a sibling, or retire it.
What do I need to use this?
- A Grafana account, either Grafana Cloud or your own hosted instance, with permission to view and edit dashboards
- A Linear workspace, if you want to file cleanup tickets straight from the app
- A rough sense of who owns which folder, so cleanup decisions land with the right people
How can I customize it?
- Change the staleness window from six months to whatever your team treats as dead.
- Adjust how closely two titles have to match before the app flags them as clones, and add the naming suffixes your team uses so they get ignored.
- Choose which Linear team cleanup tickets go to, and set a default label or priority for them.
FAQs
Will this delete dashboards automatically?
Does it work with Grafana Cloud and self-hosted Grafana?
How does it decide two dashboards are duplicates?
Can I use it without Linear?
Does the review assistant change my dashboards?
Related templates
Open one board each morning, see which voice calls went badly, replay the exact moment the caller got frustrated, and file the fix.
See every customer waiting on a bug fix, file the ticket without creating a duplicate, and tell them the moment engineering ships it.
See every recent deploy across all your Heroku apps in one timeline, then roll back, restart, or file an incident without leaving the screen.
Pick a date range, see which support topics are climbing fastest, read the real customer threads behind them, and file the worst ones as tickets.
See every Hacker News story and comment that mentions your product or your competitors, mark each one new, needs reply or handled, and stop losing threads.
One grid of every table you track, when it last landed, and what broke, with stale tables pinned to the top and an agent that explains why.
Stop scrolling past hundreds of dashboards nobody opens.
Get one screen that tells you what to retag, what to merge, and what to retire.