Local development, upgraded

Your app deserves a real URL, even on your laptop

Stable HTTPS domains for local development. No ports*. No /etc/hosts. No certificate warnings. One command and you're there.

Install
curl -fsSL https://antra.iifelse.com/install.sh | bash
or brew install ifelse-codes/antra/antra
*Clean URLs (https://myapp.localhost) use ports 443/80, which need admin rights. The first run asks once (Use port 443? [Y/n]) and needs your password; the proxy then drops admin rights. Say no and Antra serves https://myapp.localhost:8443.
Pin a version for teams/CI: curl -fsSL https://antra.iifelse.com/install.sh | ANTRA_VERSION=v0.6.6 bash

The problem

Local development still looks like 2009.

What you got

  • localhost:5173
  • A red lock and "proceed anyway"
  • A spreadsheet of ports
  • "This is not a secure context"
  • "wait, which port was auth on?"

What you wanted

  • A real URL
  • HTTPS that just works
  • Multiple services, one address
  • Cookies, Service Workers, WebCrypto
  • A teammate can hit the same app

Capabilities

Everything the workaround stack does, minus the work.

01

One command

antra run --domain myapp.localhost -- pnpm dev. That's it.

02

Real HTTPS

Local CA, SNI certs, zero browser warnings. One-time trust, then forget — no sudo needed (macOS uses your login keychain).

03

No ports

Visit https://myapp.localhost. No :5173. No :3000. Done. (The first run asks once to use port 443 and needs your password — say no and Antra serves :8443.)

04

HMR works

Transparent WebSocket tunnel. Vite, Next, Rails, anything.

05

Multi-app routing

Run antra run N times. Each app gets its own domain. The daemon handles it.

06

Project config

Drop an antra.toml. Run antra dev. The whole team gets the same setup.

domain = "myapp.localhost"

[server]
command = "pnpm"
args = ["dev"]
port = 5173

Architecture

A daemon, a cert cache, and a route table. That's the whole system.

Browser │ https://myapp.localhost ▼ ┌──────────────────────────────────────────┐ │ Antra daemon │ │ │ │ :80 HTTP → HTTPS redirect │ │ :443 TLS termination (SNI → leaf cert) │ │ │ │ Route table │ │ myapp.localhost → 127.0.0.1:5173 │ │ api.localhost → 127.0.0.1:8080 │ └──────────────────────┬───────────────────┘ │ X-Forwarded-* ▼ Your process

In practice

One command. A real URL. Your process unchanged.

Terminal
$ antra run --domain myapp.localhost -- pnpm dev ✓ Domain resolved: myapp.localhost ✓ Proxy ready ✓ HTTPS ready ✓ Route registered → https://myapp.localhost

Comparison

Antra vs the usual suspects.

localhost:port mkcert + Caddy ngrok portless Antra
Stable local HTTPS URL — Manual ✗ public ✓ ✓
No browser warning — Manual ✓ ✓ ✓ (Linux: one certutil line)
Works offline ✓ ✓ ✗ ✓ ✓
Traffic stays on your machine ✓ ✓ ✗ ✓ ✓
No cloud account ✓ ✓ ✗ ✓ ✓
Any language / runtime ✓ ✓ ✓ ✗ Node 24+ ✓
Runtime to install — Caddy ngrok Node 24+ none
HMR / WebSocket ✓ Config-dependent ✓ ✓ ✓
Multi-app routing DIY Config file Extra tunnels ✓ antra run × N
Monorepo / LAN / phone DIY Config file ✓ ✓ Roadmap
HTTP/2 — ✓ ✓ ✓ ✗
Asks before changing your machine n/a n/a n/a ✗ ✓

Get started

Stop typing :5173.

Install Antra. Run your app. Visit a real URL. That's the whole product.

View on GitHub