Daemon Link for Paseo: Hosts: private localhost links, reviewed Git project transfers, and project-scoped monitoring.
Requires Paseo: >=0.8.0 — from this plugin's own paseo-plugin.json.





Manifest JSON
{
"id": "daemon-link",
"requirements": {
"paseo": ">=0.8.0"
},
"build": [
[
"npm",
"ci",
"--ignore-scripts"
]
]
}paseo plugin add itsjustanks/paseo-plugin-daemonFrom the plugin's README
Add itsjustanks/paseo-plugin-daemon in Paseo → Settings → Plugins, or use the CLI:
paseo plugin add itsjustanks/paseo-plugin-daemon
paseo plugin ls
Enable plugins if needed, confirm daemon-link is running, and open Hosts from the
sidebar. Paseo installs dependencies in its managed checkout; no manual build or daemon restart
is needed. The plugin also provides a workspace panel and a Command Center entry.
Plugins run as trusted code with your daemon's privileges. Install from a source you trust. For private localhost access, install this plugin on both computers running Paseo. A browser-only device can use a temporary browser link instead.
Update a Git-managed installation with:
paseo plugin update daemon-link
README
Open a remote project's dev server from Paseo in one press.
See every dev server running on a host, press Open, and it appears in your browser. Pair two Paseo hosts for a private local URL, or save an SSH forward. Receive selected Git projects with a preview and history. Check host health from the same place.
The plugin is Daemon Link; its sidebar entry is Hosts, matching Paseo's host terminology.
Install · One-press Open · Private connection · Screenshots · Troubleshooting · Contributing
Actual plugin components rendered with fictional data. Every screenshot in this repository uses an isolated preview: no real accounts, host addresses, project names, credentials, or conversations.
Agent Browser is not required. Daemon Link forwards traffic; your normal browser renders the app. The app cannot be rendered inside Paseo itself: the plugin SDK has no WebView and no plugin HTTP route, so a browser link, a paired-host forward, or an SSH forward is always the mechanism. Daemon Link's job is to make that one press.
Add itsjustanks/paseo-plugin-daemon in Paseo → Settings → Plugins, or use the CLI:
paseo plugin add itsjustanks/paseo-plugin-daemon
paseo plugin ls
Enable plugins if needed, confirm daemon-link is running, and open Hosts from the
sidebar. Paseo installs dependencies in its managed checkout; no manual build or daemon restart
is needed. The plugin also provides a workspace panel and a Command Center entry.
Plugins run as trusted code with your daemon's privileges. Install from a source you trust. For private localhost access, install this plugin on both computers running Paseo. A browser-only device can use a temporary browser link instead.
Update a Git-managed installation with:
paseo plugin update daemon-link
With the remote host selected, open Hosts → Dev servers (or the Hosts tab of the workspace the server runs in) and press Open in browser on its card. Daemon Link reserves a browser tab, starts a temporary HTTPS link to that port (or reuses the live one), and sends the tab there once the link is connected. The card reads Starting link, then Link ready · 2 h left, or Link failed with the reason. Press Extend to renew a live link without a new URL, or Close link when you are done. The dev server itself is never touched.
A browser link is a public URL protected by a private session cookie and by the service lease, and it always expires. If you would rather publish nothing, switch the card row to Private forward: it shows the same servers with an SSH forward… button that presets the remote port, and a Paired-host link… button for the private relay described next.
Imagine a development server running Paseo and a laptop also running Paseo. The server hosts the app; the laptop receives a local port. You can manage either through Paseo's host picker.
Development server Your laptop
Paseo + Daemon Link Paseo + Daemon Link
Project app on port 3000 <── encrypted ── Local forward on port 3000
relay ↑
Browser: localhost:3000
On the development server, open a project in Paseo, then start its normal dev command in that project's terminal. For example:
npm run dev
Keep that terminal running. Open Hosts → Dev servers with the server selected. Recognized apps appear automatically with their project, framework, and listening port. The plugin discovers an existing server; opening the panel does not start your project for you.
On the development server, open Hosts → Connect → Private localhost → Pair hosts → Create pairing code. Use Paseo's host picker to select your laptop's daemon, then paste the code under Pair host.
Pairing establishes permission for one host to discover and access the other's eligible project apps. It does not grant agent, file, process-control, or daemon-management access. Pair separately in the other direction if both computers will host apps.
Keep your laptop selected. Choose the paired development server and press Create local link beside its app. Copy local URL and open it on your laptop, or use Open in this browser when this browser runs on that same computer. If the preferred local port is occupied, Daemon Link chooses a free one instead.
A local port belongs to the selected daemon's computer. Selecting the remote daemon does not create a port on your laptop. The host label and in-app guide explain this throughout the flow.
Close forward removes local access while leaving the project server running. Revoke access on the hosting daemon removes a peer's permission and closes its active connections.
Pairings persist. Active forwards close when the plugin stops; use Create local link to recreate them. After a plugin or daemon restart, open Hosts on the hosting daemon once to initialize project access. Both plugins must remain running while you use a connection.
| Tab | What to do here |
|---|---|
| Dev servers | First thing you see: a card per running app with Open, link state, Extend, private routes. |
| Connect | Pair hosts for private localhost links, manage browser links, or save an SSH forward. |
| Project Sync | Share selected Git projects, review a transfer, and inspect receive history. |
| Daemon Health | Check CPU and memory; search, sort, and inspect processes associated with Paseo projects. |
Version 0.9.0 reduced six tabs to these four. Overview and Local Projects both answered "what can I open?", so they are one tab, Dev servers; Guide & Setup became a collapsed card at the bottom of it; Dev Relay was renamed Connect. Nothing was removed: counts, search, setup checks, the walkthrough, and the troubleshooting cards are all still there.
Each workspace also gets a Hosts tab, in the workspace view and in the Projects explorer; what it shows depends on the panel scope setting described below.
By default the workspace tab leads with Dev servers in this workspace: one card per verified dev server whose working directory sits inside the workspace, each with the same Open, link state, Extend, and Close link controls as the sidebar surface. A Health card follows: the workspace's status, how many verified dev servers run inside it and on which ports, when the daemon last checked, and every issue that touches it. Then a Resources card: the summed CPU and resident memory of the workspace's processes, how many processes that is, and each figure as a share of the host (CPU against the machine's cores and its current load; memory against total and used memory). The numbers come from the same sample as the process rows; a process the host has not measured twice yet is reported as still sampling rather than as zero, and a share is left out when the host total it needs is not available. Below that come the other processes whose working directory sits inside the workspace directory (or that share one of its ports), plus any temporary browser links pointing at those ports with their remaining time. Stop and force-stop controls are the same as in Daemon Health and keep the same server-side checks. Switch the scope to Whole host to get the full Hosts surface inside the tab instead; the whole-host surface shows machine totals, not a per-workspace rollup.
The daemon evaluates host health on the refresh interval and caches one verdict, so every panel and pill reads the same result instead of probing the host. A host or workspace is flagged when:
Each agent's composer gets a small pill while its workspace has something to report: 2 dev servers :3000 :4000 when things are fine, Dev server :3000 stopped, Driving host pressure, or Host unreachable when they are not. A problem inside the workspace leads the chip ahead of a host-wide
one. Pressing it opens the Hosts tab for that workspace. When a workspace has no verified dev server
and no issue, the pill is not shown at all. The chip never shows CPU or memory figures; those live in
the Resources card. The verdict never carries tokens, link URLs, or raw command lines.
Open Settings → Plugins → Daemon Link → Hosts, or run Configure Hosts from the Command Center. Settings are saved per host and shared by every client of that host.
| Setting | Default | Effect |
|---|---|---|
| Panel shows | This workspace only | Workspace tab lists only the workspace's processes, or the whole host. |
| Refresh interval | 20 seconds | How often the workspace tab re-reads the host (5–120 seconds). |
| Check host health in the background | On | The daemon re-checks on the refresh interval; off means only on demand. |
| Show the composer pill | On | Show the per-agent health chip described above. |
| Link duration | 2 hours | How long Open keeps a new browser link alive, and what each Extend adds (15 min–8 h). |
| Close browser links on archive | On | Archiving a workspace stops browser links that point at its dev servers. |
Archive cleanup and background health checks run on the daemon, so they work even when no app is connected. Cleanup only stops temporary browser links; the dev server itself keeps running. If the saved settings file cannot be read, cleanup is skipped rather than guessed. Settings saved by 0.6.0 through 0.8.0 are migrated in place: every value you chose is kept and the link duration starts at 2 hours.
A temporary browser link is created with the configured duration and shows its expiry and remaining time everywhere it is listed. Extend renews a live link in place: the public URL, the session cookie in your browser, and the tunnel process all stay as they are; only the expiry moves. A link can be renewed as often as you like but never past 24 hours after it was first started; at that point it is closed and a fresh one costs one press. The service lease keeps being re-verified every two seconds, so an extended link still dies with the dev server it was issued for. Unlimited links are deliberately not offered: the URL is public for as long as the link lives.
| Method | Best fit | What it requires |
|---|---|---|
| Private localhost | Two Paseo computers; HMR, WebSockets, SSE | Daemon Link on both hosts and one-time pairing |
| Browser link | Phone or guest device; another network route; one press | Explicit helper setup on the app host |
| SSH forward | Existing SSH workflow; private 127.0.0.1:PORT |
SSH keys/agent and a trusted known host |
Remote apps, Pair hosts, and Manage access keep everyday connections separate from pairing and revocation. Creating a link shows the receiving host and a copyable URL; it does not automatically open a browser on a potentially different computer.
Private forwarding uses an encrypted channel over Paseo's relay with outbound TLS WebSockets,
usually on port 443. Machines do not need to share a LAN or accept new inbound ports.
You may configure a compatible self-hosted relay using PASEO_DAEMON_LINK_RELAY on both hosts.
Temporary browser links use an authenticated HTTPS gate and expire after the configured duration (2 hours by default), with a hard 24-hour lifetime even when extended. The optional Cloudflare helper is pinned and checksum-verified, and installed only in the plugin's user state directory. Links are created explicitly by pressing Open; a failed private connection never silently publishes an app. Cloudflare Quick Tunnels do not support SSE and cannot bypass every firewall.
Saved SSH forwarding uses your existing keys and strict host verification. It does not store SSH passwords or wait on a hidden password prompt.
This brings the Sync plugin's selected-project, preview, and history workflow into Hosts using its existing encrypted relay. Install this version on both hosts; no SSH credentials are needed.
Each receive is a new checkout under the plugin's private state directory. Existing projects, branches, and working files stay in place. One receive runs at a time; the latest 50 results persist. Clearing project permission stops future downloads. It cannot remove a copy already received.
The first version transfers the selected repository root's committed HEAD and reachable history, up to 32 MiB, with a preview that expires in ten minutes. It verifies the received bytes against that preview. Projects must be registered in Paseo at their Git repository root.
This is an explicit transfer workflow, not continuous folder mirroring, a mounted drive, or an automatic backup. It does not include uncommitted or untracked files, chat sessions, daemon settings, Git LFS objects, or submodule contents. Files already committed to Git travel with its history, including private data or secrets someone committed. Review the project before granting access. No project permission or transfer is enabled by installing or updating the plugin.
Click Process, PID, CPU, or Memory to sort; click again to reverse the order. Search by process or project, and use the page controls to browse 15 rows at a time. Expand a row for details. Agents and unknown project tools are read-only; manage agents from their Paseo tabs.
Stop controls appear only for recognized project servers and require confirmation. The backend rechecks project membership and process identity before acting. Force-stop is available only after a graceful stop attempt.
The card at the foot of Dev servers summarises the setup checks on one line and expands into the walkthrough: which host to select, how to start a project server, which route to pick, how pairing works, and what to try when discovery or a connection fails. Checks report observed state rather than assuming that a saved pairing means the other machine is online.
Daemon Link verifies project directories and workspaces through Paseo's SDK, then matches them against the server's process working directories. A dev server started manually inside a registered project can qualify too; the plugin does not claim every matching process was launched by Paseo.
Discovery and process monitoring support Linux and macOS. Receiving forwards on Windows and native mobile rendering remain unverified. The plugin loads an explicit unsupported state where appropriate. macOS identity checks use the precision provided by that OS; process-stop race windows cannot be eliminated completely.
See the technical reference for process protections, relay behavior, framework handling, pressure thresholds, and known limitations.
Requires Paseo 0.8 or newer. Version 0.5.0 moved to the 0.8 runtime layout: index.client.tsx
and index.server.ts entries with code under client/, server/, and shared/, and
requirements.paseo set to >=0.8.0. Versions 0.6.0 through 0.9.0 add the workspace panel,
settings screen, lifecycle hooks, health checks, composer pill, workspace resource rollup, one-press
Open, and the simplified four-tab surface on top of that layout. Paseo 0.7 hosts should stay on 0.4.0.
Features depend on the selected host's actual capabilities, so a newer host never lends its APIs
to an older one. The /daemon-link composer shortcut appears only when the host provides that API.
| Symptom | What to check |
|---|---|
| No apps listed | Start the app in a registered project. Refresh Dev servers; check the selected host. |
| Open does nothing | Allow pop-ups for Paseo. The card reads Starting link, then Link ready; Link failed shows why. |
| Link expired mid-session | Press Extend before it runs out; after 24 hours of life, Close it and press Open again. |
| Custom server is missing | Configure it as a Paseo service script with its listening port. |
| Project access is unavailable | Open Hosts on that host after restart; refresh project access. |
| Localhost opens the wrong app | Select your receiving daemon and use the exact URL beside its forward. |
| Private connection fails | Keep both plugins running; check the peer and outbound relay access. |
| Phone has no Paseo daemon | Create a temporary browser link on the app host. |
| No shared projects | Grant project access on the source, separately from dev relay pairing. |
| Preview cannot be prepared | Register the Git root; ensure it has a commit and history fits the size limit. |
| Transfer failed | Check both hosts, preview again, and inspect Transfer history. Existing projects stay intact. |
| SSH reports authentication failure | Check SSH keys/agent and known hosts; password prompts are unsupported. |
| Next.js blocks a dev resource | Use the displayed localhost URL; custom hostnames need explicit allowedDevOrigins. |
| Live updates fail on a browser link | Use private forwarding for SSE; check app URLs and cookie settings. |
Daemon Link does not patch project configuration. Applications with absolute URLs, OAuth callbacks, custom cookie domains, or HTTPS-only upstreams may need their own settings. Temporary browser links currently target HTTP services on IPv4 loopback.
git clone https://github.com/itsjustanks/paseo-plugin-daemon.git
cd paseo-plugin-daemon
npm ci
npm run typecheck
npm test
npm run test:compatibility
npm run test:coverage
npm run check:hygiene
For a safe UI preview:
npm run preview:ui
# Open http://127.0.0.1:43197
The preview substitutes plugin RPCs with fictional fixtures and does not connect to Paseo.
Use ?light, ?empty, ?error, or ?unverified to inspect theme and recovery states;
?view=panel mounts the workspace tab and ?view=settings the Hosts settings screen; ?tunnelfail
makes every browser link fail so the error path can be driven. The fixture stubs window.open, so a
headless run can assert where a reserved tab was sent without a real browser tab.
See screenshot instructions before refreshing public images.
The runtime ID is daemon-link; the package name is paseo-plugin-daemon. Install a local checkout
in a development daemon with paseo plugin install /absolute/path/to/checkout --id daemon-link.
Use paseo plugin reload daemon-link after source changes; a daemon restart is unnecessary.
The selected-project, preview, and history workflow draws on itsjustanks/paseo-plugin-sync. The transfer implementation here uses Daemon Link's relay and separate per-project permissions.
Scanned 10 Sep 2026, 16:24 UTC at commit 2d546c207dd1d1855289ea62d08a13428704e106.
Scanned 10 Sep 2026, 16:26 UTC from itsjustanks/paseo-plugin-daemon.