• Web
  • Backend
  • Mobile Apps
  • AI Systems

Jeerawut Buayoy · จีรวุฒิ บัวย้อย

Senior Full-Stack Engineer

Jeerawut Buayoy
  • 8Years shipping
  • 500K+iOS & Android installs
  • 20MCP servers written · 9 in production
  • 24,700Villages in the programme

Profile

โปรไฟล์

Full-stack engineer with 8 years shipping web systems, Node.js and NestJS backend services, and mobile apps for enterprise, fintech, and Thai government clients. Most recently I owned mobile delivery on Easy Smart — Easy Money's online pawn shop app with 500K+ iOS & Android installs: eKYC, payments, the contract lifecycle, and the Easy Outlet marketplace. Alongside it I built the company's production LLM agents, including a self-hosted agent stack with in-house MCP tool servers, realtime Thai voice, and every model call routed through a self-hosted gateway. The work I care most about is the part teams usually skip: measured retrieval quality, output guardrails hardened by red-teaming, and model routing driven by real token and cost data.

Experience

ประสบการณ์ทำงาน
  1. 2022 — 2026

    Bangkok, Thailand

    Tungthanasin Co., Ltd. (Easy Money)

    Mobile Developer · AI Engineer

    Owned mobile delivery on Easy Smart, the online pawn shop app, and built the production LLM agents that served customers directly.

    • Built eKYC identity verification and secure payment flows carrying live customer transactions.
    • Shipped online interest payment, principal repayment, and principal top-up on existing pawn contracts.
    • Implemented real-time pawn status tracking with SMS and push notifications, plus free online asset valuation.
    • Delivered the Easy Outlet marketplace for verified unredeemed items, and kept rollouts zero-downtime on both stores through a NestJS OTA update server I built and ran in-house.
    • Built and ran "Anna", the company's Thai voice and text agent — first for customers, and since August 2026 for the team (detailed under Selected work).
    • Rebuilt Thai retrieval on measurement, not guesswork: chunk MRR 0.790 → 0.923, and recall@5 44% → 84% in the agent memory store via trigram indexing.
    • React Native
    • TypeScript
    • Node.js
    • NestJS
    • CodePush
    • Python
    • MCP
    • Gemini
    • Docker
  2. 2021 — 2022

    Bangkok, Thailand

    PTT Oil and Retail Business

    Mobile & Backend Developer

    Contributed to Fillup, PTT OR's consumer app for fuel services and loyalty benefits.

    • Shipped consumer-facing features during the rollout and integrated loyalty and transaction services across the mobile and backend teams.
    • React Native
    • Node.js
    • MongoDB
  3. 2018 — 2021

    Bangkok, Thailand

    National Telecom Public Company Limited

    Full-Stack Developer & Team Lead

    Led full-stack development and delivered five major applications for Thai government clients while modernising the team's technology stack twice.

    • Migrated the team from PHP Laravel to .NET Core + Angular, then to Node.js + MongoDB, within two years.
    • Delivered Net Pracharat, Digital Volunteer, CSMS, DIP and e-Inspect for five government clients.
    • Scoped projects by resource, timeline, and business value; acted as technical consultant and mentor to the team.
    • Managed the full infrastructure: application servers, databases, SSL, domains, SMTP, and SMPP.
    • Led the team through ISO 29110 software development process certification.
    • React Native
    • Angular
    • Vue.js
    • Node.js
    • .NET Core
    • MongoDB
    • SQL Server

Selected work

ผลงานคัดสรร

Easy Smart

Easy Money · iOS and Android

In production2022 — 2026
Ticket portfolio — outstanding principal, available top-up, next payment, and every contract in one place
Easy Outlet storefront — campaign banners, categories, and price-led merchandising
Search and filtering across the unredeemed inventory
Product detail — authenticated item, branch seller, and direct checkout

Context

A pawn transaction used to mean going to a branch during opening hours. Easy Smart moves the whole contract lifecycle onto the phone — pay interest, repay or top up principal, track status, get an item valued, and buy verified unredeemed stock.

What I built

  • eKYC identity verification and secure payment flows handling real money end to end.
  • Interest payment, principal repayment, and principal top-up against existing contracts, with real-time status and SMS/push alerts.
  • Easy Outlet — a 24/7 storefront for verified unredeemed items, with search, categories, coupons, and checkout.
  • Zero-downtime feature rollouts via CodePush across both stores.
iOS & Android installs · 4.8★ on Google Play
500K+
both stores
iOS + Android
Easy Outlet open
24/7

Stack

  • React Native
  • TypeScript
  • CodePush
  • Node.js

LinksGoogle Play ↗App Store ↗

Anna

Easy Money · team assistant, customer-facing until Aug 2026

In production2026
Discordvoice + text · ThaiAgent runtimeper-turn EASY / HARD router (built, left off)prompt cache preserved by routing9Router: GPT-6 Sol → Gemini → GPT-6 LunaGuardsleak · PIIidentityred-teamed9 in-house MCP serversmailfilesdocumentsimage genvideo editmedia readYouTubeastrologyhost ops
Anna architecture — channel, routed runtime, output guards, and the MCP tool tier

Context

Questions from the team — about Jira work, mail, documents, and media — arrive at all hours, in Thai, often as a photo, a voice note or a clip rather than a sentence. Anna answers on Discord in voice and text with real tools behind her; until August 2026 she also answered customers about pawn tickets, payments, branches, and valuations.

What I built

  • A 17-service Docker Compose stack deployed to a VPS through GitLab CI with a health gate and automatic rollback; every model call goes through a self-hosted 9Router gateway, with per-workload combos that can be switched from its dashboard without a redeploy.
  • 17 MCP tool servers written in-house for Anna — 11 in Node.js and Express, 6 in Python — 9 of them in production today, so the model calls real systems natively: mail, file publishing and document building, image and video generation and editing, media understanding, YouTube, astrology, and host operations. The customer-era servers (payments API, product catalog on SQLite FTS5, image-based appraisal, knowledge search) retired with the customer channel; Jira runs on the open-source mcp-atlassian server.
  • An output-side guard plugin covering information leakage, PII, and model-identity disclosure, plus per-user authorization and audit gates on Jira, mail, and tool calls — hardened over repeated adversarial red-team rounds; one pass closed 21 leak classes and 14 over-block classes.
  • A per-turn EASY/HARD model router built after measuring real token usage — one cheap classification call picks the model, and each turn stays on a single model so the prompt cache is not split. Built and measured; left disabled behind a kill switch.
  • Thai voice two ways: realtime through GPT-Live, which talks at phone-call latency and hands tool work to the agent under a $3 daily budget, and the classic STT, TTS, and VAD barge-in loop it falls back to — where end-of-turn silence detection went from a hardcoded 1.5s to a tunable 0.9s, taking a fixed 0.6s off every voice turn.
services running in the stack
17
in-house MCP servers in production
9
pytest tests passing
2,300+
prompt tokens served from cache, two weeks to 13 Aug 2026
81.3%

Stack

  • Python
  • Node.js
  • MCP
  • 9Router
  • OpenAI GPT
  • Gemini
  • Docker Compose
  • GitLab CI
  • SQLite FTS5
  • Discord

Built on the open-source hermes-agent base and routed through the open-source 9Router gateway. The MCP sidecars, guard plugins, model router, compose stack, CI, prompts, and evaluations are mine; the agent framework and the gateway are not.

Thai hybrid retrieval

The knowledge layer behind Anna's customer channel

In production until Aug 20262026
Thai queryno spaces between words · digits in two scriptsShared Thai normaliserNFC · Thai digits · brand aliases — both legs index identical textKeyword legMongoDB $search · lucene.thaiDense legvoyage-4 embeddingsRRF fusion — combined by rank, not by scorererank-2.5 · hostedself-hosted ONNX reranker kept as the outage fallbackGrounded answer · cite or abstain
Thai retrieval pipeline — normalise, search two legs in parallel, fuse by rank, then rerank

Context

Thai breaks most retrieval defaults: no spaces between words, digits in two scripts, and brand names spelled several ways. A pipeline that scores well on English quietly returns the wrong chunk in Thai — and an agent that retrieves the wrong chunk answers confidently and incorrectly.

What I built

  • Hybrid retrieval fusing a Thai-analyzed keyword leg with dense embeddings via reciprocal rank fusion, then reranking the merged list — first on SQLite FTS5 with a self-hosted bge-m3 and a self-hosted ONNX reranker, and since August 2026 on MongoDB $search with the lucene.thai analyzer, voyage-4 embeddings, and rerank-2.5.
  • Measured the keyword leg instead of trusting it: the old FTS5 + word-segmentation path scored precision@1 of 0.00, with the gold document outside the top 20 on every query — half the advertised hybrid was contributing nothing. Replacing it took chunk precision@1 from 0.742 to 0.871 and MRR from 0.790 to 0.923 over 124 graded Thai queries.
  • One shared Thai normaliser — NFC, Thai-digit conversion, brand-alias canonicalisation — so the embedding model and the keyword index see identical text.
  • A pluggable embed/rerank provider layer, added after a hosted reranker hit a spend cap and returned HTTP 402 — degrading to un-reranked order and collapsing chunk precision@1 from about 0.74 to 0.10. A six-hourly quality monitor is what caught it; the fix was a self-hosted ONNX fallback behind a provider switch.
chunk MRR, 124 graded Thai queries
0.790 → 0.923
chunk precision@1
0.742 → 0.871
nDCG
0.796 → 0.937
quality-monitor cadence that caught the 402 outage
6 h

Stack

  • Node.js
  • Python
  • MongoDB Atlas Search
  • voyage-4
  • rerank-2.5
  • bge-m3
  • ONNX Runtime
  • SQLite FTS5

Retired in August 2026 together with the customer channel it served. The agent's own Thai memory search (trigram) still runs.

AI & LLM engineering

งานวิศวกรรม AI และ LLM

I have shipped LLM systems to production and maintained them long enough to see them fail in ways demos never do. Below is what I have actually run, and what I ran it for — the stack as it stood in September 2026.

Model or tool — What I used it for
Model or toolWhat I used it forStatus
GPT-6 Sol · GPT-6 Luna · GPT-5.6 TerraAnna's brain combo opens on GPT-6 Sol; GPT-5.6 Terra runs every cron job and GPT-6 Luna the twenty auxiliary tasks — ChatGPT Plus models reached through the self-hosted 9Router gateway, each backed by Gemini.Production
Gemini (2.5 / 3.x Flash)Gemini 3.8 Flash is the second leg of Anna's brain and the spare behind her cron, auxiliary, and fallback combos, on an Antigravity subscription through 9Router, and reads whole video clips. Gemini is also the tool-calling brain of the Gitra dashboard and its scheduled summaries.Production
DeepSeek FlashFirst leg of hermes' own fallback combo, reached through an OpenCode Go connection in 9Router, with Gemini behind it.Production · fallback path
gpt-live-1 (OpenAI Realtime)Full-duplex voice in Discord since September 2026: answers small talk at phone-call latency and hands anything that needs tools or memory to Anna's brain, under a $3 daily budget with automatic fallback to the classic voice loop.Production
gpt-transcribe · Whisper · Edge TTSThai speech-to-text for voice notes and the classic voice loop through 9Router, Whisper for caption-less YouTube clips, and a neural Thai voice for spoken replies.Production
gpt-image-2.5Anna's image generation and editing — ChatGPT Plus through 9Router first, OpenRouter as the paid fallback — plugged into hermes as an image-generation provider.Production
FLUX · Seedream · LyriaImage and music generation given to the agent as tools through a fal.ai MCP server, with FFmpeg assembling the final cut.Production
voyage-4 · rerank-2.5 (Voyage AI)Hosted embeddings and reranker for the Thai retrieval pipeline after its August 2026 move to MongoDB $search; retired with the customer channel at the end of that month.Retired with the customer channel
bge-m3 · bge-reranker-v2-m3Self-hosted ONNX embedding and reranking, built to end a hosted-reranker outage and kept as the outage fallback until the knowledge base retired with the customer channel.Retired with the customer channel
Claude (Opus / Sonnet / Haiku)My daily development driver through Claude Code. In Anna, Claude Opus is a pick-only /model row through 9Router; it no longer backs up the brain, and Claude Code left the production image after Anna never once called it.Development · routable
MiniMax M2 / M3Production brain for the Anna agent until the stack consolidated onto OpenAI Codex in August 2026; still drives a multi-step tool-calling loop in a research agent.Retired, deliberately
Cohere Rerank v3.5Former production reranker. Migrated off it after a spend cap returned HTTP 402 and collapsed retrieval precision — the reason the embed/rerank layer was made pluggable, with a self-hosted ONNX reranker as the fallback.Retired, deliberately
Qwen · Kimi · LlamaAlternative brains behind the multi-provider gateway; not in use.Not in use
gemini-embedding-001Asymmetric query and document embeddings with taskType, benchmarked head to head against a self-hosted bge-m3 on the Thai corpus and rejected after it scored worse end to end.Benchmarked, not adopted
gemma3:12b via OllamaFully local streaming inference for a Thai assessment page, with hand-rolled NDJSON stream parsing and no cloud provider involved.Self-hosted · 2025 project
DSPy / GEPAPrompt optimisation with a deterministic metric faithful to the production guards, paired with an LLM judge for offline faithfulness measurement.Built · target since retired

Agent engineering

  • MCP servers — 20 written, 9 in-house running as production sidecars
  • Bounded tool-calling loops with explicit terminators
  • Structured output — responseSchema, Zod, Ajv, JSON repair
  • SSE streaming with incremental partial-JSON extraction
  • Voice — realtime full-duplex through GPT-Live, with an STT, TTS, VAD barge-in loop as the fallback
  • Generative UI from a typed component whitelist (prototype)

Retrieval & RAG

  • Thai-tuned hybrid search — analyzed keyword leg + dense + RRF + rerank
  • Recall@k, MRR, and precision@1 benchmarking against gold sets
  • Self-hosted embedding and reranking on ONNX Runtime, as an outage fallback
  • Thai normalisation — NFC, Thai digits, brand aliases, trigram indexing
  • Matryoshka dimension truncation for embedding storage
  • Pluggable embed/rerank providers with a self-hosted fallback

Safety & evaluation

  • Output guardrails — information leakage, PII, model identity
  • Adversarial red-teaming rounds with a recorded changelog
  • Grounding contract — abstain, cite, or hedge
  • Regression suites for agent behaviour, not just unit tests
  • LLM-as-judge faithfulness measurement, offline
  • Re-testing findings in a fresh session to filter model variance

LLM operations

  • Self-hosted gateway (9Router) with per-workload model combos — brain, cron, auxiliary, fallback — switched from a dashboard without a redeploy
  • Upstream framework upgrades through read-only overlays and three-way merges, with the image built and tested in CI before deploy
  • Alerts on exhausted quota, fallbacks, and repeated tool failures, with recovery notices and a weekly usage digest
  • Per-turn model routing driven by measured token and cost data (built, held behind a kill switch)
  • Prompt caching, protected deliberately by routing decisions
  • Cost and token accounting per call and per preset
  • Preset versioning with one-click rollback
  • Self-hosted fallbacks and a quality monitor, because hosted providers degrade

AI tools I work with

  • Claude Code — daily driver, with custom skills, hooks, and MCP servers I wrote
  • OpenAI Codex · Gemini CLI · Google Antigravity
  • Cursor · Windsurf · Kiro · Continue
  • OpenRouter · Ollama · Open WebUI (self-hosted)
  • Playwright for agent-driven UI verification

No fine-tuning or model training appears above, because I have not done any — the work is prompt, tool, retrieval, and provider engineering. Separately, and not to be confused with the above: on-device computer vision with MediaPipe (head pose and blendshapes in the browser), and classical ML with LightGBM (triple-barrier labelling, SHAP attribution, drift detection). Neither involves an LLM.

Other projects

ผลงานอื่น

AI & platform

Gitra

2026

Independent · deployed

Syncs Jira, GitLab, and Confluence into Cloudflare D1 and answers Thai questions over the data with a tool-calling Gemini agent, plus a cron-written daily executive summary. Live on a custom domain, deployed on every push.

  • TypeScript
  • Next.js
  • Cloudflare Workers
  • D1
  • Gemini

Aperture

2026

Independent · built, not deployed

LLM preset platform over OpenRouter — SSE gateway proxy, prompt version history with one-click rollback, argon2-hashed scoped API keys, and per-preset cost accounting, so prompts change without a redeploy.

  • NestJS
  • Next.js
  • TypeScript
  • MongoDB
  • Zod
  • OpenRouter

custom-mcp

2026

Independent · published

Three standalone MCP servers on the SDK v2 stdio transport: cross-model delegation, image generation and inpainting, and a 265-method payments-API tool surface. Each ships a smoke test with committed output.

  • TypeScript
  • MCP SDK v2
  • Node.js

CodePush OTA server

2026

Easy Money · internal platform

Self-hosted over-the-air update server behind the mobile releases — a NestJS API plus an admin console, with per-app storage isolation, admin/viewer RBAC, and guarded binary routes. Moved off Docker and a Cloudflare Tunnel onto Azure with a GitLab CI deploy pipeline; release histories are read through the API so the CDN cannot serve a stale rollout toggle.

  • NestJS
  • TypeScript
  • Azure
  • GitLab CI

Pawnshop GenUI

2026

Independent · prototype

A proof that a model can compose the interface instead of picking from fixed widgets — an 11-primitive typed component registry with an auto-generated system prompt, streamed and rendered as real React.

  • TypeScript
  • React
  • Zod

Enterprise & government

Net Pracharat

2021

National Telecom

Mobile application for Net Pracharat, the national programme that brought fiber to 24,700 rural villages.

  • React Native
  • Node.js

Digital Volunteer

2021

Ministry of Digital Economy and Society

Mobile and web platform connecting digital volunteers with community initiatives. Led from concept to production.

  • React Native
  • Angular
  • Node.js
  • MongoDB

Fillup

2021

PTT OR

Consumer app for fuel services and loyalty rewards.

  • React Native
  • Node.js
  • MongoDB

CSMS

2020

Office of the Consumer Protection Board

Consumer protection case management system.

  • Vue.js
  • Laravel
  • MySQL

DIP

2020

Department of Intellectual Property

Product data ingestion and registry management system.

  • Angular
  • .NET Core
  • SQL Server

e-Inspect

2020

Government client · via National Telecom

Field inspection platform delivered as a mobile app and a web dashboard.

  • React Native
  • Angular
  • Node.js

Skills

ทักษะ

Languages

  • TypeScript
  • JavaScript
  • Python
  • C#
  • SQL

Mobile & Frontend

  • React Native
  • Angular
  • React
  • Next.js
  • Vue.js
  • CodePush

Backend

  • Node.js
  • NestJS
  • Fastify
  • .NET Core
  • Laravel

AI / LLM

  • LLM agents
  • MCP
  • Tool calling
  • Hybrid RAG
  • Vector embeddings
  • Reranking
  • SSE streaming
  • Structured output
  • Retrieval eval
  • DSPy

Data & Infrastructure

  • MongoDB
  • PostgreSQL
  • SQL Server
  • SQLite FTS5
  • Docker Compose
  • GitLab CI
  • Linux
  • Nginx
  • Cloudflare
  • Firebase
  • Azure App Service

Education

Bachelor's degree, Software Engineering

North Bangkok University · Bangkok, Thailand

Languages

Thai — Native

Native proficiency

English — Professional working

Read documentation and specifications, write code and technical docs, handle written communication.

Jeerawut Buayoy · Senior Full-Stack Engineer

© 2026 · Pathum Thani, Thailand