Colophon

Cómo está hecha esta web

How this site is built

Hardware Hardware Mac mini M4 — en casa, 24/7
Web server Apache con virtual hostswith virtual hosts
Acceso público Public access Cloudflare Tunnelsin abrir un solo puertozero open ports
DNS / CDN Cloudflare
OS macOS
Portada y tools Home & tools HTML, CSS y JavaScript — sin frameworks, sin build step HTML, CSS and JavaScript — no frameworks, no build step
Blog Hugo 0.153 + tema propiocustom theme
Publicación Publishing Git post-commit hook — commit y listo Git post-commit hook — commit and done
Backend (tools) Backend (tools) PHP
Base de datos Database PostgreSQL
Analytics Propia, en unas pocas líneas de PHP: un beacon sin cookies que escribe a ficheros, sin identificar a nadie. Los datos no salen del Mac mini y alimentan el estado y el parte diarioHome-made, a few lines of PHP: a cookie-less beacon writing to files, identifying nobody. The data never leaves the Mac mini and feeds the status page and the daily report
Tipografía Typography Inter — Google Fonts
Email msmtp + iCloud
Editor Warp + Claude Code / Grok Build Warp + Claude Code / Grok Build
Terminal Warp
Control de versiones Git + GitHub
Generación de voz Voice generation xAI TTS — voz de catálogo leo, castellano (es-ES), desde el siguiente episodio · antes, ElevenLabs: mi voz clonada (Ep. 21–23) y Guillermo (Ep. 1–20) xAI TTS — off-the-shelf voice leo, European Spanish (es-ES), from the next episode · previously ElevenLabs: my cloned voice (Ep. 21–23) and Guillermo (Ep. 1–20)
Guión Script Claude Code — agente
Cómo se hace How it's made Generado con un agente de IA — busca el tema, escribe el guión y sintetiza la voz; se publica tras mi revisión, escuchando el episodio completo Generated with an AI agent — finds the topic, writes the script and synthesises the voice; published after my review, listening to the full episode
Validación Validation Cada bloque se transcribe con Whisper en local y se compara palabra por palabra con el guión: los TTS se saltan frases enteras y de oído no se detecta Every block is transcribed locally with Whisper and compared word by word against the script: TTS engines skip whole sentences and you can't catch it by ear
Formato MP3 · 128kbps · normalizado a −16 LUFS (loudnorm en dos pasadas) MP3 · 128kbps · normalised to −16 LUFS (two-pass loudnorm)
Vídeo Video Versión en vídeo generada con ffmpeg + Pillow (portada animada, ondas y subtítulos desde la transcripción) y subida a YouTube, declarada como contenido sintético Video version built with ffmpeg + Pillow (animated cover, waveform and subtitles from the transcript) and uploaded to YouTube, declared as synthetic content
Dónde corre Where it runs En el mismo Mac mini que sirve esta página, con Ollama. Nada sale a ninguna API: se arranca solo mientras genera y se para al terminar, porque la máquina también sostiene un Moodle y un Jitsi On the same Mac mini that serves this page, with Ollama. Nothing leaves for an external API: it starts only while generating and stops right after, because the machine also runs a Moodle and a Jitsi
Modelos Models mistral:7b para redactar · nomic-embed-text para los embeddings · qwen3:4b de reserva cuando hace falta razonar mistral:7b for writing · nomic-embed-text for embeddings · qwen3:4b in reserve when reasoning is needed
En la web On this site El mapa del blog y el «quizá te interese» de cada artículo salen de embeddings calculados aquí. Se precalculan al publicar: en la petición no corre ninguna IA The blog map and the "you might also like" on every post come from embeddings computed here. They're precomputed at publish time: no AI runs during the request
Fuera de la web Off-site Un parte diario del servidor a las 08:00 y un triaje semanal de los sondeos que recibe, ambos por Telegram A daily server report at 08:00 and a weekly triage of the probes it receives, both over Telegram
La regla The rule El código es dueño de los hechos y el modelo del criterio: todas las cifras las calcula un programa, y el modelo tiene prohibido escribir números. Empezó inventándose datos con mucho aplomo, así que ahora hay un validador que lo comprueba cada día Code owns the facts, the model owns the judgement: every figure is computed by a program, and the model is forbidden from writing numbers. It started making up data with total confidence, so now a validator checks it every day

Esta web no usa frameworks de JavaScript, no tiene sistema de build, no tiene dependencias de npm y no necesita un servidor de CI/CD para publicar un cambio. Un commit lo pone en producción en segundos. A veces la solución más simple es la mejor.

This site uses no JavaScript frameworks, has no build system, no npm dependencies, and doesn't need a CI/CD pipeline to publish a change. A commit puts it in production in seconds. Sometimes the simplest solution is the best one.