Product · Routing
Named URLs by branch.
Every worktree, service, and user gets a stable subdomain of the shape <branch>.<service>.<user>.remoco.dev. Internal .localhost matches the external shape exactly. Copy-paste friendly across Slack, PRs, and Linear.
The URL shape
Remoco normalizes all dev URLs to a four-part hostname. The order is deliberate — most-specific on the left.
<branch>.<service>.<user>.remoco.dev # examples main.web.wiley.remoco.dev # wiley's main worktree, web service pr-42.api.luke.remoco.dev # luke's pr-42 worktree, api service hero-redesign.docs.sara.remoco.dev # sara's hero-redesign branch, docs service
Internal mirror
Swap .remoco.dev for .localhost and the same hostname routes internally via portless. That means:
main.web.wiley.localhostworks on the workstation when you're SSH'd inmain.web.wiley.remoco.devworks from anywhere (subject to access policy)
No mental translation. The overlay, the debugger, your browser history, and Slack links all use the same shape.
How it works
Each user has a Cloudflare named tunnel with a wildcard DNS record *.<user>.remoco.dev. Cloudflared rewrites Host: before forwarding to localhost:8081, where the injector proxies through portless. Portless matches on Host: header to route to the right container port.
Cloudflare Pro Total TLS covers the nested wildcard — free-tier TLS only covers one level.
Publishing
$ remoco expose main.web.wiley --access=public # appends ingress rule, adds DNS, prints URL # live at https://main.web.wiley.remoco.dev $ remoco hide main.web.wiley # removes ingress + Access app + DNS record
Who controls the namespace
- User namespace (
<user>): your shortname, claimed on signup, free forever while active - Service namespace (
<service>): declared per-repo inremoco.yml, e.g.web,api,docs - Branch namespace (
<branch>): any git branch name, slugified
.<org>.remoco.dev zone with all users nested inside it. Collab friction: zero. Custom domains ship in v0.3.