Context
GBKP Runggun Gading Serpong is a Karo Batak Protestant congregation in Tangerang. They needed one place for service schedules, weekly bulletins, devotionals, and service-request forms — something the church committee could update without calling a developer.
What I built
A Next.js site with Payload CMS and a SQLite database, plus a Christmas 2026 microsite with its own seasonal theme. The Karo ornaments on the site (pengeret-ret and uis patterns) are redrawn as SVG rather than pasted in as images.
The interesting problem: cheap hosting
The budget covered shared cPanel hosting: no SSH, 1 GB of RAM, and a 100-process limit per account. On first launch the site went straight to 503 — 99 of 100 processes in use.
The cause: three native libraries each sized their thread pool to the physical server's core count, not to my account. The fix was to cap every pool explicitly at startup:
UV_THREADPOOL_SIZE=2 VIPS_CONCURRENCY=1 TOKIO_WORKER_THREADS=2
Under 10 concurrent requests, usage dropped to 9–13 of 100 processes. With no SSH, I also wrote a build script that packages the app with the correct Linux binaries, ready to upload through the file manager.
Congregation data
The request forms expose no public API. Everything goes through one server action with the same validation on client and server, bot protection, and rate limiting that never stores a visitor's IP address — in line with Indonesia's personal-data protection law.