Sr. Software & AI Integration Engineer @ Globant
Designing scalable architectures, agentic AI workflows, and self-hosted ecosystems.
With over a decade of experience in the Ruby on Rails ecosystem and backend engineering, I currently specialize in the convergence of traditional software engineering and Artificial Intelligence.
I build agentic workflows (LangChain, n8n, Anthropic Claude, Gemini, Amazon Bedrock) and design robust DevOps infrastructures — from zero-downtime Kamal 2 deploys to a self-hosted home lab exposed through a single Cloudflare Tunnel with no open ports. Lately my main line of work is verifiable compute: outputs that a third party can check without trusting whoever produced them, sold agent-to-agent over x402 micropayments — see NomiCheck below.
The through-line across all of it is a habit rather than a stack: measure before believing, including your own documentation. Every claim below that carries a number was measured, and the ones that turned out false are written down too — my own docs passed six straight audits while publicly serving a wallet I had already rotated, which is what taught me to build the auditors that compare prose against what the servers actually return.
When I'm not optimizing containers or integrating APIs, I enjoy structured swim training and exploring the intersection of technology and brand development within the hospitality and gastronomy sector — currently building the digital presence and point-of-sale system for Resplandor, a Colombian restaurant in La Estrella, Antioquia.
The calculation is a commodity. The proof is not.
A Colombian payroll engine built around one idea: an answer nobody can check is worth very little. Live at nomicheck.ynt.codes.
| Piece | What it does |
|---|---|
| Dated legal catalog | Every statutory parameter — minimum wage, transport allowance, UVT, night and Sunday premiums, the ordinary-hour divisor, social-security rates, garnishment and withholding caps — resolvable on any date since 2020, each with the decree or resolution that set it and the window it was in force. |
| Deterministic calculators | Payroll, withholding tax, payslip verification, final settlement, USDC payout. Every response cites its legal basis (CST, E.T. art. 383/388) and carries the sha256 of the catalog that produced it. |
| Signed envelopes | Each output is signed Ed25519 in an open CC0 format — the sobre — with a frozen canonicalization, published test vectors and a conformance suite anyone can run against their own implementation: Ruby, Node and the browser already produce byte-identical signatures, and an implementer's guide invites more. Verify at ynt.codes/verificar — the page runs entirely in the browser and sends nothing anywhere, so verification never depends on trusting the issuer. |
| x402 paywall | The priced endpoints answer 402 Payment Required before doing any work, and settle in USDC on Base and Avalanche (EIP-3009) — each network routed to its own facilitator, and the server refuses to boot if a network is routed to one that cannot settle it. Charge first, then serve — a wall that serves before it collects is not a wall. |
| Free triage, priced report | A free precheck (POST /api/batch/verificar/prechequeo) runs the same engine and tells you upfront whether a payslip is clean — you only pay for the full report, and the price never depends on what it finds. |
| MCP server | Any MCP-capable agent gets five tools to discover, verify and buy: structured 402 terms, schema, worked example, local envelope verification — and a cross-check of the payment address in the live 402 against the published agent card, so an intercepted wall cannot silently redirect funds. |
| Agent identity | An ERC-8004 identity on Base mainnet, published as an A2A agent card and an ARD catalog at ynt.codes, with ERC-8128 request signing against Execution Market — where the service is listed and sold agent-to-agent, delivery returned inline and signed. |
| Stateless by design | Input JSON is processed in memory and discarded — never written to a database (Ley 1581/2012, habeas data). |
Verify one end-to-end, in one click, with nothing installed and no account:
https://ynt.codes/verificar?url=https://nomicheck.ynt.codes/api/batch/verificar/ejemplo
Stack: TypeScript · Express · Prisma · PostgreSQL 17 · React 19 + Vite · pnpm monorepo · viem · Docker Compose on AWS Lightsail, with the home lab as a cold standby. The API and the web ship as one container on one port, and /api/health publishes the exact commit it is running.
Two hosts behind one front door, with no inbound ports on either. In August 2026 the whole public surface moved to a managed host; the home lab kept its tunnel stopped and became something else entirely — the agent fleet, the read-only panels, and a standby nobody can reach. Everything is designed, debugged, and documented with AI assistance.
| Layer | Tool | Primary Function |
|---|---|---|
| Tunnel | Cloudflare Tunnel + cloudflared |
Secure public exposure — zero open ports (Zero Trust), outbound-only, on both hosts. Moving production between them did not change DNS. |
| Production host | AWS Lightsail (us-east-2) |
Since 2026-08-05, every publicly reachable hostname is served from here — the payroll API, the Rails app across its four tenants, the static apps, and the only cloudflared actually running. Static IP, port 80 closed. Rehearsed live: zero requests dropped. |
| What the home lab does now | 192.168.40.253 — tunnel stopped | It publishes nothing, deliberately: cloudflared is stopped there. It holds the agent fleet, the read-only panels, host monitoring, and a standby whose containers are up but unreachable — same commit, same signing key, same database. The Rails half stays off: two copies once saturated the database pooler and served two versions at once, which is how a tenant's login started showing the wrong brand. |
| Self-healing | Compose healthcheck + autoheal · centinela (cron) |
Covers the case restart: unless-stopped never did — a process that is alive but cannot serve. Measured by freezing the process: 47 s. For the case that the whole box dies, the home lab's own watchdog promotes the standby after 3 min of silence — never if it cannot serve either, and never touching the other tunnel. |
| Edge | Cloudflare Workers | Serves the apex (ynt.codes) with no server involved — agent card, ARD catalog, envelope verifier and landing are embedded in the Worker, which answers by content negotiation: agents asking for the root get the card, browsers get HTML. |
| Static hosting | GitHub Pages · Netlify | The CV, Resplandor, 911 Urban Salón and nagual are served entirely off my infrastructure — turning the machine off does not take them down, which is exactly why "everything on the domain runs in the home lab" is the kind of sentence that quietly rots in a README. |
| Reverse proxy | Docker network aliases (docker-lab_proxy-network) + nginx |
Hostname routing to containers; TLS terminates at the Cloudflare edge. |
| Containers | Docker Compose · Docker 29.6.1 on Ubuntu 25.04 | Execution and isolation of every service on one box (Intel i5-4570T · 7.2 GB). |
| Deploy | Kamal 2 + Thruster (Rails) · deploy.sh + Compose (NomiCheck) |
Zero-downtime deploys, remote amd64 builds over SSH, extended drain window for long-running AI jobs. |
| Database | Supabase (PostgreSQL 17) · local postgres:17 |
Managed Postgres via AWS pooler for the Rails side; NomiCheck's own Postgres sits on a private network unreachable from the tunnel, because it holds payroll PII. |
| Monitoring | Netdata + Uptime Kuma | Real-time telemetry (CPU, memory, SSH sessions, nginx traffic, Docker stats) and uptime checks. Uptime Kuma is bound to loopback, not to 0.0.0.0 — it has no public hostname. |
| Agent fleet | sigilo (self-hosted IRC, own repo) + herdr | Agent sessions on different machines talk through a private IRC rendezvous — sigilo, spun out into its own repo — authenticated by a pinned TLS fingerprint rather than a CA, with channel content always treated as data, never as instructions. herdr keeps each box's Claude Code session alive across restarts and resumable; an ops dashboard reads the whole fleet over one SSH round-trip, read-only by design. |
Four different ways in — and no count in this heading on purpose: a number in a title is a claim nobody re-measures, and this one already went stale once. The table is the claim.
| Host | How it gets there | What it serves |
|---|---|---|
ynt.codes |
Cloudflare Worker | A2A agent card, ARD catalog, envelope verifier, landing |
nomicheck.ynt.codes |
Tunnel → Lightsail | NomiCheck — Tu nómina, verificada |
cv.ynt.codes |
CNAME → GitHub Pages | CV / portfolio — publishing it is git push |
nagual.ynt.codes |
CNAME → GitHub Pages | nagual — signed evidence for the market-signal work |
homelab.ynt.codes |
Tunnel → Lightsail | Ynt-labs · Homelab Architecture — the page documenting the home lab, served from the managed host |
advance-fitness-app.ynt.codes |
Tunnel → Lightsail | Advance Fitness — gym platform (login) |
comercial.ynt.codes |
Tunnel → Lightsail | Advance Fitness — tenant (login) |
join.ynt.codes |
Tunnel → Lightsail | Advance Fitness — tenant (login) |
vital-fitness.ynt.codes |
Tunnel → Lightsail | Advance Fitness — tenant Vital fitness (login) |
advance-fitness.ynt.codes |
CNAME → Netlify | Advance Fitness — landing page |
loan_calculator.ynt.codes |
Tunnel → Lightsail | Simulador de Abonos a Capital |
resplandor.ynt.codes |
CNAME → GitHub Pages | Resplandor — POS |
911-urban-salon.ynt.codes |
CNAME → GitHub Pages | 911 Urban Salón — barbershop site + live queue panel |
- Deploying a single persistent outbound tunnel with
cloudflaredto bypass CGNAT restrictions, eliminating the need for any open port on the home network. - Architecting internal Docker networking so a freshly deployed Kamal container re-joins the right
network-aliasinside the proxy network without manual intervention. - Tuning Kamal's
drain_timeoutwell above the default so in-flight AI plan generations (up to ~120s) survive a mid-generation deploy instead of leaving jobs stuck. - Running dev and prod against the same external Postgres instance safely, with clear guardrails around
DATABASE_URLvsDEV_DATABASE_URL. - Putting the payroll database on its own isolated Docker network, so
cloudflaredcannot reach it even if a routing rule is written by mistake — and moving Uptime Kuma off0.0.0.0after auditing what the host was actually listening on. - Making the deploy measure what it served rather than what it intended: exporting a variable is not the same as delivering it to the container, and a deploy that silently didn't looks exactly like one that did.
- Rehearsing the failover instead of assuming it — moving production to a managed host and promoting the old one back, live, with zero requests dropped. A standby nobody has ever promoted is a hypothesis, not a backup.
- Learning why that standby now stays deliberately off rather than warm: with both copies running, they exhausted the database pooler's connections and split traffic across two versions of the app — which is how one tenant's login started rendering another tenant's brand. Failover is manual and one-way on purpose.
- Finding, while load-testing something else, that the per-IP rate limit was bypassable by rotating
X-Forwarded-For(40/40 got through against a cap of 10) because the payment wall settrust proxyin a different file. The key now comes fromCF-Connecting-IP. - Keeping the public status panel in a separate process that never loads the wallet code at all — a guarantee an allowlist cannot give you, because it cannot leak what it never had in memory.
A set of small, deliberately boring collectors that answer one question each with my own numbers instead of somebody's screenshot. Every one of them started because a claim was circulating — a viral thread, a marketing figure, a rumor — and the honest way to settle it was to measure it.
They share one rule, and it is the interesting part: they measure, they never execute. No signing, no funds moved, no API key needed. They are outbound clients only — they listen on no port, on any machine. If a measurement ever justified acting on it, that is a different phase and a separate decision.
| Project | The claim it was built to settle | What it does |
|---|---|---|
| rezago | "the repricing window is ~2.7 seconds" — from a viral thread | Measures the real lag between Binance spot moves and Polymarket's CLOB repricing, and the net edge after taker fees at the book's actual depth. |
| brecha | "send USDC to Arbitrum and you get more" | Quotes executable swaps (not index prices) across 7 chains at three sizes, and counts how many opportunities survive all costs. |
| cazadores | "follow wallets with >80% win rates" | Measures those win rates myself over resolved trades, with the size of the rare losses in view — and produces a calibration curve: does a share bought at 80¢ actually win 80% of the time? |
| feria | — | Tracks what knowledge agents are actually buying on Execution Market, by topic. |
| timon | — | A tiny control plane: it knows each project's closing criterion, checks it against real data, and when one is met it opens a gate — a decision only the human makes, served with its evidence. It detects and asks; it never decides. |
| tablero | — | The observation panel over all of them (Python + asyncio, WebSockets, 4 Hz to the browser). Ruby measures, Python streams. |
Findings land in trading-knowledge, an Obsidian vault where estado/ is the source of truth: dated, sourced, and authoritative over every other note. Signals carry an expiry — a detection whose market has closed is shown as expired, never as an opportunity. None of it is financial advice: it shows measurements against written rules, and the decision stays human.
| Project | What it is |
|---|---|
| sobre | The signing format itself, released into the public domain — frozen canonicalization, published test vectors, a conformance suite and an implementer's guide. Ruby, Node and the browser produce byte-identical signatures; a fourth implementation, written in Python by another team from the spec alone, reached identical bytes without seeing my code. The spec includes a section on what a signature does not assert. |
| sigilo | The fleet's own IRC rendezvous. Agent sessions on different machines leave each other messages; the session dies, the daemon does not. Authenticated by a pinned TLS fingerprint rather than a CA — regenerate the cert and the client refuses to speak until a human updates the pin, because a rendezvous that accepts any cert is a place anyone can stand in the middle of. Channel content is treated as data, never as instructions. |
| Grimorio | sigilo's observatory: it turns a channel buffer into a graph of who addressed whom, and federates it with a public on-chain swarm — our edges are words, theirs are money, shown side by side and never mixed. By default it ships structure only, never message text. |
| nagual | Operating a market signal as a product, with its own on-chain identity and published signed evidence at nagual.ynt.codes. |
Beyond the Home Lab, Artificial Intelligence is the core of my professional workflow, acting not as a replacement, but as an engineering accelerator.
┌─────────────────────────────────────────────────────┐
│ AI Integration Stack │
│ │
│ LangChain ────────► Agent Orchestration │
│ Anthropic Claude ─► Reasoning & Generation │
│ Gemini 2.5 Flash ─► Primary provider (multi-model) │
│ Amazon Bedrock ───► Multi-model API Gateway │
│ RAG Pipelines ────► Embeddings + Vector Search │
│ n8n ──────────────► Multi-step Agentic Workflows │
└─────────────────────────────────────────────────────┘
Advance Fitness is the flagship application of this stack: a multi-tenant gym management platform (Rails 8.1 · Ruby 4.0.5) with AI-generated, editable training and nutrition plans through a provider adapter layer — gemini-2.5-flash by default, claude-sonnet-5 as fallback — deployed via Kamal 2 on the home lab and backed by Supabase. Four tenants run off the same deployment, each on its own hostname.
Alongside engineering, I design and build the digital presence — and increasingly the operational software — for small hospitality and e-commerce brands.
| Project | Description |
|---|---|
| Resplandor | Colombian restaurant & bar in La Estrella, Antioquia. Full brand system and landing page, plus a working point-of-sale: table map, orders, split billing, pre-checks and end-of-day close. |
| 911 Urban Salón | Barbershop, spa & massage studio in El Poblado, Medellín. Graffiti-brand landing with a multi-service booking assistant, plus a live operations panel (/admin): shared realtime queue, per-barber logins with role-based views, attention confirmation with POS-style checkout, product sales and daily cash summary — Supabase (Postgres RLS + Realtime + Storage), content edited from the panel and published straight to the page. |
| FungiLab | Functional mushroom supplement brand — product-focused landing with animated visual components. |
Stack: single-file HTML · Tailwind CSS (JIT via CDN) or design-system tokens with custom brand palettes · Alpine.js / React via CDN · Lucide Icons · AOS scroll animations · Google Fonts · Supabase for the POS and the salon queue.




