build · Oct 2026
Joevix
Solo build: extension, theming engine, layout editor, and release
- TypeScript
- WXT
- Preact
- Manifest V3
- Playwright
Summary
Joevix is a Manifest V3 browser extension for Chrome, Edge, Brave, and Firefox that changes how a page looks and reads without touching the page for anyone else. Themes, custom colors, and per-site layout live in the browser, not on a server.
Problem
Most reading modes make one decision for every site, and most theming extensions ask for broad access up front. A reader who wants a warmer theme on one site, a wider column on another, and no change anywhere else has to trust a permission prompt that grants more than the job needs.
Approach
The extension declares no content scripts and no host permissions at install. A site is enabled one origin at a time, and the content script is registered at runtime. Theming is CSS custom properties applied through a constructed stylesheet, and layout editing writes CSS order, hidden state, and a reading width per site, so no DOM node is moved or rewritten. The content script never touches storage or permissions; typed, Zod-validated messages go through the service worker.
Outcome
Version 1.0.1 ships packaged Chrome and Firefox builds, built-in and custom themes, a contrast matrix, per-site layout editing with a 20-step undo history, import and export, a privacy panel, and a global off switch. The release passes type checking, lint, unit and E2E tests, axe audits, CodeQL, a manifest policy check, and a size budget.
Honest limitations
Layout presets and the spacing half of the reading-width work are not in this build. Firefox is tested by the automated suite rather than by hand, and the Firefox add-on is a temporary build because store publication is out of scope for v1.0. Theme sync between devices and the persistent diagnostic buffer are deferred.
Detail
- No standing access
- The manifest keeps content_scripts and web_accessible_resources empty and requests only storage, activeTab, and scripting, so a site is reachable only after the reader enables it.
- No network code
- ESLint bans fetch, XMLHttpRequest, WebSocket, EventSource, sendBeacon, dynamic Image, eval, and string timers. The end-to-end suite also asserts that the extension issues no request outside the page's own origin.
- Layout without moving nodes
- Reorder and hide are written as CSS order and display rules against adapter container sections. A reset removes one stylesheet and one attribute.
- Release checks
- Package and content-script size budgets, manifest policy checks, SHA-256 checksums, and a rollback document are part of the release script rather than an afterthought.
Gallery

Next project
KerinciLang