Restyle and reskin webpages with a powerful set of developer tools.
Page Proxy is an all-in-one userscript manager and creator with custom GUI tools and an API covering common use cases to convert page interactions to userscripts, making the process more beginner-friendly and less tedious.
- Installation
- Documentation
- There's a help button in the extension which contains known issues and usage tips.
- Back up your scripts often! The extension is still very unstable.
- Tested on Chrome, Brave, Firefox
- Use other Chromium or Firefox-based browsers at your own risk
Click any element on the page to inspect it in the sidepanel. The tool shows the element's tag, id, class, selector path, and bounding box. From there you can:
- Navigate up to the parent element.
- Copy the element's selector as a
ppAPI call or as a plain CSS selector. - Apply a style to the element via a popup.
- Click, copy, cut, paste, or delete the element directly from the panel.
- Follow the DevTools-selected element when the browser DevTools panel is open.
Record a timeline of interactions on the active tab, then convert them to code without writing anything by hand:
- Start recording — the tool captures events as a scrollable timeline.
- Select the events you want (click, drag-select, or select all).
- Open the review popup — your selection is converted to editable code.
- Save the result back to the code editor.
A Monaco-powered editor for
writing and running userscripts. Powered by tools that save to the editor, and
also the pp scripting API.
Scripts import from the pp library, which provides six modules covering usage
patterns commonly found in userscripts:
pa: Page-level helpers: in-page notifications with object viewer, markdown rendering, node movementpn: Network:fetchwrapper with optional response caching and method helpers (get,post, etc.)pq: DOM querying: reusable selector builders, match helpers (innerTextMatches,bboxMatches, etc.), parent traversalps: Style helpers:applyStylefor inline styles,injectCSSfor deduped stylesheet injectionpt: Script-scoped storage:getItem/setItembacked by local storage, scoped per scriptpv: Events: DOM mutation observers, key-combo listeners (onKeyPressed),pressKey,sleep,awaitAnimation
- Layer custom CSS and JavaScript on top of any website without touching its source.
- Selectors tool: view, highlight matches for, and edit all active selectors from a single panel. Selector definitions are parsed directly from editor content and displayed in the tool window for convenience.
- Create tool (currently coming soon): insert new elements into the page from the sidepanel.
- Export tool: export the current script as a Page Proxy script, Tampermonkey userscript, or CSS-only stylesheet from the sidepanel.
View the documentation to learn more.
- Node.js
22+ - Bun
1.3.3+
bun installRun each target in a separate terminal:
bun run web:dev
bun run extension:dev
bun run docs:devUseful local endpoints/outputs:
- Web app:
http://localhost:5173 - Docs site:
http://localhost:3288 - Extension dev output:
extension/.output- Change the browser by setting the
--browserargument inextension/package.json. - Load the build outputs unpacked, either via Chromium-based browsers'
Load unpackedfeature or Firefox'sInstall temporary add-on.- Note: Addons installed via Firefox's
Install temporary add-onwill be deleted after the browser is closed.r
- Note: Addons installed via Firefox's
- Change the browser by setting the
- Hosted PP userscript runtime:
web/static/pp/pp.min.js- Rebuild it with
bun run pp:build-runtime. - This file is deployed with the static web app and used by Tampermonkey
exports via
@require.
- Rebuild it with
bun run web:check
bun run extension:check
bun run web:lint
bun run extension:lintThis project is licensed under the Apache 2.0 License. You must retain attribution when redistributing or modifying this code. This software is provided "as is", without warranty of any kind. Use at your own risk.