Saltar para o conteúdo
Fullstack Developer

João
Bernardo

Fullstack developer em Ribeirão Preto. Construo APIs, interfaces e às vezes jogos.

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

5+
Anos de experiência
4
Empresas
42
Repos no GitHub

Sobre Mim

Sou um developer fullstack com 5 anos de experiência construindo aplicações web que fazem a diferença. Já passei por empresas de marketing (Authorify, EUA), e-commerce B2B (Take) e fintech (Verzel). Tudo começou pelos games. Eu amava jogar e sempre quis entender como eram feitos, então fui parar em Análise e Desenvolvimento de Sistemas e me apaixonei pela programação e por esse mundo da tecnologia. Aquela curiosidade de desmontar as coisas pra ver como funcionam virou paixão por criar soluções completas, do backend ao pixel final.

Acredito que bom software é invisível: carrega rápido, é intuitivo e acessível a todos. Cada linha de código que escrevo tem um propósito — resolver um problema real, não impressionar com complexidade desnecessária.

A minha abordagem combina visão fullstack com atenção ao detalhe. Trabalho com React no frontend e Java/Python/NestJS no backend, deploy em cloud com AWS e Docker. Fora do código, co-fundei a RP.js — comunidade JavaScript de Ribeirão Preto — e desenvolvi o Ribeirão Noir, um jogo investigativo lançado na Feira do Livro e validado por 3 doutores.

Percurso

  1. 2025

    Full Stack Developer @ Verzel

    APIs RESTful em Python, Java (Spring Boot) e NestJS para sistemas de cartões, SAC e CRM. Automação RPA com Playwright. Interfaces React com Vite.

    PythonJavaNestJSReactOracle
  2. 2023

    Full Stack Developer @ Take

    Microsserviços para e-commerce B2B com React, Spring Boot e AWS. Otimização de queries com melhoria de 60% em performance. Mentoria de devs júnior e code reviews.

    ReactJavaAWSRabbitMQCypress
  3. 2022

    Full Stack Developer @ Authorify

    Serviços escaláveis com NestJS, React e MongoDB para marketing imobiliário (EUA). Refatoração de código legado React (+30% performance). Cobertura de testes >85%.

    NestJSReactMongoDBJestCypress
  4. 2021

    Full Stack Developer Trainee @ Target Sistemas

    Sistema empresarial com Kanban, rastreamento de rotas (Google Maps API) e relatórios automáticos PDF/Excel. Interfaces Angular com RxJS. Plugin Adobe XD. App mobile Flutter.

    AngularTypeScriptFlutterExpress

Projetos

Instanta

PROJETO 2026 HonoCloudflare WorkersD1DrizzleReact 19TypeScript

Feed colaborativo de fotos por evento, com mural ao vivo e telão no salão. Projeto pessoal, solo, edge-native na Cloudflare (Workers, D1, R2, Durable Objects), com uma pegada de segurança e arquitetura mais séria do que um app de festa pediria.

Case Study

Problema

Todo evento espalha as fotos por dezenas de celulares e grupos de mensagem, e nunca existe um álbum único, vivo e compartilhado. Eu queria algo instantâneo, mobile-first, que funcionasse até com o wi-fi ruim de um salão de festa.

Decisão Técnica

Arquitetura edge-native de verdade. Hono num Cloudflare Worker, D1 (SQLite no edge) via Drizzle, R2 pras fotos e Durable Object pro rate limit, com front (React 19 + TanStack Router) e API subindo juntos num deploy só. A regra de negócio fica numa camada pura, isolada do framework por uma regra de ESLint, testável sem subir nada. Segurança bem além do que um app de festa pede, com 2FA, anti-enumeração no login e um controle de sessão que detecta token roubado.

Resultado

Os testes de integração rodam no workerd, o runtime real dos Workers, com D1, R2 e Durable Object de verdade, mais acessibilidade com axe-core no Playwright. Hoje sobe num endereço workers.dev. É projeto pessoal em construção, ainda não lançado.

Ler case study →

ADG — Arena Draft Guide

CONTRIB 2026 Docker SwarmTraefikPortainerGrafanaTauriRustExpressPostgreSQL

Tracker de estatísticas de League of Legends (Arena e ARAM: Mayhem) e Valorant para uma turma de amigos, com rankings e conquistas. Contribuí com a infraestrutura de produção self-hosted e com o app companion que captura dados que a API pública da Riot não expõe.

Case Study

Problema

A Riot não expõe os dados de ARAM: Mayhem (fila 2400) na API pública — logo, era impossível ranquear as partidas desse modo, justo o que a turma mais jogava. Em paralelo, o projeto precisava sair de serviços gerenciados caros e ganhar uma infra de produção confiável, observável e barata.

Decisão Técnica

Ataquei por duas frentes. (1) Um companion desktop em Tauri + Rust que lê o cliente local da Riot (APIs LCU e LiveClient) para capturar as partidas de Mayhem que a API pública esconde, com padrão outbox offline para entrega confiável e credenciais guardadas no Windows Credential Manager. (2) Uma infra self-hosted no Oracle Cloud Free Tier (VM ARM sempre-gratuita) orquestrada com Docker Swarm: API Express em 2 réplicas com rolling update sem downtime, Postgres 16, Traefik cuidando do ingress com TLS automático (Let's Encrypt), deploy GitOps via Portainer (o compose é lido direto do Git e o redeploy dispara por webhook) e observabilidade completa com Grafana + Loki + Prometheus. Backups a cada 6h para dois destinos remotos, como seguro contra perda da conta.

Resultado

Deploy contínuo com zero downtime: push na main constrói a imagem arm64 no GHCR e dispara o redeploy automático. Dashboards de API, Postgres e infra no Grafana, com alertas sobre a saúde do serviço. Custo de servidor: zero, no Free Tier da Oracle. E o principal: os dados de ARAM: Mayhem — invisíveis pela API pública — passaram a ser capturados e ranqueados.

Ler case study →
CONTRIB 2026 TauriRustReactTypeScriptxterm.js

Workspace desktop open-source pra rodar e retomar vários agentes de código e terminais em paralelo, criado pelo Kauã (Kc1t). Eu uso todo dia e contribuí de volta com PRs e issues, do fix de scroll em TUIs ao auto-update in-app.

Case Study

Problema

Usando o Alethe pesado no dia a dia, esbarrei em coisas reais. A memória subindo por processos de PTY órfãos, o scroll do mouse morto dentro de TUIs, e ter que ir no GitHub na mão pra saber de versão nova.

Decisão Técnica

Reportei os bugs com causa-raiz e mandei três PRs merged. O fix de scroll em buffer alternativo (com testes), a separação do ciclo de vida do terminal (pausar, matar, apagar) e o auto-update in-app com o plugin do Tauri 2, de ponta a ponta.

Resultado

Três contribuições no ar num projeto que é do Kauã, meu colega e amigo. Não é meu app, é uma contribuição focada, mas cada uma me fez entender melhor terminal, PTY e Tauri. Ainda tem uma issue minha aberta que eu quero construir.

Ler case study →

Ribeirão Noir

PROJETO 2025 Godot 4GDScriptSOLIDDesign Patterns

Jogo investigativo noir nos anos 1950 de Ribeirão Preto, protagonizado por Dandara, como ferramenta de educação antirracista. Desenvolvido em Godot (GDScript) com arquitetura SOLID e narrativa orientada a dados. Validado por três doutores e lançado na Feira do Livro.

Case Study

Problema

Transformar história e cultura afro-brasileira em experiência envolvente para jovens, ajudando a cumprir as leis 10.639 e 11.645. O desafio de engenharia era entregar um RPG narrativo completo em Godot, em seis meses.

Decisão Técnica

Narrativa orientada a dados em JSON, interpretada por um motor próprio, com sistema de dado, postura e risco, e um save que reconstrói a partida inteira. Arquitetura SOLID, com SRP por delegação, Observer via signals e composição sobre herança. Nove locais de Ribeirão, 3 profissões e 4 posturas.

Resultado

Lançado na Feira Internacional do Livro, gratuito, no itch.io. Validado por três doutores (USP, Metodista, UFTM) e mapeado à BNCC do 9º ano, com material pedagógico acompanhando o jogo. Virou também meu TCC na FATEC.

Ler case study →

RP.js — Comunidade JavaScript

PROJETO 2022 AstroJavaScript

Comunidade de JavaScript de Ribeirão Preto, que co-fundei em 2022. Meetups mensais e presenciais, de graça, abertos a todas as stacks, pra conectar os devs da região e dar palco pra quem está começando.

Case Study

Problema

Ribeirão Preto é do interior, e do interior os devs aprendem meio isolados, com as comunidades boas todas em São Paulo. Faltava um lugar pra quem está começando aparecer, trocar ideia e não se sentir sozinho.

Decisão Técnica

Co-fundar o RP.js com o José Guilherme e uma equipe de voluntários. Meetup mensal, presencial e de graça, com palestras e showcase de projetos da comunidade. Eu cuido do lado técnico, do site em Astro ao bot do Discord.

Resultado

Uma comunidade ativa que sempre lotava os eventos, dando palco pra devs juniores e conectando a galera de tecnologia da cidade. O próximo passo que eu quero é virar uma plataforma open-source de comunidades, construída como projeto de aprendizado pra juniores mentorados.

Ler case study →

Portfolio Pessoal

PROJETO 2025 AstroPreactTypeScriptTailwind CSS

Este portfolio — construído com Astro, Preact e Tailwind CSS 4. Zero JS by default com Preact islands. Dark/light mode como duas personalidades visuais.

Case Study

Problema

Precisava de um portfolio que mostrasse quem sou sem parecer genérico. Frameworks SPA são overkill para conteúdo essencialmente estático.

Decisão Técnica

Astro para zero JS by default + Preact islands apenas onde necessário. Tailwind CSS 4 com design tokens. Content Collections para dados. Temas dark/light com transição suave.

Resultado

Bundle JS mínimo. Lighthouse 100 em todas as métricas. Build em <4s. Dark/light mode sem flicker. Acessibilidade WCAG AA.

Ler case study →

Fala comigo.

Aberto a conversas, oportunidades e ideias.