Skip to main content

Changelog

Follow new updates and improvements to Anaphora.

Anaphora 0.18: safer sign-in and security updates

Anaphora 0.18 is a security update for the sign-in. It locks the settings that come from your environment, limits the first-time setup page to user accounts, and updates components in the image. It carries no database migration, so you can go back to 0.17 the same way. Most installations need no action. If you sign in with single sign-on only, read "Before you upgrade" before you install it.

Locked settings

Settings that come from your environment variables, such as the OIDC client, are now locked. The settings page cannot change them.

Anaphora also does not save the OIDC client secret from your environment in its database any more, and the settings page does not show it. The secret stays in the memory of the running server only.

The first-time setup page

When an installation has no administrator yet, Anaphora shows a setup page to create the first one. This page now creates local user accounts and nothing else. It cannot change any other setting. It also keeps the sign-in methods that are already set. Before, it switched OIDC off.

While the page is open, the start log warns you, and the upgrade script shows it as a problem, with the address of the page. Create the first administrator there before you make the installation reachable.

If OIDC_SYSTEM_GROUPS names your administrators, they sign in with single sign-on from the first start, and the setup page does not open.

Sign-in and security

  • Connections that stay open (WebSockets) get the same sign-in checks as normal page loads, and they close when the user signs out. Anaphora itself does not use them.

  • The image gets security fixes: perl-base 5.36.0-7+deb12u4 (CVE-2026-13221 and six more), handlebars 4.7.10 (CVE-2026-106445, CVE-2026-106446), shell-quote 1.12.0 (CVE-2026-102422), sharp 0.35.5 (GHSA-wq5f-xc86-pv6w) and source-map-js 1.2.2 (CVE-2026-93749).

  • The sign-in service is now Authfish 1.0.190.

Fixes

  • If the first start of a new installation fails, Anaphora keeps no half-saved settings. The next start begins clean.

Before you upgrade

Single sign-on only

  • If your users sign in only with single sign-on and you have no local administrator, create one in Settings before you upgrade. It is your way in when single sign-on is off, for example after a mistake in an OIDC_* variable or a change of licence. Without it, the setup page opens again while single sign-on is off.

Administrator from the environment

  • ADMIN_USERNAME and ADMIN_PASSWORD apply only to the first start of an empty installation. If the start log says that no one can administer Anaphora yet, open the address it shows and create the first administrator there. Setting the variables later does not close the page.

The full list of changes is in the changelog.

Improved

Anaphora 0.17: AI triage, observer keys and single sign-on admins

Anaphora 0.17 adds an AI template job that decides when to page you, API keys for monitors, and the system role for single sign-on users. It also makes SAML and OIDC sign-in stricter. Some changes can stop a login that worked before. Read "Before you upgrade" before you install it.

Kibana AI Triage

This is a new built-in template. It counts the 5xx errors and the traffic in the last hour and in the hour before. Then it captures the overview dashboard and asks the AI provider for a severity from 0 to 10. More load is not a failure, but a source that stops sending data is. If the severity is below 7, the run stops and Anaphora sends no notification. At 7 or more, a second AI action writes a briefing to go with the report.

An if can now test a number that an AI action returns, such as "Severity: 7" or "7/10". If the answer does not contain exactly one number, the run fails. A branch never runs on an answer that Anaphora cannot read.

Observer keys for monitors

Settings > Application > API Keys creates an observer key. A monitor sends it to /guest/api/health as Authorization: Bearer <key>. With the key, the monitor gets each job and delivery interface by name, with its schedule, recent runs and the delivery counts for the last 24 hours. Error texts are not included, because they can quote captured data. Before, the monitor needed the password of a system user to get the names.

Anaphora shows the key one time and keeps only a hash of it. The key list shows when each key was last used, and you can revoke a key there. A revoked or incorrect key gets 401, so the monitor alerts. Anaphora does not read a key in the query string. The page also gives a ready curl command to test the key.

Single sign-on users can be administrators

A user who signs in with OIDC, SAML or LDAP gets the system role when one of their groups is in the system groups for that method. You set these in OIDC_SYSTEM_GROUPS or in Settings > System > Auth. Group names must match fully, with the same case. Use a name that is unique at the provider.

Licence

When a licence expires, Anaphora applies Free within one hour.

When a paid licence ends, only administrators can sign in. Anaphora signs out all other users and the login page tells them why. An administrator can renew the key, or give the system role to the users who must continue to work.

When you upgrade from Free, each user gets the role saved for them. Users who were on Free before 0.17 are saved as System. Set the role of each user after the upgrade.

Sign-in and security

  • SAML and OIDC follow the rules of ReadonlyREST: SAML checks the Audience, logouts that the identity provider starts must be signed, and logins that start at the identity provider's portal are refused.

  • OIDC checks the TLS certificate of the issuer on every address, including localhost and IP addresses.

  • Anaphora refuses an LDAP configuration that cannot work when it starts, and the settings page shows the reason.

  • An LDAP login stops after 10 seconds if it gets no response. When an LDAP login fails, Anaphora shows a reference that your administrator can find in the logs.

  • Logins from other sites are refused, and the limit on failed logins can no longer be bypassed.

  • A regex space permission can match the whole name (^$) or any part (~).

  • Next.js 16.3.8 fixes a critical remote code execution, and other dependencies get their security updates.

Fixes

  • A failed sign-in at the provider goes back to the login page instead of an error 500.

  • The login page works behind proxies that have small header limits.

  • When the licence refuses a save, the message tells you which limit you reached.

  • If the database is busy for a moment, the licence stays as it was.

  • Licence end dates are given in UTC.

Before you upgrade

Read the items for the sign-in methods that you use. Each item tells you what can stop working and what to do.

LDAP

  • Anaphora now refuses LDAP settings that cannot work, and LDAP login then stops. In Settings > System > Auth > LDAP, make sure that the user filter contains {{username}}, that each filter is valid, and that the CA certificate is a valid PEM file.

  • A space permission by user name no longer matches the email address of the user (mail, proxyAddresses, otherMailbox). If a permission uses an email address, change it to the login name.

SAML

  • If your identity provider sends a different Audience, or no Audience, all logins fail. Set extraConfig.audience to the value that the provider sends.

  • A login that starts at the portal of the identity provider fails. Users must start at the Anaphora login page.

  • A logout that the identity provider starts must be signed. If it is not signed, the Anaphora session stays open. In Keycloak, turn on "Sign documents" in the client.

  • Anaphora now checks the time of each SAML assertion. If the clock of the Anaphora server is behind the clock of the provider, logins fail with "SAML assertion not yet valid". Synchronize the clocks, or set accepted_clock_skew_ms.

OIDC

  • If OIDC_ISSUER (or OIDC_INTERNAL_ISSUER) is an https URL on an IP address or on localhost, its certificate must name that address and come from a trusted CA. If not, OIDC login stops. Set OIDC_TLS_CA_CERT to your CA certificate (PEM). OIDC that you set in the settings page needs no action.

Roles and permissions

  • Users can get more roles than before. SAML users get all their roles, not only the first. LDAP users get each name of a group that has several names. Make sure that your space permissions do not give these roles too much access.

  • If this install ran on Free before, all local users have the System role. After you activate Pro or Enterprise, set the correct role of each user in Settings.

  • If you set a regex permission to match the whole name (^$), do not go back to 0.16 or earlier. Older versions ignore this setting, and the permission matches any part of the name again.

Scripts

  • Anaphora now refuses (400) a URL path that contains . or .. segments or a backslash. If a script builds URLs by hand, it must send the resolved path.

The full list of changes is in the changelog.

New

Anaphora 0.16: AI token budgets, private report links and a safe upgrade script

Anaphora 0.16 is the largest release since the database move. It adds control over AI spend, an API that AI agents can use, private report links and a safe upgrade script. It also hardens every path where one user's data could reach another user. Read "Before you upgrade" at the end before you install it.

AI actions

Each AI provider now shows the tokens it used in the last 24 hours and in the last 7 days, and you can give each window a budget. When a budget is reached, Anaphora pauses the job that made the call and refuses further calls on that provider until the window rolls over. The Jobs list marks the jobs that a budget paused, and one button starts those jobs again (only those). The operator can also get an alert when a budget is reached, or earlier, at a percentage you choose.

You can now choose what each AI action reads. The "Context" section has two modes: "Everything so far" keeps the old behaviour, and "Only ticked rows" sends only the snapshots and variables you pick. You can also send snapshots as images to a model that reads them, and cap the length of the answer.

Dashboards cost less to send. On a 12-tile dashboard, the request to the model is 45% smaller and carries all twelve tiles. Before, it carried eight, because tiles with the same title were merged and Chrome's internal data took 40% of the page structure.

Reports

Report links are private. Each run gets a secret token, and the links in an email, a Slack message or a webhook carry it. A report opens only for that link or for a signed-in member of the space.

Reports cannot reach your internal network. A report is HTML and its text blocks can name any address, so the PDF renderer now refuses internal addresses: cloud metadata, localhost and private ranges. If a report shows a logo from an intranet server, add that host to REPORT_ALLOWED_HOSTS. Captures are not affected and can still open your internal Kibana or Grafana.

A broken template is not sent. A typo in a Liquid block no longer closes the job editor, but you cannot save until you fix it. If a block fails to render at run time, Anaphora withholds the report, keeps it on the run so you can see where it breaks, and flags it on the Jobs list and in job health.

Delivery status and retries

  • A delivery that a mail server, Slack or a webhook refused now shows as Delivery issue on the Jobs list and turns job health yellow or red. Before, it showed Success.

  • A webhook that answers with an error fails the delivery.

  • A report that reached nobody is retried. A report that reached some of its recipients is not retried, so nobody gets it twice.

  • Retries show under the first failed run, and the "Attempts" column counts them.

  • Long captures keep their retries. A capture that hangs stops after 30 minutes. A failure after the capture (full disk, PDF timeout) is a failed run, not a missing run.

Capture fixes

  • Grafana 12 and 13 dashboards are captured again, with all panels.

  • Kibana hit counts over 999 are read whole. Before, "1,470,592" was read as 1, so an alert with a threshold above 999 compared the wrong value.

  • The "Use regex" switch on a text replacement works. Replacements you saved before work as they did.

  • A ROR space or a Grafana dashboard with "login" in its name no longer fails every run.

  • A calculate that gives true or false no longer breaks the Runs page of its space.

For AI agents: /llms.txt and a JSON API

Every page links to /llms.txt, a guide for AI agents that work in your browser, such as Claude in Chrome. It covers jobs, captures, templates and delivery, and it describes a JSON API under /api/spaces/{space}/…. The API uses your signed-in session and the same access and licence checks as the pages, so an agent can set up a job for you without clicking through the editor.

Operations

  • The image includes an upgrade script. check starts the new version on a copy of your database, with no network and no deliveries, and reports what it finds. apply makes a backup, switches to the new version, checks it, and restores the backup if the new version does not start. Anaphora also copies the database before each migration.

  • You can set OpenID Connect sign-in (OIDC_*, Enterprise) and an AI provider (AI_*) from environment variables. The OIDC client secret stays in memory and is never written to the database.

  • Dark mode, in one navy hue.

  • The Jobs, Templates, Delivery Interfaces and AI Providers lists have one action bar for search, filters, pagination and bulk actions.

  • Node 24 LTS. The runtime image is about 210 MB smaller, and the build is reproducible: the same commit gives the same image.

Security

This release fixes the findings of a full security review. The main ones:

  • Sign-in attempts are limited per user name and per address.

  • A read-only member no longer receives the login passwords of a job's capture.

  • Report templates can no longer read server files. Templates and equations run in a separate process with a memory cap and a time limit, so they cannot stall or crash the server.

  • Each space is isolated. A job cannot deliver through another space's interface, a copy cannot overwrite another space's row, and a removed member loses access at once.

  • The server checks the edition limits, not only the browser.

  • The capture extension talks only to the Anaphora addresses you trust.

  • Sign-in secrets (OIDC, LDAP, SAML) are encrypted with your database key.

  • The container no longer includes sudo and runs unprivileged.

Before you upgrade

  1. Use the upgrade script, and read "Upgrading Anaphora". This release changes the database, and the previous version does not start on the upgraded one.

  2. Behind a reverse proxy, set AF_TRUSTED_PROXIES to the proxy's address. If you do not, all browsers share the proxy's address for the sign-in limit.

  3. Reinstall the capture extension from the job editor, then click "Trust this Anaphora and reload" in its popup.

  4. For intranet images in reports, add their hosts to REPORT_ALLOWED_HOSTS.

  5. Without credentials, /guest/api/health now returns colours and counts only. For the full listing, send the system credentials with basic auth.

  6. Form-encoded webhooks now receive the message encoded once. If your receiver decodes it twice to work around the old bug, remove that step.

  7. Old logs can contain job passwords in clear text. Delete those logs, or change those passwords.

  8. All users must sign in again after the upgrade.

The full list of changes, with each migration, is in the changelog.

Earlier updates