Files
Sergio 008692f7b9 sitio: el dominio ya tiene SSL, y takana.gioser.net pasa a redirigir acá
El DNS de `takana-os.net` y `www` quedó apuntado, así que Caddy sacó el
certificado de Let's Encrypt (vence el 2026-12-20) y el sitio responde 200. Un
detalle que costó dos minutos y no estaba escrito: **el vhost se había puesto
ANTES del DNS**, y Caddy no reintenta al instante — se queda en su backoff y el
nombre sigue mudo aunque el registro ya esté. `arjectl restart caddy` fuerza el
reintento; anotado en el README del sitio.

Dos nombres más, y los dos SÓLO redirigen:

  takana.gioser.net  → 301 a takana-os.net   (la página vieja, la de hermanas.py)
  git.takana-os.net  → 301 a git.gioser.net  ( le falta el registro A)

`git.takana-os.net` no sirve gitea y no es por pereza: gitea tiene UN `ROOT_URL`
con el que arma cada enlace absoluto y cada URL de clon que muestra la UI.
Colgarlo de un segundo nombre daría un sitio que se contradice —entrás por uno y
te ofrece clonar del otro— y moverlo de verdad rompe los clones y el CI que ya
apuntan al viejo. `git clone` sigue el 301 sin chistar.

⚠ `publicar-webs.sh` comparaba `takana.gioser.net` contra el fichero en disco, y
eso ya no aplica: ahora es un 301. Se separó el control en dos —`comprobar` por
sha contra el disco, `redirige` por destino— y `takana-os.net` entra en el
primero. Lo que NO entra es el `pull`: su raíz es el árbol de trabajo que los
agentes editan, y tirar de ahí mueve HEAD bajo los pies de otro (CLAUDE.md §2 ter).

⚠ Y la primera versión de `redirige()` preguntaba por `getent hosts` quién
resuelve: **en esta caja `getent` NO EXISTE** —musl/busybox no lo traen— así que
daba 127 para todo y declaraba «no resuelve todavía» hasta de los nombres que
estaban andando. Un control que nunca mira nada se ve igual que uno en verde; es
la lección del reaper otra vez. Ahora se lo pregunta a curl, por su código 6.
Corrido entero: 4 verdes por contenido, 1 por destino, 1 avisando del A que falta.

La página suma los dos verbos que ya se pueden correr contra el repo remoto sin
construir nada (`repo list` y `repo verify`), que es el commit de al lado.
2026-09-21 21:28:33 +00:00

393 lines
30 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="es" data-lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>takana — la forja determinista</title>
<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.">
<meta name="color-scheme" content="light dark">
<link rel="icon" href="simbolo.svg" type="image/svg+xml">
<link rel="stylesheet" href="fuentes.css">
<meta property="og:title" content="takana — la forja determinista">
<meta property="og:description" content="Un laboratorio hermético abajo, un Linux clásico y mutable arriba. 941 recetas, 926 selladas.">
<meta property="og:url" content="https://takana-os.net/">
<meta property="og:type" content="website">
<style>
/* ── paleta oficial (docs/marca/README.md) ─────────────────────────────────────
Obsidiana #17130E · Piedra #2A241B · Alpaca #F2EBDD
Brasa #DF6B2A · Inti #E3A63D · Rojo fragua #A63A25 · Chispa #FFF6DE
El tema claro OSCURECE brasa para el texto: #DF6B2A sobre alpaca no llega a 3:1. */
:root{
--obsidiana:#17130E;--piedra:#2A241B;--alpaca:#F2EBDD;
--brasa:#DF6B2A;--inti:#E3A63D;--fragua:#A63A25;--chispa:#17130E;
--fondo:#F2EBDD;--papel:#FAF6EC;--papel2:#EAE0CC;--linea:#DBCFB5;--linea2:#C4B593;
--texto:#17130E;--tenue:#544A3C;--debil:#6B604E;
--acento:#9E3F16;--acento2:#8A5A12;
--display:"Chivo","Arial Black",system-ui,sans-serif;
--sans:"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
--mono:"IBM Plex Mono",ui-monospace,"DejaVu Sans Mono",monospace;
color-scheme:light}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
--chispa:#FFF6DE;
--fondo:#17130E;--papel:#1D1813;--papel2:#2A241B;--linea:#332B21;--linea2:#4A3F30;
--texto:#F2EBDD;--tenue:#B8AB95;--debil:#9C907B;
--acento:#E8834A;--acento2:#E3A63D;
color-scheme:dark}}
:root[data-theme="dark"]{
--chispa:#FFF6DE;
--fondo:#17130E;--papel:#1D1813;--papel2:#2A241B;--linea:#332B21;--linea2:#4A3F30;
--texto:#F2EBDD;--tenue:#B8AB95;--debil:#9C907B;
--acento:#E8834A;--acento2:#E3A63D;
color-scheme:dark}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(--fondo);color:var(--texto);font:17px/1.62 var(--sans);
-webkit-font-smoothing:antialiased;overflow-x:hidden}
.envoltura{max-width:840px;margin:0 auto;padding:0 1.5rem}
p{margin:0 0 1rem}
a{color:inherit;text-decoration:none}
h1,h2,h3{font-weight:600;letter-spacing:-.01em;line-height:1.15}
code{font:.86em/1.5 var(--mono);background:var(--papel2);border:1px solid var(--linea);
border-radius:5px;padding:.08em .38em}
:root[data-lang="es"] [data-l="en"],:root[data-lang="en"] [data-l="es"]{display:none!important}
/* el símbolo: martillo en retícula tocapu 7×7 */
.simbolo{display:inline-block;flex:0 0 auto;aspect-ratio:1}
.simbolo .chispa{fill:var(--chispa)}
header.barra{position:sticky;top:0;z-index:60;
background:color-mix(in srgb,var(--fondo) 88%,transparent);
backdrop-filter:blur(10px);border-bottom:1px solid var(--linea)}
.barra .envoltura{display:flex;align-items:center;gap:1rem;height:58px;max-width:1080px}
.marca{display:flex;align-items:center;gap:.55rem;
font:900 .95rem/1 var(--display);letter-spacing:.06em;text-transform:uppercase}
.marca .simbolo{width:20px}
nav.enlaces{margin-left:auto;display:flex;gap:1.15rem;font-size:.88rem}
nav.enlaces a{color:var(--tenue)}
nav.enlaces a:hover{color:var(--acento)}
.perillas{display:flex;gap:.35rem}
.perilla{font:500 .76rem/1 var(--sans);color:var(--tenue);background:transparent;
border:1px solid var(--linea2);border-radius:99px;padding:.42rem .6rem;cursor:pointer}
.perilla:hover{color:var(--texto);border-color:var(--acento)}
.perilla.on{color:var(--acento);font-weight:700;border-color:var(--acento)}
@media(max-width:860px){nav.enlaces{display:none}.perillas{margin-left:auto}}
.portada{position:relative;padding:4.6rem 0 2.6rem;overflow:hidden}
.portada .fragua{position:absolute;inset:-45% -25% 5% -25%;pointer-events:none;z-index:0;
background:radial-gradient(42% 46% at 22% 32%,color-mix(in srgb,var(--brasa) 26%,transparent),transparent 70%),
radial-gradient(42% 46% at 76% 22%,color-mix(in srgb,var(--inti) 20%,transparent),transparent 70%),
radial-gradient(38% 42% at 55% 60%,color-mix(in srgb,var(--fragua) 16%,transparent),transparent 70%);
filter:blur(14px)}
.portada .envoltura{position:relative;z-index:1}
.antetitulo{font:.72rem/1 var(--mono);letter-spacing:.2em;text-transform:uppercase;
color:var(--debil);margin-bottom:1rem}
.titular{display:flex;align-items:center;gap:1.1rem;margin-bottom:.9rem}
.titular .simbolo{width:clamp(48px,9vw,74px)}
h1{font:900 clamp(3rem,10vw,5.2rem)/.92 var(--display);letter-spacing:.01em;
text-transform:uppercase;
background:linear-gradient(100deg,var(--fragua),var(--brasa) 52%,var(--inti));
-webkit-background-clip:text;background-clip:text;color:transparent}
.lema{font:400 clamp(1.1rem,2.4vw,1.35rem)/1.45 var(--sans);color:var(--texto);max-width:44ch}
.botones{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:1.6rem}
.boton{display:inline-flex;align-items:center;gap:.4rem;font:600 .9rem/1 var(--sans);
padding:.75rem 1.1rem;border-radius:99px;border:1px solid var(--linea2);color:var(--texto);
transition:border-color .2s,transform .2s}
.boton:hover{transform:translateY(-1px);border-color:var(--acento)}
.boton.lleno{border-color:transparent;color:#17130E;
background:linear-gradient(100deg,var(--brasa),var(--inti))}
section.franja{padding:3.4rem 0;border-top:1px solid var(--linea)}
.sello{display:flex;align-items:center;gap:.5rem;font:.7rem/1 var(--mono);letter-spacing:.18em;
text-transform:uppercase;color:var(--debil);margin-bottom:.9rem}
.sello .simbolo{width:12px}
.franja h2{font-size:clamp(1.55rem,3.4vw,2rem);margin-bottom:1rem}
.franja p{color:var(--tenue)}
.franja p strong,.franja li strong{color:var(--texto)}
ul.limpia{list-style:none;margin:.4rem 0 1rem}
ul.limpia li{position:relative;padding-left:1.15rem;margin-bottom:.45rem;color:var(--tenue);font-size:.95rem}
ul.limpia li::before{content:"";position:absolute;left:0;top:.62em;width:7px;height:2px;background:var(--brasa)}
.marco{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
padding:1.3rem 1.4rem;margin-bottom:1rem;position:relative;overflow:hidden}
.marco::before{content:"";position:absolute;inset:0 0 auto 0;height:3px;
background:linear-gradient(90deg,var(--fragua),var(--brasa),var(--inti))}
.marco h3{font-size:1.15rem;margin-bottom:.4rem}
/* la ficha de repo: la dirección, grande y copiable */
.direccion{border:1px solid var(--linea2);border-radius:12px;background:var(--papel);
padding:1rem 1.1rem;margin:.2rem 0 1rem}
.direccion .etiqueta{font:.68rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;
color:var(--debil);margin-bottom:.5rem}
.direccion .url{font:500 clamp(.86rem,2.3vw,1.02rem)/1.45 var(--mono);color:var(--acento);
word-break:break-all}
.direccion .url:hover{text-decoration:underline}
pre{font:.84rem/1.65 var(--mono);background:var(--papel2);border:1px solid var(--linea);
border-radius:10px;padding:.85rem 1rem;overflow-x:auto;margin:0 0 1rem;color:var(--texto)}
pre .p{color:var(--debil);user-select:none}
pre .c{color:var(--debil)}
table{border-collapse:collapse;width:100%;margin:1rem 0 1.4rem;font-size:.9rem;display:block;overflow-x:auto}
th,td{border:1px solid var(--linea);padding:.52rem .7rem;text-align:left;vertical-align:top}
th{background:var(--papel2);font-weight:600;white-space:nowrap}
td{color:var(--tenue)}
td.n{font-family:var(--mono);white-space:nowrap;color:var(--texto)}
.semaforo{white-space:nowrap}
.nota{font-size:.82rem;color:var(--debil);border-left:2px solid var(--linea2);padding-left:.8rem}
footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6rem 0 3.4rem}
.pie-rejilla{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:1.4rem}
.pie-rejilla a.casa{display:block;font-weight:600;margin-bottom:.15rem}
.pie-rejilla a.casa:hover{color:var(--acento)}
.pie-rejilla p{font-size:.84rem;color:var(--debil);margin:0}
.pie-fin{margin-top:2rem;font-size:.8rem;color:var(--debil)}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
</head>
<body>
<svg width="0" height="0" style="position:absolute" aria-hidden="true">
<symbol id="tocapu" viewBox="0 0 748 748">
<rect x="0" y="0" width="100" height="100" fill="#A63A25"/>
<rect x="108" y="0" width="100" height="100" fill="#DF6B2A"/>
<rect x="216" y="0" width="100" height="100" fill="#E3A63D"/>
<rect x="324" y="0" width="100" height="100" fill="#E3A63D"/>
<rect x="432" y="0" width="100" height="100" fill="#E3A63D"/>
<rect x="540" y="0" width="100" height="100" fill="#DF6B2A"/>
<rect x="648" y="0" width="100" height="100" fill="#A63A25"/>
<rect x="108" y="108" width="100" height="100" fill="#DF6B2A"/>
<rect x="216" y="108" width="100" height="100" fill="#E3A63D"/>
<rect x="324" y="108" width="100" height="100" class="chispa"/>
<rect x="432" y="108" width="100" height="100" fill="#E3A63D"/>
<rect x="540" y="108" width="100" height="100" fill="#DF6B2A"/>
<rect x="0" y="216" width="100" height="100" fill="#A63A25"/>
<rect x="108" y="216" width="100" height="100" fill="#DF6B2A"/>
<rect x="216" y="216" width="100" height="100" fill="#E3A63D"/>
<rect x="324" y="216" width="100" height="100" fill="#E3A63D"/>
<rect x="432" y="216" width="100" height="100" fill="#E3A63D"/>
<rect x="540" y="216" width="100" height="100" fill="#DF6B2A"/>
<rect x="648" y="216" width="100" height="100" fill="#A63A25"/>
<rect x="324" y="324" width="100" height="100" fill="#DF6B2A"/>
<rect x="324" y="432" width="100" height="100" fill="#A63A25"/>
<rect x="324" y="540" width="100" height="100" fill="#A63A25"/>
<rect x="324" y="648" width="100" height="100" fill="#A63A25"/>
</symbol>
</svg>
<header class="barra"><div class="envoltura">
<a class="marca" href="/"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg>takana</a>
<nav class="enlaces">
<a href="#pisos"><span data-l="es">Los dos pisos</span><span data-l="en">The two floors</span></a>
<a href="#codigo"><span data-l="es">El código</span><span data-l="en">The code</span></a>
<a href="#estado"><span data-l="es">El estado</span><span data-l="en">State</span></a>
<a href="#paquetes"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
</nav>
<div class="perillas">
<button class="perilla" data-poner-lang="es">ES</button>
<button class="perilla" data-poner-lang="en">EN</button>
<button class="perilla" id="tema" title="tema"></button>
</div>
</div></header>
<section class="portada"><div class="fragua" aria-hidden="true"></div><div class="envoltura">
<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>
<div class="titular">
<svg class="simbolo" viewBox="0 0 748 748" aria-hidden="true"><use href="#tocapu"/></svg>
<h1>takana</h1>
</div>
<p class="lema">
<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>
<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>
</p>
<div class="botones">
<a class="boton lleno" href="https://git.gioser.net/sergio/takana"><span data-l="es">El repositorio</span><span data-l="en">The repository</span></a>
<a class="boton" href="#paquetes"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
<a class="boton" href="https://tawasuyu.net">tawasuyu.net ↗</a>
</div>
</div></section>
<section class="franja" id="pisos"><div class="envoltura">
<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>
<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>
<p>
<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>
<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>
</p>
<p>
<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>
<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>
</p>
<div class="marco">
<h3><span data-l="es">Las tres piezas del medio</span><span data-l="en">The three pieces in between</span></h3>
<ul class="limpia">
<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>
<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>
<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>
</ul>
</div>
</div></section>
<section class="franja" id="codigo"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">02 · el código</span><span data-l="en">02 · the code</span></p>
<h2><span data-l="es">Dónde vive el repositorio</span><span data-l="en">Where the repository lives</span></h2>
<p>
<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>
<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>
</p>
<div class="direccion">
<p class="etiqueta"><span data-l="es">repositorio de código</span><span data-l="en">code repository</span></p>
<a class="url" href="https://git.gioser.net/sergio/takana">https://git.gioser.net/sergio/takana</a>
</div>
<pre><span class="p">$</span> git clone https://git.gioser.net/sergio/takana.git
<span class="p">$</span> cd takana &amp;&amp; cargo build --release
<span class="p">$</span> ./target/release/takana --help</pre>
<p>
<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>
<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>
</p>
<pre><span class="p">$</span> takana hash ripgrep <span class="c"># el ArtifactHash vigente, sin construir</span>
<span class="p">$</span> takana build ripgrep <span class="c"># compila aislado y sella en el store</span>
<span class="p">$</span> takana why-differs a/ b/ <span class="c"># si dos builds no coinciden, NOMBRA la causa</span></pre>
<div class="marco">
<h3><span data-l="es">Cómo está repartido</span><span data-l="en">How it is laid out</span></h3>
<ul class="limpia">
<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>
<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>
<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>
<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>
</ul>
</div>
</div></section>
<section class="franja" id="estado"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">03 · el estado, medido</span><span data-l="en">03 · the state, measured</span></p>
<h2><span data-l="es">Qué anda y qué no</span><span data-l="en">What works and what doesn't</span></h2>
<table>
<thead><tr>
<th><span data-l="es">Pieza</span><span data-l="en">Piece</span></th>
<th class="semaforo"><span data-l="es">Estado</span><span data-l="en">State</span></th>
<th><span data-l="es">Qué quiere decir</span><span data-l="en">What that means</span></th>
</tr></thead>
<tbody>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
</tbody>
</table>
<p>
<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>
<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>
</p>
<p class="nota">
<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>
<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>
</p>
</div></section>
<section class="franja" id="paquetes"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">04 · los paquetes</span><span data-l="en">04 · the packages</span></p>
<h2><span data-l="es">El repositorio de paquetes</span><span data-l="en">The package repository</span></h2>
<p>
<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>
<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>
</p>
<div class="direccion">
<p class="etiqueta"><span data-l="es">repositorio de paquetes</span><span data-l="en">package repository</span></p>
<a class="url" href="/repo/">https://takana-os.net/repo/</a>
</div>
<pre><span class="p">$</span> takana repo list --repo https://takana-os.net/repo
<span class="p">$</span> takana repo verify --repo https://takana-os.net/repo --trust ./trust
<span class="p">$</span> takana install age --repo https://takana-os.net/repo --trust ./trust</pre>
<p class="nota">
<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>
<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>
</p>
</div></section>
<section class="franja"><div class="envoltura">
<p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · la frontera</span><span data-l="en">05 · the border</span></p>
<h2><span data-l="es">Qué tiene que ver con tawasuyu</span><span data-l="en">How it relates to tawasuyu</span></h2>
<p>
<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>
<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>
</p>
<p>
<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>
<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>
</p>
</div></section>
<footer class="pie"><div class="envoltura">
<div class="pie-rejilla">
<div>
<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>
<p>git.gioser.net/sergio/takana</p>
</div>
<div>
<a class="casa" href="/repo/"><span data-l="es">Paquetes</span><span data-l="en">Packages</span></a>
<p>takana-os.net/repo</p>
</div>
<div>
<a class="casa" href="https://tawasuyu.net">tawasuyu.net ↗</a>
<p><span data-l="es">El territorio que se para encima.</span><span data-l="en">The territory that stands on top.</span></p>
</div>
<div>
<a class="casa" href="https://hifas.gioser.net">hifas ↗</a>
<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>
</div>
</div>
<p class="pie-fin">
<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>
<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>
</p>
</div></footer>
<script>
(function(){
var r=document.documentElement;
function pintar(){
var l=r.dataset.lang;
document.querySelectorAll('[data-poner-lang]').forEach(function(b){
b.classList.toggle('on', b.dataset.ponerLang===l);
});
r.setAttribute('lang', l);
}
try{ var g=localStorage.getItem('takana-lang'); if(g) r.dataset.lang=g;
var t=localStorage.getItem('takana-tema'); if(t) r.dataset.theme=t; }catch(e){}
if(!r.dataset.lang) r.dataset.lang = (navigator.language||'es').slice(0,2)==='es' ? 'es' : 'en';
pintar();
document.querySelectorAll('[data-poner-lang]').forEach(function(b){
b.addEventListener('click', function(){
r.dataset.lang=b.dataset.ponerLang; pintar();
try{ localStorage.setItem('takana-lang', r.dataset.lang); }catch(e){}
});
});
document.getElementById('tema').addEventListener('click', function(){
var oscuro = r.dataset.theme ? r.dataset.theme==='dark'
: matchMedia('(prefers-color-scheme:dark)').matches;
r.dataset.theme = oscuro ? 'light' : 'dark';
try{ localStorage.setItem('takana-tema', r.dataset.theme); }catch(e){}
});
})();
</script>
</body>
</html>