September 6th, 2026

No new actions this time. This release closes two ways an account could reach data and services outside its own space, and stops the server from running stored equations when it reads a job.
Testing an AI provider no longer exposes the stored API key. The connection test and the model list accepted a provider identifier and an endpoint from the browser, read the stored key for that identifier, and sent it to that endpoint. Neither checked who was asking, so an account could name a provider in another space and an address of its choosing. Both now check access to the space that owns the stored provider, and an identifier that cannot be read answers the same way as one that does not exist.
Sending a test message through a delivery interface now requires admin access to the space. Before, any signed-in account could make the install send mail through a mail server, or issue a request to an address, that the account chose.
Reading a job no longer runs its equations. 0.13.0 closed one of the two routes that did this. A second one remained, because working out whether a calculate step returns a number or text meant executing the equation. The scheduler reads every job when it starts, so one saved equation could hold the server for 36 seconds on every read of that job. Equations now run when a job is saved and when a run reaches the step.
The limit on equations now covers cost, not only size. Matrix multiplication, matrix powers, determinants and inverses grow faster than the result they return, so an equation whose every value sat inside the one million cell limit could still occupy the server for tens of seconds. These operations now share a budget of ten million element operations.
Line endings are normalised to LF across the source tree, and enforced from now on. Mixed endings turned small changes into whole-file differences and made review harder than it needed to be.
Publishing a release image retries a failed upload inside a time budget that fits, so all three attempts can run.
September 1st, 2026

No new actions this time. This release makes Anaphora safer to run and lighter on the host.
All critical and high dependency vulnerabilities are fixed, in the app and in the build tools. The audit now reports zero.
Untrusted HTML in job variables can no longer run on the app origin. Report previews show captured content in isolation.
The health endpoint answers in milliseconds. Before, it could take 8 seconds when the run history was large.
The hourly clean-up no longer reads the full run history into memory.
The database closes correctly when the container stops. A bad restart can no longer corrupt the state.
Zombie headless-browser processes are removed. Long-running containers stay healthy.
Deleted runs now release their report files. New jobs get a default run retention of 6 months. Jobs made before this release, and jobs made from the built-in Kibana templates, keep ânever expireâ until you set it. Change it per job: General tab, Housekeeping, Run Expire Time. The hourly sweep applies the change.
Next.js 16 and React 19.
A new test suite guards report rendering, the upgrade path, exports, health monitoring, and the unsubscribe flow on each change.
December 12th, 2025
Fixed

Kibana reporting is genuinely usefulâright up to the moment you rely on it for executive updates, compliance evidence, customer-facing PDFs, or âsend this only if something changed.â Then it starts behaving like what it really is: a headless screenshot pipeline bolted onto an interactive UI.
This post isnât a dunk. Itâs a practical map of where Kibana reporting shines, where it predictably breaks, and what teams do when they hit the wall.
Kibanaâs PDF/PNG reporting is built around rendering what you see on screen into an export. Under the hood, reports are generated on the Kibana server as background jobs coordinated through Elasticsearch documents.
And the rendering itself is based on headless Chromium (Kibana manages Chromium binaries and drives the browser for screenshotting / PDF exports).
This architecture implies two important truths:
Reporting inherits UI fragility. If the UI struggles to render a view reliably, reporting will struggle too.
Reporting is âwhatâs on the screen,â not âwhatâs true.â Itâs a presentation capture mechanism, not a semantic reporting engine.
Thatâs fineâuntil your use case is not a screenshot.
Most reporting needs are comparative:
âDid error rate change since last week?â
âIs this spike new or just seasonality?â
âOnly notify if the KPI moved materially.â
âSend the PDF only if something significant changed.â
Kibana reporting doesnât have a native concept of diffing between runs, conditional delivery, or âwhat changed since last export.â It creates a PDF/PNG of the current dashboard state.
Elasticâs own wording around reporting reinforces this âwhat you seeâ model: PDF reports are tied directly to what is seen on screen.
Why this matters: In real teams, attention is the scarce resource. Static scheduled PDFs quickly become noiseâpeople stop reading them because they donât answer the question âwhy am I being pinged?â
If your dashboards are small and tidy, Kibana reporting can be smooth. But real dashboards arenât always small and tidyâespecially in mid-market orgs where dashboards become living shared artifacts.
Elasticâs own troubleshooting guidance acknowledges that large pixel counts (big dashboards, lots of panels) can demand more memory/CPU and suggests splitting dashboards into smaller artifacts.
In practice, teams run into:
PDFs with unusable pagination or layout
Panels stretched, clipped, or missing
âFor printingâ exports that time out or format awkwardly
These arenât hypothetical. Community reports describe large dashboards producing a single giant unprintable page or poorly paginated PDFs with cut-off / stretched visualizations.
And for truly huge canvases or dashboards, people end up increasing memory and timeouts dramatically and still failingâbecause youâre essentially asking a headless browser to deterministically render a complex app view into a document.
When reporting fails, Kibana surfaces errors like âMax attempts reached.â Elastic documents two common causes:
The export spans a large amount of data and Kibana hits xpack.reporting.queue.timeout
Reverse-proxy / server settings are not configured correctly
This reveals a hidden cost: your team becomes the operator of a rendering farm.
Instead of âschedule report,â your backlog becomes:
tuning queue timeouts
tuning capture timeouts
resizing dashboards
splitting dashboards
debugging reverse proxy edge cases
chasing nondeterministic Chromium issues
Thatâs not reporting. Thatâs maintaining an internal PDF renderer.
Kibana alerting is solid for what itâs built to do: create rules against Elasticsearch data and send actions through connectors. Elastic positions it as a consistent interface across use cases, with integrations and scripting available.
But alerting and reporting live in different mental models:
Alerts are about signals: something crossed a threshold, a rule matched, an anomaly score tripped.
Reports are about communication: what changed, what it means, and what to do.
You can send an alert to Slack. You can attach a PDF. But Kibana doesnât give you a first-class, built-in way to reliably produce human-ready, contextual, change-aware narratives (because its primitives are rules and screenshots).
So teams either:
spam alerts (and burn attention), or
schedule reports (and hope people read them), or
manually add context (and burn engineering time)
For compliance, the question is rarely âwhat does the dashboard look like right now?â
Itâs:
âWhat was true on that date?â
âCan you prove it wasnât tampered with?â
âCan you show consistent evidence collection over time?â
Kibana reporting can generate PDFs, but itâs not designed as a compliance evidence pipeline. If youâre in a regulated environment, youâll feel the gap quickly: lack of run-to-run comparison, lack of explicit evidence controls, and the ease with which dashboards change after the fact.
(If youâre already collecting screenshots into a GRC folder manually, you know exactly what this costs.)
These are the patterns that appear again and again once Kibana reporting doesnât fit.
This is even recommended in Elastic troubleshooting guidance.
Cost: redesign work and fractured storytelling. People lose the âsingle paneâ view that made the dashboard valuable.
Elastic explicitly points at timeout settings like xpack.reporting.queue.timeout when exports fail.
Cost: ongoing ops toil. Reporting becomes another service to babysit.
Some teams rebuild reports in Canvas because it gives more control over page-like layouts (and community responses often point users there).
Cost: now youâre maintaining two artifacts: operational dashboards and report layouts.
This worksâbecause Kibana itself uses a headless browser approach.
Cost: brittle scripts, auth headaches, constant UI changes breaking automation.
Thereâs a whole ecosystem of third-party Kibana reporting tools that exist for a eason: teams want scheduled delivery, fewer license constraints, and more control.
Cost: additional platform, integration, and security reviewâplus you still often end up with static screenshots.
You export small-to-medium dashboards
Youâre okay with static PDFs/PNGs
You donât need cross-tool reporting
âSend every Mondayâ is acceptable even when nothing changed
Stakeholders ask âwhat changed?â more than âwhat is it?â
Reports are frequently failing on large dashboards (timeouts/layout)
You need conditional delivery (only notify on meaningful change)
You need compliance-ready evidence artifacts
Your reality is multi-tool (Kibana + Grafana + SaaS + internal UIs)
This isnât a moral failing of Kibana. Itâs just not what Kibana reporting was designed to be.
If youâre designing for real-world reporting needs, these primitives matter:
Conditional reporting
âOnly send if KPI moved by Xâ
âOnly send if visual changedâ
Run-to-run diff
detect change, summarize deltas, highlight what matters
Narrative context
explain âwhy this matters,â not just present charts
Multi-source support
authenticated web UIs + APIs, not just one stack
Operational reliability
reporting should not require you to become a Chromium SRE
Kibana reporting gives you the screenshot. Many teams need the communication system.
What Kibana lacks isnât another export format.
Itâs a layer that understands change over time.
Teams that move past screenshot-based reporting introduce a thin reporting layer that:
captures dashboards or data at regular intervals
compares current state to previous runs
generates reports only when something meaningfully changes
adds minimal narrative context for humans
Crucially, this layer does not replace Kibana.
Kibana remains the system of exploration.
The reporting layer becomes the system of communication.
Once teams adopt this pattern, reporting stops being noisyâand starts being trusted.
May 1st, 2025

Donât let users start from scratch every time they create a job. Itâs useful for:
Save time by anticipating some common tasks
Pre-bake some company-branded PDF templates
Reuse the boilerplate of a login process to a particular website
You can create unlimited templates. You can also promote a job to become a template.

May 1st, 2025

Letâs use âcalculateâ action to create a dynamic threshold value for our âconditional blockâ action.
Capture the Kibana Discoverâs hits count integer value of the last hour
Capture the same, but for the last 24 hours
Use the âcalculateâ action to obtain the hourly mean hit count over the past 24h
Use the âconditional blockâ action to compare the last hour reading to the 24h mean
If the difference is less than 20%, donât send the alert
This example is by default included in the job templates in any new installation of Anaphora.
May 1st, 2025

Thanks to the conditional block, we can create proper alerts. A simple example:
Capture a string/numeric value from a website
Capture numeric/string value from another website
Compare the two
Skip sending the report if condition is met
This is useful for brute force attack detection, or any other alerts about high log event count over time.
Capture Kibana discovery query results âcountâ for the last hour
Compare if this value is > 1 million
Send the report (notify the system admin)
April 30th, 2025

Keeping all the jobs running is a great responsibility. Fortunately, Anaphora can use a delivery interface to send an alert to you via email, slack, webhook (etc.) about the insurgence of errors.
No danger of getting spammed, as a maximum notification frequency can be set.
Alternatively, you can use the REST API to monitor the green, yellow, red state of each job.
April 30th, 2025

You can now capture all visualizations of a Kibana dashboard into single tiles to selectively reassemble by drag & drop into your visual PDF report composer in Anaphora.

You can now make your PDF prettier by adding a page background (PNG, SVG, solid colors, gradients, etc). Trick: use lower opacity to watermark the background!
April 30th, 2025

When you have a multi-step capture, clicks, navigations, selectors can get tricky to get right. So we introduced the capability to produce, visualize and download the full video of the headless browser operations, and see what went wrong.

You can also get the debug files containing the browser internal state, so itâs easier for us to support you when things are hard to debug.
April 30th, 2025


On the same note of ReadonlyRESTâs tenancies, users and roles can be associated using âpermissionsâ to an unlimited number of spaces.
A space is a virtual container of Jobs and Delivery Interfaces. Users and roles can be associated to a number of spaces via permissions of any access levels between read-only, read-write, or Admin.

Users that have admin access level to 2 or more spaces can copy resources across between spaces
