Your phone. Your teammate's laptop. app.yourdomain.com — not a URL that resets.
Run it privately for your team — or flip one flag and make it public. Same domain either way.
dynamoip is an open-source npm tool for macOS and Linux. It gives your local services real domain names with trusted HTTPS — accessible on your LAN or exposed to the public internet via Cloudflare Tunnel. No port forwarding. No firewall rules. Configure once, one command every time. Three modes: Quick (mDNS .local), Pro (Cloudflare DNS + Let's Encrypt, LAN only), Max (Cloudflare Tunnel, public internet).
/01
Camera permissions, PWA install prompts, touch events, geolocation — none of it surfaces the same way on localhost. You need a real HTTPS URL on a real device. Configure once. Test on your phone every time with the same URL.
192.168.1.105:3000 is not a URL. dynamoip gives everyone on the network a real link — LAN only, no traffic leaving your office, no port forwarding, no VPN. Set it up once. Share the link every standup.
Home Assistant, Grafana, Plex, Jellyfin — give them all real subdomains with trusted HTTPS. Bookmark them. Open from your phone. Configure once, trusted everywhere on your network. No more clicking through browser security warnings.
Webhook endpoint in dev? Client demo from your laptop? Staging environment you want to share? Max mode gives you a real, persistent URL — not a random ngrok subdomain that expires and breaks every webhook you registered.
/02
Configure once. Works every time after that.
01 —
One command adds dynamoip as a dev dependency. It never runs in production — it's a tool for you, not your users.
npm i -D dynamoip
02 —
Drop a config JSON, add env vars, add an npm script. Five minutes — once. You never touch it again. Add "tunnel": true to go public.
03 —
npm run dev:proxy. Your domains go live instantly — on your LAN or the internet. Same command, same domain, every time.
npm run dev:proxy
/03
Local dev to public internet — same tool, same domain.
Your services on the public internet. No port forwarding. No firewall rules. No inbound ports. cloudflared installs itself. Works from anywhere.
Uses your real domain. Sets Cloudflare DNS A records and issues a wildcard cert. Every device on your LAN trusts it — no CA install on phones or tablets. LAN only. No tunnel.
Requires: Cloudflare domain + API token
No domain needed. Broadcasts .local hostnames on your LAN via mDNS with a self-signed cert from mkcert. Zero accounts. Zero Cloudflare. LAN only. No tunnel.
Requires: mkcert, sudo
/04
Configure once. One command every time after that.
— one-time setup · ~5 min —
One command. Never runs in production.
npm install --save-dev dynamoip
Pick your mode. Expand to see the config.
{
"baseDomain": "yourdomain.com",
"tunnel": true,
"domains": {
"app": 3000,
"api": 4000
}
}Requires: Cloudflare API token with Zone:DNS:Edit + Account:Cloudflare Tunnel:Edit
{
"baseDomain": "yourdomain.com",
"domains": {
"app": 3000,
"api": 4000
}
}Requires: Cloudflare API token with Zone:DNS:Edit. No tunnel — traffic stays on your LAN.
{
"domains": {
"app": 3000
}
}No Cloudflare. No domain. Just mkcert + mDNS. Domains become app.local — LAN only, no tunnel.
One line. You run this command forever after.
"scripts": {
"dev:proxy": "dynamoip --config dynamoip.config.json"
}For Pro and Max modes. Not needed for Quick mode.
CF_API_TOKEN=your_cloudflare_api_token CF_EMAIL=you@example.com # Pro mode only
— then, every time —
npm run dev:proxy
Domains go live in seconds. Same domain. Every time. No reconfiguring.
Pro / Quick modes: use sudo npm run dev:proxy(ports 80/443 need root — Max mode doesn't)
/05
Runnable Docker projects. Clone, run one command, done.
Two services exposed to the public internet via Cloudflare Tunnel. No port forwarding. Works on macOS, Linux, Windows.
Two services on your LAN with your real domain and Let's Encrypt cert. No tunnel — traffic stays on your network.