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 atrusted-typeslist, addoctet-collectorto 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
CollectorConfigoption,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 withEDGE_SIGNING_KMS. Set only one of these andEDGE_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
503andedge_signing_failedand 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/challengeis 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. Itstypandvare 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
algES256and thekidoctet-browser-verdict-2026-10. Tokens signed before then, withkidoctet-browser-verdict-2026-09andalgEdDSA, stay verifiable with the key archive. Your verifier must acceptES256and take the algorithm from the key thekidnames. 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 togeo.octetproof.com, or through your edge, which forwards it unchanged. See Get a challenge. CollectorConfighas a new required field,challenge. Without it,start()throws andverify()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 withoctet: this challenge was already used, and you callstart()with a new challenge. - New reason codes on
POST /v1/signals:401withchallenge_required,challenge_invalid,challenge_expiredorchallenge_mismatch, and409withchallenge_spent. New errors onPOST /v1/challenge:400withinvalid_json,invalid_session_reforinvalid_client_ip, and429withrate_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
typis nowoctet-browser-verdict+jwt;v=3. Version 2 added thedeviceKeyclaim, and version 3 addschain,chain_rootandclientNetMatch. Tokens with;v=1and;v=2still verify. Update your verifier to accept all three. See Verify the Signed Token. - The
clientNetclaim is removed. To check the user's network, send the user's IP address asclientIpwith the challenge request, and readclientNetMatchin 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/challengeto 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
kidand 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_mismatchandedge_signature_stale. See Errors. - The edge no longer sends a
User-Agentof 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
400withmissing_fieldsinstead 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
409andreplayed_bundle. - The collector keeps a device key in the browser's IndexedDB, in a database named
octeton 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_sealandreplayed_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 infullmode, and up to about 3 s inlitemode. - New pages: Integrity and Audit and Keep Verdicts for Audit.
v1.2.0
The first public release of Octet Browser.
- The collector's
start()andready()split collection from the moment of action: start at page load, and wait at the moment of action. - Three collection modes,
full,liteandpassive. 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
amd64andarm64. - The collector starts a Web Worker from a
blob:URL. Allowworker-src blob:in your Content Security Policy for the best results. See Network and CSP.