Tailscale preview command plugin for Takopi
Project description
takopi-preview
preview command plugin for takopi. starts a dev server (optional), exposes it
via tailscale serve, and tracks preview sessions by project/worktree context.
published as the takopi-preview package. the command id is preview.
features
/previewcommands to start, list, stop, and clean up previews- per-project overrides for ports and dev commands
- optional dev server auto-start with
{port}substitution - session registry with ttl expiration
- allowlist support for sensitive commands (like
killall)
requirements
- python 3.14+
- takopi >= 0.20
- provider tooling:
- tailscale installed and authenticated on the host (
tailscale up)
- tailscale installed and authenticated on the host (
- dev server binds to 127.0.0.1 (tunnels proxy locally)
- security groups should not expose the dev server port publicly
install
install into the same environment as takopi.
uv tool install -U takopi
uv tool install -U takopi --with takopi-transport-slack --with takopi-preview
or, with a virtualenv:
pip install takopi-transport-slack takopi-preview
setup
- install tailscale and authenticate (
tailscale up). - enable magicdns so
DEVICE.TAILNET.ts.netresolves. - run takopi with your transport (slack or telegram) as usual.
configuration
add to ~/.takopi/takopi.toml:
[plugins]
enabled = ["takopi-transport-slack", "takopi-preview"]
[plugins.preview]
provider = "tailscale"
default_port = 3000
dev_command = "pnpm dev -- --host 127.0.0.1 --port {port}"
auto_start = true
ttl_minutes = 120
path_prefix = "/preview"
tailscale_https_port = 443
allowed_user_ids = [123456789]
# optional env injection for the dev server
[plugins.preview.env]
NODE_ENV = "development"
# advanced overrides
local_host = "127.0.0.1"
path_prefix = "/preview"
tailscale_https_port = 443
# tailscale-specific
tailscale_bin = "tailscale"
# per-project overrides (Takopi project tables are strict, so use plugins.preview.projects)
[plugins.preview.projects.myapp]
port = 5173
dev_command = "npm run dev -- --host 127.0.0.1 --port {port}"
notes:
provider = "tailscale"uses tailnet-only urls fromtailscale serve.dev_commandmay include{port}; it will be substituted at runtime.dev_commandis required whenauto_start = true. setauto_start = falseto manage the dev server yourself.- Inline
--dev/--overrides enable auto-start for that run; use--no-startto force manual mode. - To require an explicit command each run, omit
dev_commandand setauto_start = false, then pass--devor--. ttl_minutes = 0disables expiration.- empty
allowed_user_idsmeans no allowlist enforcement.
commands
/preview start [port]: start a preview for the current context/preview start [port] --dev "<command>": override the dev command for this run/preview start [port] -- <command>: shorthand for an inline dev command/preview list: show active previews (url, port, uptime, context)/preview stop [id|port]: stop a preview (defaults to current context)/preview killall: stop all previews (restricted by allowlist)/preview help: usage help
workflow
- choose a context:
/myapp @feat/loginor reply in an existing thread. previews only run in worktrees, so include a branch to create/use one. - run
/preview start(or/preview start 5173). - open the returned url, for example:
https://DEVICE.TAILNET.ts.net/preview/5173
- stop when done:
/preview stopor/preview stop 5173.
state and ttl
- tailscale: sessions are derived from
tailscale serve status; no preview state file is written. - tailscale: if the requested port is already served, takopi will attempt to disable the existing serve entry before starting a new preview.
- tailscale: set
path_prefix = "/"to serve from the tailnet root. This avoids subpath issues with apps that assume/, but only one preview can be served at a time unless you also set per-preview HTTPS ports. - tailscale: when
path_prefix = "/", the default HTTPS port is the preview port (so5173maps tohttps://host.ts.net:5173). Settailscale_https_port = 443to force the default HTTPS port.
dev server logs (when auto-started) are written to:
~/.takopi/state/preview-logs/<session>.log
ttl_minutes controls automatic expiration for previews started by this takopi
process; expired sessions are cleaned up on the next command invocation.
worktrees that are pruned or deleted are also cleaned up on the next command.
takopi shutdown stops all previews.
errors
- missing tailscale: follow the install docs and run
tailscale up. - serve disabled: enable serve for your tailnet (Tailscale admin UI) if you see the "Serve is not enabled" error.
- port already in use: when auto-starting, takopi will try to stop listeners on
that port; if it is still busy, run
/preview listor pick a new port. - not in a worktree: include a branch (ex:
/myapp @feat/foo) to create/use a worktree. - dev server failures: the error includes log tail + log path.
spec alignment
this implementation follows the webapp preview workflow spec:
- command surface: start/list/stop/killall/help
- config in
[plugins.preview]with per-project overrides - tailscale serve for tailnet-only preview urls
- tailscale serve registry
- ttl-based expiration (
ttl_minutes) - allowlist enforcement via
allowed_user_ids
license
mit
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file takopi_preview-0.1.13.tar.gz.
File metadata
- Download URL: takopi_preview-0.1.13.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae12cba535845705279b2485406f087496e66ceaf3ff18d3657bb768d1fa08aa
|
|
| MD5 |
a04fa5aec0b3e496b9b55ed209a99857
|
|
| BLAKE2b-256 |
8963441fc0ea36f19cebe7c137b6a4fe4e2b3281c677a0e03d6643ac6acabbe5
|
Provenance
The following attestation bundles were made for takopi_preview-0.1.13.tar.gz:
Publisher:
workflow.yml on richardliang/takopi-preview
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
takopi_preview-0.1.13.tar.gz -
Subject digest:
ae12cba535845705279b2485406f087496e66ceaf3ff18d3657bb768d1fa08aa - Sigstore transparency entry: 843159829
- Sigstore integration time:
-
Permalink:
richardliang/takopi-preview@23c99d597e9728708a2e322b753acdd85174a545 -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/richardliang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@23c99d597e9728708a2e322b753acdd85174a545 -
Trigger Event:
push
-
Statement type:
File details
Details for the file takopi_preview-0.1.13-py3-none-any.whl.
File metadata
- Download URL: takopi_preview-0.1.13-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0fb086614c0aac0c6c5d075767521f65819176ba231f241b89c876071deffd8f
|
|
| MD5 |
e7f015f4cdaf7132170b99bdad996008
|
|
| BLAKE2b-256 |
9511884a32ad8757f6995673eebdb308b82b5cd494aed6d4d61f9e25caaab87d
|
Provenance
The following attestation bundles were made for takopi_preview-0.1.13-py3-none-any.whl:
Publisher:
workflow.yml on richardliang/takopi-preview
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
takopi_preview-0.1.13-py3-none-any.whl -
Subject digest:
0fb086614c0aac0c6c5d075767521f65819176ba231f241b89c876071deffd8f - Sigstore transparency entry: 843159833
- Sigstore integration time:
-
Permalink:
richardliang/takopi-preview@23c99d597e9728708a2e322b753acdd85174a545 -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/richardliang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@23c99d597e9728708a2e322b753acdd85174a545 -
Trigger Event:
push
-
Statement type: