Introduction
Stable, named .localhost URLs for every local dev server, in any language or framework.
aka runs a small reverse proxy on your machine and gives each dev server a name. Your app gets a free port, and you open https://<name>.localhost instead of remembering which port it took.
- python manage.py runserver # http://127.0.0.1:8000
+ aka python manage.py runserver # https://myapp.localhost:1355The URL stays the same across restarts, so bookmarks, cookies, OAuth redirects and test scripts keep pointing at the right app. Two Django or two Angular projects run side by side instead of fighting over 8000 or 4200.
aka is a single static binary with no runtime dependencies. It works with any stack: Node, Python, Ruby, PHP, Go, Rust, Java, .NET, Elixir and more.
Quick start
Install aka, then trust its local certificate authority once, so browsers accept the HTTPS URLs:
aka trustFrom a project directory, run aka with no arguments. It finds the dev command (package.json scripts, manage.py, a Procfile, bin/dev and more) and runs it:
aka
# -> https://<project>.localhost:1355Or give a name and any command:
aka myapp npm run dev # https://myapp.localhost:1355
aka api uvicorn main:app --reload # https://api.localhost:1355
aka ng serve # name inferred from the projectURLs carry :1355 until the proxy can bind port 443. Start it once with sudo to drop the port; aka binds 443, then gives up root:
sudo aka proxy start # https://myapp.localhostHow it works
Each app gets a free port from 4000 to 4999 through the PORT environment variable. Most frameworks read it. For those that don't, such as Vite, Angular, Django, uvicorn and Rails, aka adds the matching flag or variable. Apps that ignore both are still found: aka watches the process tree for listening sockets and the output for printed URLs, and routes to the port the app actually uses.