Skip to main content

Your app has a name. Use it.

routeup gives every app on your machine a stable, browser-trusted HTTPS name, so you can use the same URL every time.

  • Local by default Routes stay on your machine with no account, token, or server.
  • Bring or run the app Proxy an app you already start, or let routeup run its configured command.
  • Inspect and debug Follow status and timing live, with opt-in capture for headers and bodies.
  • Expose when needed Open only the routes or paths you choose through a hosted or self-hosted server.
  • MIT
  • Self-hostable
  • Single Go binary
  • Zero telemetry
~/code/example-app
$ routeup serve
route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
14:02:01  200  req_9f2LmX7qKd3sAw8P  GET      /
14:02:04  204  req_Jz6nR2wL8cP4sD9h  POST     /api/webho...
14:02:08  200  req_Vx2mPq7nH5kR3tY8  GET      /api/users

press Ctrl-C to stop
beforehttp://localhost:3000
afterhttps://example-app.localhost

The route lives in the repo.

Commit the route in routeup.json or in the routeup block of package.json. Names, targets, and public exposure settings stay with the project. Use routeup serve for apps you already run, or bare routeup to start the configured command.

Keep your current dev command.

Start your app as usual, then run routeup serve to serve the configured routes over HTTPS.

routeup.json
{  "name": "example-app",  "targets": [    { "path": "/",    "port": 5173 },    { "path": "/api", "port": 8080 }  ],  "expose": {    "enabled": true,    "paths": ["/api/webhooks/*"]  }}
terminal
$ routeup serve
route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
14:02:01  200  req_9f2LmX7qKd3sAw8P  GET      /
14:02:04  204  req_Jz6nR2wL8cP4sD9h  POST     /api/webhooks/stripe
14:02:08  200  req_Vx2mPq7nH5kR3tY8  GET      /api/users

press Ctrl-C to stop

Pick a recipe.

1 / 8
terminal
$ routeup
routeup
  command pnpm dev --port ${PORT}
  route   example-app
  local   https://example-app.localhost
  target  / -> localhost:59370
  status  waiting for localhost:59370

ready: https://example-app.localhost
routeup.json
{  "name": "example-app",  "command": "pnpm dev --port ${PORT}"}

Where requests go.

Local requests stay on your machine. Public requests reach a routeup server, then return through an encrypted tunnel. routeup forwards both paths to the same loopback targets; some dev servers still need their allowed-host or origin settings to accept the route hostname.

local pathpublic path
your browser
example-app.localhost
public client
example-app.try.routeup.dev
public routeup server
internet-facing TLS
local routeup agent
routes · tunnel
your app
127.0.0.1:3000

your machine opens the tunnel to the public server; there is no router rule or internet-facing port to configure

Going public.

Public exposure is opt-in and needs no port forwarding or router rules. A tokenless try.routeup.dev URL is yours for the session, but is not reserved afterward. A hosted token guarantees the entire your-namespace.routeup.dev namespace for your apps.

no tokenThe URL is yours for the session, but it is not reserved after you disconnect.

A quick URL for right now.

$ routeup serve --expose
route: example-app
local: https://example-app.localhost
public: https://example-app.try.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
press Ctrl-C to stop

Use the try.routeup.dev URL to try public exposure, test a webhook, or open the app on another device. It is released when you stop; you can reclaim it later only if it is still available.

with a tokenA token guarantees that the entire namespace is yours to use.

One home for every app.

$ routeup serve --expose
route: example-app
local: https://example-app.localhost
public: https://example-app.team.routeup.dev
expose: /api/webhooks/*
targets:
  /        http://localhost:5173
  /api     http://localhost:8080

requests: live
press Ctrl-C to stop

A hosted token guarantees that a namespace such as team.routeup.dev is yours. Claim any app name beneath it, for example api.team.routeup.dev and docs.team.routeup.dev.

Request a hosted token

Tokens are issued manually — I'll reply to your request within a day.

.routeup.dev

We send only your email and requested namespace. Privacy

Prefer your own domain? Run the same routeup binary at a domain such as tunnel.example.com, choose its DNS and TLS, then issue tokens scoped to namespaces such as *.team.tunnel.example.com.

Self-hosting guide →

Install routeup.

Install the single binary, run setup once, then give each project a route.

Homebrew

macOS or Linux

Direct installer

Verified release binary

LLM Usage

Use the routeup skill inside your favourite coding agent to set it up.

Agent Skill guide →

One-time setup

Prepare trusted local HTTPS

$ routeup setup

  ✓  certificate authority   created
  ✓  certificate             trusted
  ✓  port 443                ready
  ✓  agent                   started

  routeup is ready
  try: routeup serve example-app --port 3000

Run setup once after installing. It creates and trusts the local CA, prepares port 443, and starts the agent.

Installation details →

Why routeup exists.

[stable names]

Open the same URL every day, even when the framework chooses a different port.

[trusted https]

Exercise secure cookies, service workers, OAuth, and HTTPS-only APIs before deployment.

[one origin]

Put a frontend and API behind one host so browser cookies and CORS behave naturally.

[share on demand]

Open the same app to webhooks, phones, or teammates, then close it with Ctrl-C or routeup stop.

[stable callbacks]

Register one webhook or OAuth callback URL instead of updating the provider whenever a port or tunnel URL changes.

Need help or have an idea?

Found a bug, a missing workflow, or need help getting a route working?

  • Local means localNo account, token, DNS or server call for *.localhost.
  • Capture is opt-inBodies are never retained unless a route asks for it.
  • Live owners hold lifetimeUse Ctrl-C in the foreground or routeup stop for a serve owner.
  • Yours to runMIT License, no CLI telemetry, documented server operations.