Clone-First Swarm: un sistema operativo distribuido mutable


16 de abril de 2026

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:

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:

Capa 2: Syncthing (datos vivos)

Syncthing replica datos que cambian constantemente y no caben bien en git:

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-7c0193cc5957

Si 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:

  1. Instalar NixOS base
  2. git clone [email protected]:user/dotfiles.git ~/dotfiles
  3. Crear hosts/mi-clon/default.nix (las mutaciones)
  4. sudo nixos-rebuild switch --flake ~/dotfiles#mi-clon --impure
  5. colmena 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.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (0)

Sin comentarios todavia. Se el primero!

Deja un comentario