Thanakrit
Thanyawatsakul.
Full-Stack Developer · Next.js / TypeScript
I build production web apps end-to-end. From hotel software to bilingual B2B sites, I focus on performance, test coverage, and clean CI before anything ships.
Things I've shipped.
Personal work, freelance, and company projects. Some solo, some with a team.
A gallery app built to sharpen React patterns. Stable masonry with zero layout shift, full-screen lightbox, keyboard nav, infinite scroll, and keyword filtering. Vitest at 100%, Playwright E2E, SonarQube clean.
function buildColumns(items: Photo[], cols: number) {
const heights = Array(cols).fill(0);
return items.reduce((acc, item) => {
const col = heights.indexOf(Math.min(...heights));
acc[col].push(item); heights[col] += item.height / item.width;
return acc;
}, Array.from({ length: cols }, () => []));
}
Company platform built solo. Multi-locale EN/TH routing, PWA with service worker, rate limiting, structured logging, security headers (CSP, HSTS, XSS), GitHub Actions CI/CD, and Docker multi-stage builds.
export async function GET(): Promise<Response> {
const checks = await runHealthChecks();
return Response.json({
status: checks.every(c => c.ok) ? 'healthy' : 'degraded',
uptime: process.uptime(), checks,
});
}
| # | Project | Type | Link |
|---|---|---|---|
| 003 |
PURA PMS
Hotel property management system. Monorepo with Next.js frontend and NestJS API. Auth, rooms, guests, and reservations done. Runs on mock data for demo.
Next.js 16
NestJS 11
PostgreSQL
Turborepo
Prisma
TanStack Query
|
Personal · 2/7 phases | Demo |
| 004 |
S.K. Charoensup Engineering
B2B company website for an electrical engineering firm. Bilingual EN/TH, Payload CMS, CI/CD. I handled frontend, CMS setup, testing, and deployment.
Next.js 15
Payload CMS
next-intl
SonarQube
Vitest
$ npm run build
Compiling pages (EN/TH)...
✓ Build complete
|
Freelance · Team | Private |
| 005 |
Sprouting Tech Marketing
One-page company site built solo. Token-driven dark design system, Lenis smooth scroll, Framer Motion, bilingual TH/EN, contact form via Supabase + Resend.
Next.js 15
Framer Motion
Lenis
Supabase
Resend
Zod
|
Company · Solo | Live |
| 006 |
ThaiParts Infinity
B2B industrial parts site. Team of four; 26 of 64 commits. Built carousel sections, React Email templates, contact form via Resend. ESLint/Prettier config and code review.
Next.js 15
Framer Motion
Embla Carousel
React Email
Tailwind v4
|
Company · Contributor | Live |
| 007 |
Sprouting Academy
Online learning platform. Top contributor on the frontend (98 of 394 commits), team of nine. Page architecture, CMS integration, loading skeletons, SEO metadata, SonarQube quality gates.
Next.js 15
SonarQube
Docker
next-intl
Husky
GitHub Actions
|
Company · Frontend Lead | Live |
| — |
Lighthouse Score
Every project I ship targets 100/100 across all four categories.
—
Performance —
Accessibility —
Best Practices —
SEO |
Interactive |
What I work with.
Mostly TypeScript across the stack. Tests and CI solid before shipping.
Recent work, in order.
Highlights from the last couple of months across personal and professional projects.
Extracted SquareFilterButton into its own file, hit 100% coverage, and cleared all quality gates before committing.
Found and fixed a pagination failure caused by fast scrolling. Rewrote the hook using threshold cascading so it never misses a sentinel. Added mock-driven tests to cover the edge case.
Cleared every ESLint error and warning in the skcharoensup project. pnpm lint exits clean.
Rewrote sitemap.ts and the article page to pass cognitive complexity checks and reach 100% test coverage.
Patched 1 critical, 25 high, and 14 moderate vulnerabilities in the Next.js + Payload CMS stack through targeted upgrades and package overrides.
Injected DATABASE_URI and PAYLOAD_SECRET as GitHub Actions secrets so static generation could run in CI. Removed the force-dynamic workarounds.
Get in touch.
Open to full-time roles and freelance. Based in Chiang Mai — fully remote-ready.
Chiang Mai, Thailand · Available now · Responds within 24 h