Bruno Adão

Systems that outlast the people who wrote them.

Backend engineer. .NET at work, Go and TypeScript at home. Most of what I build outside work is open source and running.

Projects

Everything I've built, newest first. Own projects and client work in one list.

2026 – now Open source, MIT, on npm. Pre-alpha.

eoria

React Native components you copy into your app and own, with a CLI that keeps your copies in step with the registry.

npx @eoria/cli add button input card

Most React Native component kits are shadcn ported to phones: hairline borders, small buttons, web spacing. This one is native-first. Tall full-bleed buttons with a press scale, filled fields, bottom sheets with a grabber. Every component is a slot recipe on Unistyles 3, so theme and breakpoint changes resolve off the JS thread, and six presets each change the whole look rather than just an accent colour.

Copy-paste kits go stale the moment you edit a file. The CLI records a hash of everything it wrote, so a diff command can tell your edits from upstream changes, and an extend command derives a new component from your local base so edits to the base still flow through. The same data serves agents too: every docs page has a Markdown twin, and the CLI exposes the registry over MCP from your machine.

Built with TypeScript, React Native, Expo, Unistyles 3, Reanimated 4, Astro, MCP.

2026 – now Open source, MIT, on npm

create-convex-monorepo

A CLI that generates a workspace where several frontends share one typed Convex backend.

pnpm create convex-monorepo@latest

Convex already generates an API from your backend functions. Sharing it between separately bundled web and native apps should keep the types intact without duplicating backend code. This supplies the pnpm and Turborepo wiring for Next.js, Vite, TanStack Start and Expo, optional Clerk auth, and the checks that keep the boundary honest.

Not being a starter you delete half of. The generator composes framework templates and auth adapters, and records what it chose. The same CLI later adds an app, adds Clerk, syncs env files, or runs a doctor check against that record instead of guessing which directories belong to the project.

Built with TypeScript, Convex, Turborepo, pnpm, Next.js, Vite, TanStack Start, Expo, Clerk.

2026 – now Open source, MIT, on npm. Listed in the Convex components directory. Beta.

convex-cloudflare-email

A Convex component that sends email through Cloudflare's Email Service and keeps track of what happened to it.

The hosted demo for convex-cloudflare-email.

Sending email from a mutation should be one call that survives retries. You enqueue an email, watch its status, and can cancel it before sending starts. Idempotency keys deduplicate repeats. Credentials live in component env, never in queued jobs or database rows.

Making it testable without an account. Test mode runs the whole queue, status and cancel flow locally with mocked Cloudflare responses, and the hosted demo lets you send a simulated email and repeat the request to watch the deduplication work.

Built with TypeScript, Convex, Cloudflare Email Service.

2026 – now Live service

tftstats

Teamfight Tactics stats from high-elo ranked games: comps, units, items and trait breakpoints, per patch.

The tftstats home page with the current patch meta.

Most TFT sites have someone hand-curating the comps. Here nobody does. Comps come out of clustering millions of final boards, so the meta is measured rather than opined. A team builder reads any board and says how matching boards placed, which next unit moves the needle most, and which known comp you are closest to.

Volume under rate limits. A resumable multi-region crawler pulls ranked matches from the Riot API into Postgres, and per-patch aggregation scores everything from there. An AI assistant answers questions from the same data under per-account quotas. The Go services sit behind a TanStack Start BFF, so no credentials or backend URLs reach the browser.

Built with Go, PostgreSQL, React 19, TanStack Start, Tailwind CSS v4, Clerk, OpenAI, Riot Games API.

2026 – now Open source, Apache 2.0

FogosPortugal

A live map of wildfires in Portugal: active incidents, fire-risk forecasts, weather, satellite hotspots and the aircraft fighting them.

The FogosPortugal map with active incidents across Portugal.

Portugal's fire data is spread across ANEPC, ICNF, IPMA and NASA FIRMS, each with its own shape and update cadence. This pulls all of it into one map, non-profit and without ads, and exposes a public GraphQL API so other people can build on it too. It's an independent project that builds on the work of Fogos.pt.

Keeping seven feeds coherent in one incident model. A .NET worker polls each source on its own schedule, MongoDB change streams push updates out, Redis absorbs the read load during a bad afternoon, and the browser only ever talks to the web app, never to the API.

Built with .NET 10, GraphQL, MongoDB, Redis, MinIO, React 19, TanStack Start, MapLibre, deck.gl.

2026 – now Client work at CI&T

Hotel booking platform

The backend of a greenfield .NET microservices platform for hotel and long-stay bookings.

I'm lead developer on the backend sub-team. I built and run the reservations, notifications, properties, file upload and membership services, and the Hot Chocolate Fusion gateway that composes them into one graph, with integrations to MEWS, DocuSign and HubSpot. The architecture is CQRS with a mediator, and I helped draw the service boundaries.

Auth. We evaluated Auth0 and Entra ID first. The customisation we needed cost about as much as building, so I built the account service on ASP.NET Core Identity and we kept full control. I also wrote the internal NuGet packages every service uses for Event Hubs, Service Bus and event contracts, so each service carries less boilerplate and they all behave the same way.

Built with .NET, CQRS, Hot Chocolate Fusion, Azure Container Apps, Event Hubs, Service Bus, Azure SQL, Key Vault, APIM, Managed Redis.

Oct 2025 – Jan 2026

Social housing integration CI&T

The sync layer between two social housing platforms, keeping tenant updates, leaves and related lifecycle events consistent on both sides.

Jul – Sep 2025

Microfrontends platform CI&T

New pages across several microfrontend apps, and the internal npm package that ships the shared UI system to all of them.

Apr 2024 – Jun 2025

Electricity provider CMS and BFF CI&T

The backend for a public electricity provider's website, integrating third-party tariff quote services.

2021 – 2024, tech lead from 2023 Client work at Capgemini

Loan-processing platform

An internal banking platform for loan processing, used by more than 500 employees at once at peak.

A .NET GraphQL BFF over the bank's core banking APIs, feeding a React frontend. I built features on it for two years, then took over as tech lead of a team of two to three engineers and inherited heavy technical debt and a platform that crashed under load.

Stabilising it without pausing feature delivery. Memory leaks, slow database operations and bad page-loading patterns. I rewrote the worst offenders, added caching where it measurably helped, and put monitoring in place so regressions showed up early. Pages went from sluggish to near-instant and the crashes stopped.

Built with .NET, GraphQL, React, Azure DevOps.

2018 – 2021 Client work at Trigénius

Prestashop to Primavera integrator

A commercial integration platform that keeps Prestashop shops and the Primavera BSS ERP in sync, deployed at around twenty B2B customers.

Customers, orders, products, pricing tiers and tax codes synced in both directions. The smallest customer ran 50 to 100 products and about 15 orders a day. The largest ran more than 400 products, over 2 million pricing rules and more than 600 orders a day.

Every customer started as its own fork. I replaced the per-customer, per-version forks with one codebase supporting several Prestashop versions and Primavera V9 and V10 side by side. Onboarding got much shorter. I was the only engineer, so deployment, onboarding, support and pre-sales demos were also mine to do.

Built with .NET, ASP.NET MVC, Prestashop, Primavera BSS.

Client work was at CI&T since 2024, Capgemini from 2021 to 2024, and Trigénius from 2018 to 2021.

Contact

If one of these is useful to you, or broken, tell me.

I tinker outside work, mostly with how things break. Find me here:

© 2026 Bruno Adão. Built with Astro, served from Cloudflare.