Controlled, end-to-end encrypted HTTP service connections for trusted Paseo hosts
npmjs · Paseo 0.9+
paseo plugin add npm:paseo-plugin-tunnel@0.3.2GitHub · Paseo 0.8 fallback
paseo plugin add lyhu/paseo-plugin-tunnel --ref 65d165c02ae6c03138e3a479d0e4607cb9b20996Git security status and fallback installation are pinned to commit 65d165c02ae6.
From the plugin's README
On each Ingress and Egress host, use the bundled Paseo CLI and daemon 0.8.0 or newer, matching the manifest's requirements.paseo. The host must support Git plugin sources, manifest build commands, and the v0.8 runtime entries (index.server.ts / index.client.tsx). Git, Node.js 22+, and npm must be available to the daemon process, with access to GitHub and the npm registry. If installation stops after the trust notice, see network troubleshooting.
Paseo 0.9 and newer install from npm:
paseo plugin install npm:paseo-plugin-tunnel
paseo plugin ls
paseo plugin status http-tunnel --json
Paseo 0.8 installs from GitHub:
paseo plugin install lyhu/paseo-plugin-tunnel
The community source lyhu/paseo-plugin-tunnel expands to this GitHub repository and follows its default branch, currently main. To select a branch explicitly, use the full URL as an alternative:
paseo plugin install https://github.com/lyhu/paseo-plugin-tunnel --ref main
Both Git source forms accept --ref <branch-or-tag-or-commit>; npm sources do not, because the published package version already pins the revision. The official-plugin shorthand tunnel does not identify this community repository.
Confirm source in the status output: "npm" for npm installs, "git" with ref: "main" for Git installs. A running plugin installed from a local checkout is a directory source, even if that checkout contains .git; `paseo …
README
中文文档 · Architecture · Installation details · Changelog
Connect an HTTP or HTTPS service you manage to another trusted Paseo host through the Paseo Relay and end-to-end encryption. Manage each connection from the HTTP Tunnel entry in Paseo's sidebar.
Client → Egress → Encrypted relay connection → Ingress → HTTP / HTTPS service
Ingress runs on the host that can reach your service. Egress provides a controlled access point on another host you manage. A Route Offer connects the two installations without requiring both hosts to be open in the UI at the same time.
Built for Paseo · Official Paseo repository
The plugin runs in a dedicated Node.js subprocess. Traffic continues while the Paseo app is closed, as long as the host daemon remains running.
On each Ingress and Egress host, use the bundled Paseo CLI and daemon 0.8.0 or newer, matching the manifest's requirements.paseo. The host must support Git plugin sources, manifest build commands, and the v0.8 runtime entries (index.server.ts / index.client.tsx). Git, Node.js 22+, and npm must be available to the daemon process, with access to GitHub and the npm registry. If installation stops after the trust notice, see network troubleshooting.
Paseo 0.9 and newer install from npm:
paseo plugin install npm:paseo-plugin-tunnel
paseo plugin ls
paseo plugin status http-tunnel --json
Paseo 0.8 installs from GitHub:
paseo plugin install lyhu/paseo-plugin-tunnel
The community source lyhu/paseo-plugin-tunnel expands to this GitHub repository and follows its default branch, currently main. To select a branch explicitly, use the full URL as an alternative:
paseo plugin install https://github.com/lyhu/paseo-plugin-tunnel --ref main
Both Git source forms accept --ref <branch-or-tag-or-commit>; npm sources do not, because the published package version already pins the revision. The official-plugin shorthand tunnel does not identify this community repository.
Confirm source in the status output: "npm" for npm installs, "git" with ref: "main" for Git installs. A running plugin installed from a local checkout is a directory source, even if that checkout contains .git; paseo plugin update cannot update directory sources.
Enable plugins in Settings → Plugins if needed. Paseo loads plugins as trusted host extensions: backend code and installation commands run with the daemon user's permissions, and the UI runs inside Paseo. Review the source and install it only on hosts you administer. Private repositories require Git credentials on the daemon host.
No precompiled release asset is required. Paseo installs the source, runs the manifest's dependency installation command, then compiles the server from index.server.ts and the client UI from index.client.tsx. You do not need to run npm run build, upload dist, or download a release asset. Runtime dependencies are pinned by the committed npm-shrinkwrap.json, which npm also ships inside the published package so that installs stay reproducible. See installation details for pinned revisions and local development.
Use your local Paseo UI to manage connected hosts, including remote hosts running only the daemon. Install and enable http-tunnel on each host first.
The Host picker is in the upper-right corner of the HTTP Tunnel page. When multiple connected hosts have the plugin installed, open this picker to switch the host currently being managed. The Ingresses, Egresses, forms, status checks, and quick tests shown on the page all belong to the selected host. Switching the Host picker changes the RPC destination; it does not copy rules between hosts. If the picker contains only one host, verify that the other host is connected and has http-tunnel installed and running. After upgrading to Paseo 0.8, every managed host must run HTTP Tunnel 0.3.1 or later — a host still on the pre-0.8 plugin is rejected by Paseo 0.8 and drops out of the picker. See remote host setup.
http://127.0.0.1:3000 (where 127.0.0.1 refers to the selected host). An origin contains only a scheme, hostname, and optional port.Listeners default to 127.0.0.1, which keeps access on the Egress host. Choose All network interfaces only for an approved network where other clients need access, and apply the host firewall and access policy you normally use for that service. For an Internet-facing endpoint, terminate HTTPS at a reverse proxy in front of Egress.
| Mode | Caller credential | Forwarding behavior |
|---|---|---|
| None — default | No plugin credential | Access is governed by the listener binding and surrounding network controls. |
| Header | X-Paseo-Access-Token: <token> |
Removes the tunnel token; preserves the API's Authorization header. |
| Bearer | Authorization: Bearer <token> |
Removes Authorization after validating the tunnel token. |
Use Header mode when the private API requires its own Bearer Token:
curl 'https://egress.example.com/api/health' \
--header 'X-Paseo-Access-Token: <ACCESS_TOKEN>' \
--header 'Authorization: Bearer <API_TOKEN>'
Route Offers and Access Tokens are independent credentials. Rotating an Ingress secret invalidates every existing offer for that route; distribute a new offer to each Egress. Rotating an Egress token requires callers to update their token.
Each rule has a status dot. Green means HTTP reachability was verified; yellow means offline, disabled, or still checking.
While a page is polling the host, checks send HEAD / without API credentials approximately every 15 seconds. Checks time out after 8 seconds, do not follow redirects, and stop at response headers. Results are shared between viewers, with at most four checks in flight. Changes invalidate old results; host failures and stale results cannot remain green.
Any upstream HTTP response, including 401, 404, or 5xx, proves connectivity. The displayed HTTP status is not a claim that API authentication or business operations succeed. Public DNS, inbound firewall rules, and the external reverse proxy are outside this check; use the request panel to test an API operation.
Open curl / Quick test under an Egress. Choose GET or POST, set the path and query, and provide a JSON body when needed. The panel generates a POSIX-shell curl command with the headers required by the selected authentication mode.
Newly generated tokens are available in the current page's memory. For an existing rule, paste the token or rotate it. Without a token, curl contains an <ACCESS_TOKEN> placeholder and the test action is disabled.
Send test request calls the listener through loopback on the Egress host and reports the HTTP status, duration, content type, and response preview. It does not test public DNS, firewall rules, or an external HTTPS reverse proxy. The request origin field affects the curl command only.
Tests time out after 10 seconds, do not follow redirects, and retain at most 8 KiB of response data. SSE previews stop after the first data chunk. Input tokens echoed verbatim by the service are redacted from the preview.
paseo plugin status http-tunnel
paseo plugin update http-tunnel
paseo plugin logs http-tunnel
Git installations following main receive updates through plugin update. Use --ref <tag-or-commit> at installation to pin a reviewed revision. plugin reload http-tunnel reloads the installed source without fetching Git changes. Reloading or updating can interrupt active tunnel requests; neither requires restarting the main Paseo daemon.
Configuration is stored independently in $PASEO_HOME/tunnel/config.json, or ~/.paseo/tunnel/config.json when PASEO_HOME is unset. Access Tokens are stored as hashes; the file contains private route credentials and must remain private. The default Relay is relay.paseo.sh:443 over TLS. For a self-hosted Relay, see Relay configuration.
Copy this prompt into an agent running on the intended Paseo host:
Install and enable the trusted plugin `lyhu/paseo-plugin-tunnel` on this Paseo host (authorized to run with daemon permissions).
### Execution Instructions
1. **Pre-flight Checks**:
- Check Paseo CLI, target daemon, Git, Node.js 22+, npm, and GitHub/npm connectivity.
- Confirm Git source and --ref support; read README and paseo-plugin.json before installation.
- Inspect existing plugins: if already installed, retain existing rules/credentials and report current status without overwriting.
2. **Installation**:
- Enable plugin support through the target host’s Settings → Plugins if needed.
- Run: `paseo plugin install lyhu/paseo-plugin-tunnel`
- Must install directly via the Git source (owner/repo). Do not clone locally, register directory sources, or patch lockfiles.
- If installation or dependency setup fails, report the redacted error and stop; do not fallback to directory installation.
3. **Verification** (all must pass):
- `paseo plugin ls --json`: reports `http-tunnel` as `running`.
- `paseo plugin status http-tunnel --json`: verify `source=git`, `ref=main`, expected repository, and `currentCommit`.
- `paseo plugin update http-tunnel`: update check succeeds.
4. **Guardrails & Reporting**:
- Inspect `paseo plugin logs http-tunnel` for troubleshooting; never expose credentials.
- Do not restart the main daemon, create tunnel rules, bind public ports, or build/publish artifacts.
- Ask only if host access or credentials are fundamentally missing. Report host, source, ref, installed commit, and update check result upon completion.
HTTP Tunnel is designed for development services, internal APIs, dashboards, model endpoints, and other approved operational workflows between trusted Paseo hosts. Deploy it only with hosts, services, networks, and data you own or are authorized to administer.
CONNECT tunneling, WebSocket Upgrade, or HTTP trailers.For development, clone the repository, run npm ci, then use npm run typecheck, npm run lint, and npm run build. Run tests by file with npm run test:file -- <test-file>. See benchmark methodology and results, architecture and verification coverage. Desktop and browser workflows are verified; iOS and Android require device validation.
AGPL-3.0-only. Includes HTTP tunnel components derived from Paseo.
Scanned 06 Oct 2026, 07:39 UTC from lyhu/paseo-plugin-tunnel.