Clean up stale and duplicate Grafana dashboards in one place

By General Input

See every dashboard across every folder, spot the stale ones, the clones and the broken ones, then retag, move or retire them without hunting.

Integrations

  • Grafana
  • Linear

Type

App

Categories

  • Engineering
  • Operations

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.

Related prompts

Explore more prompts
Catch feature flags that never got switched on in productionWeekly alert noise review board for incident.io on-callMorning triage board for your Kernel browser agent runsTrack every half finished LaunchDarkly rollout in one boardFind the customers stuck contacting support again and againTurn shipped Linear work into Intercom product announcementsVoice agent QA review board for your Hume EVI callsClose the loop between Front tickets and Linear bug fixesOpen a Heroku release war room the moment production looks wrongFind the themes Help Scout tags miss and file them in Linear