takana-os.net: el sitio propio, servido del repo y con las dos direcciones
El dominio se registró hoy. La página entra al repo takana y NO al de gioser-web — la que hay en `takana.gioser.net` la genera `hermanas.py` desde otro repo y todavía apunta a `git.gioser.net/sergio/hammer`, un nombre que dejó de existir hace doce días: una página sobre el proyecto que vive fuera del proyecto envejece sin que nadie se entere. Lo que la página publica, que es lo que se pidió: **dos direcciones**, no una. código https://git.gioser.net/sergio/takana (clone por HTTPS) paquetes https://takana-os.net/repo/ (el MISMO /srv/repo firmado) El `/repo/` cuelga por `handle_path` del mismo árbol que sirve `repo.gioser.net`, así que es la dirección en el dominio propio sin DNS ni certificado nuevos. Comprobado de punta a punta antes de escribirlo en la página, no supuesto: takana install age --repo https://repo.gioser.net --trust ./trust ⇒ release: trusted (by release) · apply OK ⚠ De paso se vio que `takana repo list --repo <url>` NO habla HTTP —sólo mira directorios locales— y ante una URL responde «repo vacío» con salida 0 en vez de decir que no sabe. Queda anotado en el README del sitio; el arreglo es otra unidad. Las cifras de la tabla salen de `docs/state/build-state.json` y del store de la caja, contadas hoy: 941 recetas, 926 selladas, 15 en deuda, 1407 artefactos, y las clausuras de los cuatro escritorios (KDE 418/420, GNOME 318/319, COSMIC 282/283, sway 269/270). No se estiman. Sin terceros: las tipografías de la marca viajan en `fuentes/` (154 KB, subconjuntos latin y latin-ext, las dos SIL OFL con su licencia al lado). Un sitio sobre no depender de binarios ajenos que pidiera las fuentes a Google en cada visita sería una contradicción barata. Contraste medido, no a ojo: el brasa `#DF6B2A` de la marca sobre alpaca da 2,9:1 y no se lee, así que el acento del tema claro es un brasa oscurecido `#9E3F16`. Ninguna combinación de la página baja de 4,5:1. El vhost ya está puesto en la caja (respaldo del Caddyfile + `caddy validate` + `arjectl restart caddy` + testigo `git.gioser.net` respondiendo antes de darlo por bueno). Falta lo único que no puedo hacer yo: los dos registros A a 2.29.29.217.
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
14 archivos · +716 −0
- web/takana-os.net/README.md +71 −0
- web/takana-os.net/fuentes.css +68 −0
- web/takana-os.net/fuentes/LICENCIA-OFL-chivo.txt +93 −0
- web/takana-os.net/fuentes/LICENCIA-OFL-ibm-plex.txt +93 −0
- web/takana-os.net/fuentes/chivo-900-latin-ext.woff2 +— −—
- web/takana-os.net/fuentes/chivo-900-latin.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-mono-400-latin-ext.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-mono-400-latin.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-mono-500-latin-ext.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-mono-500-latin.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-sans-var-latin-ext.woff2 +— −—
- web/takana-os.net/fuentes/ibm-plex-sans-var-latin.woff2 +— −—
- web/takana-os.net/index.html +390 −0
- web/takana-os.net/simbolo.svg +1 −0
diff --git a/web/takana-os.net/README.md b/web/takana-os.net/README.md
new file mode 100644
index 00000000..9f0af35f
--- /dev/null
+++ b/web/takana-os.net/README.md
@@ -0,0 +1,71 @@
+# `takana-os.net` — el sitio del proyecto
+
+Una sola página, autocontenida, en dos idiomas y dos temas. **No le pide nada a terceros:** las
+tipografías de la marca (Chivo e IBM Plex, las dos SIL OFL) viajan acá en `fuentes/`, subconjuntos
+`latin` y `latin-ext`, 154 KB en total. Un sitio sobre no depender de binarios ajenos que cargara
+las fuentes de Google en cada visita sería una contradicción barata.
+
+| | |
+|---|---|
+| `index.html` | la página entera: CSS y JS adentro, el símbolo como `<symbol>` SVG inline |
+| `fuentes.css` + `fuentes/` | las ocho caras `@font-face`, servidas de acá |
+| `simbolo.svg` | el favicon — el martillo tocapu 7×7, derivado de `docs/marca/simbolo-fondo-claro.svg` |
+
+La paleta y la tipografía salen de **`docs/marca/README.md`** y no se inventan acá. La única
+desviación, deliberada: en tema claro el texto de acento usa un brasa oscurecido (`#9E3F16`), porque
+el `#DF6B2A` de la marca sobre alpaca da 2,9:1 y no se lee. Las combinaciones de la página están
+medidas: ninguna baja de 4,5:1.
+
+## Las dos direcciones que publica
+
+- **código** → `https://git.gioser.net/sergio/takana` (público; `git clone` por HTTPS)
+- **paquetes** → `https://takana-os.net/repo/`, que es el MISMO `/srv/repo` firmado que sirve
+ `repo.gioser.net`. Comprobado: `takana install age --repo https://repo.gioser.net --trust ./trust`
+ responde `release: trusted (by release)`.
+
+⚠ `takana repo list --repo <url>` **no habla HTTP** — sólo directorios locales — y ante una URL dice
+«repo vacío» con salida 0 en vez de decir que no sabe. El que sí baja por red es `install --repo`.
+
+## Cómo se sirve
+
+Caddy, en la caja `takana`, vhost `takana-os.net, www.takana-os.net`. La raíz es
+**`/work/sergio/takana/web/takana-os.net`**, el árbol de trabajo vivo: *publicar es guardar el
+fichero*. No lo refresca `publicar-webs.sh` a propósito — un `pull` sobre el árbol compartido mueve
+HEAD bajo los pies de otro agente (CLAUDE.md §2 ter).
+
+El bloque, por si hay que rehacer la caja (`caddy validate` → `arjectl restart caddy`, **nunca**
+`caddy reload`: el Caddyfile lleva `admin off`, SDD 28 §6.14):
+
+```caddyfile
+takana-os.net, www.takana-os.net {
+ import acceso
+ encode gzip zstd
+
+ redir /repo /repo/ permanent
+ handle_path /repo/* {
+ root * /srv/repo
+ file_server browse
+ }
+
+ handle {
+ root * /work/sergio/takana/web/takana-os.net
+ @oculto path /.* */.*
+ respond @oculto 404
+ file_server
+ }
+}
+```
+
+## DNS
+
+El dominio se registró el 2026-09-21 y **el vhost está puesto antes que los registros**: hasta que
+`takana-os.net` resuelva a la caja, Caddy no puede pedir el certificado y el nombre no responde.
+Hacen falta dos `A` a `2.29.29.217` (la IP de la caja), igual que la de `repo`:
+
+```
+takana-os.net. A 2.29.29.217
+www.takana-os.net. A 2.29.29.217
+```
+
+Con eso puesto, el certificado sale solo en la primera petición — y **tarda unos segundos más que
+el primer `curl`**: si da error, reintentar antes de ir a mirar logs (SDD 28 §6.14).
diff --git a/web/takana-os.net/fuentes.css b/web/takana-os.net/fuentes.css
new file mode 100644
index 00000000..5c01b941
--- /dev/null
+++ b/web/takana-os.net/fuentes.css
@@ -0,0 +1,68 @@
+/* Chivo (900) e IBM Plex Sans/Mono — subconjuntos latin y latin-ext, SERVIDOS DE ACÁ.
+ Bajados de Google Fonts una vez y commiteados: la página no le pide nada a terceros,
+ que es lo mínimo coherente para un sitio sobre no depender de binarios ajenos.
+ Las dos familias son SIL OFL 1.1 — ver fuentes/LICENCIA-OFL-*.txt. */
+@font-face {
+ font-family: 'Chivo';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(fuentes/chivo-900-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'IBM Plex Sans';
+ font-style: normal;
+ font-weight: 100 700;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-sans-var-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'IBM Plex Mono';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-mono-400-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'IBM Plex Mono';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-mono-500-latin.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+@font-face {
+ font-family: 'Chivo';
+ font-style: normal;
+ font-weight: 900;
+ font-display: swap;
+ src: url(fuentes/chivo-900-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+@font-face {
+ font-family: 'IBM Plex Sans';
+ font-style: normal;
+ font-weight: 100 700;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-sans-var-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+@font-face {
+ font-family: 'IBM Plex Mono';
+ font-style: normal;
+ font-weight: 400;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-mono-400-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+@font-face {
+ font-family: 'IBM Plex Mono';
+ font-style: normal;
+ font-weight: 500;
+ font-display: swap;
+ src: url(fuentes/ibm-plex-mono-500-latin-ext.woff2) format('woff2');
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
diff --git a/web/takana-os.net/fuentes/LICENCIA-OFL-chivo.txt b/web/takana-os.net/fuentes/LICENCIA-OFL-chivo.txt
new file mode 100644
index 00000000..4e5e18cc
--- /dev/null
+++ b/web/takana-os.net/fuentes/LICENCIA-OFL-chivo.txt
@@ -0,0 +1,93 @@
+Copyright 2019 The Chivo Project Authors (https://github.com/Omnibus-Type/Chivo)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/web/takana-os.net/fuentes/LICENCIA-OFL-ibm-plex.txt b/web/takana-os.net/fuentes/LICENCIA-OFL-ibm-plex.txt
new file mode 100644
index 00000000..c35c4c61
--- /dev/null
+++ b/web/takana-os.net/fuentes/LICENCIA-OFL-ibm-plex.txt
@@ -0,0 +1,93 @@
+Copyright © 2017 IBM Corp. with Reserved Font Name "Plex"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/web/takana-os.net/fuentes/chivo-900-latin-ext.woff2 b/web/takana-os.net/fuentes/chivo-900-latin-ext.woff2
new file mode 100644
index 00000000..292b0a84
Binary files /dev/null and b/web/takana-os.net/fuentes/chivo-900-latin-ext.woff2 differ
diff --git a/web/takana-os.net/fuentes/chivo-900-latin.woff2 b/web/takana-os.net/fuentes/chivo-900-latin.woff2
new file mode 100644
index 00000000..b4487d0f
Binary files /dev/null and b/web/takana-os.net/fuentes/chivo-900-latin.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-mono-400-latin-ext.woff2 b/web/takana-os.net/fuentes/ibm-plex-mono-400-latin-ext.woff2
new file mode 100644
index 00000000..732c64d4
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-mono-400-latin-ext.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-mono-400-latin.woff2 b/web/takana-os.net/fuentes/ibm-plex-mono-400-latin.woff2
new file mode 100644
index 00000000..0804aaff
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-mono-400-latin.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-mono-500-latin-ext.woff2 b/web/takana-os.net/fuentes/ibm-plex-mono-500-latin-ext.woff2
new file mode 100644
index 00000000..6f33f8c0
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-mono-500-latin-ext.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-mono-500-latin.woff2 b/web/takana-os.net/fuentes/ibm-plex-mono-500-latin.woff2
new file mode 100644
index 00000000..090f82f7
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-mono-500-latin.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-sans-var-latin-ext.woff2 b/web/takana-os.net/fuentes/ibm-plex-sans-var-latin-ext.woff2
new file mode 100644
index 00000000..394ebbb3
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-sans-var-latin-ext.woff2 differ
diff --git a/web/takana-os.net/fuentes/ibm-plex-sans-var-latin.woff2 b/web/takana-os.net/fuentes/ibm-plex-sans-var-latin.woff2
new file mode 100644
index 00000000..b757bc5c
Binary files /dev/null and b/web/takana-os.net/fuentes/ibm-plex-sans-var-latin.woff2 differ
diff --git a/web/takana-os.net/index.html b/web/takana-os.net/index.html
new file mode 100644
index 00000000..0d1a189d
--- /dev/null
+++ b/web/takana-os.net/index.html
@@ -0,0 +1,390 @@
+<!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 && 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 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>
diff --git a/web/takana-os.net/simbolo.svg b/web/takana-os.net/simbolo.svg
new file mode 100644
index 00000000..d5762e0a
--- /dev/null
+++ b/web/takana-os.net/simbolo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 748 748"><style>.chispa{fill:#17130E}@media (prefers-color-scheme:dark){.chispa{fill:#FFF6DE}}</style><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"/></svg>