Llevaba dos años pensando en este blog

Decir que lo "pensaba" no es del todo exacto; era más bien una obsesión. Ya estaba ahí cuando aún no sabía escribir ni frontend ni backend, ni tampoco código embebido. Por entonces todavía andaba trasteando con electrónica y, de casualidad, di con los vídeos de @ushio en y con su web, y pensé que aquello era genial y que yo también quería uno. Después pasé casi medio año aprendiendo C desde cero, y algo de JS y CSS, y monté un blog estático con Hexo desplegado en Github Pages. Por fin tenía mi propio rinconcito.

Hexo: A fast, simple & powerful blog framework. , hexo.io, se abre en una pestaña nueva
Una captura de pantalla de la página de inicio del proyecto Hexo en modo oscuro, con el logotipo hexagonal azul con la «H» en la parte superior izquierda, junto a los enlaces de navegación Docs, API, News, Plugins, Themes, About, un icono de GitHub, un cuadro de búsqueda con una indicación de Cmd-K y un selector de idioma en inglés a la derecha. El hero dice «A fast, simple & powerful blog framework» sobre un comando de instalación copiable, `$ npm install hexo-cli -g`, con un botón de flecha azul, y debajo una fila de insignias: 41k estrellas en GitHub, 5k forks, 212k descargas al mes y un enlace Follow @hexojs. Una franja de versiones enumera hexo 8.1.0 del 2025-10-26, hexo 8.0.0 del 2025-09-16, hexo 7.3.0 del 2024-07-02 y Hexo 7.2.0 del 2024-04-17, y la siguiente sección comienza con los encabezados de características «Blazing Fast» y «Markdown Support». Las fechas de publicación y la cifra de descargas sitúan la captura a finales de octubre de 2025 o después.
ushio , sakura-ushio.icu, se abre en una pestaña nueva
Una captura de pantalla de la lista de entradas de un blog personal, con una barra lateral oscura a la izquierda que contiene un avatar redondo de estilo anime, el nombre 小汐, un enlace 主页, una fila de enlaces 所有文章 / 友链 / 关于我 y cuatro iconos sociales circulares, entre ellos GitHub y QQ. La columna principal muestra una tarjeta de entrada fijada titulada PD-METER-R4 con fecha 2023-01-29, cuyo resumen en chino dice que está en desarrollo y que, en comparación con la R3, tiene un diseño optimizado, un controlador principal sustituido y algunas funciones nuevas; debajo hay dos fotografías de una pequeña PCB verde con la inscripción USBC-R4 SAKURA, por delante y por detrás, tomadas sobre un paño blanco con una marca de agua de cámara de Xiaomi 12S Ultra que indica 2023.02.06 15:47. La tarjeta lleva una etiqueta 置顶 (fijado) y un botón de expansión 展开全文 >>, y más abajo comienza una segunda tarjeta para WORX-BAT-Charger con fecha 2023-02-14. Parece ser prueba del blog de un aficionado al hardware que documenta las iteraciones de una placa medidora de USB-C power delivery.

Más adelante descubrí el sitio personal de @Innei. Tenía un diseño muy cuidado y estaba repleto de funciones; me bastó con verlo una vez para quererlo, e incluso apoyé económicamente el proyecto. Aunque al final no llegué a usarlo, no me arrepiento de haber gastado ese dinero, porque así pude acceder al código fuente de React. Fue como cuando vi C por primera vez: al fin y al cabo, no es más que código, ¿qué puede tener de extraordinario? Algún día escribiré uno yo mismo.

静かな森 , innei.in, se abre en una pestaña nueva
Una captura de pantalla de la página de inicio de un blog personal en modo oscuro, con un fondo casi negro y pétalos pálidos flotando sobre él. Una barra de navegación con forma de píldora se sitúa en la parte superior central con los elementos en chino 首页 (activo), 文稿, 手记, 时光, 思考 y 更多, un pequeño avatar de estilo anime en la esquina superior izquierda y un icono de inicio de sesión en la esquina superior derecha; el texto principal a la izquierda dice "Hi, I'm Innei 👋。" sobre "A NodeJS Full Stack <Developer />" y la línea "An independent developer coding with love." Debajo hay una fila de botones sociales redondos —Bilibili, NetEase Cloud Music, GitHub, correo electrónico, RSS, Telegram y X—, mientras que un gran retrato circular de estilo anime de una chica de pelo plateado con un lazo rosa ancla el lado derecho, y una cita en chino de color gris sobre la responsabilidad y la fortaleza interior recorre el borde inferior. Se trata evidentemente de la vista de inicio del sitio personal de Innei tal como se renderiza en un navegador con anchura de escritorio.

Eso fue en 2024, y luego llegaron el 24, el 25 y el 26, hasta hoy

Desde entonces, no ha habido forma de parar.

Fuera de control

Al principio solo quería añadir un conmutador de claro/oscuro al tema de Hexo Nlvi de @colmugx. Apañé uno con el JS de Dark Reader: feo, no me convencía. Después aprendí @media en CSS, luego el cambio por JS en la SPA, luego la .dark class de TailwindCSS, luego next-theme en SSR, y al final me una Cookie más un script inline de Head Sync para acabar con el parpadeo del FOUC. Cuatro o cinco enfoques en total.

🎨 A simple theme for hexo. , github.com, se abre en una pestaña nueva
Un mockup promocional de un tema para el blog Hexo, que combina el logotipo tipográfico "NIvi" en letras grandes de color gris claro sobre un breve subrayado rosa salmón a la izquierda con dos capturas de pantalla superpuestas del tema, con aspecto de ventana de navegador, a la derecha. El panel más grande, del ancho de un escritorio, muestra una cabecera color crema con el logotipo "Hexo" en tipografía script y un menú de navegación con búsqueda, ARTICLE, ARCHIVES, TAGS, ABOUT, bajo el cual aparece una entrada de prueba tipográfica fechada el 2013-12-27 y titulada "Elements": la página de ejemplo estándar de Hexo, que recorre desde Heading 1 hasta Heading 6, una sección Paragraph de lorem ipsum con enlaces en línea de color rosa, negrita, cursiva, subrayado y fragmentos de código, una cita en bloque con una barra rosa, y una tabla de tres columnas con "Table Header 1–3" sobre filas "Division 1–3". Una representación más estrecha de la misma página, para móvil o tablet, se superpone a la anterior en la parte inferior derecha, y muestra el logotipo centrado y el mismo contenido redistribuido en una sola columna. El conjunto se sitúa sobre un fondo blanco liso y se lee como un escaparate del tema, prueba de que el diseño renderiza limpiamente todo su conjunto de elementos HTML en ambos anchos.

Pero aquello no era más que la punta del iceberg. Tras descubrir React, pasé de la Edad de Piedra de Hexo y JavaScript puro al enrutador de páginas de Next.js 13; luego me desvié hacia Vue, estudié el enrutamiento de aplicaciones de página única, entendí el mecanismo de respaldo de index.html y volví a crear el proyecto incontables veces. Compré un servidor y trasteé con Docker, Nginx y un sistema de almacenamiento conectado a la red; como 1Panel me parecía feo, programé a mano el panel Canopy, investigué matrices de almacenamiento y escribí RFS. Al configurar certificados SSL, acme.sh fallaba tanto en el entorno chino que acabé escribiendo en Rust un proxy inverso: Vane & Lazyacme. Al principio no eran más que ochocientas líneas de código basura escritas en tres horas una noche, pero unos amigos del chat me animaron a continuar y terminé dedicándole cuatro meses, metiéndole HTTP/3, copia cero, un modelo por capas y un motor de flujos. Después también está Seam, un framework full-stack y otro pozo sin fondo, pero de eso ya hablaré otro día.

Sobreingeniería

Entonces llegó la era de la IA y mi ansiedad volvió a duplicarse.

Lo más irónico es que todo esto tendría que haberse hecho después del blog, documentándolo sobre la marcha. En cambio, al blog , las ideas se fueron acumulando y no había ni un solo sitio donde anotarlas. Por un lado, mi conciencia no dejaba de acusarme: dijiste que ibas a terminar Vane, así que no puedes parar. Por otro, una impotencia que crecía cuanto más me alejaba. Siempre he recordado lo que tenía que hacer; simplemente no era capaz de hacerlo. Pensándolo bien, hace muchísimo que no me siento a escribir nada. Ahora, mirando atrás, todo apunta a lo mismo: sobreingeniería.

En aquel momento, tampoco es que no me diera cuenta de que me estaba desviando. ¿Vane? Al fin y al cabo, algún día tendría que desplegar el blog, así que necesitaría un proxy inverso. ¿Seam? Tarde o temprano tendría que desarrollar tanto el frontend como el backend, así que mejor crear primero mi framework ideal. Cada paso tenía su justificación; todo iba a «servirme más adelante». Pero el problema era que ese «más adelante» nunca llegaría, porque jamás había empezado...

Fracaso

En realidad, crear un blog no requiere ni un proxy inverso ni un framework propio. Sin embargo, por aquel entonces los traté como requisitos previos y los convertí en una justificación que parecía razonable, aunque me impedía avanzar indefinidamente. Pero nunca fueron requisitos. Solo había uno de verdad: sentarme y escribir el primer artículo.

En realidad, no es que nunca hubiera trabajado en el blog. Todo lo contrario: lo intenté tres veces.

Vercel , vercel.com, se abre en una pestaña nueva
Una captura de pantalla de la página de inicio de Next.js en modo oscuro, que muestra el hero de la landing tal como aparece en un navegador de escritorio. Una barra de navegación superior lleva el triángulo de Vercel y el logotipo NEXT.js a la izquierda, junto a él los enlaces Showcase, Docs, Blog, Templates y Enterprise, y a la derecha un campo "Search documentation..." con una indicación ⌘K, un botón Deploy y un botón Learn. En el centro de la página se lee "The React Framework for the Web" en grandes letras blancas, con el subtítulo "Used by some of the world's largest companies, Next.js enables you to create high-quality web applications with the power of React components," sobre un botón claro "Get Started" y un botón oscuro "Learn Next.js", y debajo de ellos el comando `~ npx create-next-app@latest`. Tenues líneas de cuadrícula punteada y dos contornos parciales de círculo se sitúan detrás del texto como ornamento de fondo.

Mi primer intento fue todavía en la época del Page Router de Next.js 13. Por entonces apenas entendía qué era una aplicación de página única y no tenía claro ninguno de los conceptos como SSR, SSG o ISR. Pero como otros decían que el SSR era bueno, yo también quería usarlo. Sin embargo, conforme avanzaba, descubrí que en realidad no entendía qué problemas intentaban resolver esas arquitecturas y ya no pude seguir. Después me pasé a una aplicación de página única pura con Vue 2. ¿Por qué elegí Vue? Me da vergüenza admitirlo, pero el nombre me sonaba bien y, como de todos modos era algo nuevo para mí, pensé en probarlo. Tampoco duré mucho con eso. En el tercer intento volví a React y empecé con JSX sencillo. Aprendí TypeScript, llegué a dominar TSX, entendí la diferencia entre CJS y ESM, me enamoré de la programación reactiva y empecé a usar bibliotecas como Lucide, Framer Motion y Radix UI, que más adelante se volverían indispensables para mí; esta vez, por fin empezaba a parecer algo serio. Pero volví a fracasar, porque en el fondo solo estaba imitando a los demás: usaba cualquier cosa que ellos usaran. Parecía convincente, pero en realidad no entendía en absoluto por qué había que hacerlo así. Con el impulso adicional de las alucinaciones de la IA, podía conseguir que muchas cosas funcionaran como un producto mínimo viable, pero al ampliarlas todo estaba lleno de trampas.

Remix , remix.run, se abre en una pestaña nueva
Una captura de pantalla de la página de inicio del sitio web de Remix, representada sobre un degradado de gris pálido a blanco, con el logotipo tipográfico "Remix" en la esquina superior izquierda y una fila de navegación en la superior derecha que dice Blog, Jam, Store, V2 Docs. Un titular centrado anuncia "Remix 3 is under active development", con el subtítulo "A new full stack framework built on Web APIs" debajo. Ocupando los dos tercios inferiores hay una ilustración estilizada de un coche oculto bajo una tela negra, cuyos pliegues captan la luz, con una banda diagonal a rayas de arcoíris y destellos blancos tipo franja de carreras que cruzan el centro: el clásico motivo de anticipo del superdeportivo cubierto. Se interpreta como testimonio del estado previo al anuncio de la página del proyecto Remix 3, donde se está dando publicidad a la reescritura del framework antes de cualquier lanzamiento.

Más adelante también aprendí sobre los loaders de React (Remix) Router, el App Router de Next.js 15 y los RSC, pero para entonces mi día a día ya era tan ajetreado que apenas tenía tiempo para programar y, por tanto, tampoco tuve ocasión de fracasar por cuarta vez. Ahora que lo pienso, desarrollé mi sitio web desde Next.js 13 hasta Next.js 15; apenas había terminado la migración y aún no lo había publicado cuando salió Next.js 16 beta 1.

Déjalo ir

Decir que «lo había dejado atrás» no es del todo exacto; simplemente estaba cansado.

Una captura de pantalla de una ventana de terminal de macOS (botones tipo semáforo arriba a la izquierda, fondo oscuro, tipografía monoespaciada) que muestra una tabla dibujada con caracteres de recuadro con el uso diario de tokens de LLM y su coste, desplazada de modo que la fila de encabezado queda fuera de la pantalla. Cada fila es una fecha desde el 3 de marzo de 2026 hasta el 13 de marzo de 2026 emparejada con los modelos usados ese día — haiku-4-5, opus-4-6 y, algunos días, sonnet-4-6 —, seguida de cinco columnas numéricas que se leen como tokens de entrada, de salida, de escritura en caché y de lectura de caché más un total, y un importe final en dólares; los totales van desde 161.186.904 tokens por 97,92 $ el 12 de marzo de 2026 hasta 3.277.442.496 tokens por 1.765,56 $ el 9 de marzo de 2026. La lectura de caché es con diferencia la columna dominante, a menudo miles de millones frente a unos pocos millones de tokens de salida, y el coste sigue de cerca ese total. Parece ser la salida de una CLI de informes de uso, prueba de una carga de trabajo intensa de Claude Code a lo largo de varios días, con su pico en la ventana del 6 al 9 de marzo de 2026 en torno a 1.700 $ diarios.

El ritmo de la era de la IA es demasiado rápido. Los modelos se iteran uno tras otro, las técnicas nuevas brotan oleada tras oleada, y yo estaba cada vez más ansioso, como si detenerme bastara para que me adelantaran. En lo más loco escribía código dieciséis horas al día y podía quemar $1.9k USD de Token en un solo día (por febrero, creo); estaba casi destrozado. Pero lo que detuvo todo esto no fue ninguna revelación, sino simple cansancio. Bajo un ritmo cada vez más apretado, cayó la última gota y, al contrario, me sentí en paz, solté, ; y así, también está bastante bien.

Empecé a soltar. Renuncié a aquello con lo que antes me obsesionaba, aprendí a detenerme cuando ya era suficiente y a dejar para mañana los asuntos de mañana. ¿Vane no está terminado? Lo dejo por ahora. ¿A Seam aún le falta mucho? Ya volveré más adelante. ¿El blog no es perfecto? Primero lo publico. Empecé a hacer Vibe Coding por completo: si no hay problemas, no lo toco; si surge alguno, ya me ocuparé entonces.

Lo extraño es que, después de soltar, la calidad no empeoró. Creo que se debe a que aquellos días de programación no fueron en vano. Ya usaba IA en la época de GPT-2, pero entonces seguía escribiendo con honradez cada línea de código y entendiendo cada concepto. Aquella etapa me dio la base. Lo que vino después fue menos Vibe Coding que Context Coding: el criterio necesario seguía ahí, y soltar no me llevó a ningún error de principiante ni a ningún accidente.

Todos aquellos experimentos anteriores son los que ahora me permiten soltar las riendas.

Punto de partida

La solución final resultó ser sorprendentemente sencilla: todo en Cloudflare. R2 para el almacenamiento de objetos, D1 como base de datos en el borde, KV para la caché y Worker para el renderizado del lado del servidor; todo con una arquitectura sin servidor y sin servidores.

Cloudflare Worker , workers.cloudflare.com, se abre en una pestaña nueva
Una captura de pantalla del hero de la página de inicio de marketing de Cloudflare, recortada en la parte superior de la página, sobre un fondo naranja saturado con una tenue textura de puntos y un resplandor cálido y pálido que asciende desde la parte inferior central. La barra de navegación incluye Products, Solutions, Resources y Pricing como elementos desplegables, con una píldora "Login" y un botón blanco "Start building" a la derecha; el titular dice "Everything we learned from powering 20% of the Internet—yours by default", seguido del subtítulo "Cloudflare is your AI Cloud with compute, AI inference, and storage — letting you ship applications instead of managing infrastructure." y una segunda llamada a la acción blanca "Start building". Es una muestra del posicionamiento actual de Cloudflare como una "AI Cloud" en lugar de un proveedor puramente de CDN o de seguridad, apoyándose en la afirmación de alcance del 20 % de internet como argumento probatorio.

¿Es irónica esta respuesta? Muchísimo. Porque antes de llegar a este destino «sencillo», di un rodeo enorme. En su día planeé alojarlo todo por mi cuenta, así que tenía que administrar un servidor, pelearme con Docker y gestionar contenedores. Por eso escribí Canopy como panel de administración, Lazycert para gestionar certificados, Vane como proxy inverso y Twig para instrumentar la supervisión de recursos. Un montón de proyectos solo para servir a un servidor de porquería.

Con el almacenamiento pasó lo mismo. El almacenamiento de objetos me parecía caro y quería usar el disco duro de mi propio servidor, así que escribí RFS, un VFS que eliminaba duplicados de forma atómica y reunía los datos en un único archivo. Incluso resucité el concepto de registro de las décadas de 1980 y 1990, y al final monté todo mediante FUSE. ¿El resultado? Dediqué aún más tiempo a reinventar una rueda peor, mientras el servidor estuvo un año funcionando en vacío. Fue un negocio ruinoso de principio a fin.

Vercel , vercel.com, se abre en una pestaña nueva
Una captura de pantalla de navegador de escritorio de la página de inicio de marketing de Vercel, renderizada sobre un fondo negro con una tenue cuadrícula superpuesta. La barra de navegación oscura lleva el logotipo del triángulo de Vercel a la izquierda, elementos de menú para Products, Resources, Solutions, Enterprise y Pricing, y los controles Ask AI, Log In y Sign Up a la derecha; el titular principal dice "Build and deploy on the AI Cloud." sobre el subtítulo "Vercel provides the developer tools and cloud infrastructure to build, scale, and secure a faster, more personalized web." Debajo se sitúan dos botones: uno principal blanco con el texto "Start Deploying" y el glifo del triángulo, y otro secundario con contorno que dice "Get a Demo". Bajo ellos, un gran triángulo de arte lineal se eleva desde la cuadrícula, iluminado por detrás por un resplandor que se difumina de azul a la izquierda, pasando por verde en el vértice, hasta rojo a la derecha, prueba de una captura reciente del posicionamiento actual del sitio en torno a la AI Cloud.

Después de dar un gran rodeo, al final volví a la computación sin servidor. El concepto de Vercel es bueno, pero no me gusta Next.js; además, Vercel depende de demasiada magia, y su diseño de software intermediario, precompilado para ejecutarse en el borde de la red, termina fragmentando el sistema e incluso ha dado lugar a varias CVE. Para eso, más vale ejecutarlo todo junto en el servidor de origen. Cloudflare Workers, en cambio, es excelente y lleva las cosas a otro extremo: compila en WASM los artefactos de menos de 10 MB, lo que permite ejecutar lógica de negocio real en el borde. Eso es exactamente lo que quiero. No tiene más inconveniente que el coste, aunque, pensándolo bien, tampoco es realmente un inconveniente, porque el tiempo ahorrado es dinero.

Menos es más

Había oído esta frase innumerables veces, pero tardé dos años en comprender de verdad su significado.

Volver a la esencia de la ingeniería: «Make it function, make it correct, then make it exceptional». Por fin encontré el buen camino y conseguí que funcionara. ¿Es rudimentario el blog actual? Lo es. ¿Está incompleto? Desde luego. Pero es mejor que nada. Si todavía no has publicado nada y sigues creando eso que «quizá necesites», siempre en busca de una perfección invisible, al final no tendrás nada que mostrar. Esto no es una concesión, sino una decisión de ingeniería. En cualquier caso, he aprendido a dejarlo estar. Así que lo dejé estar. Al dejar de obsesionarme con un solo detalle, acabé saliendo por la puerta. Hacía mucho que no había fotos al aire libre en mi móvil, así que tomé una al vuelo junto al camino; hacía muchísimo que no salía (

Una fotografía, tomada mirando hacia abajo a un seto bajo de arbustos de hoja perenne recortados que recorre el encuadre en diagonal detrás de un bordillo de granito claro, con una franja de pavimento gris y asfalto en la esquina inferior izquierda. Los arbustos son densos pero visiblemente ralos cerca del bordillo, donde se dejan ver tallos leñosos desnudos y un suelo de hojarasca marrón, y el follaje presenta el tono verde amarillento del nuevo crecimiento primaveral; un tronco esbelto se eleva desde la plantación en el borde superior, y una franja de plantas de temporada de color rojo herrumbre llena el fondo lejano. La luz es intensa y direccional, lo bastante baja como para proyectar sombras largas y suaves de un objeto fuera del encuadre sobre el pavimento y el bordillo, lo que sugiere el final de la tarde.

Al mirar atrás y recordar los rodeos que di, ¿me arrepiento? No. Hay cosas que quizá nunca llegues a comprender si no las pruebas por tu cuenta. Además, en la era de la inteligencia artificial ya es prácticamente imposible seguir el mismo camino de antes que recorrí yo; demasiados flujos de trabajo han cambiado. Y luego está este proyecto, Taki, programado íntegramente con inteligencia artificial. Pero eso no significa que no pueda mantenerse a largo plazo ni que carezca de un toque humano. En realidad, no importa si intervino o no la inteligencia artificial. Al fin y al cabo, lo que me gusta no es escribir código en sí, sino crear algo...