Software Engineer
Saranyoo Phetkamphaeng
Full-Stack Developer
Platform | DevOps | AI
I build and run production systems, from the database to the cluster.
Thailand (GMT+7)
CORE STACK
- APPLICATIONS
- TypeScript, React / Next.js, Vue 3 / Nuxt, TailwindCSS
- SERVICES
- NestJS, Node.js, C# (.NET 8), Go, Python, OpenAPI
- DATA & MESSAGING
- PostgreSQL (incl. RLS), Prisma, Drizzle ORM, Redis, RabbitMQ, AWS SQS
- PLATFORM & DELIVERY
- Kubernetes, Docker, Linux, Terraform, AWS / GCP, GitHub Actions, WireGuard
01 / Architecture
How a system flows
Four stages, end to end. Each one is a system I built or ran.
Pick a stage, or use the arrow keys
Ingest | work | production platform, 2026
Connect Broker: messaging integration
Owned a multi-tenant platform connecting LINE and Meta, from provider authorization through webhook ingestion and downstream delivery.
- NestJS
- Next.js
- TypeScript
- Turborepo
02 / Work
Selected work
Impact first, technology after. Open any card for the case study.
AI | 2026
Mek AI: LLM features
Built multi-step tool calling for a sales chatbot on LINE, Facebook and Instagram, grounded in each shop's products and documents.
- TypeScript
- NestJS
- Vercel AI SDK
- pgvector
- Claude
- Gemini
View case study: Mek AI: LLM features
- RAG pipeline with document chunking, embeddings, pgvector similarity search and multimodal PDF ingestion with Gemini.
- Semantic answer cache with an LLM reranker to cut repeated AI spend; streaming responses over WebSocket; task-based model routing across Claude, Gemini and OpenAI; AI credit checks and PII redaction in logs.
PLATFORM | 2026
Connect Broker: messaging integration
Owned a multi-tenant platform connecting LINE and Meta, from provider authorization through webhook ingestion and downstream delivery.
- NestJS
- Next.js
- TypeScript
- Turborepo
View case study: Connect Broker: messaging integration
- Shared typed contracts connect the NestJS API and Next.js dashboard; operations include delivery health, per-process circuit breakers, rate limiting and audit trails.
- Problem
- Provider onboarding and webhook delivery need consistent tenant boundaries and a visible failure path.
- Approach
- Built connection flows, ingestion and outbound delivery as one platform. Circuit-breaker state is in memory per process; it is not shared between workers.
- Evidence & scope
- Local circuit-breaker unit tests cover its state transitions. Separate integration checks exist for Meta connection and ingestion, webhook rate limiting and authorization; those checks were not rerun against external services in this review. Inbox latency measurements belong to the separate Omnichat work below.
PERFORMANCE | 2026
Omnichat: inbox performance and tenant isolation
Performance optimization: replaced per-row RLS helpers with set membership, making the branch-admin inbox significantly faster.
- NestJS
- Next.js
- PostgreSQL (incl. RLS)
- Drizzle ORM
View case study: Omnichat: inbox performance and tenant isolation
- Verified the change against the prior baseline for data loss and cross-tenant leakage, retaining the database authorization boundary.
- Problem
- SETOF helpers in row-level security policies repeatedly scanned membership data. The cost came from repeated work, not simply insufficient compute.
- Approach
- Changed visibility checks to set membership and staged function creation before switching policies so application dependencies existed before rollout.
- Evidence & scope
- The rollout record contains before/after baselines, cross-tenant checks and scale fixtures. The improvement was measured for a particular persona, not a universal latency guarantee; wider org-level queries remained separate work.
INFRASTRUCTURE | 2024 to Present
Self-Hosted Infrastructure: designed and operated
Multi-node k3s cluster spanning on-premise and VPS sites over a WireGuard mesh, running on two Proxmox hosts with cloud-init VM provisioning.
- Kubernetes (k3s)
- Proxmox
- WireGuard
- Kustomize
- Terraform
- Prometheus
- Grafana Alloy
- Cloudflare Tunnel
View case study: Self-Hosted Infrastructure: designed and operated
- Kustomize-based GitOps with a strict kubectl diff = 0 invariant: anything running must exist in git; decommissioned workloads are archived with the reason and a restore path.
- Ran the full kube-prometheus stack, then measured it: a large active-series count on a small cluster, short retention, alerts reaching nobody, and the Prometheus pod living on the node whose failure it was meant to explain. Removed it and ship telemetry out through Grafana Alloy instead; per-service request metrics still come through Traefik.
- Segmented the mesh by team with group-based policy, putting a jump host in front of production and scoping SSH to a single port and direction. Advertised the cluster Service and Pod CIDRs as subnet routes so the team can reach in-cluster services without per-developer port-forwards.
- Automated etcd snapshot backup and integrity checks, with a documented manual restore procedure. A full restore drill has not yet been recorded. NetworkPolicy enforcement and replicated Cloudflare tunnels are managed through manifests.
- Diagnosed and resolved a provider-side disk IOPS throttling incident (root cause: memory pressure + page-in stalls) and documented a repeatable check.
- Consolidated the manifest repository to a fraction of its original size while keeping the cluster running.
- Problem
- Monitoring consumed scarce resources while its placement meant evidence could disappear with the node being investigated.
- Approach
- Measured the existing stack, removed unused components and moved telemetry through Alloy. Retained dashboard and alert exports alongside the operational repository.
- Evidence & scope
- The August 2026 decommission record lists the active series removed and the RAM reclaimed.
03 / Experience
Where I have worked
6+ years of hands-on experience, from product teams to platforms.
2025.11 to 2026.10
Mekha Innovation Co., Ltd
Full-Stack Developer
- SHIPPED
- Mek AI
- Sole owner of a multi-tenant webhook ingestion and connect-broker platform (LINE/Meta). I designed and built it, and it has been running in production since July 2026. The stack is a NestJS and Next.js Turborepo monorepo with shared typed contracts.
- Sole owner of infrastructure & operations: Terraform IaC on AWS/BytePlus, an on-prem k0s production cluster with role-separated API/app/storage node pools, CI/CD, deployments, incident response and backup/restore.
More highlights and stack: Mekha Innovation Co., Ltd
- Mek AI is a production SaaS product and one of my two largest contributions. I worked on solution architecture for the web and API, the AI content pipeline, chatbot and RAG, workflow automation, LINE/Facebook/Instagram integrations, GCP Cloud Run and Pub/Sub, and Supabase. Later, I migrated the service from Cloud Run and Artifact Registry to a self-hosted registry and static host.
- I was the single largest contributor to the omnichannel support inbox for LINE, Messenger, Instagram, and WhatsApp. The system uses NestJS, Next.js, Postgres row-level security, and multi-tenant isolation.
- Performance optimization: made that inbox significantly faster for its busiest persona by replacing a SETOF-function RLS policy with pure set-membership. Verified the result against the pre-change baseline for both data loss and cross-tenant leakage.
- Delivered across multiple products using TypeScript, .NET 8 (EF Core and MassTransit/RabbitMQ), Go, Vue, and Next.js. I also reviewed and integrated work from other developers.
- Aurora / Thong Ma Ngern Pai: started the Vue LIFF front end, the back office and the Kubernetes layer, and wrote most of the .NET 8 backend.
- Hardened multi-tenant security by re-imposing tenant boundaries on RLS-bypassed tables, fixing socket authentication, and enforcing tenant authorization on broadcast and list endpoints.
- Built load-testing and CPU-profiling tooling; documented measured failover behaviour rather than assumed behaviour.
- Ran a security review of a sibling product (authentication deep-dive: account-takeover path, MFA enrolment bypass, missing logout) and drove the fixes.
- Established cross-repository conventions for environment vocabulary, immutable image tagging, build-once/promote-by-sha, and shared reusable CI workflows.
- NestJS
- Next.js
- .NET 8 / EF Core
- Go
- Vue/Nuxt
- PostgreSQL + (RLS)
- MSSQL
- Drizzle
- RabbitMQ / MassTransit
- Kubernetes (k0s)
- Terraform
- AWS / BytePlus / GCP
- Supabase
- Turborepo
- Zod
2024.02 to 2025.10
Emetworks Co., Ltd
Full-Stack Developer
- SHIPPED
- EX10
- Developed and maintained the EX10 CRM on the EX10 Engagement Platform using Vue, Nuxt, Node.js and Go.
- Backend engineer for 21 months on a bank's customer loyalty CRM API (Express.js), working on the campaign engine, points and rewards, and LINE bot integration.
More highlights and stack: Emetworks Co., Ltd
- Implemented loyalty program modules for rewards, campaigns, member tiers, and reporting.
- Integrated e-commerce platforms (Shopee, Lazada, TikTok, Bentoweb) through SQS queues.
- Worked with AWS services including S3, CloudFront, SQS, EC2 and Lambda.
- Developed and documented the POS API to OpenAPI standards.
- Vue
- Nuxt
- Node.js
- Express.js
- Go
- AWS (SQS, Lambda, S3, CloudFront, EC2)
- MongoDB
- GitLab CI
- OpenAPI
2022.08 to 2024.01
Nippon Sysits Co., Ltd
Full-Stack Developer
- SHIPPED
- Red Cross Eye Bank (EBIS)
- Developed frontend UI and backend APIs for large internal healthcare systems, working inside an established multi-team codebase.
- TBIS (blood donation): profile validation, document templates, monitoring for file-transfer failures.
More highlights and stack: Nippon Sysits Co., Ltd
- TBIS-SCAN: converted scanned documents to e-documents (Vue 3, Express.js).
- Red Cross Eye Bank: donor queue, surgery records and reporting modules, and sole author of its VB service.
- Started TBIS-F, a new internal system.
- Deployed applications to UAT and production environments.
- Vue 3
- Express.js
- .NET / VB
- MSSQL
- REST
2021.12 to 2022.07
Realtech Co., Ltd
Full-Stack Developer
- Built NestJS modules and services for a high-volume transaction platform.
- Authored a reusable, documented and unit-tested NestJS module for Google Pub/Sub used across services.
More highlights and stack: Realtech Co., Ltd
- High-throughput transaction logging APIs.
- Near real-time reporting services.
- NestJS
- TypeScript
- Google Pub/Sub
- Docker
2019.11 to 2021.11
Digitalmerce Co., Ltd
Full-Stack Developer
- SHIPPED
- Lalanta
- Sole developer of a venue booking and operations back office built with Laravel 8, Blade, AdminLTE, and MySQL. The system has 30 domain models, 20 controllers, and 29 migrations.
- Booking engine with a configurable status workflow, capacity limits per zone and area, dynamic pricing rules and payment verification/approval flows.
More highlights and stack: Digitalmerce Co., Ltd
- Equipment borrow/return, food & beverage catalogue, and bulk CSV import modules.
- Access control by role, department and position; daily summary and financial reporting.
- JSON API layer consumed by the customer-facing booking flow.
- Deployed to UAT and production servers.
- Laravel 8
- Blade
- AdminLTE
- MySQL
- PHP 7/8
04 / Toolkit
Tools and practices
Skills, and the practices that keep them honest.
Technical skills
- Applications
- TypeScript
- React / Next.js
- Vue 3 / Nuxt
- TailwindCSS
- Services
- NestJS
- Node.js
- C# (.NET 8)
- Go
- Python
- OpenAPI
- Data & messaging
- PostgreSQL (incl. RLS)
- Prisma
- Drizzle ORM
- Redis
- RabbitMQ
- AWS SQS
- Platform & delivery
- Kubernetes
- Docker
- Linux
- Terraform
- AWS / GCP
- GitHub Actions
- WireGuard
- AI & verification
- Claude Code
- OpenAI
- RAG
- MCP
- agent evaluation
- Playwright
- k6 load testing
- Education
- Self-taught, with 6+ years of hands-on experience
How I work
I like problems that start out vague, such as a page that just “feels slow” or a job that quietly stopped running, and end with a number anyone can check. I also like software that is orderly and easy to use; Kubernetes and NestJS are two I enjoy working with for exactly that reason. I use structure when the problem calls for it, so a pattern earns its place because it helps, not because it is on a list.
Capability-based authorization
Runtime-editable permissions instead of a role enum, so who can do what changes without a deploy or a re-login.
N/N-1 compatible deploys
Schema goes out ahead of the code that reads it, with the previous version still serving throughout.
Legacy migration & ETL
Idempotent, dry-run-first imports that reconcile against the source and reject what cannot be trusted.
LLM confined to read-only SQL views
The boundary is a database GRANT, not a sentence in the system prompt.
Independent acceptance review
A separate reviewer role that can return FAIL and is not the one that wrote the change.