jandresgarcia.dev
Rev. 2026.09

Cómo funciona JAG HQ: un servidor ARM detrás de Tailscale, un centro de control en Backstage manejado con el teclado, CI self-hosted, deploys solo con jag-deploy, logs en vivo y un flujo de agentes guiado por tickets en Plane y SDDs.

AN-03

JAG HQ La plataforma self-hosted donde se construye, despliega y opera cada producto.

Privada · solo en la tailnet

Video 1. JAG HQ, resumen del producto · 0:42

1 VPS

Cada producto, sus runners de CI, Plane y el centro de control en un solo servidor ARM Always Free, detrás de Tailscale.

Cómo funciona

Notas de ingeniería

  • Backstage rehecho como un centro de control que se maneja con el teclado: paleta de comandos ⌘K, navegación j/k y siete ventanas para el muro, proyectos, host, logs, docs y herramientas.
  • Operación en vivo desde la fuente: logs desde Docker a través de un proxy de solo lectura, chequeos del host cada 5 minutos, monitores de uptime y backups diarios con restic.
  • Pensada para agentes: skills, SDDs, handoffs y reglas de la casa viven en el repo. Cada cambio es un ticket en Plane, un worktree por agente y merge solo con CI en verde. Los diagramas de arquitectura se generan desde el código con Archify.

Platform engineeringBackstageCI/CD self-hostedObservabilidadFlujo con agentes

Backstage · Docker Compose · Caddy · Tailscale · Cloudflare Tunnel · Plane · GitHub Actions (self-hosted) · Uptime Kuma · restic · OCI ARM64

Cómo funciona una corrida

  1. Un cambio empieza como un ticket en Plane, que pasa a In Progress apenas arranca el trabajo.
  2. Un agente lo toma en su propio worktree, siguiendo los skills, el SDD y las reglas de la casa del repo.
  3. Abre un pull request con la clave del ticket en el título.
  4. El CI corre en runners arm64 self-hosted en el mismo servidor.
  5. Merge solo con CI en verde. El merge dispara jag-deploy, la única entrada a producción.
  6. Reconstruye y reinicia solo el producto afectado, con rollback listo.
  7. El tráfico público llega a EApply por el túnel; todo lo demás se queda dentro de la tailnet.
  8. El deploy, la salud del host y los logs en vivo aparecen en el muro, y el ticket pasa a Done.

Componentes del sistema

ComponenteQué hace
Dispositivos del dueñoEn la tailnetCódigo deterministaPortátil y celular entran a la tailnet privada por WireGuard. Es la única entrada al servidor.
VisitantesInternet públicoCódigo deterministaLos usuarios públicos solo llegan a EApply, el único producto público.
GitHubRepos · PRs · ActionsCódigo deterministaRepos privados para la plataforma, el centro de control y cada producto. Cada PR lleva la clave de su ticket.
TailscaleTailnet privadaCódigo deterministaSSH y todos los paneles privados solo se alcanzan dentro de la tailnet; el firewall del host descarta lo demás.
CloudflareDNS · TunnelCódigo deterministaDNS y un Cloudflare Tunnel publican EApply sin abrir un puerto de entrada en el servidor.
CaddyTLS · ruteo por hostCódigo deterministaUn reverse proxy termina TLS y enruta cada hostname a su servicio, con reglas solo-tailnet para los paneles privados.
PlaneTickets HQ · EAPP · CLARACódigo deterministaGestión de proyectos self-hosted. El estado del ticket se mueve en tiempo real: In Progress al empezar, el PR enlazado al abrirlo, Done tras el merge y la verificación.
Flujo de agentesSkills · SDD · worktreesCódigo deterministaSkills, SDDs, handoffs y reglas de la casa versionados en el repo, para que cualquier agente tome un ticket sin contexto previo. Un git worktree por agente.
Runners de CISelf-hosted · arm64Código deterministaLos runners de GitHub Actions viven en el mismo servidor: builds arm64 nativos sin costo, con CPU y memoria acotadas para que un build nunca degrade producción.
jag-deployÚnica vía a prod · rollbackCódigo deterministaUn único entrypoint de root despliega o revierte un objetivo a la vez. Nada llega a producción a mano.
Backstage HQCentro de control · ⌘KCódigo deterministaSiete ventanas manejadas con el teclado: el muro, proyectos, salud del host, logs en vivo, docs con arquitectura, conformidad de proyectos e inventario de herramientas.
EApplyProducto públicoCódigo deterministaFrontend, API, workers y un servicio de render como su propio proyecto Compose, publicado por el túnel.
ClaraSolo tailnetCódigo deterministaUn solo contenedor con su propio SQLite, accesible solo desde los dispositivos del dueño.
Salud del hostChequeos cada 5 minCódigo deterministaDisco, contenedores, runners, memoria, carga y certificados revisados cada 5 minutos, más monitores de uptime y alertas.
Datos propiosPostgres · MinIO · RedisDatosBases de datos y almacenamiento de objetos corren en el mismo host, sin servicios gestionados.
Backupsrestic · diarioDatosBackups diarios con restic a Oracle Object Storage.
Secretos centralizadosSOPS · agePlaneadoSiguiente: secretos cifrados en el repo con SOPS y age. Planeado, aún no construido.

Disponibilidad

Abierto a roles senior de AI Engineer y Fullstack, y a construir productos de IA para founders.