Full-stack and AI engineer, schema to screen.

I'm Pedro. I design, build and run production systems end to end: multi-tenant SaaS, mobile apps, internal systems and AI agents. I was the only engineer behind a multi-tenant CRM in daily use, and my code is merged into Supabase, Kestra and QuestDB.

Code merged intoSupabaseKestraQuestDB
  • TypeScript, React, Node.js, Python, PostgreSQL
  • Viçosa, Brazil (UTC−3)
  • English and Portuguese
Multi-tenant SaaS

A CRM I built alone, from schema to screen

Multi-tenant CRM in React, TypeScript and Supabase: Postgres row-level security per tenant, Edge Functions, a WhatsApp Cloud API inbox, a Kanban pipeline and dashboards. One engineer, the whole stack, paying customers.

70% less timeto analyze a lead, measured over the first 60 days
ReactTypeScriptPostgreSQL RLSEdge Functions
Mobile

A Flutter app and the API behind it

A fitness app live in the stores, with the backend that runs it: authentication, user data, notifications and the API the app talks to.

33+ endpointsin the API behind an app that is live in the stores
FlutterDartNode.jsREST
Internal product

An agency's internal app

I built and run the system Núcleo de Performance works in: each person signs in and sees only the sections opened to them, each client opens only its own SEO report, a vault keeps passwords encrypted in the browser, and sensors alert on Telegram when a flow stops.

13 apps into 1SEO reports for 13 clients, once a separate app per client, now one portal
Next.jsSupabasePostgreSQL RLSWeb Crypto
AI in production

AI agents with rules, tools and a metric

Agents that qualify, answer, summarize and hand off to people inside business rules, wired into the CRM, with limits on what they may say and a number that shows whether they paid off.

4x more meetingsbooked than the human SDR on the same funnel, at a premium services company with international operations
ClaudeOpenAIGeminiEmbeddings
Integrations and conversions

Integrations that never fire twice or fail silently

A lead from an ad arrives by webhook and passes an idempotency key before any side effect. When the sale closes in the CRM, it goes back to Meta and Google Ads as a conversion.

2 to 71 msbetween duplicate Meta deliveries I had to deduplicate in production
WebhooksQueuesConversions APIGoogle Ads API
Security and sign-in

Sign-in approved, owner checked on every route

At Starhash (Next.js, Express, MongoDB) I built sign-in with Google and YouTube, TikTok and Instagram, each approved in that platform's review, plus sessions on rotating refresh tokens. In the security audit I put an ownership check on every authenticated route and hardened SSRF and JWT handling.

153 routeswith auth audited, every one checking ownership, and an automated guard that blocks a new route without it
Next.jsExpressMongoDBOAuth 2.0

Code that other teams merged

Most of my work is closed-source client code. This part anyone can audit: bug fixes, features and docs that the maintainers of Supabase, Kestra and QuestDB reviewed and merged. The two client fixes below started as bugs I hit in production.

From the GitHub API, updated hourly
20merged pull requests
3organizations
11in review now
Supabase logo
Supabase115k GitHub stars
3 merged
Kestra logo
Kestra30k GitHub stars
13 merged
QuestDB logo
QuestDB18k GitHub stars
4 merged
Also in review atCal.comInfisicalFuture AGI
Before
After

All merged pull requests

supabase/supabase-js #2516fix(realtime): encode broadcast header fields as UTF-8Mergedsupabase/supabase-js #2515fix(functions): match response Content-Type case-insensitivelyMergedsupabase/supabase #47707docs: note Apple Services ID must be first in Client IDs for web sign-inMergedquestdb/nodejs-questdb-client #63feat: accept BigInt values in intColumn()Mergedquestdb/documentation #484docs: document Parquet and CSV download options in the Result GridMergedquestdb/documentation #483docs: document query.timeout duration key alongside query.timeout.secMergedquestdb/documentation #482docs: cover TTL on materialized views in the TTL concept pageMergedkestra-io/plugin-digitalocean #46feat(reservedip): add Reserved IP assign and unassign tasksMergedkestra-io/plugin-digitalocean #45feat(app): add App Platform deployment tasksMergedkestra-io/plugin-digitalocean #44refactor(security): rename CreateSuppression total to suppressionsTotalMergedkestra-io/plugin-digitalocean #43feat(security): add security settings, suppression and scan rule tasksMergedkestra-io/plugin-digitalocean #42fix(list): report the stored row count as size with STOREMergedkestra-io/kestra #20948fix(executions): memory-bounded execution log downloadMergedkestra-io/plugin-digitalocean #36feat(cdn): add CDN endpoint tasks and cache purgeMergedkestra-io/plugin-digitalocean #31feat(security): add security scan and affected resources tasksMergedkestra-io/plugin-digitalocean #25feat(spaces): add Spaces access key List, Get, Create and Delete tasksMergedkestra-io/plugin-digitalocean #23feat(volume): add Resize, GetAction and ListActions tasksMergedkestra-io/plugin-digitalocean #18feat(billing): add balance, billing history and invoice tasksMergedkestra-io/blueprints #549feat: add Meta Conversions API CRM conversion leads blueprintMergedkestra-io/plugin-digitalocean #17feat(snapshot): add snapshot tasks and volume CreateSnapshotMerged

The stack, and where it ran

Every item here went into a real project, paid or public. Pick a project to see what it was built with.

How I work

Problem before stack

I came from marketing and data. Before choosing tools I ask what costs money today and which number has to move.

Correct under concurrency

Row locks where tokens and money are involved: FOR UPDATE on refresh-token rotation, FOR NO KEY UPDATE to avoid deadlocks, unique keys instead of hope.

Done means verified

A green typecheck is not proof. I run the flow end to end, and when I can't verify something I say exactly what is left.

Measured, not claimed

The metric is agreed before the build: time per lead, cost per qualified lead, meetings booked. Then it gets measured against the old process.

From marketing to engineering

  1. 2026 to now

    AI Engineer, Solabs

    AI agents, integrations and product engineering for a group of companies.

    • Production AI agents on WhatsApp and Instagram handling 300+ leads a day, writing straight into Bitrix24 and RD Station.
    • A multichannel B2B outreach engine (LinkedIn and email) with scraping, enrichment and automated sequences (Apify, HeyReach).
  2. 2026 to now

    AI Engineer, Núcleo de Performance

    Conversion tracking and the internal app of a performance marketing agency.

    • Server-side conversion tracking fed by the CRM (Meta Conversions API, Google Ads offline conversions), giving the agency's campaigns their sales attribution back.
    • Built and run the agency's internal app: per-person sign-in with access by section, a portal with SEO reports for 13 clients, a password vault encrypted in the browser, sensors and Telegram alerts.
  3. 2026 to now

    Software Engineer, Starhash

    Platform that licenses creators' likeness for generative AI, live with real billing (starhash.ai).

    • 700+ commits since June 2026: Starboost, the integration with the ad accounts on Meta, TikTok and Google Ads, plus sign-in and account linking with Google and YouTube, TikTok and Instagram, each one approved in that platform's app review.
    • Security hardening: ownership checks on every authenticated route, SSRF protection, hardened JWT, sessions with rotating refresh tokens, all locked behind automated guards.
  4. 2025 to 2026

    Full-stack Developer, Funil Faixa Preta

    Sole developer. Built the company's multi-tenant CRM from the database to the interface, plus the automations and integrations around it.

    • 862 commits from the Postgres schema (migrations, row-level security) and Edge Functions to the React, TypeScript and Vite front end, serving 20 client companies.
    • LLM agents with RAG and embeddings for triage, FAQs and human handoff, cutting the time to first reply to a customer by 60%.
  5. 2024 to 2025

    Data and BI Analyst, Cafezinho

    Dashboards, data models and predictive models for an app operating in Portugal.

  6. 2020 to 2024

    Paid Media, independent

    Where I learned what a business actually measures.

Notes from production

Short write-ups of problems I hit and how I fixed them, with sources.

Want to talk about the work?

Email is the fastest way to reach me, in English or Portuguese.

LinkedInGitHub