{
  "name": "Localhost sharing tools compared",
  "description": "How qURL and 22 localhost tunnel tools handle accounts, URLs, public reachability, access control, link expiry, single-use links, protocols, and free-tier limits. Every cell cites the vendor document or test it came from.",
  "license": "CC-BY-4.0",
  "publisher": "LayerV",
  "homepage": "https://layerv.ai/compare/localhost-tunnels",
  "dateModified": "2026-10-14",
  "metadataVerifiedAt": "2026-10-14",
  "fields": {
    "account": "Account needed before the first URL",
    "install": "What you install",
    "firstCommand": "Command to the first shareable URL",
    "urlType": "What the URL looks like",
    "publicReach": "Who can reach it",
    "interstitial": "Warning page shown to visitors",
    "accessControl": "Visitor access control",
    "linkExpiry": "Link expiry",
    "singleUse": "Single-use links",
    "protocols": "Protocols",
    "freeLimits": "Free-tier limits"
  },
  "tools": [
    {
      "id": "qurl",
      "name": "qURL CLI",
      "vendor": "LayerV",
      "homepage": "https://layerv.ai/cli",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "MIT",
        "source": "https://github.com/layervai/qurl-integrations/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v3.5.0 (2026-10-10)",
        "source": "https://github.com/layervai/qurl-integrations/releases"
      },
      "facts": {
        "account": {
          "value": "No. The first publish creates the device identity",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "install": {
          "value": "qurl CLI (Homebrew or release download)",
          "source": "https://layerv.ai/cli",
          "status": "documented"
        },
        "firstCommand": {
          "value": "qurl publish http://127.0.0.1:3000\nqurl share <CRID>",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "urlType": {
          "value": "A qurl.link access link per recipient; the app answers at r_<id>.qurl.site, a name absent from Certificate Transparency logs",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "publicReach": {
          "value": "No one until a link is opened; then the opener’s public IP for that session, including other devices behind that IP",
          "source": "https://layerv.ai/docs/qurls.md",
          "status": "documented"
        },
        "interstitial": {
          "value": "None",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "accessControl": {
          "value": "Single-use access link by default; link and session lifetimes. IP allow and deny lists and other rules can gate links through the API, not the CLI",
          "source": "https://layerv.ai/docs/qurls.md",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Yes. qurl share returned a 24-hour link in our no-account test; no-account links are capped at 24 hours",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "singleUse": {
          "value": "Yes, the default for qurl share",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "protocols": {
          "value": "HTTP(S), WebSocket, SSE; no raw TCP",
          "source": "https://layerv.ai/research/qurl-behaviour",
          "status": "tested"
        },
        "freeLimits": {
          "value": "Without an account: up to 3 active resources, with links that last up to 24 hours",
          "source": "https://github.com/layervai/qurl-integrations/blob/main/apps/cli/README.md",
          "status": "documented"
        }
      }
    },
    {
      "id": "ngrok",
      "name": "ngrok (free plan)",
      "vendor": "ngrok",
      "homepage": "https://ngrok.com",
      "verifiedAt": "2026-10-01",
      "facts": {
        "account": {
          "value": "Yes: account and authtoken",
          "source": "https://ngrok.com/docs/share-localhost/quickstart",
          "status": "documented"
        },
        "install": {
          "value": "ngrok agent",
          "source": "https://ngrok.com/docs/share-localhost/quickstart",
          "status": "documented"
        },
        "firstCommand": {
          "value": "ngrok config add-authtoken <TOKEN>\nngrok http 8080",
          "source": "https://ngrok.com/docs/share-localhost/quickstart",
          "status": "documented"
        },
        "urlType": {
          "value": "One assigned dev domain per account (ngrok-free.app / ngrok-free.dev), stable",
          "source": "https://ngrok.com/docs/gateway/domains",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://ngrok.com/docs/share-localhost/quickstart",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes, on free-plan browser traffic (ERR_NGROK_6024)",
          "source": "https://ngrok.com/docs/errors/err_ngrok_6024",
          "status": "documented"
        },
        "accessControl": {
          "value": "Traffic Policy: OAuth, OIDC, basic auth, IP restrictions (free plan: 3 OAuth/OIDC users a month)",
          "source": "https://ngrok.com/docs/share-localhost/auth",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No built-in expiry; free endpoints have no timeout and stay up while the agent runs",
          "source": "https://ngrok.com/docs/pricing-limits/free-plan-limits",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://ngrok.com/docs/share-localhost/quickstart",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); TCP after card verification",
          "source": "https://ngrok.com/docs/gateway/endpoints/tcp",
          "status": "documented"
        },
        "freeLimits": {
          "value": "3 endpoints, 1 GB/month out, 20,000 HTTP requests/month, 4,000 requests/min",
          "source": "https://ngrok.com/docs/pricing-limits/free-plan-limits",
          "status": "documented"
        }
      }
    },
    {
      "id": "cloudflare-quick-tunnel",
      "name": "Cloudflare Quick Tunnel (trycloudflare.com)",
      "vendor": "Cloudflare",
      "homepage": "https://try.cloudflare.com",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "Apache-2.0",
        "source": "https://github.com/cloudflare/cloudflared/blob/master/LICENSE"
      },
      "latestRelease": {
        "value": "2026.10.0 (2026-10-05)",
        "source": "https://github.com/cloudflare/cloudflared/releases"
      },
      "facts": {
        "account": {
          "value": "No",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "install": {
          "value": "cloudflared",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "firstCommand": {
          "value": "cloudflared tunnel --url http://localhost:8080",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "urlType": {
          "value": "Temporary *.trycloudflare.com hostname; changes each run",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public, unless --allowed-mail is set",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Optional --allowed-mail email one-time PIN (browsers only; change it by restarting cloudflared)",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No; the URL works until cloudflared stops",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); Server-Sent Events not supported",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        },
        "freeLimits": {
          "value": "200 in-flight requests; no uptime guarantee; for testing and development",
          "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/",
          "status": "documented"
        }
      }
    },
    {
      "id": "cloudflare-named-tunnel",
      "name": "Cloudflare Tunnel (named)",
      "vendor": "Cloudflare",
      "homepage": "https://www.cloudflare.com/products/tunnel/",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "Apache-2.0",
        "source": "https://github.com/cloudflare/cloudflared/blob/master/LICENSE"
      },
      "latestRelease": {
        "value": "2026.10.0 (2026-10-05)",
        "source": "https://github.com/cloudflare/cloudflared/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: account plus a domain on Cloudflare",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "install": {
          "value": "cloudflared",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "firstCommand": {
          "value": "Create the tunnel in the dashboard, run the cloudflared install command it shows, then add a published application route",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "urlType": {
          "value": "Stable hostname on your own domain",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public unless you add a Cloudflare Access application",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Cloudflare Access policies; service tokens for machines",
          "source": "https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No per-link expiry; Access session settings apply",
          "source": "https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); TCP, SSH, RDP, SMB with cloudflared on the client",
          "source": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/protocols/",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Available on all plans; 1,000 tunnels per account, 25 replicas per tunnel",
          "source": "https://developers.cloudflare.com/cloudflare-one/account-limits/",
          "status": "documented"
        }
      }
    },
    {
      "id": "tailscale-funnel",
      "name": "Tailscale Funnel",
      "vendor": "Tailscale",
      "homepage": "https://tailscale.com/kb/1223/funnel",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "BSD-3-Clause",
        "source": "https://github.com/tailscale/tailscale/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v1.104.1 (2026-10-07)",
        "source": "https://github.com/tailscale/tailscale/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a tailnet with MagicDNS, HTTPS certificates, and the funnel node attribute",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        },
        "install": {
          "value": "Tailscale client 1.38.3 or later (an open-source variant on macOS)",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        },
        "firstCommand": {
          "value": "tailscale funnel 3000",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        },
        "urlType": {
          "value": "Stable machine-name.tailnet-name.ts.net; machine names are published in Certificate Transparency logs",
          "source": "https://tailscale.com/kb/1153/enabling-https",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone on the internet",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        },
        "accessControl": {
          "value": "None on Funnel traffic; Funnel requests carry no Tailscale identity headers",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No; runs until you turn it off",
          "source": "https://tailscale.com/kb/1311/tailscale-funnel",
          "status": "documented"
        },
        "singleUse": {
          "value": "No",
          "source": "https://tailscale.com/kb/1311/tailscale-funnel",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTPS proxy, TCP, TLS-terminated TCP; ports 443, 8443, and 10000 only",
          "source": "https://tailscale.com/kb/1311/tailscale-funnel",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Available on all plans; non-configurable bandwidth limits, not published; beta",
          "source": "https://tailscale.com/kb/1223/funnel",
          "status": "documented"
        }
      }
    },
    {
      "id": "tailscale-serve",
      "name": "Tailscale Serve",
      "vendor": "Tailscale",
      "homepage": "https://tailscale.com/kb/1312/serve",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "BSD-3-Clause",
        "source": "https://github.com/tailscale/tailscale/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v1.104.1 (2026-10-07)",
        "source": "https://github.com/tailscale/tailscale/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a tailnet with HTTPS certificates enabled",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "install": {
          "value": "Tailscale client, for you and every viewer",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "firstCommand": {
          "value": "tailscale serve 3000",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "urlType": {
          "value": "machine-name.tailnet-name.ts.net; machine names are published in Certificate Transparency logs",
          "source": "https://tailscale.com/kb/1153/enabling-https",
          "status": "documented"
        },
        "publicReach": {
          "value": "Authorized Tailscale users, including accepted machine-share recipients",
          "source": "https://tailscale.com/docs/features/sharing",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "accessControl": {
          "value": "Tailscale access rules; Tailscale-User-Login identity headers for the app",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No; a foreground session runs until stopped, and --bg keeps it running across reboots",
          "source": "https://tailscale.com/kb/1242/tailscale-serve",
          "status": "documented"
        },
        "singleUse": {
          "value": "No",
          "source": "https://tailscale.com/kb/1312/serve",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S) proxy, files, directories, plain text, TCP, TLS-terminated TCP",
          "source": "https://tailscale.com/kb/1242/tailscale-serve",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Free Personal plan: up to 6 users, unlimited user devices",
          "source": "https://tailscale.com/pricing",
          "status": "documented"
        }
      }
    },
    {
      "id": "localtunnel",
      "name": "localtunnel",
      "vendor": "localtunnel (open source)",
      "homepage": "https://github.com/localtunnel/localtunnel",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "MIT",
        "source": "https://github.com/localtunnel/localtunnel/blob/master/LICENSE"
      },
      "latestRelease": {
        "value": "2.0.2 (2021-09-18)",
        "source": "https://www.npmjs.com/package/localtunnel"
      },
      "facts": {
        "account": {
          "value": "No",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "install": {
          "value": "Node.js package",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "firstCommand": {
          "value": "npx localtunnel --port 8000",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "urlType": {
          "value": "Random *.loca.lt subdomain (optional --subdomain, not guaranteed)",
          "source": "https://loca.lt/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "interstitial": {
          "value": "Reminder page that asks for a tunnel password (the creator’s public IP), per the service’s maintainer",
          "source": "https://github.com/localtunnel/localtunnel/issues/598",
          "status": "third-party"
        },
        "accessControl": {
          "value": "Not documented",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Active while the lt client stays connected; no expiry setting",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S)",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Not documented",
          "source": "https://github.com/localtunnel/localtunnel",
          "status": "documented"
        }
      }
    },
    {
      "id": "pinggy",
      "name": "Pinggy (free)",
      "vendor": "Pinggy",
      "homepage": "https://pinggy.io",
      "verifiedAt": "2026-10-01",
      "facts": {
        "account": {
          "value": "No, to start",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "install": {
          "value": "Nothing beyond an SSH client",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "firstCommand": {
          "value": "ssh -p 443 -R0:localhost:8000 qr@free.pinggy.io",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "urlType": {
          "value": "Random URL that changes on reconnect; persistent subdomains on Pro",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes, a one-time browser screening page on free tunnels; non-browser clients skip it; none on Pro",
          "source": "https://pinggy.io/docs/http_tunnels/screening/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Basic auth, bearer token, IP allowlist",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Free tunnels time out after 60 minutes",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://pinggy.io/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S), TCP, TLS over SSH; UDP needs the Pinggy CLI",
          "source": "https://pinggy.io/docs/udp_tunnels/",
          "status": "documented"
        },
        "freeLimits": {
          "value": "60-minute tunnel timeout",
          "source": "https://pinggy.io/",
          "status": "documented"
        }
      }
    },
    {
      "id": "serveo",
      "name": "Serveo (free)",
      "vendor": "Serveo",
      "homepage": "https://serveo.net",
      "verifiedAt": "2026-10-01",
      "facts": {
        "account": {
          "value": "No",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "install": {
          "value": "Nothing beyond an SSH client",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "firstCommand": {
          "value": "ssh -R 80:localhost:3000 serveo.net",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "urlType": {
          "value": "*.serveo.net subdomain; custom subdomain available",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes on the free tier; removed on Pro",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Not documented for visitors",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "None documented for HTTP; anonymous public TCP ports last 10 minutes (30 with a registered key)",
          "source": "https://serveo.net/docs",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://serveo.net/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); raw TCP (random port) and private TCP/SSH aliases over SSH; UDP only via paid WireGuard",
          "source": "https://serveo.net/docs",
          "status": "documented"
        },
        "freeLimits": {
          "value": "3 active tunnels; anonymous TCP: 1 port, 10 minutes, 2 connections, 256 KiB/s",
          "source": "https://serveo.net/docs",
          "status": "documented"
        }
      }
    },
    {
      "id": "localhost-run",
      "name": "localhost.run (free)",
      "vendor": "localhost.run",
      "homepage": "https://localhost.run",
      "verifiedAt": "2026-10-01",
      "facts": {
        "account": {
          "value": "No account for free domains (SSH key or the nokey user)",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "install": {
          "value": "Nothing beyond an SSH client",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "firstCommand": {
          "value": "ssh -R 80:localhost:8080 localhost.run",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "urlType": {
          "value": "Free domains change after a few hours; custom domains on paid plans",
          "source": "https://localhost.run/docs/faq/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Not documented",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "No expiry setting; the free domain rotates",
          "source": "https://localhost.run/docs/faq/",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://localhost.run/docs/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP with automatic HTTPS; TLS passthrough and non-HTTP need a paid custom domain",
          "source": "https://localhost.run/docs/http-tunnels",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Free domain names change regularly; speed limit",
          "source": "https://localhost.run/docs/forever-free",
          "status": "documented"
        }
      }
    },
    {
      "id": "ms-dev-tunnels",
      "name": "Microsoft dev tunnels",
      "vendor": "Microsoft",
      "homepage": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview",
      "verifiedAt": "2026-10-01",
      "facts": {
        "account": {
          "value": "Yes: GitHub, Microsoft, or Entra ID",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/faq",
          "status": "documented"
        },
        "install": {
          "value": "devtunnel CLI or VS Code",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/overview",
          "status": "documented"
        },
        "firstCommand": {
          "value": "devtunnel user login\ndevtunnel host -p 8080 --allow-anonymous",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/cli-commands",
          "status": "documented"
        },
        "urlType": {
          "value": "*.devtunnels.ms; persistent when created with devtunnel create",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "publicReach": {
          "value": "Private by default; anonymous access is opt-in",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes, an anti-phishing page on first visit",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "accessControl": {
          "value": "Tenant, GitHub organization, or anonymous; 24-hour access tokens",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Temporary tunnels end when the host disconnects; persistent tunnels are deleted after 30 days idle; anonymous access can be time-limited",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/faq",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S) and WebSocket via the web URL; other TCP via devtunnel connect",
          "source": "https://learn.microsoft.com/en-us/azure/developer/dev-tunnels/security",
          "status": "documented"
        },
        "freeLimits": {
          "value": "5 GB a month and 10 tunnels per user; 1,500 HTTP requests a minute per port; public preview, no SLA",
          "source": "https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits#dev-tunnels-limits",
          "status": "documented"
        }
      }
    },
    {
      "id": "zrok",
      "name": "zrok (free)",
      "vendor": "NetFoundry",
      "homepage": "https://zrok.io",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "Apache-2.0",
        "source": "https://github.com/openziti/zrok/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v2.0.8 (2026-10-08)",
        "source": "https://github.com/openziti/zrok/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a free account, no card",
          "source": "https://zrok.io/pricing/",
          "status": "documented"
        },
        "install": {
          "value": "zrok2 CLI (zrok 2.0)",
          "source": "https://netfoundry.io/docs/zrok/get-started/install-zrok2",
          "status": "documented"
        },
        "firstCommand": {
          "value": "zrok2 enable <TOKEN>\nzrok2 share public 8080",
          "source": "https://netfoundry.io/docs/zrok/get-started/create-share",
          "status": "documented"
        },
        "urlType": {
          "value": "*.share.zrok.io; random and ephemeral by default, or a reserved name",
          "source": "https://netfoundry.io/docs/zrok/concepts/namespaces",
          "status": "documented"
        },
        "publicReach": {
          "value": "Your choice per share: public shares are open to anyone with the URL; private shares only to zrok accounts you grant",
          "source": "https://netfoundry.io/docs/zrok/how-tos/shares/configure-permission-modes",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes, an anti-phishing page on the first visit to public shares from unverified free accounts; adding a card removes it",
          "source": "https://zrok.io/pricing/",
          "status": "documented"
        },
        "accessControl": {
          "value": "Basic auth; OAuth with an email pattern; private shares",
          "source": "https://github.com/openziti/zrok/blob/main/cmd/zrok2/sharePublic.go",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Ephemeral shares end with the process",
          "source": "https://netfoundry.io/docs/zrok/concepts/public-shares",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://netfoundry.io/docs/zrok/concepts/public-shares",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S) on public shares; raw TCP, UDP, and SOCKS on private shares",
          "source": "https://netfoundry.io/docs/zrok/concepts/private-shares",
          "status": "documented"
        },
        "freeLimits": {
          "value": "5 GB/day; 7,500 requests per share per 5 minutes",
          "source": "https://netfoundry.io/docs/zrok/myzrok/service-limits/",
          "status": "documented"
        }
      }
    },
    {
      "id": "bore",
      "name": "bore (bore.pub)",
      "vendor": "bore (open source)",
      "homepage": "https://github.com/ekzhang/bore",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "MIT",
        "source": "https://github.com/ekzhang/bore/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v0.6.0 (2025-06-09)",
        "source": "https://github.com/ekzhang/bore/releases"
      },
      "facts": {
        "account": {
          "value": "No, for the public bore.pub server",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "install": {
          "value": "bore binary",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "firstCommand": {
          "value": "bore local 8000 --to bore.pub",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "urlType": {
          "value": "bore.pub:<random port>",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone who connects to the port",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "interstitial": {
          "value": "None (raw TCP)",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "accessControl": {
          "value": "Optional shared secret between client and server, not visitors",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "bore.pub connections time out after 24 hours, per the maintainer",
          "source": "https://github.com/ekzhang/bore/issues/150",
          "status": "third-party"
        },
        "singleUse": {
          "value": "No",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "protocols": {
          "value": "TCP only, no TLS",
          "source": "https://github.com/ekzhang/bore",
          "status": "documented"
        },
        "freeLimits": {
          "value": "24-hour timeout and a per-source-IP connection limit on bore.pub, per the maintainer; no uptime guarantee",
          "source": "https://github.com/ekzhang/bore/issues/196",
          "status": "third-party"
        }
      }
    },
    {
      "id": "expose",
      "name": "Expose (free)",
      "vendor": "Beyond Code",
      "homepage": "https://expose.dev",
      "verifiedAt": "2026-10-01",
      "license": {
        "value": "MIT",
        "source": "https://github.com/exposedev/expose/blob/master/LICENSE.md"
      },
      "latestRelease": {
        "value": "3.2.4 (2026-09-17)",
        "source": "https://github.com/exposedev/expose/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a free account for the auth token",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "install": {
          "value": "expose CLI (PHP PHAR or Composer)",
          "source": "https://expose.dev/docs/getting-started/installation",
          "status": "documented"
        },
        "firstCommand": {
          "value": "expose token <TOKEN>\nexpose share http://localhost:3000",
          "source": "https://expose.dev/docs/getting-started/sharing-your-first-site",
          "status": "documented"
        },
        "urlType": {
          "value": "Random subdomain per connection on the free plan",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "accessControl": {
          "value": "Basic auth (--basicAuth); pricing lists access control under Pro",
          "source": "https://expose.dev/docs/client/basic-authentication",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Free connections are time-limited (length not documented)",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://expose.dev/docs/getting-started/authentication",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); TCP port sharing is Pro",
          "source": "https://expose.dev/docs/client/sharing",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Per-connection time limit (length not published); single EU server (Germany); random URLs",
          "source": "https://expose.dev/",
          "status": "documented"
        }
      }
    },
    {
      "id": "frp",
      "name": "frp",
      "vendor": "fatedier (open source)",
      "homepage": "https://github.com/fatedier/frp",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "Apache-2.0",
        "source": "https://github.com/fatedier/frp/blob/dev/LICENSE"
      },
      "latestRelease": {
        "value": "v0.71.1 (2026-10-14)",
        "source": "https://github.com/fatedier/frp/releases"
      },
      "facts": {
        "account": {
          "value": "No; you run frps on your own server",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "install": {
          "value": "frps on a server with a public IP; frpc on your machine (release binaries)",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "firstCommand": {
          "value": "./frps -c ./frps.toml (on the server)\n./frpc -c ./frpc.toml",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "urlType": {
          "value": "Your server's IP and remotePort for TCP/UDP; your own domain (customDomains or subdomain) for HTTP/HTTPS",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone who reaches the server port or domain; STCP/XTCP proxies only to visitors with the secret key",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "accessControl": {
          "value": "HTTP basic auth (httpUser/httpPassword) on http proxies; secretKey for STCP/XTCP visitors; token or OIDC authenticates clients, not visitors",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "protocols": {
          "value": "TCP, UDP, HTTP, HTTPS; secret STCP and peer-to-peer XTCP modes",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No service tier; you run frps on your own server",
          "source": "https://github.com/fatedier/frp",
          "status": "documented"
        }
      }
    },
    {
      "id": "localxpose",
      "name": "LocalXpose (free)",
      "vendor": "LocalXpose",
      "homepage": "https://localxpose.io",
      "verifiedAt": "2026-10-14",
      "facts": {
        "account": {
          "value": "Yes: a free account and access token",
          "source": "https://localxpose.io/docs",
          "status": "documented"
        },
        "install": {
          "value": "loclx CLI or GUI (binary, snap, or npm)",
          "source": "https://localxpose.io/docs",
          "status": "documented"
        },
        "firstCommand": {
          "value": "loclx account login\nloclx tunnel http",
          "source": "https://localxpose.io/docs",
          "status": "documented"
        },
        "urlType": {
          "value": "Unique subdomain on the free plan; custom subdomains and custom domains on Pro",
          "source": "https://localxpose.io/pricing",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://localxpose.io/docs/tunnels/http",
          "status": "documented"
        },
        "interstitial": {
          "value": "Yes, an interstitial warning page on the free Starter plan",
          "source": "https://localxpose.io/pricing",
          "status": "documented"
        },
        "accessControl": {
          "value": "Basic auth (--basic-auth), key auth with an X-TOKEN header (--key-auth), IP whitelist (--ip-whitelist)",
          "source": "https://localxpose.io/docs/tunnels/http/http-plugins",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Free tunnels are time-limited (length not published)",
          "source": "https://localxpose.io/pricing",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://localxpose.io/docs/tunnels/http/http-plugins",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S) on the free plan; TCP, TLS, UDP on Pro",
          "source": "https://localxpose.io/pricing",
          "status": "documented"
        },
        "freeLimits": {
          "value": "2 active HTTP/HTTPS tunnels; time limits; interstitial warning page",
          "source": "https://localxpose.io/pricing",
          "status": "documented"
        }
      }
    },
    {
      "id": "pangolin",
      "name": "Pangolin",
      "vendor": "Fossorial",
      "homepage": "https://pangolin.net",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "AGPL-3.0",
        "source": "https://github.com/fosrl/pangolin/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "1.24.0 (2026-09-30)",
        "source": "https://github.com/fosrl/pangolin/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a Pangolin Cloud account, or the admin account on your own server",
          "source": "https://docs.pangolin.net/about/pangolin-cloud-vs-self-hosted",
          "status": "documented"
        },
        "install": {
          "value": "Pangolin CLI or Newt as the site connector; self-hosting adds a Linux server with a public IP and a domain",
          "source": "https://docs.pangolin.net/about/pangolin-cloud-vs-self-hosted",
          "status": "documented"
        },
        "firstCommand": {
          "value": "pangolin up site --id <ID> --secret <SECRET> --endpoint https://app.pangolin.net\nThen add a public HTTPS resource in the dashboard",
          "source": "https://docs.pangolin.net/manage/sites/install-site",
          "status": "documented"
        },
        "urlType": {
          "value": "A hostname on a domain you add; provided domains (.hostlocal.app, .tunneled.to) on paid Cloud plans",
          "source": "https://docs.pangolin.net/manage/domains",
          "status": "documented"
        },
        "publicReach": {
          "value": "Visitors who pass the resource's authentication; Pangolin SSO is on by default",
          "source": "https://docs.pangolin.net/manage/resources/public/authentication",
          "status": "documented"
        },
        "interstitial": {
          "value": "A Pangolin login page for unauthenticated visitors",
          "source": "https://docs.pangolin.net/manage/resources/public/authentication",
          "status": "documented"
        },
        "accessControl": {
          "value": "SSO and identity providers, users and roles, PIN, passcode, email OTP, header auth, share links, IP/geo/path rules",
          "source": "https://docs.pangolin.net/manage/resources/public/authentication",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Yes. Share links take an expiration or never expire; deleting a link revokes it",
          "source": "https://docs.pangolin.net/manage/access-control/links",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://docs.pangolin.net/manage/access-control/links",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S), browser SSH/RDP/VNC; raw TCP/UDP on self-hosted servers, without Pangolin authentication",
          "source": "https://docs.pangolin.net/manage/resources/public/raw-resources",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Cloud Basic: 5 users, 5 sites, 5 domains, 15 public resources; Community Edition is free to self-host",
          "source": "https://pangolin.net/pricing",
          "status": "documented"
        }
      }
    },
    {
      "id": "sish",
      "name": "sish",
      "vendor": "sish (open source)",
      "homepage": "https://github.com/antoniomika/sish",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "MIT",
        "source": "https://github.com/antoniomika/sish/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v2.24.1 (2026-10-09)",
        "source": "https://github.com/antoniomika/sish/releases"
      },
      "facts": {
        "account": {
          "value": "No, on your own server; your SSH public key goes in its pubkeys directory",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "install": {
          "value": "Nothing beyond an SSH client; the sish server (Docker or binary) on your host",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "firstCommand": {
          "value": "docker run ... antoniomika/sish:latest --domain=example.com (on your server)\nssh -p 2222 -R 80:localhost:8080 example.com",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "urlType": {
          "value": "Chosen or random subdomain of your sish domain; host:port for TCP",
          "source": "https://docs.ssi.sh/forwarding-types",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL; TCP aliases only to authenticated SSH users",
          "source": "https://docs.ssi.sh/forwarding-types",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "accessControl": {
          "value": "HTTP basic auth per forwarded host; server-wide IP and country allowlists; TCP aliases limited to listed SSH key fingerprints",
          "source": "https://docs.ssi.sh/cli",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Optional per-tunnel deadline (deadline=15m or a timestamp)",
          "source": "https://docs.ssi.sh/cheatsheet",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S), WS(S), TCP, TCP aliases, SNI passthrough",
          "source": "https://github.com/antoniomika/sish",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No free hosted tier; self-host, or use the managed tuns.sh with pico+",
          "source": "https://pico.sh/tuns",
          "status": "documented"
        }
      }
    },
    {
      "id": "chisel",
      "name": "chisel",
      "vendor": "chisel (open source)",
      "homepage": "https://github.com/jpillora/chisel",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "MIT",
        "source": "https://github.com/jpillora/chisel/blob/master/LICENSE"
      },
      "latestRelease": {
        "value": "v1.12.0 (2026-08-29)",
        "source": "https://github.com/jpillora/chisel/releases"
      },
      "facts": {
        "account": {
          "value": "No; you run chisel server yourself",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "install": {
          "value": "chisel binary (client and server in one)",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "firstCommand": {
          "value": "chisel server --port 8080 --reverse (on your server)\nchisel client http://<server>:8080 R:3000:localhost:3000",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "urlType": {
          "value": "<server>:<port> on your chisel server",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "publicReach": {
          "value": "Anyone who can reach the reverse port on your server",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "interstitial": {
          "value": "None (raw TCP)",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "accessControl": {
          "value": "Not documented for visitors; --auth and --authfile authenticate tunnel clients",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "protocols": {
          "value": "TCP and UDP over HTTP, encrypted with SSH; SOCKS5",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No service tier; you run chisel server (the public demo server is gone)",
          "source": "https://github.com/jpillora/chisel",
          "status": "documented"
        }
      }
    },
    {
      "id": "rathole",
      "name": "rathole",
      "vendor": "rathole (open source)",
      "homepage": "https://github.com/rathole-org/rathole",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "Apache-2.0",
        "source": "https://github.com/rathole-org/rathole/blob/main/LICENSE"
      },
      "latestRelease": {
        "value": "v0.5.0 (2023-10-01)",
        "source": "https://github.com/rathole-org/rathole/releases"
      },
      "facts": {
        "account": {
          "value": "No; you run the rathole server yourself",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "install": {
          "value": "rathole binary or Docker image, on a server with a public IP and on your machine",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "firstCommand": {
          "value": "./rathole server.toml (on the server)\n./rathole client.toml",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "urlType": {
          "value": "Your server's address and the service's bind_addr port",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone who connects to the port",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "interstitial": {
          "value": "None (raw TCP)",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "accessControl": {
          "value": "Not documented for visitors; a mandatory per-service token authenticates clients",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "protocols": {
          "value": "TCP and UDP; client-server transport over TCP, TLS, or Noise",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No service tier; you need your own server with a public IP",
          "source": "https://github.com/rathole-org/rathole",
          "status": "documented"
        }
      }
    },
    {
      "id": "tunnelmole",
      "name": "Tunnelmole",
      "vendor": "Tunnelmole (open source)",
      "homepage": "https://tunnelmole.com",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "MIT",
        "source": "https://github.com/robbie-cahill/tunnelmole-client/blob/main/LICENSE.md"
      },
      "latestRelease": {
        "value": "2.4.0 (2025-06-05)",
        "source": "https://www.npmjs.com/package/tunnelmole"
      },
      "facts": {
        "account": {
          "value": "No",
          "source": "https://tunnelmole.com",
          "status": "documented"
        },
        "install": {
          "value": "Node.js package or prebuilt tmole binary",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "firstCommand": {
          "value": "npx tunnelmole 3000",
          "source": "https://tunnelmole.com",
          "status": "documented"
        },
        "urlType": {
          "value": "Random tunnelmole.net subdomain that contains your IP address; custom subdomains are paid",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "accessControl": {
          "value": "Not documented",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S)",
          "source": "https://github.com/robbie-cahill/tunnelmole-client",
          "status": "documented"
        },
        "freeLimits": {
          "value": "Not published; paid plans list custom subdomains and no tunnel timeouts",
          "source": "https://dashboard.tunnelmole.com",
          "status": "documented"
        }
      }
    },
    {
      "id": "boringproxy",
      "name": "boringproxy",
      "vendor": "boringproxy (open source)",
      "homepage": "https://github.com/boringproxy/boringproxy",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "MIT",
        "source": "https://github.com/boringproxy/boringproxy/blob/master/LICENSE"
      },
      "latestRelease": {
        "value": "v0.10.0 (2023-01-04)",
        "source": "https://github.com/boringproxy/boringproxy/releases"
      },
      "facts": {
        "account": {
          "value": "No; boringproxy server creates the admin login on first run",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "install": {
          "value": "boringproxy binary (server and client in one); OpenSSH 7.8 or later",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/installation.md",
          "status": "documented"
        },
        "firstCommand": {
          "value": "boringproxy server -admin-domain <domain> (on the server)\nboringproxy client -server <domain> -user <user> -token <token> -client-name <name>\nThen add a tunnel in the web UI",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "urlType": {
          "value": "A domain you point at the server, such as a subdomain of a wildcard DNS record",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL, unless the tunnel is password-protected",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "accessControl": {
          "value": "Optional HTTP basic auth per tunnel (Password Protect)",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S); raw TCP with Allow External TCP",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/usage.md",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No service tier; the public demo instance is down",
          "source": "https://github.com/boringproxy/boringproxy.io/blob/master/pages/index.md",
          "status": "documented"
        }
      }
    },
    {
      "id": "inlets",
      "name": "inlets (inlets Pro)",
      "vendor": "OpenFaaS Ltd",
      "homepage": "https://inlets.dev",
      "verifiedAt": "2026-10-14",
      "license": {
        "value": "Commercial",
        "source": "https://github.com/inlets/inlets-pro/blob/master/EULA.md"
      },
      "latestRelease": {
        "value": "0.12.0 (2026-10-08)",
        "source": "https://github.com/inlets/inlets-pro/releases"
      },
      "facts": {
        "account": {
          "value": "Yes: a paid subscription and license key",
          "source": "https://github.com/inlets/inlets-pro",
          "status": "documented"
        },
        "install": {
          "value": "inlets-pro binary (client and server in one); inletsctl to create the tunnel server",
          "source": "https://github.com/inlets/inlets-pro",
          "status": "documented"
        },
        "firstCommand": {
          "value": "inletsctl create --provider digitalocean --region lon1 --access-token-file <key-file> --letsencrypt-domain <domain>\nPoint a DNS A record for <domain> at the server IP\ninlets-pro http client --url <URL> --token <TOKEN> --upstream <domain>=http://127.0.0.1:3000",
          "source": "https://docs.inlets.dev/tutorial/automated-http-server/",
          "status": "documented"
        },
        "urlType": {
          "value": "Your own domain, with a Let's Encrypt certificate on your tunnel server",
          "source": "https://docs.inlets.dev/tutorial/automated-http-server/",
          "status": "documented"
        },
        "publicReach": {
          "value": "Public: anyone with the URL, unless OAuth or an IP allowlist is set",
          "source": "https://inlets.dev/pricing",
          "status": "documented"
        },
        "interstitial": {
          "value": "Not documented",
          "source": "https://docs.inlets.dev/tutorial/automated-http-server/",
          "status": "documented"
        },
        "accessControl": {
          "value": "OAuth on HTTP tunnels (Personal: GitHub, Signet); IP allowlist",
          "source": "https://inlets.dev/pricing",
          "status": "documented"
        },
        "linkExpiry": {
          "value": "Not documented",
          "source": "https://docs.inlets.dev/tutorial/automated-http-server/",
          "status": "documented"
        },
        "singleUse": {
          "value": "Not documented",
          "source": "https://docs.inlets.dev/tutorial/automated-http-server/",
          "status": "documented"
        },
        "protocols": {
          "value": "HTTP(S), WebSockets, SSE, gRPC; TCP",
          "source": "https://inlets.dev/pricing",
          "status": "documented"
        },
        "freeLimits": {
          "value": "No free tier; Personal is $25/month for up to 5 tunnels, no commercial use",
          "source": "https://inlets.dev/pricing",
          "status": "documented"
        }
      }
    }
  ],
  "changelog": [
    {
      "date": "2026-09-30",
      "tool": "cloudflare-quick-tunnel",
      "change": "Cloudflare's quick tunnel documentation adds --allowed-mail, an optional email one-time PIN in front of a quick tunnel.",
      "source": "https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/"
    },
    {
      "date": "2024-06-13",
      "tool": "ngrok",
      "change": "ngrok requires card verification before free accounts can open TCP endpoints, citing reports of its agent being bundled into malware.",
      "source": "https://ngrok.com/blog/tcp-endpoints-require-verification"
    },
    {
      "date": "2023-02-28",
      "tool": "ngrok",
      "change": "ngrok describes the anti-phishing measures applied to free accounts, including the browser warning page.",
      "source": "https://ngrok.com/blog/how-ngrok-actively-combats-phishing-attacks"
    }
  ]
}
