Add manifest.webmanifest to the dashboard so Chrome can install it as a standalone app via the browser menu. Register the manifest in web_accessible_resources and link it from dashboard.html. Add a dedicated PWA install section to docs/INSTALLATION.md covering install steps, uninstall, and the requirement that the extension remains installed.
11 KiB
Installation
Quick install
macOS / Linux
curl -fsSL https://git.ssh.surf/snxraven/holesail-browser/raw/branch/main/scripts/web-installer.sh | bash
Windows (PowerShell)
irm https://git.ssh.surf/snxraven/holesail-browser/raw/branch/main/scripts/install.ps1 | iex
Or download install.ps1 from the latest release and run it from PowerShell.
What the installer does
macOS / Linux (install.sh)
- Detects your OS and architecture (
darwin/linux,x64/arm64) - Preserves existing user data — if a previous installation is found,
holesail-browser-storage/(state, settings, backups) andholesail-browser-certs/(CA key and certificates) are copied to a temporary location before anything is removed - Kills any running
holesail-browser-hostprocess - Removes the previous installation directory and old native messaging manifests
- Downloads
holesail-browser-host-<platform>-<arch>.zipfrom the latest release - Extracts the binary to
~/.holesail-browser/holesail-browser-host - Restores user data — the preserved storage and certs directories are copied back, so all tunnels, connections, settings, and certificates survive the upgrade
- macOS only: removes Gatekeeper quarantine, ad-hoc signs the binary, pre-runs it to extract
.barenative addons, then signs all extracted addons - Removes old extension files — any existing
Holesail-Browser-*.zipandHolesail-Browser-*.xpifiles in~/Downloadsare deleted before downloading the new version - Downloads
Holesail-Browser-1.0.0.zipandHolesail-Browser-1.0.0.xpito~/Downloads - Writes the native messaging manifest to all browser locations
Windows (install.ps1)
- Preserves existing user data — if a previous installation is found,
holesail-browser-storage\andholesail-browser-certs\are copied to a temporary location in%TEMP% - Kills any running
holesail-browser-host.exeprocess - Removes the previous installation directory and old registry keys
- Downloads
holesail-browser-host-win32-x64.zipand extracts the.exe - Restores user data — the preserved directories are copied back into the new installation
- Removes old extension files — any existing
Holesail-Browser-*.zipandHolesail-Browser-*.xpifiles in%USERPROFILE%\Downloadsare deleted before downloading the new version - Downloads
Holesail-Browser-1.0.0.zipandHolesail-Browser-1.0.0.xpito%USERPROFILE%\Downloads - Writes the native messaging manifest JSON and creates registry keys for Chrome, Chromium, and Firefox
What is preserved across upgrades
| Directory | Contents |
|---|---|
holesail-browser-storage/ |
state.json (all virtual hosts, tunnels, SSH/RDP connections, settings), backup archives |
holesail-browser-certs/ |
Root CA key and certificate, all wildcard domain certs (one per custom TLD parent, e.g. wildcard.hole.sail/, wildcard.my.internal/) |
The binary itself is always replaced with the new version. If this is a fresh install (no previous ~/.holesail-browser/ directory), the preserve/restore steps are skipped.
Native messaging manifest locations
The installer writes the manifest to all of these locations automatically:
macOS
| Browser | Path |
|---|---|
| Chrome | ~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.holesail.browser.json |
| Chromium | ~/Library/Application Support/Chromium/NativeMessagingHosts/com.holesail.browser.json |
| Firefox | ~/Library/Application Support/Mozilla/NativeMessagingHosts/com.holesail.browser.json |
Linux
| Browser | Path |
|---|---|
| Chrome | ~/.config/google-chrome/NativeMessagingHosts/com.holesail.browser.json |
| Chromium | ~/.config/chromium/NativeMessagingHosts/com.holesail.browser.json |
| Firefox | ~/.mozilla/native-messaging-hosts/com.holesail.browser.json |
Windows
Registry keys under HKCU\Software\:
Google\Chrome\NativeMessagingHosts\com.holesail.browserChromium\NativeMessagingHosts\com.holesail.browserMozilla\NativeMessagingHosts\com.holesail.browser
Each key's default value points to the manifest JSON file at %LOCALAPPDATA%\holesail-browser\com.holesail.browser.json.
Loading the extension
Chrome / Edge
- Open
chrome://extensions - Enable Developer mode (toggle in the top right)
- Drag
~/Downloads/Holesail-Browser-1.0.0.ziponto the extensions page
(or click Load unpacked and select the extracted folder)
Firefox (regular)
Firefox requires extensions to be signed by Mozilla for permanent installation via about:addons. Use the temporary add-on loader instead:
- Open
about:debugging - Click This Firefox
- Click Load Temporary Add-on...
- Select
~/Downloads/Holesail-Browser-1.0.0.zip(or any file inside the extracted folder)
Temporary add-ons are removed when Firefox restarts — you will need to reload it each session.
Firefox Developer Edition / Nightly (permanent, unsigned)
Developer Edition and Nightly allow disabling Mozilla's signature requirement:
- Open
about:config→ search forxpinstall.signatures.required→ set it tofalse - Open
about:addons→ gear icon → Install Add-on From File - Select
~/Downloads/Holesail-Browser-1.0.0.xpi
Firefox (permanent, signed via AMO)
For a permanent install in regular Firefox without any workarounds, the extension must be submitted to addons.mozilla.org (AMO) and signed by Mozilla. Once signed, the .xpi can be installed permanently in any Firefox version via about:addons.
The signing process:
- Create an account at addons.mozilla.org
- Submit the
.xpifor review (self-hosted distribution is available — full AMO listing is not required) - Mozilla signs and returns the
.xpi - Distribute the signed
.xpi— users can install it viaabout:addonswithout any config changes
Self-hosted signing (without a public AMO listing) is available via the AMO Developer Hub under Submit a New Add-on → On your own.
Installing the dashboard as a standalone app (PWA)
The dashboard supports being installed as a standalone desktop app via Chrome's PWA install feature. This opens the dashboard in its own OS window without any browser chrome (no address bar, tabs, or toolbar).
Requirements: The Holesail Browser extension must already be installed. The PWA is a launcher only — all functionality still runs through the extension and native host.
How to install
- Open the dashboard (click the Holesail icon in the toolbar, or press
Alt+Shift+H) - In Chrome, open the browser menu (⋮ top right) → Save and share → Install page as app
- Confirm the install prompt — the dashboard will appear in your OS app launcher and dock
Once installed, you can open Holesail directly from your desktop without opening a browser tab first.
Uninstalling the PWA
In Chrome, go to chrome://apps, right-click Holesail Browser, and select Remove from Chrome. This removes the standalone app shortcut but does not affect the extension itself.
Note: The PWA requires the extension to remain installed. If you uninstall the extension, the installed app will no longer function.
First-time setup
After loading the extension:
- Click the Holesail Browser icon in the toolbar to open the dashboard
- Go to Proxy & CA → click Install Root CA
- Fully quit and reopen Chrome (Cmd+Q on macOS, Alt+F4 on Windows) for the CA trust to take effect
- Go to Virtual Hosts → add a hostname (e.g.
myapp.hole.sail) and itshs://key - Navigate to
https://myapp.hole.sail/
The root CA must be installed and Chrome must be restarted before
*.hole.sailsites will load without a certificate warning. The CA is installed silently to your user keychain — no admin password is required on macOS.
Updating the extension ID
The native messaging manifest contains an allowed_origins field with the extension's Chrome ID. If you load the extension from a different source (e.g. a locally built zip), the ID may differ.
To update it, run:
# macOS / Linux
bash scripts/update-native-manifest-extension-id.sh <new-extension-id>
# Windows
.\scripts\update-native-manifest-extension-id.ps1 <new-extension-id>
Or edit the manifest JSON files directly and replace the chrome-extension://... value in allowed_origins.
Uninstalling
macOS / Linux
pkill -f holesail-browser-host 2>/dev/null || true
rm -rf ~/.holesail-browser
# Remove native messaging manifests
rm -f ~/Library/Application\ Support/Google/Chrome/NativeMessagingHosts/com.holesail.browser.json
rm -f ~/Library/Application\ Support/Chromium/NativeMessagingHosts/com.holesail.browser.json
rm -f ~/Library/Application\ Support/Mozilla/NativeMessagingHosts/com.holesail.browser.json
# Remove CA from keychain (macOS)
security delete-certificate -c "Holesail Browser CA" ~/Library/Keychains/login.keychain-db 2>/dev/null || true
Windows
Stop-Process -Name holesail-browser-host -Force -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\holesail-browser"
Remove-Item -Path "HKCU:\Software\Google\Chrome\NativeMessagingHosts\com.holesail.browser" -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Chromium\NativeMessagingHosts\com.holesail.browser" -ErrorAction SilentlyContinue
Remove-Item -Path "HKCU:\Software\Mozilla\NativeMessagingHosts\com.holesail.browser" -ErrorAction SilentlyContinue
Then remove the extension from chrome://extensions.
Building from source
Prerequisites
Steps
git clone https://git.ssh.surf/snxraven/holesail-browser
cd holesail-browser
# Install root dependencies
npm install
# Install native host dependencies
cd native-host && npm install && cd ..
# Build extension (.zip + .xpi)
npm run pack
# Build native host binary for current platform
npm run build:dist
# Build for all platforms
npm run build:dist:all
Built artifacts:
releases/Holesail-Browser-*.zip— Chrome extensionreleases/Holesail-Browser-*.xpi— Firefox extensionreleases/<platform>-<arch>/holesail-browser-host[.exe]— native host binary
Running in development
# Run the native host directly with Bare
cd native-host
bare index.mjs
Load the extension/ directory as an unpacked extension in Chrome.
Environment variables
| Variable | Description |
|---|---|
HOLESAIL_DEBUG=1 |
Enable verbose debug logging in the native host |
HOLESAIL_BROWSER_STORAGE=<path> |
Override the storage directory (default: next to binary) |
HOLESAIL_BROWSER_CERTS=<path> |
Override the certs directory (default: next to binary) |
BRIDGE_SWARM_LOG=<path> |
Override the log file path |