Releases: bishosilwal/kestrel-browser
Release list
Kestrel 1.2 — tab reordering and a reachable tab strip
- Drag a tab to reorder it.
- Fixed: with more than about 26 tabs, the last tabs and the
+button were pushed past the window edge and could not be clicked. Tabs now always divide the available width. ⌘.stops a load;⌘⌥←/⌘⌥→switch tabs alongside^⇥.
Install: unzip, drag to /Applications, then xattr -dr com.apple.quarantine /Applications/Kestrel.app (required — ad-hoc signed, not notarized). Apple Silicon, macOS 13+.
Full comparison against Chrome and reproduction steps: https://github.com/bishosilwal/kestrel-browser
Kestrel 1.1 — UI polish + Chrome comparison
Measured against Chrome 151 on an M1 / 8 GB / macOS 26.5, same five pages, same order:
| Kestrel | Chrome 151 | ||
|---|---|---|---|
| Memory — 5 tabs loaded | 701 MB | 1.93 GB | 2.8x less |
| Memory — same 5 tabs after idling | 236 MB | 1.91 GB | 8.3x less |
| Memory — idle, one empty tab | 28 MB | 403 MB | 14.2x less |
| Processes for those 5 tabs | 8 | 47 | 5.9x fewer |
| CPU while idling on those 5 tabs | 0.04% of a core | 0.11% of a core | 3.1x less |
| Cold launch to a window | 0.34 s | 0.41 s | 1.2x faster |
| App on disk | 904 KB | 2.0 GB | ~2,400x smaller |
Chrome ran on a throwaway profile with no extensions, which makes it lighter than
a typical real-world Chrome — the comparison is deliberately generous to it. Reproduce
it yourself with ./tools/bench.sh; the README table is generated from the raw data.
UI and UX
- Toolbar icons were being drawn at the default thin weight in secondary grey, which
read as disabled. They are now semibold in full contrast, with a rounded hover
highlight, and dim only when genuinely unavailable. - The address bar is a proper capsule with a security glyph (lock, warning or search)
and an accent border when focused. Escape reverts what you typed. - Native vibrant toolbar background with a hairline above the page.
- The memory readout is a soft capsule rather than loose grey text.
- Right-click a tab for reload, duplicate, copy address, put to sleep, close, and
close others. Double-click empty tab-strip space for a new tab. - ⌘⇧T reopens the tab you just closed.
- Opening several links at once now focuses the first, like Safari and Chrome, rather
than whichever was last in the list.
Fixes
- Clicking a link while Kestrel was closed could open two windows.
window.open/target=_blanknow builds its web view from the configuration
WebKit supplies, as WebKit requires.- The memory readout no longer calls
proc_pidpathon every process on the machine
on every tick.
Install
Download Kestrel.zip, unzip, drag to /Applications, then:
xattr -dr com.apple.quarantine /Applications/Kestrel.app
open /Applications/Kestrel.appThat step is required: Kestrel is ad-hoc signed and not notarized, so macOS
quarantines it as an internet download and claims it is damaged. Apple Silicon,
macOS 13+.
Kestrel 1.0
A minimal macOS browser that renders with the WebKit already in macOS instead of
bundling its own engine. 840 KB app, no dependencies, no background services.
Install
Download Kestrel.zip, unzip, drag Kestrel.app to /Applications, then:
xattr -dr com.apple.quarantine /Applications/Kestrel.app
open /Applications/Kestrel.appThat step is required. Kestrel is ad-hoc signed and not notarized by Apple, so
macOS quarantines it as an internet download and reports "Kestrel is damaged" or
"Apple could not verify...". That is Gatekeeper, not a broken build — notarizing
needs a paid Apple Developer account. You can also right-click the app → Open.
Requires Apple Silicon (arm64) and macOS 13 or later. Building from source avoids
the quarantine step entirely: ./build.sh /Applications.
What makes it light
- Tabs that really sleep. A background tab idle for 5 minutes has its WebKit
content process destroyed, not throttled. OnlyinteractionStatesurvives — a
blob under 10 KB holding the full back/forward list and scroll position — so the
tab reopens exactly where you left it. Chrome and Safari only throttle timers;
the 50–300 MB per tab stays resident. Sleeping also fires immediately when macOS
reports memory pressure. - Ad and tracker blocking in the network layer. 214 domains compiled into a
WebKit bytecode program that runs inside the networking process, so blocked
requests never reach a renderer. No JS, no per-request callback, nothing to run
per page — cheaper and stronger than an extension. - A new tab allocates nothing. The new-tab page is AppKit, not HTML. Session
restore is lazy too: a 20-tab window comes back with one live renderer. - No autoplay, which removes most background CPU and video decode memory.
Measured on an M1 / 8 GB / macOS 26.5
| footprint | |
|---|---|
| Running, one new tab (no renderer at all) | 25 MB |
| 5 tabs, all awake (theverge.com alone is 318 MB) | 530 MB |
| Same 5 tabs, 4 asleep | 385 MB |
| …of which browser + 4 sleeping tabs | 59 MB |
Heavy sites cost what they cost — that is the page, not the browser. The win is
that you only pay for the tab you are looking at. Compare it against your own
browser with ./tools/kmem, which reports the same phys_footprint Activity
Monitor shows.
Known limits
- Not a new engine — site compatibility is Safari's. The rare Chrome-only site
will not work. - No extension support; ad blocking is built in, nothing else is available.
- Multi-window sessions restore only the last window closed.
- Apple Silicon only in this build.