A network-wide HTTPS proxy that blocks ads at the HTTP layer. Adblock Plus and uBlock Origin filter syntax, scriptlet injection, cosmetic filtering, and per-user passkey authentication. Goes where DNS blockers can't.
Browser extensions are being weakened. DNS blockers leave gaps. There's a better layer to fight at.
Browsers were supposed to be "user-agents" that work for you. Manifest V3 restricts ad-blocking extensions, making them less effective by design. Your browser's incentives aren't aligned with yours.
Pi-hole and AdGuard Home block entire hostnames -- but same-origin ads, tracking scripts on CDN paths, and anti-adblock scripts all slip through. You can't block /ads/banner.js at the DNS level.
Everything you need to take back control of your browsing experience across every device on your network.
Subscribe to EasyList, EasyPrivacy, uBlock Filters, and other community blocklists. Supports Adblock Plus syntax and uBlock Origin extensions — $redirect, $removeparam, $csp, regex patterns, and more.
Block specific paths like /ads/tracker.js while allowing legitimate content from the same domain. Impossible with DNS blockers.
CSS element hiding, scriptlet injection (##+js()), and blocked resource stripping. 11 scriptlets neutralize anti-adblock scripts and tracking.
Press Alt+Shift+B on any proxied page to visually select and block elements. Point, click, done.
No usernames or passwords. Each user authenticates with WebAuthn passkeys and gets their own rules and subscriptions, layered on top of server-wide blocklists.
Deploy on a VLAN with firewall rules to intercept all traffic automatically. A captive portal guides new devices through CA certificate setup.
Devices that can't install a CA cert — smart TVs, game consoles, IoT — get host-level ad blocking via a built-in DNS resolver that null-routes blocked domains. Same blocklists, same per-user rules.
Setup wizard, activity feed, subscription management. All accessible through the proxy's built-in web portal.
Full MITM proxy for browsers, transparent interception for managed networks, or DNS-level blocking for everything else.
Different layers, different strengths. They work best together.
| Capability | ublproxy | DNS blockers |
|---|---|---|
| URL-path blocking | Yes | No — hostname only |
| Cosmetic filtering (hide elements) | Yes — CSS injection | No — leaves placeholders |
| Adblock filter syntax | ABP + uBO extensions | Domain lists only |
| Anti-adblock resilience | Content-level modification | Easily detected |
| Per-user rules | Passkey auth | No — network-wide only |
| Setup complexity | CA cert + proxy config | Change DNS server |
| Devices without CA support | Built-in DNS resolver | Native |
| Non-HTTP protocols | HTTP/HTTPS only | All protocols |
| Resource usage | Higher — TLS decrypt/re-encrypt | Minimal |
These approaches aren't mutually exclusive. A DNS blocker handles the bulk of known ad domains cheaply, while ublproxy handles the cases DNS blocking can't reach. ublproxy's built-in DNS resolver (--dns-port) covers devices that can't install a CA cert.
ublproxy decrypts your traffic to block ads. That power comes with responsibilities and limitations.
All HTTPS traffic is decrypted, inspected, and re-encrypted. That's the point — but it means you should only run this on a network you control. Self-hosted, not cloud.
Banking apps, security tools, and some system services use certificate pinning and will reject MITM certs. The proxy detects this automatically and switches to passthrough. You can also add manual rules (@@||domain^).
iOS and Android don't support HTTPS proxy connections. Mobile devices use HTTP CONNECT on port 8080 — the target hostname is visible on your LAN, though the tunneled content stays TLS-encrypted.
Single binary, no external dependencies, pure Go. Docker or download -- your choice.