full trae los escritorios: mirada, sway, COSMIC y KDE — 17 GiB
Tenías razón: `full` decía «todo junto» y traía un solo escritorio. Ahora trae cuatro, y el nombre deja de prometer de más. 574 nodos, 16 GiB de rootfs, 17 GiB de imagen: pide un pendrive de 32 GB. ⚠ GNOME NO ESTÁ, y no es una elección. Los otros cuatro proyectan limpios —KDE 410/410, sin un solo setuid sin declarar— y GNOME se cae por dos cosas suyas: `accountsservice` trae /var/lib/AccountsService/users en 0700, así que hidratar como usuario normal no puede leerlo y el nodo no proyecta; y `usr/libexec/libgtop_server2` viene 4555 SIN declaración [[setuid]] en el perfil. El auditor tiene razón —un bit de privilegio sin declarar, en un rootfs hecho de artefactos inmutables, es alguien pisando la imagen— y declararlo pide saber POR QUÉ lo lleva, que es decisión de quien mantiene el perfil, no de este guion. Tres cosas más que sólo aparecen al pasar de 1 GiB a 16: ⚠ LA HOLGURA DEL EXT4 NO PUEDE SER UN NÚMERO FIJO. `du` mide el contenido, no lo que el ext4 NECESITA (inodos, journal, mapas de bloques): con 128 MiB fijos alcanzaba para un árbol de 1 GiB y `mke2fs` murió con «Could not allocate block» a mitad de poblar uno de 16, después de veinte minutos. Ahora es un 8 % del árbol, nunca menos de 128 MiB. ⚠ ARMAR UNA IMAGEN CON ESCRITORIOS PIDE PRIVILEGIO, y las variantes chicas nunca lo tocaron: ModemManager instala sus fcc-unlock.available.d/* en 0500 tal como vienen de upstream, así que copiar el árbol como usuario normal falla. Se copia con sudo y SIN chown: `cp -a` como root conserva dueño y modo, que es lo que la imagen tiene que llevar. ⚠ Y UN `-n` SILENCIOSO ES UNA DECISIÓN ESCONDIDA. Al fundir perfiles, cuando dos traen el mismo camino gana el primero; con un escritorio es siempre el mismo artefacto y da igual, con cinco ya no. No se resuelve acá —hace falta saber CUÁL debe ganar y por qué— pero se CUENTA, que es lo mínimo para que exista la pregunta: 19140 choques al entrar KDE, 19633 al entrar COSMIC. En el sitio, la nota de `full` sale sólo al elegir esa variante: el pendrive que pide y por qué no está GNOME, antes de que alguien empiece a bajar 17 GiB.
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
4 archivos · +191 −105
- scripts/instalador-usb.sh +9 −1
- scripts/instalador-variantes.sh +37 −4
- web/takana-os.net/README.md +19 −1
- web/takana-os.net/index.html +126 −99
diff --git a/scripts/instalador-usb.sh b/scripts/instalador-usb.sh
index b28c9e22..e41bcf1d 100755
--- a/scripts/instalador-usb.sh
+++ b/scripts/instalador-usb.sh
@@ -34,7 +34,11 @@ ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
IMG="${IMG:-work/takana-instalador-usb.img}"
ESP_MB="${ESP_MB:-96}"
-HOLGURA_MB="${HOLGURA_MB:-128}"
+# ⚠ **La holgura no puede ser un número fijo.** `du` mide el contenido, no lo que el ext4 NECESITA:
+# inodos, journal, mapas de bloques. Con 128 MiB fijos alcanzaba para un árbol de 1 GiB y se quedó
+# corto con uno de 16 —`mke2fs` murió con «Could not allocate block» a mitad de poblar, después de
+# veinte minutos de trabajo—. Se escala: un 8 % del árbol, y nunca menos de 128 MiB.
+HOLGURA_MB="${HOLGURA_MB:-}"
ETIQUETA="takana-medio"
[ "${1:-}" = "--salida" ] && { IMG="${2:?}"; shift 2; }
@@ -58,6 +62,10 @@ KERNEL="${KERNEL:-$TREE/payload/bzImage}"
[ -r "$KERNEL" ] || { echo "no encuentro el bzImage (set KERNEL=)" >&2; exit 1; }
TREE_MB=$(du -sm "$TREE" | cut -f1)
+if [ -z "$HOLGURA_MB" ]; then
+ HOLGURA_MB=$(( TREE_MB / 12 ))
+ [ "$HOLGURA_MB" -lt 128 ] && HOLGURA_MB=128
+fi
EXT_MB=$(( TREE_MB + HOLGURA_MB ))
TOTAL_MB=$(( ESP_MB + EXT_MB + 2 ))
echo " árbol ${TREE_MB} MiB · ext4 ${EXT_MB} MiB · imagen ${TOTAL_MB} MiB"
diff --git a/scripts/instalador-variantes.sh b/scripts/instalador-variantes.sh
index d3f2736f..fdfed688 100755
--- a/scripts/instalador-variantes.sh
+++ b/scripts/instalador-variantes.sh
@@ -4,7 +4,9 @@
# ══ QUÉ SON ═══════════════════════════════════════════════════════════════════════════════════
# servidor el piso de arranque + el userland base + el perfil `servidor`
# mirada el piso de arranque + el userland base + el escritorio propio de la suite
-# full todo lo anterior junto, más el toolbox de línea de comandos (`cli`)
+# full el userland, el toolbox (`cli`), los servicios y **cuatro escritorios** —mirada,
+# sway, cosmic y kde—. ~16 GiB: pide un pendrive de 32 GB. GNOME queda fuera por dos
+# razones medidas que no son del instalador; están escritas en `perfiles_de`.
#
# ── LA COMPOSICIÓN, Y POR QUÉ NO ES UN PERFIL SOLO ────────────────────────────────────────────
# ⚠ **«base» son DOS cosas con el mismo nombre**, y confundirlas da un rootfs que no arranca:
@@ -54,7 +56,17 @@ perfiles_de() {
servidor:run) echo "base servidor-minimo" ;;
servidor:*) echo "base servidor" ;;
mirada:*) echo "base escritorio-mirada" ;;
- full:*) echo "base cli escritorio-mirada servidor" ;;
+ # ⚠ **GNOME queda FUERA, y no es una elección: hoy no se puede proyectar.** Dos cosas, las
+ # dos medidas el 2026-09-23 y ninguna del instalador:
+ # · `accountsservice` trae `/var/lib/AccountsService/users` en 0700 ⇒ hidratar como
+ # usuario normal no puede leerlo («Permission denied») y el nodo no proyecta.
+ # · `usr/libexec/libgtop_server2` viene 4555 y **el perfil no lo declara** en `[[setuid]]`.
+ # El auditor tiene razón: un bit de privilegio sin declaración, en un rootfs hecho de
+ # artefactos inmutables, es alguien pisando la imagen. Declararlo pide saber POR QUÉ lo
+ # lleva, y eso es una decisión de quien mantiene el perfil, no de este guion.
+ # Los otros cuatro escritorios —mirada, sway, cosmic y kde— proyectan limpios (KDE: 410/410,
+ # sin un solo setuid sin declarar).
+ full:*) echo "base cli escritorio-mirada escritorio-sway escritorio-cosmic escritorio-kde servidor" ;;
*) echo "variante desconocida: $1 (servidor|mirada|full)" >&2; return 1 ;;
esac
}
@@ -113,15 +125,36 @@ compone() { # <variante> <medio> → deja el árbol local en $LOCAL/<variante>
# gana el primero y da igual cuál sea. Pisar daría el mismo resultado y un error si el
# hardlink ya existe.
chmod -R u+w "$H" 2>/dev/null || true
+ # ⚠ **Un `-n` silencioso es una decisión escondida.** Cuando dos perfiles traen el MISMO
+ # camino gana el primero, y con un solo escritorio eso es siempre el mismo artefacto y da
+ # igual. Con cinco escritorios en la misma imagen ya no: dos de ellos pueden querer el
+ # mismo `/etc/xdg/...` o el mismo `.desktop`, y quedarse callado significa que uno pisa al
+ # otro sin que nadie lo sepa. No se resuelve acá —hace falta saber CUÁL gana y por qué—
+ # pero se CUENTA, que es lo mínimo para que exista la pregunta.
+ _antes=$(find "$C" ! -type d 2>/dev/null | wc -l)
+ _trae=$(find "$H" ! -type d 2>/dev/null | wc -l)
( cd "$H" && find . -type d -exec mkdir -p "$C/{}" \; ) 2>/dev/null || true
( cd "$H" && find . ! -type d -exec cp -a -l -n {} "$C/{}" \; ) 2>/dev/null || true
+ _despues=$(find "$C" ! -type d 2>/dev/null | wc -l)
+ _choques=$(( _antes + _trae - _despues ))
+ [ "$_choques" -gt 0 ] && echo " ⚠ $_choques fichero(s) ya estaban y NO se pisaron (gana el primero)"
rm -rf "$H"
echo " $(grep -oE '[0-9]+/[0-9]+' "work/.variante-$_cv-$p.log" | tail -1) artefactos · acumulado $(du -sm "$C" | cut -f1) MiB"
done
# ── el árbol tiene que quedar en el MISMO montaje que el stage del ensamblado ─────────────
+ # ⚠ **Algunos artefactos traen ficheros que el usuario normal no puede LEER** —ModemManager
+ # instala sus `fcc-unlock.available.d/*` en 0500, que es como vienen de upstream— así que copiar
+ # el árbol pide privilegio. No se hace `chown`: `cp -a` como root conserva dueño y modo, que es
+ # justo lo que la imagen tiene que llevar. Aparece en cuanto entra un escritorio (sway, cosmic,
+ # kde); las variantes chicas nunca lo tocaron. Medido el 2026-09-23.
L="$LOCAL/$_cv-$_cm"
- rm -rf "$L"; cp -a "$C" "$L"
- rm -rf "$C"
+ rm -rf "$L" 2>/dev/null || sudo rm -rf "$L"
+ if ! cp -a "$C" "$L" 2>/dev/null; then
+ rm -rf "$L" 2>/dev/null || sudo rm -rf "$L"
+ echo " (hay ficheros que sólo root puede leer: copiando con privilegio)"
+ sudo cp -a "$C" "$L" || { echo " ✗ no pude copiar el árbol ni con privilegio" >&2; exit 1; }
+ fi
+ rm -rf "$C" 2>/dev/null || sudo rm -rf "$C"
echo " árbol local: $(du -sm "$L" | cut -f1) MiB"
}
diff --git a/web/takana-os.net/README.md b/web/takana-os.net/README.md
index c90decfb..c975f58a 100644
--- a/web/takana-os.net/README.md
+++ b/web/takana-os.net/README.md
@@ -105,7 +105,7 @@ La diferencia es **qué rootfs se copia al disco**, no cómo: el instalador y el
| `base` | sólo el piso de arranque | 137 MiB | 519 MiB |
| `mirada` | + `[perfil.base]` + `[perfil.escritorio-mirada]` | 524 MiB | 1,6 GiB |
| `servidor` | `.sh`: `base` + `servidor-minimo` · USB: `base` + `servidor` | 580 MiB | 3,2 GiB |
-| `full` | + `base` + `cli` + `escritorio-mirada` + `servidor` | **no hay** | 3,5 GiB |
+| `full` | + `base` + `cli` + `servidor` + **mirada, sway, cosmic y kde** | **no hay** | 17 GiB |
⚠ **«base» son DOS cosas con el mismo nombre y confundirlas da un rootfs que no arranca.** El
*piso de arranque* es `product-rootfs` —arje-zero como PID 1 + busybox— y **no está en ningún
@@ -129,6 +129,24 @@ destino de verdad. No es una opinión sobre qué debe llevar un servidor: es una
MEDIO, y está escrita en los dos sitios —acá y en el `descripcion` del perfil— para que nadie la
lea como un recorte arbitrario.
+⚠ **GNOME no está en `full`, y no es una elección.** Los otros cuatro escritorios proyectan limpios
+(KDE: 410/410, sin un solo setuid sin declarar). GNOME se cae por dos cosas suyas, medidas el
+2026-09-23: `accountsservice` trae `/var/lib/AccountsService/users` en **0700**, así que hidratar
+como usuario normal no puede leerlo y el nodo no proyecta; y `usr/libexec/libgtop_server2` viene
+**4555 sin declaración `[[setuid]]`** en el perfil. El auditor tiene razón —un bit de privilegio sin
+declarar, en un rootfs hecho de artefactos inmutables, es alguien pisando la imagen— y declararlo
+pide saber POR QUÉ lo lleva, que es decisión de quien mantiene el perfil.
+
+⚠ **La holgura del ext4 se escala con el árbol, no es un número fijo.** `du` mide el contenido, no
+lo que el ext4 NECESITA (inodos, journal, mapas de bloques): con 128 MiB fijos alcanzaba para 1 GiB
+y `mke2fs` murió con «Could not allocate block» a mitad de poblar un árbol de 16 GiB, después de
+veinte minutos de trabajo. Hoy es un 8 % del árbol, nunca menos de 128 MiB.
+
+⚠ **Armar una imagen con escritorios pide privilegio**, y las variantes chicas nunca lo tocaron:
+ModemManager instala sus `fcc-unlock.available.d/*` en **0500** tal como vienen de upstream, así que
+copiar el árbol como usuario normal falla. Se copia con `sudo` y **sin `chown`**: `cp -a` como root
+conserva dueño y modo, que es lo que la imagen tiene que llevar.
+
⚠ **`full` no tiene `.sh`, y es física.** El fichero único carga el instalador entero en memoria
—es lo que le permite soltar el disco— y ahí viven a la vez el initramfs comprimido y su contenido
desempaquetado. Con 3,2 GiB de rootfs eso pide ~8 GiB de RAM en la máquina donde se instale. El USB
diff --git a/web/takana-os.net/index.html b/web/takana-os.net/index.html
index c7132158..0260e800 100644
--- a/web/takana-os.net/index.html
+++ b/web/takana-os.net/index.html
@@ -49,9 +49,12 @@ p{margin:0 0 1rem}
a{color:inherit;text-decoration:none}
h1,h2,h3{font-weight:600;letter-spacing:-.01em;line-height:1.15}
/* el selector de variante: nombre, qué es, y entre llaves lo que trae */
-.selector{display:grid;grid-template-columns:repeat(auto-fit,minmax(176px,1fr));gap:.5rem;
+/* SIEMPRE dos y dos, y las cuatro del mismo alto: `grid-auto-rows:1fr` iguala las
+ dos filas entre sí, y el `stretch` por defecto iguala las dos de cada fila. */
+.selector{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:1fr;gap:.5rem;
margin:1.5rem 0 1.7rem}
-.opcion{text-align:left;background:var(--papel);border:1px solid var(--linea2);border-radius:12px;
+.opcion{display:flex;flex-direction:column;text-align:left;background:var(--papel);
+ border:1px solid var(--linea2);border-radius:12px;
padding:.72rem .85rem;cursor:pointer;font:inherit;color:var(--texto);
transition:border-color .15s,box-shadow .15s}
.opcion:hover{border-color:var(--acento)}
@@ -67,13 +70,17 @@ h1,h2,h3{font-weight:600;letter-spacing:-.01em;line-height:1.15}
font:.7rem/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--debil)}
.rotulo .peso{margin-left:auto;letter-spacing:0;text-transform:none;color:var(--tenue)}
.codigo{position:relative}
-.codigo pre{margin:0;padding-right:5.4rem}
-.copiar{position:absolute;top:.5rem;right:.5rem;font:500 .7rem/1 var(--sans);color:var(--tenue);
+/* el botón vive en una banda propia arriba: así no pisa la primera línea ni cuando
+ el comando es largo y el bloque scrollea por debajo. Y el `min-height` deja todas
+ las cajas del mismo alto — con tres líneas, con dos, o con el aviso de que no hay. */
+.codigo pre{margin:0;padding:2.7rem 1rem .9rem;min-height:7.8rem}
+.copiar{position:absolute;top:.55rem;right:.6rem;font:500 .7rem/1 var(--sans);color:var(--tenue);
background:var(--papel);border:1px solid var(--linea2);border-radius:8px;padding:.35rem .58rem;
cursor:pointer;transition:color .15s,border-color .15s}
.copiar:hover,.copiar.ok{color:var(--acento);border-color:var(--acento)}
+.bloque.novale .copiar{display:none}
pre a{color:var(--acento);text-decoration:underline;text-underline-offset:2px}
-.solousb{font:.8rem/1.4 var(--sans);color:var(--debil);margin:0 0 1.2rem}
+pre .vacio{color:var(--debil)}
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}
@@ -137,21 +144,30 @@ ul.limpia li::before{content:"";position:absolute;left:0;top:.62em;width:7px;hei
/* las decisiones: cada una es una ficha con tres lecturas de lo mismo —
contra qué se decide, qué implica por dentro, y qué quiere decir sin jerga */
-.decisiones{display:grid;gap:.85rem;margin-top:1.5rem}
-.decision{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
- padding:1.15rem 1.3rem}
-.decision h3{font-size:1.08rem;line-height:1.3;margin-bottom:.85rem;
- display:flex;gap:.65rem;align-items:baseline}
+.decisiones{display:grid;gap:.5rem;margin-top:1.5rem}
+.decision{border:1px solid var(--linea);border-radius:14px;background:var(--papel)}
+/* plegadas de entrada: trece fichas abiertas son una pared. La aseveración basta
+ para elegir cuál abrir, y `<details>` funciona sin una línea de JavaScript. */
+.decision summary{display:flex;gap:.65rem;align-items:baseline;cursor:pointer;
+ list-style:none;position:relative;padding:.9rem 2.7rem .9rem 1.3rem;
+ font-size:1.02rem;line-height:1.35}
+.decision summary::-webkit-details-marker{display:none}
+.decision summary::after{content:"";position:absolute;right:1.3rem;top:1.25rem;
+ width:.46rem;height:.46rem;border-right:1.5px solid var(--debil);
+ border-bottom:1.5px solid var(--debil);transform:rotate(45deg);transition:transform .18s}
+.decision[open] summary::after{transform:rotate(-135deg);border-color:var(--acento)}
+.decision summary:hover::after{border-color:var(--acento)}
.decision .num{font:500 .72rem/1 var(--mono);letter-spacing:.1em;color:var(--acento);flex:0 0 auto}
-.decision dl{margin:0}
+.decision dl{margin:0;padding:0 1.3rem 1.25rem}
.decision dt{font:500 .65rem/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;
color:var(--debil);margin-bottom:.32rem}
.decision dd{margin:0 0 .9rem;color:var(--tenue);font-size:.93rem}
.decision dd:last-child{margin-bottom:0}
.decision dt.simple{color:var(--acento)}
.decision dd.simple{color:var(--texto);border-left:2px solid var(--acento);padding-left:.8rem}
-@media(max-width:600px){.decision{padding:1rem 1.05rem}
- .decision h3{flex-direction:column;gap:.25rem}}
+@media(max-width:600px){.decision summary{padding:.85rem 2.4rem .85rem 1.05rem;
+ flex-direction:column;gap:.25rem}
+ .decision dl{padding:0 1.05rem 1.05rem}}
.marco{border:1px solid var(--linea);border-radius:14px;background:var(--papel);
padding:1.3rem 1.4rem;margin-bottom:1rem;position:relative;overflow:hidden}
@@ -225,7 +241,6 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<a class="marca" href="/"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg>takana</a>
<nav class="enlaces">
<a href="#descargar"><span data-l="es">Descargar</span><span data-l="en">Download</span></a>
- <a href="#pisos"><span data-l="es">Los dos pisos</span><span data-l="en">The two floors</span></a>
<a href="#decisiones"><span data-l="es">Las decisiones</span><span data-l="en">The decisions</span></a>
<a href="#estado"><span data-l="es">El estado</span><span data-l="en">State</span></a>
<a href="#repositorios"><span data-l="es">Repositorios</span><span data-l="en">Repositories</span></a>
@@ -244,8 +259,8 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<h1>takana</h1>
</div>
<p class="lema">
- <span data-l="es">Una distribución de Linux de dos pisos. Abajo, una fábrica cerrada: todo desde su código fuente, siempre idéntico, con su origen comprobable. Arriba, un sistema corriente: tuyo, modificable, reversible.</span>
- <span data-l="en">A Linux distribution with two floors. Downstairs, a closed factory: everything from its own source code, always identical, its origin checkable. Upstairs, an ordinary system: yours, changeable, reversible.</span>
+ <span data-l="es">Un Linux que podés romper a mano sin dejar de saber de dónde salió cada byte: todo lo que corre se rehace desde su código fuente, igual al último bit, y nada de eso te quita la máquina. Por separado, las dos cosas ya existen. Juntas, no.</span>
+ <span data-l="en">A Linux you can break by hand without losing track of where every byte came from: everything that runs can be rebuilt from its source code, identical to the last bit, and none of that takes the machine away from you. Separately, both things already exist. Together, they don't.</span>
</p>
<div class="botones">
<a class="boton lleno" href="#descargar"><span data-l="es">Descargar</span><span data-l="en">Download</span></a>
@@ -277,7 +292,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<button class="opcion" data-v="full" type="button">
<span class="nom">full</span>
<span class="que"><span data-l="es">todo junto</span><span data-l="en">everything at once</span></span>
- <span class="trae">{userland + cli + mirada, sway, cosmic, kde + <span data-l="es">servicios</span><span data-l="en">services</span>}</span>
+ <span class="trae">{userland + cli + <span data-l="es">4 escritorios + servicios</span><span data-l="en">4 desktops + services</span>}</span>
</button>
</div>
@@ -285,8 +300,6 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<p class="rotulo"><span data-l="es">un archivo</span><span data-l="en">one file</span><span class="peso" id="peso-sh"></span></p>
<div class="codigo"><pre id="cmd-sh"></pre></div>
</div>
- <p class="solousb" id="solo-usb" hidden><span data-l="es">sin archivo único — sólo USB</span><span data-l="en">no single file — USB only</span></p>
-
<div class="bloque">
<p class="rotulo"><span data-l="es">imagen USB</span><span data-l="en">USB image</span><span class="peso" id="peso-img"></span></p>
<div class="codigo"><pre id="cmd-img"></pre></div>
@@ -299,40 +312,60 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<span class="p">$</span> ./target/release/takana --help</pre></div>
</div>
- <noscript><p class="nota"><span data-l="es">Las descargas se arman con JavaScript. Sin él: takana-os.net/descargas/</span><span data-l="en">Downloads are assembled with JavaScript. Without it: takana-os.net/descargas/</span></p></noscript>
-</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">02 · los dos pisos</span><span data-l="en">02 · 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 class="nota" id="nota-full" hidden>
+ <span data-l="es"><code>full</code> son 17 GiB: pide un pendrive de <strong>32 GB</strong> y no cabe en el archivo único, porque ése carga el sistema entero en memoria. <strong>GNOME no está</strong>, y no es una elección: su <code>accountsservice</code> trae un directorio en 0700 que no se puede proyectar sin privilegio, y su <code>libgtop_server2</code> viene con bit de privilegio y sin declarar — el auditor lo rechaza, con razón. Los otros cuatro escritorios entran limpios.</span>
+ <span data-l="en"><code>full</code> is 17 GiB: it needs a <strong>32 GB</strong> stick and does not fit in the single file, because that one loads the whole system into memory. <strong>GNOME is not in it</strong>, and that is not a choice: its <code>accountsservice</code> ships a 0700 directory that cannot be projected without privilege, and its <code>libgtop_server2</code> comes with a privilege bit and no declaration — the auditor rejects it, rightly. The other four desktops go in clean.</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>
+
+ <noscript><p class="nota"><span data-l="es">Las descargas se arman con JavaScript. Sin él: takana-os.net/descargas/</span><span data-l="en">Downloads are assembled with JavaScript. Without it: takana-os.net/descargas/</span></p></noscript>
</div></section>
<section class="franja" id="decisiones"><div class="envoltura">
- <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">03 · las decisiones</span><span data-l="en">03 · the decisions</span></p>
- <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>
+ <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>
+ <h2><span data-l="es">Trece decisiones, y contra qué se tomaron</span><span data-l="en">Thirteen decisions, and what they were taken against</span></h2>
<p>
- <span data-l="es">La primera es la de arriba, los dos pisos. Estas son las otras diez.</span>
- <span data-l="en">The first one is above: the two floors. These are the other ten.</span>
+ <span data-l="es">Cada una se abre: en qué se aparta de lo habitual, qué implica por dentro, y qué quiere decir sin jerga.</span>
+ <span data-l="en">Each one opens: how it departs from the usual, what it involves under the hood, and what it means without jargon.</span>
</p>
<div class="decisiones">
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">01</span><span data-l="es">Una fábrica cerrada abajo, tu máquina de siempre arriba</span><span data-l="en">A closed factory below, your usual machine above</span></summary>
+<dl>
+ <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
+ <dd><span data-l="es">Hay que elegir: una distro inmutable, que da reproducibilidad y te quita la terminal, o una clásica, que te la deja y no sabe decir de dónde salió un binario.</span><span data-l="en">You have to choose: an immutable distro, which gives reproducibility and takes the terminal away, or a classic one, which leaves it to you and cannot say where a binary came from.</span></dd>
+ <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
+ <dd><span data-l="es">Abajo, compilación aislada y direccionada por hash BLAKE3, sin efectos de borde. Arriba, un Linux con <code>/bin</code>, <code>/lib</code> y <code>/etc</code> de verdad; los binarios se proyectan del almacén por enlaces duros, normalizados para no arrastrar rutas internas. El puente —la hidratación— va en un solo sentido.</span><span data-l="en">Below, sandboxed builds addressed by BLAKE3 hash, with no side effects. Above, a Linux with a real <code>/bin</code>, <code>/lib</code> and <code>/etc</code>; binaries are projected from the store by hard links, normalised so they carry no internal paths. The bridge — hydration — goes one way only.</span></dd>
+ <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
+ <dd class="simple"><span data-l="es">La parte que tiene que ser exacta lo es, y la parte donde trabajás sigue siendo un Linux normal. Lo demás de esta lista sale de ahí.</span><span data-l="en">The part that has to be exact is exact, and the part where you work is still an ordinary Linux. Everything else on this list follows from that.</span></dd>
+</dl>
+</details>
+
+<details class="decision">
+<summary><span class="num">02</span><span data-l="es">Se instala con un archivo, sin ISO y sin red</span><span data-l="en">It installs from one file, no ISO and no network</span></summary>
+<dl>
+ <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
+ <dd><span data-l="es">Lo normal es bajar un ISO, grabarlo en un pendrive, y que el instalador se baje los paquetes mientras instala — justo en la máquina que todavía no tiene red.</span><span data-l="en">The usual is downloading an ISO, burning it to a stick, and having the installer fetch packages while it installs — on the very machine that has no network yet.</span></dd>
+ <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
+ <dd><span data-l="es">El fichero es una cabecera POSIX de shell con el sistema entero pegado detrás: comprueba su propio contenido, se carga en memoria y salta con <code>kexec</code> al instalador, que suelta el disco de la máquina viva para poder formatearlo. <strong>Nada se descarga durante la instalación.</strong> Si ese kernel no deja saltar, lo dice y nombra cuál de las tres condiciones falta; para ese caso está la imagen USB, que es el mismo instalador por otro camino.</span><span data-l="en">The file is a POSIX shell header with the whole system appended: it verifies its own contents, loads into memory and jumps with <code>kexec</code> into the installer, which releases the live machine's disk so it can be formatted. <strong>Nothing is downloaded while installing.</strong> If that kernel will not allow the jump, it says so and names which of the three conditions is missing; for that case there is the USB image, the same installer arriving another way.</span></dd>
+ <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
+ <dd class="simple"><span data-l="es">Un archivo, permiso de ejecución, y ya. Se puede leer con <code>head</code> antes de correrlo, no necesita internet, y el disco desde el que arrancaste nunca aparece como destino.</span><span data-l="en">One file, make it executable, done. You can read it with <code>head</code> before running it, it needs no internet, and the disk you booted from is never offered as a target.</span></dd>
+</dl>
+</details>
+
+<details class="decision">
+<summary><span class="num">03</span><span data-l="es">Trae su propio escritorio, y el ecosistema que va encima</span><span data-l="en">It brings its own desktop, and the ecosystem above it</span></summary>
+<dl>
+ <dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
+ <dd><span data-l="es">Una distribución suele ensamblar escritorios ajenos y ahí termina su alcance: lo que corre encima es problema de otro proyecto.</span><span data-l="en">A distribution usually assembles other people's desktops and that is where its scope ends: what runs on top is another project's problem.</span></dd>
+ <dt><span data-l="es">Técnicamente</span><span data-l="en">Technically</span></dt>
+ <dd><span data-l="es"><code>mirada</code> es el escritorio propio y viaja en la imagen. Encima está <strong>tawasuyu</strong>, que no es un añadido: comparten el almacén direccionado por contenido, el grafo de arranque y <code>arje</code> —su proceso número uno— como init de las imágenes. Y los cuatro escritorios conocidos están construidos igual, con su clausura sellada: KDE, GNOME, COSMIC y sway.</span><span data-l="en"><code>mirada</code> is the project's own desktop and travels in the image. Above it sits <strong>tawasuyu</strong>, which is not an add-on: they share the content-addressed store, the boot graph and <code>arje</code> — its process number one — as the init of the images. And the four well-known desktops are built the same way, with their closure sealed: KDE, GNOME, COSMIC and sway.</span></dd>
+ <dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
+ <dd class="simple"><span data-l="es">No es sólo una base para que otros pongan cosas encima: el escritorio y lo que corre en él son parte del mismo proyecto y están pensados juntos. Si preferís uno conocido, también está.</span><span data-l="en">It is not just a base for others to put things on: the desktop and what runs on it belong to the same project and are designed together. If you prefer a well-known one, it is there too.</span></dd>
+</dl>
+</details>
+
+<details class="decision">
+<summary><span class="num">04</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -341,10 +374,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">05</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -353,10 +386,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">06</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -365,10 +398,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">07</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -377,10 +410,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">08</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -389,10 +422,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">09</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -401,10 +434,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">10</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -413,10 +446,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">11</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -425,10 +458,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">12</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -437,10 +470,10 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
-<article class="decision">
-<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>
+<details class="decision">
+<summary><span class="num">13</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></summary>
<dl>
<dt><span data-l="es">Frente a lo habitual</span><span data-l="en">Compared to the usual</span></dt>
<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>
@@ -449,12 +482,12 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<dt class="simple"><span data-l="es">En simple</span><span data-l="en">In plain words</span></dt>
<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>
</dl>
-</article>
+</details>
</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">04 · el estado, medido</span><span data-l="en">04 · the state, measured</span></p>
+ <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>
@@ -480,13 +513,13 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
<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>
+ <span data-l="es">Las cifras salen de <code>docs/state/build-state.json</code> y del almacén de la caja. No se estiman: se cuentan. Lo que sigue abierto también está escrito: consenso de reconstrucción M-de-N, y el instalador desde el vivo.</span>
+ <span data-l="en">The figures come from <code>docs/state/build-state.json</code> and the box's store. They are not estimated: they are counted. What is still open is written down too: M-of-N rebuild consensus, and the installer from the live system.</span>
</p>
</div></section>
<section class="franja" id="repositorios"><div class="envoltura">
- <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · los repositorios</span><span data-l="en">05 · the repositories</span></p>
+ <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">04 · los repositorios</span><span data-l="en">04 · the repositories</span></p>
<h2><span data-l="es">Los repositorios</span><span data-l="en">The repositories</span></h2>
<div class="direccion">
@@ -511,7 +544,7 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div></section>
<section class="franja" id="llamar"><div class="envoltura">
- <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">06 · cómo se llama</span><span data-l="en">06 · how it is called</span></p>
+ <p class="sello"><svg class="simbolo" viewBox="0 0 748 748"><use href="#tocapu"/></svg><span data-l="es">05 · cómo se llama</span><span data-l="en">05 · how it is called</span></p>
<h2><span data-l="es">Cómo se llama</span><span data-l="en">How it is called</span></h2>
<div class="bloque">
@@ -536,19 +569,6 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
</div>
</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">07 · la frontera</span><span data-l="en">07 · 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>
@@ -599,15 +619,16 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
/* ── las descargas se arman ACÁ, no en el HTML ──────────────────────────────────
Ninguna URL de instalador está en el documento: se compone al pulsar el
selector. Un rastreador que lee el HTML no encuentra ninguna, y estos ficheros
- pesan de 138 MiB a 3,4 GiB — no son para que se los baje un bot. */
+ pesan de 138 MiB a 17 GiB — no son para que se los baje un bot. */
var SEL = document.getElementById('variantes'), vAhora = 'mirada', pinta;
if (SEL) {
var DIR = '/de'+'scargas/', PRE = 'takana-'+'instalador-';
var PESO = { base: {sh:144662539, img:544210944},
mirada: {sh:549945194, img:1680867328},
servidor: {sh:608553087, img:3334471680},
- full: {sh:0, img:3647995904} };
- var bSh=document.getElementById('bloque-sh'), soloUsb=document.getElementById('solo-usb'),
+ full: {sh:0, img:18278776832} };
+ var notaFull=document.getElementById('nota-full');
+ var bSh=document.getElementById('bloque-sh'),
preSh=document.getElementById('cmd-sh'), preImg=document.getElementById('cmd-img'),
pSh=document.getElementById('peso-sh'), pImg=document.getElementById('peso-img');
@@ -632,15 +653,21 @@ footer.pie{border-top:1px solid var(--linea);background:var(--papel);padding:2.6
vAhora = v;
var raiz=location.protocol+'//'+location.host, sh=PRE+v+'.sh', img=PRE+'usb-'+v+'.img';
var hay = !!PESO[v].sh;
- bSh.hidden = !hay; soloUsb.hidden = hay;
- if(hay) preSh.innerHTML = [cmd('curl -LO ', raiz+DIR+sh),
- cmd('chmod +x '+sh),
- cmd('sudo ./'+sh)].join('\n');
+ /* `full` no tiene archivo único. El bloque NO se esconde: se queda del mismo
+ tamaño con el aviso adentro, para que la página no salte al elegir. */
+ bSh.classList.toggle('novale', !hay);
+ preSh.innerHTML = hay
+ ? [cmd('curl -LO ', raiz+DIR+sh), cmd('chmod +x '+sh), cmd('sudo ./'+sh)].join('\n')
+ : '<span class="vacio">— ' + (r.dataset.lang==='es' ? 'sin archivo único · sólo USB'
+ : 'no single file · USB only') + '</span>';
preImg.innerHTML = [cmd('curl -LO ', raiz+DIR+img),
cmd('sudo dd if='+img+' of=/dev/sdX bs=4M oflag=sync status=progress')].join('\n');
pSh.textContent = tam(PESO[v].sh); pImg.textContent = tam(PESO[v].img);
if(hay) pesar(DIR+sh,pSh);
pesar(DIR+img,pImg);
+ /* `full` tiene dos cosas que hay que decir ANTES de bajar 17 GiB: el tamaño del pendrive
+ que pide, y que GNOME no está — con su motivo, para que no se lea como un olvido. */
+ if(notaFull) notaFull.hidden = (v!=='full');
SEL.querySelectorAll('.opcion').forEach(function(b){ b.classList.toggle('on', b.dataset.v===v); });
};
SEL.querySelectorAll('.opcion').forEach(function(b){