Apuntes técnicos
Notas
Lo que se aprende operando sistemas reales en producción: límites de un hosting compartido, correo que hay que enviar sin SMTP, un service worker que se congela, un endpoint de salud que miente. Sin relleno genérico — cada nota sale de un problema que tuve que resolver.
Convertirse en Tech Provider de WhatsApp: la revisión de Meta paso a paso
Verificación del negocio, acceso avanzado, video de demostración e instrucciones para revisores. Lo que Meta pide para que una plataforma conecte los números de WhatsApp de otras empresas.
12 de setiembre de 2026 · 4 minTests que fallan al azar: el pool contra max_connections
Agregar un archivo de pruebas rompía otro distinto en cada corrida. La causa era aritmética: un pool por proceso multiplicado por los archivos del runner superaba el límite de PostgreSQL.
12 de setiembre de 2026 · 5 minTipado en JavaScript sin migrar a TypeScript
Cuatro archivos de configuración convierten el editor en un verificador de tipos sobre JavaScript plano. Qué reglas dan falsos positivos y por qué los diagnósticos importan más que el tema del editor.
11 de setiembre de 2026 · 6 minValidar una pasarela de pagos con un cobro real de un sol
El soporte dijo que la tienda no admitía cobros recurrentes. Un pago real de un sol, anulado el mismo día, demostró lo contrario y además destapó un bug que dejaba suscripciones sin crear.
10 de setiembre de 2026 · 5 minQué datos del titular publicar en la web de un negocio peruano
Identificar al proveedor es obligatorio; publicar su domicilio y su documento, no. Qué va en las páginas legales, qué nunca, y qué piden las pasarelas de pago antes de habilitar un comercio.
9 de setiembre de 2026 · 6 minLibro de Reclamaciones digital: responder en plazo y dejar constancia
Lo que la norma obliga a demostrar no es haber recibido el reclamo, sino haberlo respondido a tiempo. Cómo automatizar el plazo en días hábiles de Lima sin fabricar constancias.
7 de setiembre de 2026 · 5 minNotificaciones en iPhone sin app nativa: cuándo basta con una PWA
La creencia de que iOS obliga a publicar en la App Store para enviar avisos es falsa desde iOS 16.4. Cómo se comprobó con el teléfono bloqueado y cuándo sí conviene ir a nativo.
7 de setiembre de 2026 · 5 minEditar workflows de n8n por API sin crear un bucle infinito
Mover un nodo de sitio dejó viva una conexión vieja y el flujo se llamó a sí mismo cientos de veces. Por qué n8n no lo detecta al guardar y las seis líneas que lo evitan.
5 de setiembre de 2026 · 5 minEncender y apagar una función de un sitio estático sin redesplegarlo
El cobro con tarjeta a veces está activo y a veces no. Si eso lo decide el build, cada cambio es un deploy. Un patrón con un endpoint de configuración, sin parpadeo y con modo seguro por defecto.
4 de setiembre de 2026 · 4 minFiltros que crecen con los datos: cuándo pasar de chips a un desplegable
Con cuatro etiquetas la barra se ve bien; con catorce ocupa cuatro líneas y tapa lo que filtraba. Un criterio simple para controles cuyo tamaño decide el usuario y no el diseño.
3 de setiembre de 2026 · 6 minUna fábrica de contenido con n8n, IA y publicación automática
Todos los días a las 9:00 un flujo escribe un post, genera su ilustración y lo publica en Facebook sin intervención. Cómo está armado, qué modelos gratuitos sirven y cómo lograr imágenes sin texto basura.
2 de setiembre de 2026 · 5 minCandados en las puertas de atrás: crons, API keys y colas
Cerrar un agujero de autorización en el panel no lo cierra en el sistema. Las cuatro puertas traseras por donde vuelve a entrar el mismo problema y cómo encontrarlas con una búsqueda.
27 de agosto de 2026 · 5 minMeta Business Suite: nombres visibles, verificaciones y cuentas huérfanas
Un espacio en el nombre basta para que Meta rechace el número de WhatsApp, y mientras revisa bloquea cualquier otro cambio sin decir por qué. Lo que conviene saber antes de configurar un negocio.
26 de agosto de 2026 · 7 minDe código Visual Basic 6 a un diagrama BPMN con IA
Veinte mil líneas de un sistema que nadie se atreve a tocar, convertidas en un proceso de negocio dibujado. Qué modelo elegir, cómo validar la salida y cómo no pagar dos veces el mismo análisis.
25 de agosto de 2026 · 6 minTres bugs de interfaz que no muestran ningún error
Un flex-1 que ignora su altura, un botón de Tailwind sin cursor de mano y un useEffect que revienta al desmontar. Tres fallas reales, cómo se diagnosticaron y la regla que dejó cada una.
24 de agosto de 2026 · 6 minSuscripciones recurrentes en Perú: Culqi frente a Izipay
Cobrar todos los meses sin pedir la tarjeta otra vez: cliente, tarjeta tokenizada y suscripción nativa. Qué cambia entre las dos pasarelas y qué debe decidir siempre el servidor.
22 de agosto de 2026 · 7 minCobrar con Izipay: checkout embebido, doble confirmación e idempotencia
El pago se confirma por el navegador y por un aviso servidor a servidor, con firmas distintas. Cómo integrarlo sin cobrar montos viejos, sin duplicar activaciones y sin un IPN que falla en silencio.
21 de agosto de 2026 · 6 minLa API de LinkedIn: versiones que caducan y subidas que devuelven HTML
Un 400 con la página web completa de LinkedIn en vez de un JSON de error. La causa era un encabezado que curl agrega solo. Lo aprendido publicando imágenes y video con la Posts API.
19 de agosto de 2026 · 6 minPublicar en Facebook e Instagram por API sin OAuth personal
El token de tu propio usuario no ve las páginas de un portfolio comercial, e Instagram procesa hasta las imágenes de forma asíncrona. Las trampas reales de la Graph API al automatizar publicaciones.
17 de agosto de 2026 · 7 minChecklist de robustez para sistemas pequeños, basado en OWASP 2025
OWASP 2025 sumó cadena de suministro y manejo de condiciones excepcionales. Una lista práctica, independiente del lenguaje, para sistemas que corren en infraestructura modesta.
16 de agosto de 2026 · 4 minEl sonido de aviso que dejó de sonar sin ningún error
Chrome permite unos seis AudioContext por página. Crear uno por aviso funciona las primeras veces y luego falla en silencio. El patrón correcto para sonidos cortos sintetizados.
15 de agosto de 2026 · 5 minLatencia desde Perú a un servidor en Europa: medir antes de optimizar
Cada petición pagaba 250 ms de viaje y el backend tardaba 5. Cómo separar los tres tramos de una respuesta lenta, qué se arregla con UI optimista y cuándo sí hay que mover el servidor.
14 de agosto de 2026 · 5 minAvisos por capas: sonido, toast, notificación y título
Una notificación del sistema disparada siempre es ruido y el usuario acaba bloqueándola. Cómo decidir qué aviso mostrar según dónde está mirando la persona en ese momento.
13 de agosto de 2026 · 5 minServidor en UTC, usuarios en Lima: el "hoy" que empieza a las 7 de la noche
Un mensaje de las 8:30 p. m. se contaba en el día siguiente y el gráfico parecía mentir. Dónde convertir la zona horaria, qué no hay que tocar nunca, y la trampa equivalente en el navegador.
10 de agosto de 2026 · 6 minTiempo real con SSE: el aviso que nunca le llega al otro usuario
Todo funciona probando con una sola cuenta. Con dos, los cambios que afectan a otra persona no aparecen, o peor, aparecen en la sesión equivocada. El error de diseño detrás y cómo evitarlo.
7 de agosto de 2026 · 6 minMonitorear tus propios sistemas: salud por pull, auditoría por push
Un panel que vigila varias aplicaciones sin VPS ni servicios externos. Por qué la salud se consulta desde el panel, la auditoría la envía cada sistema, y cada uno tiene su propia llave.
5 de agosto de 2026 · 4 minAstro y transition:persist: el enlace que se quedó congelado
Un logo persistido entre navegaciones seguía apuntando a #inicio en páginas donde esa ancla no existe. Lo que conviene saber de View Transitions antes de persistir un elemento con props.
2 de agosto de 2026 · 6 minLa dependencia que abría 24 hilos sin usarse
En un hosting con límite de procesos, un solo require de un binding nativo sumaba un hilo por núcleo del servidor. Cómo se encontró al culpable en un minuto y por qué el arreglo fue mover una línea.
1 de agosto de 2026 · 5 minCuando el alias del correo rompe el inicio de sesión
Un administrador entró con nombre+alias@gmail.com y el sistema no lo reconoció como el mismo dueño de siempre. Por qué el nombre de usuario y el correo de contacto deben ser columnas separadas desde el primer día.
30 de julio de 2026 · 5 minUn /health que no consulta la base de datos está mintiendo
Devolver 200 porque el proceso Node sigue vivo no dice nada sobre si el sistema funciona. Qué debe verificar de verdad un endpoint de salud antes de que un panel de monitoreo confíe en él.
28 de julio de 2026 · 5 minUn color de acento que sale de tu imagen sin romper la accesibilidad
Tomar el color dominante de una foto para teñir la interfaz es fácil. Que el resultado siga siendo legible con cualquier foto, en claro y en oscuro, obliga a buscar la luminosidad por iteración.
27 de julio de 2026 · 6 minLas trampas de hacer una PWA de verdad instalable
El service worker no es opcional, una caché de un año puede congelar tu propio sw.js, y la isla dinámica de iOS necesita su propio color. Lo que se aprende recién al instalarla en un celular real.
26 de julio de 2026 · 5 minContraste medido, no a ojo: WCAG en un tema oscuro
La primera paleta oscura tenía tarjetas a 1,09:1 contra el fondo y se veía como una masa negra. Un script de 32 pares de colores y tres reglas que no se vuelven a romper.
25 de julio de 2026 · 6 minDespliegue continuo a un cPanel que no tiene rsync
GitHub Actions, una llave SSH por proyecto y un tar.gz que reemplaza el sitio entero. Cómo automatizar el deploy en un hosting compartido y poner barreras para que nada roto llegue a producción.
24 de julio de 2026 · 5 minEnviar correo desde un hosting que bloquea SMTP saliente
Los puertos 587 y 465 cerrados tumban a Gmail, Resend y SendGrid por igual. Cómo seguir enviando correo transaccional real desde un cPanel compartido sin esos puertos.
22 de julio de 2026 · 7 minLo que un cPanel compartido puede y no puede correr
Un relevamiento real de un servidor de producción: qué runtimes hay, qué binarios faltan (ffmpeg, OCR, LibreOffice) y en qué momento conviene dejar de pelear contra los límites y migrar a un VPS.
16 de julio de 2026 · 7 minEscritorio remoto desde el navegador con WebRTC y un TURN propio
Controlar una PC sin instalar clientes suena simple hasta que aparecen el firewall corporativo, los datos móviles y el autoplay bloqueado. Lo que enseñó construir Remote de punta a punta.
10 de julio de 2026 · 6 minPor qué Utilitarios nunca sube tus archivos a un servidor
La decisión de procesar PDF, imágenes y texto dentro del navegador con WebAssembly no fue solo una elección técnica: es el argumento frente a iLovePDF y lo que hace que el sitio funcione sin conexión.