Nothing loads until they say so.

Pryk is a cookie bar served as one file from Cloudflare. It scans your site, knows your cookies and applies the right law to each visitor.

Nothing running in production

One sheet. One line.

You keep customers in a Google Sheet. A deploy turns each row into one static file on Cloudflare, with that customer's cookies already inside it. Visitors only ever load that file.

01

Scan

A headless browser crawls the site twice: once with no consent, once after accepting. Anything active in the first pass gets reported.

acme.com: scan finished, saved to the sheet
  42 pages, 18 cookies, 9 third-party hosts
  Needs review: promo_seen
  ACTIVE BEFORE CONSENT:
    cookie _fbp (marketing)
02

Review and deploy

The scan fills in what it knows, and you settle the rest in the manager. Each file carries every language and speaks the visitor's.

keydomainconfig_json
acmeacme.com{"layout":"box"}
03

Paste one line

First in the head, or through Google Tag Manager. The key only runs on its own domain and subdomains.

<script src="https://pryk.click/k/acme.js"></script>

One file, every jurisdiction

The visitor's location picks the rules.

The browser's time zone decides, with no lookup and no IP address. Where a time zone can't settle it, the stricter rules apply. Choose a place to see the actual bar it gets.

LIVE BAR

The signals tags read

Speaks the standards.

Consent Mode v2

All seven signals are set before your Google tags run, and updated the moment someone chooses.

Global Privacy Control

Treated as an opt-out wherever one applies. In the US, the page confirms it was honored.

LGPD

Opt-in with a first-screen refusal for Brazil, in Brazilian Portuguese.

pt is one of 9 bundled languages

Make it yours

Three ways to restyle it.

It's isolated in a shadow root, so your site's CSS can't break it by accident, and every element is still reachable on purpose.

Easy

JSON

Colors, layout and wording. In the sheet, on the page or in Google Tag Manager.

{
  "layout": "box",
  "position": "bottom-right",
  "theme": { "buttonBg": "#0b57d0" }
}
Advanced

Your CSS

Every element has a named part, so you can style it from your own stylesheet.

pryk-consent { --pryk-radius: 0; }

pryk-consent::part(button) {
  text-transform: uppercase;
}
Full reach

Injected CSS

When a part isn't enough, send CSS inside the shadow root through the css key.

{
  "css": ".banner { border-width: 2px }"
}

Domain lock

A key works on one domain.

The file checks the hostname before it does anything. Subdomains are included, and lookalikes aren't.

Try it on your brand.