
HTTPS localhost de confianza — CA local, /etc/hosts, uso compartido en LAN mDNS, proxy inverso. Mapea https://name.local → localhost:port
HTTPS real para desarrollo local — con TUI y uso compartido en LAN.
mkdev ejecuta HTTPS de confianza en *.local. Un único binario Go: autoridad de certificados + proxy inverso + /etc/hosts + difusión mDNS + un TUI completo.
Qué lo hace diferente:
https://app.local desde tu teléfono o cualquier dispositivo en la misma Wi-Fi.mkdev sin argumentos te lleva directo.internal/safeexec). Sin suplantación basada en PATH, sin atajos escribibles por el grupo.knownHost explícita. Ni comodín ni pregenerados.mkdev install # CA + trust + daemon service + menu bar autostart
mkdev add myapp localhost:3000 # routes https://myapp.local → localhost:3000
curl https://myapp.local # 200 from your local app
install es de una sola pasada: genera la CA, la confía en el almacén del sistema, instala y habilita el servicio de usuario del daemon (launchd / systemd), registra la barra de menú para que se inicie al iniciar sesión y la lanza inmediatamente cuando hay una sesión gráfica presente. El daemon es el propietario del proxy; el TUI (mkdev sin argumentos) y mkdev add | remove | list se comunican con él a través de ~/.mkdev/daemon.sock.

La función estrella de mkdev. Comparte una ruta con cualquier dispositivo en la misma Wi-Fi con TLS real — sin advertencias, sin servicio de túnel.
s para cambiar la columna SHARE a LAN.<name>.local → la IP LAN de esta máquina.https://<name>.local. Una vez que el dispositivo confía en la CA de mkdev (una sola vez), no hay advertencias..local se difunden por mDNS. Otros TLD siguen haciendo de proxy pero no son alcanzables en LAN por nombre.s es en vivo — el anuncio mDNS y la ACL del lado LAN se actualizan en la siguiente solicitud. Sin reinicio.brew install venkatkrishna07/tap/mkdev
Actualiza más tarde:
brew update
brew upgrade mkdev
go install github.com/venkatkrishna07/mkdev/cmd/mkdev@latest
Actualiza a una versión específica:
go install github.com/venkatkrishna07/mkdev/cmd/[email protected]
Los binarios precompilados para macOS (Intel + Apple Silicon), Linux (amd64 + arm64) y Windows (amd64) se publican en la página de Releases. Cada versión incluye checksums.txt más una firma cosign sin clave (checksums.txt.sig + .pem) — consulta SECURITY.md#verifying-releases para el comando de verificación.
En macOS, si Gatekeeper bloquea un binario descargado directamente:
xattr -d com.apple.quarantine ./mkdev
git clone https://github.com/venkatkrishna07/mkdev.git
cd mkdev
task build
cp bin/mkdev ~/bin/ # or /usr/local/bin
Requiere Go 1.25+.
mkdev install # CA, trust, daemon service, bar autostart — one command
mkdev # launch TUI
Después de install, el daemon se ejecuta en segundo plano y aparece la barra de menú (macOS, Linux GNOME/KDE, Windows). La barra muestra el estado del daemon, la lista de rutas y los interruptores por ruta de habilitar / compartir en LAN; Quit cierra la barra sin detener el daemon.
La barra es la interfaz siempre activa. Vive en la bandeja del sistema y se comunica con el daemon a través de ~/.mkdev/daemon.sock. Se inicia al iniciar sesión (autoinicio registrado por install); también se puede ejecutar en primer plano con mkdev bar.
Qué muestra:
mkdev v0.4.0 + PID del daemon + tiempo de actividad + puerto de escucha del proxy.name.tld → target más insignias de sufijo ( · disabled, · LAN).Qué hace (clic en una ruta):
https://name.tld con el manejador predeterminado del sistema.pbcopy / wl-copy / xclip / clip.exe).Enabled de la ruta. Las rutas deshabilitadas permanecen en el almacén pero dejan de pasar por el proxy.Acciones a nivel de barra:
DisableUnit para que launchd / systemd KeepAlive no lo reinicie inmediatamente, y luego envía el apagado a través del socket.Notas:
mkdev daemon stop) detienen limpiamente el daemon supervisado — matar el proceso del daemon directamente hará que launchd / systemd lo reinicie.Reemplaza el binario (brew upgrade / go install ...@latest / nueva descarga). La próxima vez que ejecutes cualquier subcomando mkdev, el binario reconcilia las partes que viven fuera de él: reescribe el plist del daemon / la unidad de systemd y la entrada de autoinicio de la barra para que apunten al nuevo binario, vuelve a aplicar las entradas de /etc/hosts para las rutas habilitadas y vuelve a confiar en la CA si se eliminó. Los avisos de sudo se ejecutan en línea. Si solo tienes el daemon ejecutándose y nunca tocas la CLI, el daemon hace las partes seguras (sin sudo) en su propio inicio y pone en cola el resto hasta el siguiente comando de la CLI.
Volver a ejecutar mkdev install hace lo mismo explícitamente y siempre es seguro — cada paso es idempotente.
Distribuciones Linux detectadas: Debian/Ubuntu (/usr/local/share/ca-certificates), RHEL/Fedora (/etc/pki/ca-trust/source/anchors), Arch (/etc/ca-certificates/trust-source/anchors), openSUSE (/usr/share/pki/trust/anchors).
Firefox usa su propio almacén NSS y aún no está cubierto — Chrome/Safari/Edge/curl/wget del sistema funcionan todos.
<target> acepta cualquiera de estos:
host:port e.g. localhost:3000
http://host[:port]/path e.g. http://localhost:3000/api
https://host[:port]/path e.g. https://gitlab.example.com
Para orígenes HTTPS (p. ej., un GitLab privado en una VPN corporativa), el certificado TLS del origen debe verificarse contra el almacén de confianza del sistema. Las CA privadas necesitan que su raíz se añada al llavero del sistema operativo.
hosts-helper no está pensado para llamarse directamente. add / remove vuelven a invocar el mismo binario bajo sudo para realizar la escritura privilegiada en /etc/hosts.
Nota sobre TLD. Las rutas
.localnecesitan un respondedor mDNS (siempre activo en macOS, disponible en Linux cuandonss-mdnsestá instalado)..test/.dev/.localhostfuncionan en todas partes solo con/etc/hosts. Establecetlden la configuración para que coincida.
La configuración vive en ~/.mkdev/config.toml. Valores predeterminados:
tld = ".local" # appended to bare names in `add`
proxy_port = 443 # binding :443 requires sudo on serve
theme = "auto" # reserved for future TUI
log_retention = "7d" # reserved
log_max_size = "100MB" # reserved
Sobrescribe el directorio de configuración con --home <path> o MKDEV_HOME=....
~/.mkdev/ca/. La clave privada tiene modo 0o400.security), directorio de paquete de CA de Linux + update-ca-*, almacén ROOT de Windows vía crypt32.dll. La integración con el almacén de confianza está adaptada de mkcert (BSD-3) — consulta LICENSE-MKCERT.add, el daemon escribe una ruta en un KV bbolt en ~/.mkdev/state.db y agrega una línea 127.0.0.1 <name>.<tld> a /etc/hosts mediante un subcomando auxiliar invocado con sudo.Esta herramienta instala una CA privada en el almacén de confianza de tu sistema. Cualquiera con acceso de lectura a ~/.mkdev/ca/rootCA-key.pem puede emitir certificados TLS en los que tu máquina confiará. La clave se crea 0o400 (solo lectura para el propietario).
0.0.0.0, pero una ACL de origen de conexión devuelve 403 a las solicitudes LAN hacia cualquier ruta no marcada explícitamente como compartida. Loopback siempre pasa.add / remove invocan sudo para mutar /etc/hosts. Consulta SECURITY.md para el modelo de amenazas y un límite conocido en torno a las rutas auxiliares resueltas con os.Executable().mkdev uninstall # stops + disables daemon, untrusts CA, clears /etc/hosts,
# removes daemon service + bar autostart, wipes ~/.mkdev/
Si algo se queda atascado, abre Keychain Access.app, busca mkdev y elimínalo a mano. Luego grep mkdev /etc/hosts y limpia cualquier resto.
El daemon es el propietario del proxy y del almacén de rutas. Expone una API HTTP local en ~/.mkdev/daemon.sock (solo propietario 0600). El TUI, los subcomandos de la CLI y la barra de menú son todos clientes del daemon — solo el daemon tiene el bloqueo de bbolt.
mkdev install instala el daemon como un servicio de usuario (LaunchAgent de launchd en macOS, --user de systemd en Linux) y lo habilita. Se ejecuta en segundo plano y sobrevive al cierre / inicio de sesión.
mkdev daemon status # installed / enabled / running
mkdev daemon stop # stop + disable (prevents respawn)
curl --unix-socket ~/.mkdev/daemon.sock http://x/v1/status
curl --unix-socket ~/.mkdev/daemon.sock http://x/v1/routes
curl --unix-socket ~/.mkdev/daemon.sock -X POST http://x/v1/routes \
-H 'Content-Type: application/json' \
-d '{"name":"foo","target":"localhost:3000"}'
curl --unix-socket ~/.mkdev/daemon.sock -X DELETE http://x/v1/routes/foo
Próximamente:
/api → 8080, /ws → 9000 en un solo dominio).~/.mkdev/ca/rootCA.pem manualmente en Configuración → Privacidad y seguridad → Certificados → Ver certificados → Autoridades → Importar.proxy_port = 8443 en ~/.mkdev/config.toml y usa https://name.local:8443.mkdev add sigue pidiendo sudo. La caché por sesión de sudo caduca (5 min por defecto). Usa en su lugar la pestaña Domains del TUI — eleva privilegios vía osascript (aviso GUI de macOS) o pkexec (Polkit de Linux)./etc/hosts ya tiene una entrada para ese nombre. mkdev add es idempotente y solo agrega cuando no existe ninguna entrada gestionada por mkdev. Elimina la entrada anterior a mano o elige un nombre diferente.Consulta CONTRIBUTING.md.
La integración del almacén de confianza de mkdev — Keychain/security en macOS, paquete de CA + update-ca-* en Linux, almacén ROOT de crypt32.dll en Windows y las rutas adyacentes a NSS — está adaptada de mkcert de Filippo Valsorda, BSD-3. Sin ese trabajo previo, este proyecto sería sustancialmente más difícil. Consulta LICENSE-MKCERT para la licencia original.
El TUI está construido con Bubble Tea / Bubbles / Lipgloss de Charmbracelet. mDNS vía hashicorp/mdns. KV local vía bbolt.
MIT LICENSE.
| Plataforma | Almacén de confianza | Elevación |
|---|
| macOS | Llavero del sistema (security add-trusted-cert) | sudo / osascript |
| Linux | update-ca-trust / update-ca-certificates / trust extract-compat | sudo / pkexec |
| Windows | Almacén ROOT del sistema vía crypt32.dll | UAC (PowerShell RunAs) |
| Comando | Propósito |
|---|
install | De una sola pasada: CA + confianza + servicio del daemon + autoinicio de la barra. Pasa --no-service para solo CA. |
add <name> <target> | Añade una ruta. Agrega una entrada 127.0.0.1 a /etc/hosts. |
remove <name> | Elimina la ruta y su entrada en /etc/hosts. |
list | Lista las rutas del almacén. |
tui | Lanza el TUI (también el predeterminado al ejecutar sin argumentos). |
daemon serve | Ejecuta el daemon en primer plano (normalmente impulsado por la unidad de servicio). |
daemon stop | Detiene el daemon en ejecución y deshabilita el servicio de usuario. |
daemon status | Informa del estado instalado / habilitado / en ejecución del servicio. |
bar | Lanza la aplicación de barra de menú. Auto-iniciada por install. |
uninstall | Deja de confiar en la CA, elimina las entradas de /etc/hosts, desinstala el daemon + el autoinicio de la barra, borra ~/.mkdev/. |
version | Imprime versión, commit, fecha de compilación. |
completion <bash|zsh|fish|powershell> | Emite el script de completado de shell. |
hosts-helper | Oculto. Invocado vía sudo para mutar /etc/hosts atómicamente. |
| Bandera / env | Efecto |
|---|
--home <path> | Sobrescribe el directorio de estado ~/.mkdev. |
--verbose, -v | Registro a nivel de depuración en stderr. |
--version | Imprime la versión y sale. |
MKDEV_HOME=<path> | Equivalente a --home. |
| Campo | Predeterminado | Notas |
|---|
tld | .local | Se añade automáticamente cuando add <name> no tiene punto. |
proxy_port | 443 | Establécelo en 8443 si tu plataforma no permite que el servicio de usuario se vincule a :443. |
theme | auto | Reservado para el próximo TUI. |
log_retention | 7d | Reservado. |
log_max_size | 100MB | Reservado. |
0.0.0.0:<proxy_port>, emite certificados hoja por SNI bajo demanda usando la CA raíz y hace de proxy inverso hacia el origen configurado.add / remove, sin reinicio.0.0.0.0, pero las solicitudes no loopback reciben 403 a menos que la ruta coincidente esté marcada como compartida — consulta Uso compartido en LAN.Location y Set-Cookie Domain reescritos de vuelta al dominio del proxy para que los clientes no pierdan las credenciales.