abelardodiaz.dev~$ abelardodiaz.dev_
Proyectos/proyectosTIL/tilBlog/blogServicios/serviciosAbout/aboutCV/cvContacto/contactoHablemos./whatsapp

TIL - Today I Learned

Micro-lecciones aprendidas en produccion.

// til

Micro-lecciones aprendidas en produccion.

ProyectoTodosbloques-reciclablescall-blockercitas-bot-universalclaude-agent-patternsdevtoolsflask-survey-referral-systemgps-fleet-monitorgps-tracking-patternshikvision-cctv-backendhikvision-isapi-patternslive-conference-translatormulti-ai-provider-patternsportfolio-organicoportfolio-organico-templatesimulabnbtinymedia-compressvideo-frame-analyzerwhatsapp-webhook-patterns
proj:*bloques-reciclablescall-blockercitas-bot-universalclaude-agent-patternsdevtoolsflask-survey-referral-systemgps-fleet-monitorgps-tracking-patternshikvision-cctv-backendhikvision-isapi-patternslive-conference-translatormulti-ai-provider-patternsportfolio-organicoportfolio-organico-templatesimulabnbtinymedia-compressvideo-frame-analyzerwhatsapp-webhook-patterns
  • createLayout de anime.js: FLIP automatico para transiciones de layout imposiblesreactrecurso: anime.js (createLayout)2026-07-02
  • Cloudflare Browser Run: scrapear sitios JS-heavy a Markdown para pipelines IAairecurso: Cloudflare Browser Run2026-06-30
  • slot-text: animacion text roll sin dependencias para labels (2KB)reactrecurso: slot-text2026-06-28
  • sileo: toasts con fisica y morphing SVG para React (cero config)reactrecurso: sileo2026-06-26
  • HTTP QUERY: el verbo que faltaba entre GET y POST (RFC 10008)architecture2026-06-24
  • UV_PYTHON env var en GitHub Actions matrix: por que la version no respeta tu configdevopscitas-bot-universal2026-06-21
  • Validar JSON output del LLM: Pydantic + extract helper para code fencesaicitas-bot-universal2026-06-19
  • Idempotencia de recordatorios: flags booleanas vs tabla de logbackendcitas-bot-universal2026-06-17
  • PDFSlick: visor y render de PDF en React con estado via Zustandreactrecurso: PDFSlick2026-06-16
  • APScheduler ephemeral: la BD es la fuente de verdad, no el jobstorebackendcitas-bot-universal2026-06-15
  • Pydantic + 1 env var JSON: agrupar config relacionada en lugar de N variables sueltasbackendcitas-bot-universal2026-06-13
  • dateparser con locale es: fechas naturales en chatbots sin escribir un parserbackendcitas-bot-universal2026-06-11
  • State machine implicita en columna JSON: zero deps, suficiente para slot fillingbackendcitas-bot-universal2026-06-09
  • Clasificacion hibrida de intents: keywords primero, LLM despuesaicitas-bot-universal2026-06-05
  • F-Droid: del MR inicial al auto-publish via tags en 24hdevopscall-blocker2026-06-02
  • Prefix blocking: por que SQL LIKE le gana a un Trie en Androidandroidcall-blocker2026-05-31
  • Multi-SIM en Android: 3 tiers de permisos segun versionandroidcall-blocker2026-05-29
  • Backup encriptado: AES-256-GCM + PBKDF2 con header magicoandroidcall-blocker2026-05-27
  • Room: 7 migraciones incrementales sin perder datos del usuarioandroidcall-blocker2026-05-25
  • Hilt: @Binds para repositorios, @Provides para Roomandroidcall-blocker2026-05-23
  • Forzar dark theme en Compose con Material 3 (sin opcion al usuario)androidcall-blocker2026-05-21
  • CallScreeningService vs BroadcastReceiver: dos APIs para bloquear llamadasandroidcall-blocker2026-05-19
  • PyAudioWPatch para acceso a WASAPI en Pythonpythonlive-conference-translator2026-05-17
  • Track summary: calcular distancia y paradas de una ruta GPSpythongps-tracking-patterns2026-05-15
  • Monitorear storage de NVR via APIpythonhikvision-cctv-backend2026-05-13
  • Signal handlers para shutdown coordinado de threadspythonlive-conference-translator2026-05-12
  • Comandos remotos a vehiculos con confirmacion 2-steppythongps-fleet-monitor2026-05-10
  • Buscar grabaciones por rango de fechas via ISAPIpythonhikvision-cctv-backend2026-05-08
  • Generar subtitulos .srt y .vtt desde transcripcionpythonlive-conference-translator2026-05-06
  • Geofences con sync bidireccional al proveedor GPSpythongps-fleet-monitor2026-05-04
  • Snapshots JPEG via streaming channel en Hikvisionpythonhikvision-cctv-backend2026-05-02
  • deep-translator como alternativa gratuita a APIs de traduccionpythonlive-conference-translator2026-04-30
  • Adaptive polling: reducir 60% de llamadas API clasificando por estadopythongps-fleet-monitor2026-04-29
  • Descubrimiento automatico de camaras conectadas a un NVRpythonhikvision-cctv-backend2026-04-27
  • WASAPI Loopback: capturar audio del sistema sin virtual cablepythonlive-conference-translator2026-04-25
  • Haversine y stop detection sin dependencias externaspythongps-tracking-patterns2026-04-24
  • Digest Auth vs Basic Auth: cuando Hikvision ignora tu headerpythonhikvision-isapi-patterns2026-04-22
  • Pipeline multi-threaded con queue.Queue en Pythonpythonlive-conference-translator2026-04-20
  • OAuth con firma MD5 custom de Tracksolidpythongps-tracking-patterns2026-04-18
  • Migrar datos historicos de Excel a una web app (sin backend)javascriptsimulabnb2026-04-17
  • Dark mode con 3 estados: claro, oscuro y auto (Next.js + Tailwind)reactsimulabnb2026-04-16
  • Regimen 625 SAT: como calcular retenciones ISR/IVA de plataformas tecnologicasfinanzassimulabnb2026-04-15
  • Supabase con fallback a localStorage para apps que funcionan offlinereactsimulabnb2026-04-14
  • Recharts waterfall chart para desglose fiscal en apps financierasreactsimulabnb2026-04-13
  • rich: tablas y progress bars para CLIs que no dan penapythonvideo-frame-analyzer2026-04-12
  • tenacity: reintentos con backoff exponencial para APIs de IApythonvideo-frame-analyzer2026-04-11
  • Jetpack Compose: presets de compresion como sealed classandroidtinymedia-compress2026-04-10
  • asyncio fire-and-forget: enviar sin esperar respuestapythonwhatsapp-webhook-patterns2026-04-09
  • Markdown + SVG: la combinacion que las IAs realmente entiendentoolingdevtools2026-04-08
  • pydantic-settings: configuracion tipada desde .env sin boilerplatepythonvideo-frame-analyzer2026-04-08
  • WeasyPrint: generar PDFs profesionales desde Markdown con Pythonpythonportfolio-organico2026-04-07
  • Retry queue in-memory para webhooks que no puedes perderpythonwhatsapp-webhook-patterns2026-04-06
  • Intent router: como enrutar mensajes de WhatsApp a especialistaspythonwhatsapp-webhook-patterns2026-04-05
  • hmac.compare_digest: por que no puedes comparar firmas con ==securitywhatsapp-webhook-patterns2026-04-04
  • FFmpeg scene detection + IA de vision: analizar video sin revisar todos los framesaivideo-frame-analyzer2026-04-03
  • WhatsApp Cloud API: siempre retorna 200, incluso con firma invalidawhatsappwhatsapp-webhook-patterns2026-04-02
  • n8n webhook-driven architecture: desacoplar formularios del CRMflaskflask-survey-referral-system2026-03-31
  • python-slugify para generar nombres de archivo desde titulos en espanolpythonbloques-reciclables2026-03-31
  • Consensus debate multi-AI: N modelos votan con threshold dinamicoaimulti-ai-provider-patterns2026-03-30
  • Normalizacion de respuestas entre APIs de LLM heterogeneasaimulti-ai-provider-patterns2026-03-29
  • Context window routing: tamano real vs marketing en LLMsaimulti-ai-provider-patterns2026-03-28
  • CBAC: policy engine determinista para agentes sin depender del LLMaiclaude-agent-patterns2026-03-27
  • Markdown como estado persistente de agente: human-readable y git-friendlyaiclaude-agent-patterns2026-03-26
  • Job queue con SQLite: dead letter queue y retry con backoffaiclaude-agent-patterns2026-03-25
  • Anti-recursion guard: 4 capas de proteccion en agentes autonomosaiclaude-agent-patterns2026-03-24
  • OpenClaw vs DIY: mismos problemas, diferentes solucionesaiclaude-agent-patterns2026-03-23
  • CLAUDE.md como documentacion ejecutable: reglas que Claude Code sigue automaticamentedevxclaude-agent-patterns2026-03-22
  • Slash commands en .claude/commands/: automatizar workflows repetitivosdevxclaude-agent-patterns2026-03-22
  • Next.js 16: proxy.ts reemplaza a middleware.tsnextjsbloques-reciclables2026-03-21
  • Logging con prefijos semanticos para grep sin log aggregationtoolingflask-survey-referral-system2026-03-20
  • Validacion de longitud para posts de X: 280 chars max con warningpythonbloques-reciclables2026-03-20
  • Dual remote Git: GitHub para deploy, GitLab como backuptoolingportfolio-organico-template2026-03-19
  • Publicar template open-source: workflow de verificacion con 7 greps criticossecuritybloques-reciclables2026-03-18
  • Pre-commit hooks: gitleaks + sanitize_check.py como doble barrera de seguridaddevxbloques-reciclables2026-03-17
  • EXCLUDED_FILES en sanitize scanner: el scanner no debe escanearse a si mismosecuritybloques-reciclables2026-03-16
  • sanitize_check.py: 20+ regex patterns para escanear datos sensibles antes de publicarsecuritybloques-reciclables2026-03-16
  • Security headers en next.config.ts: 4 headers que todo sitio deberia tenernextjsbloques-reciclables2026-03-15
  • Vercel CLI: el workflow real para un portfolio en producciontoolingportfolio-organico2026-03-14
  • Vercel Analytics + Speed Insights: observabilidad sin cookies ni consentnextjsportfolio-organico2026-03-13
  • vercel env pull: sincronizar variables sin copiar secrets a manotoolingportfolio-organico2026-03-13
  • OG images dinamicas con Satori: cargar fonts desde Google Fonts APInextjsportfolio-organico2026-03-12
  • 28 paquetes composables sin dependencias circulares: arquitectura de ulfblkarchitecturebloques-reciclables2026-03-11
  • Google Analytics condicional: cargar solo si existe NEXT_PUBLIC_GA_IDnextjsportfolio-organico2026-03-10
  • Google Analytics redundante: el mayor culpable de mobile perfperformanceportfolio-organico2026-03-10
  • Monorepo dual: uv workspaces para Python + pnpm + Turborepo para TypeScriptdevopsbloques-reciclables2026-03-09
  • QR codes como data URI sin file storage en el servidorflaskflask-survey-referral-system2026-03-08
  • OTP rate limiting con triple defensa en Flaskflaskflask-survey-referral-system2026-03-07
  • HTTP status codes semanticos para formularios en vez de 400 para todoarchitectureflask-survey-referral-system2026-03-07
  • Multi-step forms con session + persistencia dual en Flaskflaskflask-survey-referral-system2026-03-06
  • siteConfig centralizado: editar 1 archivo para personalizar todo el portfolioarchitectureportfolio-organico-template2026-03-05
  • Componentes headless con hooks, i18n via props y defaults en espanolreactbloques-reciclables2026-03-04
  • browserslist en Next.js: eliminar 14 KiB de polyfills innecesariosnextjsbloques-reciclables2026-03-03
  • WCAG AA contrast: por que tuve que ajustar colores 3 vecestailwindportfolio-organico-template2026-03-03
  • Docker multi-stage build optimizado: de 1.2GB a 180MB en producciondevopsbloques-reciclables2026-03-02
  • Prose styling sin @tailwindcss/typography: CSS puro para MDX contenttailwindportfolio-organico-template2026-03-01
  • GitHub Actions workflows generados programaticamente con Pythonci-cdbloques-reciclables2026-02-28
  • Animacion con CSS transitions en vez de framer-motion: RotatingLabelreactportfolio-organico2026-02-27
  • Multi-channel messaging: WhatsApp, Telegram y Email con webhook verificationfastapibloques-reciclables2026-02-26
  • @theme inline en Tailwind v4: calc() con CSS variables para radii escalablestailwindportfolio-organico2026-02-25
  • Scheduling con slots timezone-aware, conflictos y concurrency controlfastapibloques-reciclables2026-02-24
  • base-ui Button + CVA: headless component con Tailwind variantsshadcnportfolio-organico2026-02-23
  • ButtonLink: componer Next.js Link dentro de base-ui Button via render propshadcnportfolio-organico2026-02-23
  • Google Calendar two-way sync con memory providers y conflict resolutionfastapibloques-reciclables2026-02-22
  • Dual-theme como storytelling: editorial vs terminal para audiencias diferentesarchitectureportfolio-organico2026-02-21
  • Stripe webhooks con procesamiento idempotente y asyncfastapibloques-reciclables2026-02-20
  • Context con doble eje: theme + mode como estados independientesreactportfolio-organico2026-02-19
  • Rule engine con condition evaluator: automatizacion sin hardcodefastapibloques-reciclables2026-02-18
  • data-slot en shadcn: cambiar font-family por tema sin conditional classesshadcnportfolio-organico2026-02-17
  • 4 temas en 1 archivo CSS: editorial light/dark + terminal light/darktailwindportfolio-organico-template2026-02-17
  • RAG pipeline con ChromaDB, Ollama y OpenAI en un solo moduloaibloques-reciclables2026-02-16
  • next/font/google: variable fonts automaticas al quitar weightnextjsportfolio-organico2026-02-15
  • Circuit breaker en API Gateway: rate limiting y auto-degradacionfastapibloques-reciclables2026-02-14
  • gray-matter parsea dates como Date objects: el bug que rompio el buildarchitectureportfolio-organico2026-02-13
  • Redis Streams con consumer groups para mensajeria durablefastapibloques-reciclables2026-02-12
  • generateStaticParams + gray-matter: SSG desde archivos MDX sin CMSnextjsportfolio-organico2026-02-11
  • next-mdx-remote/rsc vs next-mdx-remote: server-side MDX sin JS de clientenextjsportfolio-organico2026-02-11
  • SQLAlchemy async con mixins reutilizables y Alembic migrationsfastapibloques-reciclables2026-02-10
  • @custom-variant en Tailwind v4: crear variantes editorial: y terminal:tailwindportfolio-organico2026-02-09
  • JWT RS256 con Fernet credentials y proteccion brute forcesecuritybloques-reciclables2026-02-08
  • Inline script en layout.tsx para evitar flash de tema incorrectonextjsportfolio-organico-template2026-02-07
  • API Key auth con prefix lookup, hashing y cachesecuritybloques-reciclables2026-02-06
  • Git como CMS: MDX + frontmatter + generateStaticParams = zero-maintenance contentarchitectureportfolio-organico2026-02-05
  • FastAPI App Factory: middleware composable y health checks listosfastapibloques-reciclables2026-02-04
  • Server Components por defecto: Footer y ButtonLink sin 'use client'reactbloques-reciclables2026-02-03
  • PostgreSQL RLS via contextvars: multitenancy transparente sin WHERE manualfastapibloques-reciclables2026-02-02
  • Por que pnpm es mejor para monorepostoolingbloques-reciclables2026-02-01
  • createLayout de anime.js: FLIP automatico para transiciones de layout imposiblesreactrecurso: anime.js (createLayout)2026-07-02
  • Cloudflare Browser Run: scrapear sitios JS-heavy a Markdown para pipelines IAairecurso: Cloudflare Browser Run2026-06-30
  • slot-text: animacion text roll sin dependencias para labels (2KB)reactrecurso: slot-text2026-06-28
  • sileo: toasts con fisica y morphing SVG para React (cero config)reactrecurso: sileo2026-06-26
  • HTTP QUERY: el verbo que faltaba entre GET y POST (RFC 10008)architecture2026-06-24
  • UV_PYTHON env var en GitHub Actions matrix: por que la version no respeta tu configdevopscitas-bot-universal2026-06-21
  • Validar JSON output del LLM: Pydantic + extract helper para code fencesaicitas-bot-universal2026-06-19
  • Idempotencia de recordatorios: flags booleanas vs tabla de logbackendcitas-bot-universal2026-06-17
  • PDFSlick: visor y render de PDF en React con estado via Zustandreactrecurso: PDFSlick2026-06-16
  • APScheduler ephemeral: la BD es la fuente de verdad, no el jobstorebackendcitas-bot-universal2026-06-15
  • Pydantic + 1 env var JSON: agrupar config relacionada en lugar de N variables sueltasbackendcitas-bot-universal2026-06-13
  • dateparser con locale es: fechas naturales en chatbots sin escribir un parserbackendcitas-bot-universal2026-06-11
  • State machine implicita en columna JSON: zero deps, suficiente para slot fillingbackendcitas-bot-universal2026-06-09
  • Clasificacion hibrida de intents: keywords primero, LLM despuesaicitas-bot-universal2026-06-05
  • F-Droid: del MR inicial al auto-publish via tags en 24hdevopscall-blocker2026-06-02
  • Prefix blocking: por que SQL LIKE le gana a un Trie en Androidandroidcall-blocker2026-05-31
  • Multi-SIM en Android: 3 tiers de permisos segun versionandroidcall-blocker2026-05-29
  • Backup encriptado: AES-256-GCM + PBKDF2 con header magicoandroidcall-blocker2026-05-27
  • Room: 7 migraciones incrementales sin perder datos del usuarioandroidcall-blocker2026-05-25
  • Hilt: @Binds para repositorios, @Provides para Roomandroidcall-blocker2026-05-23
  • Forzar dark theme en Compose con Material 3 (sin opcion al usuario)androidcall-blocker2026-05-21
  • CallScreeningService vs BroadcastReceiver: dos APIs para bloquear llamadasandroidcall-blocker2026-05-19
  • PyAudioWPatch para acceso a WASAPI en Pythonpythonlive-conference-translator2026-05-17
  • Track summary: calcular distancia y paradas de una ruta GPSpythongps-tracking-patterns2026-05-15
  • Monitorear storage de NVR via APIpythonhikvision-cctv-backend2026-05-13
  • Signal handlers para shutdown coordinado de threadspythonlive-conference-translator2026-05-12
  • Comandos remotos a vehiculos con confirmacion 2-steppythongps-fleet-monitor2026-05-10
  • Buscar grabaciones por rango de fechas via ISAPIpythonhikvision-cctv-backend2026-05-08
  • Generar subtitulos .srt y .vtt desde transcripcionpythonlive-conference-translator2026-05-06
  • Geofences con sync bidireccional al proveedor GPSpythongps-fleet-monitor2026-05-04
  • Snapshots JPEG via streaming channel en Hikvisionpythonhikvision-cctv-backend2026-05-02
  • deep-translator como alternativa gratuita a APIs de traduccionpythonlive-conference-translator2026-04-30
  • Adaptive polling: reducir 60% de llamadas API clasificando por estadopythongps-fleet-monitor2026-04-29
  • Descubrimiento automatico de camaras conectadas a un NVRpythonhikvision-cctv-backend2026-04-27
  • WASAPI Loopback: capturar audio del sistema sin virtual cablepythonlive-conference-translator2026-04-25
  • Haversine y stop detection sin dependencias externaspythongps-tracking-patterns2026-04-24
  • Digest Auth vs Basic Auth: cuando Hikvision ignora tu headerpythonhikvision-isapi-patterns2026-04-22
  • Pipeline multi-threaded con queue.Queue en Pythonpythonlive-conference-translator2026-04-20
  • OAuth con firma MD5 custom de Tracksolidpythongps-tracking-patterns2026-04-18
  • Migrar datos historicos de Excel a una web app (sin backend)javascriptsimulabnb2026-04-17
  • Dark mode con 3 estados: claro, oscuro y auto (Next.js + Tailwind)reactsimulabnb2026-04-16
  • Regimen 625 SAT: como calcular retenciones ISR/IVA de plataformas tecnologicasfinanzassimulabnb2026-04-15
  • Supabase con fallback a localStorage para apps que funcionan offlinereactsimulabnb2026-04-14
  • Recharts waterfall chart para desglose fiscal en apps financierasreactsimulabnb2026-04-13
  • rich: tablas y progress bars para CLIs que no dan penapythonvideo-frame-analyzer2026-04-12
  • tenacity: reintentos con backoff exponencial para APIs de IApythonvideo-frame-analyzer2026-04-11
  • Jetpack Compose: presets de compresion como sealed classandroidtinymedia-compress2026-04-10
  • asyncio fire-and-forget: enviar sin esperar respuestapythonwhatsapp-webhook-patterns2026-04-09
  • Markdown + SVG: la combinacion que las IAs realmente entiendentoolingdevtools2026-04-08
  • pydantic-settings: configuracion tipada desde .env sin boilerplatepythonvideo-frame-analyzer2026-04-08
  • WeasyPrint: generar PDFs profesionales desde Markdown con Pythonpythonportfolio-organico2026-04-07
  • Retry queue in-memory para webhooks que no puedes perderpythonwhatsapp-webhook-patterns2026-04-06
  • Intent router: como enrutar mensajes de WhatsApp a especialistaspythonwhatsapp-webhook-patterns2026-04-05
  • hmac.compare_digest: por que no puedes comparar firmas con ==securitywhatsapp-webhook-patterns2026-04-04
  • FFmpeg scene detection + IA de vision: analizar video sin revisar todos los framesaivideo-frame-analyzer2026-04-03
  • WhatsApp Cloud API: siempre retorna 200, incluso con firma invalidawhatsappwhatsapp-webhook-patterns2026-04-02
  • n8n webhook-driven architecture: desacoplar formularios del CRMflaskflask-survey-referral-system2026-03-31
  • python-slugify para generar nombres de archivo desde titulos en espanolpythonbloques-reciclables2026-03-31
  • Consensus debate multi-AI: N modelos votan con threshold dinamicoaimulti-ai-provider-patterns2026-03-30
  • Normalizacion de respuestas entre APIs de LLM heterogeneasaimulti-ai-provider-patterns2026-03-29
  • Context window routing: tamano real vs marketing en LLMsaimulti-ai-provider-patterns2026-03-28
  • CBAC: policy engine determinista para agentes sin depender del LLMaiclaude-agent-patterns2026-03-27
  • Markdown como estado persistente de agente: human-readable y git-friendlyaiclaude-agent-patterns2026-03-26
  • Job queue con SQLite: dead letter queue y retry con backoffaiclaude-agent-patterns2026-03-25
  • Anti-recursion guard: 4 capas de proteccion en agentes autonomosaiclaude-agent-patterns2026-03-24
  • OpenClaw vs DIY: mismos problemas, diferentes solucionesaiclaude-agent-patterns2026-03-23
  • CLAUDE.md como documentacion ejecutable: reglas que Claude Code sigue automaticamentedevxclaude-agent-patterns2026-03-22
  • Slash commands en .claude/commands/: automatizar workflows repetitivosdevxclaude-agent-patterns2026-03-22
  • Next.js 16: proxy.ts reemplaza a middleware.tsnextjsbloques-reciclables2026-03-21
  • Logging con prefijos semanticos para grep sin log aggregationtoolingflask-survey-referral-system2026-03-20
  • Validacion de longitud para posts de X: 280 chars max con warningpythonbloques-reciclables2026-03-20
  • Dual remote Git: GitHub para deploy, GitLab como backuptoolingportfolio-organico-template2026-03-19
  • Publicar template open-source: workflow de verificacion con 7 greps criticossecuritybloques-reciclables2026-03-18
  • Pre-commit hooks: gitleaks + sanitize_check.py como doble barrera de seguridaddevxbloques-reciclables2026-03-17
  • EXCLUDED_FILES en sanitize scanner: el scanner no debe escanearse a si mismosecuritybloques-reciclables2026-03-16
  • sanitize_check.py: 20+ regex patterns para escanear datos sensibles antes de publicarsecuritybloques-reciclables2026-03-16
  • Security headers en next.config.ts: 4 headers que todo sitio deberia tenernextjsbloques-reciclables2026-03-15
  • Vercel CLI: el workflow real para un portfolio en producciontoolingportfolio-organico2026-03-14
  • Vercel Analytics + Speed Insights: observabilidad sin cookies ni consentnextjsportfolio-organico2026-03-13
  • vercel env pull: sincronizar variables sin copiar secrets a manotoolingportfolio-organico2026-03-13
  • OG images dinamicas con Satori: cargar fonts desde Google Fonts APInextjsportfolio-organico2026-03-12
  • 28 paquetes composables sin dependencias circulares: arquitectura de ulfblkarchitecturebloques-reciclables2026-03-11
  • Google Analytics condicional: cargar solo si existe NEXT_PUBLIC_GA_IDnextjsportfolio-organico2026-03-10
  • Google Analytics redundante: el mayor culpable de mobile perfperformanceportfolio-organico2026-03-10
  • Monorepo dual: uv workspaces para Python + pnpm + Turborepo para TypeScriptdevopsbloques-reciclables2026-03-09
  • QR codes como data URI sin file storage en el servidorflaskflask-survey-referral-system2026-03-08
  • OTP rate limiting con triple defensa en Flaskflaskflask-survey-referral-system2026-03-07
  • HTTP status codes semanticos para formularios en vez de 400 para todoarchitectureflask-survey-referral-system2026-03-07
  • Multi-step forms con session + persistencia dual en Flaskflaskflask-survey-referral-system2026-03-06
  • siteConfig centralizado: editar 1 archivo para personalizar todo el portfolioarchitectureportfolio-organico-template2026-03-05
  • Componentes headless con hooks, i18n via props y defaults en espanolreactbloques-reciclables2026-03-04
  • browserslist en Next.js: eliminar 14 KiB de polyfills innecesariosnextjsbloques-reciclables2026-03-03
  • WCAG AA contrast: por que tuve que ajustar colores 3 vecestailwindportfolio-organico-template2026-03-03
  • Docker multi-stage build optimizado: de 1.2GB a 180MB en producciondevopsbloques-reciclables2026-03-02
  • Prose styling sin @tailwindcss/typography: CSS puro para MDX contenttailwindportfolio-organico-template2026-03-01
  • GitHub Actions workflows generados programaticamente con Pythonci-cdbloques-reciclables2026-02-28
  • Animacion con CSS transitions en vez de framer-motion: RotatingLabelreactportfolio-organico2026-02-27
  • Multi-channel messaging: WhatsApp, Telegram y Email con webhook verificationfastapibloques-reciclables2026-02-26
  • @theme inline en Tailwind v4: calc() con CSS variables para radii escalablestailwindportfolio-organico2026-02-25
  • Scheduling con slots timezone-aware, conflictos y concurrency controlfastapibloques-reciclables2026-02-24
  • base-ui Button + CVA: headless component con Tailwind variantsshadcnportfolio-organico2026-02-23
  • ButtonLink: componer Next.js Link dentro de base-ui Button via render propshadcnportfolio-organico2026-02-23
  • Google Calendar two-way sync con memory providers y conflict resolutionfastapibloques-reciclables2026-02-22
  • Dual-theme como storytelling: editorial vs terminal para audiencias diferentesarchitectureportfolio-organico2026-02-21
  • Stripe webhooks con procesamiento idempotente y asyncfastapibloques-reciclables2026-02-20
  • Context con doble eje: theme + mode como estados independientesreactportfolio-organico2026-02-19
  • Rule engine con condition evaluator: automatizacion sin hardcodefastapibloques-reciclables2026-02-18
  • data-slot en shadcn: cambiar font-family por tema sin conditional classesshadcnportfolio-organico2026-02-17
  • 4 temas en 1 archivo CSS: editorial light/dark + terminal light/darktailwindportfolio-organico-template2026-02-17
  • RAG pipeline con ChromaDB, Ollama y OpenAI en un solo moduloaibloques-reciclables2026-02-16
  • next/font/google: variable fonts automaticas al quitar weightnextjsportfolio-organico2026-02-15
  • Circuit breaker en API Gateway: rate limiting y auto-degradacionfastapibloques-reciclables2026-02-14
  • gray-matter parsea dates como Date objects: el bug que rompio el buildarchitectureportfolio-organico2026-02-13
  • Redis Streams con consumer groups para mensajeria durablefastapibloques-reciclables2026-02-12
  • generateStaticParams + gray-matter: SSG desde archivos MDX sin CMSnextjsportfolio-organico2026-02-11
  • next-mdx-remote/rsc vs next-mdx-remote: server-side MDX sin JS de clientenextjsportfolio-organico2026-02-11
  • SQLAlchemy async con mixins reutilizables y Alembic migrationsfastapibloques-reciclables2026-02-10
  • @custom-variant en Tailwind v4: crear variantes editorial: y terminal:tailwindportfolio-organico2026-02-09
  • JWT RS256 con Fernet credentials y proteccion brute forcesecuritybloques-reciclables2026-02-08
  • Inline script en layout.tsx para evitar flash de tema incorrectonextjsportfolio-organico-template2026-02-07
  • API Key auth con prefix lookup, hashing y cachesecuritybloques-reciclables2026-02-06
  • Git como CMS: MDX + frontmatter + generateStaticParams = zero-maintenance contentarchitectureportfolio-organico2026-02-05
  • FastAPI App Factory: middleware composable y health checks listosfastapibloques-reciclables2026-02-04
  • Server Components por defecto: Footer y ButtonLink sin 'use client'reactbloques-reciclables2026-02-03
  • PostgreSQL RLS via contextvars: multitenancy transparente sin WHERE manualfastapibloques-reciclables2026-02-02
  • Por que pnpm es mejor para monorepostoolingbloques-reciclables2026-02-01

© 2026 Abelardo Diaz

// abelardodiaz.dev © 2026