Changelog

Our own release history, hash-chained.

Same construction as the customer audit ledger and the public transparency log: each release links to the hash of the one before it, so editing an old entry breaks every entry after it. If a tamper-evident chain is worth selling, it's worth running on ourselves where anyone can already check it.

Chain verified — every entry links to the one before it
2026.09.01.22026-09-01

Published clause-by-clause regulatory maps for six more frameworks.

  • ISO/IEC 42001, NIST AI RMF, APRA CPS 230, APRA CPS 234, GDPR, and ISO/IEC 27001 each now have a public page mapping clauses to the exact Runback capability and evidence type behind them — generated from the same static definitions the in-app Regulatory tab evaluates live.

seq 7 · 48a022354718…198a866ef818…

2026.09.01.12026-09-01

Added a live public verification badge for the audit ledger.

  • Any workspace with a sealed ledger can embed a badge that renders fresh, server-side, from the same public transparency log this changelog borrows its design from — not a static image.

seq 6 · 198a866ef818…7a379ed7d1a4…

2026.09.012026-09-01

Live hover tooltips on every dashboard chart; removed remaining static/placeholder data.

  • Every chart in the app now shows a real data tooltip on hover, sourced from the same query the chart itself renders from — nothing hard-coded.

seq 5 · 7a379ed7d1a4…25182662bf40…

2026.08.31.22026-08-31

Published a measured onboarding number instead of an unmeasured claim.

  • "Time to first captured run" is now a real, scripted benchmark timing a fresh workspace through its first ingested event — published on the onboarding and pricing pages.

seq 4 · 25182662bf40…6716c785086e…

2026.08.31.12026-08-31

Shipped Go SDK Phase 1: event capture, redaction, and cassette hash-chaining.

  • A first-party Go SDK now captures model/tool calls and posts them to ingest, alongside the existing TypeScript and Python SDKs.
  • Redaction and cassette hash-chaining were ported from the TypeScript implementation and are on by default, not opt-in.

seq 3 · 6716c785086e…ae6eae7898a7…

2026.08.312026-08-31

Advanced the tenant-isolation (RLS) migration and added session revocation.

  • Ledger, compliance, runs, narratives, security findings and external grants now read through the tenant-scoped client, where Postgres row-level security is load-bearing. Other read paths and all writes still run as a role that bypasses RLS — see /security for the current, precise state.
  • Sessions can now be explicitly revoked (not just expired), with the revocation itself recorded in the admin audit trail.

seq 2 · ae6eae7898a7…b61096ed5474…

2026.09.072026-09-07

Community edition published and tagged v0.1.0; replay and the audit ledger are free on every plan; database row-level security enforced.

  • The Community edition is public at github.com/letsRunback/runback-community, tagged v0.1.0, under Community Licence v2.0 — source-available: read, modify and redistribute, with one limit (no hosted resale). v1.0 granted no source rights at all and was replaced.
  • Deterministic time-travel replay and the tamper-evident audit ledger are now granted on every plan including free. The licence described them as Community capabilities while the code gated them at Pro and Enterprise.
  • Evals and the CI release gate work on every tier, hosted or self-hosted.
  • Database row-level security is live: reads on the migrated paths run as a role that cannot bypass RLS, verified in both directions against production. Other read paths and all writes still run as a role that does bypass it — /security tracks the precise state.
  • API keys can be issued telemetry-only, so a key leaked from an application can post runs and nothing else.
  • Compliance exports verify the ledger before attesting to it, and controls evidenced only by a run count now report as partial rather than compliant.

seq 1 · b61096ed5474…genesis

Verify it yourself

No account, no Runback software beyond one fetch.

bash
curl https://runback.dev/api/changelog | node -e '
const crypto = require("crypto");
const sha256 = s => crypto.createHash("sha256").update(s).digest("hex");
function canonical(v) {
  if (v === null || typeof v !== "object") return JSON.stringify(v) ?? "null";
  if (Array.isArray(v)) return "[" + v.map(canonical).join(",") + "]";
  return "{" + Object.keys(v).sort().filter(k => v[k] !== undefined)
    .map(k => JSON.stringify(k) + ":" + canonical(v[k])).join(",") + "}";
}
let data = "";
process.stdin.on("data", c => data += c);
process.stdin.on("end", () => {
  const { entries } = JSON.parse(data);
  let prev = "";
  for (const e of entries) {
    const { seq, prev_hash, entry_hash, ...release } = e;
    if (prev_hash !== prev || sha256(prev + canonical(release)) !== entry_hash) {
      console.error("BROKEN at seq", seq); process.exit(1);
    }
    prev = entry_hash;
  }
  console.log("verified:", entries.length, "entries, chain intact");
});'
Honest limits

What this page does not claim.

  • These are curated, customer-facing release notes, not a raw git log — a chain over a summary we wrote is not proof the summary is complete, only proof it hasn't been edited since it was published.
  • There is no independent time-stamping on these entries the way there is for ledger checkpoints (RFC 3161 witnessing, a public transparency log). This chain proves internal consistency — that nothing here was silently altered — not that it existed by a given date beyond git's own commit history.