DOMgeist audits the active Chrome tab locally. Built for developers.
No telemetry, no user accounts, no remote audit API, no cloud AI. Scan data stays in the browser unless you export it.
![]() Scan Overview |
![]() Findings Detail |
![]() Grouped History |
![]() DOMgeist Lock |
![]() Settings & Permissions |
![]() JSON/CSV Export |
![]() Wireframe & Color Picker |
||
The scan payload is normalized with Zod, processed in bounded analyzer modules, and rendered in the popup.
The analyzer reports practical page findings across:
- Accessibility: headings, alt text, focusable hidden content, link text, ARIA references, SVG names, tabindex.
- Performance: LCP, CLS, observed resource weight, long tasks, image dimensions, lazy-loading opportunities, DOM size.
- Security: CSP, frame protection, referrer policy, permissions policy, COOP, cookie flags when permission is granted.
- SEO: title, meta description, canonical URL, Open Graph, Twitter Card metadata, robots intent, same-page anchors.
- Local AI: optional Ollama suggestion clusters from minimized scan summaries. Disabled by default and falls back to rules on timeout or invalid output. No cloud AI.
Technology detection uses bounded local signals: main-world runtime probes, script/resource URL fingerprints, meta tags, headers when captured, and conservative DOM evidence. It does not download external script bodies or import a remote fingerprint database.
The base extension runs with minimal production permissions: activeTab, scripting, and storage. Header capture, cookie inventory, and downloads use optional permissions. The popup shows when a deeper module is unavailable rather than silently pretending data exists.
Saved scan history can be encrypted locally behind DOMgeist Lock. The lock uses browser storage plus Web Crypto-derived keys so protected history can be hidden without sending secrets to a server.
Scan history is grouped by domain, sorted alphabetically, and rendered with a native SVG trend chart per domain. Exact URLs inside a domain become separate series, single-point histories render as dots, and the scan list remains visible below each group.
Reports can be exported as JSON or CSV. JSON preserves the validated scan structure and integrity hash. CSV provides flat rows for spreadsheet review.
Browser-internal pages, extension gallery pages, unsupported schemes, missing permissions, navigation changes, target-tab closure, and scan timeouts are classified into structured failure reasons and shown as clear messages.
+----------------------------------------------------------+
| Browser Extension MV3 |
| Chrome MV3 via WXT |
+------------------------+---------------------------------+
|
+----------------v----------------+
| Popup UI |
| React 19 + Radix + Zustand |
| Scan results, history, export |
+----------------+----------------+
|
+----------------v----------------+
| Background Service |
| permission flow + scan routing |
| optional headers/cookies |
+----------------+----------------+
|
+----------------v----------------+
| Content / Main-World Probe |
| DOM snapshot + runtime signals |
+----------------+----------------+
|
+----------------v----------------+
| Analyzer Modules |
| A11y / SEO / Performance |
| Security / Storage / Tech |
+---------------------------------+
Scan flow:
- Popup sends a typed scan request to the background service.
- Background validates the active tab and permission state.
- Content runtime captures a bounded page snapshot and public DOM signals.
- Main-world probe samples safe runtime globals for technology detection.
- Analyzer modules score findings and return a normalized response.
- Popup stores history locally, renders grouped trends, and enables export.
Page audits often touch sensitive URLs, markup, metadata, cookies, and storage keys. Keeping the analysis on-device makes the privacy claim verifiable in source code rather than promised by a service.
- Native SVG history charts instead of a charting runtime dependency.
- TreeWalker-style bounded DOM collection in analyzer paths.
- Lazy-mounted heavier history and debug surfaces.
- Architecture guard for runtime dependencies, permissions, workflow gates, package artifacts, and forbidden build patterns.
Browser Extension
- Manifest V3 through WXT.
- Chrome MV3 build target.
- Optional permission flow for
webRequest,cookies, anddownloads. - Production manifest verification for permissions, icons, and test-only commands.
React 19 + TypeScript
- Strict TypeScript.
- React popup UI with Radix Dialog, Dropdown Menu, and Collapsible primitives.
- Zustand for popup state.
- Dexie/IndexedDB for scan history.
- Web Crypto for lock-protected history.
- Vitest + React Testing Library for unit/component tests.
- Playwright for browser-extension E2E.
domgeist/
├── .github/
│ └── workflows/
│ └── deploy.yml # CI: lint, compile, coverage, builds, smoke, package checks
│
├── frontend/
│ ├── entrypoints/
│ │ ├── background.ts # Runtime message router
│ │ ├── content.ts # Content-script bootstrap
│ │ └── popup/
│ │ ├── App.tsx # Popup app shell + dialog wiring
│ │ ├── PopupView.tsx # Main scanner UI
│ │ ├── HistoryTrendChart.tsx # Grouped native SVG history charts
│ │ ├── popup-store.ts # Popup state store
│ │ └── style.css # Dark/frosted UI system
│ ├── utils/
│ │ ├── a11y-analyzer.ts # Accessibility rules
│ │ ├── performance-analyzer.ts # Performance metrics and findings
│ │ ├── security-headers.ts # Header analysis
│ │ ├── seo-analyzer.ts # SEO metadata checks
│ │ ├── storage-audit.ts # Cookies/storage summary
│ │ ├── technology-audit.ts # Public technology fingerprints
│ │ ├── scan-service.ts # Scan orchestration and failure classification
│ │ ├── history-store.ts # IndexedDB scan history
│ │ ├── history-crypto.ts # DOMgeist Lock encryption helpers
│ │ └── export-report.ts # JSON/CSV export
│ ├── tests/ # Vitest + React Testing Library
│ ├── e2e/ # Playwright extension workflows
│ ├── smoke/ # Package smoke checks
│ ├── scripts/ # Architecture, package, and manifest guards
│ ├── public/icon/ # DOMgeist icon assets
│ ├── wxt.config.ts # Manifest, targets, aliases, package excludes
│ └── package.json
│
├── BRAND.md # DOMgeist brand asset policy
├── LICENSE # GPL-3.0-only text
└── README.md
| Area | Technology |
|---|---|
| Extension framework | WXT 0.20, Manifest V3 |
| Target | Chrome MV3 |
| UI | React 19, Radix UI primitives, Tailwind CSS v4 |
| Language | TypeScript strict mode |
| State | Zustand |
| Storage | Dexie + IndexedDB, browser storage |
| Validation | Zod |
| Export | JSON, CSV |
| Testing | Vitest, React Testing Library, Playwright |
| Packaging | WXT zip targets + custom artifact verification |
| CI | GitHub Actions + Codecov |
- Node.js 24+
- npm
- Chrome or another Chromium-based browser for local testing
git clone git@github.com:vladyslavm-dev/domgeist.git
cd domgeist/frontend
npm install
npm run devWXT starts the extension development workflow.
npm run build:chrome # Chrome unpacked build
npm run zip # Chrome packageBuild output is written to frontend/.output/.
cd frontend
npm run compile
npm run lint
npm run guard:source-quality
npm run audit:architecture
npm run test
npm run test:e2e
npm run test:packageVitest + React Testing Library cover analyzer rules, popup behavior, encrypted history, permission handling, export, scoring, storage, technology detection, and UI flows.
Current local suite: 213 tests.
Playwright runs the built Chrome extension against controlled fixtures and validates scan behavior, history, lock state, export, unsupported pages, rapid open/close cycles, and console cleanliness.
Current E2E suite: 22 tests.
audit:architecturechecks required dependencies, forbidden packages, extension permissions, workflow gates, and forbidden bundle patterns.verify-e2e-manifestschecks production vs E2E manifest permissions and action icons.verify-package-artifactschecks package artifacts for required and forbidden entries.guard:source-qualityblocks tracked TODO/HACK/FIXME/temp comments.
GitHub Actions runs:
- Dependency install.
- ESLint.
- TypeScript compile.
- Source-quality guard.
- Coverage tests.
- Codecov upload.
- Extension build.
- Playwright E2E.
- Architecture audit.
- Package smoke and artifact verification.
DOMgeist source code is copyright (c) 2026 Vladyslav Marchenko and licensed under GPL-3.0-only. See LICENSE.
This repository contains the public DOMgeist 1.0.0 Chrome Web Store release. Future product features may be developed separately.
The DOMgeist name, logo, icon, screenshots, store listing assets, and visual identity are not licensed under the GPL. See BRAND.md.
Vladyslav Marchenko
- GitHub: @vladyslavm-dev
- Website: vladyslavm.dev






