Car Dealership Platform
Multi-branch car-dealership website (5 showroom locations) with an admin panel — dual-deployed from one codebase to a brand domain and a hosting subdomain.
PM + Tech Consultant
A PM who learned to code through vibe coding with Claude Code. 147 days in. 90+ products built.
The Journey
The Starting Point
I'm a PM and Tech Consultant who loves building tech products for clients. But I always depended on developers for every step. I had ideas, I had specs, I had wireframes — but I couldn't build anything myself.
Learning From Others
May Jaruwat taught me the basics of Terminal. I gave up — I didn't understand the fundamentals. Then Ton Preerasak and Aek Prasert showed me how to set up Claude Code. Everything clicked. Suddenly, I could talk to a computer and it would build what I described.
Today
In just 147 days with Claude Code, I've built over 90 products— from event ticketing systems to ride-hailing apps on LINE. Every single one was vibe coded. No traditional coding background. This page you're reading? Also vibe coded.
90+
Products Built
147d
of Vibe Coding
100%
Vibe Coded
Selected Projects
Hand-picked from 90+ projects. Every one started as a conversation with Claude Code.
Multi-branch car-dealership website (5 showroom locations) with an admin panel — dual-deployed from one codebase to a brand domain and a hosting subdomain.
Electron desktop browser with an embedded MCP server — Claude can control tabs, navigate, capture screenshots, and read console/network through 51 tools.
macOS menu-bar app for Thai speech-to-text with on-device recognition and TH→EN translation via Apple Translation — triggered by double-tap Control.
Python automation that uses Claude Vision to write Thai captions from photos, then schedules Facebook posts through Playwright browser automation.
Landscape PWA for reading Gmail on an iPad with a PS5 DualSense controller — Square deletes, D-Pad archives or snoozes, Triangle assigns.
mbt-store.vercel.app
B2B stock manager for an authentic used football-studs business — each pair a unique SKU with brand, size, grade, and photos for partner catalog access.
LINE LIFF platform for hiring drivers in Korat — Night Mode for safe rides home after drinking, Day Mode for long-distance day trips.
Admin CMS for nimittarot.com — manages tarot cards, meanings, members, and payment logs against the existing Supabase backend (no schema migration).
Mobile companion for durian farmers — combines the on-scale weighing counter with a month-grid garden-care calendar (water, fertilizer, pruning).
Mobile-first event hub for a Thai telco's annual ~400-attendee company gathering — agenda, session info, and on-the-day experience optimised for phones.
Public website + member back-office for a regional digital association — 5-tier membership registry, committee directory, and activity management.
29M THB Thai government platform (พก./พม.) for monitoring and managing care of ~500 dependent persons with disabilities at pilot centers.
Autonomous website health audit service — analyses Performance, SEO, Security, DNS, and Tech Stack from a public URL only.
Mini driving game built on mapcn (React + MapLibre GL + shadcn/ui) exploring map-based interactions around Korat.
kk-vibes-checkin.vercel.app
Mobile-first mockup for POP & LOVE Concert (@ZEERRANGSIT) with check-in, partner benefits, QR redemption, and login.
Mobile family-tree builder for a Thai-Chinese clan — supports cross-family marriages, alternate-code overrides for in-laws, and photo uploads.
Daily SET100 stock reports produced by the VI-Sniper workflow — sorted by projected dividend per month of 1M THB invested.
.NET 10 global CLI that lets Claude Code manage Trello boards, lists, and cards through natural language.
Utility tools website for BNI chapter members — mobile-first PWA with Thai UI and a grid of single-purpose tools.
Personal collection of everyday utility tools (client-side first) with Supabase auth. Add a new tool by dropping a route folder.
dosx-vibecheck.vercel.app
Report hosting hub for /vibecheck website audits — one subpath per audited site (poolvillath, foundy, nimittarot, etc.).
Face search system that lets event attendees find their photos in online galleries using facial recognition on GCP-stored images.
AI work team that analyzes Thai stocks using Value Investing principles. 7 specialized agents handle everything from fundamental to technical analysis.
events.makebytle.com
Ticketing system for events — public storefront, checkout with slip upload, e-tickets with QR, and admin dashboard for events and check-in.
LINE LIFF ride-hailing platform where drivers receive job announcements as Thai TTS audio through Zello Work radio channels.
White-label service matching platform pairing customers with electricians, AC techs, and cleaners via LINE OA + LIFF (per-agent OA).
LINE LIFF super-platform for Khao Yai — B2B e-procurement, on-demand urgent services, verified accommodation, and local food delivery.
AI digital concierge for home construction and interior design businesses — 24/7 multi-channel chatbot with auto-quote PDFs and booking.
First-of-its-kind community unconference in northeastern Thailand — 200-300 attendees, community-funded budget with tiered sponsorship.
LINE-first loyalty and rewards platform with gamification, geofenced missions, and multi-tenant support for cities, orgs, and merchants.
m.bni-power.com
Mobile web app for BNI Power Chapter Korat — member store directory with affiliate links, personalization, and JU member sync.
AI-powered coffee pick-up platform with AI work-team agents for orders, inventory, queue optimization, and customer recommendations.
PromptPay QR usability research campaign — 100 users pay at food courts using a custom iOS app (target: <3s transactions).
cal.madebytle.com
Chrome extension + Next.js web app that turns a Google Calendar event into a shareable, beautiful page with 'Add to Calendar' buttons.
Monorepo of two city-themed sites — an international hip-hop festival event site and an official regional tourism site sharing components and DB.
event-checkin-oa.vercel.app
LINE LIFF app for Thai Credit Bank's ~1,400-employee outing — 8 activities, QR scan check-in/out, leaderboard by person and department.
Mobile web app for weighing durian on scales and saving readings to the database — Clerk-gated, numeric keypad, Neon Postgres.
Mobile-first voting mini-site for a government entrepreneurship training program — candidate profiles, 28-voter ballot, and buddy lucky-draw for DIPROM คพอ. 430.
Public site + member back-office for a provincial tech association — 5-tier membership registry, committee directory, and activity management.
LINE OA-connected staff dashboard for an industrial packaging company — webhook intake from customers, Algolia product search, and reply dispatch via LINE.
Mobile-first event hub for a major Thai enterprise's annual gathering — agenda, session guide, and on-the-day information optimised for 400 attendees.
th-companies.vercel.app
Web app to search and filter 200K+ registered Thai companies — sector groups, annual registrations by year, and factory data from government sources.
Mistakes & Lessons
Every rule in my projects exists because I broke something first. Here are the stories behind the rules.
A dealership site had to live at both a brand domain (root path) and a hosting subdomain (with basePath) from the same codebase. Hardcoding the prefix broke navigation the moment we deployed to the wrong target. Now BASE_PATH is an env var and we build two outputs side-by-side.
Rule:Drive basePath from an env var — never hardcode the URL prefix
Deployed Handio to production and every single API call returned 404. Spent hours debugging. The cause? Missing /v1 suffix in the API URL. Now every project has an auto-append safety net in the API client.
Rule:Always append /v1 to API base URLs
Almost pushed database credentials to a public repo. Now every project starts with .gitignore before writing a single line of code. Multiple projects have this as rule #1.
Rule:Never commit .env files — ever
Wrote raw SQL queries in the Event Ticketing system. Realized it opened the door to SQL injection. Switched to Drizzle ORM exclusively — type-safe, no injection possible.
Rule:Use an ORM, never write raw SQL in production
Built VI Sniper's stock analysis using a global data provider. Turns out the AI pulled surface-level data when we needed deeper Thai-market specifics like BVPS and dividend details. The data wasn't wrong — we just needed a more specialized source.
Rule:Match your data source depth to your analysis depth
Handio's auto-dispatch used in-memory timers. Server restart = all pending dispatches lost. Learned that anything critical must be persisted to a database, not held in memory.
Rule:Never rely on in-memory state for critical features
Wrote beautiful folder trees with ├── and └── characters for an IoT laundry project's docs. Imported to Notion — completely mangled. Now all docs use plain indentation only.
Rule:No ASCII art or table alignment in docs bound for Notion
BNI Power's product images loaded without width/height — the entire page jumped around as images rendered. Fixed by enforcing dimensions on every image and using lazy-fade loading.
Rule:Always set width & height on images to prevent CLS
Almost created separate LINE Login channels for each Handio agent. Discovered you only need a Messaging API channel per agent — the customer app deploys once and uses URL params to switch.
Rule:Reuse infrastructure — deploy once, configure per-instance
An IoT laundry project's maintenance alerts fired before the actual task completed — using augmented time instead of real program time. Users got confused. Timing in IoT is harder than you think.
Rule:Use actual completion events, not predicted timestamps
Working on projects with sensitive user data taught me the hard way — PDPA compliance and data protection need to be baked into the architecture from day one, not bolted on after launch.
Rule:Design for compliance from the start
Yahoo Finance's data for Thai stock BVPS, EPS, and dividends was consistently wrong during VI-Sniper research. After burning hours on bad numbers, we banned it outright from the pipeline.
Rule:For Thai stock data, pull from aio.panphol.com or Settrade — never Yahoo Finance
On the Durian Counter scale, the native iOS/Android keyboard kept hiding the submit button and slowed entry for users with dirty hands. A read-only input with a custom on-screen keypad fixed it instantly.
Rule:For mobile numeric entry, use a read-only input + custom on-screen keypad
Web Clinic by NDA is designed to never request server access — all findings come from public data (HTML, headers, DNS, CLI tools) so it can be offered as a safe autonomous service with no client trust barrier.
Rule:Never ask for SSH, DB, or login during a site audit — public data only
The DOSX corporate WordPress site was hit with a casino spam injection and had to be cleaned and patched. Unattended legacy installs are sitting ducks for drive-by injections.
Rule:Legacy WordPress must be patched, hardened, and monitored — or it gets injected
3rd-Party Ecosystem
The ecosystem of tools, APIs, and platforms that power my projects — discovered and integrated through vibe coding.
Thunder Slip API
Auto-verify Thai bank transfer slips — no manual checking
Stripe
International card payments & subscription billing
OPN (Omise)
PromptPay & mobile wallet payments for Thai market
2C2P
Thai-focused card & QR payment gateway for enterprise apps
PromptPay QR
National QR payment standard — Thailand's default checkout
LINE Messaging API
Push notifications, rich menus, chatbot interactions
LINE LIFF
Full web apps running inside LINE — no separate app needed
LINE Login
One-tap authentication using existing LINE accounts
Claude AI
The engine behind everything — vibe coding all 90+ projects
DeepFace
Python facial recognition for event photo matching
Google Cloud TTS
Text-to-speech for driver dispatch announcements
Gemini
Google's generative AI — used for grant-writing workshops
Playwright
Headless browser automation — schedules Facebook posts end-to-end
MCP SDK
Embed an MCP server in any app so Claude can call its tools directly
Apple Translation
On-device TH→EN translation framework (macOS 14.4+) — no network call
Neon Postgres
Serverless PostgreSQL — scales to zero, branches like git
Supabase
Postgres + auth + realtime — backend in a box
Drizzle ORM
Type-safe SQL queries — no raw SQL, no injection risks
Cloudflare D1
SQLite at the edge — perfect for low-latency reads
Cloudflare R2
Zero-egress object storage — pairs with Workers and D1
Clerk
Drop-in authentication with managed sign-in, sign-up, and session handling
NextAuth.js v5
Auth.js for Next.js — Google OAuth with Gmail readonly + modify scopes
Vercel Blob
Object storage right next to your Vercel app — perfect for product photos
Vercel
One-click Next.js deployments with edge functions
Cloudflare Workers
Serverless functions on the edge — sub-50ms cold starts
Google Cloud Run
Containerized deployments for heavier workloads
Mixpanel
Product analytics with event tracking & user funnels
Sentry
Error tracking — catch bugs before users report them
Lighthouse
Automated web audits for Performance, SEO, and Accessibility
OneSignal
Push notifications across iOS, Android, and web
Google Maps API
Geocoding, distance calculation, and store locators
MapLibre GL
Open-source vector maps — no Google dependency
Algolia
Lightning-fast full-text search with typo tolerance
OFM API
Product catalog sync for office furniture and supplies
Swift (iOS 18.5+)
Native iOS app with Control Center widget — VIP pattern + state machines
Chrome Extension (MV3)
Manifest V3 extension with content script + service worker architecture
Flutter
Cross-platform mobile app with native-feel UI
WidgetKit
iOS home-screen and Control Center widgets — sub-3s QR launch
Zello Work API
Radio-style push-to-talk channels for driver broadcasts
Electron
Cross-platform desktop apps with a real Chromium engine + Node.js
Gamepad API
Browser-native PS5 / Xbox controller input — D-Pad, sticks, buttons
Speech Framework
Apple's on-device speech recognition — locked to th-TH locale
Thank You
I didn't figure this out alone. These people gave me the push I needed.
🌱
May Jaruwat
Terminal foundations
Planted the seed
🚀
Ton Preerasak
Claude Code setup
Lit the fuse
🛠️
Aek Prasert
Claude Code setup
Built the launchpad