São Paulo, Brazil · remote Available

Bruno Silva

Full stack software engineerFounder of BC Consultoria e Desenvolvimento de Softwares

Focus TypeScript · Node.js · Go · React · React Native · C# / .NET · PostgreSQL · Applied AI · RAG

Show me a problem. I’ll deliver the system that solves it.

By the numbers

  • 4+years building and running software
  • 4products in production end to end
  • 12integrations delivered: ERP, SEFAZ, gateways, crawlers and APIs
  • 1 mi+records processed per month
See how each one was built

01

Four systems the business relies on every day.

All case studies

Tax and ERPFashion retail chains on Linx ERP · head office and branches · 2024 — 2026

Steuer

Invoices that arrive on their own and land reconciled in Linx.

A multi-company tax platform that captures every NF-e, CT-e and NFS-e issued against the client’s company IDs, keeps XML and PDF ready to look up and posts the reconciled entry straight into the Linx ERP database, inside the store’s own network. The tax team stops re-keying invoices and only handles the exceptions the system flags.

12kinvoices processed per month
90%of Linx entries with no manual keying
42Linx tables integrated by the gateway

What I delivered

  1. Resumable capture
  2. Automatic Linx entry
  3. Steuer Connector

Stack: Bun · Fastify · TypeScript · Zod · Prisma · MySQL +12

Read the case study

02

What holds every delivery together.

  1. Integrations

    I connect systems that were never meant to talk: invoices from PlugStorage and PlugNotas into an on-premise Linx, PPE checked against the CA-EPI registry, hundreds of thousands of companies in Elasticsearch. Always with retries and traceability.

    Linx · PlugStorage · PlugNotas · CA-EPI · Elasticsearch

    Applied in01 Steuer02 Kippis03 LeadSpector

  2. Automation

    Manual routines become processes that run on their own: RabbitMQ queues and n8n flows for tax work, schedulers sweeping deadlines every night, a dunning flow that retries at 0, 3 and 7 days with emails queued on BullMQ, crawlers at their own pace. The team only handles the exceptions.

    RabbitMQ · n8n · Cron · BullMQ · Go · Rod

    Applied in01 Steuer02 Kippis03 LeadSpector04 GymOS

  3. Distributed systems

    Independent stages, so a failure stays where it happened. State persisted before queueing, tenant scoped at the session, a Neo4j graph for context and an index for search. It grows without a rewrite.

    Bun · Fastify · Go · Neo4j · PostgreSQL · MySQL

    Applied in01 Steuer02 Kippis03 LeadSpector

  4. Security

    Security goes into the design, not the end. End-to-end RBAC across a Go API, a React dashboard and a mobile app, five roles scoped per location at the gym, session-scoped multi-tenancy and a WireGuard tunnel to the client’s ERP without opening a port to the internet.

    RBAC · WireGuard · SecureStore · Multi-tenant

    Applied in01 Steuer02 Kippis04 GymOS

  5. Operations

    Shipping is half the job; keeping it running is the other half. CI/CD with Docker and GitHub Actions, an MSI installer (WiX) that brings the connector up on the client’s server in minutes, the gym deployed on Docker with its staff trained, and follow-up until the system is predictable.

    Docker · GitHub Actions · .NET · WiX

    Applied in01 Steuer02 Kippis04 GymOS

03

From problem to product.

  1. Understand the problem

    I start with the real operation and the people living the problem: where time is lost, where errors start, what cannot stop.

  2. Design the solution

    I pick architecture and stack for the problem, not the trend, and make clear what comes first and why.

  3. Build

    I ship in slices that already work, with reviewable code, tests and CI/CD from day one.

  4. Go live

    I deploy, migrate the data, document and train the people who will use it, without stopping what already runs.

  5. Grow it together

    I follow the numbers after launch and tune with real data until the system is predictable.

It can be an ERP nobody wants to touch or an idea that still fits on a napkin: I dive in end to end and deliver a viable product that works and that people enjoy using.

Talk about your idea

04

From technical support to full stack.

I started in technical support and programming at an access-control manufacturer, solving customer problems on the front line. That operations mindset came with me into engineering: today I design and ship tax, workplace safety, gym management and applied AI systems for companies and direct clients.

  1. Apr 2024 — Aug 2026

    Full Stack Developer

    Valiant Group · São Paulo, Brazil

    Software house and tech consultancy building web, mobile and integration systems for clients across industries.

    • Lead developer of a tax integration middleware in TypeScript (Bun/Fastify), covering data sync with third-party ERPs and electronic invoice processing.
    • Backend and frontend of an AI prospecting platform: Node.js/Fastify, React, search with Elasticsearch and semantic search/RAG with LangChain and Neo4j.
    • End-to-end RBAC on a corporate platform (Go, React, React Native), a Windows connectivity agent in C#/.NET and standardized CI/CD with Docker and GitHub Actions across multiple microservices.
  2. Jun 2021 — Apr 2024

    Technical Support and Programming Analyst

    Control ID · São Paulo, Brazil

    Manufacturer of access control, identification and automation equipment.

    • Hybrid role across technical support and programming, helping customers and internal teams with diagnostics, fixes, automations and scripts to speed up operational routines.
    • Escalation point for complex technical issues in access control devices and systems, working directly with customers.
    • Led internal training for analysts and external training for company customers, translating technical needs into clear procedures.
  3. 2021 — 2024 · Completed

    Bachelor's Degree in Computer Science

    Cruzeiro do Sul University

    Education

05

Independent projects.

What I build on my own, out of challenge and curiosity: a game for my friends, tooling for AI agents and utilities my Windows was missing.

Multiplayer game

TrioOnline

A real-time card game for my friends, built so nobody can peek.

36
cards in a seed-shuffled deck
20
ticks per second in the state machine

Stack: TypeScript · Colyseus · Next.js · Zustand · Prisma · PostgreSQL · Redis · Turborepo · Kubernetes

Status: Played among friends

GitHub
Under the hood: TrioOnline

I built it to play with friends and ended up treating it like a real engine. When the rivalry is between friends, nobody gets to win through a bug, lag or an open DevTools tab.

What I set out to solve

  1. Matches that replay byte for byte

    I banned Math.random() and Date.now() from the core. The 36-card deck is shuffled with Fisher-Yates over a server-seeded Park-Miller generator, time runs in ticks and every action becomes an immutable event: replaying the log on an empty engine yields the same state.

  2. The client never knows what it can’t see

    A face-down card travels with a null value; the number leaves the server only in the patch that reveals it. The seed never leaves the server, and every command carries a sequence number, so a packet replayed from another turn is dropped.

  3. One queue per room

    Two clicks at the same instant never become a race condition: every command enters a FIFO queue in the Colyseus room and runs one at a time, with the state machine checking the phase before applying it.

Tooling for AI agents

Agents Hub

One AI agent asks another for a review, with budget, isolation and a trail.

9
agent CLIs under one model
16
MCP tools for one agent to call another

Stack: TypeScript · Node.js · SQLite · MCP · HTTP + SSE · git worktrees

Status: Phases 1 and 2 running

GitHub
Under the hood: Agents Hub

I wanted Claude Code to ask Codex to review its own work without me copying context by hand. It became a daemon that reduces nine agent CLIs to one model of session, event, policy and budget.

What I set out to solve

  1. Nine dialects, one envelope

    Each CLI has an adapter that normalizes its output into a single EventEnvelope, and a new agent joins through a YAML manifest, no code. The Hub also exposes itself as an MCP server with 16 tools: the agent itself delegates, waits for the result and reads the other’s diff.

  2. Delegating never escalates privilege

    A child’s policy is the intersection with its parent’s, the budget belongs to the whole flow and is charged at the root, and a depth cap with semantic cycle detection keeps delegation from turning into an expensive loop. Each session runs in its own git worktree.

  3. The gate comes before the command

    With Claude Code and Codex, the agent asks the Hub before running a tool. Compound commands are classified per segment, so git status && git push counts as a push, and a cloned repository’s config only applies after I trust its content hash.

Automation

EscutaPromo

Listens to a radio station all day and alerts my friends when a giveaway opens.

15 s
per transcription window
< 30 s
from on-air call to group alert

Stack: Python · FFmpeg · whisper.cpp · RapidFuzz · SQLite · Telegram Bot API · Docker

Status: Used among friends

Under the hood: EscutaPromo

I missed a big radio station’s giveaway because I was in a meeting and decided nobody in the group would miss one again. I wrote a listener that never sleeps, understands what the host says and enters for us.

What I set out to solve

  1. Live transcription without the cloud

    FFmpeg captures the stream in overlapping 15-second windows, so no sentence gets cut in half, and whisper.cpp transcribes everything on the machine itself. No audio leaves the house.

  2. Finding the giveaway mid-sentence

    Hosts don’t read from a script. I combined fuzzy matching on trigger phrases with a context check, and the alert only fires when the call to action and the keyword land in the same window; that removed the false positives from ads.

  3. Entering for everyone, politely

    Each friend has their own queue with the data they agreed to share. Entries go out spaced, with retry and backoff, and the group gets the audio clip that triggered the alert on Telegram.

Desktop agent

ControlPC

An AI agent for Windows that denies by default and asks before every step.

18
Rust crates, from policy to audit
312
passing Rust tests

Stack: Rust · Tauri 2 · React · TypeScript · UI Automation · SQLCipher · Ollama

Status: Pre-alpha

Under the hood: ControlPC

I wanted to see how far a model can operate a PC without handing over the house keys. The answer was to flip the problem: nothing runs without going through policy, risk, approval and audit.

What I set out to solve

  1. Single-use capabilities

    Each plan step gets a capability consumed before the executor runs. Approval resumes that exact step, and the session time-box, from 1 to 1,440 minutes, revokes everything and discards the paused plan when it expires.

  2. Click the control, not the pixel

    Clicks and typing go through UI Automation (Invoke and Value) on a structured target, revalidated against TOCTOU right before acting. Whatever is on screen stays isolated from the authority prompt and is redacted before storage.

  3. A vault that fails closed

    Sessions, approvals and audit live in SQLCipher, with a 256-bit key in the Windows Credential Manager. If the key can’t open the database, the app stops instead of falling back to an unsafe mode.

More experiments

  • SoundIntSpotify in the headphones, the browser on the speakers: audio output per app.C++17 · Win32 · Direct2D

    Windows lets you pick one audio output at a time, and I wanted one per app without opening the mixer every time.

    What I set out to solve

    1. An API Windows doesn’t document

      Routing uses the internal AudioPolicyConfig interface, activated through RoGetActivationFactory with two vtable variants depending on the build. If it fails, only routing stops; the rest of the app keeps going.

    2. Genuinely light

      A single C++17, Win32 and Direct2D executable with a static CRT and no service. Devices and sessions arrive as events (IMMNotificationClient), no polling.

    Windows utility

    Stack: C++17 · Win32 · Direct2D · Core Audio · CMake · Inno Setup

    Status: Public release

    GitHub
  • SplitDeckReal windows from any app grouped into one, as panes or tabs.C# · .NET 10 · WPF

    Three terminals side by side were still three windows to move and minimize. I wanted them to become one without stopping being the same processes.

    What I set out to solve

    1. Embed or dock

      Classic apps become children of the pane; those that draw with the GPU or own their title bar stay independent and are kept exactly on top of it. The choice is automatic per executable and remembered when I override it.

    2. No code injection

      Only public window APIs and out-of-context event hooks. On an unexpected error, every window goes back to the desktop as it was.

    Windows utility

    Stack: C# · .NET 10 · WPF · Win32

    Status: Public release

    GitHub
  • DualAudioMirrorThe same audio on two or more Windows outputs at once, in sync.C# · .NET 8 · WPF

    I wanted the video on the TV and the sound on the office speaker too, with no extra cable and no switching the default device all the time.

    What I set out to solve

    1. One buffer, many outputs

      In synced mode a virtual cable becomes the source and every device plays from the same buffer, with a per-device delay from 0 to 400 ms.

    2. Drift in plain sight

      Live diagnostics show captured KB/s, buffer size, underruns, overflows and every drift correction.

    Windows utility

    Stack: C# · .NET 8 · WPF · NAudio · WASAPI

    Status: Public release

    GitHub
  • GamesHubSteam, Epic, Riot and Hydra in one library, from an executable under 1 MB.C# · .NET Framework 4.8 · WebView2

    I got tired of opening four launchers to pick a game, so I built a library that imports everything on its own, artwork included.

    What I set out to solve

    1. Web UI, native shell

      WinForms with WebView2 and a custom bridge between C# and JavaScript, under a CSP. It runs on the .NET Framework 4.8 that ships with Windows, without a single NuGet package.

    2. A gamepad that stays out of the way

      Keyboard and gamepad drive the whole UI and Big Picture mode, but the gamepad only acts while the window has focus.

    Windows app

    Stack: C# · .NET Framework 4.8 · WebView2 · JavaScript

    Status: Public release

    GitHub
  • AtlasA local project manager in C17 and WebView2, with live logs per stack.C17 · WebView2 · SQLite

    I want to see my whole portfolio, run scripts and containers and read each project’s docs in one place, without paying for an Electron runtime.

    What I set out to solve

    1. Specify before writing

      Nineteen specification documents and a plan of 160 atomic deliveries before the first line of C.

    2. Detecting the stack on its own

      Each folder is inspected to figure out its stack and the commands that make sense to run there.

    Developer tool

    Stack: C17 · WebView2 · SQLite · CMake

    Status: Specification approved

  • TrackWorkProject management and engineering team tracking, with Next.js and Go.Next.js · TypeScript · Go

    A lab for putting project management, engineering observability and AI into a single product.

    What I set out to solve

    1. Two languages, one contract

      Next.js handles the UI, authentication and RBAC; a Go service on Fiber receives webhooks and runs the AI engine.

    2. Migrations with a single source

      PostgreSQL migrations live in one canonical folder kept apart from both services’ code.

    Web platform

    Stack: Next.js · TypeScript · Go · Fiber · PostgreSQL · Docker

    Status: In development

06

Contact

What’s the next system your business needs?

Tell me the context: a problem, an idea or a system that needs to evolve. I’ll reply with a clear technical path and the first step to get it built.