Create Native macOS Apps from Web Applications
Three ways to turn any web app into a standalone macOS application — from the built-in Safari web app feature to lightweight Rust-based wrappers with Pake.
Contents
Some web applications deserve their own window. Tools like Excalidraw, Linear, or Notion work better when they are not buried in a sea of browser tabs — they get their own Dock icon, their own Cmd+Tab entry, and they stop competing with the rest of your browsing session for attention.
There are now several solid ways to do this on macOS, ranging from zero-install to fully customized builds.
Option 1: Safari web apps (macOS Sonoma+)
Starting with macOS Sonoma (14.0), Safari can turn any website into a standalone app natively. No tools to install.
- Open the site in Safari (e.g.,
https://excalidraw.com) - Click File > Add to Dock
- Name the app, optionally customize the icon, and click Add
The app appears in your Dock and launches in its own window with a minimal toolbar. It gets its own isolated cookies and storage, separate from Safari.
This is the right answer for most cases. It requires nothing beyond macOS itself, updates automatically, and supports notifications and other web APIs.
Limitations: You cannot customize the window chrome, inject CSS/JS, or set a custom user-agent. The app is essentially a pinned Safari WebView. If you need more control, read on.
Option 2: Pake — lightweight Rust/Tauri wrapper
Pake is an open-source tool that wraps web apps into native desktop applications using Tauri (Rust + system WebView). The resulting binaries are small — typically under 5 MB — because they use the OS-provided WebKit engine instead of bundling Chromium.
Quick start with prebuilt apps
Pake ships prebuilt .dmg files for popular web apps. Check the releases page for apps like ChatGPT, YouTube Music, and others.
Build your own with the CLI
Install the CLI:
npm install -g pake-cli
Create an app:
pake https://excalidraw.com --name Excalidraw --icon /path/to/icon.icns
Common options:
pake https://excalidraw.com \
--name Excalidraw \
--icon /path/to/icon.icns \
--width 1200 \
--height 800 \
--hide-title-bar \
--activation-shortcut "CmdOrCtrl+Shift+E"
The output is a .app bundle you can drop into /Applications.
Why Pake over Nativefier? Nativefier was the go-to tool for this workflow for years, but it was archived in 2023. It bundled a full Electron/Chromium runtime, producing 200+ MB apps. Pake uses the system WebView through Tauri, keeping binaries lean and avoiding the Chromium tax.
Advanced: full Tauri customization
If pake-cli does not give you enough control, you can clone the Pake repo and modify the Tauri configuration directly. This lets you inject custom JS/CSS, configure permissions, and tweak window behavior:
git clone https://github.com/nicedayfor/pake.git
cd pake
# Edit src-tauri/tauri.conf.json to set your URL, window config, etc.
# Edit src-tauri/src/main.rs for custom logic
npm install
npm run build
This requires the Tauri prerequisites (Rust toolchain and Xcode CLT).
Option 3: Chromium-based PWA install
If you use Chrome, Edge, or another Chromium browser, most modern web apps can be installed as PWAs directly:
- Navigate to the web app
- Click the install icon in the address bar (or three-dot menu > Install app)
- The app gets its own window and Dock entry
This works well for apps that ship a web app manifest (most do). The downside is that the app runs inside Chromium, so it consumes more memory than the Safari or Pake approaches.
Which option to pick
| Approach | Binary size | Customization | Dependencies |
|---|---|---|---|
| Safari web app | 0 (system) | Low | None — macOS 14+ |
| Pake / Tauri | ~5 MB | High | Node.js (CLI) or Rust (dev) |
| Chromium PWA | 0 (browser) | Low | Chrome/Edge installed |
For most people, the Safari web app feature is enough. If you want a global shortcut, custom title bar, or JS injection, Pake is the tool. Chromium PWAs sit in between — easy to set up if you already live in Chrome.