Alan Bruno Benavides Alvarez

Tech Lead · Desarrollador Full Stack

Desarrollador full stack con 5 años construyendo productos web de punta a punta. He liderado equipos pequeños como tech lead: decisiones de arquitectura, stack y estándares, y metiéndome en la lógica de negocio cuando el equipo no tenía un rol de producto dedicado.

Mi criterio por defecto es la opción más simple que resuelva el problema real — no la más completa. Y creo que hoy, con IA en el flujo de trabajo (Claude Code y modelos locales con Qwen), lo técnico dejó de ser la barrera: el foco está en las soluciones y en las personas que las construyen.

Doble nacionalidad boliviana y peruana — puedo trabajar en ambos países.

Español · NativoInglés · Intermedio (B1)

Principios

Cómo trabajo

01

Lo simple, salvo que se demuestre lo contrario

Cuando hay dos caminos, el que gana no es el más elegante sino el que menos riesgo y menos costo mete al negocio. Migrar una base entera puede ser lo «correcto»; un adapter que la puentea puede ser lo que mantiene el producto vivo. Decido con ese lente y lo dejo escrito para que el equipo sepa por qué.

02

Un MVP antes que una estimación inflada

Cuando negocio pide algo y el equipo lo sobredimensiona, no aprieto al equipo — la moral y el estrés son parte del sistema. Primero valido con el equipo si el requerimiento está realmente sobredimensionado, después medio con negocio para recortarlo a un MVP, lo medimos, y recién con esos datos re-estimamos tiempo e infraestructura para el resto.

03

IA como par de exploración, no como autocompletado

Uso Claude Code y modelos locales (Qwen) donde más rinden: explorar sistemas que no conozco, debugging y revisión de código. En Q-minex llegaron máquinas de minado de un modelo nuevo; con acceso SSH desde la red de planta usé IA para mapear el firmware y las APIs expuestas, y de ahí salió la propuesta de integración y el factory que las sumó al sistema — días de discovery reducidos a horas.

Herramientas

Stack técnico

Lenguajes

TypeScriptJavaScriptGoPython

Frontend

ReactNext.jsVueNuxt.jsReact NativeTailwind CSSAstroRedux / Redux-SagaZustandPiniaTanStack QueryReact Hook FormVeeValidateZodValibotMaterial UIRadix UINuxt UIChart.jsThree.jsTresJSPixiJSGSAPDexie / IndexedDBPWA (Workbox)

Backend

NodeNestJSEcho (Go)tRPCgRPCWebSocketsFastAPISocket.IOBullMQExpressStrapiEnt (Go)PrismaDrizzleSQLAlchemyAlembicPydanticREST / OpenAPI (Swagger)Pusher

Auth

OAuth 2.0 / OIDCJWTJWKS (rotación de claves RS256)TOTP / MFAArgon2bcryptAWS CognitoFirebase Auth

Bases de datos

PostgreSQLPostgreSQL RLSPostGISMongoDBRedisSupabaseNeonCloudflare HyperdriveTurso (SQLite)Firebase

Infraestructura

AWS (EC2, ECS/Fargate, RDS Multi-AZ, ElastiCache, LB, CloudFront, S3, ECR, Secrets Manager, CloudWatch)Cloudflare (Workers, Pages, Tunnel, R2, Turnstile)TerraformLinuxNginxTraefikSSHSSL/TLSCDNVercelRenderHerokuCoolify

DevOps

GitHub ActionsDockerDocker SwarmPrometheusSentryGHCRRunners self-hostedCross-builds con QEMU / BuildxTurborepopnpm workspacesuvHusky / Commitlintruffmypygolangci-lintgosecgovulncheckLinters y formattersDespliegues automatizados

Testing

VitestJestPlaywrightReact Testing LibrarypytestTestcontainerstestify (Go)Postman

Integraciones

StripeBinanceZoho CRMResendGoogle Sheets APIGoogle Maps APINotificaciones push (FCM)

Producto y analytics

FigmaGoogle AnalyticsGoogle Tag ManagerMeta PixelLighthouseCore Web Vitals

Pagos y transacciones

Dinero moviéndose de punta a punta

Implementación end-to-end de Stripe en Racquets App Suite para cobros de inscripción a torneos, reserva de canchas y sesiones de entrenamiento. En Q-minex, integración con Binance para controlar el depósito de los ASICs a la cuenta principal y automatizar los depósitos del saldo generado. Formación en la API de facturación electrónica de Bolivia.

Trayectoria

Experiencia

Tech Lead

Tiempo completoQ-minex(se abre en una pestaña nueva)·Jul 2025 – Jun 2026

Parte del núcleo técnico de una startup de 8 personas, liderando un equipo de tres (dos desarrolladores y una diseñadora) para construir una plataforma de gestión de criptomonedas y control remoto de equipos de minería, distribuidos en 3 plantas con 111 rigs activos y capacidad física para 500. Tomé todas las decisiones de arquitectura del producto y llegamos al primer despliegue en producción en 5 meses.

  • Antes de la plataforma, una revisión manual completa de una planta tomaba alrededor de 4 horas, y asignar los ASIC a sus pools a mano era una fuente recurrente de error humano. La plataforma reemplazó las dos cosas con una vista en vivo de cada rig y un flujo de asignación guiado.
  • Integración con Binance y sincronización de operaciones en tiempo real.
  • Módulo de consulta concurrente de los rigs de minería construido en Go, contra la API del fabricante — gestionar la concurrencia sin sobrecargar los rigs ni perder datos.
  • Servidor físico on-premise en cada planta que hace de puente hacia los rigs —solo alcanzables en la red local— y centraliza su control; habla dos protocolos de hardware directo, la API CGMiner del fabricante sobre TCP crudo hacia los rigs y Modbus TCP hacia los medidores de energía de la planta, se conecta a la nube por Cloudflare Tunnel (sin IP pública ni puertos de entrada) y se monitorea con Prometheus.
  • El agente de planta además verifica que las pools configuradas en cada rig sigan siendo las autorizadas, y levanta una alerta con registro de auditoría cuando no coinciden — en una planta, un rig apuntado en silencio a la pool de otro es la falla que se paga sola.
  • Autenticación entre servicios con RS256 contra un JWKS propio, para poder rotar claves sin coordinar un secreto compartido entre un backend NestJS y un agente en Go que viven en repos y lenguajes distintos.
  • Infraestructura en AWS con CI/CD desde el día uno: ECS en producción y EC2 para staging, aprovisionados con Terraform y corriendo Nginx, Docker y Docker Swarm, con observabilidad vía CloudWatch.
  • Responsable de la planificación, code reviews, lógica de negocio y de mantener al equipo alineado con los objetivos del producto.
  • Persistencia políglota — dos bases PostgreSQL y MongoDB, con Prisma o Drizzle según el servicio, y gRPC para la comunicación entre servicios.
  • Frontend en Nuxt con Pinia, TanStack Query, dashboards con Chart.js y animaciones 3D con Three.js, testeado con Vitest y Playwright; una app React Native con autenticación biométrica (Zustand, React Hook Form) estaba en desarrollo.
  • Google Analytics y Meta Pixel para el seguimiento de producto y adquisición.
  • Mantuve los dashboards 3D dentro de un presupuesto de rendimiento: las escenas de Three.js son el lugar más fácil para perder una página, así que las audité con Lighthouse y vigilé las Core Web Vitals en lugar de dejar que un visual más lindo le costara el tiempo de carga a los operadores.

Backend e Infraestructura

FreelanceInmobile(se abre en una pestaña nueva)·May 2025 – Jul 2026

Único responsable del backend y la infraestructura de una plataforma inmobiliaria (inmobile-app.com) donde los agentes gestionan sus propiedades y obtienen matches con listados relevantes. Construí todo el backend en Go y me encargué de la escalabilidad de punta a punta. Las implementaciones están terminadas y el producto está en beta abierta en Google Play: con los primeros usuarios y los dashboards funcionando mientras se prepara el lanzamiento.

  • Todo el backend construido en Go con Echo v4, Ent como ORM (Atlas para versionar las migraciones), PostgreSQL vía pgx y Redis para el caché de feeds.
  • Búsqueda avanzada con filtros geográficos sobre PostGIS e indexación dedicada para mantener las consultas rápidas sin importar la complejidad.
  • Cloudflare Workers para la validación de imágenes y el matching de propiedades, sacando el procesamiento pesado del flujo principal; el worker de matching llega a PostgreSQL por Hyperdrive con su propio cron y un cursor keyset para que ninguna publicación se escape entre batches.
  • Firebase Auth (JWT) y notificaciones push por FCM; Pusher para el chat en tiempo real, con los mensajes cifrados con AES-256-GCM usando solo la librería estándar de Go y un nonce único por mensaje; media almacenada en Cloudflare R2 a través del SDK de S3.
  • Borrado de cuenta que cumple con GDPR y con la revisión de la App Store sin destruir el otro lado de una conversación: los chats sobreviven, una publicación atada a uno queda como tombstone vacía, y el email se reemplaza por una dirección determinística en un dominio .invalid para que la persona pueda registrarse de nuevo sin romper el índice único. El orden de los DELETE está fijado por un test de integración, porque casi todas las claves foráneas son NO ACTION y un paso fuera de lugar aborta la transacción entera.
  • Reportes de agentes exportados directo a Google Sheets por su API, para que el lado de negocio pudiera trabajar los números en la herramienta que ya usaba.
  • Responsabilidad de punta a punta de la infraestructura y la escalabilidad en Render: CI/CD con GitHub Actions, Docker, Sentry para monitoreo de errores y Resend para emails transaccionales.
  • API documentada con OpenAPI/Swagger y probada con Postman; testify para la suite de tests.

Desarrollador Full Stack

FreelanceGaia del Sur(se abre en una pestaña nueva)·Nov 2025 – Ene 2026

Único desarrollador del sistema que reemplazó la plataforma propia heredada —una caja negra sin documentación ni visibilidad— de una distribuidora de bibliografía académica de la Zona Andina (180.000+ títulos). Lo construí solo en 3 meses: un sitio institucional público con catálogo de libros y un panel administrativo con login para catálogo, clientes y facturación.

  • Recuperé los 180.000+ títulos con un scraper en Playwright: el sistema viejo no exportaba ni tenía esquema documentado. Cada título carga unos 40 campos, así que volver a cargarlos a mano nunca fue una opción. Los normalicé en PostgreSQL.
  • Desarrollo full stack con Nuxt (SSR), Nuxt UI y Tailwind CSS sobre PostgreSQL, desplegado en Coolify.
  • tRPC con esquemas Zod compartidos entre backend y frontend: un cambio de contrato falla en compilación, no en producción.
  • Sitio institucional público con catálogo SEO y panel administrativo con login: catálogo, clientes y facturación.
  • Me encargué de todo en solitario, desde la recuperación de los datos y el modelado hasta el backend y la UI; VeeValidate para el manejo de formularios.
  • Auditorías con Lighthouse en el catálogo público para sostener las notas de SEO y rendimiento: 180.000+ títulos solo rinden si los buscadores pueden rastrearlos y posicionarlos, así que las Core Web Vitals y los metadatos fueron parte de la construcción, no un repaso posterior.

Senior Frontend Developer

Tiempo completoElgeniox (DATEC LATAM)(se abre en una pestaña nueva)·Ago 2024 – Jul 2025

Lideré el frontend de una plataforma de ecommerce B2C de productos no perecederos, llevándola de cero a producción en 8 meses con un desarrollador a mi cargo. Reemplazó una tienda previa en Shopify que ya tenía tráfico en toda Bolivia, así que la reconstrucción tenía que sostener esa audiencia y a la vez levantar los límites que la plataforma anterior le imponía al negocio. Definí la arquitectura, el stack (Next.js), los estándares de código y las decisiones de diseño.

  • Arquitectura organizada por dominio para mantener el código sostenible a medida que crecían el catálogo y las funcionalidades.
  • Estrategias de caché y SEO priorizado desde el inicio, ya que el tráfico orgánico era crítico para el modelo de negocio: la tienda ya posicionaba bajo Shopify y nada de eso podía perderse en la migración.
  • Construí el CMS desde cero con Strapi y lo integré con la web (branding, home, categorías y promociones) para que el equipo gestione todo el contenido del sitio de forma fácil.
  • Integré la pasarela de pagos propia de DATEC.
  • Stack de frontend: Zustand para el estado, React Query para el estado del servidor, React Hook Form con Zod para validación, Vitest y React Testing Library para los tests, y Sentry para detectar fallas en producción antes de que las reportaran los usuarios.
  • Eventos de seguimiento del usuario enviados desde el servidor de Next.js en lugar de directamente desde el navegador, para que los bloqueadores y otros agentes externos no los descartaran y la analítica siguiera siendo confiable.
  • Core Web Vitals medidas con Lighthouse en cada iteración: en un ecommerce que vive del tráfico orgánico, LCP y CLS mueven tanto el posicionamiento como la conversión, así que se revisaban antes de publicar y no después de una caída en ventas.

Desarrollador Full Stack

Único desarrollador del sitio de una cafetería (lalalattecoffee.com): una vitrina de productos con CMS propio para que los dueños publiquen promociones y gestionen el contenido por su cuenta. Construido en menos de un mes y sigue vigente en producción.

  • Nuxt y Tailwind CSS sobre Turso (SQLite en el edge), con un CMS para que el equipo gestione productos y contenido sin depender de un desarrollador.
  • Emails transaccionales y Google Tag Manager para el seguimiento de campañas y conversiones.

Tech Lead

Tech lead de una plataforma para deportes de raqueta (reserva de canchas y torneos). Lideré tanto la app móvil en React Native como el backend en Node.js, coordiné un equipo de ~5 desarrolladores y trabajé directamente con el CEO para planificar e implementar nuevas features. Cuando entré, el producto tenía dos módulos (reserva de canchas y torneos simples); lideré el diseño y desarrollo de los módulos de torneos y academia para escalarlo a más usos. Funcionó en producción con 5 clubes y alrededor de 200 jugadores.

  • Lideré la app móvil en React Native (Firebase Auth, Redux, Redux-Saga, redux-form) y la publiqué tanto en la App Store como en Google Play.
  • Mantuve y contribuí al backend en Node.js + Express sobre Heroku: API REST, pagos con Stripe, Firebase e integración con Zoho CRM.
  • WebSockets para las anotaciones en vivo de los partidos y las confirmaciones de reserva, de modo que todos los participantes vieran el mismo estado sin recargar.
  • Coordiné un equipo de ~5 desarrolladores y trabajé directamente con el CEO en el roadmap del producto y las nuevas features.
  • Diseñé y entregué los módulos de torneos y academia para escalar la app más allá de sus dos módulos originales (reserva de canchas y torneos simples).

Frontend Developer

Tiempo completoDeltax(se abre en una pestaña nueva)·Nov 2021 – May 2024

Segundo frontend (y quinto desarrollador en total) en unirme a una startup de logística enfocada en transporte de carga, que conecta empresas con conductores y camiones. Durante 2.5 años acompañé el crecimiento de la empresa de 5 a ~50 personas, trabajando en tres productos sucesivos: FMS, TMS y el marketplace que conecta carga con flotas y camiones.

  • Lideré varias migraciones técnicas: componentes de clase → función en React, React Router v4 → v6 con lazy loading a nivel de ruta, y JavaScript → TypeScript en el proyecto principal, lo que agilizó la revisión de código y atrapó una clase de errores antes de que llegaran a producción.
  • React con Redux y Redux-Thunk, redux-form y Formik para formularios, AWS Cognito para la autenticación y Jest para los tests.
  • Desarrollé software dedicado sobre la plataforma para uso de los proveedores de carga.
  • Responsable del onboarding y la capacitación de los nuevos desarrolladores del equipo: cuatro durante mi tiempo ahí.
  • Impulsé una mejora de rendimiento y usabilidad en las pantallas de operación con Lighthouse: el producto había crecido sin trabajo de UX/UI detrás, los textos costaban de leer y las páginas eran lentas. El tiempo de carga y la interfaz se arreglaron juntos, porque los operadores vivían en esas pantallas todo el día.

En la práctica

Notas de campo

Un adapter en vez de una migración

Racquets App Suite · 2022

Entré a liderar una suite deportiva que ya estaba en producción sobre Firebase. Al crecer la complejidad se decidió pasar a una base relacional, y quedaban dos caminos: migrar todos los módulos anteriores, o escribir un adapter que dejara a los módulos viejos hablar con la base nueva.

Elegí el adapter. La migración completa significaba más tiempo, más costo y un riesgo real de romper funcionalidad que ya estaba dando servicio a usuarios. El adapter dejó al equipo construir los módulos nuevos sobre la base correcta desde el día uno, sin congelar el producto. La deuda quedó acotada y visible, que es distinto a no tenerla.

Scrapear el sistema que estábamos reemplazando

Gaia del Sur · 2025–2026

Gaia funcionaba sobre una plataforma propia heredada de un equipo anterior: sin documentación, sin visibilidad de lo que hacía con los datos del propio negocio y sin nada que se pudiera tocar con seguridad. Reemplazarla era la decisión fácil. Sacar los datos no lo era: el catálogo de 180.000+ títulos solo existía dentro de ese sistema, sin exportación y sin un esquema que alguien pudiera leer.

Volver a cargarlo a mano nunca fue una opción real, y tampoco había una vía confiable hacia la base de datos por debajo. La única interfaz que el sistema viejo seguía respetando era la suya: todavía sabía mostrar cada registro en pantalla. Así que escribí un scraper en Playwright que recorrió el catálogo como lo haría un usuario, y normalicé lo que volvía en el nuevo modelo de PostgreSQL. Scrapear suele ser un olor a problema; acá fue la salida más barata y honesta de un sistema que nadie podía leer. El objetivo del proyecto nunca fueron funcionalidades nuevas: fue volver legibles los datos para el negocio que era su dueño.

Discovery de hardware desconocido con IA

Q-minex · 2026

Llegaron ASICs de un modelo que el sistema no soportaba. Los conectamos a la red de la planta y, con acceso SSH, usé IA para explorar el equipo: qué firmware corría, qué APIs exponía, qué formato devolvía cada endpoint. Con ese mapa armamos la propuesta de integración y construí el factory para ese modelo, ya listo para entrar al pipeline de minería junto a los 111 rigs activos.

Lo interesante no es que la IA escribió código — es que comprimió la parte más lenta, que era entender un sistema cerrado del que no teníamos documentación.

Un cursor que no podía saltarse una fila

Inmobile · 2026

Inmobile cruza lo que los agentes publican contra lo que los compradores buscan — un patrón de búsqueda no es más que una publicación con otro estado. Puse el matching en un Cloudflare Worker con su propio cron, separado del backend en Go, para que una pasada de scoring lenta nunca pudiera volver lenta una request a la API.

El cursor fue lo que más tiempo llevó. Lo obvio —guardar el último timestamp procesado y seguir desde ahí— pierde filas en silencio, porque NOW() de Postgres es estable dentro de una transacción: un update masivo deja miles de filas con exactamente el mismo valor, y cualquier batch que corte ese grupo se come el resto. Pasé a un cursor keyset sobre (touched_at, id) que solo avanza cuando el batch terminó de escribirse, así una corrida que muere a la mitad simplemente reprocesa de forma idempotente. El scoring además corre íntegro desde caches en memoria, porque en Workers cada lookup extra es un subrequest, y ese límite es el que decide si podés comparar una publicación contra todo el catálogo o solo contra un puñado.

Dejar que la base de datos imponga el límite entre inquilinos

Producto propio · 2026

Construí un SaaS multi-tenant sobre un backend gestionado y después lo migré a PostgreSQL self-hosted. El servicio gestionado fue la forma correcta de arrancar —me ahorró una semana de setup que no necesitaba hacer dos veces— pero a medida que el producto creció, las piezas que más necesitaba controlar, la autenticación y las políticas de la base, eran las que menos controlaba. Así que hice la migración, y agregué un chequeo en CI que rompe el build si reaparece una referencia al proveedor viejo. Una migración que nadie hace cumplir es apenas una limpieza que alguien va a deshacer en silencio.

La decisión más interesante fue qué la reemplazó. El aislamiento entre inquilinos dejó de ser un filtro por organization_id escrito a mano en el código de aplicación y pasó a ser Row-Level Security de Postgres, con cada query corriendo dentro de una transacción que fija el inquilino de esa sesión. El punto no es que RLS sea más sofisticado — es que ahora el límite falla cerrado: un desarrollador que se olvida del filtro no obtiene filas, en vez de obtener las de otro. Para que eso siga siendo cierto, cada migración que crea una tabla de inquilino tiene que traer su propia política, y un script en CI rompe el build cuando alguna no la trae.

Formación

Educación

Licenciatura en Ingeniería de Sistemas

2018 – 2023

En la etapa final de mi carrera de Ingeniería de Sistemas, con el proyecto de tesis como requisito pendiente. También fui voluntario en la sociedad científica estudiantil de la universidad, donde contribuí a proyectos y enseñé tecnologías web a los nuevos miembros.

Idiomas

  • EspañolNativo
  • InglésIntermedio (B1)

Construyamos

Hablemos

Abierto a roles de tech lead y full stack: remoto con solape completo con husos horarios de EE.UU., presencial o híbrido en Cochabamba, y contratación formal en Perú. Estoy abierto a viajar y a reubicarme. Facturo directamente y tengo resuelto el cobro internacional en USD. La forma más rápida de contactarme es por email.