Full-stack engineer — event-driven backends and AI systems.
TypeScript · Node.js/NestJS · Next.js · Go · Python · PostgreSQL · AWS
Popayán, Colombia 🇨🇴 · working remotely in English and Spanish
- Banking microservices at TBBC — event-driven services that integrate core banking (SOAP), the PSE payment gateway, Twilio/FCM notifications and Active Directory; JWT + OAuth2, AWS Secrets Manager, API Gateway, MongoDB under high throughput, blue-green deploys on ECS, Python/FastAPI services for AI features.
- AI document pipelines — for a bookkeeping SaaS: bank statements go from S3 through LLM extraction to per-transaction categorization by four competing engines (learned rules, two RAG backends on pgvector, an LLM classifier), with a review UI and an internal trainer that feeds corrections back into the vector store.
- Multi-tenant SaaS — connectHUB (The Unconnected Foundation) (Next.js + NestJS on AWS, Row-Level Security, ~4k Starlink service lines across six countries), a WhatsApp Business platform (Meta Cloud API, BullMQ/Redis, OpenAI Assistants), and a lead-management CRM with a Twilio power dialer.
- Open source — TypeScript, Python and Go fixes to AI developer tooling: an LLM gateway, a code knowledge graph, agent runtimes (below).
| Project | What I shipped |
|---|---|
| Graphify-Labs/graphify — Python, 138k ★ | #4391 (v0.9.88): the shrink guard no longer drops deduplicated AST-twin semantic nodes on rebuild; folded LLM node/edge field aliases; end-to-end regression tests with a negative control. #4779 (v0.9.97): the same guard stops refusing cluster-only rebuilds that lost nothing (label-only AST file twins). #4686 (v0.9.97): filler verbs like get no longer seed query traversal on framework hubs such as a NestJS @Get import. |
| cheaper-inference/OmniRoute — TypeScript, 82k ★ | 9 merged PRs in the routing core. #17125: persist the client's own session id (Claude Code, Codex, opencode) on call-log rows, with a migration, so requests can be joined to the agent session that sent them. #16648: keep Claude OAuth rewrites off the body a combo replays to its fallback providers. #17119 / #17835: Anthropic-format clients get back the tool-name casing they declared, from every provider including xAI. #17842: forward usage-only chunks and cached/thought token counts to Gemini /v1beta clients. #16546: skip unreported quota windows in combo health and forecasts. #17844 / #17938: sanitized upstream error bodies on /v1/audio/translations and added CORS headers to the audio endpoints' fetch-failure 500s. #18241: the JSON-schema fallbacks copy instead of mutating, so a 429 retry no longer stacks a second JSON instruction or rewrites the caller's body, and non-JSON response_format values no longer trigger them. |
| permgps/herdr-telegram-agents — Go | #13: transcript.CodexReader — resolves a Codex thread's rollout file and returns the last turn's final answer instead of the terminal tail (~2k lines incl. tests). #11: stopped the detached daemon from opening console windows on Windows (CREATE_NO_WINDOW helper + a CI guard against stray exec.Command). #9: PowerShell installer hash fix for pwsh-launched sessions. |
| Gathin23/cleanyourtv — Python, 45k ★ | #532: renamed theme.ps1's Del function to Drop, since PowerShell's built-in del alias shadowed it. |
graphify lands contributions by authorship-preserving cherry-pick, so those PRs show as closed rather than merged.
Plugins I maintain for herdr, a terminal runtime for coding agents:
- herdr-route-audit — shows which OmniRoute combo step actually served each agent pane (step 1 or a silent fallback): sidebar badge, report, Telegram paging.
- herdr-wsl-tab — opens a tab or split running a WSL distro on Windows, with
HERDR_*passed through so agents inside WSL can drive herdr.
Cloud & DevOps
AWS: ECS, EC2, Lambda, S3, SQS/SNS, Bedrock, Secrets Manager
- Senior Backend Developer at TBBC; Backend Engineer at Simplixity (remote).
- Open to freelance work on backend systems and AI integrations — Upwork or email.



