Clone-First Swarm: un sistema operativo distribuido mutable
No es un dotfiles. No es un homelab. Es un sistema operativo distribuido donde cada nodo nace identico y muta segun su entorno. Seis maquinas, un repo, tres capas. Lo llamamos el enjambre de clones.
El problema que nadie resuelve bien
Tienes varias maquinas. Un desktop potente, un portatil, un servidor, un VPS, una Raspberry Pi, un movil. Todas corren tu entorno, pero cada una es ligeramente diferente:
- El desktop tiene GPU NVIDIA, 128GB RAM, y mina criptomonedas
- El portatil tiene chip Broadcom roto para WiFi y un HHKB por Bluetooth
- El VPS no tiene monitor, no tiene GPU, tiene 4GB RAM y sirve un blog
- La Pi tiene 1GB RAM, 4 cores ARM, y vigila que el desktop no se muera
- El movil solo quiere sincronizar fotos
La solucion clasica: configurar cada una a mano. La solucion DevOps: Ansible/Puppet/Chef. La solucion NixOS clasica: un repo con configs separadas.
Ninguna escala bien cuando quieres que todas las maquinas sean iguales por defecto pero cada una mute segun su hardware.
Clone-First: ADN + mutaciones
La arquitectura es biologica. Hay un ADN comun (modules/base/) que define TODO lo que comparten
los clones: shell, editor, window manager, compositor, packages, SSH
config, firewall, home-manager. Si lo cambias aqui, cambia en todas las
maquinas.
Luego hay mutaciones (hosts/<hostname>/): lo minimo necesario
para que cada clon funcione en su hardware especifico. IPs, drivers,
servicios locales.
┌──────────────────────────────────────────────────────────┐
│ ADN (modules/base) │
│ │
│ Shell (fish) · Editor (emacs) · WM (xmonad) · Packages │
│ SSH config · Git config · Picom · Home-manager · Fonts │
│ │
│ Comun a TODOS los clones. Cambias aqui, cambia │
│ en las 6 maquinas en el siguiente rebuild. │
└──────────────────────┬────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ aurin │ │ cohete │ │ retropix │
│ │ │ │ │ │
│ GPU │ │ headless │ │ aarch64 │
│ mining │ │ blog │ │ guardian │
│ ollama │ │ headscale │ │ emulador │
│ tts │ │ 22GB clos │ │ WoL │
└─────────┘ └───────────┘ └───────────┘
MUTACION MUTACION MUTACION
La mutacion de cohete es brutal: dotfiles.desktop.enable = false y su closure
pasa de 68GB a 22GB. Todo lo que es GUI (X11, fonts, GNOME, XMonad,
picom) desaparece con una linea. El ADN sigue ahi, simplemente no se
expresa.
Las tres capas
El enjambre tiene tres capas que no se sustituyen entre si:
Capa 1: Git (configuracion)
El flake NixOS vive en un repo git. Cada clon tiene una copia local.
Cuando haces r (fetch + pull + rebuild),
el clon se actualiza al ultimo commit y recompila su sistema.
Git es la fuente de verdad para:
- Modulos NixOS (el ADN)
- Hosts (las mutaciones)
- Scripts, skills, documentacion
- La memoria curada de Ambrosio (MEMORY.md, project*.md)
Capa 2: Syncthing (datos vivos)
Syncthing replica datos que cambian constantemente y no caben bien en git:
- Sesiones de Claude (260MB JSONL que crece cada dia)
- Org-mode (journal, exports)
- Password store (GPG encrypted)
- Fotos del movil (4500+ fotos)
Es peer-to-peer, cifrado, sin servidor central. Cada dato tiene versionado (staggered) para recuperar si algo se machaca.
Capa 3: Colmena (conectividad)
Headscale (Tailscale self-hosted) en el VPS. Cada clon recibe una IP
fija (100.64.0.x) y puede hablar con
cualquier otro, sin importar la red fisica. WireGuard bajo el capo.
El comando colmena unifica todo: colmena ssh macbook desde el campo, colmena exec 'hostname' en todo el enjambre,
colmena ping cohete para latencia.
Los clones que anuncian su subred local (--advertise-routes) hacen de puente: desde el
piso llegas a la Pi del campo sin que la Pi tenga VPN.
┌──────────────────────────────────────────────────────┐
│ CAPA 3: COLMENA (Headscale mesh) │
│ Conectividad. Todos se ven. NAT traversal. │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ CAPA 2: SYNCTHING │ │
│ │ Datos vivos. Sesiones, org, pass, fotos. │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ CAPA 1: GIT │ │ │
│ │ │ Configuracion. ADN + mutaciones. │ │ │
│ │ │ La fuente de verdad. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
Mutaciones concretas
Cada clon nace con el ADN completo. Su fichero hosts/<nombre>/default.nix es la mutacion:
lo que lo hace unico.
| Clon | Mutacion principal | Lineas de mutacion | Closure |
|---|---|---|---|
| aurin | GPU, mining, Ollama, TTS | ~500 | ~45GB |
| cohete | headless, blog, Headscale | ~150 | ~22GB |
| vespino | servidor piso, testing | ~100 | ~45GB |
| macbook | Broadcom hacks, portatil | ~80 | ~45GB |
| retropix | aarch64, guardian, emuladores | ~180 | ~25GB |
Cohete tiene 150 lineas de mutacion. De esas, la que mas impacto tiene es una sola linea:
dotfiles.desktop.enable = false;23GB de closure eliminados. Todo lo que es GUI deja de existir.
Servicios como genes opcionales
Cada servicio del enjambre es un modulo NixOS con mkEnableOption. El clon los activa o no. Es como
un gen que puede expresarse o permanecer dormido:
# Activos por defecto en todos los clones:
dotfiles.tailscale.enable = true; # mesh VPN
dotfiles.desktop.enable = true; # GUI (opt-out con false)
# Opt-in por clon:
dotfiles.ollama.enable = true; # LLMs locales (solo aurin)
dotfiles.tts.enable = true; # voz de Ambrosio (solo aurin)
dotfiles.nix-cache.server.enable = true; # cache binario (solo aurin)
dotfiles.emulatronia.enable = true; # emuladores (aurin + retropix)
dotfiles.retropix-guardian.enable = true; # watchdog (solo retropix)Anadir un servicio nuevo: creas el modulo (modules/services/foo.nix), pones dotfiles.foo.enable = true en el clon que lo
necesite. El resto del enjambre ni se entera.
El sexto clon es una IA
Ambrosio es un agente de Claude con sesion UUID fija (967be28a). Su memoria (MEMORY.md) vive en git.
Su sesion operativa (260MB JSONL) se replica via Syncthing. Puede
ejecutarse en cualquier clon:
cd ~ && claude -r 967be28a-46dd-4925-b62a-7c0193cc5957Si aurin arde, abres macbook, corres ese comando, y Ambrosio sigue con la misma memoria. No es una instancia atada a una maquina. Es un UUID replicado que vive en el enjambre.
Ambrosio tiene skills propias (/deploy,
/share, /dejavu, /checkup), puede desplegar a otros clones via
SSH (colmena exec), y tiene un guardian
hardware (retropix lo enciende via Wake-on-LAN si se cae).
El coste
| Componente | Coste |
|---|---|
| Hetzner VPS | ~4 euros/mes |
| Dominio | ~10 euros/ano |
| Cloudflare | gratis |
| Headscale | gratis |
| NixOS | gratis |
| Syncthing | gratis |
| Total | ~5 euros/mes |
Un sistema operativo distribuido con VPN mesh, 6 clones mutantes, replicacion, IA persistente, blog, tienda, monitoring, emuladores y mining. Por el precio de un cafe.
Anadir un clon nuevo
30 minutos:
- Instalar NixOS base
git clone [email protected]:user/dotfiles.git ~/dotfiles- Crear
hosts/mi-clon/default.nix(las mutaciones) sudo nixos-rebuild switch --flake ~/dotfiles#mi-clon --impurecolmena join(unirse al enjambre)
El clon hereda TODO el ADN: fish con tus aliases, emacs doom, xmonad, alacritty, SSH config, 200+ paquetes. Solo defines lo que es diferente.
Por el enjambre
Lo que empezo como "unos dotfiles" se convirtio en un sistema operativo distribuido donde los clones nacen identicos y mutan segun su entorno. Tres capas (git + syncthing + colmena) que no se sustituyen. Servicios como genes opcionales. Una IA que vuela entre clones.
Es un concepto nuevo porque NixOS lo hace posible: configuracion
declarativa + reproducibilidad + rollback. Sin NixOS, esto seria Ansible
con 10.000 lineas de YAML y rezos. Con NixOS, son modulos Nix con mkIf y mkDefault.
El repo es privado. Si algun dia lo abramos, sera cuando los secretos esten cifrados con SOPS-NIX. Mientras, este post es la documentacion publica.
Por el enjambre de clones.
Comentarios (0)
Sin comentarios todavia. Se el primero!
Deja un comentario