# devhost: Ink TUI + Caddy :80 multi-project .localhost manager

Source: https://www.michaelchurley.com/blog/devhost-ink-tui-caddy-port80-multihost  
Published: 2026-06-22  
Author: Michael C. Hurley  
Tags: devhost, caddy, ink, tui, bun, localhost, local-dev, reverse-proxy, hosts-file, cli, react, michaelmonetized

![DevHost Manager TUI](/blog/devhost-ink-tui-caddy-port80-multihost/screenshots/tui-manager.png)

## Who

I run a pile of Next/Bun apps on one Mac and got tired of remembering which project owns which port — and of typing `localhost:3xxx` when the hostname should just be the project name.

## What

Private **michaelmonetized/devhost** · v1.0.0 · HEAD `db69995` · **1** commit (+1426 / 14 files). Bun CLI + Ink/React TUI that:

1. `devhost add` — reads `package.json` name, requires `scripts.dev`, assigns next port from **3001**, registers `<name>.localhost`
2. Writes `~/.config/devhost/config.json` + auto Caddyfile + marker-bounded `/etc/hosts` block
3. `devhost start` — ensures Caddy, spawns `bun run dev --port N` (env `PORT`/`HOSTNAME`), tracks PID, opens `http://<name>.localhost`
4. Bare `devhost` — Ink manager: start/stop/open + Caddy toggle

![Architecture](/blog/devhost-ink-tui-caddy-port80-multihost/screenshots/architecture.png)

![Hosts + Caddyfile](/blog/devhost-ink-tui-caddy-port80-multihost/screenshots/hosts-caddyfile.png)

## Where

github.com/michaelmonetized/devhost (**private**). No product domain. Config lives at `~/.config/devhost/`. On pack machine m1Pro13 the live config still has **bestwnc-com.localhost → :3001**. Sibling story: **bundx-init** patches Next repos for **HTTPS** `.localhost` on **:443**; devhost is the **HTTP :80 multi-host lifecycle TUI**.

![Sibling vs bundx-init](/blog/devhost-ink-tui-caddy-port80-multihost/screenshots/sibling-vs-bundx-init.png)

## When

**2026-02-15** — sole commit `db69995` Initial commit (Caddy + Ink TUI + CLI + hosts + ports). Queue `pushed_at` 2026-06-22 (nightly/metadata push; tree still one commit). No follow-up features in git.

![Commit arc](/blog/devhost-ink-tui-caddy-port80-multihost/screenshots/commit-arc.png)

## Why

Port roulette does not scale past three apps. A marker-bounded hosts block + one Caddyfile + a TUI that knows PIDs is the boring operator loop I actually run. HTTP on :80 is intentional — this is not the Clerk-friendly HTTPS path (that's bundx-init).

**Engagement Q:** Do you want a TUI that owns `/etc/hosts` + Caddy :80 — or a one-shot installer that patches each Next repo for HTTPS `.localhost`?
