MCPInstall

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
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads localhost-run automatically when relevant.

  3. 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 localhost dev 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
FieldMeaning
customdomainOptional. Reserved for Custom Domain users; pass the full domain here.
bindport80 for HTTP (HTTPS auto-provided), 443 for TLS passthrough.
hostLocal hostname. Usually localhost. Use 127.0.0.1 if IPv6 misbehaves.
hostportLocal 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-For
    • X-Forwarded-Host
    • X-Forwarded-Proto
    • Forwarded (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.life domains 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:

  1. Use your own domain — bring DNS, get a stable URL
  2. Use an lhr.rocks subdomain — 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

  1. Add a TXT record at _lhr.yourdomain.com proving ownership
  2. Either:
    • Apex domain (example.com): three A records
      • 54.161.197.247
      • 54.82.85.249
      • 35.171.254.69
    • Subdomain (app.example.com): one CNAME to cd.localhost.run
  3. Add a wildcard CNAME *.yourdomain.com → cd.localhost.run to 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:

  1. Domain names change regularly (the URL printed on connect is not stable)
  2. 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-url and set both WP_HOME and WP_SITEURL to '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:

  1. Open a localhost.run tunnel from the SSH server
  2. Install stunnel on the client machine
  3. Configure stunnel to accept local connections and forward them over TLS to the custom domain
  4. 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-Proto header
  • TLS passthrough: localhost.run does not decrypt the traffic; your app validates certificates directly

Troubleshooting

SymptomFix
Permission denied (publickey) on the free tierUse the nokey user: ssh -R 80:localhost:8080 nokey@localhost.run
Custom domain connection refusedUse the plan user: ssh -R yourdomain.com:80:localhost:8080 plan@localhost.run
Free tunnel URL keeps changingAdd an SSH key at admin.localhost.run and avoid the nokey user
connect_to localhost port 8080: failedLocal app is not reachable on that port — verify with curl http://localhost:8080 from the same machine
Tunnel drops after a few minutesAdd ssh -o ServerAliveInterval=60, or wrap in autossh -M 0 -R 80:localhost:8080 localhost.run for auto-reconnect
IPv4 / IPv6 mismatchTry 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:PORTFramework is generating absolute URLs — configure its reverse-proxy / trusted-proxy setting so it trusts X-Forwarded-Host
Want to migrate domain to a new accountCancel 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

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

View all →

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.

539 installs

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.

DevOps & Cloud538 installs

create-specification

ilteoood/harness

Create a new specification file for the solution, optimized for Generative AI consumption.

Media & Creative538 installs

Popular backend & apis skills

View category →

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.

OfficialBackend & APIs4.1M installs

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.

OfficialBackend & APIs566.7K installs

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).

Backend & APIs514.8K installs

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.

Backend & APIs453.3K installs

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).

OfficialBackend & APIs336.6K installs

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.

Backend & APIs237.1K installs