Alan Bruno Benavides Alvarez

Tech Lead · Full Stack Developer

Full stack developer with 5 years building end-to-end web products. I have led small teams as a tech lead: architectural decisions, stack and standards, and stepping into business logic when the team had no dedicated product role.

My default is the simplest option that solves the real problem — not the most complete one. And I think that with AI in the workflow (Claude Code and local models with Qwen), the technical side is no longer the bottleneck: the focus is on the solutions and on the people building them.

Bolivian and Peruvian citizen — authorized to work in both countries.

Spanish · NativeEnglish · Intermediate (B1)

Principles

How I work

01

Simple until proven otherwise

When there are two paths, the winner isn't the most elegant one — it's the one that puts less risk and less cost on the business. Migrating a whole database might be the "correct" move; an adapter that bridges it might be what keeps the product alive. I decide through that lens and I write it down so the team knows why.

02

An MVP before an inflated estimate

When business asks for something and engineering oversizes it, I don't squeeze the team — morale and stress are part of the system. I first check with the team whether the requirement is genuinely oversized, then mediate with business to cut it down to an MVP, we measure it, and only with that data do we re-estimate time and infrastructure for the rest.

03

AI as an exploration partner, not autocomplete

I use Claude Code and local models (Qwen) where they actually pay off: exploring systems I don't know, debugging, and code review. At Q-minex we received mining rigs of a model we had never handled; with SSH access from the plant network I used AI to map the firmware and its exposed APIs, and out of that came the integration proposal and the factory that brought them into the system — days of discovery cut to hours.

Toolkit

Tech Stack

Languages

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 (RS256 key rotation)TOTP / MFAArgon2bcryptAWS CognitoFirebase Auth

Databases

PostgreSQLPostgreSQL RLSPostGISMongoDBRedisSupabaseNeonCloudflare HyperdriveTurso (SQLite)Firebase

Infrastructure

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 SwarmPrometheusSentryGHCRSelf-hosted runnersQEMU / Buildx cross-buildsTurborepopnpm workspacesuvHusky / Commitlintruffmypygolangci-lintgosecgovulncheckLinters & formattersAutomated deployments

Testing

VitestJestPlaywrightReact Testing LibrarypytestTestcontainerstestify (Go)Postman

Integrations

StripeBinanceZoho CRMResendGoogle Sheets APIGoogle Maps APIPush notifications (FCM)

Product & analytics

FigmaGoogle AnalyticsGoogle Tag ManagerMeta PixelLighthouseCore Web Vitals

Payments & transactions

Money moving end to end

End-to-end Stripe implementation at Racquets App Suite for tournament entry fees, court bookings and training sessions. At Q-minex, Binance integration to control ASIC deposits into the main account and automate payouts of the generated balance. Trained on Bolivia's electronic invoicing API.

Track record

Experience

Tech Lead

Full-timeQ-minex(opens in new tab)·Jul 2025 – Jun 2026

Part of the technical core of an 8-person startup, leading a team of three (two developers and a designer) building a platform for cryptocurrency management and remote control of mining equipment, distributed across 3 plants with 111 active rigs and physical capacity for 500. I made all the architectural decisions for the product and we reached the first production deployment in 5 months.

  • Before the platform, a full manual check of a plant took around 4 hours, and assigning ASICs to their pools by hand was a recurring source of human error. The platform replaced both with a live view of every rig and a guided assignment flow.
  • Binance integration and real-time operation syncing.
  • Concurrent query module for mining rigs built in Go, talking to the manufacturer's API — managing concurrency without overloading the rigs or losing data.
  • On-premise physical server at each plant bridging to the rigs — only reachable on the local network — and centralizing their control; it speaks two hardware protocols directly, the manufacturer's CGMiner API over raw TCP to the rigs and Modbus TCP to the plant's energy meters, reaches the cloud over a Cloudflare Tunnel (no public IP, no inbound ports) and is monitored with Prometheus.
  • The plant agent also verifies that the pools configured on each rig still match the authorized ones, raising an alert and an audit entry when they don't — on a plant floor, a rig quietly repointed to someone else's pool is the failure that pays for itself.
  • Service-to-service auth on RS256 against our own JWKS endpoint, so keys could be rotated without coordinating a shared secret between a NestJS backend and a Go agent living in different repos and languages.
  • Infrastructure on AWS with CI/CD from day one: ECS in production and EC2 for staging, provisioned with Terraform and running Nginx, Docker and Docker Swarm, with observability via CloudWatch.
  • Responsible for planning, code reviews, business logic, and keeping the team aligned with product goals.
  • Polyglot persistence — two PostgreSQL databases and MongoDB, with Prisma or Drizzle depending on the service, and gRPC for service-to-service communication.
  • Nuxt frontend with Pinia, TanStack Query, Chart.js dashboards and 3D animations with Three.js, tested with Vitest and Playwright; a React Native app with biometric auth (Zustand, React Hook Form) was in development.
  • Google Analytics and Meta Pixel for product and acquisition tracking.
  • Kept the 3D dashboards inside a performance budget: Three.js scenes are the easiest place to lose a page, so I audited them with Lighthouse and watched the Core Web Vitals rather than letting a nicer visual cost the operators their load time.

Backend & Infrastructure Developer

FreelanceInmobile(opens in new tab)·May 2025 – Jul 2026

Sole owner of the backend and infrastructure for a real-estate platform (inmobile-app.com) where agents manage their properties and get matched with relevant listings. I built the entire backend in Go and owned scalability end to end. The implementation is complete and the product is in open beta on Google Play: first users on board and dashboards running while the public launch is prepared.

  • Entire backend built in Go with Echo v4, Ent as the ORM (Atlas for versioned migrations), PostgreSQL via pgx, and Redis for feed caching.
  • Advanced search with geographic filters on PostGIS and dedicated indexing to keep queries fast regardless of complexity.
  • Cloudflare Workers for image validation and property matching, keeping heavy processing off the main request flow; the matching worker reaches PostgreSQL through Hyperdrive on its own cron, with a keyset cursor so no listing slips between batches.
  • Firebase Auth (JWT) and FCM push notifications; Pusher for the real-time chat, with messages encrypted using AES-256-GCM from the Go standard library and a unique nonce per message; media stored on Cloudflare R2 through the S3 SDK.
  • Account deletion that satisfies GDPR and App Store review without destroying the other side of a conversation: chats survive, a listing tied to one stays as an empty tombstone, and the email is replaced with a deterministic address on an .invalid domain so the person can register again without breaking the unique constraint. The delete order is pinned by an integration test, because nearly every foreign key is NO ACTION and one step out of place aborts the whole transaction.
  • Agent reports exported straight into Google Sheets through its API, so the business side could work with the numbers in the tool they already used.
  • End-to-end ownership of infrastructure and scalability on Render: GitHub Actions CI/CD, Docker, Sentry for error monitoring, and Resend for transactional email.
  • API documented with OpenAPI/Swagger and exercised with Postman; testify for the test suite.

Full Stack Developer

FreelanceGaia del Sur(opens in new tab)·Nov 2025 – Jan 2026

Sole developer of the system that replaced the inherited in-house platform — a black box with no documentation and no visibility — of a specialized academic-bibliography distributor for the Andean region (180,000+ titles). I built it alone in 3 months: a public institutional site with the book catalog, plus an admin panel behind login for catalog, clients, and invoicing.

  • Recovered the 180,000+ titles with a Playwright scraper: the old system had no export and no documented schema. Each title carries around 40 fields, so re-entering them by hand was never an option. Normalized them into the new PostgreSQL model.
  • Full stack build with Nuxt (SSR), Nuxt UI, and Tailwind CSS on PostgreSQL, deployed on Coolify.
  • tRPC with Zod schemas shared between backend and frontend: a contract change fails at compile time, not in production.
  • Public institutional site with an SEO catalog, plus an admin panel behind login: catalog, clients, and invoicing.
  • Owned everything solo, from recovering the data to modeling it, the backend, and the UI; VeeValidate for form handling.
  • Lighthouse audits on the public catalog to hold the SEO and performance scores: 180,000+ titles only pay off if search engines can crawl and rank them, so Core Web Vitals and metadata were part of the build, not a later pass.

Senior Frontend Developer

Full-timeElgeniox (DATEC LATAM)(opens in new tab)·Aug 2024 – Jul 2025

Led the frontend of a B2C ecommerce platform for non-perishable goods, taking it from scratch to production in 8 months with one developer reporting to me. It replaced an existing Shopify store that already had traffic across Bolivia, so the rebuild had to hold on to that audience while lifting the limits the previous platform imposed on the business. I defined the architecture, the stack (Next.js), the code standards, and the design decisions.

  • Architecture organized by domain to stay maintainable as the catalog and features grew.
  • Caching strategies and SEO prioritized from the start, since organic traffic was critical to the business model — the store was already ranking under Shopify and none of that could be lost in the move.
  • Built the CMS from scratch with Strapi and integrated it with the web (branding, home, categories, and promotions) so the team could manage all site content easily.
  • Integrated DATEC's in-house payment gateway.
  • Frontend stack: Zustand for state, React Query for server state, React Hook Form with Zod for validation, Vitest and React Testing Library for tests, and Sentry to catch production failures before users reported them.
  • User tracking events routed through the Next.js server instead of straight from the browser, so ad blockers and other external agents wouldn't drop them and the analytics stayed reliable.
  • Core Web Vitals measured with Lighthouse on every iteration: in an ecommerce living off organic traffic, LCP and CLS move both ranking and conversion, so they were checked before shipping rather than after a drop in sales.

Full Stack Developer

Sole developer of the site for a coffee shop (lalalattecoffee.com): a product showcase with its own CMS so the owners could publish promotions and manage content themselves. Built in under a month and still running in production.

  • Nuxt and Tailwind CSS on top of Turso (SQLite at the edge), with a CMS for the team to manage products and content without a developer.
  • Transactional email and Google Tag Manager for campaign and conversion tracking.

Tech Lead

FreelanceRacquets App Suite(opens in new tab)·2022 – 2024

Tech lead for a racquet-sports platform (court booking and tournaments). I led both the React Native mobile app and the Node.js backend, coordinated a team of ~5 developers, and worked directly with the CEO to plan and implement new features. When I joined, the product had two modules (court booking and simple tournaments); I led the design and development of the tournaments and academy modules to scale it for broader use. It ran in production with 5 clubs and around 200 players.

  • Led the React Native mobile app (Firebase Auth, Redux, Redux-Saga, redux-form) and shipped it to both the App Store and Google Play.
  • Maintained and contributed to the Node.js + Express backend on Heroku: REST API, Stripe payments, Firebase, and Zoho CRM integration.
  • WebSockets for live match scoring and booking confirmations, so every participant saw the same state without refreshing.
  • Coordinated a team of ~5 developers and worked directly with the CEO on the product roadmap and new features.
  • Designed and shipped the tournaments and academy modules to scale the app beyond its original court-booking and simple-tournament features.

Frontend Developer

Full-timeDeltax(opens in new tab)·Nov 2021 – May 2024

Second frontend (and fifth overall developer) to join a logistics startup focused on freight transport, connecting companies with drivers and trucks. Over 2.5 years I accompanied the company's growth from 5 to ~50 people, working on three successive products: FMS, TMS, and the marketplace connecting freight with fleets and trucks.

  • Led several technical migrations: React class → function components, React Router v4 → v6 with route-level lazy loading, and JavaScript → TypeScript in the main project, which made code review faster and caught a class of errors before they reached production.
  • React with Redux and Redux-Thunk, redux-form and Formik for forms, AWS Cognito for authentication, and Jest for tests.
  • Built dedicated software on top of the platform for use by freight providers.
  • Responsible for onboarding and training new developers joining the team — four of them during my time there.
  • Drove a performance and usability pass on the operator screens with Lighthouse: the product had grown with no UX/UI work behind it, copy was hard to read and pages were slow. Load time and interface were fixed together, because the operators lived in those screens all day.

In practice

Field notes

An adapter instead of a migration

Racquets App Suite · 2022

I joined to lead a racquet-sports suite already in production on Firebase. As complexity grew we decided to move to a relational database, and there were two paths: migrate every existing module, or write an adapter letting the old modules talk to the new database.

I chose the adapter. A full migration meant more time, more cost, and a real risk of breaking functionality already serving users. The adapter let the team build new modules on the right foundation from day one without freezing the product. The debt stayed bounded and visible — which is not the same as not having it.

Scraping the system we were replacing

Gaia del Sur · 2025–2026

Gaia ran on an in-house platform inherited from an earlier team: no documentation, no visibility into what it did with the business's own data, and nothing anyone could safely change. Replacing it was the easy call. Getting the data out was not — the catalog of 180,000+ titles only existed inside that system, with no export and no schema anyone could read.

Re-keying it was never real, and there was no trustworthy way into the database underneath. The one interface the old system still honored was its own: it could render every record on screen. So I wrote a Playwright scraper that walked the catalog the way a user would, and normalized what came back into the new PostgreSQL model. Scraping is usually a smell; here it was the cheapest honest way out of a system nobody could read. The point of the project was never new features — it was making the data legible to the business that owned it.

Discovering unknown hardware with AI

Q-minex · 2026

A batch of ASICs arrived in a model the system didn't support. We put them on the plant network and, with SSH access, I used AI to explore the machine: what firmware it ran, what APIs it exposed, what shape each endpoint returned. With that map we built the integration proposal, and I wrote the factory for the model so it could join the mining pipeline alongside the 111 active rigs.

The interesting part isn't that AI wrote code — it's that it compressed the slowest part, which was understanding a closed system we had no documentation for.

A cursor that couldn't skip a row

Inmobile · 2026

Inmobile matches what agents are selling against what buyers are looking for — a search pattern is just a listing with a different status. I put the matching on a Cloudflare Worker with its own cron, separate from the Go backend, so a slow scoring pass could never make an API request slow.

The cursor took the longest. The obvious approach — remember the last processed timestamp and resume from there — loses rows silently, because Postgres NOW() is stable inside a transaction: one bulk update stamps thousands of rows with the identical value, and any batch cutting through that group drops the rest of it. I moved to a keyset cursor on (touched_at, id) that only advances once the batch is fully written, so a run that dies halfway just reprocesses idempotently. Scoring runs entirely from in-memory caches too, because on Workers every extra lookup is a subrequest, and that limit is what decides whether you can compare a listing against the whole catalog or only a handful.

Letting the database enforce the tenant boundary

Own product · 2026

I built a multi-tenant SaaS on a managed backend and later moved it to self-hosted PostgreSQL. The managed service was the right way to start — it removed a week of setup I didn't need to do twice — but as the product grew, the pieces I most needed to control, authentication and database policy, were the ones I controlled least. So I made the migration, and added a check in CI that fails the build if a reference to the old provider reappears. A migration nobody enforces is just a cleanup someone will quietly undo.

The more interesting decision was what replaced it. Tenant isolation stopped being an organization_id filter written by hand in application code and became Row-Level Security in Postgres, with every tenant query running inside a transaction that sets the tenant for that session. The point isn't that RLS is more sophisticated — it's that the boundary now fails closed: a developer who forgets the filter gets no rows instead of somebody else's. To keep that true, every migration creating a tenant table has to carry its own policy, and a script in CI fails the build when one doesn't.

Background

Education

Bachelor's in Systems Engineering

2018 – 2023

In the final stage of my Systems Engineering degree, with the thesis project as the remaining requirement. I also volunteered at the university's student research society, contributing to projects and teaching web technologies to new members.

Languages

  • SpanishNative
  • EnglishIntermediate (B1)

Let's build

Let's talk

Open to tech lead and full stack roles: remote with full overlap with US time zones, on-site or hybrid in Cochabamba, and formal hiring in Peru. I am open to travel and to relocating. I invoice directly and am set up to receive international payments in USD. The fastest way to reach me is by email.