la otra mitad
Cosas que construí porque quería que existieran.
PANTHEON es el trabajo. Esto es lo que producen los mismos instintos cuando nadie paga por el resultado: un cielo real en un escritorio, unas efemérides sin dependencias y un terminal que sabe dibujar. La disciplina es idéntica; solo cambia lo que está en juego.
GNOME Shell · GPL-2.0 · ★3
TerraFirma: un cielo real sobre tu fondo de pantalla.
No es una animación de un cielo. Es el real, calculado a partir de unas efemérides para tu latitud, longitud y reloj.
El bucle crítico es medible a propósito
La proyección y la atmósfera viven en skymath.js, que no importa nada de GNOME Shell. Sobre un archivo que solo puede ejecutarse dentro de una sesión solo se pueden hacer conjeturas; uno que se ejecuta de forma independiente se puede cronometrar. Esa frontera responde al mismo razonamiento que el lint de pureza que mantiene el núcleo de PANTHEON fuera de su capa de aplicación.
El catálogo estelar y las efemérides son de terceros y se acreditan en NOTICE.md. Apúntalo a una fecha y luego mira hacia arriba: para este tipo de software, es la única prueba que cuenta.
Por qué el bucle crítico tuvo que salir → · TerraFirma en GitHub ↗
extraídos y publicados
Tres paquetes que salieron de ello.
El mismo patrón que los seis de PANTHEON: construir la cosa, encontrar la pieza que es realmente reutilizable, extraerla y publicarla por sí sola. Los tres son MIT y se pueden instalar ya.
braillecanvas v0.4.0 · MIT
Braille direcciona 2×4 puntos por celda de carácter, así que un terminal de 80×24 es en realidad un lienzo de 160×96. Esa es la diferencia entre un renderizado y el arte ASCII.
La parte interesante es el color. Cada celda lleva dos colores, uno para los puntos encendidos y otro para los huecos, de modo que una celda que cae sobre un borde, piel contra cielo, conserva el borde en lugar de promediarlo hasta convertirlo en barro. El error medio de color por punto en esta imagen baja de 45.7 a 21.3.
Elegir qué puntos se encienden en cada celda, en lugar de tomar el patrón de una rejilla de dither fija, reduce las celdas sin textura del 35.1% al 1.6%.
Dos límites que indica su propio README: por debajo de unas 90 columnas las fotografías dejan de funcionar, y el monocromo no puede representar esta imagen en absoluto, su cara mide 159 de luminancia frente a 192 del cielo detrás de ella, así que un render de 1 bit es una silueta por construcción.
npm i braillecanvas · npm ↗ · código fuente ↗
skymaths v0.1.2 · MIT
Astronomía posicional sin dependencias: Sol, Luna, planetas, crepúsculo, orto y ocaso. Extraída de las efemérides de TerraFirma y después corregida: el polinomio de Espenak–Meeus que usaba está publicado solo para 1900–1920 y se estaba aplicando a 1986, lo que daba −534 segundos para 1950 frente a un valor medido de +29. Encontrado comparándolo con un almanaque publicado en lugar de consigo mismo.
Está funcionando en este sitio: en modo oscuro, el fondo es el cielo sobre Cardiff la noche de las Perseidas, el 13 de agosto de 2026, calculado en tu navegador: 5,044 estrellas con sus colores reales, la fase de la Luna y los planetas donde estaban. Desplázate para girar.
npm i skymaths · npm ↗ · código fuente ↗
starwheel v0.2.3 · MIT · ★4
Un planisferio en vivo en tu terminal, con posiciones reales de las estrellas para tu ubicación y tu minuto, dibujado sobre braillecanvas. Mi repositorio con más estrellas, y el que me enseñó que una corrección que mueve píxeles publicados no es la misma corrección dos veces: limita las iteraciones donde su hermana recorta, de forma deliberada.
npx starwheel · npm ↗ · código fuente ↗
/proc: CPU, memoria y carga media en una ventana deslizante. Los gráficos funcionan muy por debajo del mínimo de 90 columnas que necesitan las fotografías, porque ya tienen alto contraste.en esta página, ahora mismo
El arte es generado, y la semilla no puede escaparse.
Cada pieza de arte de este sitio: la imagen principal de arriba, el favicon, las tarjetas para redes sociales, los avatares, sale del propio generador de PANTHEON. Determinista y con semilla: la misma semilla da la misma imagen, siempre.
El mismo contrato en ambos lados
Un motor en el servidor genera las tarjetas para redes sociales y los sitios de los tenants; un motor en el navegador dibuja la versión animada que estás viendo. La misma regla: entra una semilla, sale arte reproducible.
A prueba de inyección por diseño
La semilla alimenta el PRNG y nada más. nunca se interpola en el marcado ni en un estilo. Un nombre de tenant que en realidad es un payload dibuja una imagen distinta; no dibuja una etiqueta script. El mismo instinto que en el resto del sistema, aplicado a la decoración.
instalable, no solo legible
Seis garantías, extraídas y publicadas.
Cada uno salió de PANTHEON como una única promesa verificable y luego pasó a PyPI para sostenerse por sí mismo. Agentes de IA adversariales, ejecutados por mí y no independientes, los revisaron línea por línea y encontraron defectos reales. Las versiones de abajo son las posteriores a esas correcciones, y cada una se verificó instalándola desde el registro en un entorno limpio y volviendo a ejecutar la reproducción del propio revisor, no fiándose del log de build.
pantheon-guardrails v0.3.2 · Apache-2.0
Un evaluador de constitución que solo recurre a un juez LLM en respuestas de alto riesgo, y exige que ese juez sea un modelo distinto del generador para que no compartan puntos ciegos. Antes ajustaba al alza una puntuación fuera de rango: un juez que devolvía {"clarity": 99} obtenía un 1.0 perfecto y superaba todos los umbrales: un guardarraíl que fallaba en abierto. Ahora un juez que lanza una excepción, se cuelga o devuelve disparates es una evaluación fallida explícita que bloquea por defecto.
pip install pantheon-guardrails · PyPI ↗ · código fuente ↗
pantheon-ssrf-guard v0.2.1 · Apache-2.0
Una protección de salida contra SSRF de dos capas que resiste el DNS rebinding: vuelve a comprobar la IP a la que el socket realmente llegó en el momento de conectar, de modo que un host que resuelve a una IP pública y luego se reasigna a loopback o a los metadatos de la nube es rechazado. La revisión detectó que el opener seguía leyendo URLs file://, porque Python instala por defecto manejadores para otros esquemas; ahora hay una lista explícita de http/https permitidos en la frontera, redirecciones incluidas, y los proxies de entorno están desactivados salvo que los pidas.
pip install pantheon-ssrf-guard · PyPI ↗ · código fuente ↗
pantheon-tool-sanitizer v0.3.0 · Apache-2.0
Elimina el marcado de protocolo de herramientas y el contrabando Unicode del texto no confiable de herramientas MCP antes de que llegue al prompt de un agente. Con un alcance honesto: no pretende detener la inyección en prosa simple, que es un problema de arquitectura y no de cadenas. Dos correcciones de la revisión: una entrada adversarial de 256 kB consumía 26 segundos de CPU y ahora se rechaza directamente, y "Read\nthe\tfile" ya no se convierte en "Readthefile", porque un salto de línea es un límite de palabra.
credit-ledger v0.3.0 · Apache-2.0
Medición a prueba de descubiertos sobre Postgres en unas 150 líneas: 100 cargos en paralelo contra un saldo de 50 y exactamente 50 tienen éxito, facturación exactamente una vez ante reenvíos de webhooks, aislamiento impuesto mediante seguridad a nivel de fila. La versión publicada aceptaba antes un cargo negativo, que pagaba al cliente, e importes por debajo de la precisión de la columna, que facturaban 0.0000 mientras informaban de éxito. Ahora una única regla de importes cubre todas las rutas, y hay una migración probada para las bases de datos que ya existen.
pip install credit-ledger · PyPI ↗ · código fuente ↗
pantheon-ical v0.3.1 · Apache-2.0
iCal de ida y vuelta (RFC 5545) para calendarios de reservas en menos de 200 líneas. Un periodo ocupado que se pierde se lee como libre, así que el silencio es el fallo peligroso: un calendario demasiado grande se rechaza en lugar de truncarse, y una regla recurrente que se desborda lo indica en vez de devolver una lista corta. La última corrección acotó el trabajo además del resultado: una regla hostil de una línea llegaba a generar 34 millones de ocurrencias durante 76 segundos antes de ser rechazada; ahora se detiene en 401.
pip install pantheon-ical · PyPI ↗ · código fuente ↗
pantheon-rls v0.1.1 · Apache-2.0
Aislamiento entre tenants como garantía de Postgres en lugar de un hábito de la aplicación: force-RLS más permisos de mínimo privilegio, de modo que la propia base de datos rechaza lecturas y escrituras entre tenants. Cerrado ante fallos por construcción: sin contexto de tenant se devuelven cero filas, nunca todas las filas, que es el modo de fallo que importa cuando un bug llega a producción a las 3 de la madrugada.
pip install pantheon-rls · PyPI ↗ · código fuente ↗
Cada corrección anterior llegó de la misma forma: reproducir primero el defecto, corregir el límite en lugar del síntoma y luego demostrar que el nuevo test falla cuando se vuelve a introducir el bug. Un test que no puede fallar no es evidencia.
sobre qué funciona
El stack es aburrido. La frontera no.
Python 3.12, FastAPI, Postgres, Redis, React con Vite, un único Dockerfile detrás de nginx. Nada de eso es una decisión digna de admiración: son las piezas que eliges para que tu atención pueda ir a algo que importa.
146 archivos · 14,002 líneas
pantheon-core: el sustrato. Agnóstico al dominio por contrato: no puede importar de residents ni de bundles, y dos comprobaciones independientes hacen fallar la CI si lo hace.
210 archivos · 24,216 líneas
Tests, frente a 38,816 líneas de Python. No escribo a mano la implementación, así que la suite no es una red de seguridad. Es la especificación, y es el artefacto que realmente escribo yo.
Cinco capas, un único camino
architect · runtime · guardrails · substrate · primitives, con providers deliberadamente fuera de la pila, porque está por debajo de dos capas a la vez y el contrato lo dice abiertamente en lugar de forzarse.
Esa frontera es la razón por la que seis componentes pudieron extraerse y publicarse como librerías independientes: la extracción consistió sobre todo en mover archivos a los que nunca se les había permitido depender hacia abajo. La versión larga, incluida la parte en la que me equivoqué →
La misma persona, las mismas reglas, menos en juego.
Nadie audita un fondo de pantalla. Si están construidos así es porque es la única forma que conozco de construir: medirlo, extraer la parte reutilizable, publicar sus límites junto con ella y contrastar las cifras con algo externo al programa.
Pregunta por cualquier parte de este trabajo.
- ¿Qué puesto busca Isaac?
- ¿Cuál de estos está en producción?
- Muéstrame un bug real que encontró y corrigió