Notas desde la trinchera.
Notas de campo sobre PHP, Symfony, PrestaShop, CI/CD y la ingeniería poco glamurosa que mantiene la producción en silencio. Sin relleno — solo lo que de verdad funcionó, y por qué.
-
Tres strings y dos fallbacks: conectar el share sheet nativo en Forgemage.net
El botón de compartir de la página de detalle de una petición en Forgemage.net abre el share sheet del sistema allá donde el sistema tiene uno — Android, iOS, Windows, macOS — copia el link donde no lo hay, y se calla cuando simplemente cambias de opinión. Aquí está toda la implementación: navigator.share con tres strings, un guard de AbortError que deja pasar en vez de catchear, un fallback de clipboard con un fallback de execCommand debajo, y el detalle de Symfony de una sola letra que decide si el link compartido funciona.
Leer artículo ↗ -
Cada nuevo forjamago hacía la búsqueda más lenta: matar el N+1 detrás de Forgemage.net
El directorio de forjamagos de Forgemage.net lanzaba unas siete queries por tarjeta — reseñas, tiempo de respuesta, estado online, tres relaciones lazy — más contadores de facetas recalculados en cada cambio de filtro. Así pasé de una página de 24 tarjetas con ~168 queries a un puñado, con un cache batch scopeado a la request y una pasada paginate-then-hydrate, sin tocar las páginas de perfil individuales.
Leer artículo ↗ -
Markdown para agentes, self-hosted: un subscriber de Symfony en lugar de un plan de Cloudflare
Cloudflare convierte páginas a markdown para agentes IA vía Accept: text/markdown — en planes de pago. El mismo contrato HTTP cabe en un event subscriber de Symfony de 144 líneas. Mi homepage pasó de 59 KB de HTML a 7,7 KB de markdown, misma URL.
Leer artículo ↗ -
Claude Code desde mi móvil: Tailscale, Termius y toda la máquina en el bolsillo
El /remote-control de Claude Code refleja una sesión en tu móvil. SSH sobre Tailscale te da toda la workstation: retomar sesiones, lanzar otras nuevas en cualquier repo, seguir logs, reiniciar containers — sin exponer nada a internet.
Leer artículo ↗ -
RepoWrapped: el Spotify Wrapped de un repo de GitHub, y la API que se me resistió
Una idea de fin de semana — una página de stats compartible y un badge de README para cualquier repo de GitHub y cualquier contributor — que acabó en pelea con la API de stats de GitHub: 202 que nunca se resuelven, un muro en el top 100, y una fecha de primer commit que hay que sacarle a un header.
Leer artículo ↗ -
Dejar que jefes de proyecto no técnicos consulten la codebase en lenguaje natural
Por qué construí un analista de IA en modo solo lectura que permite a los jefes de proyecto hacer preguntas sobre una codebase y marcharse con un ticket de Jira creado automáticamente — y por qué todo funciona solo porque la IA puede leer pero nunca escribir.
Leer artículo ↗ -
Añadir revisión de código con IA a un GitLab self-hosted — sin darle las llaves
Cómo conecté Claude a la pipeline de merge requests de un GitLab self-hosted antiguo, y por qué todo el diseño depende de una regla: nunca dejar que la IA lea un diff no confiable y tenga un token al mismo tiempo.
Leer artículo ↗