DEV Community

Kylmora
Kylmora

Posted on

I built a native macOS browser with no dependencies - my first open source project

I've been using Arc, then Zen, then back to Safari, and I kept running into the same thing: either the browser was fast and rigid, or it was flexible and ate my RAM. So over the last few months I built the one I wanted, and last week I put it on GitHub.

It's called Kylmora. It's an AppKit app over the system WebKit — the same engine Safari uses — with one window and Spaces inside it. No bundled Chromium, no Swift package dependencies, nothing but Apple's own frameworks.

This is my first open source project, so please be gentle with it. If something is broken or missing, tell me and I'll fix it as fast as I can.

Why no bundled engine

Every Electron or Chromium-based browser ships a copy of the web. That's where the hundreds of megabytes come from, and it's why they're slow to launch.

macOS already has WebKit in it. If you build on WKWebView, you get the engine for free, you get Apple's security updates for free, and your app is just the shell around it. The whole of Kylmora is a few hundred Swift files.

Here's what that costs, measured with 35 tabs restored and one page showing:

Metric Value
Release bundle 5.2 MB
Window on screen 0.62 s warm, 0.97 s cold
Browser process at the window 38 MB
WebKit content process, one page ~200 MB — that's the page's, not mine

The trade is real and I want to be honest about it: you get Safari's engine, which means Safari's web compatibility and Safari's quirks. If a site only works in Chrome, it will only work in Chrome here too. I decided that was worth 5 MB.

Spaces are identities, not just tab groups

This is the part I actually built the browser for. Each Space has its own cookie jar, so the same site can be signed in as a different account in each one. Work Gmail in one, personal in another, a client's dashboard in a third — no profile switching, no separate windows.

Each Space gets its own look (light/dark, colour or gradient, a rim around the window) so a glance at any corner of the screen tells you which identity is in front. And Space Routing rules send matching addresses to the right Space, so a link from Slack lands where it belongs.

Tabs that aren't there until you look at them

A tab you haven't shown has no web view and no WebKit process behind it. Twenty-five restored tabs cost one content process, because twenty-four of them are still just a row in the sidebar with a title and a URL.

Background tabs sleep after an idle period and under memory pressure, then come back where they were — scroll position, form contents, history.

A few other things that are in there

  • Boosts — your own CSS and JS per site, plus a universal dark mode
  • Split view — side by side, stacked, or 2×2
  • Live folders — a folder that fills itself from an RSS feed or a GitHub repo's issues and PRs
  • Command palette (⌘K) that ranks tabs, Spaces, history, bookmarks and commands together
  • Translation on Apple's on-device model — the text never leaves the Mac
  • Extensions on WebKit's own engine, which reads the Chrome/Firefox manifest format
  • Content blocking on WebKit content rule lists, fed by EasyList and uBlock Origin's filters
  • Passwords in the macOS login Keychain, the same store Safari uses, so iCloud Keychain just works

What's deliberately not in it

No AI. No assistant, no summariser, no chat sidebar. Nothing about you or your Mac is sent anywhere. The update check asks for a JSON file once a day and that's the only request the app makes on its own.

Also: nothing in the UI is a mock. If a control is there, it does something. Where a feature genuinely can't work on macOS, it says so instead of pretending.

Please break it

It's Apache-2.0, macOS 14+, and there's a signed, notarized .dmg on the releases page.

I'm one person and this is my first open source project, so I'm sure there's plenty I've got wrong. If you hit a bug, open an issue and I'll try to have it fixed within a day or two. Same for features — if there's something your current browser does that you'd miss, tell me and I'll look at whether it fits. A lot of what's already in there came from people describing what they wanted somewhere in a thread.

Thanks for reading. Any feedback at all is genuinely welcome.

Top comments (0)