eno
ambient localhost
myapp.localhost → your app, running
Quick Start
# Install
curl -fsS https://eno.javan.us/install | sh
# Register an app
eno add ~/Code/myapp
# Visit in browser
open http://myapp.localhost
How It Works
When you visit myapp.localhost, eno:
- Receives the request (port 80 forwards to the daemon)
- Starts your app if it's not already running
- Proxies the request to your app's dev server
- Stops idle apps after 15 minutes
No DNS config needed—.localhost resolves locally per RFC 6761.
Usage
Register
eno add | Current directory |
eno add ~/Code/api | Specific path |
eno add -n api | Custom name |
eno add -c "npm run dev" | Custom command |
eno add -a "*.myapp" | Subdomain alias |
Manage
eno list | Show registered apps |
eno start [app] | Start an app |
eno stop [app] | Stop an app |
eno restart [app] | Restart an app |
eno logs [app] | Tail logs |
eno remove [app] | Unregister an app |
[app] accepts a name or path. Defaults to current directory.
System
eno update | Check for updates |
eno service install | Install daemon |
eno service uninstall | Remove daemon |
eno service status | Daemon status |
Auto-detection
eno detects common application types and starts an appropriate development server automatically. Or, specify a custom command with eno add -c "command".
Configuration
Apps live in ~/.config/eno/apps.json:
{
"myapp": {
"path": "/Users/you/Code/myapp",
"command": "npm run dev"
},
"multi-tenant": {
"aliases": ["*.multi-tenant"],
"path": "/Users/you/Code/multi-tenant",
"command": "bin/dev"
}
}
The command and aliases fields are optional. Aliases are subdomain patterns—*.myapp routes anything.myapp.localhost to the app.
Paths
~/.config/eno/apps.json | App registry |
/etc/pf.anchors/eno | pf anchor rules (macOS) |
~/.local/state/eno/daemon.log | Daemon logs |
~/.local/state/eno/*.fifo | App log streams |