takana · el martillotakana · the hammer
Un Linux mutable que puedes romper y recuperar, manteniendo su pureza hasta el último bit. A mutable Linux you can break and recover, its purity intact down to the last bit.
01 · descargar01 · download
un archivoone file
imagen USBUSB image
desde el códigofrom source
$ git clone https://git.gioser.net/sergio/takana.git $ cd takana && cargo build --release $ ./target/release/takana --help
full son 8,6 GiB y trae los cinco escritorios: mirada, sway, COSMIC, GNOME y KDE Plasma. Entra en un pendrive de 16 GB. No hay archivo único para esta variante: ése carga el sistema entero en memoria, y 17 GiB de rootfs no entran.
full is 8.6 GiB and carries all five desktops: mirada, sway, COSMIC, GNOME and KDE Plasma. It fits on a 16 GB stick. There is no single file for this variant: that one loads the whole system into memory, and a 17 GiB rootfs does not fit.
02 · las decisiones02 · the decisions
Cada una se abre: en qué se aparta de lo habitual, qué implica por dentro, y qué quiere decir sin jerga. Each one opens: how it departs from the usual, what it involves under the hood, and what it means without jargon.
/bin, /lib y /etc de verdad; los binarios se proyectan del almacén por enlaces duros, normalizados para no arrastrar rutas internas. El puente —la hidratación— va en un solo sentido.Below, sandboxed builds addressed by BLAKE3 hash, with no side effects. Above, a Linux with a real /bin, /lib and /etc; binaries are projected from the store by hard links, normalised so they carry no internal paths. The bridge — hydration — goes one way only.kexec al instalador, que suelta el disco de la máquina viva para poder formatearlo. Nada se descarga durante la instalación. Si ese kernel no deja saltar, lo dice y nombra cuál de las tres condiciones falta; para ese caso está la imagen USB, que es el mismo instalador por otro camino.The file is a POSIX shell header with the whole system appended: it verifies its own contents, loads into memory and jumps with kexec into the installer, which releases the live machine's disk so it can be formatted. Nothing is downloaded while installing. If that kernel will not allow the jump, it says so and names which of the three conditions is missing; for that case there is the USB image, the same installer arriving another way.head antes de correrlo, no necesita internet, y el disco desde el que arrancaste nunca aparece como destino.One file, make it executable, done. You can read it with head before running it, it needs no internet, and the disk you booted from is never offered as a target.mirada es el escritorio propio y viaja en la imagen. Encima está tawasuyu, que no es un añadido: comparten el almacén direccionado por contenido, el grafo de arranque y arje —su proceso número uno— como init de las imágenes. Y los cuatro escritorios conocidos están construidos igual, con su clausura sellada: KDE, GNOME, COSMIC y sway.mirada is the project's own desktop and travels in the image. Above it sits tawasuyu, which is not an add-on: they share the content-addressed store, the boot graph and arje — its process number one — as the init of the images. And the four well-known desktops are built the same way, with their closure sealed: KDE, GNOME, COSMIC and sway.sha256 — nunca contra una rama viva. El hash del artefacto se deriva de la receta entera: fuente, compilador, banderas, fases de build y los hashes de cada dependencia. takana hash lo calcula sin construir nada.Each recipe pins its source by git commit or sha256 — never against a live branch. The artefact hash is derived from the whole recipe: source, compiler, flags, build phases and the hash of every dependency. takana hash computes it without building anything.bubblewrap, sin red y con la fecha fijada. Cuando dos artefactos difieren, why-differs desciende sólo por donde los hashes no coinciden y nombra la causa: un mtime dentro de un .gz, la cabecera ar de un .a, qué sección ELF cambió, una ruta del árbol de build filtrada al binario.Builds run sandboxed with bubblewrap, without network and with a fixed date. When two artefacts differ, why-differs descends only where the hashes disagree and names the cause: an mtime inside a .gz, the ar header of a .a, which ELF section changed, a build-tree path leaked into the binary.digest de cada paquete. install resuelve el nombre, verifica la firma, reconstruye desde fuente y recién entonces hidrata. --repo acepta varios orígenes separados por comas y los prueba en orden.The index is Ed25519-signed and anchors each package's digest. install resolves the name, verifies the signature, rebuilds from source and only then hydrates. --repo takes several comma-separated origins and tries them in order.mrustc a rustc, kernel Linux compilado acá que arranca la máquina, y el toolchain reconstruyéndose a sí mismo dentro de una máquina virtual. Hecho dos veces: mismo resultado, bit por bit.A pure Rust chain from mrustc to rustc, a Linux kernel built here that boots the machine, and the toolchain rebuilding itself inside a virtual machine. Done twice: same result, bit for bit.zig cc de compiladormusl, static, and zig cc as the compilerzig cc es el compilador por defecto del laboratorio —trae los headers y la libc de cada target, sin cross-toolchain a mano— y es reemplazable receta por receta. El rootfs del lab se ancla a una imagen pineada por sha256, no se resuelve con un gestor de paquetes.zig cc is the lab's default compiler — it brings each target's headers and libc, with no hand-built cross-toolchain — and is replaceable recipe by recipe. The lab rootfs is pinned to an image by sha256, not resolved by a package manager.arje-zero es el proceso número uno, estático contra musl. Los servicios se declaran en Cards JSON, con supervisión y reintento con backoff, y hablan por un socket Unix con SO_PEERCRED. El menú de arranque es la navegación del grafo de estados del sistema.arje-zero is process number one, statically linked against musl. Services are declared in JSON Cards, with supervision and backoff restarts, and talk over a Unix socket with SO_PEERCRED. The boot menu is navigation of the system's state graph.try monta un overlay sobre el FHS real; commit lo promueve y discard lo tira. Un demonio fanotify registra cada cambio a mano y calcula el delta contra la base limpia; export lo convierte en un manifiesto compartible.try mounts an overlay over the real FHS; commit promotes it and discard throws it away. A fanotify daemon records every hand edit and computes the delta against the clean base; export turns it into a shareable manifest.libGL.so de escritorio ni GLX: las aplicaciones de gráficos van por EGL, y a las que no sabían hubo que portarlas. El audio es pipewire con wireplumber, como servicio de sesión, sin capa de compatibilidad permanente.No recipe in the catalogue ships a desktop libGL.so or GLX: graphics applications go through EGL, and the ones that didn't know how had to be ported. Audio is pipewire with wireplumber, as a session service, with no permanent compatibility layer.digest y corre enjaulado con bubblewrap sobre el mismo kernel, sin compartir un solo .so con el anfitrión. No entra al store: no reproduce desde fuente, y meterlo ahí haría que el almacén mienta.Another distribution's rootfs is fetched pinned by digest and runs caged with bubblewrap on the same kernel, without sharing a single .so with the host. It does not enter the store: it does not reproduce from source, and putting it there would make the store lie.readelf u objdump; nada de bases de configuración opacas. Hay un bus por socket Unix por el que un agente dispara compilaciones, escucha fallos y propone cambios — siempre contra un overlay, nunca contra el sistema vivo.All system state is plain text and binaries inspectable with readelf or objdump; no opaque configuration databases. There is a Unix-socket bus through which an agent triggers builds, listens for failures and proposes changes — always against an overlay, never against the live system.03 · los componentes03 · the components
| piezapiece | versiónversion | |
|---|---|---|
| initinit | arje-zero | el proceso número uno, estático contra musl; los servicios se declaran en Cards JSONprocess number one, statically linked against musl; services are declared in JSON Cards |
| libc | musl 1.2.5 | estática por defectostatic by default |
| compilador del laboratoriolaboratory compiler | zig cc 0.16.0 | reemplazable receta por receta; también hay LLVM 21.1.2 y clang 18.1.8replaceable recipe by recipe; LLVM 21.1.2 and clang 18.1.8 are there too |
| kernel | Linux 6.16.12 · 7.1.2 | compilados acá; arrancan la máquina y reproducen idénticosbuilt here; they boot the machine and reproduce identically |
| gráficosgraphics | Wayland 1.25.0 · Mesa 24.0.9 | sin X11 en todo el catálogono X11 anywhere in the catalogue |
| audioaudio | PipeWire 1.2.7 · WirePlumber 0.5.15 | servicio de sesiónsession service |
| almacénstore | BLAKE3 | 1.490 artefactos direccionados por contenido1,490 artefacts addressed by content |
| catálogocatalogue | 954 | recetas, las 954 selladas, sin deudarecipes, all 954 sealed, no debt |
| paquetespackages | .tkn | índice firmado Ed25519; se reconstruyen desde fuente al instalarEd25519-signed index; rebuilt from source on install |
| herramientatool | takana 0.0.1 | build · hash · hydrate · install · kernel · qorpa |
| escritoriodesktop | versiónversion | de su clausura, selladosof its closure, sealed |
|---|---|---|
mirada | propioour own | 41/41 |
| KDE Plasma | 6.7.2 | 430/431 |
| GNOME | 48.8 | 359/359 |
| COSMIC | 1.5.0 | 294/294 |
| sway | 1.10 | 281/281 |
Las versiones salen de las recetas del catálogo y las cifras de docs/state/build-state.json y del almacén de la caja. No se estiman: se cuentan. Lo que sigue abierto también está escrito: consenso de reconstrucción M-de-N.
Versions come from the catalogue's recipes and the figures from docs/state/build-state.json and the box's store. They are not estimated: they are counted. What is still open is written down too: M-of-N rebuild consensus.
04 · el código04 · the code
código · licencia MITcode · MIT licence
https://git.gioser.net/sergio/takanapaquetes · índice firmadopackages · signed index
https://takana-os.net/repo/crates/ — el CLI, el laboratorio de build, el demonio, el diario y el overlay.the CLI, the build lab, the daemon, the journal and the overlay.recipes/ — el catálogo: una receta .toml por paquete.the catalogue: one .toml recipe per package.docs/ — el diseño entero (SDD y ADR). Empieza por 00-vision.md.the entire design (SDDs and ADRs). Start at 00-vision.md.scripts/ — la granja de compilación, la cosecha y los arneses de verificación.the build farm, the harvest and the verification harnesses.el laboratoriothe laboratory
$ takana hash ripgrep # el hash vigente, sin construirthe current hash, without building $ takana build ripgrep # compila aislado y sella en el almacénbuilds sandboxed and seals into the store $ takana why-differs a/ b/ # nombra la causa de una diferencianames the cause of a difference
los paquetespackages
$ takana repo list --repo https://takana-os.net/repo $ takana repo verify --repo https://takana-os.net/repo --trust ./trust $ takana install age --repo https://takana-os.net/repo --trust ./trust
el sistema vivothe live system
$ takana try # abre el overlay sobre el sistema realopens the overlay over the real system $ takana journal # lo que cambiaste a mano, registradowhat you changed by hand, recorded $ takana commit # promueve ·discardlo descartapromotes ·discardthrows it away