Saltar para o conteúdo
Fullstack Developer

João
Bernardo

Fullstack developer en Ribeirão Preto, Brasil. Construyo APIs, interfaces y a veces juegos.

React · Node.js · TypeScript · Java · Python · AWS

5+
Años de experiencia
4
Empresas
46
Repos en GitHub

Sobre Mí

Soy un developer fullstack con 5 años de experiencia construyendo aplicaciones web que hacen la diferencia. He trabajado en empresas de marketing (Authorify, EE.UU.), e-commerce B2B (Take) y fintech (Verzel). Todo empezó por los videojuegos. Amaba jugarlos y siempre quise entender cómo estaban hechos, así que terminé estudiando Análisis y Desarrollo de Sistemas y me enamoré de la programación y de este mundo de la tecnología. Esa curiosidad de desarmar las cosas para ver cómo funcionan se volvió una pasión por crear soluciones completas, del backend al pixel final.

Creo que el buen software es invisible: carga rápido, es intuitivo y accesible para todos. Cada línea de código que escribo tiene un propósito — resolver un problema real, no impresionar con complejidad innecesaria.

Mi enfoque combina visión fullstack con atención al detalle. Trabajo con React en el frontend y Java/Python/NestJS en el backend, deploy en la nube con AWS y Docker. Fuera del código, co-fundé RP.js — comunidad JavaScript de Ribeirão Preto — y desarrollé Ribeirão Noir, un juego investigativo lanzado en la Feria del Libro y validado por 3 doctores.

Trayectoria

  1. 2025

    Full Stack Developer @ Verzel

    APIs RESTful en Python, Java (Spring Boot) y NestJS para sistemas de tarjetas, SAC y CRM. Automatización RPA con Playwright. Interfaces React con Vite.

    PythonJavaNestJSReactOracle
  2. 2023

    Full Stack Developer @ Take

    Microservicios para e-commerce B2B con React, Spring Boot y AWS. Optimización de queries con mejora del 60% en rendimiento. Mentoría de devs junior y code reviews.

    ReactJavaAWSRabbitMQCypress
  3. 2022

    Full Stack Developer @ Authorify

    Servicios escalables con NestJS, React y MongoDB para marketing inmobiliario (EE.UU.). Refactorización de código legacy React (+30% rendimiento). Cobertura de tests >85%.

    NestJSReactMongoDBJestCypress
  4. 2021

    Full Stack Developer Trainee @ Target Sistemas

    Sistema empresarial con Kanban, rastreo de rutas (Google Maps API) e informes automáticos PDF/Excel. Interfaces Angular con RxJS. Plugin Adobe XD. App móvil Flutter.

    AngularTypeScriptFlutterExpress

Proyectos

PROYECTO 2026 GoSQLitePostgreSQLReact 19DockerPrometheus

Monitoreo de disponibilidad en Go que cabe en un binario y muestra latencia junto al estado. La interfaz viene embebida en el ejecutable, así que no hay nginx al lado ni carpeta de estáticos que quede desfasada. Proyecto mío, open source bajo AGPL-3.0.

Case Study

Problema

Casi todo incidente empieza con el servicio poniéndose lento, no cayéndose, y un monitor que solo sabe decir arriba o abajo llega tarde a esa historia. Buena parte de las opciones además pide nginx al lado y una carpeta de archivos estáticos, volviéndose más pieza para mantener que el servicio monitoreado.

Decisión Técnica

Un solo binario, con la interfaz embebida por go:embed. Almacenamiento enchufable entre SQLite y PostgreSQL, con la misma batería de conformidad corriendo idéntica en los dos para impedir que base enchufable se vuelva fachada. Los latidos crudos se agregan por hora y por día, y el percentil sale siempre del dato crudo, nunca percentil de percentil. Una sonda independiente separa la caída del objetivo de la caída de la propia red, y solo gana el poder de silenciar una alerta después de probar que funciona, porque una sonda bloqueada por firewall callaría todo para siempre.

Resultado

27 mil líneas de Go, 12 mil de ellas de prueba, en 651 funciones de test. La única superficie sin credencial, la página pública de estado, recibe una batería de intrusión con travesía de ruta, inyección en el slug y cabecera Host forjada. Imagen en GHCR, sitio del proyecto en el aire y licencia AGPL-3.0.

Leer case study →
PROYECTO 2026 TypeScriptNode 24Azure DevOpsDockerVitest

Alimenta los Smart Objects de Gather con el trabajo de verdad. Un PR esperando review, un pipeline rojo, una tarea en curso y una reunión a punto de empezar, todo en tu escritorio de la oficina virtual. Proyecto mío, open source bajo MIT.

Case Study

Problema

Saber qué estaba esperando por mí exigía abrir cuatro herramientas, y ninguna hablaba con las otras. Mientras tanto, el escritorio de la oficina virtual estaba ahí de adorno, pudiendo ser el panel.

Decisión Técnica

Ports and adapters de punta a punta, con el núcleo sin conocer Azure DevOps, Google, Microsoft ni el propio Gather. La fuente reporta el hecho y la superficie decide la presentación, así que Google y Outlook emiten la misma señal y el segundo proveedor de agenda no cuesta nada. El rate limit de Gather es por space, no por objeto, así que el despachante compara con el último estado enviado y manda solo la diferencia.

Resultado

130 casos de prueba, con las superficies escritas como funciones puras y testeadas sin red. Un minuto sin novedad cuesta cero peticiones. La imagen agrega cerca de 1 MB sobre node:24-alpine, con memoria limitada a 128 MB, porque un monitor que estorba a la máquina que monitorea falló en su trabajo.

Leer case study →

Instanta

PROYECTO 2026 HonoCloudflare WorkersD1DrizzleReact 19TypeScript

Un feed colaborativo de fotos por evento, con muro en vivo y modo pantalla grande para el salón. Un proyecto personal, solo, edge-native en Cloudflare (Workers, D1, R2, Durable Objects), con una postura de seguridad y arquitectura más seria de la que un app de fiesta pediría.

Case Study

Problema

Todo evento dispersa sus fotos entre decenas de celulares y grupos de mensajes, y nunca existe un álbum único, vivo y compartido. Quería algo instantáneo, mobile-first, que funcionara hasta con el wi-fi malo de un salón de fiestas.

Decisión Técnica

Genuinamente edge-native. Hono en un Cloudflare Worker, D1 (SQLite en el edge) vía Drizzle, R2 para las fotos y un Durable Object para el rate limit, con el front (React 19 + TanStack Router) y la API subiendo juntos en un único deploy. La lógica de negocio vive en una capa pura, aislada del framework por una regla de ESLint, testeable sin levantar nada. Seguridad mucho más allá de lo que un app de fiesta necesita, con 2FA, anti-enumeración en el login y un manejo de sesión que detecta un token robado.

Resultado

Los tests de integración corren en workerd, el runtime real de los Workers, con D1, R2 y Durable Object de verdad, más accesibilidad con axe-core en Playwright. Hoy sube a una dirección workers.dev. Es un proyecto personal en construcción, todavía no lanzado.

Leer case study →

ADG — Arena Draft Guide

CONTRIB 2026 Docker SwarmTraefikPortainerGrafanaTauriRustExpressPostgreSQL

Tracker de estadísticas de League of Legends (Arena y ARAM: Mayhem) y Valorant para un grupo de amigos, con rankings y logros. Contribuí con la infraestructura de producción self-hosted y con la app companion que captura datos que la API pública de Riot no expone.

Case Study

Problema

Riot no expone los datos de ARAM: Mayhem (cola 2400) en su API pública — así que rankear las partidas de ese modo era imposible, y era justo lo que el grupo más jugaba. En paralelo, el proyecto necesitaba salir de servicios gestionados caros hacia una infraestructura de producción confiable, observable y barata.

Decisión Técnica

Lo ataqué por dos frentes. (1) Un companion desktop en Tauri + Rust que lee el cliente local de Riot (APIs LCU y LiveClient) para capturar las partidas de Mayhem que la API pública esconde, con patrón outbox offline para entrega confiable y credenciales guardadas en el Windows Credential Manager. (2) Una infraestructura self-hosted en Oracle Cloud Free Tier (VM ARM siempre-gratuita) orquestada con Docker Swarm: API Express en 2 réplicas con rolling update sin downtime, Postgres 16, Traefik gestionando el ingress con TLS automático (Let's Encrypt), deploy GitOps vía Portainer (el compose se lee directo del Git y el redeploy se dispara por webhook) y observabilidad completa con Grafana + Loki + Prometheus. Backups cada 6h a dos destinos remotos, como seguro contra la pérdida de la cuenta.

Resultado

Deploy continuo con cero downtime: un push a main construye la imagen arm64 en GHCR y dispara el redeploy automático. Dashboards de API, Postgres e infra en Grafana, con alertas sobre la salud del servicio. Costo de servidor: cero, en el Free Tier de Oracle. Y lo principal: los datos de ARAM: Mayhem — invisibles por la API pública — pasaron a capturarse y rankearse.

Leer case study →
CONTRIB 2026 TauriRustReactTypeScriptxterm.js

Un workspace de escritorio open-source para ejecutar y retomar varios agentes de código y terminales en paralelo, creado por Kauã (Kc1t). Lo uso todos los días y contribuí de vuelta con PRs e issues, del fix de scroll en TUIs al auto-update in-app.

Case Study

Problema

Usando Alethe pesado en el día a día, me topé con cosas reales. La memoria subiendo por procesos de PTY huérfanos, el scroll del mouse muerto dentro de TUIs, y tener que ir a GitHub a mano para saber de una versión nueva.

Decisión Técnica

Reporté los bugs con análisis de causa raíz y mandé tres PRs merged. El fix de scroll en buffer alternativo (con tests), la separación del ciclo de vida de la terminal (pausar, matar, borrar) y el auto-update in-app de punta a punta con el plugin de Tauri 2.

Resultado

Tres contribuciones en vivo en un proyecto que es de Kauã, mi compañero y amigo. No es mi app, es una contribución enfocada, pero cada una me hizo entender mejor terminales, PTY y Tauri. Todavía hay una issue mía abierta que quiero construir.

Leer case study →

Ribeirão Noir

PROYECTO 2025 Godot 4GDScriptSOLIDDesign Patterns

Juego investigativo noir en los años 1950 de Ribeirão Preto, protagonizado por Dandara, como herramienta de educación antirracista. Desarrollado en Godot (GDScript) con arquitectura SOLID y narrativa orientada a datos. Validado por tres doctores y lanzado en la Feria del Libro.

Case Study

Problema

Transformar la historia y cultura afrobrasileña en una experiencia envolvente para jóvenes, ayudando a cumplir las leyes 10.639 y 11.645. El desafío de ingeniería era entregar un RPG narrativo completo en Godot, en seis meses.

Decisión Técnica

Narrativa orientada a datos en JSON, interpretada por un motor propio, con sistema de dado, postura y riesgo, y un guardado que reconstruye la partida entera. Arquitectura SOLID, con SRP por delegación, Observer vía signals y composición sobre herencia. Nueve lugares de Ribeirão, 3 profesiones y 4 posturas.

Resultado

Lanzado en la Feria Internacional del Libro, gratuito, en itch.io. Validado por tres doctores (USP, Metodista, UFTM) y mapeado a la BNCC de 9º año, con material pedagógico acompañando el juego. También se volvió mi tesis en FATEC.

Leer case study →

RP.js — Comunidad JavaScript

PROYECTO 2022 AstroJavaScript

La comunidad de JavaScript de Ribeirão Preto, que co-fundé en 2022. Meetups mensuales y presenciales, gratis, abiertos a todos los stacks, para conectar a los devs de la región y dar escenario a quien está empezando.

Case Study

Problema

Ribeirão Preto es del interior, y en el interior los devs aprenden medio aislados, con las buenas comunidades todas en São Paulo. Faltaba un lugar para que quien empieza apareciera, intercambiara ideas y no se sintiera solo.

Decisión Técnica

Co-fundar RP.js con José Guilherme y un equipo de voluntarios. Un meetup mensual, presencial y gratis, con charlas y showcase de proyectos de la comunidad. Yo me encargo del lado técnico, del sitio en Astro al bot de Discord.

Resultado

Una comunidad activa cuyos eventos siempre se llenaban, dando escenario a devs junior y conectando a la gente de tecnología de la ciudad. El próximo paso que quiero es volverla una plataforma open-source de comunidades, construida como proyecto de aprendizaje para juniors mentoreados.

Leer case study →

Portfolio Personal

PROYECTO 2025 AstroPreactTypeScriptTailwind CSS

Este portfolio — construido con Astro, Preact y Tailwind CSS 4. Zero JS por defecto con Preact islands. Dark/light mode como dos personalidades visuales.

Case Study

Problema

Necesitaba un portfolio que mostrara quién soy sin parecer genérico. Frameworks SPA son overkill para contenido esencialmente estático.

Decisión Técnica

Astro para zero JS por defecto + Preact islands solo donde necesario. Tailwind CSS 4 con design tokens. Content Collections para datos. Transición suave entre temas dark/light.

Resultado

Bundle JS mínimo. Lighthouse 100 en todas las métricas. Build en <4s. Dark/light mode sin flicker. Accesibilidad WCAG AA.

Leer case study →

Hablemos.

Abierto a conversaciones, oportunidades e ideas.