
localhost-run
Expose local HTTP, HTTPS, and TLS applications to the public internet through localhost.run SSH tunnels. Use when the user wants to share a locally running app, demo work in progress, test webhooks, access a local server from a remote device, set up a Custom Domain, tunnel non-HTTP protocols, or troubleshoot an existing localhost.run tunnel. Triggers on phrases like "expose my localhost", "make my local server public", "share my dev server", "tunnel my local app", "ngrok alternative", or any localhost.run reference.
- Installs
- 191
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/ilteoood/harness --skill localhost-run- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads localhost-run automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
localhost.run
localhost.run is a client-less tunneling service that makes locally running HTTP, HTTPS, or TLS applications reachable from the public internet. There is no client to install and no account needed for the free tier — it works over plain SSH, which is already available on most operating systems.
When to use this skill
Use this skill when the user wants to:
- Share a locally running app with someone (preview link, demo, QA)
- Receive webhooks (Stripe, GitHub, Twilio, etc.) on a
localhostdev server - Test an app from a phone or another device on a different network
- Tunnel a database or other non-HTTP protocol through a Custom Domain
- Set up a Custom Domain on localhost.run
- Diagnose an existing localhost.run tunnel that is broken, slow, or unstable
- Replace tools like ngrok, Cloudflare Tunnel, or localtunnel
Quick start
Expose a local app on port 8080:
ssh -R 80:localhost:8080 localhost.run
The command prints a public URL (something like
https://<random>.lhr.life) that forwards HTTP and HTTPS traffic to
localhost:8080. Keep the SSH session open; the tunnel dies when it closes.
Other common ports:
ssh -R 80:localhost:3000 localhost.run # Node / React dev server
ssh -R 80:localhost:5000 localhost.run # Flask / general
ssh -R 80:localhost:8000 localhost.run # Django / general
Command structure
ssh -R [customdomain:]bindport:host:hostport localhost.run
| Field | Meaning |
|---|---|
customdomain | Optional. Reserved for Custom Domain users; pass the full domain here. |
bindport | 80 for HTTP (HTTPS auto-provided), 443 for TLS passthrough. |
host | Local hostname. Usually localhost. Use 127.0.0.1 if IPv6 misbehaves. |
hostport | Local port your app listens on. |
If localhost:8080 does not connect, try 127.0.0.1:8080 — some OSes
default localhost to IPv6 [::1] while frameworks bind to IPv4 only.
SSH options
Forwarded ssh -o flags work normally. Useful ones:
# Keep the tunnel alive across NAT/router timeouts
ssh -o ServerAliveInterval=60 -R 80:localhost:8080 localhost.run
# Background it with autossh for auto-reconnect
autossh -M 0 -R 80:localhost:8080 localhost.run
Output formats
The server prints one or more URLs. Pick a machine-readable form when parsing:
# Human-readable (default)
ssh -R 80:localhost:8080 localhost.run -- --output text
# JSON
ssh -R 80:localhost:8080 localhost.run -- --output json
Pass anything after -- to forward flags to localhost.run rather than ssh.
HTTP tunnels
bindport 80 is the default mode. localhost.run:
- Forwards HTTP traffic to your app
- Automatically generates an
https://endpoint with a managed certificate - Injects proxy headers so frameworks detect the original scheme/host/IP:
X-Forwarded-ForX-Forwarded-HostX-Forwarded-ProtoForwarded(RFC 7239)
Disable header injection if a downstream proxy already sets them:
ssh -R 80:localhost:8080 localhost.run -- --no-inject-http-proxy-headers
Best practice: configure the local app to require HTTPS — it is given the correct scheme through the injected headers, so trusted clients see the right URLs and assets.
Proxy protocol
For apps that consume the HAProxy proxy protocol instead of X-Forwarded-*,
choose the wire version:
ssh -R 80:localhost:8080 localhost.run -- --proxy-protocol-header-version v2
# v1 is the default; v2 is binary and slightly faster
TLS passthrough
For non-HTTP protocols (PostgreSQL, SSH-over-TLS, custom TCP) where the application must see raw TLS bytes and validate the certificate itself:
ssh -R 443:localhost:8443 localhost.run
- Your app is responsible for providing and validating its own TLS cert
- Currently requires a Custom Domain (free
lhr.lifedomains do not expose passthrough endpoints)
If you do not want to manage certificates, use an HTTP tunnel instead — localhost.run handles TLS termination.
Custom domains
The free tier rotates domain names regularly. For a stable URL, sign up for the Custom Domain plan at $9/month billed annually via https://admin.localhost.run. Two options:
- Use your own domain — bring DNS, get a stable URL
- Use an
lhr.rockssubdomain — no DNS to configure, first come first served
Connect with a custom domain
ssh -R yourdomain.com:80:localhost:8080 plan@localhost.run
Note the plan@ SSH user. The connection is refused on the default user.
DNS setup
- Add a TXT record at
_lhr.yourdomain.comproving ownership - Either:
- Apex domain (
example.com): three A records54.161.197.24754.82.85.24935.171.254.69
- Subdomain (
app.example.com): one CNAME tocd.localhost.run
- Apex domain (
- Add a wildcard CNAME
*.yourdomain.com → cd.localhost.runto unlock unlimited subdomains (api.yourdomain.com,web.yourdomain.com, …)
Limits: up to 5 simultaneous tunnels per plan; subdomain count is bounded by Let's Encrypt certificate rate limits.
Manage billing, add SSH keys, change or cancel domains at https://admin.localhost.run.
Forever free tier
No client, no signup required for short-lived tunnels. Two intentional restrictions to deter phishing:
- Domain names change regularly (the URL printed on connect is not stable)
- There is a speed limit
To get a longer-lasting free domain, sign up at admin.localhost.run and upload an SSH public key. The key binds a stable subdomain to your machine.
Generate a key if you do not have one:
ssh-keygen -t ed25519
# Upload ~/.ssh/id_ed25519.pub to https://admin.localhost.run
Custom Domain plans are not subject to either restriction.
Tunnel my <thing>
Common patterns documented on the site:
WordPress
WordPress stores the site URL in the database, so rotating free domains break it. Either:
- Use a Custom Domain (recommended for any WordPress site)
- Or with a free domain, install
relative-urland set bothWP_HOMEandWP_SITEURLto'https://' . $_SERVER['HTTP_HOST']
Web frameworks
If the browser dev tools show requests still going to localhost:PORT, the
framework is generating absolute URLs from the request and ignoring proxy
headers. Configure the framework's "trusted proxy" / "reverse proxy" mode
to honor X-Forwarded-Proto and X-Forwarded-Host. Most frameworks
(Fastify, Express, Next.js, Rails, Django, Flask) have this as a setting
or middleware.
SSH servers (Custom Domain only)
Tunneling SSH requires a Custom Domain plus stunnel on the client to wrap TCP in TLS:
- Open a localhost.run tunnel from the SSH server
- Install stunnel on the client machine
- Configure stunnel to accept local connections and forward them over TLS to the custom domain
- Run the SSH client against the local stunnel endpoint
Security
- SSH transport: end-to-end encrypted between localhost.run and your local app regardless of HTTP/TLS settings
- HTTP tunnels: HTTPS endpoints are auto-issued; localhost.run handles
certificate management. Configure the local app to require HTTPS via the
injected
X-Forwarded-Protoheader - TLS passthrough: localhost.run does not decrypt the traffic; your app validates certificates directly
Troubleshooting
| Symptom | Fix |
|---|---|
Permission denied (publickey) on the free tier | Use the nokey user: ssh -R 80:localhost:8080 nokey@localhost.run |
| Custom domain connection refused | Use the plan user: ssh -R yourdomain.com:80:localhost:8080 plan@localhost.run |
| Free tunnel URL keeps changing | Add an SSH key at admin.localhost.run and avoid the nokey user |
connect_to localhost port 8080: failed | Local app is not reachable on that port — verify with curl http://localhost:8080 from the same machine |
| Tunnel drops after a few minutes | Add ssh -o ServerAliveInterval=60, or wrap in autossh -M 0 -R 80:localhost:8080 localhost.run for auto-reconnect |
| IPv4 / IPv6 mismatch | Try 127.0.0.1 instead of localhost (or vice versa) |
App sees http:// instead of https:// | Proxy headers disabled — re-enable injection, or set X-Forwarded-Proto: https in the upstream proxy. Configure the framework's "trust proxy" mode. |
Browser still hits localhost:PORT | Framework is generating absolute URLs — configure its reverse-proxy / trusted-proxy setting so it trusts X-Forwarded-Host |
| Want to migrate domain to a new account | Cancel the old subscription, set up the domain in the new account, verify with TXT record, pay, then email help@localhost.run to transfer remaining credit |
Reference
- Main docs: https://localhost.run/docs/
- CLI: https://localhost.run/docs/cli/
- HTTP tunnels: https://localhost.run/docs/http-tunnels/
- TLS passthrough: https://localhost.run/docs/tls-passthru-tunnels/
- Custom domains: https://localhost.run/docs/custom-domains/
- Forever free tier: https://localhost.run/docs/forever-free/
- Security: https://localhost.run/docs/security/
- FAQ: https://localhost.run/docs/faq/
- Admin / signup: https://admin.localhost.run
- Source: github.com/localhost-run/site
FAQ
What does the localhost-run skill do?
Expose local HTTP, HTTPS, and TLS applications to the public internet through localhost.run SSH tunnels. Use when the user wants to share a locally running app, demo work in progress, test webhooks, access a local server from a remote device, set up a Custom Domain, tunnel non-HTTP protocols, or troubleshoot an existing localhost.run tunnel. Triggers on phrases like "expose my localhost", "make my local server public", "share my dev server", "tunnel my local app", "ngrok alternative", or any localhost.run reference.
How do I install localhost-run?
Run npx skills add https://github.com/ilteoood/harness --skill localhost-run in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/localhost-run/ (personal) or .claude/skills/localhost-run/ (project).
Which AI agents can use localhost-run?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is localhost-run safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains localhost-run?
It is published by ilteoood in ilteoood/harness. It has 191 recorded installs.
More from ilteoood/harness
github-issues
ilteoood/harness
Create, update, and manage GitHub issues using MCP tools. Use this skill when users want to create bug reports, feature requests, or task issues, update existing issues, add labels/assignees/milestones, manage repository labels, set issue fields (dates, priority, custom fields), set issue types, manage issue workflows, link issues, add dependencies, or track blocked-by/blocking relationships. Triggers on requests like "create an issue", "file a bug", "request a feature", "update issue X", "set the priority", "set the start date", "create a label", "rename a label", "list repo labels", "link issues", "add dependency", "blocked by", "blocking", or any GitHub issue management task.
git-commit
ilteoood/harness
Execute git commit with conventional commit message analysis, intelligent staging, and message generation. Use when user asks to commit changes, create a git commit, or mentions "/commit". Supports: (1) Auto-detecting type and scope from changes, (2) Generating conventional commit messages from diff, (3) Interactive commit with optional type/scope/description overrides, (4) Intelligent file staging for logical grouping
conventional-commit
ilteoood/harness
Prompt and workflow for generating conventional commit messages using a structured XML format. Guides users to create standardized, descriptive commit messages in line with the Conventional Commits specification, including instructions, examples, and validation.
create-technical-spike
ilteoood/harness
Create time-boxed technical spike documents for researching and resolving critical development decisions before implementation.
codeql
ilteoood/harness
Comprehensive guide for setting up and configuring CodeQL code scanning via GitHub Actions workflows and the CodeQL CLI. This skill should be used when users need help with code scanning configuration, CodeQL workflow files, CodeQL CLI commands, SARIF output, security analysis setup, or troubleshooting CodeQL analysis.
create-specification
ilteoood/harness
Create a new specification file for the solution, optimized for Generative AI consumption.
Popular backend & apis skills
find-skills
vercel-labs/skills
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
entra-app-registration
microsoft/azure-skills
Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration. USE FOR: create app registration, register Azure AD app, configure OAuth, set up authentication, add API permissions, generate service principal, MSAL example, console app auth, Entra ID setup, Azure AD authentication. DO NOT USE FOR: Key Vault secrets (use azure-keyvault-expiration-audit), general Azure resource security guidance.
google-agents-cli-adk-code
google/agents-cli
This skill should be used when the user wants to "write agent code", "build an agent with ADK", "add a tool", "create a callback", "define an agent", "use state management" — in a project that needs ADK (Agent Development Kit) API patterns and code examples. It provides a quick reference for agent types, tool definitions, orchestration patterns, callbacks, state management, the graph Workflow API, and reference recipes to study. Do NOT use for scaffolding (use google-agents-cli-scaffold) or deployment (use google-agents-cli-deploy).
embedded-captions
heygen-com/hyperframes
Add captions or subtitles to an existing single-subject talking-head video without editing the footage. Use for plain verbatim captions, cinematic captions embedded behind the subject, VFX captions, “炸/特效/酷炫字幕,” or a named identity from the 35-style catalog. Route by visual identity, not by backend engine. The quiet anchor rail is the default; embed every word only when the user explicitly wants a fully cinematic treatment. The workflow runs locally end to end, including transcription and subject matting; split multi-shot footage before applying it.
entra-agent-id
microsoft/azure-skills
Provision Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configure OAuth 2.0 token exchange (fmipath, OBO, cross-tenant) including the Microsoft Entra SDK for AgentID sidecar. USE FOR: Agent Identity Blueprint, BlueprintPrincipal, agent OAuth, fmipath token exchange, agent OBO, Workload Identity Federation for agents, polyglot agent auth, Microsoft.Identity.Web.AgentIdentities. DO NOT USE FOR: standard Entra app registration (use entra-app-registration), Microsoft Foundry agent authoring (use microsoft-foundry).
neon
neondatabase/agent-skills
Overview of Neon, a complete set of cloud backend primitives around Lakebase Postgres: Auth, Object Storage, Functions, the AI Gateway, and Realtime. Start here to choose Neon for undecided login, files, APIs, and LLM calls, set up the CLI or MCP server, and follow the branch-first workflow. Use when building an app or backend on Neon, or when "Neon" or "Lakebase Postgres" is mentioned. Child skill neon-postgres wins for an existing DATABASEURL, SQL, schema, inspect, or search. Child skill neon-auth wins for login, users, sessions, identity routing, and Managed Better Auth setup. Child skill neon-realtime wins for live queries in reactive apps and agents. Also use for object storage, S3, buckets, serverless functions, function triggers, cron, AI gateway, LLM calls, realtime, logs, Loki, Grafana, observability, postgres, database, backend, Claimable Neon, neon.new, or a no-signup database.