Consulting
Brasília — Remote
·
3
Norberto Junior — Product Engineer, AI Systems

I build AI systems that reach production.

Three are running right now: a creative platform serving 1,207 students, a CRM with four AI agents handling sales and support, and an autonomous agent system that works offline in the field.

16 years across design, art direction, UX and product. Today I build the infrastructure that makes AI products work when there is real money and real people on the other side.

3Systems in production
19Kinds of step, each measured on its own
Humanapproves anything that reaches a client, moves money or deletes data
Stack de trabalho 11 ferramentas conectadas em um só processo

Systems

Three in production — one in progress — one consultancy
01

Estúdio Criativo

ReadyToGo Education — 1,207 active students
TypeScript · Next.js
PostgreSQL · Supabase
OpenRouter
“How much does one generation cost?”
Nobody could answer.

The problem

An AI creative tool was shipping, but nobody could answer the two questions that decide whether an AI product survives: what does each generation actually cost, and what happens when a provider fails at 2am?

What I built

A single AI gateway. Every outbound call to every provider goes through one place — per-provider timeouts, structured logging, anomaly detection at 40% error rate or 45s latency, and the ability to cut off a provider through a feature flag, without deploying. Twelve egress points migrated, zero direct calls left.

Then telemetry per step: the pipeline breaks a generation into 19 kinds of step, and each one records its own cost, duration and tokens. Not aggregate — per step. That is what turns “we have an AI feature” into “we know what it costs and what to charge for it.”

Twelve egress points, one path out

The decision that mattered

Slides render in parallel, so summing node durations overstates real elapsed time. The system reports the sum of the steps and the wall-clock time as two separate numbers. Measuring the wrong thing confidently is worse than not measuring at all.

slides render in parallel —
summing duration lies

Also shipped

Monthly credit windows, with every movement written to a permanent log that is the source of truth — the balance is never a field someone can edit. A queue that detects an orphaned job in about two minutes and reprocesses it — without charging the student for the failure. Feature flags with a kill switch. Observable deploys: one endpoint answers which commit is live.

02

Clau Carvalho CRM

Partner — Product & engineering — Built solo in 4 months
TypeScript · Node
PostgreSQL · Drizzle
WhatsApp Cloud API
“Just tell the agent not to give discounts.”
A prompt is not a rule.

The problem

A post-operative physiotherapy practice running sales, student management and support across WhatsApp, spreadsheets, and an unofficial API that collapsed under load.

What I built

A full CRM with four AI agents that have explicit data boundaries between them: one sees internal operations, one handles inbound leads around the clock, one is isolated and never receives operational data, one writes content.

The sales agent runs on non-negotiable rules encoded in the system, not in a prompt: never offers or negotiates a discount, never closes a sale, never sends a checkout link, never discards a lead. It qualifies and hands off to a human.

Then I migrated the operation to Meta’s official WhatsApp Cloud API — including the diagnosis the documentation doesn’t cover: verifying the webhook and subscribing to events isn’t enough. The app has to be subscribed on the WABA, and the number has to be registered on the Cloud. Before that, Meta simply delivers nothing.

The decision that mattered

Before the migration, bulk sends at machine cadence kept killing the session. The fix wasn’t a retry loop — it was respecting the platform: randomized human-paced intervals with periodic breaks. Some constraints aren’t bugs to route around.

the fix was respecting
the platform, not retrying

Four agents, four data boundaries

Also shipped

A financial module — amounts in cents, installments, per-seller commission, partner profit split, refunds, event-level audit trail. Approved sales post automatically, deduplicated by transaction. Round-robin lead distribution. Automated first contact with a silent fallback when a template isn’t approved yet, so nobody is left without a message.

03

Duck Studios

Consulting — CRM + autonomous agents
Python · FastAPI
PostgreSQL
Offline-first PWA
“The agent doesn’t have permission to delete files.”
That sentence stopped reassuring me.

The problem

A film production company and equipment rental house tracking a R$519,000 inventory in spreadsheets — and needing it to work on location, where there is no reliable network.

What I built

An offline-first PWA. Equipment check-in and check-out by scan works with no connection: each scan enters a local queue and syncs later without duplicating. It runs on a Mac Mini that travels to shoots, powered by a stationary battery and Starlink.

Autonomous agents with autonomy graded per action, not per agent — a five-level scale. At the lowest level the action does not exist in the code at all. Anything that reaches a client, moves money or deletes data is fixed at A2: the agent prepares the whole action, a human approves, code executes. Everything else moves on evidence — ten clean runs promote an action one level, one correction demotes it and the reason is logged. Every agent action is audited.

The autonomy scale, level by level

The decision that mattered

Anti-overbooking is a PostgreSQL exclusion constraint, not application logic. Guarantees that matter live in the database, where a code bug can’t route around them.

A0 is not denied permission.
It is absence.

Inbound messages are data, not instructions. Agent rules do not change based on the content of a message received — prompt injection handled as architecture, not as a filter.

Found along the way

Cross-referencing the catalogue against real inventory surfaced 14 items being sold that didn’t exist in the fleet.

04

UGC creator platform

ReadyToGo Education — in progress
TypeScript · Next.js
PostgreSQL · outbox
Event-driven
In progress
“Put the queue in Redis. It’s the standard, and it’s faster.”
Both true. Neither was the problem.

The problem

A platform where content creators publish, get measured and get ranked. Every submission has to be analysed, scored and folded into a cycle — in the background, never inside the request. The obvious answer was a queue in Redis.

What I built

The state change and the event are written in the same transaction — the outbox pattern. A worker claims rows with for update skip locked, and consumers are idempotent by key, so the same event arriving twice costs nothing.

Webhooks and server actions record the event and return. Heavy work belongs to whoever consumes it, never to whoever receives the request. Events are named in the past tense — content collected, metric updated, cycle closed — because an event is a fact that already happened, not an order to obey.

One transaction, or two systems that can disagree

The decision that mattered

Queueing outside the database splits the content write from the job enqueue: two writes that can diverge. If the second one fails, the work exists and is never processed — the creator loses points and the ranking lies, silently, in one row. The canonical fix is the outbox, and an outbox table is a queue in the database. Redis would add a piece without removing one.

the argument was never
throughput. it was atomicity.

Where Redis would earn its place

As a rate limiter shared across serverless invocations. So the limiter was born behind an interface, with a PostgreSQL implementation. Swapping it later is one file — when measurement asks, not when intuition does.

05

Sete Studio

NRB SYS consulting — AI video engine
Diagnosis · architecture
Execution plan for the coding assistant
Next.js · PostgreSQL · Claude
“Leave B-roll to the client for now.”
An editor who skips B-roll isn’t editing.

The problem

A studio that teaches AI wanted video editing inside its own product: send a recorded talking-head clip, get it back edited — captions, zoom, motion, sound, B-roll. The brief was one Reel and a sentence: this, but productized. Nobody had access to the system that made it.

What I delivered

I reverse-engineered the reference from the file itself: a frame per second, word-level transcription, scene cuts and silence measured. That separated what code can reproduce from what has to be generated — and showed that every effect is anchored to a spoken word, not to a timestamp.

Then the diagnosis, the architecture decisions and an 11-week plan in which every step ships with the exact prompt to paste into the client’s own coding agent, commands for Mac and Windows, and costs in reais. The client builds; the plan carries the judgement.

And a private portal per consultancy, where the client marks progress, comments on each step and exchanges files — with an assistant grounded only in that consultancy’s material.

Where a client question goes

The decision that mattered

The first draft left B-roll to the client: the engine would edit, and the client would go find the footage. That is hiring an editor who doesn’t do B-roll. It flipped to on by default — before editing, the engine lists the B-roll the script needs, shows the cost in reais, the client approves, it generates.

automation that skips the hard step
is a to-do list.

The assistant follows the same rule in reverse: it answers only what the plan covers. Price, deadline and scope go to me with the reason attached, and if the model call fails it escalates instead of guessing. Client messages are data, not instructions.

Found along the way

Measured, the reference runs at 3.6 words per second with no pause longer than 0.44 s, and only 13 scene changes in 113 seconds. The motion comes from elements anchored to words, not from camera cuts — so the engine’s spine is word-level timing, not a cut list.

06

Movitre

Cofounder — strategy, pricing and go-to-market
Next.js · Supabase · Stripe
Python AI service
WhatsApp · Meta Ads
Pre-launch
“The landing page says it works.”
The audit said 63%.

The problem

A customer messages a car dealership at ten at night asking about a car. The owner sees it in the morning, replies, and by then the customer has bought somewhere else. Small dealerships sell over WhatsApp, and the person answering is the owner himself — so the sale is lost to response time, not to price.

What I do here

The product code belongs to my partners. My half is turning it into something that can be sold: ideal customer, positioning, pricing and unit economics, the launch funnel, and the plan from zero to a hundred customers.

The part worth describing is how that work gets done. Instead of hiring a consultancy, I built a team of specialised AI agents that works inside the product repository — one for go-to-market, one for pricing, one for sales, one for onboarding, one for each engineering surface. A coordinating agent runs them, and each one has rules and a deliverable it has to produce.

The agent that doubts

The decision that mattered

The most valuable agent is not the one that builds. It is the one that doubts. Before any demo, an auditor walks the landing page promise by promise and tests each one in the browser, in production, without taking a real payment or messaging a real customer. Only what the audit clears may be sold.

an honest report is worth more
than a beautiful landing page.

The first report hurt. It also stopped us selling three things that did not work, and selling those would have burned the case study and the referrals that the whole plan depends on.

How the plan was built

Every stage has a date and a gate. A gate only opens on a measured number — and the path for when it does not open is drawn alongside it, so the decision already exists before the moment it hurts.

Found along the way

The original growth plan put 10% of revenue into acquisition. Run the numbers at ten to twenty customers and that buys less than one customer a month — a percentage of something small is not a budget. It became a fixed floor instead, with a ceiling on what a customer may cost to acquire.

Same with the pilot: one model customer is a single point of failure, so it became two. And the model customer pays from month two, because the only validation worth having is the yes that costs money.

How I build

Four things learned carrying real money
01

The database comes before the agent

An agent without a system of record hallucinates the state of the world. The CRM isn’t a project running alongside the agents — the CRM is the agents’ memory.

02

User input is data, not instructions

Agent rules don’t change based on what arrives in a message. Prompt injection is an architecture problem, not a filter you bolt on afterwards.

03

Guarantees belong in the database

Not in application logic, where a bug can route around them. If overbooking must be impossible, it’s a constraint — not a validation.

04

Measure cost per step

Aggregate spend tells you that AI is expensive. Per-step cost tells you which step, and what to charge for it.

Selected work

16 years — curated
PeriodOrganisationRoleWhat it was
2026 —IDPFreelance Figma MCP integration: page and asset changes, saves and management handled by an AI agent, removing the manual design step from the workflow.In progress
2022 —ReadyToGo EducationUX → Product → AI UX Designer (2022) → Product Manager (2024) → AI Product Lead (2026). Four and a half years, two promotions, same company.
2018 – 2019Top MarketingCreative Director All art and design across every campaign, reporting directly to the owners. Clients: Brasal, MRV.
2020 – 2022IDPSenior UX Designer UI/UX, pages, campaigns and identity for undergraduate, postgraduate and master’s programmes. Remote.
2019 – 2020LinkBizDesigner High-conversion landing pages, copywriting, and API integrations — the first time the output was an automated process rather than a piece of artwork.
2015 – 2018Mix7Art Director Three years leading a team across on and off campaigns, project management and UI/UX.
OngoingCBF · STJDFreelance Websites, landing pages, public notices and campaigns. Recurring retainer relationships.

Background

The path was deliberate
MBAProduct Management & GrowthFIAP
PostgraduateUX / User ExperienceUniNabuco
BAGraphic DesignUniPlan

Design → UX → Product, in that order, credentials following the work. The engineering I learned by building. What runs in production is the proof.

Consulting — AI engineering

I also do this for other teams.

Diagnosis, architecture and an execution plan for teams building with AI who would rather not find the mistakes in production.

See how it works →

Open to conversations about product engineering and AI systems.