- 🛒 Currently building a headless e-commerce platform (Next.js storefront · Payload CMS · NestJS API) and a multi-tenant inventory / ERP system for a retail brand in Thailand.
- 🔁 Came up through Angular + Express + MySQL, moved to Next.js + NestJS + Prisma + Postgres, and shipped a few Ethereum / ERC-20 projects along the way.
- 🧭 Things I keep coming back to: typed contracts end-to-end, queues over cron, one service = one compose file, and a real UAT before anything touches prod.
- 🤖 I pair-program with AI every day (Claude Code,
AGENTS.mdconventions in every repo) and write my docs in Thai, my code in TypeScript. - 🇹🇭 Based in Bangkok.
| Languages |
|
| Frontend |
|
| Backend |
|
| CMS & Data |
|
| DevOps & Cloud |
|
| Testing & Tooling |
|
| Integrations |
|
|
Next.js 16 storefront (App Router, React 19, Tailwind v4, shadcn/ui) · Payload CMS 3 on Postgres with S3 media · NestJS API with Prisma 7 + BullMQ workers on Redis. Omise / PromptPay checkout, LINE LIFF login, subscription orders, Thai tax-invoice flow, rewards & coupons, cookie-consent records. |
NestJS + Prisma API: products & GTINs, purchase orders with carton labels, scan-to-receive with lot / expiry and FEFO picking, stock transfers, HMAC-signed store webhooks, Flash Express booking, passkey (WebAuthn) login. Next.js admin with QR / barcode scanning · order sync from Shopee, Lazada and TikTok Shop. |
|
Angular apps (v12 → v21, SSR) over Express services on MySQL + MongoDB, RabbitMQ workers, Socket.IO realtime, scheduled jobs, LINE and Facebook bots, PDF / Excel / shipping-label generation and a public parcel-tracking site. |
Three-VM layout (app / db / UAT) on a private network, Nginx + certbot in front, one Docker Compose file per service, Dozzle for logs. GitHub Actions: PR gate (lint · typecheck · build) → multi-stage Bun image → GHCR → SSH deploy with Prisma migrations. |
flowchart LR
PR["Pull request"] -->|"lint · typecheck · build"| CI{"CI passed?"}
CI -->|"merge → dev"| DEV["Build image → GHCR :dev"]
CI -->|"merge → main"| PROD["Build image → GHCR :latest"]
DEV -->|"ssh · compose pull · migrate · up"| UAT[("UAT server")]
PROD -->|"ssh · compose pull · migrate · up"| APP[("App server")]
APP -. "private network" .-> DB[("DB server · Postgres + Redis")]
Most of my day-to-day work lives in private org repos, so the numbers above are only the tip of the iceberg.




