Skip to content
KONIGI

Dashboards / Product mechanics / Auto-insight

2 of 10

Auto-insight

The viewer didn't look at the right chart, and the product should tell them what it noticed.

Updated September 10, 2026

Problem

The answer was on panel nineteen. Nobody scrolled that far, because nothing about panel nineteen looked different from panels one through eighteen until you read its axis.

Solution

Have the system look, and say what it found. A feed of detected changes, or a sentence at the top of the page describing what is unusual right now, generated rather than configured.

The pattern spans a wide quality range, and the difference is whether the output is a finding or a description.

A description restates the chart: “Errors increased 40% compared to last week.” The viewer could see that. It costs a sentence of attention and returns nothing.

A finding does the work the viewer could not: “Errors increased 40%, and 94% of them come from one build, on one region, all after 14:02.” That is the output of comparing many dimensions, which is exactly the labour a person cannot do by scanning. Honeycomb’s BubbleUp is the clearest example of the mechanism—compare everything inside an anomalous region against the baseline outside it and rank the dimensions that differ.

The economics are unforgiving, and the Google SRE argument about alerting transfers directly. Every page should be actionable; a page that merits only a robotic response should not be a page. An insight feed is an alerting channel with a lower barrier to entry, so it accumulates non-actionable output faster, and once a viewer has scrolled past four uninteresting insights they stop reading the fifth. A boring insight costs more than a wrong one. The wrong one misleads once; the boring one costs the channel its readership.

Two properties are non-negotiable. Provenance: what was compared, over what window, and what counts as unusual. A route to the evidence: any insight should be one click from the data that produced it, or it cannot be checked and will not be trusted.

Use when

The dimensionality is beyond human scanning, the baseline is well enough established that unusual means something, and a person can act on what is surfaced.

Don’t use when

The page is small enough to read. An insight panel on a six-panel dashboard is telling people something they can see, and it trains them to skip the top of the page.

Trade-offs

Automated detection has a false-positive rate, and on a dashboard those arrive without the friction that makes people tune an alert, so nobody ever fixes them. Generated prose reads as more confident than the statistics behind it, which is a real hazard when the phrasing implies causation. Baselines are wrong after any deliberate change, so a launch generates a week of insights about the launch. And the feature can substitute for design work: a page that needs restructuring gets an insight panel bolted on instead.

Checklist

  • Is each insight a finding, or a restatement of something visible?
  • Does it say what was compared, over what window?
  • Is there one click to the underlying data?
  • What is the false-positive rate, and who reviews it?
  • Does the phrasing imply causation the analysis does not support?
  • What happens after a deliberate change that moves every baseline?
  • Can a viewer suppress an insight type, and does anyone?
  • How many insights per day, and does anyone read the last one?
  • Is there any measurement of whether these lead to action?
  • Would restructuring the page remove the need for this?

Compare

Datadog Watchdog is the most developed version in observability, surfacing detected anomalies across the estate as a feed rather than requiring a configured monitor per metric, which is the pattern’s real promise: catching what nobody thought to watch. Honeycomb BubbleUp takes the opposite path—the human points at the anomaly and the system explains it—which keeps a person in the loop for the judgement and gives the machine the dimensional comparison it is actually good at. Amplitude and BI tools generate narrative summaries of chart movements, which sit closer to the description end and are most useful to readers who would not otherwise read the chart at all. Grafana has no equivalent in core, so the machine-detection role falls to alerting rules and to ML features outside the dashboard.

Anomaly band is the visual form of the same detection, drawn rather than described. Alert rule is the same signal with a delivery mechanism and an owner. Cross-filter is the human version of the dimensional comparison. Single-column narrative is the layout that most naturally hosts a generated summary. Explain this metric is what an insight needs in order to be checkable rather than merely plausible.

Auto-insight anatomy Two cards from the same detection. The first restates what the chart already showed. The second names the dimensions that separate, says what was compared and over what window, and links to the data that produced it. The same detection, two outputs Insight Errors increased 40% compared to last week. A description Insight Errors increased 40%. 94% of them come from build 4a91c, in eu-west, all after 14:02. compared 38 dimensions · 14:00-15:00 see the data A finding 1 2 3 4 1 RESTATES THE CHART The viewer could see that. It costs a sentence of attention and returns nothing. 2 DOES THE UNSCANNABLE WORK Comparing every dimension inside the anomaly against the baseline outside it. 3 PROVENANCE What was compared, over what window, and what counted as unusual. 4 A ROUTE TO THE EVIDENCE One click from the data that produced it, or it can't be checked and won't be trusted.
Wireframe — the pattern's anatomy, not any one product's version of it

Implementation

The product telling a reader what it noticed on a chart they did not open. Every claim has to link to the evidence, because an insight the reader cannot verify is a rumour with a nice border.

shadcn
npx shadcn@latest add card button
Tokens
--card--card-foreground--muted-foreground--border--chart-1

Insight

Errors increased 40%. 94% of them come from build 4a91c, in eu-west, all after 14:02.

compared 38 dimensions · 14:00-15:00

see the data

InsightCard.tsxThe finding, the provenance line computed from what was compared, and a link to the evidence that the type will not let you leave out.

import { Card } from "@/components/ui/card";
import { Button } from "@/components/ui/button";

/** What was compared and over what window. Without it the sentence is a
 *  rumour with a nice border. */
export type Provenance = {
  /** How many dimensions were ranked against the baseline. */
  dimensions: number;
  /** The anomalous window, as the reader would type it into the chart. */
  window: string;
};

type Props = {
  /** The finding. It should name what separates the anomaly from the
   *  baseline, which is the work the reader could not do by scanning. */
  finding: string;
  provenance: Provenance;
  /** One click to the data that produced it. Required, because an insight
   *  that cannot be checked will not be trusted. */
  evidenceHref: string;
  heading?: string;
};

export function InsightCard({ finding, provenance, evidenceHref, heading = "Insight" }: Props) {
  return (
    <Card className="border-2 border-chart-1 p-4">
      <p className="border-b pb-2 text-[11px] uppercase tracking-wide text-muted-foreground">{heading}</p>
      <p className="mt-3 text-sm leading-relaxed text-card-foreground">{finding}</p>
      <p className="mt-2 text-[11px] tabular-nums text-muted-foreground">
        compared {provenance.dimensions} dimensions · {provenance.window}
      </p>
      <Button asChild variant="outline" size="sm" className="mt-2.5 h-6 px-2 text-[10px]">
        <a href={evidenceHref}>see the data</a>
      </Button>
    </Card>
  );
}

demo.tsxHow it is called: the finding from the drawing, 38 dimensions over one hour, one click to the query.

import { InsightCard } from "./InsightCard";

/**
 * A finding rather than a description: the 40% is what the chart showed, the
 * build, region and time are what comparing 38 dimensions found.
 */
export default function Demo() {
  return (
    <div className="w-[300px]">
      <InsightCard
        finding="Errors increased 40%. 94% of them come from build 4a91c, in eu-west, all after 14:02."
        provenance={{ dimensions: 38, window: "14:00-15:00" }}
        evidenceHref="/explore?metric=errors&from=14:00&to=15:00&group=build,region"
      />
    </div>
  );
}
What it renders. Identical markup in both panes, with only the token values changing.

Examples

No captures reference this pattern yet. Captures arrive product by product; see Products for what's in the gallery so far.