tailscale-serve-patterns

tailscale-serve-patterns is a skill for Claude Code from technicalpickles/pickled-claude-plugins. It costs 218 tokens per session (2,386 once invoked), scanned A, original, MIT.

A set of deployment patterns for exposing a locally running service to devices on a Tailscale network. It compares keeping the service on loopback and proxying it with Tailscale Serve against binding the service directly to the network address.

In plain words
What is it for?
Use it when choosing how to share a local server over a tailnet, investigating unexpected authentication behavior, or assessing the security impact of its bind address and proxy setup.
Why use it?
The choice changes whether HTTPS and Tailscale access control are applied automatically. Direct binding can expose plain HTTP without application-level authentication to anyone who can reach that network address.

Skill for Claude Code

Written for Claude Code: ${CLAUDE_PLUGIN_ROOT} variable.

Runs only inside its plugin — its command needs a path that Claude Code sets for a plugin’s own hooks and for nothing else. Install the plugin, not this.

Part of the tailscale plugin — 2 skills shipped together

Good fit Use it when choosing how to share a local server over a tailnet, investigating unexpected authentication behavior, or assessing the security impact of its bind address and proxy setup.

Compare 6 skills from other repositories ↓
Install

Getting it into your agent

This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.

Claude Code
/plugin marketplace add technicalpickles/pickled-claude-plugins
Claude Code
/plugin install tailscale

Made for: Claude Code.

Or install tailscale, the plugin that ships this one along with the rest of its 2 skills.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for tailscale-serve-patterns

README.md
[![agentmods](https://agentmods.dev/badge/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns/github.svg)](https://agentmods.dev/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns)
Your own site
<a href="https://agentmods.dev/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns"><img src="https://agentmods.dev/badge/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for tailscale-serve-patterns

Your own site · 80×15
<a href="https://agentmods.dev/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns"><img src="https://agentmods.dev/badge/skills/technicalpickles/pickled-claude-plugins/tailscale-serve-patterns.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 218 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,386 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00218 $0.02386
Opus 5.5 $0.00087 $0.00954
Sonnet 5.5 $0.00044 $0.00477
Haiku 4.5 $0.00022 $0.00239

Measured 1mo ago against content hash aa691989458b, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

tailscale-serve-patterns scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

A security/doctor check that inspects `gateway.bind` (or equivalent app-level config) and calls it safe because it says `127.0.0.1` has no visibility into what's *actually* reachable: Docker's `-p` publish flag can expos
plugins/tailscale/skills/tailscale-serve-patterns/SKILL.md · 72 lines

How it starts

The opening of the file, as written. The whole thing — 72 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Tailscale Serve Patterns

Overview

Two ways to make a local service reachable over a tailnet, with very different security properties: bind loopback-only and let tailscale serve proxy HTTPS in front of it, or bind the process directly to the tailnet interface address. For CLI mechanics (commands, Services vs. node-serve, troubleshooting serve status), see the tailscale-cli skill instead — this skill is about which exposure shape to choose and what it implies for auth.

The two binding patterns

Loopback bind + tailscale serve Direct bind to tailnet interface
What's exposed 127.0.0.1:<port> only; serve proxies HTTPS at <host>.<tailnet>.ts.net Plain HTTP directly at the tailnet IP (e.g. 100.x.y.z:<port>)
Auth Tailscale itself is the gate — only tailnet members can reach the hostname at all; TLS terminated by tailscaled None unless the app adds its own — anyone on the tailnet who knows the IP:port can hit it over unencrypted HTTP
Setup cost One extra tailscale serve mapping to create/tear down Zero extra config — just bind a different address
Failure mode if misconfigured Hitting <tailnet-hostname>:<port> directly (skipping the proxy) fails, because the app only bound loopback — this is expected, not a bug A stray bind flag or default (0.0.0.0 instead of 127.0.0.1) silently widens exposure to the whole tailnet with no signal

Default to loopback + serve. It's the pattern used across this project's homelab services (bind 127.0.0.1:<port>, expose via host tailscaled + Services) and what the crit review tool's own auto-mode classifier treats as the expected, low-friction path. Direct tailnet-interface binding is the exception, appropriate for short-lived single-user sessions (e.g. "review this on my phone for the next ten minutes, I'm the only one on this tailnet") — treat it as something that needs an explicit, conscious opt-in (a flag like --allow-unauthenticated-network), not a default.

Read the full file on GitHub · 72 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 1mo ago Changed · +18 lines · +103 tokens per session aa691989458b
  2. 1mo ago First seen · 54 lines · 115 tokens per session scan A 7713fb02dadd

Subscribe to this mod's changes

tailscale-serve-patterns is a skill published in the GitHub repository technicalpickles/pickled-claude-plugins (11 stars, last pushed yesterday), licensed MIT. It adds 218 tokens to every session and 2,386 once invoked, about $0.0009 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-05.

Related

Other skills, from other repositories

create-workflow-aspire

Creates a Dapr workflow app with .NET Aspire, run locally through the Aspire AppHost. Use for "create a workflow with Aspire" or "build a workflow app with .NET Aspire". For Diagrid Catalyst use the catalyst-ai plugin.

diagrid-labs/dapr-skills · 56 tokens

latchbio-integration

Builds, registers, debugs, and operates bioinformatics workflows on Latch using the Python SDK, CLI, Latch Data and Registry, Nextflow, Snakemake, programmatic execution, and Latch MCP. Use when authoring or deploying Latch workflows, configuring resources or interfaces, moving data, integrating Registry, or launching…

K-Dense-AI/scientific-agent-skills · 78 tokens

add-vercel

Add Vercel deployment capability to NanoClaw agents. Installs the Vercel CLI in agent containers and sets up OneCLI credential injection for api.vercel.com. Use when the user wants agents to deploy web applications to Vercel.

nanocoai/nanoclaw · 54 tokens

django-storages-s3

Use when configuring Django to store static and media files on AWS S3 with django-storages. Invoke when working with the STORAGES setting, S3 buckets, presigned URLs, CloudFront, or boto3-backed file storage in settings.py. Configures the Django 4.2+ STORAGES dict, public/private custom backends, presigned GET/POST…

Jeffallan/claude-skills · 138 tokens

terraform-engineer

Use when implementing infrastructure as code with Terraform across AWS, Azure, or GCP. Invoke for module development (create reusable modules, manage module versioning), state management (migrate backends, import existing resources, resolve state conflicts), provider configuration, multi-environment workflows, and…

Jeffallan/claude-skills · 63 tokens

websocket-engineer

Use when building real-time communication systems with WebSockets or Socket.IO. Invoke for bidirectional messaging, horizontal scaling with Redis, presence tracking, room management.

Jeffallan/claude-skills · 36 tokens