jfz
Available for collaborations · 2026

Juan Felipe
Zepeda.

Role
AI & product engineer
shipping complete platforms
AI & product engineer
Next.js · SwiftUI · Node · MCP
En sus propias palabras

“Innovation distinguishes between a leader and a follower” ~ Steve Jobs.

Scroll
zepedajuanfe9@gmail.com
Tools & platforms I work with
iOS · Apple
Swift
OpenAI
Anthropic Claude
JavaScript
TypeScript
Next.js
React
Node.js
PostgreSQL
WhatsApp API
Shopify
Vercel
Tailwind CSS
§ 01About

A builder of useful things — from native iOS to AI agents.

Headshot · 4:5
[ portrait placeholder ]

I build complete platforms — front-end, back-end, mobile, agents, and the infrastructure that ties them together. Native iOS, Next.js, Node.js APIs, real-time systems, and AI-native architectures (RAG, function calling, MCP servers, multi-agent orchestration).

My flagship is the Yantissimo platform — a tire and wheel distributor's complete digital stack: native iOS app, Express backend, headless Shopify storefront. I built all three. I move and iterate fast. I prefer leverage over surface area: a single self-hosted gateway over per-agent BSPs, a pure-logic core package over duplicated UI logic, a hand-written iOS APIClient over a third-party SDK.

Based in
Mexico
Open to
Remote / Hybrid · Senior IC
Studying
Data Science
Speaks
ES · EN
§ 02What I deliver

Five services. Each one ships to production.

Plain deliverables, real recent examples. No jargon, no demos that never see customers.

§ 01

Web & E-commerce

Storefronts and web platforms that sell, schedule, and run the operation.

  • Headless storefront with custom search and checkout
  • Payment links and appointment scheduling
  • Admin dashboards for the back-office team
Recent exampleYantissimo · Llantísimo storefront
§ 02

Mobile Apps (iOS)

Native iOS apps that work offline, send push, and feel like the platform — not a wrapped website.

  • Customer-facing iOS app on TestFlight or the App Store
  • Offline cache, push notifications, eternal session login
  • Backend integration tested end-to-end
Recent exampleYantissimo iOS
§ 03

AI Automation

AI that does real work — not a chatbot demo. Document classification, sales follow-up, smart scheduling.

  • Automated message triage and reply across WhatsApp / Telegram
  • Knowledge base that answers across documents and spreadsheets
  • Recommendation and routing engines tied to your real catalog
Recent exampleNexora Sales Agent · DataKnife
§ 04

Enterprise Integrations

I connect the tools you already pay for so they stop being silos.

  • WhatsApp, Telegram, Email, and voice flows under one roof
  • Shopify, payment, and accounting integrations
  • Google Workspace + ERP bridges with audit logs
Recent exampleWhatsApp Gateway · Shopify · Google Sheets bridge
§ 05

Internal Systems

ERPs, dashboards, and tooling tailored to how your team actually works.

  • Order management, inventory, scheduling, and reporting
  • Role-based access for ops, sales, and admin
  • Real-time collaboration where it matters
Recent exampleYSSM ERP
§ 02Tech stack

What I work with — by domain, with proof of production.

No skill bars. Each group lists where it's shipped, in production, today.

01 · Backend

Backend

Production Express APIs with real test coverage, async jobs, modular middleware.

Node.js 20+ExpressBunFastifyMulterJest + Supertest
Shipped in
  • Yantissimo Backend (167 files / 7.3k LOC, 41 routes)
  • WhatsApp Gateway
02 · Frontend

Frontend

Next.js App Router + React 19 + TypeScript + Tailwind. Server Components, edge middleware.

Next.js 15 / 16React 19TypeScriptTailwind CSS 4shadcn/uiCodeMirror 6Recharts
Shipped in
  • Yantissimo Shop
  • YSSM ERP (450 files)
  • Overtree
  • DataKnife
03 · Mobile

Mobile

Native iOS, MVVM, zero external deps where it matters.

Swift 5.9SwiftUI (iOS 16+ / 18)Network.framework / NWConnectionKeychainMapKitPhotos.frameworkHealthKitAPNs (Push)C FFI (LibSignal)
Shipped in
  • Yantissimo iOS (68 files, 0 SPM/Cocoapods)
  • Smoke Signals (Signal protocol)
  • Fitness Copilot
04 · AI

AI

Direct SDK use (not wrappers). Function calling with safety guards, hybrid RAG, MCP.

OpenAI SDKAnthropic Claude SDKOpenAI ChatKitVector StoresRealtime APIModel Context Protocol (MCP)Hybrid RAG
Shipped in
  • DataKnife (vector + SQL hybrid)
  • Overtree (12-tool MCP server)
  • Nexora Sales Agent
05 · Real-time

Real-time

CRDTs, WebSockets, voice, multi-channel messaging.

Yjs (CRDTs)y-codemirror.nexty-websocketwsBaileys (WhatsApp)Twilio Voice / Studio / Flex
Shipped in
  • Overtree (LAN multicursor)
  • WhatsApp Gateway (multi-tenant)
  • Smoke Signals
06 · Cloud / DevOps

Cloud / DevOps

Vercel + Railway production deploys. CI/CD via GitHub Actions, Electron for desktop.

VercelRailwayGitHub Actionspnpm WorkspacesTurboElectron + electron-builderBackblaze B2
Shipped in
  • YSSM ERP (Vercel CI)
  • Yantissimo Backend (Railway)
  • Karate (.dmg/.exe/.AppImage)
07 · Data

Data

Postgres-first, Supabase RPC for security-definer functions, Shopify GraphQL, schema design.

PostgreSQLMySQLSupabase (RPC, security definer)Shopify Admin & StorefrontWheel-Size APIGoogle Workspace APIs
Shipped in
  • Yantissimo (PG + MySQL + Shopify)
  • DataKnife (Supabase RPC)
  • Nexora Agent
08 · Auth & Security

Auth & Security

JWT RS256 with on-device keypair generation, Keychain on iOS, iron-session on web.

JWT (RS256)bcryptiron-sessionKeychain (iOS)401 refresh-retrySignal protocol (Smoke Signals)
Shipped in
  • Yantissimo iOS
  • Karate (RS256 keypair on first launch)
  • Smoke Signals
§ 03How I work

Six steps from first call to live system.

Sin sorpresas, sin cajas negras. Cada hito tiene un entregable concreto.

01

Análisis

Una llamada larga sobre el problema real: quién lo vive, qué cuesta hoy, qué pasa si no se resuelve. Mapeo procesos y datos antes de hablar de tecnología.

Diagnóstico escrito · 1–3 días
02

Propuesta

Alcance, entregables, hitos y precio cerrado. Sin sorpresas a mitad del proyecto. Si algo crece, se renegocia explícitamente.

Propuesta + plan de hitos
03

Desarrollo

Itero en sprints cortos, mostrando avances reales en cada uno. Tu equipo ve el sistema crecer; nada de cajas negras.

Acceso a versión de pruebas desde la semana 1
04

Testing

Pruebas con datos reales, casos límite, y los flujos que tu operación ejecuta a diario. Cuando algo se rompe, tiene que romperse aquí — no en producción.

Reporte de pruebas + ajustes
05

Despliegue

Salida controlada con rollback listo. Te entrego la documentación de operación y un walkthrough en vivo con tu equipo.

Sistema en producción + documentación
06

Soporte

Acompañamiento posterior con SLA acordado. Resolución rápida, mejoras priorizadas, y reportes mensuales si los necesitas.

SLA + canal directo de comunicación
§ 03Work

Where I've shipped.

2025 — present

AI & Product Engineer

·Yantissimo / Llantísimo
  • Built the customer-facing iOS app, Express backend, and headless Shopify storefront end-to-end — the company's complete digital surface.
  • Shipped multi-channel AI sales agent across Telegram + WhatsApp with OpenAI tool calling, scheduled reminders, Backblaze media.
  • Stack: Swift 5.9 / SwiftUI, Node.js 20 / Express, PostgreSQL, Shopify Admin & Storefront, OpenAI, Railway + Vercel.
Mexico · Hybrid
2025 — present

Independent AI Engineer

·AI Lab (open / contract)
  • Hybrid RAG platform (DataKnife) — vector store + Supabase RPC with custom SELECT-only SQL safety guards via OpenAI ChatKit.
  • Local-first LaTeX editor (Overtree) with Yjs CRDT collaboration and an MCP server exposing 12 tools across 3 transports.
  • Self-hosted multi-tenant WhatsApp gateway powering a fleet of internal agents — Baileys + Neon Postgres + Next.js dashboard.
Remote
2024 — 2025

Data Science Student

·[ University ]
  • Coursework in machine learning, statistics, and applied AI.
  • Independent projects in LLM applications, retrieval systems, and data pipelines.
Mexico
§ 04Flagship platform

Yantissimo. Three products, one platform.

Custom enterprise ERP powering a tire & wheel distributor — 24+ modules across audit, sales, scheduling, productivity, and warranties, plus the API, native iOS app, and storefront it feeds.

The operational backbone of an entire automotive distribution business.

Yantissimo Platform is the custom enterprise ERP I built for Llantísimo, a tire and wheel distributor in Mexico — and the satellite backend and storefront it feeds. The platform runs daily operations: parsing Microsip exports for next-day audits, computing technician and salesperson productivity, generating quotes and invoices, scheduling installations, managing wholesale and retail orders, tracking warranties, and surfacing live KPIs. The whole organization works inside it.

  • Replaces a stack of spreadsheets, Microsip exports, and ad-hoc tools with one daily-used operational system.
  • Daily audit module reads Microsip data, validates technician/vendor performance, lets admins reassign labor (MO) and justify exceptions — with a soft-block before end-of-day close.
  • Live productivity dashboards for vendors and technicians; PDFs for quotes and post-service checks generated in-app.
  • Real-time collaboration via Socket.io — multiple team members work the same orders and audits simultaneously.
  • Customer-facing storefront and downstream apps share the same backend and data model — one source of truth.
  • Production deployed: ERP and storefront on Vercel with PR-preview CI, backend on Railway, native iOS app on TestFlight, all behind one Postgres.

A 24-module Next.js 16 ERP, an Express orchestration backend, a native SwiftUI iOS client, and a headless Shopify storefront — one Postgres, one team.

Production four-surface platform. The ERP is a Next.js 16 (App Router + Turbopack) app with route groups for protected staff, client portals, and public surfaces, plus 24+ feature modules ranging from auditoría (Microsip parser + KPI engine + reassignment workflow) to suite (sales / quotes / payments / invoices), mayoreo (wholesale), calendarios, equipo, garantías, and an embedded AI agent panel. The Express backend is the API the ERP, the iOS client, and the storefront all call into. The iOS client is hand-written SwiftUI with zero external dependencies. The storefront is a headless-Shopify Next.js front-end with vehicle-search wired through Wheel-Size API.

ERP YSSM (plataforma): Next.js 16.0 App Router with Turbopack, route groups for (protected)/(clientes)/(public)/api, Material UI + HeroUI + custom Tailwind 4 design tokens, FullCalendar + react-big-calendar + react-date-range for scheduling, Recharts for KPIs, react-dnd for drag-and-drop, Socket.io for real-time collaboration, jspdf + jspdf-autotable for in-app PDF generation, xlsx for Excel exports/imports, libphonenumber-js for phone normalization, bcrypt for auth. The auditoría module ships its own pure-function calc layer (lib/excel/parseAuditoria.js, lib/calc/reasigMO.js), state via AuditoriaContext with patchSession persistence, and a 60-test suite under tests/auditoria/ run via node --import register. Backend (yssm-backend) is Express + Postgres + MySQL with 41 modular routes, Shopify Admin/Storefront SDKs, OpenAI, Backblaze B2, Google Sheets, Puppeteer, and Jest + Supertest tests. Storefront extends Vercel's Next.js Commerce template with a custom 'Por auto' flow.

  • 447 source files in the ERP alone; 24+ feature modules under (protected)/ — auditoría, ventas, suite, mayoreo, ordenes, cotizaciones, calendario, equipo, dashboard, agent, claude, campanas, configuracion, garantias, inventario, reports, ramps, seguimiento, todo, snapshots, administracion, myr, plus a (clientes) portal.
  • Real-time multi-user collaboration via socket.io-client across panels.
  • Auditoría module: Microsip Excel parser (parseAuditoria.js, ~550 LOC), pure-function reassignment helpers (reasigMO.js), context-driven state with patchSession persistence, soft-block end-of-day workflow, 60 tests under tests/auditoria/.
  • PDF generation in-app with jspdf + jspdf-autotable (quotes, post-service checks, invoices).
  • Excel import/export with xlsx; Microsip integration via custom parser bridge.
  • FullCalendar + react-big-calendar + react-date-range for service scheduling and team calendars.
  • Recharts dashboards for vendor + technician productivity KPIs.
  • Material UI + HeroUI + Tailwind 4 — heavy custom component library under src/components/{suite,mayoreo,orders,client,tables,modal,ItemModal}.
  • Express backend: 167 files, 41 routes, Jest + Supertest test coverage, async job queue.
  • Embedded AI agent panel inside the ERP itself (/agent route) plus a /claude route — internal staff get LLM help in-context.
  • PR-preview CI via GitHub Actions on the ERP repo.
Three coordinated products
Product 01
Operational ERP — daily-used backbone of the business

Plataforma Yantissimo (ERP YSSM)

447 source files · 24+ feature modules · 60 audit tests

24+ modules under (protected)/: auditoría, ventas, suite, mayoreo, ordenes, cotizaciones, calendario, equipo, dashboard, agent, claude, campañas, configuración, garantías, inventario, reports, ramps, seguimiento, todo, snapshots, administración, myr — plus a (clientes) portal.

  • 24+ modules under (protected)/: auditoría, ventas, suite, mayoreo, ordenes, cotizaciones, calendario, equipo, dashboard, agent, claude, campañas, configuración, garantías, inventario, reports, ramps, seguimiento, todo, snapshots, administración, myr — plus a (clientes) portal.
  • Auditoría: Microsip Excel parser + pure-function MO reassignment helpers + context-driven state with patchSession persistence + 60-test suite.
  • Real-time collaboration with Socket.io — multi-user editing of audits, orders, and dashboards.
  • Embedded AI agent (/agent) and /claude route — internal staff get LLM help in-context.
  • PDF generation (jspdf + jspdf-autotable) for quotes, invoices, and post-service checks.
  • FullCalendar + react-big-calendar + react-date-range for service scheduling.
  • Recharts dashboards: live vendor + technician productivity KPIs.
  • Drag-and-drop order management via react-dnd.
  • PR-preview CI via GitHub Actions.
Next.js 16React 18TurbopackMaterial UIHeroUITailwind CSS 4FullCalendarRechartsSocket.ioreact-dndjspdfxlsxPostgreSQLVercel
Product 02
API + orchestration layer feeding the ERP, iOS app, and storefront

Yantissimo Backend (yssm-backend)

167 source files · ~7.3k LOC · 41 route modules

41 modular routes: auth, mobile-app, services, quotes, ventas, dashboard, shopify, scrapper, calendar, formula, qr, cron, liquidaciones, invoices, snapshot, …

  • 41 modular routes: auth, mobile-app, services, quotes, ventas, dashboard, shopify, scrapper, calendar, formula, qr, cron, liquidaciones, invoices, snapshot, …
  • Real test coverage with Jest + Supertest; ESLint + Prettier configured.
  • Direct Shopify Admin + Storefront integration with cookie-jar auth and signed webhooks.
  • Backblaze B2 for media; Google Sheets bridge for back-office reporting.
  • OpenAI integration powering sales recommendations and customer message triage.
  • Async job queue for long-running tasks; cron module for scheduled jobs.
Node.js 20ExpressPostgreSQLMySQLShopify SDKsOpenAIBackblaze B2Google SheetsPuppeteerJestSupertestRailway
Product 03
Native customer-facing iOS app

Yantissimo iOS

68 Swift files · ~7.1k LOC · 541 LOC of tests

Zero external dependencies — no SPM packages, no CocoaPods.

  • Zero external dependencies — no SPM packages, no CocoaPods.
  • Custom APIClient with one-shot 401 refresh retry and 'eternal session' so customers never get logged out at the worst moment.
  • 10+ feature modules: Onboarding, Home, Profile, Club, Convenios, Promotions, Reminders, Visits, Quotes, Postchecks.
  • Application Support cache hydrates UI before the network call — the app opens with content even offline.
  • Feature flags (e.g. SMS-OTP gate) controlled at compile time via xcconfig.
  • Push notifications wired through PushManager → backend device registration.
  • Per-build-config backend URLs (Debug → localhost, Release → Railway).
Swift 5.9SwiftUIiOS 16+Network.frameworkKeychainApplication SupportAPNsxcconfig
Product 04
Headless customer-facing storefront

Yantissimo Shop

~116 source files · server components + edge middleware

Vehicle search ('Por auto') wired through Wheel-Size API into the Shopify catalog — customers find tires by make / model / year.

  • Vehicle search ('Por auto') wired through Wheel-Size API into the Shopify catalog — customers find tires by make / model / year.
  • React Server Components, Server Actions, Suspense, useOptimistic.
  • Edge middleware for routing and revalidation.
  • Integrated with the same backend cart, checkout, and customer record as the ERP and iOS client.
Next.js 15.6React 19TypeScriptTailwind CSS 4Shopify Storefront GraphQLWheel-Size APIVercel
Before vs after — the operational impact
→ Antes

Antes — operación manual

  • Atención al cliente atada a horario laboral por WhatsApp.
  • Sin app — los clientes no podían ver vehículos, citas ni estatus.
  • Cotizaciones y reservas hechas a mano, en hojas y mensajes.
  • Catálogo y precios solo en cabeza del equipo de ventas.
  • Pagos coordinados manualmente, sin link directo.
→ Hoy

Hoy — plataforma operando 24/7

  • Clientes se autoatienden 24/7: ven, cotizan, agendan y pagan.
  • App iOS nativa con sesión eterna y push de recordatorios.
  • Storefront público con búsqueda por auto (marca/modelo/año).
  • Catálogo único en Shopify, sincronizado en los tres frentes.
  • Agente IA en WhatsApp / Telegram filtra y atiende sin parar.
Case study — engineering depth
AProblem
The distributor had a real catalog, real customers on WhatsApp, and zero coordinated digital surface. Sales lived in the heads of three people; pricing changes lived in a spreadsheet; appointments were booked verbally. Building a unified front-end wasn't enough — the system had to integrate with the existing Shopify catalog, persist a session graph for thousands of customers, and stay reliable enough that an iOS client could cache it and open offline.
▣ system topology

                          ┌──────────────────────────────────┐
                          │           CUSTOMERS               │
                          │   iOS app · Web shoppers · Sales  │
                          └───────────────┬──────────────────┘
                                          │
            ┌───────────────────┬─────────┴─────────┬───────────────────┐
            │                   │                   │                   │
            ▼                   ▼                   ▼                   ▼
   ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐
   │   YANTISSIMO     │  │   YANTISSIMO     │  │   YSSM ERP       │  │  NEXORA AGENT    │
   │   iOS APP        │  │   STOREFRONT     │  │   (back-office)  │  │  (sales agent)   │
   │                  │  │                  │  │                  │  │                  │
   │ Swift 5.9        │  │ Next.js 15.6     │  │ Next.js 16       │  │ Node.js          │
   │ SwiftUI          │  │ React 19         │  │ App Router       │  │ Telegram + WA    │
   │ APIClient w/     │  │ Server Comps     │  │ MUI · Tailwind   │  │ OpenAI tools     │
   │  401 retry       │  │ Edge middleware  │  │ Socket.io        │  │ Cron reminders   │
   │ Keychain · Cache │  │ Wheel-Size API   │  │ GitHub Actions   │  │                  │
   │ APNs             │  │                  │  │ CI / Vercel      │  │                  │
   └─────────┬────────┘  └─────────┬────────┘  └─────────┬────────┘  └─────────┬────────┘
             │                     │                     │                     │
             └─────────────────────┴──────────┬──────────┴─────────────────────┘
                                              │   HTTPS / JSON / JWT
                                              ▼
                          ┌──────────────────────────────────┐
                          │      EXPRESS API (Node 20)        │
                          │   yssm-backend · 167 files        │
                          │                                  │
                          │   41 routes  ·  middleware stack │
                          │   JWT auth   ·  401 refresh      │
                          │   Job queue  ·  scheduled cron   │
                          │   Jest + Supertest tests         │
                          └────┬──────┬──────┬───────┬──────┘
                               │      │      │       │
       ┌───────────────────────┘      │      │       └──────────────────────────┐
       │                              │      │                                  │
       ▼                              ▼      ▼                                  ▼
┌──────────────┐            ┌──────────────┐  ┌──────────────┐         ┌──────────────┐
│  PostgreSQL  │            │    MySQL     │  │   Shopify    │         │   OpenAI     │
│  (primary)   │            │ (legacy ETL) │  │  Admin + SF  │         │  GPT + tools │
│  pg-format   │            │              │  │   GraphQL    │         │              │
└──────────────┘            └──────────────┘  └──────────────┘         └──────────────┘

┌──────────────┐            ┌──────────────┐  ┌──────────────┐         ┌──────────────┐
│  Backblaze   │            │  Google      │  │   Puppeteer  │         │   APNs       │
│  B2 (media)  │            │  Sheets      │  │   (payment   │         │   (push)     │
│              │            │  bridge      │  │   verify)    │         │              │
└──────────────┘            └──────────────┘  └──────────────┘         └──────────────┘

         Deploy:  Backend → Railway        Storefront / ERP → Vercel
                  iOS → TestFlight         Auth keys → Keychain (iOS) / Postgres (server)
BTradeoffs
  • Express over Nest/Fastify. I traded a heavier framework's structure for surgical control over middleware and route composition. With 41 routes and a real test suite, the trade has paid off in audit speed.
  • Zero-dep iOS APIClient. Skipped Alamofire/Moya so I owned the 401 refresh-retry semantics, the cache hydration order, and the eternal-session contract. Worth the extra ~300 LOC.
  • Postgres + MySQL coexisting. Postgres for the new transactional layer; MySQL kept for legacy ETL while we migrate. Cheaper than a big-bang and recoverable per-table.
  • Headless Shopify, not custom checkout. Shopify is the source of truth for catalog/checkout — building those from scratch would've been a year of compliance work. Storefront API + custom search wins instead.
  • OpenAI tools with explicit budget. The Nexora agent uses OpenAI tool calling, but every conversation has hard turn + cost ceilings. Cheaper than fine-tuning and easier to iterate.
CImplementation snippets

Two of the highest-leverage decisions in code. Both are simplified for legibility — the actual implementations have additional logging, retries, and instrumentation.

Swift·yantissimo/Core/Network/APIClient.swift
func send<T: Decodable>(_ ep: APIEndpoint) async throws -> T {
    var req = try await build(ep)
    let (data, resp) = try await URLSession.shared.data(for: req)

    guard let http = resp as? HTTPURLResponse else { throw APIError.transport }
    if http.statusCode == 401, !ep.isAuthRoute, await refreshOnce() {
        // refresh succeeded → re-sign and retry exactly once
        req = try await build(ep)
        let (data2, resp2) = try await URLSession.shared.data(for: req)
        return try decode(T.self, data2, resp2)
    }
    return try decode(T.self, data, resp)
}

// shared single-flight refresh — concurrent 401s share one round-trip
private func refreshOnce() async -> Bool {
    if let inflight = self.refreshTask { return await inflight.value }
    let task = Task<Bool, Never> {
        defer { self.refreshTask = nil }
        return await self.performRefresh()
    }
    self.refreshTask = task
    return await task.value
}
why401 → /auth/refresh → retry once. If the refresh itself fails, the user is bounced to Welcome — never two consecutive failures, never silent token expiry.
TypeScript·company-brain/src/lib/openai/sql-tool.js
export async function onSqlTool({ sql }) {
  const trimmed = sql.trim().replace(/;\s*$/, "");
  if (!/^\s*(select|with)\b/i.test(trimmed)) {
    return { error: "Only SELECT (or WITH … SELECT) is allowed." };
  }

  // force LIMIT when missing — runaway scans are the #1 OOM cause here
  const sqlWithLimit = /\blimit\s+\d+/i.test(trimmed)
    ? trimmed
    : `${trimmed} LIMIT 200`;

  // server-only: service role key never reaches the client
  const { data, error } = await supabase.rpc(SQL_RPC, {
    [SQL_ARG]: sqlWithLimit,
  });
  if (error) return { error: error.message };

  return { rows: data, rowCount: Array.isArray(data) ? data.length : 0 };
}
whyOpenAI ChatKit tool that lets a non-technical user ask in plain language. SELECT-only guard + auto LIMIT means the worst case is "wrong answer", never "dropped table".
DResults
  • Customers self-serve the full quote → payment → appointment loop without a sales rep on the line.
  • iOS app opens with content even before the first network call — Application Support cache hydrates the views on launch.
  • Backend test suite (Jest + Supertest) gates merges on Railway via a small CI script; no test, no deploy.
  • Storefront 'Por auto' search resolves vehicle → tire-size → in-stock SKUs in <300 ms thanks to a thin GraphQL projection over Shopify.
  • Nexora agent handles routine inbound on Telegram + WhatsApp 24/7, escalating to humans only when the conversation enters a configured trigger set.
ELearnings
  • Owning the network layer end-to-end on iOS paid back instantly — every bug after launch has been a 5-minute breakpoint, not a third-party SDK detective hunt.
  • A modest test suite at the API boundary catches more regressions than fine-grained unit tests of business logic. Boundary-first.
  • Shopify's webhook contract is more reliable than its REST poll path — webhook-driven sync + idempotency keys removed an entire class of inventory drift.
  • OpenAI tool calling beats prompt-only RAG when the answer needs to mutate state. The agent that books a service is more useful than the one that describes it.
  • When the operations team can edit a JSON file, they don't need a feature request. Admin panel JSON editor saved at least a sprint.
§ 05Selected work

Things I've built recently.

Each one is a real product: shipped, used, and built end-to-end. Toggle Technical for stack and architecture detail.

Featured deep
F · Health & Fitness
AI CoachingFeatured · deep

Fitness Copilot

AI-assisted fitness, nutrition, and training companion for iOS, backed by Supabase + Claude.

Fitness Copilot is an iOS app that combines macro tracking, weekly training plans, lab-result reading, and an AI coach in one place. The app is bilingual-ready (currently Spanish) and designed around how athletes actually use their phone — quick logging, glanceable timelines, and AI conversations that have real context about your goals, allergies, and recent labs.

  • All your fitness context — diet, workouts, labs, supplements — lives in one place the AI can reason over.
  • Daily timeline view shows what's next without forcing the user to navigate menus.
AI CoachingHealth TrackingMacro Logging

Tab-based SwiftUI with a clean MVVM layer. Auth bootstraps via a centralized AuthService injected through a custom environment key. The backend (Supabase) holds dietary plans, lab reports, supplement schemas, and HealthKit-synced metrics. An Edge Function calls Claude with rich dietary context to generate supplement suggestions.

Architecture

FitnessApp bootstraps AuthService via @StateObject. Repository is injected via a custom EnvironmentKey (\.repository) so views can swap between live and mock implementations cleanly. Theme tokens (Tokens / F / CardStyle) are abstracted away from views. NEXT_STEPS roadmap details HealthKit observable wiring, supplement RLS policies, and the Claude Edge Function contract.

  • Six-tab SwiftUI layout: Dieta · Ejercicios · IA · Cronograma · Perfil · Suplementos.
  • MVVM with environment-driven dependency injection (\.repository) for testable views.
  • Theme tokens abstracted into Tokens / F / CardStyle — runtime-switchable card visual style.
  • Supabase backend with HealthKit-synced metrics (daily_energy, exercise_minutes, HRV, weight).
  • Anthropic Edge Function (functions/suggest_supplements) for dietary context-aware suggestions.
  • Bundle id com.zepedajuanfe.Fitness; iOS 18 deployment target; Swift 5.
Swift 5SwiftUIiOS 18SupabaseAnthropic ClaudeEdge FunctionsHealthKit
Swift 5SwiftUIiOS 18SupabaseAnthropic ClaudeEdge FunctionsHealthKitAI CoachingHealth TrackingMacro LoggingLab Report AnalysisSupplement Suggestions
K · Logistics & Fleet Operations
Route Optimization (VRP)Featured · deep

Kiosko Logistics

Vehicle Routing Problem (VRP) visualizer with smooth MapKit truck animation, scoring formulas, and threshold tuning.

Kiosko Logistics is a route-planning dashboard for fleet operators. It animates trucks along their assigned routes on a real map, shows live scoring against custom formulas, and lets operators tune the constraints (time windows, capacity, distance weighting) without touching a config file.

  • Operators can see a route plan come alive — trucks animate smoothly along their actual paths.
  • Scoring formulas are user-editable; thresholds for 'good / acceptable / poor' are tunable presets.
Route Optimization (VRP)Logistics VisualizationMap Animation

VRP is NP-hard; the app is the visual & tuning surface for an upstream solver. The dashboard models VRP configuration, solution parsing, formula presets, and scoring thresholds as separate domain objects. Truck animation interpolates positions along route polylines without map jank.

Architecture

Observable view models (modern Swift macro-based observation, not @ObservableObject) for VRPConfig, Dashboard, and RouteAnimation. RouteAnimationViewModel runs an async loop with Task.sleep(for: .milliseconds(50)) to walk truck position along the route polyline. Formula presets and threshold configs are value types so they can be diffed and persisted.

  • Smooth route animation using Task.sleep + interpolation along CoreLocation polylines.
  • Modern Swift Observable pattern (not legacy ObservableObject).
  • Domain-rich models: VRPConfig, VRPSolution, FormulaPreset, ScoreThreshold.
  • MapKit overlays for routes, stops, and live truck position.
  • Test scaffolding present (UI tests + unit tests).
SwiftSwiftUIObservableMapKitCoreLocationiOS 17+
SwiftSwiftUIObservableMapKitCoreLocationiOS 17+Route Optimization (VRP)Logistics VisualizationMap AnimationConstraint Tuning
DK · Enterprise Knowledge & BI
RAGFeatured · deep

DataKnife (Company Brain)

Hybrid RAG platform: documents → OpenAI Vector Store, structured data → Supabase, all answered through one ChatKit interface.

DataKnife is a single chat surface that answers questions across both unstructured documents (PDFs, contracts, manuals) and structured data (CSVs, Excel, database tables). Documents are vectorized; tabular data is queried via SQL. The user just asks the question — the system routes it correctly.

  • One chat answers across documents, spreadsheets, and databases.
  • SQL queries are validated server-side: SELECT-only, LIMIT enforced — safe for non-technical users.
RAGHybrid Document + SQL SearchFunction Calling

Documents are uploaded, classified, and pushed to an OpenAI Vector Store ready for ChatKit retrieval. Structured files (CSV/Excel) hit a Supabase RPC. The custom sql-tool function call validates that every query is SELECT-only or WITH ... SELECT, force-injects LIMIT when missing, and executes via supabase.rpc against a security-definer Postgres function.

Architecture

Next.js 16 App Router with React 19. OpenAI ChatKit React SDK is mounted in a right-side panel. onClientTool registers a custom 'execute_sql' tool. The tool route (/api/tools/sql) parses the SQL with a regex/tokenizer pass to enforce SELECT-only + LIMIT, then calls Supabase via the service role key (server-only). The vector ingestion route (/api/uploads/documents) classifies file types and routes to either the Vector Store API or the structured pipeline placeholder.

  • Custom OpenAI ChatKit tool ('execute_sql') registered via onClientTool.
  • SELECT-only / WITH-only SQL guard with auto LIMIT enforcement.
  • Supabase security-definer Postgres function executed via RPC (service role key, server-side only).
  • Document classification → OpenAI Vector Store with metadata tagging.
  • Spanish-language UI; designed for real Mexican enterprise users.
  • Modern stack: Next.js 16.2 + React 19.2 + Tailwind 4 + shadcn primitives.
Next.js 16React 19TypeScriptTailwind CSS 4OpenAI ChatKitOpenAI Vector StoreSupabasePostgreSQL+1
Next.js 16React 19TypeScriptTailwind CSS 4OpenAI ChatKitOpenAI Vector StoreSupabasePostgreSQLshadcn/uiRAGHybrid Document + SQL SearchFunction CallingConversational BIData IngestionVector Search
OT · Developer Tools / Writing
Collaborative Editing (CRDTs)Featured · deep

Overtree

Local-first LaTeX editor with LAN collaboration, an MCP server, and the Tectonic compiler — Overleaf, but everything lives on your machine.

Overtree is a LaTeX editor that runs on your laptop. Files are real folders you can git, back up, or copy. Anyone on your network joins by URL. And — most distinctive — Claude Desktop, ChatGPT Desktop, and Claude Code can connect directly via MCP to read, edit, and compile your projects, with edits appearing live in the editor.

  • Replaces Overleaf for users who want local-first ownership of their files.
  • Real-time multicursor collaboration on a LAN — no cloud, no per-seat fee.
Collaborative Editing (CRDTs)Local-FirstMCP Server

Next.js 16 App Router app with a custom server that hosts both the Yjs WebSocket sync protocol and the MCP server. CodeMirror 6 with stex (LaTeX) syntax. Iron-session for auth. Three MCP transports run simultaneously: stdio for Claude Desktop and Claude Code, HTTP/SSE for ChatGPT Desktop, and Node.js direct for in-process tools.

Architecture

Next.js 16 + React 19 + CodeMirror 6 frontend bound to a Yjs document via y-codemirror.next. Server-side Yjs WebSocket protocol handler (y-websocket) plus a chokidar file watcher that reflects on-disk changes back into the shared CRDT — meaning AI edits propagate instantly to connected editors. MCP server exposes 12 tools: list_projects, create_project, delete_project, list_files, read_file, write_file, edit_file, delete_file, compile, get_compile_log, get_pdf, get_project_info, list_templates. Tectonic invoked via subprocess; PDFs rendered with pdf.js.

  • Yjs CRDTs with WebSocket sync (y-codemirror.next + y-websocket + y-protocols).
  • MCP server with 12 tools, three simultaneous transports (stdio, HTTP/SSE, in-process).
  • Chokidar file watcher syncs disk → CRDT → connected editors.
  • Tectonic LaTeX engine invoked via subprocess; pdf.js for in-browser PDF preview.
  • Iron-session auth with per-project name + password.
  • LAN-friendly: prints local IP on startup; firewall guidance documented.
  • Templates: article, beamer, report, letter, ieee, blank.
  • Electron desktop wrapper builds via electron-builder for macOS distribution.
Next.js 16React 19TypeScriptYjsCodeMirror 6MCP SDKTectoniciron-session+2
Next.js 16React 19TypeScriptYjsCodeMirror 6MCP SDKTectoniciron-sessionElectronBunCollaborative Editing (CRDTs)Local-FirstMCP ServerLaTeX CompilationAI-NativeDesktop App
Featured
CR · Data Science & Analytics
Data Mining (CRISP-DM)Featured

CRISP-DM Workbench

Dual-LLM (Claude + GPT-4o) workbench for the CRISP-DM data-mining lifecycle, with a Python pipeline for prep, modeling, and evaluation.

CRISP-DM is the industry-standard process for data-mining projects (Business Understanding → Data Understanding → Preparation → Modeling → Evaluation → Deployment). This workbench gives an analyst LLM-assisted help at every stage, switching between Claude 3.5 and GPT-4o depending on the task.

  • Analysts move through the full CRISP-DM cycle with model help at each stage.
  • Switch between Claude 3.5 Sonnet and GPT-4o per task — the right model for the right step.
Data Mining (CRISP-DM)Multi-LLMStreaming

Direct Anthropic SDK 0.78 and OpenAI SDK 6.29 — no chat-wrapper. The UI surfaces a model-selector and per-stage prompt templates. A Python pipeline (analyzer.py, processor.py, modeler.py) handles preprocessing, modeling, and evaluation.

Architecture

Next.js 16 + React 19 frontend with file uploads via Multer. Streaming responses from both providers. Recharts for evaluation visualizations. Python ML stack invoked via subprocess (numpy / pandas implied by processor signatures).

  • Direct Anthropic + OpenAI SDK use, not a wrapper library.
  • Per-stage prompt templates aligned to CRISP-DM phases.
  • Python compute layer for heavy preprocessing and modeling.
  • Streaming-aware UI with Recharts evaluation views.
  • ESM Next.js 16 + React 19 + Tailwind 4.
Next.js 16React 19Anthropic SDKOpenAI SDKPythonpandasnumpyRecharts+1
Next.js 16React 19Anthropic SDKOpenAI SDKPythonpandasnumpyRechartsMulterData Mining (CRISP-DM)Multi-LLMStreamingPython Compute IsolationEvaluation Charts
WA · Messaging Infrastructure
Messaging InfrastructureFeatured

WhatsApp Gateway

Self-hosted multi-tenant WhatsApp message broker with token-scoped REST API and a read-only monitoring dashboard.

Instead of paying a third-party WhatsApp gateway per agent, this is a single self-hosted broker that any number of internal projects (CRMs, agents, automation flows) can talk to. Each project gets its own token; some projects can read replies, others only send. The dashboard monitors all of it in one place.

  • Replaces an expensive per-agent WhatsApp BSP with one shared self-hosted gateway.
  • Multi-tenant by design — each agent has scoped credentials and its own session graph.
Messaging InfrastructureMulti-tenant APIExactly-Once Delivery

Two-service pnpm workspace: an Express server that talks WhatsApp via Baileys and persists everything to Neon Postgres, and a Next.js 15 dashboard that consumes the gateway's own REST API. Authentication is three-header: master token, project token, project name.

Architecture

Express + Baileys server with rate-limiting (1 send/sec). Sessions are auto-created per phone+project; subsequent sends reuse the session unless explicitly forced fresh. The /messages/session/:id/unread endpoint marks-as-read on the same call — guaranteeing exactly-once inbound delivery to subscribed agents. SSL is auto-detected based on the Postgres host (Railway internal vs public TCP proxy). Persisted Baileys session lives in a Railway volume for reconnect-after-restart.

  • Express server + Baileys WhatsApp SDK + Neon Postgres + Next.js 15 dashboard.
  • Three-header auth: X-Master-Token + X-Project-Token + X-Project-Name.
  • --store-replies flag at registration controls whether a project receives inbound.
  • Unread-poll endpoint flips read state on the same call — exactly-once delivery.
  • Auto-detect SSL based on host (Railway internal vs public TCP proxy).
  • Production deployed on Railway with persisted volume for Baileys session recovery.
  • First-class REST API designed for internal agents (curl-friendly).
Node.jsExpressBaileysPostgreSQL (Neon)Next.js 15pnpm WorkspacesTypeScriptRailway
Node.jsExpressBaileysPostgreSQL (Neon)Next.js 15pnpm WorkspacesTypeScriptRailwayMessaging InfrastructureMulti-tenant APIExactly-Once DeliverySession ManagementSelf-Hosted
SF · Personal Productivity
Photo Library OrganizationFeatured

Swipe Fotos

Photo library organizer with a swipe-deck UI, month bucketing, and persistent progress tracking.

Swipe Fotos lets you organize your photo library by swiping through it month by month. Progress is saved, so you can stop and resume. The UI is intentionally minimal — one photo at a time, two gestures, nothing else.

  • Decide thousands of photos quickly with two gestures.
  • Pick up where you left off — progress per-month is persisted.
Photo Library OrganizationGesture-Driven UIProgress Persistence

Lean SwiftUI MVVM. PhotoLibraryService wraps PHAsset enumeration + permissions. ProgressStore persists per-month decisions to Application Support. Three view models (SwipeDeck, AlbumList, MonthBrowser) keep responsibilities tight.

Architecture

PermissionView gates the rest of the app on Photos.framework authorization. SwipeDeckView is a custom gesture-driven card stack. Month bucketing uses a separate MonthBrowser + MonthBucket model so the UI doesn't fight the data model.

  • Photos.framework integration with permission gating.
  • Custom SwipeDeckView with gesture state and physics-feeling deck.
  • ProgressStore serializes per-month decisions to Application Support.
  • Lean MVVM split: 5 views · 4 view models · 4 models · 2 services.
SwiftSwiftUIPhotos.frameworkApplication SupportMVVM
SwiftSwiftUIPhotos.frameworkApplication SupportMVVMPhoto Library OrganizationGesture-Driven UIProgress Persistence
KT · Sports Tournament Management
Offline Desktop AppFeatured

Karate Tournament

Distributable role-aware tournament scoring system: Next.js web + Express server + Electron desktop, single binary.

Run a karate tournament without a cloud account. Superadmins set up categories, competitors, areas, and seeding from one screen. Referees sign in with their assigned area and start scoring. The audience scoreboard updates live in a separate window. Everything works offline, on a laptop, in a gym with no Wi-Fi.

  • One install per laptop runs the entire tournament — no cloud required.
  • Three roles (superadmin / referee / audience) with appropriate access controls.
Offline Desktop AppRole-Based Access ControlTournament Domain Logic

Three apps + one shared core package. The core is pure logic (no React, no DOM) so it can be reused. The server is Express with JWT signed RS256 from a keypair generated on first launch. The Electron wrapper spawns the server in-process on a random localhost port and serves the Next.js static export from the same origin.

Architecture

Turbo monorepo. apps/web (Next.js 15 App Router + Tailwind), apps/server (Express + JWT RS256 + bcrypt + admin panel), apps/desktop (Electron wrapper + electron-builder). packages/core holds typed domain logic (bracket seeding, area distribution, tiebreakers). Tokens are renewed silently after 20h of a 24h TTL. Cross-window state syncs via BroadcastChannel + localStorage. Data + RSA keys + activity log persist under ~/.karate-tournament/.

  • Turbo monorepo with pure-logic shared package (no DOM dependencies).
  • JWT RS256 with keypair generated on first launch.
  • Greedy bin-packer distributes subcategories across competition areas.
  • Electron wrapper bundles server in-process; serves static Next.js from same origin.
  • BroadcastChannel + localStorage sync between admin / private / public windows.
  • Activity log: login attempts, renewals, user mutations, IP addresses.
  • Builds .dmg / .exe (NSIS) / .AppImage installers.
Next.js 15ReactTailwind CSSExpressJWT (RS256)bcryptElectronelectron-builder+2
Next.js 15ReactTailwind CSSExpressJWT (RS256)bcryptElectronelectron-builderTurboTypeScriptOffline Desktop AppRole-Based Access ControlTournament Domain LogicCross-Platform Distribution
SS · Secure Communications
End-to-End EncryptionFeatured

Smoke Signals

End-to-end encrypted iOS chat client built on the Signal protocol — LibSignal, Network.framework, Keychain, APNs.

Smoke Signals is an iOS chat client built on the same protocol Signal Messenger uses. Messages are encrypted on your device and decrypted on the recipient's — never readable by any server. The whole networking stack is built on Apple's own Network.framework with WebSocket; identity keys live in the Keychain.

  • True end-to-end encryption — server has no plaintext, ever.
  • Apple-native networking (Network.framework + NWConnection) — no third-party WebSocket libraries.
End-to-End EncryptionSignal ProtocolWebSocket Realtime

LibSignalClient v0.75 + a git submodule of signal-protocol-c. SignalClient singleton wraps session setup, encrypt, and decrypt. ChatViewModel orchestrates the receive loop and message queue. WebSocketClient manages NWConnection lifecycle, token auth headers, and async receive polling. PushManager handles APNs device registration.

Architecture

C FFI integration for signal-protocol-c (largest project in the portfolio by file count and complexity). Network.framework via custom WebSocketClient (NWConnection + Combine publishers). Identity, prekeys, and session state Keychain-persisted. UI tests + unit tests present.

  • LibSignalClient v0.75 + signal-protocol-c git submodule (C FFI).
  • Custom WebSocket client built on NWConnection + Combine.
  • Keychain-backed identity, prekeys, and session state.
  • APNs device registration through PushManager.
  • MVVM with ChatViewModel orchestrating session setup, send, and receive.
  • Full UI + unit test coverage scaffolded.
SwiftSwiftUILibSignalClientsignal-protocol-cNetwork.frameworkNWConnectionCombineKeychain+2
SwiftSwiftUILibSignalClientsignal-protocol-cNetwork.frameworkNWConnectionCombineKeychainAPNsCocoaPodsEnd-to-End EncryptionSignal ProtocolWebSocket RealtimePush NotificationsCryptographic Key Management
§ 06More work

25+ smaller pieces, prototypes, and tools.

Internal tools, prototypes, agents, and enterprise pieces. Each one shipped, demo'd, or used. Scroll to scan.

§ 07Contact

Let’s build something.