sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
tres variantes —base, mirada, servidor, full— en sus dos medios
1<!DOCTYPE html>
2<html lang="es" data-lang="es">
3<head>
4<meta charset="utf-8">
5<meta name="viewport" content="width=device-width,initial-scale=1">
6<title>takana — la forja determinista</title>
7<meta name="description" content="Una distribución de Linux con dos pisos: un laboratorio hermético que compila todo desde fuente y direcciona por hash, y un Linux clásico y mutable encima.">
8<meta name="color-scheme" content="light dark">
9<link rel="icon" href="simbolo.svg" type="image/svg+xml">
10<link rel="stylesheet" href="fuentes.css">
11<meta property="og:title" content="takana — la forja determinista">
12<meta property="og:description" content="Un laboratorio hermético abajo, un Linux clásico y mutable arriba. 941 recetas, 926 selladas.">
13<meta property="og:url" content="https://takana-os.net/">
14<meta property="og:type" content="website">
15<style>
16/* ── paleta oficial (docs/marca/README.md) ─────────────────────────────────────
17 Obsidiana #17130E · Piedra #2A241B · Alpaca #F2EBDD
18 Brasa #DF6B2A · Inti #E3A63D · Rojo fragua #A63A25 · Chispa #FFF6DE
19 El tema claro OSCURECE brasa para el texto: #DF6B2A sobre alpaca no llega a 3:1. */
20:root{
21 --obsidiana:#17130E;--piedra:#2A241B;--alpaca:#F2EBDD;
22 --brasa:#DF6B2A;--inti:#E3A63D;--fragua:#A63A25;--chispa:#17130E;
23 --fondo:#F2EBDD;--papel:#FAF6EC;--papel2:#EAE0CC;--linea:#DBCFB5;--linea2:#C4B593;
24 --texto:#17130E;--tenue:#544A3C;--debil:#6B604E;
25 --acento:#9E3F16;--acento2:#8A5A12;
26 --display:"Chivo","Arial Black",system-ui,sans-serif;
27 --sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
28 --mono:"IBM Plex Mono",ui-monospace,"DejaVu Sans Mono",monospace;
29 color-scheme:light}
30@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
31 --chispa:#FFF6DE;
32 --fondo:#17130E;--papel:#1D1813;--papel2:#2A241B;--linea:#332B21;--linea2:#4A3F30;
33 --texto:#F2EBDD;--tenue:#B8AB95;--debil:#9C907B;
34 --acento:#E8834A;--acento2:#E3A63D;
35 color-scheme:dark}}
36:root[data-theme="dark"]{
37 --chispa:#FFF6DE;
38 --fondo:#17130E;--papel:#1D1813;--papel2:#2A241B;--linea:#332B21;--linea2:#4A3F30;
39 --texto:#F2EBDD;--tenue:#B8AB95;--debil:#9C907B;
40 --acento:#E8834A;--acento2:#E3A63D;
41 color-scheme:dark}
42
43*{margin:0;padding:0;box-sizing:border-box}
44html{scroll-behavior:smooth}
45body{background:var(--fondo);color:var(--texto);font:17px/1.62 var(--sans);
46 -webkit-font-smoothing:antialiased;overflow-x:hidden}
47.envoltura{max-width:840px;margin:0 auto;padding:0 1.5rem}
48p{margin:0 0 1rem}
49a{color:inherit;text-decoration:none}
50h1,h2,h3{font-weight:600;letter-spacing:-.01em;line-height:1.15}
51.variantes{width:100%;border-collapse:collapse;margin:1rem 0;font-size:.92rem}
52.variantes th{text-align:left;font-weight:600;font-size:.78rem;letter-spacing:.06em;text-transform:uppercase;color:var(--tenue);padding:.4rem .6rem;border-bottom:1px solid var(--linea)}
53.variantes td{padding:.55rem .6rem;border-bottom:1px solid var(--linea);vertical-align:top}
54.variantes td:first-child{white-space:nowrap}
55.variantes td:nth-child(3),.variantes td:nth-child(4){white-space:nowrap;text-align:right}
56code{font:.86em/1.5 var(--mono);background:var(--papel2);border:1px solid var(--linea);
57 border-radius:5px;padding:.08em .38em}
58:root[data-lang="es"] [data-l="en"],:root[data-lang="en"] [data-l="es"]{display:none!important}
59
60/* el símbolo: martillo en retícula tocapu 7×7 */
61.simbolo{display:inline-block;flex:0 0 auto;aspect-ratio:1}
62.simbolo .chispa{fill:var(--chispa)}
63
64header.barra{position:sticky;top:0;z-index:60;
65 background:color-mix(in srgb,var(--fondo) 88%,transparent);
66 backdrop-filter:blur(10px);border-bottom:1px solid var(--linea)}
67.barra .envoltura{display:flex;align-items:center;gap:1rem;height:58px;max-width:1080px}
68.marca{display:flex;align-items:center;gap:.55rem;
69 font:900 .95rem/1 var(--display);letter-spacing:.06em;text-transform:uppercase}
70.marca .simbolo{width:20px}
71nav.enlaces{margin-left:auto;display:flex;gap:1.15rem;font-size:.88rem}
72nav.enlaces a{color:var(--tenue)}
73nav.enlaces a:hover{color:var(--acento)}
74.perillas{display:flex;gap:.35rem}
75.perilla{font:500 .76rem/1 var(--sans);color:var(--tenue);background:transparent;
76 border:1px solid var(--linea2);border-radius:99px;padding:.42rem .6rem;cursor:pointer}
77.perilla:hover{color:var(--texto);border-color:var(--acento)}
78.perilla.on{color:var(--acento);font-weight:700;border-color:var(--acento)}
79@media(max-width:860px){nav.enlaces{display:none}.perillas{margin-left:auto}}
80
81.portada{position:relative;padding:4.6rem 0 2.6rem;overflow:hidden}
82.portada .fragua{position:absolute;inset:-45% -25% 5% -25%;pointer-events:none;z-index:0;
83 background:radial-gradient(42% 46% at 22% 32%,color-mix(in srgb,var(--brasa) 26%,transparent),transparent 70%),
84 radial-gradient(42% 46% at 76% 22%,color-mix(in srgb,var(--inti) 20%,transparent),transparent 70%),
85 radial-gradient(38% 42% at 55% 60%,color-mix(in srgb,var(--fragua) 16%,transparent),transparent 70%);
86 filter:blur(14px)}
87.portada .envoltura{position:relative;z-index:1}
88.antetitulo{font:.72rem/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;
89 color:var(--debil);margin-bottom:1rem}
90.titular{display:flex;align-items:center;gap:1.1rem;margin-bottom:.9rem}
91.titular .simbolo{width:clamp(48px,9vw,74px)}
92h1{font:900 clamp(3rem,10vw,5.2rem)/.92 var(--display);letter-spacing:.01em;
93 text-transform:uppercase;
94 background:linear-gradient(100deg,var(--fragua),var(--brasa) 52%,var(--inti));
95 -webkit-background-clip:text;background-clip:text;color:transparent}
96.lema{font:400 clamp(1.1rem,2.4vw,1.35rem)/1.45 var(--sans);color:var(--texto);max-width:44ch}
97.botones{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:1.6rem}
98.boton{display:inline-flex;align-items:center;gap:.4rem;font:600 .9rem/1 var(--sans);
99 padding:.75rem 1.1rem;border-radius:99px;border:1px solid var(--linea2);color:var(--texto);
100 transition:border-color .2s,transform .2s}
101.boton:hover{transform:translateY(-1px);border-color:var(--acento)}
102.boton.lleno{border-color:transparent;color:#17130E;
103 background:linear-gradient(100deg,var(--brasa),var(--inti))}
104
105section.franja{padding:3.4rem 0;border-top:1px solid var(--linea)}
106.sello{display:flex;align-items:center;gap:.5rem;font:.7rem/1 var(--mono);letter-spacing:.18em;
107 text-transform:uppercase;color:var(--debil);margin-bottom:.9rem}
108.sello .simbolo{width:12px}
109.franja h2{font-size:clamp(1.55rem,3.4vw,2rem);margin-bottom:1rem}
110.franja p{color:var(--tenue)}
111.franja p strong,.franja li strong{color:var(--texto)}
112
113ul.limpia{list-style:none;margin:.4rem 0 1rem}
114ul.limpia li{position:relative;padding-left:1.15rem;margin-bottom:.45rem;color:var(--tenue);font-size:.95rem}
115ul.limpia li::before{content:"";position:absolute;left:0;top:.62em;width:7px;height:2px;background:var(--brasa)}
116
117/* las decisiones: cada una es una ficha con tres lecturas de lo mismo —
118 contra qué se decide, qué implica por dentro, y qué quiere decir sin jerga */
119.decisiones{display:grid;gap:.85rem;margin-top:1.5rem}
120.decision{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
121 padding:1.15rem 1.3rem}
122.decision h3{font-size:1.08rem;line-height:1.3;margin-bottom:.85rem;
123 display:flex;gap:.65rem;align-items:baseline}
124.decision .num{font:500 .72rem/1 var(--mono);letter-spacing:.1em;color:var(--acento);flex:0 0 auto}
125.decision dl{margin:0}
126.decision dt{font:500 .65rem/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;
127 color:var(--debil);margin-bottom:.32rem}
128.decision dd{margin:0 0 .9rem;color:var(--tenue);font-size:.93rem}
129.decision dd:last-child{margin-bottom:0}
130.decision dt.simple{color:var(--acento)}
131.decision dd.simple{color:var(--texto);border-left:2px solid var(--acento);padding-left:.8rem}
132@media(max-width:600px){.decision{padding:1rem 1.05rem}
133 .decision h3{flex-direction:column;gap:.25rem}}
134
135.marco{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
136 padding:1.3rem 1.4rem;margin-bottom:1rem;position:relative;overflow:hidden}
137.marco::before{content:"";position:absolute;inset:0 0 auto 0;height:3px;
138 background:linear-gradient(90deg,var(--fragua),var(--brasa),var(--inti))}
139.marco h3{font-size:1.15rem;margin-bottom:.4rem}
140
141/* la ficha de repo: la dirección, grande y copiable */
142.direccion{border:1px solid var(--linea2);border-radius:12px;background:var(--papel);
143 padding:1rem 1.1rem;margin:.2rem 0 1rem}
144.direccion .etiqueta{font:.68rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;
145 color:var(--debil);margin-bottom:.5rem}
146.direccion .url{font:500 clamp(.86rem,2.3vw,1.02rem)/1.45 var(--mono);color:var(--acento);
147 word-break:break-all}
148.direccion .url:hover{text-decoration:underline}
149
150pre{font:.84rem/1.65 var(--mono);background:var(--papel2);border:1px solid var(--linea);
151 border-radius:10px;padding:.85rem 1rem;overflow-x:auto;margin:0 0 1rem;color:var(--texto)}
152pre .p{color:var(--debil);user-select:none}
153pre .c{color:var(--debil)}
154
155table{border-collapse:collapse;width:100%;margin:1rem 0 1.4rem;font-size:.9rem;display:block;overflow-x:auto}
156th,td{border:1px solid var(--linea);padding:.52rem .7rem;text-align:left;vertical-align:top}
157th{background:var(--papel2);font-weight:600;white-space:nowrap}
158td{color:var(--tenue)}
159td.n{font-family:var(--mono);white-space:nowrap;color:var(--texto)}
160.semaforo{white-space:nowrap}
161
162.nota{font-size:.82rem;color:var(--debil);border-left:2px solid var(--linea2);padding-left:.8rem}
163
164footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6rem 0 3.4rem}
165.pie-rejilla{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:1.4rem}
166.pie-rejilla a.casa{display:block;font-weight:600;margin-bottom:.15rem}
167.pie-rejilla a.casa:hover{color:var(--acento)}
168.pie-rejilla p{font-size:.84rem;color:var(--debil);margin:0}
169.pie-fin{margin-top:2rem;font-size:.8rem;color:var(--debil)}
170@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
171</style>
172</head>
173<body>
174
175<svg width="0" height="0" style="position:absolute" aria-hidden="true">
176 <symbol id="tocapu" viewBox="0 0 748 748">
177 <rect x="0" y="0" width="100" height="100" fill="#A63A25"/>
178 <rect x="108" y="0" width="100" height="100" fill="#DF6B2A"/>
179 <rect x="216" y="0" width="100" height="100" fill="#E3A63D"/>
180 <rect x="324" y="0" width="100" height="100" fill="#E3A63D"/>
181 <rect x="432" y="0" width="100" height="100" fill="#E3A63D"/>
182 <rect x="540" y="0" width="100" height="100" fill="#DF6B2A"/>
183 <rect x="648" y="0" width="100" height="100" fill="#A63A25"/>
184 <rect x="108" y="108" width="100" height="100" fill="#DF6B2A"/>
185 <rect x="216" y="108" width="100" height="100" fill="#E3A63D"/>
186 <rect x="324" y="108" width="100" height="100" class="chispa"/>
187 <rect x="432" y="108" width="100" height="100" fill="#E3A63D"/>
188 <rect x="540" y="108" width="100" height="100" fill="#DF6B2A"/>
189 <rect x="0" y="216" width="100" height="100" fill="#A63A25"/>
190 <rect x="108" y="216" width="100" height="100" fill="#DF6B2A"/>
191 <rect x="216" y="216" width="100" height="100" fill="#E3A63D"/>
192 <rect x="324" y="216" width="100" height="100" fill="#E3A63D"/>
193 <rect x="432" y="216" width="100" height="100" fill="#E3A63D"/>
194 <rect x="540" y="216" width="100" height="100" fill="#DF6B2A"/>
195 <rect x="648" y="216" width="100" height="100" fill="#A63A25"/>
196 <rect x="324" y="324" width="100" height="100" fill="#DF6B2A"/>
197 <rect x="324" y="432" width="100" height="100" fill="#A63A25"/>
198 <rect x="324" y="540" width="100" height="100" fill="#A63A25"/>
199 <rect x="324" y="648" width="100" height="100" fill="#A63A25"/>
200 </symbol>
201</svg>
202
203<header class="barra"><div class="envoltura">
204 <a class="marca" href="/"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg>takana</a>
205 <nav class="enlaces">
206 <a href="#pisos"><span data-l="es">Los dos pisos</span><span data-l="en">The two floors</span></a>
207 <a href="#decisiones"><span data-l="es">Las decisiones</span><span data-l="en">The decisions</span></a>
208 <a href="#codigo"><span data-l="es">El código</span><span data-l="en">The code</span></a>
209 <a href="#estado"><span data-l="es">El estado</span><span data-l="en">State</span></a>
210 <a href="#paquetes"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
211 </nav>
212 <div class="perillas">
213 <button class="perilla" data-poner-lang="es">ES</button>
214 <button class="perilla" data-poner-lang="en">EN</button>
215 <button class="perilla" id="tema" title="tema">◐</button>
216 </div>
217</div></header>
218
219<section class="portada"><div class="fragua" aria-hidden="true"></div><div class="envoltura">
220 <p class="antetitulo"><span data-l="es">takana · de <em>takay</em>: golpear, martillar</span><span data-l="en">takana · from <em>takay</em>: to strike, to hammer</span></p>
221 <div class="titular">
222 <svg class="simbolo" viewBox="0 0 748 748" aria-hidden="true"><use href="#tocapu"/></svg>
223 <h1>takana</h1>
224 </div>
225 <p class="lema">
226 <span data-l="es">Una distribución de Linux con dos pisos: abajo un laboratorio hermético que compila todo desde fuente y guarda cada artefacto por su hash; arriba un Linux clásico y mutable donde se pueden romper cosas y volver atrás.</span>
227 <span data-l="en">A Linux distribution with two floors: downstairs a hermetic laboratory that compiles everything from source and keeps every artefact by its hash; upstairs a classic, mutable Linux where you can break things and go back.</span>
228 </p>
229 <div class="botones">
230 <a class="boton lleno" href="#instalar"><span data-l="es">Instalar</span><span data-l="en">Install</span></a>
231 <a class="boton" href="https://git.gioser.net/sergio/takana"><span data-l="es">El repositorio</span><span data-l="en">The repository</span> ↗</a>
232 <a class="boton" href="#paquetes"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
233 <a class="boton" href="https://tawasuyu.net">tawasuyu.net ↗</a>
234 </div>
235</div></section>
236
237<section class="franja" id="instalar"><div class="envoltura">
238 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">descargar · un archivo</span><span data-l="en">download · one file</span></p>
239 <h2><span data-l="es">Un archivo, y sabe hacer todo</span><span data-l="en">One file, and it knows how to do everything</span></h2>
240 <p>
241 <span data-l="es">No hay un ISO que grabar ni un árbol que copiar: se baja <strong>un fichero</strong>, se le da permiso y se corre. Adentro viene todo —el programa, el instalador que corre en RAM y su propio kernel— así que <strong>no baja nada de internet mientras instala</strong>. Un instalador de sistema que necesita red falla justo donde más caro sale: en la máquina que todavía no tiene sistema.</span>
242 <span data-l="en">There is no ISO to burn and no tree to copy: you download <strong>one file</strong>, make it executable and run it. Everything travels inside — the program, the installer that runs in RAM and its own kernel — so it <strong>downloads nothing from the internet while installing</strong>. A system installer that needs the network fails exactly where it costs most: on the machine that has no system yet.</span>
243 </p>
244
245<pre><span class="p">$</span> curl -LO https://takana-os.net/descargas/takana-instalador-mirada.run
246<span class="p">$</span> chmod +x takana-instalador-mirada.run
247<span class="p">$</span> sudo ./takana-instalador-mirada.run</pre>
248
249 <p>
250 <span data-l="es">Eso hace las tres cosas por orden: comprueba si esta máquina puede instalarse <em>sin USB</em>, muestra el terreno —cada partición, su tamaño, qué hay dentro y si se puede usar— y recién entonces pregunta. Lo cifrado, lo de Windows, la swap, las particiones de arranque y lo que está montado <strong>no se ofrecen</strong>, y se muestran igual con el motivo escrito al lado.</span>
251 <span data-l="en">It does three things in order: it checks whether this machine can be installed <em>without a USB</em>, it shows the terrain — every partition, its size, what is inside it and whether it can be used — and only then it asks. Encrypted volumes, Windows volumes, swap, boot partitions and anything mounted are <strong>never offered</strong>, and are shown anyway with the reason written next to them.</span>
252 </p>
253
254 <p class="nota">
255 <span data-l="es"><strong>Sin USB</strong> quiere decir que el Linux que estás usando salta al instalador en memoria y suelta su propio disco. Si el kernel de esa máquina no lo permite, el instalador lo dice y explica por qué en vez de fallar a mitad. Antes de escribir nada pide un «si» escrito, y después del salto vuelve a mostrar el terreno y a preguntar: son dos consentimientos para dos cosas distintas.</span>
256 <span data-l="en"><strong>Without a USB</strong> means the Linux you are using jumps into the in-memory installer and releases its own disk. If that machine's kernel does not allow it, the installer says so and explains why instead of failing halfway. It asks for a typed «si» before writing anything, and after the jump it shows the terrain and asks again: two consents for two different things.</span>
257 </p>
258
259 <h3><span data-l="es">Tres variantes</span><span data-l="en">Three variants</span></h3>
260 <p>
261 <span data-l="es">La diferencia es <strong>qué sistema se instala</strong>, no cómo. Las tres traen el mismo instalador y el mismo censo; cambia el tamaño de lo que copian al disco.</span>
262 <span data-l="en">The difference is <strong>which system gets installed</strong>, not how. All three carry the same installer and the same survey; what changes is the size of what they copy to the disk.</span>
263 </p>
264
265 <table class="variantes">
266 <tr>
267 <th><span data-l="es">variante</span><span data-l="en">variant</span></th>
268 <th><span data-l="es">qué trae</span><span data-l="en">what it carries</span></th>
269 <th><span data-l="es">un archivo</span><span data-l="en">one file</span></th>
270 <th>USB</th>
271 </tr>
272 <tr>
273 <td><code>base</code></td>
274 <td><span data-l="es">el piso de arranque y nada más: arranca a una consola</span><span data-l="en">the boot floor and nothing else: it boots to a console</span></td>
275 <td><a href="/descargas/takana-instalador-base.run">137 MiB</a></td>
276 <td><a href="/descargas/takana-instalador-usb-base.img">519 MiB</a></td>
277 </tr>
278 <tr>
279 <td><code>mirada</code></td>
280 <td><span data-l="es">+ el userland completo + el escritorio propio de la suite</span><span data-l="en">+ the full userland + the suite's own desktop</span></td>
281 <td><a href="/descargas/takana-instalador-mirada.run">524 MiB</a></td>
282 <td><a href="/descargas/takana-instalador-usb-mirada.img">1,6 GiB</a></td>
283 </tr>
284 <tr>
285 <td><code>servidor</code></td>
286 <td><span data-l="es">+ el userland completo + el perfil de servidor</span><span data-l="en">+ the full userland + the server profile</span></td>
287 <td><a href="/descargas/takana-instalador-servidor.run">1,2 GiB</a></td>
288 <td><a href="/descargas/takana-instalador-usb-servidor.img">3,3 GiB</a></td>
289 </tr>
290 <tr>
291 <td><code>full</code></td>
292 <td><span data-l="es">todo lo anterior junto, más el toolbox de línea de comandos</span><span data-l="en">all of the above together, plus the command-line toolbox</span></td>
293 <td><span data-l="es">— sólo USB</span><span data-l="en">— USB only</span></td>
294 <td><a href="/descargas/takana-instalador-usb-full.img">3,5 GiB</a></td>
295 </tr>
296 </table>
297
298 <p class="nota">
299 <span data-l="es">⚠ <strong>El archivo único carga el instalador ENTERO en memoria</strong> para poder soltar el disco, así que de las variantes grandes hace falta bastante RAM — y si no entra, el instalador lo dice y no lo intenta. El USB no tiene ese límite: corre desde el propio pendrive. Para <code>servidor</code> y para máquinas con poca memoria, <strong>el USB es el camino</strong>.</span>
300 <span data-l="en">⚠ <strong>The single file loads the WHOLE installer into memory</strong> so it can release the disk, so the larger variants need a fair amount of RAM — and if it does not fit, the installer says so instead of trying. The USB has no such limit: it runs from the stick itself. For <code>servidor</code> and for machines with little memory, <strong>the USB is the way</strong>.</span>
301 </p>
302
303<pre><span class="p">$</span> curl -sO https://takana-os.net/descargas/takana-instalador-mirada.run.sha256
304<span class="p">$</span> sha256sum -c takana-instalador-mirada.run.sha256</pre>
305
306 <h3><span data-l="es">Y si esta máquina no puede saltar: el USB</span><span data-l="en">And if this machine cannot jump: the USB</span></h3>
307 <p>
308 <span data-l="es">El salto pide tres cosas del kernel que ya está corriendo, y cualquiera puede faltar: soporte de <code>kexec</code>, ser root, y que Secure Boot no esté bloqueando. Cuando falta alguna, el instalador lo dice y explica cuál. Para ese caso está la <strong>imagen USB</strong>, que es el mismo instalador llegando por otro camino — el mismo censo y las mismas guardas.</span>
309 <span data-l="en">The jump asks three things of the kernel already running, and any of them can be missing: <code>kexec</code> support, being root, and Secure Boot not getting in the way. When one is missing the installer says so and explains which. For that case there is the <strong>USB image</strong>, which is the same installer arriving by another route — the same survey and the same guards.</span>
310 </p>
311
312<pre><span class="p">$</span> curl -LO https://takana-os.net/descargas/takana-instalador-usb-mirada.img
313<span class="p">$</span> sudo dd if=takana-instalador-usb-mirada.img of=/dev/sdX bs=4M oflag=sync status=progress</pre>
314
315 <p class="nota">
316 <span data-l="es">Arranca por la ruta de medios removibles del firmware: no hay nada que registrar y no toca la NVRAM hasta que vos elegís instalar. El medio desde el que arrancaste <strong>nunca se ofrece como destino</strong>. Si la máquina no tiene pantalla y la estás administrando por puerto serie, arrancá con <code>takana.console=/dev/ttyS0</code>.</span>
317 <span data-l="en">It boots through the firmware's removable-media path: there is nothing to register and it does not touch NVRAM until you choose to install. The medium you booted from is <strong>never offered as a target</strong>. If the machine has no screen and you are driving it over a serial port, boot with <code>takana.console=/dev/ttyS0</code>.</span>
318 </p>
319
320 <p class="nota">
321 <span data-l="es">El fichero verifica su propio contenido antes de desempaquetarlo, y si la máquina no tiene con qué calcular un sha256 lo <em>dice</em> en vez de saltárselo en silencio. Con <code>--check</code> y <code>--survey</code> mira y no toca nada; con <code>--extraer DIR</code> sólo se desempaqueta, para leer antes de correr. Hace falta un firmware UEFI y una partición de al menos 2 GiB que se pueda perder; nada más se modifica.</span>
322 <span data-l="en">The file verifies its own contents before unpacking them, and if the machine has no way to compute a sha256 it <em>says so</em> instead of skipping it silently. With <code>--check</code> and <code>--survey</code> it looks and touches nothing; with <code>--extraer DIR</code> it only unpacks, so you can read before running. It needs UEFI firmware and one partition of at least 2 GiB that you can afford to lose; nothing else is modified.</span>
323 </p>
324</div></section>
325
326<section class="franja" id="pisos"><div class="envoltura">
327 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">01 · los dos pisos</span><span data-l="en">01 · the two floors</span></p>
328 <h2><span data-l="es">Por qué dos pisos y no uno</span><span data-l="en">Why two floors and not one</span></h2>
329 <p>
330 <span data-l="es">Una distribución inmutable da reproducibilidad y quita la máquina: no se puede tocar nada sin aprender antes un lenguaje declarativo. Una clásica deja tocar todo y no sabe decir de dónde salió un binario. <strong>takana pone las dos, en pisos separados.</strong></span>
331 <span data-l="en">An immutable distribution gives you reproducibility and takes the machine away: you cannot touch anything without first learning a declarative language. A classic one lets you touch everything and cannot tell you where a binary came from. <strong>takana has both, on separate floors.</strong></span>
332 </p>
333 <p>
334 <span data-l="es">El <strong>laboratorio</strong> compila desde fuentes upstream con commits fijados, aislado (<code>bubblewrap</code> + <code>zig cc</code> + musl estático), y direcciona cada artefacto por su hash BLAKE3. El <strong>userland</strong> es un Linux normal, con <code>/bin</code>, <code>/lib</code> y <code>/etc</code> de verdad; los binarios se hidratan del almacén por enlaces duros. Se pueden pisar archivos en caliente y revertir cuando se quiera.</span>
335 <span data-l="en">The <strong>laboratory</strong> compiles from upstream sources at pinned commits, sandboxed (<code>bubblewrap</code> + <code>zig cc</code> + static musl), and addresses every artefact by its BLAKE3 hash. The <strong>userland</strong> is an ordinary Linux, with a real <code>/bin</code>, <code>/lib</code> and <code>/etc</code>; binaries are hydrated from the store by hard links. You can overwrite files live and revert whenever you want.</span>
336 </p>
337 <div class="marco">
338 <h3><span data-l="es">Las tres piezas del medio</span><span data-l="en">The three pieces in between</span></h3>
339 <ul class="limpia">
340 <li><span data-l="es"><strong>Overlay de experimentación.</strong> Un cambio sobre el sistema real, con red: <code>try</code>, <code>commit</code>, <code>discard</code>.</span><span data-l="en"><strong>Experimentation overlay.</strong> A change on the real system, with a safety net: <code>try</code>, <code>commit</code>, <code>discard</code>.</span></li>
341 <li><span data-l="es"><strong>Diario de mutaciones.</strong> Un demonio <code>fanotify</code> registra lo que se cambia a mano. Se vive de forma imperativa y el sistema calcula el delta contra la base limpia — el diario <em>es</em> la configuración.</span><span data-l="en"><strong>Mutation journal.</strong> A <code>fanotify</code> daemon records what you change by hand. You live imperatively and the system computes the delta against the clean base — the journal <em>is</em> the configuration.</span></li>
342 <li><span data-l="es"><strong>Manifiesto <code>.swm</code>.</strong> Se comparte la receta de la mutación —parche de fuente, banderas, ediciones de config—, no el binario cocinado. Quien lo recibe lo reproduce y lo verifica.</span><span data-l="en"><strong><code>.swm</code> manifest.</strong> You share the recipe for the mutation — source patch, flags, config edits — not the cooked binary. Whoever receives it reproduces and verifies it.</span></li>
343 </ul>
344 </div>
345</div></section>
346
347<section class="franja" id="decisiones"><div class="envoltura">
348 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">02 · las decisiones</span><span data-l="en">02 · the decisions</span></p>
349 <h2><span data-l="es">Diez decisiones, y contra qué se tomaron</span><span data-l="en">Ten decisions, and what they were taken against</span></h2>
350 <p>
351 <span data-l="es">La primera es la de arriba —los dos pisos— y de ella cuelga todo lo demás. Estas son las otras diez. De cada una: <strong>en qué se aparta de lo que hace una distro tradicional</strong>, <strong>qué implica por dentro</strong> y <strong>qué quiere decir sin jerga</strong>. Ninguna es gratis; todas se pagan en algún lado, y acá está dicho dónde.</span>
352 <span data-l="en">The first one is above — the two floors — and everything else hangs off it. These are the other ten. For each: <strong>how it departs from what a traditional distro does</strong>, <strong>what it involves under the hood</strong> and <strong>what it means without jargon</strong>. None is free; each is paid for somewhere, and that is said here.</span>
353 </p>
354 <div class="decisiones">
355<article class="decision">
356<h3><span class="num">01</span><span data-l="es">Todo se compila desde fuente, y la fuente está clavada</span><span data-l="en">Everything is compiled from source, and the source is pinned</span></h3>
357<dl>
358 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
359 <dd><span data-l="es">Una distro normal te entrega un binario que compiló otra persona en otra máquina; lo que verificás es la firma de quien lo subió, no lo que hay adentro.</span><span data-l="en">A normal distro hands you a binary somebody else compiled on another machine; what you verify is the signature of whoever uploaded it, not what is inside.</span></dd>
360 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
361 <dd><span data-l="es">Cada receta fija su fuente por <em>commit</em> de git o por <code>sha256</code> — 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. <code>takana hash</code> lo calcula sin construir nada.</span><span data-l="en">Each recipe pins its source by git <em>commit</em> or <code>sha256</code> — 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. <code>takana hash</code> computes it without building anything.</span></dd>
362 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
363 <dd class="simple"><span data-l="es">Nadie te manda comida hecha: te manda la receta y la cocina tu máquina. Y la receta dice exactamente qué ingredientes, no «harina» a secas.</span><span data-l="en">Nobody sends you cooked food: they send the recipe and your machine cooks it. And the recipe names the exact ingredients, not just «flour».</span></dd>
364</dl>
365</article>
366
367<article class="decision">
368<h3><span class="num">02</span><span data-l="es">Reproducible bit a bit — y cuando no, se dice por qué</span><span data-l="en">Bit-for-bit reproducible — and when it isn't, it says why</span></h3>
369<dl>
370 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
371 <dd><span data-l="es">Compilar el mismo paquete dos veces casi nunca da el mismo fichero, y en la práctica nadie lo comprueba: la diferencia se acepta como normal.</span><span data-l="en">Building the same package twice almost never yields the same file, and in practice nobody checks: the difference is accepted as normal.</span></dd>
372 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
373 <dd><span data-l="es">El build corre aislado con <code>bubblewrap</code>, sin red y con la fecha fijada. Cuando dos artefactos difieren, <code>why-differs</code> desciende sólo por donde los hashes no coinciden y <strong>nombra la causa</strong>: un mtime dentro de un <code>.gz</code>, la cabecera <code>ar</code> de un <code>.a</code>, qué sección ELF cambió, una ruta del árbol de build filtrada al binario.</span><span data-l="en">Builds run sandboxed with <code>bubblewrap</code>, without network and with a fixed date. When two artefacts differ, <code>why-differs</code> descends only where the hashes disagree and <strong>names the cause</strong>: an mtime inside a <code>.gz</code>, the <code>ar</code> header of a <code>.a</code>, which ELF section changed, a build-tree path leaked into the binary.</span></dd>
374 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
375 <dd class="simple"><span data-l="es">Si dos personas hacen el mismo paquete, tiene que salir el mismo fichero. Y si sale distinto, el sistema te dice en qué — no te deja adivinando.</span><span data-l="en">If two people build the same package, the same file must come out. And if it doesn't, the system tells you where it differed — it doesn't leave you guessing.</span></dd>
376</dl>
377</article>
378
379<article class="decision">
380<h3><span class="num">03</span><span data-l="es">Un paquete es una receta, no un binario</span><span data-l="en">A package is a recipe, not a binary</span></h3>
381<dl>
382 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
383 <dd><span data-l="es">El repositorio te manda el programa ya hecho, así que hay que confiar en el repositorio — y en cada espejo suyo.</span><span data-l="en">The repository sends you the finished program, so you have to trust the repository — and every one of its mirrors.</span></dd>
384 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
385 <dd><span data-l="es">El índice va firmado con Ed25519 y ancla el <code>digest</code> de cada paquete. <code>install</code> resuelve el nombre, verifica la firma, <strong>reconstruye desde fuente</strong> y recién entonces hidrata. <code>--repo</code> acepta varios orígenes separados por comas y los prueba en orden.</span><span data-l="en">The index is Ed25519-signed and anchors each package's <code>digest</code>. <code>install</code> resolves the name, verifies the signature, <strong>rebuilds from source</strong> and only then hydrates. <code>--repo</code> takes several comma-separated origins and tries them in order.</span></dd>
386 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
387 <dd class="simple"><span data-l="es">El sitio del que bajás no necesita ser de fiar, porque no te da el resultado: te da las instrucciones, y se comprueba que sean las firmadas.</span><span data-l="en">The site you download from doesn't need to be trustworthy, because it doesn't give you the result: it gives you the instructions, and they are checked against the signed ones.</span></dd>
388</dl>
389</article>
390
391<article class="decision">
392<h3><span class="num">04</span><span data-l="es">Se reconstruye a sí misma, sin creerle a ningún binario</span><span data-l="en">It rebuilds itself, without trusting anybody's binary</span></h3>
393<dl>
394 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
395 <dd><span data-l="es">El compilador de tu distro salió de un binario que compiló otra máquina, que salió de otro, hacia atrás sin fondo. Ese primer eslabón se cree por fe.</span><span data-l="en">Your distro's compiler came from a binary built by another machine, which came from another, backwards without end. That first link is taken on faith.</span></dd>
396 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
397 <dd><span data-l="es">Cadena de Rust pura de <code>mrustc</code> a <code>rustc</code>, 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.</span><span data-l="en">A pure Rust chain from <code>mrustc</code> to <code>rustc</code>, 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.</span></dd>
398 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
399 <dd class="simple"><span data-l="es">La distro se puede fabricar a sí misma casi desde cero. No queda un eslabón que haya que aceptar sin poder mirarlo.</span><span data-l="en">The distro can manufacture itself from near zero. No link is left that you must accept without being able to look at it.</span></dd>
400</dl>
401</article>
402
403<article class="decision">
404<h3><span class="num">05</span><span data-l="es">musl, estático, y <code>zig cc</code> de compilador</span><span data-l="en">musl, static, and <code>zig cc</code> as the compiler</span></h3>
405<dl>
406 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
407 <dd><span data-l="es">Lo habitual es glibc y enlazado dinámico: actualizar una librería puede romper un programa que no tocaste, y descubrirlo al arrancarlo.</span><span data-l="en">The usual is glibc and dynamic linking: updating one library can break a program you never touched, and you find out when you launch it.</span></dd>
408 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
409 <dd><span data-l="es"><code>zig cc</code> 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 <code>sha256</code>, no se resuelve con un gestor de paquetes.</span><span data-l="en"><code>zig cc</code> 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 <code>sha256</code>, not resolved by a package manager.</span></dd>
410 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
411 <dd class="simple"><span data-l="es">Cada programa se lleva sus piezas adentro, así que tocar uno no rompe a los demás. Y el código de la libc es lo bastante chico como para leerlo.</span><span data-l="en">Each program carries its pieces inside, so touching one doesn't break the others. And the libc's code is small enough to actually read.</span></dd>
412</dl>
413</article>
414
415<article class="decision">
416<h3><span class="num">06</span><span data-l="es">Sin systemd: el init es propio y el arranque es un grafo</span><span data-l="en">No systemd: the init is our own and boot is a graph</span></h3>
417<dl>
418 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
419 <dd><span data-l="es">El arranque lo gobierna un binario grande con formato de unidades propio y un registro binario que hay que consultar con su propia herramienta.</span><span data-l="en">Boot is governed by a large binary with its own unit format and a binary log you must query with its own tool.</span></dd>
420 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
421 <dd><span data-l="es"><code>arje-zero</code> es el proceso número uno, estático contra musl. Los servicios se declaran en <em>Cards</em> JSON, con supervisión y reintento con backoff, y hablan por un socket Unix con <code>SO_PEERCRED</code>. El menú de arranque es la navegación del grafo de estados del sistema.</span><span data-l="en"><code>arje-zero</code> is process number one, statically linked against musl. Services are declared in JSON <em>Cards</em>, with supervision and backoff restarts, and talk over a Unix socket with <code>SO_PEERCRED</code>. The boot menu is navigation of the system's state graph.</span></dd>
422 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
423 <dd class="simple"><span data-l="es">Lo que enciende tu máquina se puede leer con un editor de texto y contar de memoria. No hay una pieza central que decida por vos y te cueste inspeccionar.</span><span data-l="en">What starts your machine can be read in a text editor and held in your head. There is no central piece deciding for you that is hard to inspect.</span></dd>
424</dl>
425</article>
426
427<article class="decision">
428<h3><span class="num">07</span><span data-l="es">Romper a mano está permitido — y se puede volver</span><span data-l="en">Breaking things by hand is allowed — and you can come back</span></h3>
429<dl>
430 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
431 <dd><span data-l="es">Las inmutables no te dejan tocar sin aprender antes un lenguaje declarativo; las clásicas te dejan tocar y después el gestor de paquetes pierde el rastro de lo que hiciste.</span><span data-l="en">Immutable ones won't let you touch anything until you learn a declarative language; classic ones let you touch and then the package manager loses track of what you did.</span></dd>
432 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
433 <dd><span data-l="es"><code>try</code> monta un overlay sobre el FHS real; <code>commit</code> lo promueve y <code>discard</code> lo tira. Un demonio <code>fanotify</code> registra cada cambio a mano y calcula el delta contra la base limpia; <code>export</code> lo convierte en un manifiesto compartible.</span><span data-l="en"><code>try</code> mounts an overlay over the real FHS; <code>commit</code> promotes it and <code>discard</code> throws it away. A <code>fanotify</code> daemon records every hand edit and computes the delta against the clean base; <code>export</code> turns it into a shareable manifest.</span></dd>
434 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
435 <dd class="simple"><span data-l="es">Probá lo que quieras: si sale mal se desmonta la capa y listo. Y lo que cambiaste a mano queda anotado solo — el registro <em>es</em> tu configuración, sin que hayas escrito ninguna.</span><span data-l="en">Try whatever you want: if it goes wrong the layer is unmounted and that's it. And what you changed by hand gets written down on its own — the log <em>is</em> your configuration, without you having written one.</span></dd>
436</dl>
437</article>
438
439<article class="decision">
440<h3><span class="num">08</span><span data-l="es">Wayland y nada más; el audio es PipeWire</span><span data-l="en">Wayland and nothing else; audio is PipeWire</span></h3>
441<dl>
442 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
443 <dd><span data-l="es">Casi todas arrastran X11 y varios servidores de audio a la vez por compatibilidad, y mantienen los dos caminos para siempre.</span><span data-l="en">Almost all of them drag X11 and several audio servers along for compatibility, and maintain both paths forever.</span></dd>
444 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
445 <dd><span data-l="es">Ninguna receta del catálogo publica <code>libGL.so</code> 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 <code>pipewire</code> con <code>wireplumber</code>, como servicio de sesión, sin capa de compatibilidad permanente.</span><span data-l="en">No recipe in the catalogue ships a desktop <code>libGL.so</code> or GLX: graphics applications go through EGL, and the ones that didn't know how had to be ported. Audio is <code>pipewire</code> with <code>wireplumber</code>, as a session service, with no permanent compatibility layer.</span></dd>
446 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
447 <dd class="simple"><span data-l="es">Se eligió el camino nuevo y se borró el viejo, en vez de cargar los dos para siempre. Cuesta más al principio y se paga una sola vez.</span><span data-l="en">The new path was chosen and the old one deleted, instead of carrying both forever. It costs more up front and is paid only once.</span></dd>
448</dl>
449</article>
450
451<article class="decision">
452<h3><span class="num">09</span><span data-l="es">Lo ajeno corre enjaulado, y fuera del almacén</span><span data-l="en">Foreign software runs caged, and outside the store</span></h3>
453<dl>
454 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
455 <dd><span data-l="es">O se mezclan binarios de terceros con los del sistema —y ya no se sabe de dónde salió cada cosa—, o directamente no hay forma de correrlos.</span><span data-l="en">Either third-party binaries get mixed in with the system's — and then you no longer know where anything came from — or there is simply no way to run them.</span></dd>
456 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
457 <dd><span data-l="es">Un rootfs de otra distribución se trae pineado por <code>digest</code> y corre enjaulado con <code>bubblewrap</code> sobre el mismo kernel, sin compartir un solo <code>.so</code> con el anfitrión. <strong>No entra al store</strong>: no reproduce desde fuente, y meterlo ahí haría que el almacén mienta.</span><span data-l="en">Another distribution's rootfs is fetched pinned by <code>digest</code> and runs caged with <code>bubblewrap</code> on the same kernel, without sharing a single <code>.so</code> with the host. <strong>It does not enter the store</strong>: it does not reproduce from source, and putting it there would make the store lie.</span></dd>
458 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
459 <dd class="simple"><span data-l="es">Lo que no se puede cocinar acá igual se usa, pero en su propia caja y sin mezclarse. Así el catálogo no dice «esto es mío» de algo que no lo es.</span><span data-l="en">What cannot be cooked here is still used, but in its own box and unmixed. That way the catalogue never claims as its own something that isn't.</span></dd>
460</dl>
461</article>
462
463<article class="decision">
464<h3><span class="num">10</span><span data-l="es">Hecha para que una IA la opere, con el humano decidiendo</span><span data-l="en">Built for an AI to operate it, with the human deciding</span></h3>
465<dl>
466 <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
467 <dd><span data-l="es">Están pensadas para manos humanas: la automatización termina simulando a una persona —parsear salidas, adivinar formatos— y el sistema esconde su estado en bases binarias.</span><span data-l="en">They are designed for human hands: automation ends up simulating a person — parsing output, guessing formats — and the system hides its state in binary databases.</span></dd>
468 <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
469 <dd><span data-l="es">Todo el estado del sistema es texto plano y binarios inspeccionables con <code>readelf</code> u <code>objdump</code>; 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.</span><span data-l="en">All system state is plain text and binaries inspectable with <code>readelf</code> or <code>objdump</code>; 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.</span></dd>
470 <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
471 <dd class="simple"><span data-l="es">Un asistente puede entender y cambiar el sistema entero sin adivinar nada, y cada cosa que hace es reversible y queda anotada. Propone; vos disponés.</span><span data-l="en">An assistant can understand and change the whole system without guessing, and everything it does is reversible and recorded. It proposes; you decide.</span></dd>
472</dl>
473</article>
474 </div>
475</div></section>
476
477<section class="franja" id="codigo"><div class="envoltura">
478 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">03 · el código</span><span data-l="en">03 · the code</span></p>
479 <h2><span data-l="es">Dónde vive el repositorio</span><span data-l="en">Where the repository lives</span></h2>
480 <p>
481 <span data-l="es">Todo —el CLI, el laboratorio, el catálogo de recetas y el diseño completo— está en un solo repositorio, bajo licencia MIT.</span>
482 <span data-l="en">Everything — the CLI, the laboratory, the recipe catalogue and the full design — lives in a single repository, under the MIT licence.</span>
483 </p>
484
485 <div class="direccion">
486 <p class="etiqueta"><span data-l="es">repositorio de código</span><span data-l="en">code repository</span></p>
487 <a class="url" href="https://git.gioser.net/sergio/takana">https://git.gioser.net/sergio/takana</a>
488 </div>
489
490<pre><span class="p">$</span> git clone https://git.gioser.net/sergio/takana.git
491<span class="p">$</span> cd takana && cargo build --release
492<span class="p">$</span> ./target/release/takana --help</pre>
493
494 <p>
495 <span data-l="es">El repositorio no trae binarios: trae <strong>recetas</strong>. Cada una fija la fuente upstream por commit o por sha256, y el hash del artefacto sale de la receta entera —fuente, compilador, banderas, fases y los hashes de sus dependencias—, así que se puede saber qué va a salir <em>antes</em> de compilar:</span>
496 <span data-l="en">The repository ships no binaries: it ships <strong>recipes</strong>. Each one pins the upstream source by commit or sha256, and the artefact hash is derived from the whole recipe — source, compiler, flags, phases and the hashes of its dependencies — so you can know what will come out <em>before</em> building it:</span>
497 </p>
498
499<pre><span class="p">$</span> takana hash ripgrep <span class="c"># el ArtifactHash vigente, sin construir</span>
500<span class="p">$</span> takana build ripgrep <span class="c"># compila aislado y sella en el store</span>
501<span class="p">$</span> takana why-differs a/ b/ <span class="c"># si dos builds no coinciden, NOMBRA la causa</span></pre>
502
503 <div class="marco">
504 <h3><span data-l="es">Cómo está repartido</span><span data-l="en">How it is laid out</span></h3>
505 <ul class="limpia">
506 <li><code>crates/</code> — <span data-l="es">el CLI, el laboratorio de build, el demonio, el diario y el overlay.</span><span data-l="en">the CLI, the build lab, the daemon, the journal and the overlay.</span></li>
507 <li><code>recipes/</code> — <span data-l="es">el catálogo: una receta <code>.toml</code> por paquete.</span><span data-l="en">the catalogue: one <code>.toml</code> recipe per package.</span></li>
508 <li><code>docs/</code> — <span data-l="es">el diseño entero (SDD y ADR). Empieza por <code>00-vision.md</code>.</span><span data-l="en">the entire design (SDDs and ADRs). Start at <code>00-vision.md</code>.</span></li>
509 <li><code>scripts/</code> — <span data-l="es">la granja de compilación, la cosecha y los arneses de verificación.</span><span data-l="en">the build farm, the harvest and the verification harnesses.</span></li>
510 </ul>
511 </div>
512</div></section>
513
514<section class="franja" id="estado"><div class="envoltura">
515 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">04 · el estado, medido</span><span data-l="en">04 · the state, measured</span></p>
516 <h2><span data-l="es">Qué anda y qué no</span><span data-l="en">What works and what doesn't</span></h2>
517 <table>
518 <thead><tr>
519 <th><span data-l="es">Pieza</span><span data-l="en">Piece</span></th>
520 <th class="semaforo"><span data-l="es">Estado</span><span data-l="en">State</span></th>
521 <th><span data-l="es">Qué quiere decir</span><span data-l="en">What that means</span></th>
522 </tr></thead>
523 <tbody>
524 <tr><td><span data-l="es">Núcleo del laboratorio</span><span data-l="en">Laboratory core</span></td><td class="semaforo">🟢</td><td><span data-l="es">Compila aislado y direcciona por hash BLAKE3.</span><span data-l="en">Sandboxed builds, BLAKE3 content addressing.</span></td></tr>
525 <tr><td><span data-l="es">Auto-hospedaje</span><span data-l="en">Self-hosting</span></td><td class="semaforo">🟢</td><td><span data-l="es">El toolchain se reconstruye a sí mismo dentro de una máquina virtual, bit por bit igual.</span><span data-l="en">The toolchain rebuilds itself inside a VM, bit for bit identical.</span></td></tr>
526 <tr><td><span data-l="es">Cadena Rust/LLVM</span><span data-l="en">Rust/LLVM chain</span></td><td class="semaforo">🟢</td><td><span data-l="es">De mrustc hasta rustc, sin binarios ajenos de confianza.</span><span data-l="en">From mrustc up to rustc, with no trusted foreign binaries.</span></td></tr>
527 <tr><td><span data-l="es">Kernel propio</span><span data-l="en">Own kernel</span></td><td class="semaforo">🟢</td><td><span data-l="es">Linux compilado acá (6.16.12 y 7.1.2), que arranca la máquina y reproduce idéntico.</span><span data-l="en">Linux built here (6.16.12 and 7.1.2), boots the machine and reproduces identically.</span></td></tr>
528 <tr><td><span data-l="es">Catálogo</span><span data-l="en">Catalogue</span></td><td class="n">941</td><td><span data-l="es"><strong>926 selladas</strong>, 15 en deuda. Una granja compila y promueve las que funcionan.</span><span data-l="en"><strong>926 sealed</strong>, 15 in debt. A farm builds and promotes the ones that work.</span></td></tr>
529 <tr><td><span data-l="es">Almacén</span><span data-l="en">Store</span></td><td class="n">1407</td><td><span data-l="es">Artefactos direccionados por contenido, cada uno con su hash.</span><span data-l="en">Content-addressed artefacts, each with its hash.</span></td></tr>
530 <tr><td><span data-l="es">Paquetería</span><span data-l="en">Packaging</span></td><td class="semaforo">🟢</td><td><span data-l="es">Empaquetar, repositorio firmado, instalar, desinstalar, dependencias y repo por red.</span><span data-l="en">Package, signed repository, install, uninstall, dependencies and network repo.</span></td></tr>
531 <tr><td><span data-l="es">Escritorios</span><span data-l="en">Desktops</span></td><td class="semaforo">🟢</td><td><span data-l="es">Cuatro perfiles con su clausura sellada: KDE 418/420, GNOME 318/319, COSMIC 282/283, sway 269/270.</span><span data-l="en">Four profiles with their closure sealed: KDE 418/420, GNOME 318/319, COSMIC 282/283, sway 269/270.</span></td></tr>
532 <tr><td><span data-l="es">Instalar en disco real</span><span data-l="en">Install on a real disk</span></td><td class="semaforo">🟡</td><td><span data-l="es">Las imágenes EFI/ISO arrancan en metal; el instalador desde el vivo está a medias.</span><span data-l="en">EFI/ISO images boot on bare metal; the installer from the live system is half done.</span></td></tr>
533 <tr><td><span data-l="es">Distro redonda</span><span data-l="en">A rounded distro</span></td><td class="semaforo">⚪</td><td><span data-l="es">Instalable por alguien que no la escribió. Todavía no.</span><span data-l="en">Installable by somebody who didn't write it. Not yet.</span></td></tr>
534 </tbody>
535 </table>
536 <p>
537 <span data-l="es">Lo más difícil ya está: <strong>no dependemos de binarios precocidos de nadie</strong>. Partiendo de un compilador mínimo, takana reconstruye su propio Rust, su propio kernel y sus propias herramientas — y al hacerlo dos veces da exactamente el mismo resultado. Se probó dentro de una máquina virtual, no en teoría.</span>
538 <span data-l="en">The hardest part is done: <strong>we depend on nobody's precooked binaries</strong>. Starting from a minimal compiler, takana rebuilds its own Rust, its own kernel and its own tools — and doing it twice gives exactly the same result. It was proved inside a virtual machine, not in theory.</span>
539 </p>
540 <p class="nota">
541 <span data-l="es">Las cifras salen de <code>docs/state/build-state.json</code> y del almacén de la caja, medidas el 2026-09-21. No se estiman: se cuentan.</span>
542 <span data-l="en">The figures come from <code>docs/state/build-state.json</code> and the box's store, measured on 2026-09-21. They are not estimated: they are counted.</span>
543 </p>
544</div></section>
545
546<section class="franja" id="paquetes"><div class="envoltura">
547 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · los paquetes</span><span data-l="en">05 · the packages</span></p>
548 <h2><span data-l="es">El repositorio de paquetes</span><span data-l="en">The package repository</span></h2>
549 <p>
550 <span data-l="es">El índice está firmado y cada paquete trae la <em>receta</em> de su contenido, no el binario cocinado: <code>install</code> resuelve el nombre, verifica la firma del índice y <strong>reconstruye desde fuente</strong> antes de hidratar. Un origen de descarga no necesita ser de confianza — lo que se verifica es el contenido.</span>
551 <span data-l="en">The index is signed and each package carries the <em>recipe</em> for its content, not the cooked binary: <code>install</code> resolves the name, verifies the index signature and <strong>rebuilds from source</strong> before hydrating. A download origin does not need to be trusted — what gets verified is the content.</span>
552 </p>
553
554 <div class="direccion">
555 <p class="etiqueta"><span data-l="es">repositorio de paquetes</span><span data-l="en">package repository</span></p>
556 <a class="url" href="/repo/">https://takana-os.net/repo/</a>
557 </div>
558
559<pre><span class="p">$</span> takana repo list --repo https://takana-os.net/repo
560<span class="p">$</span> takana repo verify --repo https://takana-os.net/repo --trust ./trust
561<span class="p">$</span> takana install age --repo https://takana-os.net/repo --trust ./trust</pre>
562
563 <p class="nota">
564 <span data-l="es">Hoy publica la clausura del perfil <code>servidor</code>. El mismo repo se sirve también en <a href="https://repo.gioser.net/">repo.gioser.net</a>; <code>--repo</code> acepta varios orígenes separados por coma y los prueba en orden.</span>
565 <span data-l="en">It currently publishes the closure of the <code>servidor</code> profile. The same repo is also served at <a href="https://repo.gioser.net/">repo.gioser.net</a>; <code>--repo</code> takes several comma-separated origins and tries them in order.</span>
566 </p>
567</div></section>
568
569<section class="franja"><div class="envoltura">
570 <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">06 · la frontera</span><span data-l="en">06 · the border</span></p>
571 <h2><span data-l="es">Qué tiene que ver con tawasuyu</span><span data-l="en">How it relates to tawasuyu</span></h2>
572 <p>
573 <span data-l="es"><strong>takana es el suelo; tawasuyu es lo que se para encima.</strong> No son dos mundos sueltos: comparten el almacén direccionado por contenido (BLAKE3), un bus entre el init de tawasuyu y el demonio de takana con contrato por bytes, el grafo de arranque, y <code>arje</code> —el proceso número uno de tawasuyu— como init de las imágenes, estático contra musl.</span>
574 <span data-l="en"><strong>takana is the ground; tawasuyu is what stands on it.</strong> They are not two loose worlds: they share the content-addressed store (BLAKE3), a bus between tawasuyu's init and takana's daemon with a byte-level contract, the boot graph, and <code>arje</code> — tawasuyu's process number one — as the init of the images, statically linked against musl.</span>
575 </p>
576 <p>
577 <span data-l="es">Lo que sigue abierto está escrito y priorizado, no supuesto: consenso de reconstrucción M-de-N, y explicar <em>por qué difiere</em> cuando dos compilaciones no dan el mismo hash.</span>
578 <span data-l="en">What is still open is written down and prioritised, not assumed: M-of-N rebuild consensus, and explaining <em>why it differs</em> when two builds don't produce the same hash.</span>
579 </p>
580</div></section>
581
582<footer class="pie"><div class="envoltura">
583 <div class="pie-rejilla">
584 <div>
585 <a class="casa" href="https://git.gioser.net/sergio/takana"><span data-l="es">El repositorio</span><span data-l="en">The repository</span> ↗</a>
586 <p>git.gioser.net/sergio/takana</p>
587 </div>
588 <div>
589 <a class="casa" href="/repo/"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
590 <p>takana-os.net/repo</p>
591 </div>
592 <div>
593 <a class="casa" href="https://tawasuyu.net">tawasuyu.net ↗</a>
594 <p><span data-l="es">El territorio que se para encima.</span><span data-l="en">The territory that stands on top.</span></p>
595 </div>
596 <div>
597 <a class="casa" href="https://hifas.gioser.net">hifas ↗</a>
598 <p><span data-l="es">Réplicas sin coordinarse, con demostración.</span><span data-l="en">Replicas without coordination, with a proof.</span></p>
599 </div>
600 </div>
601 <p class="pie-fin">
602 <span data-l="es">takana · licencia MIT · esta página se sirve del propio repositorio (<code>web/takana-os.net/</code>) y no le pide nada a terceros: las tipografías —Chivo e IBM Plex, ambas SIL OFL— viajan con ella.</span>
603 <span data-l="en">takana · MIT licence · this page is served from the repository itself (<code>web/takana-os.net/</code>) and asks nothing of third parties: the typefaces — Chivo and IBM Plex, both SIL OFL — travel with it.</span>
604 </p>
605</div></footer>
606
607<script>
608(function(){
609 var r=document.documentElement;
610 function pintar(){
611 var l=r.dataset.lang;
612 document.querySelectorAll('[data-poner-lang]').forEach(function(b){
613 b.classList.toggle('on', b.dataset.ponerLang===l);
614 });
615 r.setAttribute('lang', l);
616 }
617 try{ var g=localStorage.getItem('takana-lang'); if(g) r.dataset.lang=g;
618 var t=localStorage.getItem('takana-tema'); if(t) r.dataset.theme=t; }catch(e){}
619 if(!r.dataset.lang) r.dataset.lang = (navigator.language||'es').slice(0,2)==='es' ? 'es' : 'en';
620 pintar();
621 document.querySelectorAll('[data-poner-lang]').forEach(function(b){
622 b.addEventListener('click', function(){
623 r.dataset.lang=b.dataset.ponerLang; pintar();
624 try{ localStorage.setItem('takana-lang', r.dataset.lang); }catch(e){}
625 });
626 });
627 document.getElementById('tema').addEventListener('click', function(){
628 var oscuro = r.dataset.theme ? r.dataset.theme==='dark'
629 : matchMedia('(prefers-color-scheme:dark)').matches;
630 r.dataset.theme = oscuro ? 'light' : 'dark';
631 try{ localStorage.setItem('takana-tema', r.dataset.theme); }catch(e){}
632 });
633})();
634</script>
635</body>
636</html>