Skip to content

Releases: bishosilwal/kestrel-browser

Kestrel 1.2 — tab reordering and a reachable tab strip

Choose a tag to compare

@bishosilwal bishosilwal released this 23 Aug 07:38
  • 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

Choose a tag to compare

@bishosilwal bishosilwal released this 23 Aug 07:29

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=_blank now builds its web view from the configuration
    WebKit supplies, as WebKit requires.
  • The memory readout no longer calls proc_pidpath on 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.app

That 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

Choose a tag to compare

@bishosilwal bishosilwal released this 23 Aug 06:19

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.app

That 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. Only interactionState survives — 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.