Tag drift goes unnoticed
A container is removed, a pixel is duplicated, an event stops firing. Pageguard records what actually loads, page by page, so silent regressions surface before revenue reporting does.
Open source · MIT licensed
Pageguard is web governance for the client side. It crawls your sites, runs their tags in a real browser, and validates what it finds against policies you control — so martech, privacy, and engineering share one source of truth.
Command center
Audits the martech you already ship
The gap
Tags change in a CMS, a container, a consent banner, or one line of JavaScript. By the time reporting breaks, the evidence is already gone.
A container is removed, a pixel is duplicated, an event stops firing. Pageguard records what actually loads, page by page, so silent regressions surface before revenue reporting does.
Trackers fire before the banner. Cookies appear that your policy forbids. Simulate accept, reject, necessary-only, and GPC states — then see the exact requests that leaked.
A finding without an observation is an opinion. Every Pageguard finding carries the request, cookie, tag, or data-layer event that produced it — exportable and reviewable.
How it works
Four stages, one engine. Run it in CI, on a schedule, or from the dashboard whenever the tag layer changes.
A breadth-first crawler respects robots.txt, applies scope rules, and fans out across a worker pool. Every scanned page is checkpointed, so runs resume instead of re-fetching.
robots.txt · sitemaps · checkpointsFetch over plain HTTP, or execute the page in a real Playwright browser. Auto mode upgrades SPA-like pages only where JavaScript is required.
HTTP · Chromium · autoDeclarative tag policies, multi-step journeys, privacy rules, and out-of-process Node validators. Policies live in YAML or JSON and evaluate against captured evidence.
YAML · JSON · TypeScriptPass/fail reports per rule and per page. Screenshots on journey failure, hashed cookie values, live progress over SSE or WebSocket, and JSON, CSV, or print-ready HTML exports.
JSON · CSV · HTMLCapabilities
Scanning, tag governance, journey testing, and privacy compliance share the same evidence model — no stitching together four tools and hoping the numbers agree.
BFS crawling with robots.txt handling, sitemap discovery, SPA detection, and a starter tag detector. HTTP and headless-browser fetchers behind one interface.
Assert tags, requests, data-layer events, and cookie inventories must exist or must not exist. Add value rules, attribute checks, and consent requirements.
Script navigate, click, fill, and wait steps in one browser session. Validate URL, title, tags, events, and cookies after every step, with a failure screenshot.
Score GDPR, CCPA, LGPD, and ePrivacy against consent-state simulations. Flag pre-consent leaks, missing rights flows, DPIA triggers, and cross-border hosts.
Write validators in TypeScript against a stable JSON protocol. Plugins run out of process, so a bad validator is isolated and never aborts a scan.
REST endpoints plus SSE and WebSocket progress streams. PostgreSQL persistence, in-memory mode for tests, Docker Compose, and a Helm chart for clusters.
Evidence over assertions
Pageguard doesn’t just say a page failed. It keeps the observation that produced the finding — the tag, request, cookie, or event — and makes the whole run reproducible.
# one policy across tags, cookies, and events
version: 1
name: "Acme tag policy"
must_exist:
- id: gtm
target: tag
match:
tag: google-tag-manager
- id: purchase-event
target: event
match:
event: purchase
value_rules:
- id: currency-code
variable: cart.currency
pattern: "^[A-Z]{3}$"
consent_requirements:
gated_categories: [advertising, social]
# consent-state simulation across regulations
version: 1
name: "Acme privacy policy"
regulations:
- gdpr
- ccpa
- eprivacy
cookie_rules:
- name_pattern: "^_ga"
category: analytics
- name_pattern: "^_fbp"
category: advertising
settings:
consent_states: [accept_all, reject_all, necessary_only, gpc]
gated_categories: [advertising, social]
cmp_tags: [onetrust, cookiebot]
pass_threshold: 100
{
"runId": "run_7f3c…",
"target": "https://acme.com",
"pages": 142,
"healthScore": 98.2,
"findings": [
{
"ruleId": "consent-analytics",
"severity": "critical",
"pageUrl": "/checkout",
"observed": "_ga fired before consent",
"evidence": "network/request/9f2a"
}
],
"privacy": {
"gdpr": 100,
"ccpa": 96,
"eprivacy": 94
}
}
Illustrative shape of Pageguard policies and reports.
Self-hosted by default
One Go binary, Playwright for rendering, and optional PostgreSQL. No SaaS account, no per-page pricing, and no audit data leaving your network unless you send it.
$ git clone https://github.com/bhkbdbhatt/openobserve.git
$ cd openobserve
$ go run ./cmd/pageguard --addr :8080 --plugins ./plugins
→ API ready http://localhost:8080
$ docker compose -f deploy/docker-compose.yml up --build
API http://localhost:8080
dashboard http://localhost:3000
postgres localhost:5432
FAQ
Straight answers about licensing, privacy, and what Pageguard does — and doesn’t — replace.
Yes. Pageguard is MIT licensed and built to be self-hosted. You can inspect the scanning engine, extend it with the TypeScript plugin SDK, and run it entirely inside your own network. It was formerly scoped as “OpenObserve” and renamed to avoid confusion with the observability project.
No. Pageguard audits what your CMP and tags actually do. It simulates consent states such as accept-all, reject-all, necessary-only, and GPC, then reports trackers and cookies that fire outside the policy you defined. It does not collect consent or replace the banner.
No. Raw cookie values are hashed at the edge and never persisted. Reports keep cookie metadata, domains, attributes, categories, and hashes — enough to prove behavior without retaining sensitive values.
Yes. Browser render mode executes client-side JavaScript in Playwright and captures the resulting tags, requests, cookies, console output, and data layer. Auto mode only upgrades SPA-like pages, so simple pages stay fast.
A scan audits pages at rest. A journey runs a scripted flow — navigate, click, fill, wait — in a single browser session and validates expectations after each step. That catches checkout, signup, and other multi-step paths where tags fire in sequence.
The software is free under the MIT license. You pay only for the infrastructure you run it on. The dashboard can be hosted statically, but the Go API needs a long-running server, PostgreSQL, and Playwright — Render, Fly.io, Railway, or your own VPS all work.
Take back the tag layer
Crawl a site, write a policy, and get evidence you can act on — in an afternoon, on your own infrastructure.
MIT licensed · Self-hosted · PostgreSQL ready