{"id":49779947,"url":"https://github.com/leaker/pouch","last_synced_at":"2026-05-11T19:01:09.315Z","repository":{"id":356484551,"uuid":"1232662280","full_name":"leaker/pouch","owner":"leaker","description":"Tuck any web app into a local-first desktop pouch — URL caching + JS injection on macOS \u0026 Windows.","archived":false,"fork":false,"pushed_at":"2026-05-08T09:18:05.000Z","size":3434,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-08T10:19:35.315Z","etag":null,"topics":["http-cache","rust","script-injection","tampermonkey","tauri","webview"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leaker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T06:30:29.000Z","updated_at":"2026-05-08T09:18:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/leaker/pouch","commit_stats":null,"previous_names":["leaker/pouch"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/leaker/pouch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leaker%2Fpouch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leaker%2Fpouch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leaker%2Fpouch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leaker%2Fpouch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leaker","download_url":"https://codeload.github.com/leaker/pouch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leaker%2Fpouch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32908529,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-11T17:09:15.040Z","status":"ssl_error","status_checked_at":"2026-05-11T17:08:45.420Z","response_time":120,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http-cache","rust","script-injection","tampermonkey","tauri","webview"],"created_at":"2026-05-11T19:00:32.576Z","updated_at":"2026-05-11T19:01:09.304Z","avatar_url":"https://github.com/leaker.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build](https://github.com/leaker/pouch/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/leaker/pouch/actions/workflows/build.yml?query=branch%3Amain)\n[![License](https://img.shields.io/github/license/leaker/pouch)](LICENSE)\n\n# Pouch\n\n\u003e Desktop browser for tweaking any site — inject scripts, swap resources, persist overrides.\n\nPouch turns any web page into a standalone desktop app on macOS and Windows, then lets you stack your own changes on top: drop in a userscript and it runs at `document_start`; save a tweaked copy of any served file and Pouch serves it back on the next reload. Cookies, origin, and session behavior match the live site exactly — you're not rewriting the page, you're layering on top of it.\n\n## Features\n\n- Run any web page as a standalone desktop app — one entry in a config file, no wrapper code to write.\n- Open multiple pages at once; each gets its own window, all sharing the same cookies and storage.\n- Inject your own JavaScript with Tampermonkey-style `@match` rules — runs before the page's own scripts.\n- Replace any served file (JS, CSS, image, HTML…) with a local copy, just by editing the file on disk.\n- Tweaks survive reloads automatically — no DevTools session to keep open, no rebuild step.\n- Skip the cache on chosen hosts or URL patterns (analytics, telemetry, CDNs) so they always hit the network.\n- Configure startup URLs, window size, and ignore rules in a single TOML file with inline docs.\n- DevTools available with F12. On macOS, three titlebar buttons add reveal-folder / reload-from-config / toggle-devtools shortcuts.\n\n## Install\n\n### macOS — Homebrew (recommended)\n\n```bash\nbrew install --cask leaker/tap/pouch\n```\n\nUpdating:\n\n```bash\nbrew upgrade --cask pouch\n```\n\nOn first launch Pouch asks to trust a local certificate so it can view and modify HTTPS traffic for the page you load. Approve once at the system prompt and you're done — there is no second prompt on later launches.\n\n### Windows — Scoop (recommended)\n\nScoop downloads Pouch through PowerShell as a portable zip — Windows does not flag it with SmartScreen.\n\n```pwsh\nscoop bucket add leaker https://github.com/leaker/scoop-bucket\nscoop install pouch\n```\n\nUpdating:\n\n```pwsh\nscoop update pouch\n```\n\nScoop installs the portable `pouch.exe`. Pouch does not ship a Windows installer; `scoop update pouch` is the upgrade path.\n\n### Direct download\n\nFor users without Homebrew or Scoop, grab the latest build from the [releases page](https://github.com/leaker/pouch/releases/latest).\n\n**Pick one to install:**\n\n- **macOS** — `Pouch-\u003cversion\u003e.dmg` (universal binary, signed and notarized)\n- **Windows portable** — `Pouch-\u003cversion\u003e.exe` (single binary, double-click to run) or `Pouch-\u003cversion\u003e.zip` (binary plus sample `hook.conf.toml` and `inject/` folder)\n\n**Ignore these — they're used by Pouch's built-in updater (macOS only):**\n\n- `Pouch-\u003cversion\u003e.app.tar.gz` + `.sig` (macOS update payload)\n- `latest.json` (updater channel manifest)\n\n## First run\n\nOn launch Pouch reads `hook.conf.toml` and opens every URL listed in `startup_urls` as its own window. The default config opens `https://www.leelib.com` — replace it with the site you actually want.\n\n- **macOS**: if `startup_urls` is empty Pouch pops a native prompt asking for a URL. The first time you run Pouch you'll also get a one-shot system prompt asking to trust a local certificate (so Pouch can view and modify HTTPS traffic).\n- **Windows**: if `startup_urls` is empty Pouch logs a warning and waits — populate the file and relaunch.\n\nPress **F12** any time to open DevTools. On macOS, the right side of the title bar carries three shortcut buttons — reveal the Pouch data folder in Finder, reload from config (`Cmd+R`), toggle DevTools (`F12`) — and `Cmd+N` opens a \"new window\" prompt with a URL combobox that remembers recent destinations.\n\n### First run on Windows after upgrading from v2.0.x\n\nStarting with v2.1.0, Pouch stores its data in `%APPDATA%\\Pouch\\` instead of next to `pouch.exe`. On first launch after the upgrade, Pouch automatically moves your `hook.conf.toml`, `inject/`, and `overrides/` from the old portable location into `%APPDATA%\\Pouch\\`. The migration is one-shot — a marker file in the new directory prevents it from running again, so it's safe to keep upgrading.\n\n## Configuration\n\nPouch reads a single TOML file on launch. Edit it and hit Reload (`Cmd/Ctrl+R`) to apply.\n\n| Platform | Path |\n|---|---|\n| macOS | `~/Library/Application Support/Pouch/hook.conf.toml` |\n| Windows | `%APPDATA%\\Pouch\\hook.conf.toml` |\n\nA fully-commented default is seeded on first launch and never overwritten — open it in your editor and tweak in place.\n\n### Fields at a glance\n\n- `startup_urls` — URLs to open at launch. The first entry becomes the main window; each additional entry opens as its own extra window with shared cookies and storage.\n- `window_dimensions` — `\"inherit\"` (default; restore last session's geometry), `\"default\"` (1280×960), `\"maximized\"`, `\"fullscreen\"`, or `{ width = 1600, height = 1000 }`.\n- `ignore_urls` — URL patterns Pouch passes through without caching. Useful for analytics endpoints, font CDNs, or anything you don't want sitting in `overrides/`. Four match modes:\n  - `suffix` — host suffix including the apex (`{ suffix = \"gstatic.com\" }` matches both `gstatic.com` and `fonts.gstatic.com`).\n  - `wildcard` — host glob; `*` matches one label and does not cross `.` (`{ wildcard = \"*.google.com\" }` matches `fonts.google.com` but not `google.com`).\n  - `url_wildcard` — full-URL glob; `*` matches any characters including `/`. Anchored at both ends.\n  - `url_regex` — raw regex against the full URL; you control the anchors.\n- `updater.auto_check` — whether Pouch silently checks for updates ~5 seconds after launch. Default `true`. Setting to `false` keeps the \"Check for Updates…\" menu item but disables the background check.\n\nSee the [sample `hook.conf.toml`](hook.conf.toml) at the project root for inline documentation on every field, including how parse failures are handled.\n\n## Updates\n\nPouch checks GitHub for new releases about five seconds after launch and again every 24 hours while the app is running. The check is silent — you only see a prompt if a newer version is published — and the **Check for Updates…** menu item (Pouch menu on macOS, View menu on Windows) is always available for an on-demand check.\n\nYou can disable both the post-startup check and the 24-hour re-check in `hook.conf.toml`:\n\n```toml\n[updater]\nauto_check = false\n```\n\nThe **Check for Updates…** menu item still works manually when `auto_check` is off.\n\n### macOS\n\nWhen you accept the prompt, Pouch downloads the signed update and restarts. Your data in `~/Library/Application Support/Pouch/` is preserved across updates.\n\n### Windows\n\nPouch never downloads or installs the update for you on Windows — this avoids broken installs from interrupted downloads and keeps your portable layout intact if you've placed `pouch.exe` somewhere specific. The prompt depends on how you installed Pouch:\n\n- **Scoop install** — the dialog offers a **Copy command** button that copies `scoop update pouch` to your clipboard. Paste it in PowerShell to upgrade.\n- **Portable** (single `.exe` / `.zip`) — the dialog offers an **Open release page** button that opens the GitHub releases page in your default browser, where you can download the new `Pouch-\u003cversion\u003e.exe` or `Pouch-\u003cversion\u003e.zip` and replace your existing copy.\n\n## Customize a site\n\nPouch keeps everything you can tweak inside its data folder:\n\n| Platform | Data folder |\n|---|---|\n| macOS | `~/Library/Application Support/Pouch/` |\n| Windows | `%APPDATA%\\Pouch\\` |\n\nUse the title bar's reveal-folder button (or `View → Reveal Pouch Folder`, `Cmd+Shift+O` on macOS) to jump straight there.\n\n### Inject your own scripts\n\nPut a `.js` file anywhere under `inject/` and declare which URLs it runs on with a Tampermonkey-style header. Pouch scans `inject/` recursively at launch, so feel free to organize by host, by feature, or however you like — what decides the match is the `@match` line, not the folder name. Replace `example.com` below with the site you want to customize.\n\n```js\n// ==UserScript==\n// @name   tweak example\n// @match  https://www.example.com/*\n// ==/UserScript==\n\n(function () {\n  console.log('[tweak] running on', location.host);\n  // your tweaks here\n})();\n```\n\nRules:\n\n- **`@match`** — required. Glob form by default (`*` matches any characters, crossing `/`); prefix with `regex:` to switch to a real regex (`@match regex:^https://(api|cdn)\\.example\\.com/`). Multiple `@match` lines are allowed; any one matching triggers the rule.\n- **`@name`** — optional label that shows up in startup logs.\n- **No `@match` line** → file is skipped at scan time with a warning. Comment out every `@match` to disable a script temporarily without deleting it.\n- Scripts run at **document_start**, before the page's own JavaScript, in their own try/catch — a thrown error in one script never breaks the others.\n- SPA route changes do **not** re-trigger scripts. Hook the History API yourself if you need that.\n\nA safer default than `@match *` is `@match https://*`, which skips `about:blank` and `data:` frames.\n\n### Replace served files (overrides)\n\nThe first time Pouch fetches a resource it stashes the response under `overrides/\u003chost\u003e/\u003cpath\u003e`, with a small `.meta.json` sidecar holding the original headers. On the next load Pouch serves the file straight from disk — no network request.\n\n```\noverrides/\n  cdn.example.com/\n    static/\n      bundle.js\n      bundle.js.meta.json\n      site.css\n      site.css.meta.json\n```\n\nURLs with a query string get a hashed suffix in the filename: `?v=1` makes `bundle.js` land as `bundle.js.__qs_\u003c8-char-hash\u003e__.js`. Different queries map to different files so a stale signed URL never replaces the live one. The trailing `.js` (or `.css`, `.png`, ...) is repeated so your editor still picks the right syntax highlighting.\n\nTo customize a response, edit the file on disk and reload. To fall back to the live response, delete the file (and its `.meta.json`) — Pouch will refetch and re-cache on the next load.\n\nHosts and URL patterns listed in `ignore_urls` are fetched but never written to `overrides/`, which is the right setting for analytics endpoints and other things you don't want to freeze.\n\n## Uninstall\n\n### macOS (Homebrew)\n\n```bash\nbrew uninstall --cask pouch         # remove the app only\nbrew uninstall --cask --zap pouch   # remove the app AND your data\n```\n\n\u003e **Warning**: `--zap` permanently deletes your inject scripts, overrides cache, and `hook.conf.toml` — everything under `~/Library/Application Support/Pouch/` plus related WebView caches. Back up your `inject/` folder first if you want to keep your work. Drop `--zap` to keep your data and reinstall later.\n\nThe trusted certificate stays in your Keychain — open Keychain Access, search for \"Pouch\", and delete the entry manually if you want it gone.\n\n### Windows\n\n- **Scoop**: `scoop uninstall pouch`.\n- **Portable**: delete `pouch.exe` (and the surrounding folder if you extracted the zip).\n\nIn all cases, your data in `%APPDATA%\\Pouch\\` is left in place. Delete that folder manually if you want a clean slate.\n\n### Manual install (macOS)\n\nDrag `Pouch.app` to the Trash. Remove `~/Library/Application Support/Pouch/` if you want to wipe your tweaks too.\n\n## Build from source\n\nRequires the Rust toolchain and the [Tauri v2 prerequisites](https://v2.tauri.app/start/prerequisites/) for your platform.\n\n```bash\ngit clone https://github.com/leaker/pouch\ncd pouch\n\ncargo dev               # development with hot-reload\ncargo start             # run the release binary without bundling\ncargo build-app         # release binary into src-tauri/target/release/\ncargo bundle            # host-arch bundle (macOS .dmg; quick local check)\ncargo bundle-universal  # universal macOS .dmg, matches CI's release artifact\n```\n\nSee `.cargo/config.toml` for the full alias list.\n\n## License\n\n[MIT](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleaker%2Fpouch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleaker%2Fpouch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleaker%2Fpouch/lists"}