Blocks until consent
Inline tags, Google Tag Manager and framework components all wait for their category. Reject all means nothing non-essential runs.
cookie consent · EU-hosted · free plan
CookieCrumbs scans your site, blocks every tracker until people say yes, and keeps a signed record of each choice. Set it up from a dashboard, from your terminal, or straight from Cursor and Claude Code. Hosted in the EU, free to start.
$ npx cookiecrumbs init
Layout
Colours
Languages
Region rules
| Time | ID | Region | Categories | Version |
|---|---|---|---|---|
| 14:02:11 | c_8f2a… | DE | analytics marketing | v14 |
| 14:01:58 | c_19c4… | FR | all | v14 |
| 14:01:40 | c_77e0… | NL | rejected | v14 |
| 14:01:12 | c_b3d9… | GB | analytics | v13 |
Works with the stack you already run
Open-source projects CookieCrumbs ships SDKs or install guides for. Names and logos belong to their respective projects and indicate compatibility only, not endorsement. Shopify, Webflow, Framer and any other site builder work with the one-line script tag.
at a glance
A banner you paste in is not a consent management platform. This is what changes when the scanner, the log and the config live in one place.
consent banner
Most banners ask, then load everything anyway. This one holds every tag, pixel and iframe until its category is granted. Seven layouts, 25 languages, Google Consent Mode v2, and the right rules for the EU, UK, US states, Switzerland, Brazil and Quebec, picked by where the visitor is.
Inline tags, Google Tag Manager and framework components all wait for their category. Reject all means nothing non-essential runs.
Same layer, same size, same weight. That is what CNIL and the EDPB check first. Keyboard-operable, focus-trapped, WCAG 2.2 AA.
Opt-in where the law says opt-in. A Do Not Sell link and Global Privacy Control where it says opt-out. Texts in 25 languages that follow the visitor’s browser.
All seven signals denied before any tag runs, updated the moment someone chooses. GTM template included. No IAB TCF yet; it is on the roadmap.
One file, loaded async, cached for a long time, no third-party requests of its own. Bar and ribbon layouts reserve their space before paint. CLS 0.00.
A persistent control reopens the banner, a refusal is remembered for six months, and a changed purpose asks again. Article 7(3), in practice.
built with AI?
Lovable, Bolt, v0 and Replit generate your analytics and pixels, and none of them adds consent. Ask the same agent for a banner and you get a box that blocks nothing. CookieCrumbs fixes both: the scanner finds what the app really loads, the banner holds it until people agree, and the MCP server lets Cursor or Claude Code do the setup with a diff you review.
LovableBoltv0ReplitCursorClaude CodeWindsurf
Pick a template, run the scan, publish. The cookie declaration writes itself and updates when trackers change. No lawyer needed for the everyday work.
One command to init, typed SDKs for Next.js, React, Astro, Nuxt and SvelteKit, the banner config in git, and an MCP server your agent can drive.
One console, every client. Roles per workspace, shared templates, scheduled re-scans with alerts, and a price that doesn’t multiply per domain.
Shopify, WooCommerce, Webflow and custom storefronts through one script tag. Consent Mode keeps Google Ads measuring, the US rules honour Global Privacy Control, and the consent log covers the audit.
mcp server
One line adds the CookieCrumbs MCP server to Claude Code, Cursor, Windsurf, Zed or VS Code. Then ask in plain words. The agent scans, writes the config and opens a pull request. Every write is a diff you approve, and every action lands in the audit trail with the token’s name on it.
claude mcp add cookiecrumbs -- npx -y @cookiecrumbs-eu/mcp
{ "mcpServers": { "cookiecrumbs": { "command": "npx", "args": ["-y", "@cookiecrumbs-eu/mcp"] } } }
One command for Claude Code, one line in .cursor/mcp.json for everyone else. Authenticated with a scoped token you can revoke.
“Add a GDPR cookie banner, block GA4 until consent, German and French texts.” The agent scans, writes the config and opens the PR. You review and merge.
Ask why a cookie is filed under Marketing, or whether your first layer meets CNIL guidance. Every answer cites the scan result and the rule.
Tools are read-only by default. Writes need an explicit scope and show a diff first. Tokens never carry billing rights.
Add a GDPR cookie banner, block GA4 until consent, German and French texts.
scan_siteacme.example · 38 pages · 14 cookies✔update_bannerlayout: bar · languages: de, fr · GA4 → analytics✔push_configcookiecrumbs.config.ts · preview deployed✔Done. GA4 now loads only after analytics consent, banner texts are in German and French, and Consent Mode v2 defaults are denied for EEA visitors. I opened PR #142 for your review.
+ languages: ['de', 'fr'],
+ block: { 'googletagmanager.com': 'analytics' },
consentMode: { default: 'denied' },
how it works
From an unscanned site to a live GDPR cookie banner with a consent log behind it, in three steps. Click through them in the dashboard, script them from the CLI, or hand them to your coding agent.
Run npx cookiecrumbs init or paste your domain. The scanner loads your pages in a real browser, in every consent state, and drafts the categories and the declaration.
Layout, colours, texts and languages, in the dashboard or in cookiecrumbs.config.ts. Preview it per region and pick from ten built-in templates.
One script tag or the SDK. Scripts stay blocked until consent, and every choice lands in your EU-hosted log.
One command runs the first scan
$ npx cookiecrumbs init
✔ Detected Next.js (App Router) · linked acme.example to workspace acme (eu-central)
✔ cookiecrumbs.config.ts and cookiecrumbs/texts/ written · install snippet printed
$ cookiecrumbs scan --wait
✔ 38 pages crawled in 3 consent states · 14 cookies in 4 categories · declaration updated
→ Run `cookiecrumbs open` to edit design, texts, languages and regions
Found 14 cookies
Classifying 72%
Blocking marketing until consent
import { defineConfig } from 'cookiecrumbs';
export default defineConfig({
layout: 'bar',
languages: ['en', 'de', 'fr', 'nl'],
regions: {
EU: 'opt-in',
UK: 'opt-in',
US: 'opt-out',
},
consentMode: { default: 'denied' },
});
<CookieCrumbs site="acme.example" />
$ cookiecrumbs push --note "launch"
✔ Banner v14 published on acme.example · scripts blocked until consent
2026-08-21 14:02:11 · eu-central · analytics: granted · marketing: denied · v14
website cookie scanner
A banner is only as good as its inventory. The scanner crawls rendered pages in each consent state, matches every cookie and pixel against a maintained tracker database, and writes the cookie declaration for you. Then it keeps checking.
Rendered pages in each consent state, not just HTML. Cookies set by scripts, pixels, iframes, local storage and tag managers, with the page and the script that set them.
Every cookie is matched against the tracker database and published as a cookie declaration in your languages, as JSON, HTML or Markdown.
Run a free scan38 pages crawled · 14 cookies in 4 categories · last scan 2 hours ago
| Cookie | Provider | Category | Set by | Expiry | Status |
|---|---|---|---|---|---|
cc_consent | CookieCrumbs | Necessary | / | 6 months | Allowed |
_ga | Google Analytics | Analytics | gtm.js | 2 years | Blocked until consent |
_fbp | Meta Pixel | Marketing | /pricing | 3 months | Blocked until consent |
__hstc | HubSpot | Marketing | hs-script | 13 months | Blocked until consent |
_hjSession | Hotjar | Analytics | /docs | 30 min | Blocked until consent |
theme | acme.example | Preferences | localStorage | 1 year | Blocked until consent |
Meta Pixel Marketing
Daily, weekly or monthly. A pixel added through someone's tag manager experiment arrives as a Slack or email alert, blocked by default.
$ cookiecrumbs scan --fail-on-unknown
✖ 1 unclassified tracker: cdn.example.net/px.js
build failed · classify it or add a rule
Runs in CI and fails the build when an unclassified tracker appears. Pull results as JSON and diff them in pull requests.
dashboard
A data protection authority or an enterprise customer asks how consent was obtained. You answer with a signed export, not an explanation.
Every choice is stored with a timestamp, the banner version, a hash of the texts shown and the categories chosen, chained to the record before it. Exports are signed, so an auditor can verify them without trusting us. Proof of consent under Article 7(1), on every plan.
Consent log · filtered: last 24 h · eu-central
| Timestamp | ID | Region | Categories | Banner |
|---|---|---|---|---|
| 2026-08-21 14:02:11 | c_8f2a91 | DE | analytics marketing preferences | v14 · en |
| 2026-08-21 14:01:58 | c_19c4e0 | FR | all granted | v14 · fr |
| 2026-08-21 14:01:40 | c_77e0b2 | NL | all denied | v14 · nl |
| 2026-08-21 14:01:12 | c_b3d9c7 | GB | analytics marketing | v13 · en |
| 2026-08-21 14:00:49 | c_0a7f13 | DE | withdrawn | v14 · de |
Acceptance analytics · sample data
By device
Accept, reject and custom rates by region, device, language, layout and banner version. Compare two versions and see which one earns consent honestly.
Texts, categories, colours and behaviour change from the dashboard and go live in seconds. Every version is kept, so rollback is one click.
Workspaces, roles and an audit trail on every change. Shared templates with per-site overrides, and client workspaces for agencies.
cli and sdks
Everything in the dashboard is also a file and an endpoint. Your banner lives in git, gets reviewed in a pull request and deploys with the rest of the app. The CLI, the SDKs and the MCP server are on the free plan.
$ npx cookiecrumbs init
✔ Detected Next.js (App Router) · linked acme.example to workspace acme (eu-central)
✔ cookiecrumbs.config.ts and cookiecrumbs/texts/ written · install snippet printed
$ cookiecrumbs scan --fail-on-unknown --wait
✔ 38 pages crawled in 3 consent states · 0 unclassified trackers · 14 cookies match the declaration
$ cookiecrumbs push --note "launch"
✔ Draft pushed · published as v14 on acme.example
$ cookiecrumbs logs export --format csv
✔ 12,480 consent records, Ed25519-signed → ./exports/consent-2026-08.csv
Detects Next.js, React, Astro, Nuxt, SvelteKit or plain HTML, links the site, writes cookiecrumbs.config.ts and the texts, and prints the install snippet for your framework.
Design, texts, categories, languages and region rules in one typed config. cookiecrumbs push deploys it. cookiecrumbs pull brings dashboard edits back into the repo.
cookiecrumbs scan --fail-on-unknown fails the build when a new tracker sneaks in, with SARIF for code scanning. cookiecrumbs logs export pulls signed records for an audit. Tokens are scoped per site, environment and permission.
Typed packages for Next.js, React, Astro, Nuxt and SvelteKit with hooks like useConsent(), a script tag for everything else, and a REST API with webhooks.
eu-first
Built and run in Germany, priced in euro. The consent records you rely on never cross a border, so there is no transfer mechanism to argue about.
Consent logs, scan results and dashboards run in Frankfurt. Records never leave the EU.
Pseudonymous IDs, no IP address stored next to a record, retention you set, a data processing agreement that applies on sign-up and a public sub-processor list. Privacy by design in practice, not in a PDF.
DPA, sub-processors, security overview.
Prices in euro, locked for the life of your plan. Traffic is never metered, and a scan never upgrades you on its own. Your invoice matches the pricing page.
What you see on pricing is what you pay.
Configs are files in your repo. Policies export as HTML or Markdown, consent logs as signed CSV or JSON, including after you cancel. Leaving is one command.
$ cookiecrumbs export --all
from the blog
Long reads on the rules, the enforcement and the engineering of consent. Every claim carries a date and a source, and every piece ends with something you can check on your own site today.
Lovable ships your app without a cookie banner, and asking it for one gets you a box that blocks nothing. Here is the ten-minute route to a banner that holds every tracker until people agree, with the checks that prove it.
ReadTwo decisions in September 2025 turned an EDPB guideline into a price tag. Here is what the regulator counted, and what a compliant first layer looks like in 2026.
ReadConsent Mode is not a cookie blocker. It is a message your banner sends to Google’s tags. Get the message wrong and you either break the law or lose your Ads measurement. Here is the whole thing in one page.
ReadA regulator or an enterprise customer asks how you got consent. “We have a banner” is not an answer. A file is. This is what has to be in it.
ReadYes, a banner can wreck your scores. No, it does not have to. The damage comes from three specific behaviours, and each has a fix.
ReadThe UK loosened one corner of its cookie rules and tightened the penalty for everything else. Here is what the Data (Use and Access) Act changed, and what it did not.
Readregulation watch · updated
Cookie rules move every few months. We track them so your banner does not fall behind. Every card is dated and linked to its source, and region rules in CookieCrumbs follow this list through the changelog.
TCF 2.2 strings stopped being valid on 1 March 2026. TCF 2.3 adds the disclosedVendors segment to the TC String. CookieCrumbs does not emit TC Strings yet; TCF support is planned. If you serve AdSense or Ad Manager, you need a TCF-registered CMP today.
The Data (Use and Access) Act 2025 allows low-risk statistical and appearance cookies without consent in the UK, with information and an objection route. ICO guidance finalised 29 April 2026.
ad_storage became the controlling signal for Google Ads data. Banners that only map analytics_storage lose Ads measurement. CookieCrumbs maps Marketing consent to the right signal automatically.
Would move cookie consent into the GDPR, exempt first-party audience measurement and bar re-asking for six months after refusal. Council dropped Art. 88b browser signals in June 2026; trilogue continues.
CNIL fined Google €325m and SHEIN €150m over banners without one-click refusal and related practices. Equal prominence of Reject all on the first layer is the baseline.
pricing
Prices in euro, monthly or yearly with two months free. The unit of sale is your organisation. Traffic is never metered; the only paid meter is subpages scanned per month. And the banner never goes dark: no plan ever stops serving or logging consent.
Fully compliant, forever
€0/month
Start freeMake the banner perform
€29/month
Choose ProOne company, many domains
€199/month
Choose ScaleMany clients, one console
€99/month
Choose AgencyBilled monthly. 20 client workspaces included, then €9 per further workspace.
All prices in euro, locked for the life of the subscription: no indexation, no renewal uplift. Yearly billing is ten months for twelve (Pro €290, Scale €1,990). An organisation is one legal entity or brand family; Agency workspaces are for clients that are separate legal entities, and a client workspace that leaves its agency continues as a €29 Pro plan. Custom: on-premise, more than 100,000 subpages or paper contracts, quoted from the Scale price, contact us. Switching from another vendor? Your paid plan is free until the current contract ends, with config import. CookieCrumbs is not yet part of the Google CMP Partner Program, which matters only if you serve AdSense, Ad Manager or AdMob.
faq
Straight answers on GDPR, UK PECR, Consent Mode v2 and how CookieCrumbs handles each of them. Dates matter here, so every answer carries them.
In the EU, yes, if you set anything beyond strictly necessary cookies: ePrivacy Directive Article 5(3) plus GDPR consent. In the UK, PECR still requires consent, with new statistical and appearance exemptions since 5 February 2026. In the US there is no opt-in rule, but California and other state laws require an opt-out link and Global Privacy Control support.
Change script tags to type="text/plain" with a data-category attribute, or let the CookieCrumbs snippet rewrite known trackers automatically. Blocked scripts, iframes and pixels execute only after the matching category is accepted. In Next.js, React, Astro and Nuxt the SDK wraps tags in a consent-aware component, and Google Tag Manager triggers fire on consent events.
It can. A render-blocking CMP script with a short cache TTL can add seconds to LCP and cause layout shift on every visit. CookieCrumbs loads one 21 kB gzipped file asynchronously with long cache lifetimes, makes no third-party requests of its own, and the bar and ribbon layouts reserve their space before paint so they cause no layout shift.
Not on every page view. The CNIL recommends respecting a refusal for at least six months, and the proposed EU Digital Omnibus Article 88a would make a six-month no-re-ask period law across the EU. CookieCrumbs stores the refusal, suppresses the banner for a period you set, six months by default, and only re-asks when your purposes change.
No. They generate the analytics and pixel scripts you ask for and nothing that blocks them. Asking the builder for a banner usually produces a cosmetic box that shows a choice and blocks nothing, which does not meet GDPR or the ePrivacy Directive. CookieCrumbs adds a banner that holds those scripts until consent, through one script tag or through its MCP server from Cursor or Claude Code.
The free scan reads your homepage HTML once and matches script and iframe hosts against the tracker database, without an account. The full scan in the dashboard loads every page in a real browser, in each consent state, records every cookie, script, pixel, iframe and storage key with the page and script that set it, and re-runs on a schedule. Only the full scan can see what a tag manager injects after load.
In the EU, analytics still needs consent unless your regulator exempts a restricted setup; standard GA4 sends data to a third party and does not qualify. In the UK, PECR Schedule A1 (5 February 2026) exempts low-risk statistics with information and an objection route, under the ICO guidance of 29 April 2026. CookieCrumbs ships both rule sets.
Consent Mode v2 is how a cookie consent banner tells Google tags what the visitor allowed, through ad_storage, analytics_storage, ad_user_data and ad_personalization. Defaults must be denied for EEA, UK and Swiss visitors. Since 15 June 2026 Google uses ad_storage as the controlling signal for Ads data. CookieCrumbs sets the defaults, updates on consent and supports basic and advanced mode.
For AdSense, Ad Manager and AdMob, yes: since 16 January 2024 Google requires a CMP from its CMP Partner Program for EEA and UK traffic, integrated with IAB TCF. Google Ads and GA4 require Consent Mode v2 signals but not a certified CMP. CookieCrumbs is Consent Mode v2 ready and is not yet part of the Google CMP Partner Program, so it is not the right choice for AdSense, Ad Manager or AdMob until that certification is in place.
You must be able to show who consented, when, to what, and what they were shown. A usable log stores a timestamp, pseudonymous ID, banner version and texts, categories chosen and withdrawals. GDPR sets no fixed period; keep records while you rely on the consent plus the limitation period in your country. CookieCrumbs keeps records 12 months on Free and 5 years on every paid plan.
In practice, yes. The CNIL requires a one-click refusal on the first layer and fined Google €325m and SHEIN €150m in September 2025; EDPB Guidelines 03/2022 treat hidden or faded reject options as dark patterns. CookieCrumbs layouts ship equal-prominence buttons and a persistent control to reopen the banner; you can change colours, not demote the button.
Run npx cookiecrumbs init. The CLI detects the framework, installs the integration, writes cookiecrumbs.config.ts, sets Consent Mode v2 defaults and links the site to your workspace. Static sites, WordPress, Shopify and Webflow use one script tag or a plugin. With the MCP server in Claude Code or Cursor, the agent runs the same steps and opens a pull request.
Yes, if it has the tools. The CookieCrumbs MCP server exposes scanning, banner configuration, publishing and the consent log to Claude Code, Cursor, Windsurf, Zed and VS Code. Writes are proposed as a diff first and confirmed on a second call, and every action is logged with the token that made it.
In Frankfurt, Germany, on infrastructure inside the EU. Consent records never leave the EU, no IP address or user agent is stored beside a record, and every record can be exported as signed CSV or JSON, including after you cancel.
ready when you are
Free plan, two domains, no card. Or run a free scan first and see what your site loads today.
$ npx cookiecrumbs init