Bernardo Castro · AI systems engineer

Agents that
do the work.

I design and build real-time voice agents and the infrastructure they run on: a runtime on LiveKit where every call is recorded in an auditable log and evaluated the moment it ends. Eighteen years shipping production software; founding engineer at Pinecall.

Open to senior roles and contract work · Uruguay and Spain · English, español

replayinga real call to my agent · from its log
    $0.028 · claude-haiku-4.53/3 judges held

    Runtime

    Built for failure.

    Audio comes in, the gateway routes each call to a worker, and the workers hold the conversations. Simulate a worker failure below.

    Gateway
    13/24calls lost to a failed worker, before the fix
    Workers
    5 sheartbeat interval: the gateway tracks every worker
    Callers
    21 sfrom a worker failure to its callers informed, never silence
    Who picks the worker for each call
    w2 up

    0 answered0 rang in silence

    LiveKit keeps a dead worker registered for 15–20 minutes and keeps drawing it. Each call it gets rings in silence for 10 s.

    Scaling

    Capacity scales. Calls continue.

    The fleet stays below 60% utilization. Above it, KEDA adds a worker and the cluster provisions a machine for it; well below it, a worker stops accepting calls and is removed once its calls end.

    Seats
    32concurrent calls on one 8-vCPU worker, at 57% load
    Grow
    60%above this utilization, KEDA adds a worker immediately
    Shrink
    45%below this without one worker, it drains its calls and is removed
    busy 0%target 60%0 calls

    One worker, 32 seats. Calls start to arrive.

    terraform$ make tf-plan ENV=productionNo changes. the GKE cluster and node pools, fully as code

    Pinecall runtime on LiveKit · GKE provisioned with Terraform, deployed with Helm · load-tested, Oct 2026

    How a call works

    Anatomy of a call.

    Every call goes through six stages, most of them in under a second. Each has its own failure modes, and each writes an entry to the call's log.

    A phone call reaches the runtime from the carrier over SIP, and a browser call over WebRTC. Both end up in the same place: a LiveKit room, which carries the audio both ways.

    where it breaksAnyone on the internet can knock on a phone port, and some do it all day, looking for free calls.

    how it holdsThe phone port only answers the carrier's own addresses. Everyone else gets no reply at all.

    on the logcall.ringingweb · bernardo

    The gateway picks a worker, one of the programs that hold conversations, and it joins the room for this call. It loads the agent's voice, model and words for the world the call belongs to.

    where it breaksA machine dies mid-call, or every seat is taken at the busiest minute.

    how it holdsThe caller is told in one sentence and offered a call back. A caller whose worker dies is never left on a dead line: another worker tells them and books the call back.

    on the logcall.startedworker joined · sandbox

    Speech recognition writes down what the caller says, and a turn detector decides when they have actually finished, not just paused for breath.

    where it breaksIt answers too early and cuts the caller off, or a "mhm" makes the agent stop mid-sentence.

    how it holdsTurn rules per language: a few words to interrupt, and backchannels like "mhm" and "vale" are let through.

    on the logturn.user"Thursday would be great."

    The model reads a prompt rendered from the call's state and decides what to do. When it needs a fact or an action, it calls a tool, and the tool runs in the business's own code, not in ours.

    where it breaksIt invents a time that does not exist, books something nobody agreed to, or goes quiet for twenty seconds.

    how it holdsOnly tools change anything. A model silent for 12 seconds is cut, and the caller hears "one moment".

    on the logtool.callfreeSlots(Thursday)45 ms

    The reply is spoken as it is written, word by word, so the caller hears the start of it before the model has finished thinking.

    where it breaksThe agent talks over the caller, or every reply arrives a beat too late to feel like a conversation.

    how it holdsWhen the caller speaks, the agent stops. Every turn records its time to first audio, so a slow day shows up as a number.

    on the logturn.agent"How about one of these…"ttft 518 ms

    The call ends and its record is closed: every model priced, what the agent learned remembered, and the call graded by judges.

    where it breaksNobody listens to the calls, so a bad one is only found when a customer complains.

    how it holdsEvery call is judged as it hangs up: by code where a rule can decide, by a model only where it cannot. The record cannot be edited afterwards.

    on the logcall.scoreconsent · grounded · promises3/3 held · $0.028

    Open source

    Built in the open.

    The tools I use in production work, released as open source. Install them, read the code and evaluate the engineering before we talk.

    pinecall

    pinecall

    The server side of voice AI: one open-source runtime on LiveKit.

    Call log, stateless gateways, worker fleets, multi-tenancy, evaluation, memory and hosted apps, in one Python package. Terraform provisions its Kubernetes cluster and Helm deploys it, fully as code; agents connect to it from TypeScript or Ruby.

    the cluster, then the runtime
    $ make tf-apply ENV=… && make deploy ENV=…
    the SDK and the CLI
    $ npm i pinecall
    • Python
    • TypeScript
    • LiveKit
    • Apache-2.0

    taskops

    bernatch22

    A shared work board for teams of coding agents, with a human who decides.

    Milestones, cards and one git worktree per card, served over MCP so a team of agents can plan, claim, deliver and review work without conflicts. Review is enforced by the server: no agent can approve its own work.

    $ uv tool install taskops-cli
    • Python
    • MCP
    • Claude Code

    vibesmell

    bernatch22

    Detects the cross-file code smells that linters miss.

    Pass-through functions, parameters threaded through calls that never use them, duplicated function bodies. It analyzes a whole Python package or TypeScript project, and each finding explains the problem and how to fix it.

    $ uvx --from vibesmell vibesmell score
    • Python
    • TypeScript
    • MIT

    shipway

    bernatch22

    Deploys an app to any server over SSH from a short YAML file.

    Builds locally, syncs with rsync, restarts through pm2 or systemd and health-checks the port, one timed step at a time, with no Docker and no cloud lock-in. Several services and environments in one file, logs, restarts and a dry run for the day after, and guards that stop a typo from deleting a remote directory.

    $ npm i -g shipway
    • TypeScript
    • SSH
    • MIT

    mypry

    bernatch22

    A runtime debugger for AI agents, across Node.js and the browser.

    Over MCP, an agent follows one request from the browser click into the backend handler: breakpoints, conditions and logpoints with no code edit or restart, stepping, and eval on either side in one session. Pause snapshots are bounded, so a typical Express pause reads in about a hundred lines instead of thousands.

    $ npm i -g mypry
    • TypeScript
    • MCP
    • MIT

    Approach

    How I work.

    The principles I bring to every team and every system.

    1. 01

      Own it end to end.

      I take a system from architecture to production and keep it running: design, build, ship and operate. Nothing is handed off half-finished.

      Pinecall: from the runtime to the production fleet

    2. 02

      Measure before shipping.

      Every change is load-tested before release and every output is evaluated automatically. Decisions come from data, not from confidence.

      Every release load-tested, every call evaluated

    3. 03

      Design for failure.

      Systems degrade gracefully, recover on their own and keep a complete audit trail, so a failure is a recoverable event, not an outage.

      Zero-downtime releases, append-only records

    4. 04

      Make the team faster.

      Clear documentation, reliable tests and tooling other engineers can run without me. I build systems a team can own after I move on.

      taskops and vibesmell, open source

    Experience

    Eighteen years shipping.

    With LLMs in production since GPT-3: as an AI team lead, and as the engineer partners bring in for their most demanding systems.

    Open to senior roles and contract work

    1. 2025 – now

      Pinecall

      Founding Engineer · engine and infrastructureopen source · Apache-2.0

      Founding engineer of an open-source voice AI platform: a Python runtime on LiveKit that runs agents across phone, SIP, WhatsApp and the browser. Designed and built the append-only call log shared by the console, billing and evaluation, stateless gateways, self-scaling worker fleets, multi-tenancy, memory, automated evaluation of every call, and the agent SDKs in TypeScript and Ruby. Production runs as code: Terraform provisions the GKE cluster and Helm deploys the runtime, and every change is load-tested before release: terminating a gateway under 1,200 live calls dropped none, a release during live calls interrupted none, and a caller whose worker fails is never left on a dead line: another worker informs them and schedules a call back.

      python · typescript · livekit · postgres · terraform · kubernetes

    2. May 2026 – now

      Cloudacio

      Quant systems engineer · Axion · New York

      Architected and built Axion end to end: an AI-native systematic trading platform for crypto derivatives, running in production. Proprietary 24/7 market data capture into a 6B+ row point-in-time ClickHouse store; a research-to-production pipeline with pre-registered hypotheses, leak-free walk-forward backtesting and forward validation before any strategy trades; risk limits enforced in code; and a complete audit trail of every decision. Autonomous Claude agents run the research desk through an MCP control plane, with isolated multi-tenant workspaces.

      python · clickhouse · fastapi · claude code · mcp · gcp

    3. 2025 – 2026

      ServiceHub

      AI engineer through Cloudacio · legacy platform and security

      Owned the legacy platform behind a healthcare-interpreting business handling 2.5M+ encounters a year: maintained it in production, delivered new features such as account transfers, and supported its migration to the successor platform. Remediated every Critical and High finding of an external penetration test across three applications. Two were in a dispatcher console built on Classic ASP and VB6 COM+ components written in 2000: I restored an unfinished build server, rebuilt the DLLs from source with VB6 SP6, verified the build byte for byte against production, and shipped the fix into 25-year-old code.

      php · classic asp · vb6 · com+ · sql server

    4. 2020 – 2025

      DigitalBGA

      Software architect · AI team lead

      Nearly five years at one of the fastest-growing life-insurance agencies in the US (3× Inc. 5000), where my AI work began. When GPT-3 was released, I built an outbound voice agent to call back unanswered leads; it became the company's main project and grew into the AI team I led, with 10,000+ leads captured. I also built a complete e-application system that has processed 4,000+ applications with Mutual of Omaha and other carriers, and a call-center conversation analyzer.

      ruby · php · react · python

    5. 2017 – 2019

      Crisalix

      Full-stack · Barcelona

      3D medical imaging. Built the public API from scratch, an image editor with comparison tools, a subscription manager and KPI dashboards. Led the team that won the company's first hackathon, with an app that turns a selfie into a 3D model.

      ruby · js

    6. 2008 – 2020

      Earlier roles

      Full-stack · US and EU clients · since age 17

      CallAction, PUSHTech, Teamitup (New York), Tarmac, Dawson and SoFetch, and Cubox, a Montevideo studio founded by an early Twitter engineer, where I built Rails products for US startups with TDD and pair programming. Earlier, a CMS for PLUNA, Uruguay's national airline, delivered at 18.

      ruby · php · js

    Projects

    Built and running.

    1. 2026 – now

      Ringside.fit

      With Kickboxing Zona Franca · Barcelona

      An operating system for fight gyms, built and validated with the coaches at Kickboxing Zona Franca in Barcelona, where it runs daily operations in production: subscription billing on Stripe, door access by QR code or optional face recognition with every entry verified against the member's Stripe subscription, biometric data that never leaves the on-site server, and apps for reception, members and staff. More than 100 subscriptions are billed through it today. Now developing a computer-vision model that analyzes fights, trained on a dataset the club labels itself. Its reference fighter, coach Edu del Prado, won the Spanish professional title on 10 October 2026.

      kickboxingzf.com

      typescript · hono · stripe · electron · ionic · yolo11-pose · pytorch

    2. Mar – Jun 2026

      Signwax

      E-signature platform · for Relatyon · Madrid

      Electronic signatures that can be verified without trusting the platform: every signature binds the signer's identity, the document hash and a timestamp into one proof, a hash-chained audit log makes any tampering evident, and the executed document's hash is anchored to Bitcoin through OpenTimestamps, never the document itself. Executed documents carry a PAdES seal that verifies in Adobe, and signers' emails are stored encrypted and matched by hash, never decrypted to search.

      typescript · express · postgres · react · pades · opentimestamps · stripe