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