1# `takana-os.net` — el sitio del proyecto
2
3Una sola página, autocontenida, en dos idiomas y dos temas. **No le pide nada a terceros:** las
4tipografías de la marca (Chivo e IBM Plex, las dos SIL OFL) viajan acá en `fuentes/`, subconjuntos
5`latin` y `latin-ext`, 154 KB en total. Un sitio sobre no depender de binarios ajenos que cargara
6las fuentes de Google en cada visita sería una contradicción barata.
7
8| | |
9|---|---|
10| `index.html` | la página entera: CSS y JS adentro, el símbolo como `<symbol>` SVG inline |
11| `fuentes.css` + `fuentes/` | las ocho caras `@font-face`, servidas de acá |
12| `simbolo.svg` | el favicon — el martillo tocapu 7×7, derivado de `docs/marca/simbolo-fondo-claro.svg` |
13
14## La sección «las decisiones»
15
16Diez fichas, cada una con tres lecturas de lo mismo: contra qué se decide, qué implica por dentro,
17y qué quiere decir sin jerga. **No son opinión: cada una sale de un ADR o de una decisión ya tomada
18en `docs/`** — fuentes clavadas (ADR 0006), `zig cc` (0003), `arje` de init (0007) y el arranque por
19grafo (0010), multi-origen con índice firmado (0014), imágenes ajenas enjauladas (0015), y las de
20Wayland-only y PipeWire, que viven en los frentes de escritorio y audio.
21
22⚠ **Si una decisión cambia, esta página miente hasta que alguien la toque.** Es el precio de
23explicar el diseño en una landing y no en un doc generado: se gana claridad y se paga en
24mantenimiento. Las fichas se armaron con un guion de un solo uso — la página es la fuente, no hay
25generador que mantener.
26
27La paleta y la tipografía salen de **`docs/marca/README.md`** y no se inventan acá. La única
28desviación, deliberada: en tema claro el texto de acento usa un brasa oscurecido (`#9E3F16`), porque
29el `#DF6B2A` de la marca sobre alpaca da 2,9:1 y no se lee. Las combinaciones de la página están
30medidas: ninguna baja de 4,5:1.
31
32## El instalador: `/descargas/` vive FUERA del repo
33
34`https://takana-os.net/descargas/takana-instalador.run` es **un fichero que trae todo adentro**:
35cabecera `sh` + un `tar.gz` pegado detrás con el binario `takana`, el instalador que corre en RAM, su
36kernel y el censo del terreno. Se baja, se le da permiso y se corre; no baja nada más.
37
38⚠ **No está en el repo, y no puede estarlo.** Son 137 MiB: en git serían 137 MiB para siempre en
39cada clon, y además **el espejo de GitHub rechaza cualquier fichero de más de 100 MiB** — o sea que
40el `push` se rompería y nadie relacionaría la causa con el sitio. Vive en `/work/sergio/descargas`,
41que está en `sdc` (255 G) y no en la raíz de 5,8 G, que se llena y tira la caja entera.
42
43```sh
44scripts/instalador-paquete.sh # arma el paquete (y comprueba su coherencia)
45scripts/instalador-autoextraible.sh # lo convierte en UN fichero, y lo desempaqueta para probarlo
46cp work/takana-instalador.run /work/sergio/descargas/
47( cd /work/sergio/descargas && sha256sum takana-instalador.run > takana-instalador.run.sha256 )
48```
49
50El `.sha256` que se publica al lado es **el del fichero entero**, para comprobar la descarga. Es
51distinto del que el `.run` lleva adentro, que es el **del payload** y lo verifica él solo antes de
52desempaquetar (`./takana-instalador.run --sha256` lo imprime).
53
54⚠ `/descargas` queda **fuera del `encode`** del vhost: el `.run` ya viene comprimido, y volver a
55comprimirlo por HTTP gasta CPU en cada descarga sin ahorrar un byte.
56
57**Está probado de punta a punta, no sólo servido:** `VIA_RUN=1 scripts/metal-salto-test.sh` mete el
58fichero publicado en una VM con `linux-metal-kexec`, lo corre, y comprueba sobre el DISCO que se
59verificó solo, se desempaquetó, saltó e instaló — 13 comprobaciones, con el `bootmgfw.efi` del
60vecino byte a byte igual y la tabla de particiones sin cambiar.
61
62## Las dos direcciones que publica
63
64- **código** → `https://git.gioser.net/sergio/takana` (público; `git clone` por HTTPS)
65- **paquetes** → `https://takana-os.net/repo/`, que es el MISMO `/srv/repo` firmado que sirve
66 `repo.gioser.net`. Comprobado: `takana install age --repo https://repo.gioser.net --trust ./trust`
67 responde `release: trusted (by release)`.
68
69Y **desde el 2026-09-21 se puede mirar el repo sin construir nada**, que antes no se podía:
70`repo list` y `repo verify` aceptan la misma lista de orígenes que `install`. Hasta ese día sólo
71miraban directorios locales y ante una URL respondían «repo vacío» **con salida 0** — 173 paquetes
72leídos como ninguno.
73
74```sh
75takana repo list --repo https://takana-os.net/repo # 173 paquete(s)
76takana repo verify --repo https://takana-os.net/repo --trust ./trust # release: trusted
77```
78
79## Cómo se sirve
80
81Caddy, en la caja `takana`, vhost `takana-os.net, www.takana-os.net`. La raíz es
82**`/work/sergio/takana/web/takana-os.net`**, el árbol de trabajo vivo: *publicar es guardar el
83fichero*. No lo refresca `publicar-webs.sh` a propósito — un `pull` sobre el árbol compartido mueve
84HEAD bajo los pies de otro agente (CLAUDE.md §2 ter).
85
86Este README **no se sirve**: son notas de operación, y el matcher del vhost las 404ea.
87
88Los bloques, por si hay que rehacer la caja (`caddy validate` → `arjectl restart caddy`, **nunca**
89`caddy reload`: el Caddyfile lleva `admin off`, SDD 28 §6.14):
90
91```caddyfile
92takana-os.net, www.takana-os.net {
93 import acceso
94 @comprimible not path /descargas/*
95 encode @comprimible gzip zstd
96
97 redir /descargas /descargas/ permanent
98 handle_path /descargas/* {
99 root * /work/sergio/descargas
100 file_server browse
101 }
102
103 redir /repo /repo/ permanent
104 handle_path /repo/* {
105 root * /srv/repo
106 file_server browse
107 }
108
109 handle {
110 root * /work/sergio/takana/web/takana-os.net
111 @oculto path /.* */.* /README.md
112 respond @oculto 404
113 file_server
114 }
115}
116
117git.takana-os.net {
118 import acceso
119 redir https://git.gioser.net{uri} permanent
120}
121
122takana.gioser.net {
123 import acceso
124 redir https://takana-os.net{uri} permanent
125}
126```
127
128`scripts/servidor/publicar-webs.sh` comprueba los cuatro: los dos que sirven ficheros por sha
129contra el disco, y los dos que redirigen por destino.
130
131## Los nombres
132
133| nombre | qué hace | estado |
134|---|---|---|
135| `takana-os.net`, `www` | el sitio | ✅ con certificado de Let's Encrypt (2026-09-21) |
136| `takana-os.net/repo/` | el repo de paquetes, el mismo `/srv/repo` | ✅ |
137| `takana-os.net/descargas/` | el instalador en UN fichero (`/work/sergio/descargas`) | ✅ (2026-09-23) |
138| `takana.gioser.net` | **301 → `takana-os.net`** | ✅ |
139| `git.takana-os.net` | **301 → `git.gioser.net`** | ⏳ vhost puesto, **falta el registro A** |
140
141`git.takana-os.net` sólo redirige, y es deliberado: gitea tiene UN `ROOT_URL` con el que arma cada
142enlace y cada URL de clon que muestra, así que colgarlo de un segundo nombre daría un sitio que se
143contradice —entrás por uno y te ofrece clonar del otro— y moverlo de verdad rompe los clones y el
144CI que ya apuntan al viejo.
145
146Los registros van a `2.29.29.217`, la IP de la caja:
147
148```
149takana-os.net. A 2.29.29.217 ✅ puesto
150www.takana-os.net. A 2.29.29.217 ✅ puesto
151git.takana-os.net. A 2.29.29.217 ⏳ falta
152```
153
154El certificado sale solo en la primera petición tras el DNS — y **tarda unos segundos más que el
155primer `curl`**: si da error, reintentar antes de ir a mirar logs (SDD 28 §6.14). Si el nombre ya
156resolvía cuando Caddy arrancó pero el certificado no llegó, **reiniciar caddy fuerza el reintento**
157sin esperar el backoff: fue lo que hizo falta acá.
README.md
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 sección «las decisiones»
Diez fichas, cada una con tres lecturas de lo mismo: contra qué se decide, qué implica por dentro,
y qué quiere decir sin jerga. No son opinión: cada una sale de un ADR o de una decisión ya tomada
en docs/ — fuentes clavadas (ADR 0006), zig cc (0003), arje de init (0007) y el arranque por
grafo (0010), multi-origen con índice firmado (0014), imágenes ajenas enjauladas (0015), y las de
Wayland-only y PipeWire, que viven en los frentes de escritorio y audio.
⚠ Si una decisión cambia, esta página miente hasta que alguien la toque. Es el precio de
explicar el diseño en una landing y no en un doc generado: se gana claridad y se paga en
mantenimiento. Las fichas se armaron con un guion de un solo uso — la página es la fuente, no hay
generador que mantener.
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.
El instalador: /descargas/ vive FUERA del repo
https://takana-os.net/descargas/takana-instalador.run es un fichero que trae todo adentro:
cabecera sh + un tar.gz pegado detrás con el binario takana, el instalador que corre en RAM, su
kernel y el censo del terreno. Se baja, se le da permiso y se corre; no baja nada más.
⚠ No está en el repo, y no puede estarlo. Son 137 MiB: en git serían 137 MiB para siempre en
cada clon, y además el espejo de GitHub rechaza cualquier fichero de más de 100 MiB — o sea que
el push se rompería y nadie relacionaría la causa con el sitio. Vive en /work/sergio/descargas,
que está en sdc (255 G) y no en la raíz de 5,8 G, que se llena y tira la caja entera.
scripts/instalador-paquete.sh # arma el paquete (y comprueba su coherencia)
scripts/instalador-autoextraible.sh # lo convierte en UN fichero, y lo desempaqueta para probarlo
cp work/takana-instalador.run /work/sergio/descargas/
( cd /work/sergio/descargas && sha256sum takana-instalador.run > takana-instalador.run.sha256 )
El .sha256 que se publica al lado es el del fichero entero, para comprobar la descarga. Es
distinto del que el .run lleva adentro, que es el del payload y lo verifica él solo antes de
desempaquetar (./takana-instalador.run --sha256 lo imprime).
⚠ /descargas queda fuera del encode del vhost: el .run ya viene comprimido, y volver a
comprimirlo por HTTP gasta CPU en cada descarga sin ahorrar un byte.
Está probado de punta a punta, no sólo servido: VIA_RUN=1 scripts/metal-salto-test.sh mete el
fichero publicado en una VM con linux-metal-kexec, lo corre, y comprueba sobre el DISCO que se
verificó solo, se desempaquetó, saltó e instaló — 13 comprobaciones, con el bootmgfw.efi del
vecino byte a byte igual y la tabla de particiones sin cambiar.
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).
Y desde el 2026-09-21 se puede mirar el repo sin construir nada, que antes no se podía:
repo list y repo verify aceptan la misma lista de orígenes que install. Hasta ese día sólo
miraban directorios locales y ante una URL respondían «repo vacío» con salida 0 — 173 paquetes
leídos como ninguno.
takana repo list --repo https://takana-os.net/repo # 173 paquete(s)
takana repo verify --repo https://takana-os.net/repo --trust ./trust # release: trusted
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).
Este README no se sirve: son notas de operación, y el matcher del vhost las 404ea.
Los bloques, por si hay que rehacer la caja (caddy validate → arjectl restart caddy, nunca
caddy reload: el Caddyfile lleva admin off, SDD 28 §6.14):
takana-os.net, www.takana-os.net {
import acceso
@comprimible not path /descargas/*
encode @comprimible gzip zstd
redir /descargas /descargas/ permanent
handle_path /descargas/* {
root * /work/sergio/descargas
file_server browse
}
redir /repo /repo/ permanent
handle_path /repo/* {
root * /srv/repo
file_server browse
}
handle {
root * /work/sergio/takana/web/takana-os.net
@oculto path /.* */.* /README.md
respond @oculto 404
file_server
}
}
git.takana-os.net {
import acceso
redir https://git.gioser.net{uri} permanent
}
takana.gioser.net {
import acceso
redir https://takana-os.net{uri} permanent
}
scripts/servidor/publicar-webs.sh comprueba los cuatro: los dos que sirven ficheros por sha
contra el disco, y los dos que redirigen por destino.
Los nombres
| nombre | qué hace | estado |
takana-os.net, www | el sitio | ✅ con certificado de Let's Encrypt (2026-09-21) |
takana-os.net/repo/ | el repo de paquetes, el mismo /srv/repo | ✅ |
takana-os.net/descargas/ | el instalador en UN fichero (/work/sergio/descargas) | ✅ (2026-09-23) |
takana.gioser.net | 301 → takana-os.net | ✅ |
git.takana-os.net | 301 → git.gioser.net | ⏳ vhost puesto, falta el registro A |
git.takana-os.net sólo redirige, y es deliberado: gitea tiene UN ROOT_URL con el que arma cada
enlace y cada URL de clon que muestra, así que colgarlo de un segundo nombre daría un sitio que se
contradice —entrás por uno y te ofrece clonar del otro— y moverlo de verdad rompe los clones y el
CI que ya apuntan al viejo.
Los registros van a 2.29.29.217, la IP de la caja:
takana-os.net. A 2.29.29.217 ✅ puesto
www.takana-os.net. A 2.29.29.217 ✅ puesto
git.takana-os.net. A 2.29.29.217 ⏳ falta
El certificado sale solo en la primera petición tras el DNS — y tarda unos segundos más que el
primer curl: si da error, reintentar antes de ir a mirar logs (SDD 28 §6.14). Si el nombre ya
resolvía cuando Caddy arrancó pero el certificado no llegó, reiniciar caddy fuerza el reintento
sin esperar el backoff: fue lo que hizo falta acá.