Tripwire
A confirmation checkpoint for the risky click on the page you're already on, whether you made it or an AI agent did.
Tripwire
A confirmation checkpoint for the risky click on the page you're already on, whether you made it or an AI agent did.
Date: 2026-08-31
Form factor: Browser extension (Manifest V3)
Browser surface: content script (capture-phase form/click interception on guarded sites), toolbar popup, chrome.storage
Status: Prototype
What it is
Tripwire is a content script that sits between a page's risky buttons and forms and whatever fires them. Turn it on for a site, and anything like "Place Order," "Delete Account," or a plain form submit pauses behind a confirm-or-block overlay before it goes through. It doesn't care whether the trigger was your own click or a script driving the page on your behalf.
Why it has to be an extension
A website can't watch what happens on a different website, and it can't get in front of a DOM event before that page's own handler runs. Tripwire's content script attaches capture-phase listeners for submit and click directly to the document of whatever page it's guarding, so it sees the event before the page does and can hold it there until a person responds. That kind of interception only exists at the browser level.
Who it serves
Anyone who's started letting an AI agent extension click around on their behalf and wants one honest checkpoint before it buys, sends, or deletes something. That's a small but fast-growing group: agentic browsers and browser-embedded copilots are moving from novelty toward daily habit, and the security research on them keeps landing on the same gap — most take autonomous actions without asking first (witness.ai).
Why it could be profitable
Free tier: guard up to three sites, local-only audit log, both sensitivity levels. Paid tier (roughly $4-6/month): unlimited guarded sites, exportable audit history, and a ruleset synced across devices — reasonable asks from someone already running two or three AI browser extensions. There's a slower-moving B2B angle too: team licensing for browser governance is already a named line item in enterprise reports on unmanaged extension risk (Seraphic Security).
The honest caveat: this only pays off if "people who let an AI agent act inside their browser" keeps growing the way it has been. OpenAI shipped a ChatGPT extension for Chrome in July 2026 that reads and summarizes whatever page you're on (Supercharge Browser) — it doesn't take autonomous actions itself yet, OpenAI routes that to Atlas and the desktop app instead. But it's the same on-ramp: more people getting used to an AI assistant living in the toolbar, ahead of the agentic version doing more without asking.
How to load it in Chrome
- Open
chrome://extensionsand turn on Developer mode. - Click Load unpacked and select this folder's
extension/directory. - Visit any site, open the popup, and flip Guard this site on. Submit a form or click a button worded like "delete," "buy," or "send" and watch Tripwire pause it.
How to try the demo
- Open
index.htmlin any modern browser. No server needed — it falls back to an inline data snapshot iffetchis blocked by the browser'sfile://restrictions. - Click the toolbar icon to open the popup, then click Let it finish on the mock checkout to watch a simulated AI agent fill the form and try to submit it. The Delete Account button below it is guarded the same way.
The demo simulates what content.js would do on a real page — the interception logic in script.js stands in for the capture-phase listener, which only runs against a real DOM once the extension is loaded.
Permissions, and why each one
| Permission | Why it's needed |
|---|---|
storage |
Stores the guarded-site list, sensitivity setting, and the local audit log. |
host_permissions: <all_urls> |
The content script has to be available on any site you might choose to guard. It stays dormant on every site until you flip the toggle on for that hostname. |
What's in this prototype
- Content script guard for form submits and risky-keyword button clicks, with a per-site on/off toggle
- Two sensitivity levels: Balanced (forms and buttons) and Strict (also catches matching links)
- A local audit log with today's paused/allowed counts, kept in
chrome.storage.local - Demo harness with a mock checkout page, a simulated AI agent that fills and submits it, and a second guarded delete-account button
Roadmap
- Swap the blanket
<all_urls>content-script match for per-site optional permissions requested only when a user adds a site, in line with Chrome's tightened August 2026 data-minimization rules (Digitbin) - Tell a human click apart from a script-dispatched one (trusted vs. untrusted events) instead of guarding every trigger the same way
- Synced ruleset and audit log export for the paid tier
- Team policy view for the B2B tier
Sources
- AI Browser Agents: 6 Enterprise Security Risks (2026) — names autonomous agent actions without human confirmation as a core risk
- Top 5 Agentic Browsers in 2026: Capabilities and Security Risks — agentic browser landscape and the enterprise governance angle
- OpenAI's New ChatGPT Extension: 3 Things to Know (2026) — ChatGPT Chrome extension launch, July 2026
- Chrome Extensions Face New Data Privacy Rules Starting August 1 — Chrome Web Store's August 2026 data-minimization policy
Requirements
Tripwire — Requirements
Goals
- Give a user a manual confirmation step before a guarded page fires a risky form submit or button click.
- Treat a human-triggered action and a script-triggered action the same way: both get paused if the site is guarded.
- Keep a local, inspectable record of what got paused and what got let through.
- Stay off by default everywhere except the sites a user explicitly turns it on for.
Primary user
Someone who runs one or more AI browser extensions or an agentic browser feature alongside their normal browsing, and wants a checkpoint before that automation can complete a purchase, send a message, or delete something on a site they use for anything that matters (banking, shopping, work tools). They don't need this on every site, just the ones where a wrong click is expensive to undo.
Functional requirements
- FR1: The popup shows the hostname of the active tab and a toggle to guard or unguard that site.
- FR2: Guard state persists per-hostname in
chrome.storage.localand survives a browser restart. - FR3: On a guarded site, the content script intercepts native
submitevents on every form via a capture-phase listener. - FR4: On a guarded site, the content script intercepts
clickevents on buttons, submit inputs, and elements withrole="button"whose visible text oraria-labelmatches a risk-keyword list (buy, purchase, pay, checkout, send, transfer, delete, remove, cancel subscription, deactivate, close account, and similar). - FR5: In Strict sensitivity, the same keyword match also applies to anchor (
<a>) clicks; in Balanced sensitivity, links are not intercepted. - FR6: An intercepted action shows an in-page overlay naming the action and offering Allow or Block.
- FR7: Choosing Allow re-fires the original action (form submission or element click) without re-triggering the interceptor.
- FR8: Choosing Block discards the action; nothing happens on the page.
- FR9: Every intercepted action, allowed or blocked, is appended to an audit log entry with site, action label, kind, verdict, trigger, and timestamp.
- FR10: The popup lists the most recent audit log entries and today's paused/allowed counts.
- FR11: The popup lets a user switch sensitivity between Balanced and Strict; the setting applies globally, not per-site.
- FR12: The content script re-reads guard and sensitivity state on
chrome.storage.onChangedso a toggle takes effect without a page reload. - FR13: The extension declares no permission it does not use in
content.jsorpopup.js. - FR14: The demo harness reproduces the popup UI and the pause/allow/block flow without any
chrome.*API, using the same markup,popup.css, andpopup.js. - FR15: The demo runs from a direct
file://open with no local server, falling back to an inline JSON snapshot iffetchis blocked.
User stories
- As someone who just installed an AI shopping assistant extension, I want checkout pages to pause before the assistant submits an order, so that I get a last look before money moves.
- As someone testing an agentic browser feature for the first time, I want to see exactly which of my clicks or its clicks got paused, so that I can tell how often it's trying to act without me noticing.
- As a user who trusts a specific site completely, I want to leave it unguarded, so that Tripwire doesn't get in my way there.
- As a user, I want a Strict mode for my banking site specifically, so that even a "Confirm" link gets a checkpoint, not just buttons and forms.
- As a user, I want to see today's paused-vs-allowed count at a glance, so that I know whether Tripwire is actually catching anything on my normal browsing.
- As a user evaluating whether to pay, I want to hit the three-site limit on the free tier before I decide it's worth $5/month, so that the upgrade makes sense to me rather than being forced early.
Extension surfaces
- Content script — capture-phase interception of
submitandclickon guarded sites; renders the confirm/block overlay; reads and writeschrome.storage.local - Toolbar popup — per-site guard toggle, sensitivity switch, today's stats, recent audit log
chrome.storage— persists guarded sites, sensitivity, and the audit log shared between the content script and the popup
Non-functional requirements
- No guarded-site data or audit log ever leaves the device; everything lives in
chrome.storage.local. - The content script does nothing measurable on an unguarded site beyond two passive document-level listeners.
- The overlay renders inside a dedicated host element and does not rely on the host page's CSS, so it can't be visually broken by the page it's guarding.
- Audit log is capped at 50 entries to keep
chrome.storage.localreads fast and bounded. - Popup interactions (toggle, sensitivity switch) reflect in the UI in under 100ms on a typical machine.
Out of scope (for the prototype)
- Distinguishing a genuine user click from a script-dispatched click via the Event.isTrusted flag (see Roadmap in README)
- Per-site optional permissions instead of the blanket
<all_urls>content-script match - Any paid tier functionality (sync, export, team policy) — the prototype is the free-tier feature set only
- A configurable, user-editable risk-keyword list (currently fixed in code)
Open questions
- Should the risk-keyword list be per-language, or is an English-only list an acceptable v1 limitation?
- Does re-dispatching a blocked form's submit on Allow ever conflict with a page's own JS-driven submit handler (e.g., one that does client-side validation before calling
form.submit())? - Is a global sensitivity setting sufficient, or do users want per-site sensitivity once they're guarding more than one kind of site?