How to share a Grafana dashboard
You have a dashboard that answers the question. Someone asks the question. You paste the link — and they hit a login page.
That is the whole problem in one sentence. Grafana dashboards are authenticated routes inside your observability stack, and the people who most need to see a dashboard are usually the ones least likely to have a seat in it: the account manager on the incident call, the exec who asked why latency moved, the customer who wants proof the SLA held.
The four options, honestly
Share the URL. Correct when everyone already has an account and view permission on the folder. Free, live, no work. Useless for anyone outside.
A snapshot. Grafana's snapshot feature serializes the query results
currently rendered and strips the datasource. The result opens without
credentials — because there is nothing left to authenticate against. Two
things follow. It is frozen at creation time, so it answers "what did this
look like on Tuesday" and never "what does it look like now." And if you
publish to the hosted snapshots.raintank.io endpoint rather than keeping it
local, that data is readable by anyone with the link. For production metrics
that is often a non-starter.
Scheduled PDF reports. Real, good, and an Enterprise/Cloud feature. If you already pay for it, use it — with the caveat that a PDF is a dead end for discussion. Replies happen in email, detached from the chart.
Render panels, publish a digest. Pull the panels as images or rebuild the numbers from the datasource, assemble one self-contained HTML page, and put that page at a stable URL with an anchored comment layer on top. This is the option that survives contact with an audience that has no Grafana account, and the one this page is about.
Rendering panels without Enterprise
grafana-image-renderer is the open-source plugin (or sidecar container)
behind every screenshot Grafana takes. Once it is running, each panel is a URL:
curl -fsS -H "Authorization: Bearer $GRAFANA_TOKEN" \
"$GRAFANA_URL/render/d-solo/$DASH_UID/slug?panelId=12&from=now-7d&to=now&width=1000&height=400" \
-o panel-12.png
/render/d-solo renders a single panel headlessly at whatever size and time
range you pass. Loop it over the panel ids that matter, base64 the PNGs into
<img src="data:image/png;base64,…"> tags so the page has no external
references, and you have a self-contained HTML digest.
If you would rather have real text than pictures of text — and you should,
because text is searchable, quotable and readable by an answer engine — skip
the renderer and query the datasource directly. Grafana's /api/ds/query
endpoint runs the same query the panel runs and hands back JSON, which turns
into an HTML table in a few lines.
Publish it on a schedule
python3 scripts/grafana_digest.py > digest.html # your renderer or query script
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
-H "Authorization: Bearer $COMMA_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile html digest.html \
--arg title "Platform health — week of $(date +%F)" '{title: $title, html: $html}')"
One report id, PATCHed weekly. The URL in the channel topic never changes, and each run stacks a revision, so "was this spike there last week" is a diff rather than an archaeology project. If you would rather not own the cron at all, a routine runs the same job on Comma's schedule and posts the result for you.
What the comment layer changes
A dashboard screenshot in Slack gets replies like "which panel?" A published digest gets a thread pinned to the p99 chart that says "this is the cache-warm window, expected — see INC-2214." The thread stays attached across revisions, so the next person who notices the same shape finds the previous explanation instead of re-deriving it.
Reviewers need no Grafana seat, because visibility is set on the report: private, team, domain-gated or link. And an agent attached through Comma's MCP server can read those threads, so an on-call bot can answer "is this normal?" from the accumulated history.
When to just use Grafana
If the audience is engineers who all have accounts and the value is in zooming, changing the time range and pivoting to a different datasource — send the link. Live and interactive beats a digest every time when the reader can actually log in. The digest wins when the reader cannot, or when what you need is a durable record of what the numbers were on a date, with the discussion kept next to them.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history.
Related
- Share a Kibana dashboard — same login-wall problem, different stack
- Weekly analytics digest — the scheduled version
- Comment on an HTML report