pake
Package a website or local web build as a desktop app with Pake. Use for packaging, CLI options, icons, bundle identifiers, or WebView proxy setup. Not for unrelated Tauri development or uninstalling apps.
来源信息
- 仓库
- tw93/Pake
- 最近来源活动
- 2026年10月7日 00:43
- 检测到的 SKILL.md 语言
- 英语
- 星标
- 61,999
- 分支
- 12,762
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- pake
- description
- Package a website or local web build as a desktop app with Pake. Use for packaging, CLI options, icons, bundle identifiers, or WebView proxy setup. Not for unrelated Tauri development or uninstalling apps.
- version
- 2.0.0
- allowed-tools
- ["Bash","Read"]
# Pake - Website to Desktop App
Pake wraps any webpage or local web build into a native desktop app via Tauri (Rust + system WebView). Output is ~5MB (vs Electron's ~150MB).
## Pick the right command first
- **Inside a Pake repository checkout** (package.json has `"name": "pake-cli"`): build once with `pnpm run cli:build`, then use `node dist/cli.js`.
- **Anywhere else**: use the published CLI. Install with `npm install -g pake-cli` and run `pake`, or run without installing via `npx pake-cli`.
All examples below use `pake`; substitute `node dist/cli.js` inside a checkout.
## Agent Mode (always use this from scripts)
Pass `--json` on every automated run: logs move to stderr and stdout carries exactly one JSON result object.
```bash
pake "https://example.com" --name MyApp --json
# stdout -> {"ok":true,"name":"MyApp","platform":"darwin","arch":"arm64",
# "outputs":[{"path":"/abs/MyApp.dmg","sizeBytes":5242880,"format":"dmg"}],
# "warnings":[],"error":null}
```
`--json` (and any non-TTY stdin) disables every interactive prompt.
### Handle results by code, not by scraping text
Exit codes: `0` success, `2` invalid input, `3` build failure, `4` missing environment or dependency setup failure, `1` unexpected. On failure `error` carries `{code, message, hint}`:
| `error.code` | What to do |
| --------------- | ----------------------------------------------------------------------------------------------- |
| `INVALID_INPUT` | Fix the flag, name, or config field named in `message`; `hint` states the accepted form |
| `ENV_MISSING` | Environment setup needed (usually Rust); relay `hint` to the user, or install and rerun |
| `BUILD_FAILED` | Rerun once with `--debug` for verbose logs; check platform notes below before changing anything |
| `NETWORK` | Reserved, not emitted today; network failures arrive as `ENV_MISSING` or `BUILD_FAILED` instead |
| `UNEXPECTED` | Report the message upstream; do not loop on retries |
On success, report `outputs[].path` to the user; that is the installer/bundle they need. On Linux multi-target builds, `ok: true` can carry fewer outputs than requested formats (failed targets land in `warnings`); check `outputs[].format` before declaring all formats built.
## Declarative config (preferred over long flag lists)
```bash
cat > app.json <<'EOF'
{
"$schema": "https://raw.githubusercontent.com/tw93/Pake/main/schema/pake.schema.json",
"url": "https://example.com",
"name": "MyApp",
"width": 1280,
"hideTitleBar": true
}
EOF
pake --config app.json --json
```
Fields are the camelCase CLI option names plus `url`; an explicit CLI flag wins over a config field. Unknown fields and wrong types fail fast with `INVALID_INPUT`.
For the full option list, run `pake --help` or read the schema above. Do not guess option names; the schema is the source of truth. Complete reference: https://github.com/tw93/Pake/blob/main/docs/cli-usage.md
## Local content (AI-generated apps)
Pake packages local web artifacts, not just URLs:
```bash
# A directory of static files (must contain index.html at its root)
pake ./dist --name MyTool --json
# A single HTML file
pake ./page.html --name MyPage --json
```
Hash-based routing works out of the box; history-mode SPA routing is not yet supported for local packaging.
## Workflow
### 1. Gather requirements
Use the supplied requirements and existing defaults; ask only for missing inputs that would materially change the build:
| Parameter | Why it matters |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| URL or local path | The target website or build output |
| Name | Becomes the `.app` / `.exe` name and productName |
| Bundle ID (`--identifier`) | Defaults to `com.pake.a{md5hash}`; set explicitly for clean installs (e.g. `com.pake.youtube`) |
| Proxy (`--proxy-url`) | Baked into the binary at build time; not runtime-configurable. Format: `http://host:port` or `socks5://host:port` |
| Icon | Auto-fetched from website if omitted; can be a local path or URL |
### 2. Handle icons
Pake auto-fetches icons from multiple services (logo.dev, brandfetch, clearbit, Google favicons, direct favicon.ico). However:
**The icon download does NOT use `--proxy-url`.** That flag only configures the packaged app's WebView proxy. If the icon URL requires a proxy to reach (e.g. Google/GitHub assets from China), download it manually first:
```bash
curl -x http://<proxy-host>:<proxy-port> -o /tmp/icon.png "<icon-url>" --connect-timeout 15 -s
pake "<URL>" --icon /tmp/icon.png --json
```
Icon tips:
- Prefer 256x256 or larger PNGs; SVG also works
- Pake auto-converts to platform format: `.icns` (macOS), `.ico` (Windows), `.png` (Linux)
- macOS icons get a squircle mask automatically
- Inside a repo checkout, an old `src-tauri/icons/<name>.icns` is reused; rename or remove it to force re-fetch
### 3. Build and verify
Build takes ~40s with cache, ~2min cold; the very first build on a fresh machine compiles Tauri dependencies and can take 10+ minutes. After a successful build:
- Report the artifact path from `outputs[].path`
- Ask the user to open the app and check the icon
- Bundle ID check: `mdls -name kMDItemCFBundleIdentifier <path-to>.app` (macOS)
## Platform notes
### Proxy support
| Platform | Status | Notes |
| -------- | --------- | -------------------------------------------------------------------- |
| Windows | Full | Via `--proxy-server` browser arg |
| Linux | Full | Via Tauri native `proxy_url` |
| macOS | macOS 14+ | Uses Tauri native `macos-proxy` feature; auto-detected at build time |
### Chrome extensions
Not supported. Pake uses the system WebView (WKWebView on macOS, WebView2 on Windows, WebKitGTK on Linux), not a full Chrome browser. Use `--inject` to add custom JS/CSS as an alternative.
### OAuth-dependent sites
`--new-window` allows popup auth windows and `--safe-domain` keeps SSO callbacks in-app, but some providers (especially Google) block sign-in inside embedded webviews regardless of flags. Warn the user before promising OAuth support.
### Linux Wayland input issues
If an AppImage opens but clicks or keyboard input do not reach the page on a pure Wayland compositor (especially niri), first rebuild with the latest `pake-cli`, then try the native WebKit path:
```bash
PAKE_LINUX_WEBKIT_SAFE_MODE=0 ./YourApp.AppImage
```
If that produces a blank window on the same system, re-enable the conservative workaround with `PAKE_LINUX_WEBKIT_SAFE_MODE=1`. Do not diagnose this from GTK, appindicator, or GStreamer warnings alone; those are often unrelated optional runtime warnings.
在 GitHub 查看