ExpandCast
LiveOne podcast episode, a week of derivative content. Tenant isolation by Postgres RLS.
Typed contracts, isolated subagents, verifiable state. I'm shipping ExpandCast, ProductReel and AgroAsistente solo — founder and lead engineer on all three.
José Gabriel Vilchez Carrasquero. AI engineer and fullstack operator in Mérida, Venezuela. I build production SaaS as a solo founder.
I treat AI agents as runtime components, not as cleverness amplifiers. The work runs on spec-driven contracts, deterministic state transitions and test-driven verification. The agent is the implementation. The system is mine.
Solo product work, 2026 — present.
Built and shipped features for an AI services SaaS: LLM integrations, Stripe billing, Firebase Cloud Functions.
Internal architecture, product detail and metrics withheld under NDA.
I treat AI agents as runtime components. They get contracts, isolation, verifiable state, a tool registry, and a documented path back from every failure. Then I own the system end-to-end. Seven practices below, each tied to a shipping project.
Predictable state transitions. Callback architecture beats polling at the 60-second wall.
Vercel Hobby caps function maxDuration at 60s. Shotstack renders run 40–90s. The pipeline submits and returns immediately. The function never polls. When Shotstack is done, its callback writes the job state to KV — that's the only place the state can change.
Don't close the loop without evidence the work happened.
A render job stays incomplete until Shotstack's callback fires with the MP4 URL. The UI reads state from KV, which is the system of record, not from optimistic client memory.
Storage, network and DB each enforce their own scope. Nothing trusts anything by default.
ExpandCast runs Supabase RLS, so every row read or write goes through a policy check. The service-role admin client stays strictly behind the server boundary. ProductReel HMAC-validates each Shopify webhook before any pipeline work begins.
One pipeline, many entry points. Each caller hits the same orchestrator under the same contract.
/api/scrape, /api/backfill and /api/webhook all converge on lib/pipeline.ts. The pipeline doesn't know who called it. The contract is the same for all three. Behaviour can't drift between entry points, and there's only one place to fix bugs.
Capabilities live as explicit, modular sources. Adding knowledge is editing a folder, not retuning a model.
Modular RAG over docs/cultivos, docs/plagas, docs/fertilizacion. External integrations like SoilGrids, MapBiomas and Weather wire into the agent as discrete skills. New domain knowledge ships as a text file.
Constraints drive technical choices. The market is the spec.
Built for Android phones on 2G/3G in rural Venezuela. No Tailwind to keep the bundle small, native Web Speech instead of Whisper for zero network cost, localStorage queue instead of IndexedDB. The stack is the user's reality, not mine.
Every failure mode has a documented path back to a working state.
The offline queue flushes automatically when the signal returns. Mid-response streaming cuts surface a 'continue' button. Camera permission denials show a banner with a re-grant path. Failure modes are part of the spec, not an afterthought.
Inspired by Alan Buscalas' Agent Harnesses framework.
Drawn from production projects — Next.js apps, AI pipelines, and the infra behind them.
// Frontend
// Backend
// Data & APIs
// Cloud & Infra
// AI & Automation
// Tooling