← All work

Work 02 / 05

GBKP Runggun Gading Serpong

A congregation website with a CMS for services, bulletins, and requests — running on shared hosting without SSH.

Role
Lead developer
Year
2026
Stack
Next.js, Payload CMS, SQLite, Tailwind CSS
Website
gbkpgadis.com ↗

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.