Code-first config
consent.config.ts lives in your repo. Version-controlled, code-reviewed, the same shape across React, Vue, Nuxt and vanilla JS.
Spec · v0.1.0
UK DUAA · EU GDPR · AI Opt-out
MIT licensed
In production on 3 sites
A developer-first SDK with PECR-correct script gating, Consent Mode v2 out of the box, and an auditable trail when you need one. No dark patterns, no compliance theatre.
or, in your terminal › npx @tickboxhq/cli init
// 12 lines. Type-checked. Lives in your repo.
import { defineConsent, jurisdictions } from '@tickboxhq/core'
export default defineConsent({
jurisdiction: jurisdictions.UK_DUAA,
policy: { version: '2026-05-17', url: '/privacy' },
categories: {
necessary: { required: true },
analytics: {
vendors: ['plausible', 'fathom'],
default: false,
},
},
}) consent.config.ts lives in your repo. Version-controlled, code-reviewed, the same shape across React, Vue, Nuxt and vanilla JS.
Tag scripts type="text/plain" and they stay inert until consent. No racy setTimeout hacks. Google Consent Mode v2 wired automatically.
Drop in @tickboxhq/cloud and every decision lands in a tamper-resistant log. Until then, nothing leaves the visitor browser.
Just so you know
We use privacy-friendly analytics. No personal data, no advertising. Privacy policy
One component, <ConsentBannerDefault />.
Equal-prominence Accept / Reject by default (ICO & EDPB compliant),
light/dark automatically, themeable with three CSS variables — or edited
per-site from the dashboard with no redeploy.
Why not just use…
Cookiebot, OneTrust
Built for legal teams. Config lives in a portal you don't control. The banner is a 200kB iframe that breaks Lighthouse.
Usercentrics
Pretty defaults. SDK still loads from their CDN, decisions go through their cloud whether you want them to or not.
Tickbox
The whole SDK is npm-installable, MIT-licensed, and runs locally. Cloud is opt-in. Your config is a TypeScript file. Reviewable in a PR. Versioned with git.
In production on
The builder generates your config, the CLI installs the SDK, the banner ships with sensible defaults.