In development · February 1, 2026
Futz
Native macOS browser built on WebKit — four tab placements, twelve live-updating customizations, and one-click import from any Chromium browser.
Futz is a personal macOS browser I designed and built from scratch because I wanted a daily driver that felt like a first-party Apple app instead of another Chrome clone or Electron wrapper. It's a native app — Swift, SwiftUI, and WKWebView — so page rendering is identical to Safari while every pixel of chrome was written for how I actually browse. Twelve customization controls update live with no restart: sidebar width, tab row height, animation intensity, sidebar material, content corner radius, UI font scale, and more.
The architecture is content-first by design. Nav controls, address bar, and tabs live in a minimal sidebar — left, right, collapsed into a horizontal top bar, or hidden entirely depending on the mood of the day. A ⌘K command palette searches open tabs, bookmarks, and history in one pass, and the full keyboard shortcut set (⌘T, ⌘W, ⌘L, ⌘1–9, ⌘[ ⌘], ⌘F) covers 95% of navigation without touching the mouse. The content area is just the web page, clipped to a rounded rectangle with a hairline border. No noise.
Under the hood it's roughly 30 Swift files in a clean MVVM layout. Each tab owns its own WKWebView and navigation delegate for its full lifetime, so scroll position, JS state, and back/forward history survive tab switches for free. KVO on the web view drives @Published properties that SwiftUI reads from, and session state — which tabs are open, which is selected, pinned order, sidebar visibility — persists to JSON in Application Support.
I wrote a Chromium importer from scratch that parses the standard Bookmarks JSON and reads History via the SQLite3 C API, so transferring from Dia, Chrome, Arc, Brave, Edge, or Vivaldi takes one folder pick. Passwords get a deliberate no — they're encrypted with a macOS Keychain key Futz has no business decrypting, so iCloud Keychain handles autofill the same way it does in Safari.
Next up: reader mode via an injected Readability.js bundle, a proper downloads panel with WKDownloadDelegate, and spaces — separate WKWebsiteDataStores per space so work, school, and personal browsing don't share cookies or storage.