NeedPorts gives your machine dedicated public ports over an outbound tunnel, so services behind CGNAT, on a GPU host, or on any network that blocks inbound ports become reachable. Built-in templates map a port to a known service in a single command.
Install the client, then map one of your assigned public ports to a local service. The template sets the right local port for you, and a restart applies it:
sudo needports use jellyfin <assigned-port>
sudo needports restart
For anything without a template, use the custom form with an explicit local port and label:
sudo needports expose custom --public-port <assigned-port> --local-port <local-port> --name "My app" --confirm
home-assistant (local 8123) → Home Assistant dashboardminecraft (local 25565) → Minecraft Java serverhttp (local 80) → Plain HTTP web servicehttps (local 443) → HTTPS web servicessh (local 22) → SSH serverplex (local 32400) → Plex Media Serverjellyfin (local 8096) → Jellyfin media servernavidrome (local 4533) → Navidrome music serverimmich (local 2283) → Immich photo serverollama (local 11434) → Ollama APIopen-webui (local 8080) → Open WebUIjupyter (local 8888) → Jupyter notebook/labList them any time on an installed client with needports templates.
Manual reverse-proxy or VPS relay setups mean editing config files, managing certificates, and keeping a server running. NeedPorts hands you dedicated ports and a stable public endpoint, and the template commands handle the local mapping, so you spend a minute instead of an afternoon.
Publishing a service makes it reachable from the public internet. Only expose services you intend to be public, protect them with their own authentication, and be especially careful with SSH, dashboards, Jupyter, Ollama, and Open WebUI. Publish one service per port rather than opening a whole machine.
NeedPorts plans start at $5/month or $30/year for 25 dedicated ports, enough to publish several self-hosted services from one machine.