Release Notes

Release assets

Every file is a release asset in octetproof/octet-browser, under the latest release. All versions and their changelogs are on the releases page. Each release has these assets:

Asset What it is
octet-collector.js The collector, as a script that defines the global octet. Serve it from your own origin.
octet-collector.js.sri The Subresource Integrity hash of octet-collector.js, for the integrity attribute.
octet-collector.mjs The collector as an ES module.
octetproof-collector-<version>.tgz The collector as an npm package, @octetproof/collector, with TypeScript types.
octet-edge-linux-amd64 The edge, for Linux on x86-64.
octet-edge-linux-arm64 The edge, for Linux on 64-bit ARM.
SHA256SUMS SHA-256 checksums of the files above.
SHA256SUMS.sig, SHA256SUMS.pem The cosign signature over SHA256SUMS, and its certificate.

Use the collector and the edge from the same release. To check your downloads, see Deploy the Edge.

Collector support

Octet accepts collections from a collector release for 12 months after the release that replaces it. When a new release comes out, its entry below gives the date the previous collector stops being accepted. After that date, the old collector's sessions get 400 with unknown_seal_key.

Two releases are exceptions, because they changed what every collection must carry. From v1.3.0, Octet accepts only sealed collections, so a v1.2.0 collector gets 400 with unsealed_bundle. From v1.5.0, Octet accepts only collections that carry a challenge, so every collector older than v1.5.0 gets 401 with challenge_required.

Browser support

The collector is built for ECMAScript 2020, which every current version of Chrome, Edge, Firefox and Safari supports, on computers and phones. It needs fetch and a secure (HTTPS) page. If the browser blocks a measurement, the collector still works and leaves that measurement out. See Network and CSP.

v1.9.1

No change to how you call Octet: the challenge, the verdict response and the token are the same as in v1.8.1. The edge is the same as in v1.8.1, so only the collector needs updating. Update it when convenient.

  • New collector function, settled(). It resolves once the collector has finished sending the latest collection. If your page navigates away soon after a collection, await it first. Using it is optional. See Collector API.
  • For a license with the early verdict, the collector sends two reports, and ready() resolves on the first. verify() still resolves after both. The early verdict is available on request, per license. A license without it keeps one report per session and version 3 tokens.
  • The collector file is about 5 KB larger, and the ES module about 7 KB larger.

v1.8.1

No integration changes. The collector and the edge are the same as in v1.8.0.

  • Octet accepts the read tokens the Octet portal issues from the week of 9 November 2026. The read tokens you use today keep working until the portal replaces them. Then use the new ones as before.

v1.8.0

No change to how you call Octet: the challenge, the verdict response and the token are the same as in v1.7.0. Update the collector and the edge when convenient. If your site sets a strict Content Security Policy, read the first item before you update.

  • The collector now runs a short check in a hidden, sandboxed frame with a small inline script, and removes the frame within a second. On a page with a nonce-based CSP, pass the page's nonce in the new option cspNonce. With Trusted Types and a trusted-types list, add octet-collector to the list. With a hash-only CSP, the check is skipped quietly. In every case nothing else changes. See The collector's check frame.
  • New CollectorConfig option, cspNonce. See Collector API.
  • The collector file is about 11 KB larger, 4.5 KB gzipped.
  • The edge includes an updated network library with security fixes. There is nothing to configure.

v1.7.0

No change to how you call Octet: the collector's options, the verdict response and the token are the same as in v1.6.0. Update the collector and the edge when convenient.

  • New: the Octet portal asks you to prove you hold each edge signing key you register. Run octet-edge prove-key --challenge … on the edge host and paste the line it prints. Keys registered earlier can be proven the same way. See Prove you hold the signing key.
  • New: the edge can read its signing key from a file, for example one encrypted to the host's TPM, with EDGE_SIGNING_KEY_FILE, or sign in AWS KMS or Google Cloud KMS with EDGE_SIGNING_KMS. Set only one of these and EDGE_SIGNING_KEY. See Where to keep the signing key.
  • Changed: if the edge can't sign a session, for example because its cloud key service is unreachable, it answers the browser with 503 and edge_signing_failed and sends nothing to Octet. Before, it forwarded the session unsigned, which Octet refused. See Errors.
  • When your edge serves HTTPS itself, it now also sends Octet two numbers about how steady the browser's connection was during the check, with no personal data. Mention it in your privacy notice as needed. See Privacy and Data.
  • The challenge your backend gets from POST /v1/challenge is about 360 characters longer. Pass it to the collector as before.

v1.6.0

No integration changes. The collector's options, the challenge, the verdict response and the token are the same as in v1.5.0. Update the collector and the edge together when convenient.

  • When the edge serves HTTPS itself, it now serves HTTP/2 to browsers that offer it. There is nothing to configure. See Edge Configuration.
  • When the edge serves HTTPS itself, it now also sends Octet a fingerprint of how the browser opens its TCP and HTTP/2 connections, with no personal data, as it has sent a fingerprint of the TLS connection since v1.5.0. Mention it in your privacy notice as needed. See Privacy and Data.
  • Octet's root-signed manifest, at /.well-known/octet-browser-manifest.json.jws, has a new edition that also lists Octet's license keys. Its typ and v are unchanged, so a verifier that checks the v1.5.0 manifest checks this one too. See Check a key against Octet's root keys.
  • Action needed if you verify tokens: from 19 October 2026 at 15:00 UK time, Octet signs verdict tokens with an ECDSA P-256 key held in a hardware security module, as announced in v1.5.0. From then, tokens have alg ES256 and the kid octet-browser-verdict-2026-10. Tokens signed before then, with kid octet-browser-verdict-2026-09 and alg EdDSA, stay verifiable with the key archive. Your verifier must accept ES256 and take the algorithm from the key the kid names. See Verify the Signed Token.

v1.5.1

No integration changes. The collector and the edge are the same as in v1.5.0.

v1.5.0

Breaking: update the collector, and change your backend and page to pass a challenge. From this release, Octet accepts a collection only when it carries a one-time challenge that your backend got from Octet for its sessionRef. Collectors older than v1.5.0 send no challenge, so their sessions get 401 with challenge_required. They are not covered by the 12-month support window.

  • Your backend requests a challenge for each page view with POST /v1/challenge, body {"sessionRef": "…"}, and your read token. The response is {"challenge": "…", "exp": …}. A challenge is valid for 10 minutes and works for one collection. Send the request to geo.octetproof.com, or through your edge, which forwards it unchanged. See Get a challenge.
  • CollectorConfig has a new required field, challenge. Without it, start() throws and verify() rejects. See Collector API.
  • Each challenge works for one collection. ready() reuses a result for 90 seconds as before. After that, or after a failed POST, it rejects with octet: this challenge was already used, and you call start() with a new challenge.
  • New reason codes on POST /v1/signals: 401 with challenge_required, challenge_invalid, challenge_expired or challenge_mismatch, and 409 with challenge_spent. New errors on POST /v1/challenge: 400 with invalid_json, invalid_session_ref or invalid_client_ip, and 429 with rate_limited. See Errors.
  • The verdict has a new field, deviceKey, which identifies the browser and is scoped to your license. See Verdict Reference.
  • The verdict token's typ is now octet-browser-verdict+jwt;v=3. Version 2 added the deviceKey claim, and version 3 adds chain, chain_root and clientNetMatch. Tokens with ;v=1 and ;v=2 still verify. Update your verifier to accept all three. See Verify the Signed Token.
  • The clientNet claim is removed. To check the user's network, send the user's IP address as clientIp with the challenge request, and read clientNetMatch in the token. See Check the user's network.
  • Octet signs verdict tokens with Ed25519, as before. Octet may move to an ECDSA P-256 key (ES256). The verification examples now accept both, and take the algorithm from the key.
  • New: a key archive with every verdict key Octet has signed with, at /.well-known/browser-verdict-jwks-archive.json. See Keep Verdicts for Audit.
  • New: a manifest of Octet's keys, signed by two offline root keys, at /.well-known/octet-browser-manifest.json.jws. Pin the root keys from Check a key against Octet's root keys.
  • New: the challenge key set, at /.well-known/browser-challenge-jwks.json.
  • The edge forwards POST /v1/challenge to Octet. It needs no new settings.

v1.4.0

Action needed: when you update the edge, give it a signing key and register the key in the Octet portal. Octet is turning on required edge signatures. From then on, an edge without a registered key gets 401 with edge_signature_required or edge_key_unknown.

  • The edge signs each session it forwards to Octet with its own key, set in EDGE_SIGNING_KEY. The signature covers the collection and what the edge adds about the connection. See Deploy the Edge.
  • You register the signing key's kid and public key in your license's Edge configuration tab in the Octet portal, under Signing keys. A license can hold up to 3 signing keys, for a rotation overlap, and you can revoke one there. See Credentials.
  • The signing key is separate from the edge's client certificate. The edge needs both.
  • Octet refuses a session whose edge signature fails its check, with 401. New reason codes: edge_signature_required, edge_key_unknown, edge_signature_invalid, edge_signature_mismatch and edge_signature_stale. See Errors.
  • The edge no longer sends a User-Agent of its own when the browser sent none.
  • The collector works as in v1.3.0, with no change to its options, hosts or Content Security Policy.
  • A malformed collection now gets 400 with missing_fields instead of a server error.
  • Fewer wrong countries for some users behind a VPN.

v1.3.0

Breaking: update the collector and the edge together. From this release, Octet accepts only sealed collections and only edges with a client certificate. A v1.2.0 collector gets 400 with unsealed_bundle, and a v1.2.0 edge without a client certificate gets 401 with client_cert_required. The v1.2.0 collector is not covered by the 12-month support window, because it doesn't seal its collections.

  • The collector encrypts each collection to Octet before it leaves the browser. Your edge forwards it without being able to read it, and Octet can tell if it was changed on the way. See Integrity and Audit.
  • Octet refuses a copy of a collection it accepted recently, through any edge, with 409 and replayed_bundle.
  • The collector keeps a device key in the browser's IndexedDB, in a database named octet on your origin. See Privacy and Data.
  • The collector needs a secure (HTTPS) page. On a plain http:// page it fails at once with an error. See Errors.
  • The collector needs no unsafe-eval.
  • The edge connects to Octet only over mutual TLS, with a client certificate for your license. It refuses to start without one. You issue the certificate yourself in your license's Edge configuration tab in the Octet portal, under Certificates, and can revoke a single certificate there. See Deploy the Edge.
  • New reason codes: client_cert_required, client_cert_licence_mismatch, client_cert_revoked, unsealed_bundle, unknown_seal_key, bad_seal and replayed_bundle. See Errors.
  • Verdicts are harder to influence from the browser.
  • Sessions through iCloud Private Relay keep the user's own country, and aren't treated as masked.
  • On some connections, ready() can take up to about 4.5 s in full mode, and up to about 3 s in lite mode.
  • New pages: Integrity and Audit and Keep Verdicts for Audit.

v1.2.0

The first public release of Octet Browser.

  • The collector's start() and ready() split collection from the moment of action: start at page load, and wait at the moment of action.
  • Three collection modes, full, lite and passive. Every host the collector contacts is run by you or by Octet.
  • Each verdict carries a signed token, verifiable against Octet's published key set.
  • Per-license read tokens for fetching verdicts, created and revoked by you in the Octet portal.
  • The edge terminates TLS itself, and returns Octet's status and reason code when Octet refuses a session.
  • Static edge binaries for Linux on amd64 and arm64.
  • The collector starts a Web Worker from a blob: URL. Allow worker-src blob: in your Content Security Policy for the best results. See Network and CSP.
TermsPrivacy© 2026 Understone, Inc. d/b/a Octet