Isaí Céspedes · Frontend-leaning full stack engineer · Web & AI

I build web and AI products that work in production.

Frontend-leaning full stack engineer with 4+ years shipping TypeScript, React and Next.js for client teams in the US, UK and Spain. In 2026 I built four products on my own with an AI-augmented, spec-driven workflow. Scroll through each one: what it does, the hardest call, and the proof.

Or scroll for the full story ↓Download CV

4+ years of shipping, on one line

Santa Cruz, Bolivia · Remote-first · CET / UTC-4 flexible. Spanish (native), English (professional)

  1. Stack BuildersFull Stack Software Developer. Consulting firm delivering SaaS and B2B products for international clients across the US, UK, and Spain.Jan 2024 – Jun 2026
  2. Pylon DataFull Stack Software Developer. Solar energy management platform serving electricity providers across the United States.Oct 2022 – Feb 2023
  3. MicroversePeer Technical Mentor. Hired as staff while enrolled, to support early-stage developers.Jan 2022 – Oct 2023
Chapter 1 of 4

ChurchOS

ChurchOS: church admin, out of the spreadsheet.

Free, Spanish-first church management for small congregations, with each church's data isolated by the database itself.

status
In production
live
church-os.com
period
Aug 2026 – Present

The problem

for whom

Small Bolivian churches run on Excel and paper, mostly from a phone. The pastor should see giving totals, never who gave what.

What I built

and with what
  1. 01Multi-church accounts with 4 roles; the pastor sees giving totals, never individual donors.
  2. 02People and households, with Excel/CSV import and duplicate merge.
  3. 03QR attendance check-in from any phone.
  4. 04Offerings with funds and batches, expense month-close, PDF donor statements and treasurer reports.
  5. 05Spanish and English, audit log, GDPR erasure and full data export.
  • Next.js 16
  • React 19
  • TypeScript
  • Postgres (Neon) with RLS
  • Drizzle
  • better-auth
  • Tailwind CSS 4
  • react-pdf
  • Vercel Blob
  • Resend
  • Sentry
  • Vitest
  • Playwright

Demo

16:9 loop, fake data

Architecture

system map
ChurchOS architecturePhone UIclientNext.js on Vercelappbetter-auth sessionservicewithTenant() + can()servicePostgres with RLS(Neon)dataVercel BlobinfraResendexternalCI migrator roleinfraSentryexternal
  • Phone UI → Next.js on Vercel: HTTPS
  • Next.js on Vercel → better-auth session: session
  • Next.js on Vercel → withTenant() + can(): server actions
  • withTenant() + can() → Postgres with RLS (Neon): transaction-local tenant id
  • Next.js on Vercel → Vercel Blob: files
  • Next.js on Vercel → Resend: email
  • CI migrator role → Postgres with RLS (Neon): migrations
  • Next.js on Vercel → Sentry: errors

Hardest decision

why it matters

Enforce church isolation inside Postgres, with forced row-level security keyed on a transaction-local tenant id.

instead of

  • App-level WHERE filters on every query.
  • Session-scoped database settings.

why

A forgotten filter fails silently and becomes a breach. Session settings could leak the previous church through the connection pool. A cross-tenant test suite fails the build if any new route or server action isn't registered.

Result

proof
  • In production at church-os.com.
  • About 2,400 automated test cases, including 25 Playwright specs.
  • CI gates on typecheck, dependency boundaries, lint and end-to-end tests.
  • Unattended production migrations and a point-in-time recovery drill.

Your organization, out of Excel: people, attendance and money in one safe place.Build something like this →Hiring? The 30-second version →

Chapter 2 of 4

PilotBoard

PilotBoard: AI job search that won't invent your experience.

An API-first job-search tracker that checks fit with AI and tailors resumes without fabricating claims.

status
Live demo (payments and email off)
live
pilotboard.dev
period
Oct 2026 – Present

The problem

for whom

Job hunting is one repeated loop: judge fit, tailor a CV, follow up. AI speeds it up, but risks a resume that claims things you never did.

What I built

and with what
  1. 01Kanban tracker with tasks, contacts and automatic follow-ups.
  2. 02URL import: Greenhouse API, SSRF-guarded fetch, JSON-LD, Claude as fallback, then duplicate and fit checks.
  3. 03Tailoring where Claude may only reorder or rephrase; every claim is verified before you see the diff.
  4. 04Versioned REST API with OpenAPI and API keys, an MCP server and a typed SDK.
  5. 05Bring-your-own encrypted Anthropic key, ATS-ready PDF output, CSP/HSTS hardening.
  • Next.js 16
  • React 19
  • TypeScript
  • Postgres (Neon)
  • Drizzle
  • Better Auth
  • Anthropic SDK
  • TypeSafe (Jev)
  • MCP SDK
  • zod
  • Paddle
  • Vitest
  • Playwright + axe
  • npm workspaces
  • Vercel

Demo

16:9 loop, fake data

Architecture

system map
PilotBoard architectureBrowserclientMCP · REST · SDKclientsclient/api/v1 (auth, CSRF)appCore rules + fitscoringservicePostgres (Neon) +DrizzledataJob import runnerserviceGreenhouse · JSON-LD· ClaudeexternalPaddle webhooksexternalCron pruneinfra
  • Browser → /api/v1 (auth, CSRF): HTTPS
  • MCP · REST · SDK clients → /api/v1 (auth, CSRF): API keys
  • /api/v1 (auth, CSRF) → Core rules + fit scoring
  • Core rules + fit scoring → Postgres (Neon) + Drizzle: Drizzle
  • /api/v1 (auth, CSRF) → Job import runner: import URL
  • Job import runner → Greenhouse · JSON-LD · Claude: fetch + extract
  • Job import runner → Postgres (Neon) + Drizzle: leased steps
  • Paddle webhooks → /api/v1 (auth, CSRF): signed events
  • Cron prune → Postgres (Neon) + Drizzle: prune

Hardest decision

why it matters

A custom job-import runner persisted in Postgres, not Vercel Workflow SDK.

instead of

  • Vercel Workflow SDK, which I tested first and which worked.

why

It added a public flow route with weak auth, 381 packages and 2 high audit advisories. My runner is a Postgres state machine with lease-guarded steps tied to maxDuration, so a failed Claude call never re-runs paid steps.

Result

proof
  • Live demo at www.pilotboard.dev; payments and email are switched off.
  • Production smoke test: 12/12 passing.
  • About 2,000 unit and integration test cases, plus ~160 end-to-end.
  • Security-review gate before every milestone merge.

AI that does the tedious part of the work, checked before it reaches you.Build something like this →Hiring? The 30-second version →

Chapter 3 of 4

Jarvis

Jarvis: a voice assistant that asks before it acts.

An always-on bilingual voice assistant for macOS that runs on Claude and starts, steers and approves live Claude Code sessions.

status
Personal tool in daily use (private repo)
period
Sep 2026 – Present

The problem

for whom

Hands-free control of my Mac, the web and my accounts. Voice was easy; the hard part was letting an AI act on real accounts only with my approval.

What I built

and with what
  1. 01Local wake word → Whisper speech-to-text → Claude → streaming ElevenLabs voice, with barge-in.
  2. 02Permission tiers enforced in code: read, local, outward, forbidden; outward actions need a spoken yes.
  3. 03Taint tracking, so text from the web or a repo can't trigger outward actions.
  4. 04Background coding and research jobs in isolated git worktrees (up to 3), steered from a three.js HUD.
  5. 05WhatsApp channel, linked-notes memory, and self-update in its own worktree.
  • Python 3.12
  • uv
  • Claude Agent SDK
  • openWakeWord
  • Whisper large-v3-turbo (MLX)
  • Silero VAD
  • ElevenLabs Flash 2.5
  • three.js
  • macOS LaunchAgent

Demo

16:9 loop, fake data

Architecture

system map
Jarvis architectureMic + wake wordclientWhisper STTserviceMind (Claude)appPolicy gateserviceTools / MacinfraSpeaker (ElevenLabs)externalClaude Code inworktreesserviceHUD (SSE)clientWhatsAppexternal
  • Mic + wake word → Whisper STT: audio
  • Whisper STT → Mind (Claude): text
  • Mind (Claude) → Policy gate: tool call
  • Policy gate → Tools / Mac: allowed
  • Mind (Claude) → Speaker (ElevenLabs): reply
  • Mind (Claude) → Claude Code in worktrees: jobs
  • Mind (Claude) → HUD (SSE): events
  • WhatsApp → Mind (Claude): messages

Hardest decision

why it matters

Enforce permissions in code, not in the prompt.

instead of

  • Prompt-only rules.
  • The first version's closed-set intent classifier.

why

A prompt can be argued with; a policy gate can't. General tools behind the gate, plus taint tracking, kept Jarvis flexible without trusting the model. A security review of self-update still found real holes, like a debug port treated as local. They're fixed.

Result

proof
  • In daily use, always on since Oct 2026.
  • First audio in about 0.6 s.
  • 8/8 risky-request evals passing.
  • About 1,900–2,000 tests; code is private.

Software that listens and acts, and asks before anything important.Build something like this →Hiring? The 30-second version →

Chapter 4 of 4

Quick

Quick: small shops, selling online.

A multi-tenant store and point-of-sale platform for Bolivian small businesses: subdomain storefronts, map-pin checkout, QR payments and courier hand-off.

status
Shipped · ran in production Jun–Oct 2026 · now paused
period
Jun 2026 – Oct 2026

The problem

for whom

Small Bolivian shops: addresses are unreliable, so checkout needs a map pin, and each payment must settle into the shop's own bank account.

What I built

and with what
  1. 01A storefront per shop, on its own subdomain.
  2. 02Map-pin checkout with a tax-invoice option.
  3. 03Per-shop QR payments: encrypted credentials, webhook plus a reconciliation cron.
  4. 04Order state machine with price snapshots and live tracking by magic link.
  5. 05Shop admin with reports and CSV, in-person POS with receipts, push alerts, courier API.
  • Next.js 16
  • React 19
  • TypeScript
  • Postgres (Neon)
  • Drizzle
  • zod
  • Tailwind CSS 4
  • MapLibre
  • web-push
  • Cloudflare R2
  • Caddy (on-demand TLS)
  • AWS EC2
  • GitHub Actions
  • Vitest
  • Playwright
  • PostHog

Demo

16:9 loop, fake data

Architecture

system map
Quick architectureCustomerclientCaddy (on-demand TLS)infraNext.js (tenant fromHost)appPostgres (Neon) + RLSdataQR payment providerexternalCloudflare R2 imagesinfraCourier APIexternalWeb push → shop adminserviceMagic-link trackingclient
  • Customer → Caddy (on-demand TLS): HTTPS
  • Caddy (on-demand TLS) → Next.js (tenant from Host)
  • Next.js (tenant from Host) → Postgres (Neon) + RLS
  • Next.js (tenant from Host) → QR payment provider: create QR
  • QR payment provider → Next.js (tenant from Host): webhook + reconcile
  • Next.js (tenant from Host) → Cloudflare R2 images: images
  • Next.js (tenant from Host) → Courier API: hand-off
  • Next.js (tenant from Host) → Web push → shop admin: order alerts
  • Magic-link tracking → Next.js (tenant from Host): order status

Hardest decision

why it matters

Per-shop QR payments, with a dormant fallback adapter.

instead of

  • Six other providers, evaluated after the first one turned out to be dead.

why

I rejected rails that forced a bank, settled in USDC, pooled every shop’s money, or needed sales onboarding. Per-shop QR pays each business straight into its own account. The fallback adapter keeps a second provider ready.

Result

proof
  • Shipped and ran in production Jun–Oct 2026; now paused.
  • About 1,260 test cases across 129 files.
  • 26 database migrations shipped.
  • CI/CD to AWS through GitHub Actions.

Your business selling online: your own store, QR payments and delivery on a map.Build something like this →Hiring? The 30-second version →

How I work

Built fast with AI. Checked like it matters.

I'm open about it: AI agents write a lot of my code. What makes it shippable is the process around them. Every feature starts as a written spec. Agents build in isolated branches. Separate review passes, and I, check the result. Nothing merges until types, lint, tests and CI pass. Sensitive work also gets a security review.

  1. 01SpecWrite down what "done" means first: scope, edge cases, and the tests that must pass.
  2. 02BuildAgents implement against the spec, each in its own git worktree, in parallel.
  3. 03GateTypecheck, lint, unit, integration and end-to-end tests in CI, plus security review on risky changes.
  4. 04ShipDeploy through CI, with migrations automated and a recovery path tested.

Speed isn't the risk. Skipping the checks is.

What the people I worked with say

Isaí consistently supports teammates and contributes to team productivity by collaborating on complex features, helping unblock others, and refining tasks before implementation. He communicates proactively to resolve blockers with both the team and client, follows strong engineering practices, and demonstrates openness to feedback during code reviews.

Cristian MotocheTech Lead · Stack Builders

Isaí takes strong ownership of the tasks he works on, asking the right questions and ensuring features are delivered polished and production-ready. He contributes positively to team collaboration, supports technical alignment between client and team, improves development workflows, and provides thoughtful code reviews at a peer engineering level.

Jota MartinezSoftware Engineer · Stack Builders

Isaí consistently delivers high-quality work and is recognized as a reliable and collaborative engineer, making him a great teammate to work with across teams and projects.

KieranClient · Stack Builders engagement

Isaí shows strong curiosity and initiative when improving the development environment, experimenting with tooling such as linters and editor extensions. He adapts quickly, learns fast, and provides reliable support during demanding periods while contributing to cleaner and more maintainable frontend code.

David BarreraTech Lead · Stack Builders
Contact

Hiring, or have a project? Let’s talk.

Hiring for a team

Email me →

Planning a project

Email me →