Pake wraps a website in its own desktop window. Give it a URL and a name and it builds a native app for macOS, Windows or Linux, with its own dock or taskbar icon, keyboard shortcuts for back, forward and zoom, and a window that remembers you. Because it is built on Rust and Tauri, which use the system's own web view instead of shipping a browser, the result is usually under 10 MB rather than the 100 MB-plus of an Electron wrapper.
It earns its place by being the easiest way to give a web tool you live in, such as ChatGPT, Notion, Excalidraw or YouTube Music, a home outside your browser tabs. The releases page has ready-made builds of popular sites, the pake-cli package builds anything else, and there is a GitHub Actions route for people who would rather not install a toolchain.
The limit is that the app is still the website. It needs the site to be online, logins happen inside the web view, and how well a site behaves depends on that site. The first local build also downloads the Rust toolchain and takes a while.
- Repository: github.com/tw93/Pake
- Licence: GPL-3.0 (GNU General Public License v3.0)
- Language: Rust. Stars: 62.3K. Forks: 12.8K. Last push: Oct 26, 2026.
- Scan: safe, Oct 26, 2026, commit a44f328
Who it is for
Anyone who keeps the same few web apps open all day and wants them as separate windows, and developers who want to ship a local web build as a lightweight desktop app.
Getting started
1. Install the CLI (needs Node; the first build sets up Rust)
pnpm install -g pake-cli2. Package a website, fetching its icon automatically
pake https://github.com --name GitHub3. Or set the window size and hide the title bar
pake https://weekly.tw93.fun --name Weekly --width 1200 --height 800 --hide-title-barNo build tools? The README's Popular Packages table links prebuilt apps for ChatGPT, Gemini, Notion, YouTube and others on the releases page.
Safety scan
We cloned tw93/Pake at commit a44f328 on Oct 26, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No secrets, no pattern hits, no committed binaries and no bare-IP URLs across about 39,000 lines of Rust and TypeScript.
- The odd hostnames in the network list (evil.com, victim.example, a crypto exchange's site) come from tests/unit/event-link-guard.test.js, which checks how the app handles links and downloads on real-world pages.
- The one build hook is src-tauri/build.rs, the standard Tauri build step. There are no npm install scripts.
- 46 known advisories in total. The one critical is Vitest, the test runner, which never ships in a built app; the Rust side (src-tauri/Cargo.lock) has 6 high and 19 unrated, mostly in the Tauri dependency tree.
- Six workflows, none using pull_request_target, and all 17 third-party actions pinned to a commit. Contributing guide and code of conduct present; no security policy, Dependabot or CodeQL.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | None found. |
| Install-time code | 1 Cargo build script |
| Committed binaries | None. |
| CI workflows | 6 workflows. None use pull_request_target. 0 of 17 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often github.com, outside.example, mail.example.com, accounts.google.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 65 advisories across 867 pinned packages: 1 critical, 19 high, 18 moderate, 8 low, 19 unrated. pnpm-lock.yaml: 300 packages, 30 advisories; src-tauri/Cargo.lock: 567 packages, 35 advisories. |
| Project hygiene | Has licence file, contributing guide. Missing security policy, automated dependency updates, CodeQL. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Worst known vulnerabilities (24 of 65)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-5xrq-8626-4rwp | critical | vitest@4.0.18 | When Vitest UI server is listening, arbitrary file can be read and executed |
| GHSA-28wg-ghj8-5hjv | high | nanoid@3.3.11 | nanoid: non-secure generators can loop indefinitely with negative size |
| GHSA-2v37-7h3g-55p8 | high | nanoid@3.3.11 | nanoid: custom generators can loop indefinitely when size is zero |
| GHSA-xwg4-73v4-xw9w | high | nanoid@3.3.11 | nanoid: Integer Overflow or Wraparound |
| GHSA-c2c7-rcm5-vvqj | high | picomatch@2.3.1 | Picomatch has a ReDoS vulnerability via extglob quantifiers |
| GHSA-c2c7-rcm5-vvqj | high | picomatch@4.0.3 | Picomatch has a ReDoS vulnerability via extglob quantifiers |
| GHSA-6g55-p6wh-862q | high | postcss@8.5.6 | PostCSS: Arbitrary file read and information disclosure via attacker-controlled sourceMappingURL in CSS comments |
| GHSA-r28c-9q8g-f849 | high | postcss@8.5.6 | PostCSS: Path Traversal in Previous Source Map Auto-Loading (sourceMappingURL) leads to Arbitrary .map File Disclosure |
| GHSA-5c6j-r48x-rmvq | high | serialize-javascript@6.0.2 | Serialize JavaScript is Vulnerable to RCE via RegExp.flags and Date.prototype.toISOString() |
| GHSA-68fv-2mgg-jv7q | high | source-map-js@1.2.1 | source-map-js allows event-loop denial of service through indexed source-map section offsets |
| GHSA-587h-7wmj-h5pm | high | vite@7.3.1 | launch-editor: `fs.existsSync()` existence check can be bypassed on Windows |
| GHSA-fx2h-pf6j-xcff | high | vite@7.3.1 | vite: `server.fs.deny` bypass on Windows alternate paths |
| GHSA-p9ff-h696-f583 | high | vite@7.3.1 | Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket |
| GHSA-v2wj-q39q-566r | high | vite@7.3.1 | Vite: `server.fs.deny` bypassed with queries |
| RUSTSEC-2026-0194 | high | quick-xml@0.37.5 | Quadratic run time when checking a start tag for duplicate attribute names |
| RUSTSEC-2026-0195 | high | quick-xml@0.37.5 | Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service |
| RUSTSEC-2026-0194 | high | quick-xml@0.38.4 | Quadratic run time when checking a start tag for duplicate attribute names |
| RUSTSEC-2026-0195 | high | quick-xml@0.38.4 | Unbounded namespace-declaration allocation in `NsReader` enables memory-exhaustion denial of service |
| GHSA-3g6h-r5qx-f6hq | high | quinn-proto@0.11.15 | Peer minimum ACK delay can panic quinn-proto when ACK_FREQUENCY transmission is enabled |
| GHSA-qfwj-vfxf-92j2 | high | quinn-proto@0.11.15 | Stream reassembly memory-exhaustion guard in quinn-proto can be bypassed |
| GHSA-82fw-gwwq-j7x9 | moderate | @vitest/mocker@4.0.18 | Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock |
| GHSA-qxg6-89mg-rqv8 | moderate | @vitest/mocker@4.0.18 | Vitest: Code injection via unauthenticated manual mock registration |
| GHSA-3v7f-55p6-f55p | moderate | picomatch@2.3.1 | Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching |
| GHSA-3v7f-55p6-f55p | moderate | picomatch@4.0.3 | Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Matching |
By the numbers
| Stars | 62.3K |
|---|---|
| Forks | 12.8K |
| Contributors | 99 |
| Commits | 2,509 |
| Open issues | 1 |
| Open pull requests | 2 |
| Releases | 57 |
| Latest release | V3.17.6 |
| Licence | GPL-3.0 |
| Main language | Rust |
| Project age | 4 years |
| Last push | Oct 26, 2026 |
| Tracked files | 333 |
| Lines of code | 39.1K |
| Checkout size | 19 MB |
Lines by language: JavaScript 11.6K, TypeScript 11.2K, Rust 6,519, Markdown 6,504, YAML 1,884, JSON 1,247.
Questions
Is Pake free?
Yes. Pake is GPL-3.0, and a separate licence exception says the apps it produces are not themselves bound by the GPL, so you can distribute a packaged app under your own terms.
How is Pake different from Nativefier or an Electron app?
Pake uses Tauri, which renders with the operating system's own web view instead of bundling Chromium. That makes the apps much smaller and lighter on memory; the trade-off is that rendering follows the system browser engine, so a site can look slightly different on each platform.
Does Pake work offline?
Only as far as the website itself does. Pake gives the site a window and shortcuts; the content still loads from the web.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
