Saltar para o conteúdo
Fullstack Developer

João
Bernardo

Fullstack developer from Ribeirão Preto, Brazil. I build APIs, interfaces, and sometimes games.

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

5+
Years of experience
4
Companies
46
Repos on GitHub

About Me

I'm a fullstack developer with 5 years of experience building web applications that make a difference. I've worked at marketing (Authorify, US), B2B e-commerce (Take), and fintech (Verzel) companies. It all started with games. I loved playing them and always wanted to understand how they were made, so I ended up studying Systems Analysis and Development and fell for programming and this whole world of technology. That curiosity to take things apart and see how they work turned into a passion for building complete solutions, from the backend to the final pixel.

I believe good software is invisible: it loads fast, is intuitive, and accessible to everyone. Every line of code I write has a purpose — solving a real problem, not impressing with unnecessary complexity.

My approach combines fullstack vision with attention to detail. I work with React on the frontend and Java/Python/NestJS on the backend, deploying to the cloud with AWS and Docker. Outside of code, I co-founded RP.js — a JavaScript community in Ribeirão Preto — and developed Ribeirão Noir, an investigative game launched at the Book Fair and validated by 3 PhD academics.

Journey

  1. 2025

    Full Stack Developer @ Verzel

    RESTful APIs in Python, Java (Spring Boot), and NestJS for card, helpdesk, and CRM systems. RPA automation with Playwright. React interfaces with Vite.

    PythonJavaNestJSReactOracle
  2. 2023

    Full Stack Developer @ Take

    Microservices for B2B e-commerce with React, Spring Boot, and AWS. Query optimization with 60% performance improvement. Junior dev mentoring and code reviews.

    ReactJavaAWSRabbitMQCypress
  3. 2022

    Full Stack Developer @ Authorify

    Scalable services with NestJS, React, and MongoDB for real estate marketing (US). Legacy React code refactoring (+30% performance). Test coverage >85%.

    NestJSReactMongoDBJestCypress
  4. 2021

    Full Stack Developer Trainee @ Target Sistemas

    Enterprise system with Kanban, route tracking (Google Maps API), and automated PDF/Excel reports. Angular interfaces with RxJS. Adobe XD plugin. Flutter mobile app.

    AngularTypeScriptFlutterExpress

Projects

PROJECT 2026 GoSQLitePostgreSQLReact 19DockerPrometheus

Uptime monitoring in Go that fits in one binary and shows latency next to state. The UI is embedded in the executable, so there's no nginx alongside it and no static folder to drift out of sync. A personal project of mine, open source under AGPL-3.0.

Case Study

Problem

Almost every incident starts with a service getting slow, not going down, and a monitor that only knows up or down arrives late to that story. Most options also want an nginx alongside and a folder of static files, which makes the monitor more machinery to maintain than the service it watches.

Technical Decision

One binary, with the UI embedded via go:embed. Pluggable storage across SQLite and PostgreSQL, with the same conformance battery running identically on both so pluggable database doesn't become a facade. Raw beats roll up into hourly and daily aggregates, and percentiles always come from the raw data, never a percentile of percentiles. An independent probe separates the target going down from the network going down, and it only earns the power to silence an alert after proving it works, because a probe blocked by a firewall would mute everything forever.

Result

27 thousand lines of Go, 12 thousand of them tests, across 651 test functions. The only surface without credentials, the public status page, takes a battery of intrusion tests with path traversal, injection in the slug, and a forged Host header. Image on GHCR, project site live, AGPL-3.0.

Read case study →
PROJECT 2026 TypeScriptNode 24Azure DevOpsDockerVitest

Feeds Gather's Smart Objects with your actual work. A PR waiting on you, a red pipeline, a task in progress, a meeting about to start, all on your desk in the virtual office. A personal project of mine, open source under MIT.

Case Study

Problem

Knowing what was waiting on me meant opening four tools, and none of them talked to each other. Meanwhile my desk in the virtual office sat there as decoration, when it could be the dashboard.

Technical Decision

Ports and adapters end to end, with a core that knows nothing about Azure DevOps, Google, Microsoft, or Gather itself. Sources report facts and surfaces decide presentation, so Google and Outlook emit the same signal and the second calendar provider costs nothing. Gather's rate limit is per space, not per object, so the dispatcher compares against the last state it sent and pushes only the difference.

Result

130 test cases, with the surfaces written as pure functions and tested without a network. A minute with no news costs zero requests. The image adds about 1 MB on top of node:24-alpine, capped at 128 MB of memory, because a monitor that gets in the way of the machine it monitors has failed at its job.

Read case study →

Instanta

PROJECT 2026 HonoCloudflare WorkersD1DrizzleReact 19TypeScript

A collaborative per-event photo feed, with a live wall and a big-screen mode for the venue. A solo personal project, edge-native on Cloudflare (Workers, D1, R2, Durable Objects), with a security and architecture posture more serious than a party app would ask for.

Case Study

Problem

Every event scatters its photos across dozens of phones and chat groups, and there's never one shared, living album. I wanted something instant, mobile-first, that works even on a venue's flaky wi-fi.

Technical Decision

Genuinely edge-native. Hono in a Cloudflare Worker, D1 (SQLite at the edge) via Drizzle, R2 for photos and a Durable Object for rate limiting, with the front end (React 19 + TanStack Router) and API shipping together in a single deploy. The business logic lives in a pure layer, isolated from the framework by an ESLint rule, testable without spinning anything up. Security well beyond what a party app needs, with 2FA, login anti-enumeration, and session handling that detects a stolen token.

Result

The integration tests run on workerd, the real Workers runtime, with actual D1, R2, and Durable Object, plus accessibility with axe-core in Playwright. Today it ships to a workers.dev address. It's a personal project under construction, not yet launched.

Read case study →

ADG — Arena Draft Guide

CONTRIB 2026 Docker SwarmTraefikPortainerGrafanaTauriRustExpressPostgreSQL

Stats tracker for League of Legends (Arena and ARAM: Mayhem) and Valorant among a friend group, with rankings and achievements. I contributed the self-hosted production infrastructure and the companion app that captures data Riot's public API doesn't expose.

Case Study

Problem

Riot doesn't expose ARAM: Mayhem data (queue 2400) in its public API — so ranking that mode's matches was impossible, and it was exactly what the group played most. In parallel, the project needed to move off expensive managed services onto reliable, observable, cheap production infrastructure.

Technical Decision

I tackled it on two fronts. (1) A Tauri + Rust desktop companion that reads the local Riot client (LCU and LiveClient APIs) to capture the Mayhem matches the public API hides, with an offline outbox pattern for reliable delivery and credentials stored in Windows Credential Manager. (2) Self-hosted infrastructure on Oracle Cloud Free Tier (an always-free ARM VM) orchestrated with Docker Swarm: an Express API scaled to 2 replicas with zero-downtime rolling updates, Postgres 16, Traefik handling ingress with automatic TLS (Let's Encrypt), GitOps deploys via Portainer (compose read straight from Git, redeploy triggered by webhook), and full observability with Grafana + Loki + Prometheus. Backups every 6h to two remote destinations, as insurance against losing the account.

Result

Continuous, zero-downtime deploys: a push to main builds the arm64 image on GHCR and triggers an automatic redeploy. Grafana dashboards for API, Postgres, and infra, with alerts on service health. Server cost: zero, on Oracle's Free Tier. And the headline: ARAM: Mayhem data — invisible through the public API — is now captured and ranked.

Read case study →
CONTRIB 2026 TauriRustReactTypeScriptxterm.js

An open-source desktop workspace for running and resuming multiple coding agents and real terminals in parallel, created by Kauã (Kc1t). I use it every day and contributed back with PRs and issues, from a TUI scroll fix to an in-app auto-update.

Case Study

Problem

Using Alethe heavily day to day, I ran into real things. Memory climbing from orphaned PTY processes, the mouse scroll dead inside TUIs, and having to go to GitHub by hand to learn about a new version.

Technical Decision

I reported the bugs with root-cause analysis and sent three merged PRs. The alternate-buffer scroll fix (with tests), splitting the terminal lifecycle (pause, kill, delete), and an end-to-end in-app auto-update with the Tauri 2 plugin.

Result

Three contributions live in a project that's Kauã's, my coworker and friend. It's not my app, it's a focused contribution, but each one made me understand terminals, PTY, and Tauri better. There's still an open issue of mine I want to build.

Read case study →

Ribeirão Noir

PROJECT 2025 Godot 4GDScriptSOLIDDesign Patterns

Noir investigative game in 1950s Ribeirão Preto, Brazil, starring Dandara, built as a tool for antiracist education. Developed in Godot (GDScript) with a SOLID architecture and a data-driven narrative. Validated by three PhD academics and launched at the Book Fair.

Case Study

Problem

Turn Afro-Brazilian history and culture into an engaging experience for young people, helping schools meet laws 10.639 and 11.645. The engineering challenge was shipping a complete narrative RPG in Godot, in six months.

Technical Decision

A data-driven narrative in JSON, run by a custom engine, with a dice, stance and risk system, and a save that rebuilds the whole playthrough. SOLID architecture, with SRP by delegation, Observer via signals, and composition over inheritance. Nine Ribeirão locations, 3 professions, and 4 stances.

Result

Launched at the International Book Fair, free, on itch.io. Validated by three PhD academics (USP, Metodista, UFTM) and mapped to the 9th-grade BNCC, with a teaching booklet alongside the game. It also became my thesis at FATEC.

Read case study →

RP.js — JavaScript Community

PROJECT 2022 AstroJavaScript

The JavaScript community of Ribeirão Preto, which I co-founded in 2022. Free monthly in-person meetups, open to every stack, to connect the region's devs and give a stage to people just starting out.

Case Study

Problem

Ribeirão Preto is an inland city, and inland the devs learn a bit isolated, with the good communities all in São Paulo. There was no place for beginners to show up, trade ideas, and not feel alone.

Technical Decision

Co-found RP.js with José Guilherme and a team of volunteers. A monthly, in-person, free meetup, with talks and a showcase of community projects. I handle the technical side, from the Astro site to the Discord bot.

Result

An active community whose events always filled up, giving junior devs a stage and connecting the city's tech crowd. The next step I want is turning it into an open-source community platform, built as a learning project for mentored juniors.

Read case study →

Personal Portfolio

PROJECT 2025 AstroPreactTypeScriptTailwind CSS

This portfolio — built with Astro, Preact, and Tailwind CSS 4. Zero JS by default with Preact islands. Dark/light mode as two visual personalities.

Case Study

Problem

Needed a portfolio that shows who I am without looking generic. SPA frameworks are overkill for essentially static content.

Technical Decision

Astro for zero JS by default + Preact islands only where needed. Tailwind CSS 4 with design tokens. Content Collections for data. Smooth dark/light theme transitions.

Result

Minimal JS bundle. Lighthouse 100 across all metrics. Build under 4s. Dark/light mode with zero flicker. WCAG AA accessibility.

Read case study →

Say hello.

Open to conversations, opportunities, and ideas.