Skip to content

feat: federated peers via tailcat (no Tailscale account) - #6401

Merged
atomantic merged 4 commits into
mainfrom
feat/tailcat-federated-peers
Sep 6, 2026
Merged

feat: federated peers via tailcat (no Tailscale account)#6401
atomantic merged 4 commits into
mainfrom
feat/tailcat-federated-peers

Conversation

@atomanticagent

Copy link
Copy Markdown
Collaborator

Summary

  • Add tailcat as a federation transport so operators can paste a tc… address in Instances → Add Peer without a Tailscale account.
  • Standard local forward: 15555 → remote 5555 (PORTS.TAILCAT_FORWARD / DEFAULT_TAILCAT_LOCAL_PORT); if 15555 is busy, the next free loopback port is used.
  • Server installs/detects tailcat (PATH or go install), manages forward lifecycle, persists mappings in machine-local data/tailcat-forwards.json, and restores them on boot.
  • Classic host/port add is unchanged (still rejects loopback).

Closes #6400

Security / privacy

  • Full tc… addresses are never logged, never returned on peer records to the UI/peers, and never appear in docs/tests (placeholders only: <tcADDR> / tcEXAMPLE…).
  • No Tailscale daemon, no serve-all, no exit-node.

Docs

  • docs/features/tailcat-peers.md — feature note + copy/paste Grok Bot / agent sandbox setup guide
  • docs/PORTS.md, docs/STORAGE.md updates

Tests

  • server: services/tailcatPeer.test.js, lib/ports.test.js (18 passed)
  • client: src/pages/Instances.test.jsx (5 passed)

Test plan

  • Paste a sandbox tc… address in Instances → Tailcat address; confirm peer at 127.0.0.1:15555 (or next free port)
  • Confirm classic IP/port add still works
  • Restart PortOS and confirm forward restores
  • Remove peer and confirm forward stops

atomanticagent and others added 4 commits September 6, 2026 17:14
Operators can paste a tc… address in Instances to start a local
tailcat forward (15555→5555 by default) and register a loopback peer.
Includes install/forward lifecycle, boot restore, docs, and tests.

Closes #6400

@atomantic atomantic left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed and updated this PR directly with follow-up commits 315c0568f and 4ccffeb27.

Resolved findings:

  • Wait for the tailcat listener-ready message instead of treating a short-lived process as ready; terminate startup failures and timeouts.
  • Keep repeated/split bearer-capability diagnostics and child errors out of API errors and logs.
  • Roll back the child and peer when persisting its restart mapping fails, without retrying the failed mapping write during rollback.
  • Preserve the managed loopback port and host selection when a remote peer announces itself; limit forward cleanup to tailcat peers and propagate cleanup failures.
  • Regenerate the API route catalog and replace the new form fixture's address with a reserved documentation address so the privacy guard passes.

Validation: focused server/client regression tests and production client build passed locally. All Linux, Windows, client, database, CI Gate, and Full CI Gate jobs passed for 4ccffeb27b53b0fb2b80a5adb05a1462cad4bc1c: https://github.com/atomantic/PortOS/actions/runs/34051075046. GitHub reports CLEAN / MERGEABLE. No remaining blocking findings from this review. A real two-install tailcat smoke test was not performed.

Left open for merge as requested.

@atomantic
atomantic merged commit 086964e into main Sep 6, 2026
12 checks passed
@atomantic
atomantic deleted the feat/tailcat-federated-peers branch September 6, 2026 18:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Federated peers via tailcat (no Tailscale account)

2 participants