Build B-04

Forge

Every mainstream browser treats local development as a drawer you open and close; Forge makes it part of the furniture.

Status
ITERATING
Year
2026
Domain
Desktop software / Developer tools / Media
Stack
Swift / AppKit / CEF 144 / Chromium / Objective-C++ / Rust (adblock-rust)

Artifact

LayerState
Network filtering (requests cancelled)Working: 205k+ rules from 8 lists
Popup blockingWorking
Cosmetic filtering, domain-specificWorking
Custom per-host rulesWorking: persisted, applied ahead of the engine
YouTube video adsWorking: first-party module
Generic scriptlet rulesNot implemented
Generic cosmetic rules (class/id)Not implemented

Bandwidth and time saved on Forge’s landing page are estimates and are labelled as such. Blocked-request and popup counts are exact.

Forge’s content-blocking layers, as its own README reports them. Stated plainly, including what is not implemented.

Signal chain

  1. 01 · InputWeb content and local dev serversPages, media streams over MediaSource, and whatever is listening on localhost.
  2. 02 · SensingChromium via CEF, DevTools protocolRuntime.evaluate and the Media domain read real values from a tab without renderer-side code.
  3. 03 · Processingadblock-rust over a C ABI, native AppKit shellNetwork and cosmetic filtering, per-host rules applied ahead of the engine, internal pages served over forge://.
  4. 04 · OutputDev servers, request inspector, stats for nerdsDev server auto-reload, every host a page talks to, and the audio and video signal path of whatever is playing.

System architecture

LayerResponsibility
App/SourcesSwift: window, tabs, palette, menus, history, bookmarks, sidebar
native/ForgeCEFObjective-C++ shim over the CEF C++ API
helperSandboxed CEF helper process
rust/forge-adblockC ABI over adblock-rust, static library
App/Resources/webLanding page, settings, history and tools served over forge://

Implementation

Forge is a personal browser for macOS: Chromium underneath through CEF, a native AppKit shell on top. It is not trying to replace Chrome or Brave and has no password manager, sync or extension store. It does a few things no mainstream browser does because no mainstream browser’s users ask for them.

Running localhost services appear on the new tab page with their port and process, and a tab pointed at a dev server reloads itself when the server restarts. Thirteen local utilities (JSON, JWT, Base64, regex and others) run without the network. The request inspector lists every host the active tab has talked to and can block any of them permanently.

The part closest to Listen is stats for nerds. When something plays, it shows the whole audio path: codec and container read from the MediaSource buffer, bitrate measured from appended bytes, the browser’s mix rate, then the real output device with its sample rate and bit depth, and whether macOS is resampling in between.

The division of labour is the honest centre of this project. The Swift and C++ were written by the model. The product decisions, the diagnosis and every catch of the model being confidently wrong came from Hari. Two of those catches are in the iteration log, because they are the reason the numbers in Forge can be trusted.

Measurements

Filter rules
205k+From 8 lists.
Local utilities
13
Size of the codebase
~10klinesAs described in the README.
Main-thread waste removed in 1.1.0
~200formatters/sICU date formatters allocated by a 1.5 s full-state rebuild.

Source: Forge README, release 1.2.0.

Failures and iterations

  1. Blocked-request panel

    Showed ad, tracker and analytics splits derived from invented ratios, presented as measurements.

    Replaced with real per-resource-type counters. Bandwidth and time saved are now labelled as estimates.

  2. YouTube blocking

    “Verified” against a signed-in Premium profile, which proved nothing.

    Re-verified signed-out. Ads are removed by a first-party module at document start.

  3. 1.1.0

    macOS killed the process whenever a sign-in page offered a passkey.

    Declared privacy usage descriptions for every capability handed to web content.

  4. CEF on macOS

    cef_sandbox.a no longer exists in CEF 144, and returning false from DoClose closed the whole window.

    Linked only libcef_dll_wrapper with the sandbox on; tab browsers return true.

Result

A multi-process developer browser in daily use, released publicly under MIT.

Current status

ITERATING

Version 1.2.0 released and in daily use. Phase 2 is stability work, not new features.

Next step

Session restore and crash recovery, then a test harness around the non-UI logic and a forge://diagnostics page.

Credits

Hari
Product decisions, diagnosis, verification
Claude Opus 5
Implementing agent (Swift, Objective-C++, Rust glue)

Links

guest@hari: ~esc to close