VulpineOS
Docs
Runtime
Runtime overview
Hardened browser, orchestrator, MCP
Injection filter
Strip invisible DOM before the agent
Action lock
Freeze JS, timers, reflows mid-think
Optimised DOM
93.1% measured token reduction
Operator surfaces
Web panel
Embedded operator console
TUI workbench
SSH-friendly terminal UI
MCP toolbelt
36 typed browser tools
Vulpine-Box
One-container self-host
Ecosystem
Foxbridge
CDP ↔ Juggler / WebDriver BiDi
vulpine-mark
Set-of-Mark visual labelling
mobilebridge
Android device sessions
OpenClaw
Pre-configured agent loop
Documentation
Quickstart
First agent in 30 seconds
Architecture
Four-phase security model
MCP Reference
All 36 browser tools
Agent Scripting DSL
Declarative agent definitions
Open source
VulpineOS Runtime
GitHub, MPL 2.0
Foxbridge
CDP ↔ Juggler / WebDriver BiDi
vulpine-mark
Set-of-Mark visual labelling
mobilebridge
Android device discovery + sessions
Integrations
OpenClaw
Pre-configured agent loop
Camoufox
Anti-detect browser core
LLM providers
30+ models, one toolbelt
Docker (Vulpine-Box)
One-click self-host
Guides
AI Agent Security
Threat model, mitigations
Prevent Prompt Injection
Hidden DOM, ARIA tricks
OpenClaw + Camoufox
End-to-end setup
Camoufox vs Chrome
Why Firefox, why patches
Engineering
Changelog
Release notes as work lands
Roadmap
Now, next, later, research
Blog
Long-form posts on the runtime
RenderLab
Optional render-diagnostics study
Community
Support
How to get help, fast
GitHub Discussions
Ideas, RFCs, support
Contributing
How to help
Security
Responsible disclosure
Star on GitHub →
Product · Injection filter

Strip the attack surface before the agent sees it.

Indirect prompt injection works by hiding instructions in DOM nodes that the user can't see. We strip those nodes from the accessibility tree at the browser layer — before the snapshot ever reaches the model.

Default onPer-session prefBrowser-layer defence
01

What it filters

On every Page.getFullAXTree call, the content-process filter walks the tree and removes nodes that match any of seven visibility checks, ordered by cost so common cases short-circuit first.

01

aria-hidden="true"

Explicit author intent. First check, cheapest.

02

display: none

Computed style. Removes whole subtrees from layout.

03

visibility: hidden

Element exists but is not painted.

04

opacity: 0

Common injection vector — invisible but layout-active.

05

Zero-dimension overflow

Bounding rect is collapsed and overflow is clipped.

06

Off-screen by 500px+

Positioned far outside viewport, the classic trick.

07

clip-path: inset(100%)

Modern equivalent of clip: rect(0,0,0,0).

02

Where it runs

The filter lives in additions/juggler/content/PageAgent.js, which runs with chrome privilege in the Camoufox content process. It is controlled by the vulpineos.injection_filter.enabled pref — default on. The telemetry service emits an injectionAttemptDetected event whenever a node is removed, so you can audit attempts after a run.

03

Resources

  • Architecture deep-dive

    docs.vulpineos.com/architecture — every patch, where it lives, and why.

  • VulpineOS source

    github.com/VulpineOS/VulpineOS — runtime, patches, additions.

Self-host the runtime today.

Pull the source, build the binary, and drive your first agent. The waitlist gates the managed runtime; the open-source path is open now.

Read the docs→Star on GitHub
VulpineOS

The browser built for AI agents.
Open-source runtime, end to end.

Camoufox 146.0.1
Product
RuntimeAction lockOptimised DOMMCP toolbeltVulpine-Box
Ecosystem
Foxbridgevulpine-markmobilebridgeOpenClawCamoufox
Resources
Resources hubRoadmapChangelogBlogDocs
Community
SupportDiscussionsContributingIssuesSecurity
© 2026 VulpineOSBuilt on Camoufox · Firefox 146.0.1TermsPrivacyCookiesAcceptable useSecurity