Thaitober
draw every day in OctoberA 31 day drawing challenge with a Thai theme.
- Context
- Personal project
- Role
- Built on my own
- Status
- Live(Last updated Oct, 2026)
- Built with
- Next.js, TypeScript, tRPC, shadcn/ui, Neon Postgres, Better Auth, Cloudflare R2, PostHog, Tally, Vercel

Thaitober is a drawing challenge with a Thai theme. There are 31 prompts for the 31 days of October, starting on October 1. You can draw, paint or just sketch, and read each prompt any way you like. Then share your work on the site.
I loved drawing long before I learned to code. This idea sat in my head for years. It's inspired by Artober, mixed with a Thai twist. This year my skills felt ready, I had the time, and tools have come far enough that I could build it much faster. So I went for it.
What it does
- Daily prompts. A new drawing prompt is released every day.
- Easy to join. Anyone can submit their work and take part.
- Community. Like, comment on and follow other artists.
- More to come. New features are on the way.
Technical decisions
Design first, then the real system
The first version ran fully in the browser with mock data. I polished the UX and UI until it felt right, and only then connected the real backend.
Working with AI agents
I used spec-driven development so the AI agent and I agreed on what to build, and its work was easy to review. Test-driven development added confidence, and I made sure I understood every test the AI wrote.
I planned the work in Linear and wrote a skill that drafts stories and links them to branches and pull requests, so it's easy to trace a change back later.
The stack
The T3 Stack (TypeScript, Next.js and tRPC) is familiar, quick to set up and a good fit for a small project. shadcn/ui keeps the interface clean and polished.
Neon gives me serverless Postgres that is easy to manage and free. Better Auth handles sign in. Images go to Cloudflare R2, converted to .webp and always compressed under 1 MB. PostHog shows how people use the site, and Tally covers simple forms that don't need to live in the database.