Patricio Barreto
Right after Northeastern, I joined Soundboard, a tax and bookkeeping startup, as its only engineer. With no one to learn from, I learned from production: I built the platform, the infrastructure, and the AI agents inside it, and helped sell it to its first clients.
Looking for a founding or product engineering role at an early-stage, AI-native startup.

Soundboard
I built Soundboard alone, from scratch: first the platform, then the AI layer on top of it.
Soundboard is a bookkeeping and tax platform for freelancers and small business owners. Clients answer their tax preparer's questions, categorize their transactions, and respond to tax deduction questions. Soundboard's bookkeepers and tax preparers keep each client's books up to date and file their taxes, with all of the work happening inside the platform and supported by its AI automations.
- 177
- paying clients
- $50k
- MRR
- 5
- agents in production
- 1
- engineer
The platform
I started Soundboard's codebase from zero in 2023 and learned the stack as I built it: Next.js, TypeScript, PostgreSQL, and AWS. It's a multi-tenant system with 100+ data models, 70+ API endpoints, and integrations with HubSpot, Stripe, and QuickBooks, including a two-way QuickBooks sync built on undocumented API endpoints. Over three years it grew to 177 paying clients and $50k MRR, with me as the only engineer.
sb-ai, the agent platform
Later in 2023, I built a second system for Soundboard's AI features, again from scratch and again learning a new stack: agent orchestration, retrieval, and evaluation. It's a self-hosted Python service on AWS ECS Fargate that every agent runs through, with TypeScript handling orchestration and reliability on the platform side. It now powers 5 agents in production, tested by a regression harness after every change, and they let a four-person team keep pace with client growth without adding headcount at the same rate. Transaction categorization alone saves the team about 260 bookkeeper hours a month.
Diagram of the Soundboard system. The Platform region contains a Next.js app with a TypeScript backend, hosted on Vercel, which stores data in PostgreSQL and documents in S3 and CloudFront. The sb-ai region contains a Python FastAPI service, hosted on AWS ECS Fargate and backed by Qdrant, running five agents: transaction categorization, a tax-filing agent, a client summary pipeline, an ops Q&A agent, and BugBot. The Platform and sb-ai services call each other directly. Outside both regions, QuickBooks and HubSpot connect into the Platform, LLM providers from OpenAI, Anthropic, and Google connect into sb-ai, and GitHub and DataDog feed into BugBot specifically. A separate eval harness box, labeled internal tooling, connects to the sb-ai region with a single line, testing the agents after every change.
Beyond the code, I also covered sales and product decisions, with no PM for over two years.
Agents I built

Transaction categorization
The original categorizer was slow (~20s), plateaued at 90% accuracy, and was a black box.
Cut latency to ~3s and raised accuracy to 99%, measured against user-verified categories.

Tax-filing agent
A Form 1120-S return has dozens of interdependent line items, normally assembled by hand.
Validated against 35 CPA-prepared returns, with matching output in 34.

Client summary pipeline
Preparers spent about 30 minutes gathering context before each client call.
A seven-source summary cut it to about 5.

Ops Q&A agent
Preparers rewrote the same answers every day.
The agent drafts messages from the team's own past conversations, without ever learning from its own drafts.

BugBot
As the only engineer, every untriaged error stayed unnoticed.
BugBot groups production errors and emails a diagnosed digest every morning.

Eval harness
A categorizer regression only showed up after bookkeepers had to correct it.
A harness runs the real agent against held-out cases before a change ships. On two test datasets, 99 of 101 suggestions were correct.
How I work
For more than two years, Soundboard had no product manager, so I owned every feature from the first conversation with a customer to measuring it after it shipped. These are the habits that came out of that, and they're what I'd bring to any product built on LLMs.
Listen
Start with the people using it
Most features on this site started in a conversation with a client or the team.
Sold it, too
~15 early clientsIn 2023 and early 2024, I brought in about 15 of Soundboard's early clients myself.
Read moreRead less: Sold it, too
I built a lead-generation script that found prospects by location and job title, qualified the leads by hand, and reached out to the ones that fit. Running those first sales calls taught me how our clients actually run their businesses, and that understanding shaped what I built next.
Turned a complaint into a feature
30 → 5 min prepA preparer's offhand comment about prep time became the client summaries.
Read moreRead less: Turned a complaint into a feature
In a routine monthly call, a tax preparer mentioned they were spending about 30 minutes before every client call just piecing together context. I asked the preparers what they actually needed before a call, mapped each answer to data Soundboard already had, and built the client summaries. Prep time dropped to about 5 minutes. The summaries, the Ops Q&A agent, the QuickBooks automations, and the automated monthly reports all started the same way, in those monthly calls.
See: Client summaries
Decide
Choose what's worth building
Without a PM, every request went through the same filter: how much it helps, and what it costs to do well.
Automated the right things first
Impact per effortWith a four-person team supporting 177 paying clients, I started with the most impact for the least work, then went after whatever took most of their time.
Read moreRead less: Automated the right things first
My rule for what to automate next was simple. First, the low-hanging fruit: changes with the most impact for the least work. Then, whatever was taking the most of the team's time, if it could be automated reliably; if it couldn't, I moved on to the next thing rather than forcing it. Transaction categorization is the clearest example. It was where bookkeepers spent the most hours, which is why it was the first agent I built, and the first one I rebuilt.
Built what they needed, not what they asked for
~40% faster repliesPreparers asked for a Claude project to draft client messages; I built drafting into Soundboard itself.
Read moreRead less: Built what they needed, not what they asked for
The preparers came to me with a plan: set up a project in Claude with the team's instructions, and open it whenever they needed to write to a client. It would have worked, but every message meant leaving Soundboard, copying the client's conversation into another tool, and relying on instructions someone had to keep updated by hand. Drafting inside Soundboard would be faster, and more accurate, because it could read the actual thread and learn from the team's real past answers. The preparers were glad to have it built for them, and now report replying to clients about 40% faster.
See: Ops Q&A agent
Knew when to say no, and when to say yes
Built one, declined oneWhile building the client summaries, preparers asked for two additions. I built one and declined the other.
Read moreRead less: Knew when to say no, and when to say yes
The preparers asked for an AI-written analysis of each client's financials, and for a measure of how responsive each client is to the team's questions and tasks. The financial analysis would have had a model restate, in words, what the computed table already showed clearly, spending tokens on every summary without telling preparers anything new, so I didn't build it. The responsiveness measure was something the data could show and preparers couldn't easily see on their own, so I built it.
See: Client summaries
Rebuilt my own first version
90% → 99% accuracyMy first categorizer ran on a black box I couldn't improve. Nobody asked me to replace it; a proof of concept made the case.
Read moreRead less: Rebuilt my own first version
The first version of transaction categorization, built in 2023, ran on the OpenAI Assistants API. It got categorization live at about 90% accuracy, but it took around 20 seconds per transaction, and when it got something wrong, I had no way to see why or fix it. That was my mistake: for a core feature, I had picked infrastructure I couldn't inspect. Nobody asked me to revisit it, and when I proposed a rebuild to Soundboard's CEO, the pushback was fair: it already works. Instead of arguing, I built a proof of concept and showed its retrieval and categorization accuracy across different transactions and clients. The rebuild in 2024 took two weeks and reached about 3 seconds per transaction and 99% accuracy. Since then, I build core AI features on pieces I can measure and change, and proposing work got easier: when I later suggested the Ops Q&A agent, there was far less hesitation.
Build
Keep the model where judgment is needed
The same three rules shape every agent in Soundboard.
Compute in code, let the model judge
50 of 155 tax lines in codeAnything that can be calculated is calculated, so the numbers a person relies on never come from a model's arithmetic.
Read moreRead less: Compute in code, let the model judge
Totals, carryforwards, and financial comparisons are computed in code. The model only handles the decisions that actually need judgment. In the tax agent, 50 of the 155 line items never touch a model at all, and the client summaries show financials as a computed table rather than asking a model to describe them.
Check what the model returns
A model's answer is a proposal until code accepts it.
Read moreRead less: Check what the model returns
A category outside the client's chart of accounts becomes "uncategorized," a theme ID that doesn't exist is rejected, and a precedent the model claims to have used must be one it was actually given. Wherever an answer can be checked, the check lives in code, not in the prompt.
See: Transaction categorizationClient summariesOps Q&A agent
"I don't know" beats a confident guess
Every agent is allowed to decline.
Read moreRead less: "I don't know" beats a confident guess
The categorizer abstains below high confidence, the tax agent marks a line item "insufficient" when the evidence isn't there, and BugBot says what information it's missing instead of inventing a diagnosis. A person reviewing a blank catches it; a person reviewing a plausible wrong answer often doesn't.
Verify
Measure before trusting
A number I haven't questioned isn't a result yet.
Measure before trusting, including the measurement
I test retrieval separately from the final answer, and I test the tests themselves.
Read moreRead less: Measure before trusting, including the measurement
Evaluating retrieval on its own tells me whether a mistake came from missing context or bad reasoning, instead of only knowing the final answer was wrong. And I check the measurement too: a similarity threshold that would have rejected every real match, and an evaluation that scored 0% because of a bug in its own test data, were both caught before they mattered.
Improve
Get better after shipping
Shipping is where the agents start learning, and where cost starts to matter.
Learn from people, never from yourself
Every human correction becomes something future runs can use, but an agent's own output never does.
Read moreRead less: Learn from people, never from yourself
Agents ground their answers in the company's own confirmed history, and every correction feeds back into it: confirmed categories, a preparer's fix to a tax line item, a correction to a summary. What an agent must never learn from is its own output, so the Ops Q&A agent filters out any precedent that came from an AI draft.
See: Transaction categorizationTax-filing agentOps Q&A agent
Spend tokens only where they change the answer
Tokens only when readSummaries refresh only when someone opens them, and BugBot analyzes clusters, not log lines.
Read moreRead less: Spend tokens only where they change the answer
Every client's data changes every month, but not every client is reviewed every month, so automatic refreshes would keep producing summaries nobody opens. Instead, summaries refresh when a preparer opens one, processing only what changed since the last refresh; the cost is about a minute of waiting. The same thinking runs through the rest: BugBot analyzes each cluster of errors once a day instead of every log line, and structured inputs go to a cheaper model while the stronger one is reserved for messy ones.
Underneath all of it, the same architecture: a TypeScript service owns orchestration, state, and reliability, and a Python service owns the model calls and retrieval. A shared client with retries and degraded-mode handling sits between them, so a failure in one agent's AI layer never takes down the product around it, and every model call is logged with its prompt, tokens, and cost.
Experience
Soundboard · Software Engineer (First Engineering Hire)
Jul 2023 – Present
The company's only engineer. I built the platform and every AI agent on this site, from first commit to $50k MRR.
NTT DATA · Software Engineering Co-op
Jan 2022 – Jul 2022
Proposed replacing step-by-step screenshots with a screen recording of the full flow as test evidence, which sped up defect reporting and let the QA team run 20% more tests per day. I also designed test cases from user stories for an energy sector client's software, and ran end-to-end manual tests as an end user, reporting each defect with its evidence to a senior tester.
Everis · Software Development Intern
Apr 2021 – Aug 2021
Developed full-stack features (Java and Spring Boot backend, HTML and CSS frontend) for three client web applications in an Agile team, including a banking client's task management tool. Worked 100% remotely and picked up software design best practices from the team lead.
Education
Northeastern University · B.S., Computer Engineering and Computer Science, Minor in Mathematics
2018 – 2023
About
I studied Computer Engineering and Computer Science, with a minor in Mathematics, at Northeastern. At Soundboard, there was no senior engineer to learn from, so I learned the rest of the stack and the AI systems on the job, building them for real clients from day one. I work remotely on US Eastern hours, in English and Spanish, and I'm looking for an early-stage team where I can own a product end to end again, this time alongside other engineers.
