Kemenperin
Programs.
Programs for the Ministry of Industry, Republic of Indonesia — rebuilt since 2024. PHP 5 to PHP 8, React + Hono, and the Svelte + Go + Python platform running today.
Business Matching
Four stack eras since 2024 — the complete development history of Kemenperin’s Business Matching platform, from a PHP 5 monolith to the Svelte + Go + Python system running at bm-online.id today.
PHP 5 — The First Platform
The first incarnation of Business Matching for Kemenperin ran on PHP 5 — a classic server-rendered monolith where every page was generated on request. IKM (small & medium industry) actors could register a company, list products in a catalog, and submit matching requests ahead of ministry-run business matching events.
It did the job. Manufacturers adopted a digital matching channel for the first time, and ministry staff gained an admin view over participants. But the stack was aging fast: no dependency isolation, legacy mysql_* patterns in places, and an increasingly brittle deployment on shared hosting.
Early PHP 5 interface — February 2024
PHP 5 platform — March 2024
PHP 5 admin — March 2024
Proved the model — industry would match online — but the runtime had no headroom left.
PHP 8 — The Modernized Monolith
The second era rebuilt the platform on PHP 8 — same monolith shape, professional internals, developed through 2024 and running into early 2025. Typed function signatures, Composer-managed dependencies, and PDO prepared statements replaced the legacy patterns. The registration and matching flows gained server-side validation that actually held up under real ministry events.
For the first time the codebase had tests covering the critical paths, and ministry staff got a dedicated admin panel to curate participants, approve companies, and schedule one-on-one matching sessions between buyers and producers.
PHP 8 dashboard — January 2025
Company management
Matching workflow
Event scheduling
Participant list
Reports
Settings
PHP 8 platform — February 2025
Same shape, professional internals — the modernization that bought the platform time.
React + TypeScript → Hono — The Decoupled Era
Era three, landing at the end of 2025, split Business Matching in two: a React SPA for participants and a Hono-powered TypeScript API serving the data. Decoupling unlocked a genuinely mobile-friendly experience for factory-floor users and let the API serve more than one consumer.
JWT-based auth replaced server sessions, PostgreSQL replaced MySQL, and the matching workflow became an explicit API contract instead of implicit page logic. The trade-off was real though — two codebases, two deploy pipelines, and validation rules duplicated on both sides.
React participant app — December 2025
Company profile, decoupled
Matching interface
Directory view
Detail view
React + Hono — December 2025
React dashboard
React + Hono final build
A real API and a real SPA — but double the maintenance for a small team.
SvelteKit + TypeScript → Go → Python — bm-online.id
Era four is the current production system at bm-online.id — a service constellation, not another monolith. SvelteKit is the primary application server: it owns Better Auth sessions, SSR, the public REST API, and every write to Neon Postgres via Drizzle. The Go backend mirrors the hot read paths at higher throughput and runs the realtime aggregation layer — a 3-second watermark poller feeding Phoenix Channels and SSE.
Python owns the compute-heavy ML work through two dedicated services: ONNX embeddings behind a Rust LRU/TTL cache for codification similarity, and a Prophet forecast service with Indonesian holiday regressors. Go calls them over typed internal APIs and stays the single public gateway — one binary in front, purpose-built services behind.
Not a rewrite — a constellation. SvelteKit serves, Go mirrors, Python thinks.
P3DN Fasilitasi
The facilitation arm of Kemenperin’s P3DN program — built greenfield in 2025 on SvelteKit + TypeScript + Supabase, the stack the older platforms spent years earning.
SvelteKit + Supabase — Built Right the First Time
P3DN Fasilitasi — the facilitation arm of Kemenperin’s P3DN program (Peningkatan Penggunaan Produk Dalam Negeri) — is the youngest of the three systems and the only one with no migration story. Built from scratch in 2025, it went straight onto SvelteKit + TypeScript with Supabase handling auth, the PostgreSQL database, and storage for facilitation documents.
The facilitation pipeline — request, document review, verification, facilitated, reported — was designed in from day one instead of being reverse-engineered out of a monolith. Companies submit requests and track them through the stages; staff work a typed review queue; Supabase’s managed layer kept the team focused on the program’s workflow instead of infrastructure.
P3DN Fasilitasi home
Facilitation request flow
Request tracking
Document review
Staff review queue
Admin console
The platform Business Matching took eight years to reach — P3DN started there.
TKDN Website
The public face of domestic-content certification — from a PHP 5 certificate bulletin to an instant, API-verifiable registry on the shared Svelte + Go platform.
PHP 5 — The Certificate Bulletin
The TKDN (Tingkat Komponen Dalam Negeri — domestic content level) website began on the same PHP 5 stack as the other Kemenperin systems. Companies submitted certification requests, uploaded supporting documents, and looked up issued TKDN certificates through server-rendered pages backed by a single MySQL database.
Public visitors could verify certificate numbers — a critical trust function for government procurement — but the lookup was a plain table scan behind a form, and every certificate cycle meant staff keying in results by hand.
Certificate lookup
Certification submission
Admin certificate list
Put the certificate registry online — lookup worked, but nothing was built to scale trust.
PHP 8 — The Structured Registry
The PHP 8 rebuild gave the TKDN registry real structure. Certification requests moved through explicit verification stages, required documents became typed checklists, and certificates themselves became first-class records — number, product scope, validity window, and the calculation breakdown behind the TKDN percentage.
The public lookup became an indexed search instead of a table scan, and staff gained batch tools for issuing certificates at the end of each verification cycle.
Structured certificate registry
Verification pipeline
Indexed public search
Certificates became data — searchable, structured, and auditable for the first time.
React + Hono — The Public Verification API
Era three moved TKDN to the decoupled stack shared across Kemenperin systems: a React portal where applicants tracked their certification status in real time, and a Hono API that exposed certificate verification as a public endpoint — so procurement systems and buyers could validate a TKDN number programmatically, not just by reading a PDF.
Behind the portal, staff worked from a typed review queue with the same staged pipeline, now fed by asynchronous document uploads instead of single form posts.
Self-service applicant portal
Public certificate verification
Staff review queue
Verification became an API — trust in TKDN certificates stopped depending on a phone call.
Svelte + Go — The Consolidated Registry
The current TKDN website runs on the consolidated Svelte + Go platform shared with Business Matching and P3DN Fasilitasi. The SvelteKit frontend serves the public certificate lookup with SSR speed, while the Go backend handles application intake, the verification pipeline, and the public verification API from a single binary.
Three Kemenperin programs now share one stack and one deployment story — the TKDN registry benefits from every platform improvement the other systems drive, and certificate verification stays fast enough for procurement systems to call in-line.
Current platform home
Instant certificate lookup
Staff console
Three programs, one platform — the certificate registry that procurement can actually depend on.
Three programs.
One mission.
Still running.
Kemenperin's programs — from PHP 5 monoliths to the modern stacks carrying them into the next era.