How to share a Kibana dashboard
The dashboard shows the error-rate spike clearly. The person who needs to see it — the account manager writing the customer update, the compliance reviewer, the exec on the incident bridge — does not have a Kibana account, and giving them one means granting access to an index that contains far more than the one chart they asked about.
What Kibana gives you
A permalink. Encodes state: time range, filters, query, the exact panel layout. Excellent for handing a colleague the same view you are looking at. Not an access mechanism — the recipient still authenticates and still needs the space and index-pattern privileges.
Reporting (PNG / PDF). Real and scheduled, and gated behind Elastic's paid subscription tiers. If your deployment has it, it is the least-effort path to a recurring artifact. What it produces is an image or a document: a record, not something anybody can quote a row from or reply to inline.
CSV export of a saved search. Broadly available and genuinely useful when the rows are the point. Not a dashboard.
Embedding. An iframe of the dashboard, still authenticated. Drop it into a wiki page and most readers see a login form in a box.
The gap
Observability data has an audience beyond the observability team, and that audience needs three things Kibana does not give them together: a URL that opens without a seat, numbers as text rather than as pixels, and a place to ask "is this expected?" that stays attached to the chart.
The digest pattern
Query Elasticsearch directly, render one self-contained HTML page, publish it at a stable URL, and put anchored comments on top.
Going to Elasticsearch rather than screenshotting Kibana is the whole trick. The dashboard's panels are aggregations; you can run the same aggregation and get JSON:
curl -fsS -u "$ES_USER:$ES_PASS" \
"$ES_URL/logs-*/_search?size=0" \
-H 'Content-Type: application/json' -d '{
"query": { "range": { "@timestamp": { "gte": "now-7d" } } },
"aggs": {
"by_day": { "date_histogram": { "field": "@timestamp", "calendar_interval": "1d" } },
"by_service": { "terms": { "field": "service.name", "size": 20 } }
}
}' > agg.json
Turn that into an HTML table plus two or three inlined charts, keep the file self-contained — no runtime fetches, no external CDN — and publish it. Then keep publishing to the same id:
python3 scripts/kibana_digest.py agg.json > digest.html
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 "Error budget — week of $(date +%F)" '{title: $title, html: $html}')"
A routine can run this on Comma's schedule if you would rather not add another cron to the observability stack.
What changes
The weekly reliability numbers land at one URL that never rotates, readable without a Kibana seat because access is a property of the report: private, team, domain-gated or link.
And the discussion attaches to the number. Someone highlights the 5xx row for Tuesday and pins "deploy 1.42 rollback window, expected, INC-2214." The thread persists across revisions, so the next person who sees the same shape finds the previous analysis instead of reopening it.
An agent connected through Comma's MCP server can read those threads too, which makes the accumulated incident context available to whatever is triaging next week.
When to just use Kibana
If the reader has an account and the job is investigation — narrowing the time range, adding a filter, pivoting to Discover — send the permalink. Nothing static replaces a live query interface for someone who can run queries. The digest is for everyone else, and for the weeks you want a durable, dated record of what reliability actually looked like.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history.