Skip to main content

Tailscale private web sharing

A first-party adapter for the installed Tailscale client. It keeps the web app's bearer/device authentication and loopback listener; tailnet membership does not grant access to the backend owner's operations or terminal.

Included in the standard app; sharing stays off until you turn it on. Tailscale itself must already be installed and signed in; hz does not install it, log in, grant HTTPS consent or change OS permissions for you. On macOS it also detects the CLI bundled in /Applications/Tailscale.app and explicitly selects CLI mode, as described in Tailscale's CLI documentation.

In Settings or the footer's sharing icon, turn Share over Tailscale on. The control checks the node and existing Serve mappings, merges its exact HTTPS origin into your user configuration and configures its loopback target. The running web app applies the updated origin policy immediately; it does not require a backend restart. It shows ON and a URL only after the owning authenticated web app verifies its actual port, active origin policy and matching Serve configuration. A CLI/stdio MCP request saves the same intent but reports verification pending until that web owner verifies it. Status reads never enable sharing.

hz tailscale status --json
hz tailscale enable --json
hz tailscale disable --json

The corresponding private operations are available through authenticated API and stdio MCP. They are absent from the unauthenticated REST and HTTP MCP heads. In-process calls use the actual bound web port. A separate CLI retains a previously observed port override; it cannot discover an arbitrary ephemeral web listener or claim it is ready.

Copy URL copies a working link with the current #token=... session fragment when the authenticated session has one. Treat that link like a password: anyone who receives it can use that session until it is revoked or expires. If there is no session token, the control copies only the address. A fresh phone browser also needs authentication: use the separate Copy sign-in link action from the session owner, then pair that browser. Pairing a device never grants it authority to pair another device. See private web sharing for authentication and revocation.

Turning sharing off removes only the still-matching hz root handler and any origin permission this plugin added. Other paths, listeners, services and manually configured origins remain. An existing conflicting root, public Funnel setting, foreground session or higher-priority origin policy is refused. A changed Serve revision or unknown write outcome stops without retry or rollback; inspect current status before taking another action. Matching an existing manual handler does not make it owned by hz, so enabling refuses to adopt it. OFF without an owned request is non-destructive. Completed removal relinquishes ownership before cleanup; repeating OFF cannot delete a later manual recreation. An uncertain create remains unverified and needs inspection before deletion.

tailscale.https_port chooses an alternate HTTPS port when another app owns the default. Disable a previous request before changing its external origin. A Tailscale version must provide the conditional Serve LocalAPI and one of the recognized local endpoint formats. Unsupported client installations report an actionable error; no sudo or remote endpoint fallback is attempted. The exact node DNS name must be eligible for HTTPS certificates in Tailscale's own configuration. Readiness verifies the local deployment; actual phone access still depends on Tailscale login, network policy and the remote browser's credential.

Development and release commands: repository guide.

Screenshots

Enable private sharing and see verified readiness — fictional local Tailscale demo

Enable private sharing and see verified readiness — fictional local Tailscale demo

Inspect the private link at phone width — fictional local Tailscale demo; no remote connection tested

Inspect the private link at phone width — fictional local Tailscale demo; no remote connection tested

Turn private sharing off explicitly — fictional local Tailscale demo

Turn private sharing off explicitly — fictional local Tailscale demo

Command line Inspect saved intent and mapping, with web verification pending — fictional local Tailscale demo in a separate CLI process

Inspect saved intent and mapping, with web verification pending — fictional local Tailscale demo in a separate CLI process

Confirm the owned mapping is gone and the request is off — fictional local Tailscale demo

Confirm the owned mapping is gone and the request is off — fictional local Tailscale demo

Open the screenshot gallery.

Metadata

Release files for heinzel-tailscale 0.9.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for heinzel-tailscale 0.9.2
File Size Uploaded Provenance Actions
heinzel_tailscale-0.9.2.tar.gz 374.3 kB Without provenance Details for heinzel_tailscale-0.9.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for heinzel-tailscale 0.9.2
File Interpreter ABI Platform Actions
heinzel_tailscale-0.9.2-py3-none-any.whl Python 3 none any Details for heinzel_tailscale-0.9.2-py3-none-any.whl

Total release size: 395.0 kB

Release files / heinzel_tailscale-0.9.2.tar.gz

Download URL heinzel_tailscale-0.9.2.tar.gz
Size 374.3 kB
Tags Source
SHA-256 checksum
How to use checksums
171f0aff9ad7267e95c978781afcf441da9a3570ddbdf16f93b91346a796b782
BLAKE2b-256 checksum
How to use checksums
5905a99d4c3aefcf3f16ae75ba840bebe8ab01da392d090e7a2fca891dc343b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / heinzel_tailscale-0.9.2-py3-none-any.whl

Download URL heinzel_tailscale-0.9.2-py3-none-any.whl
Size 20.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cc442c1b37af0c66789615779ee1a66e85a35d4e800b735f879b9da4f7a41699
BLAKE2b-256 checksum
How to use checksums
03f823103494b3973178f8ef1939853c5e18380f7e528e013d363b56b5aa6943
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for heinzel-tailscale 0.9.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.9.2 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page