07/10
Case Study
New June 1, 2025 GovernmentKemenperinPHP

Business Matching — Kemenperin, Ministry of Industry

Eight years, four stacks, one mission — the complete development history of Kemenperin’s Business Matching platform, from a PHP 5 monolith to the Svelte + Go system running at bm-online.id today.

Year
2025
Focus
Government
Reading
4 min· 8 sections
Published
Web
Business Matching — Kemenperin, Ministry of Industry
Full Capture
Business Matching — Kemenperin, Ministry of Industry — detailed view

Project Overview

Business Matching is Kemenperin’s (Ministry of Industry, Republic of Indonesia) program for connecting Indonesian manufacturers and IKM actors with buyers, distributors, and export channels. The digital platform behind it has been rebuilt four times across eight years — each era matching the technology of its moment while preserving the program’s core mission. This case study documents the full arc: from a PHP 5 monolith through PHP 8 modernization, a decoupled React + Hono architecture, and the current Svelte + Go system running at bm-online.id.

"The program never stopped running through four complete rewrites. Each era kept the matching workflow intact while the technology underneath changed entirely."

Engineering Notes Kemenperin Business Matching

The Evolution — Four Stacks, One Mission

Every rewrite preserved the program’s core workflow while replacing the foundation underneath it.

01

01. PHP 5 — The First Platform · 2018 — 2020

The original Business Matching platform: a server-rendered PHP 5 monolith where company registration, product catalogs, and matchmaking requests all flowed through a single codebase backed by one MySQL database.

02

02. PHP 8 — The Modernized Monolith · 2020 — 2022

A ground-up rebuild on PHP 8: typed signatures, Composer dependencies, PDO prepared statements throughout, and a proper admin panel for curating participants and scheduling matching sessions.

03

03. React + Hono — The Decoupled Era · 2022 — 2024

The system split in two: a React single-page app for participants and a TypeScript API built on Hono. JWT auth replaced server sessions and PostgreSQL replaced MySQL — a real API for the first time.

04

04. Svelte + Go — bm-online.id · 2024 — Present

The current production system: a SvelteKit frontend and a Go backend in one deploy story. Shared validation schemas, single-binary Go deploys, and the fastest, cheapest version of the platform to run.

04 Stack Eras

Complete rewrites across the platform’s lifetime.

7+ Years in Service

Continuous operation since the first PHP 5 release.

04 Languages

PHP, TypeScript, Svelte, and Go across the eras.

bm-online.id Live Platform

The current Svelte + Go system in production.

Era 01 — 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. Recap — Proved the model — industry would match online — but the runtime had no headroom left.
Business Matching PHP 5 — admin dashboard

Legacy admin dashboard

Business Matching PHP 5 — company directory

Company directory

Business Matching PHP 5 — matching request form

Matching request form

Era 02 — PHP 8 — The Modernized Monolith

The second era rebuilt the platform on PHP 8 — same monolith shape, professional internals. 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. Recap — Same shape, professional internals — bought the platform years of stable service.
Business Matching PHP 8 — admin panel

Curated admin panel

Business Matching PHP 8 — product catalog

Product catalog

Business Matching PHP 8 — reports

Event reports

Era 03 — React + Hono — The Decoupled Era

Era three 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. Recap — A real API and a real SPA — but double the maintenance for a small team.
Business Matching React — participant home

React participant app

Business Matching Hono API — endpoints

Hono API surface

Business Matching React — company profile

Company profile, decoupled

Era 04 — Svelte + Go — bm-online.id

The current production system at bm-online.id consolidates every lesson from the earlier eras. A Svelte/SvelteKit frontend delivers SSR speed with SPA ergonomics in a single codebase, while a Go backend serves the matching API with a tiny footprint and single-binary deploys. Validation lives in shared schemas instead of duplicated client/server rules, the admin and public experiences share one deployment story, and infrastructure cost dropped to the lowest point in the platform’s history. Recap — One frontend, one backend, one deploy — the architecture the earlier eras were reaching for.
bm-online.id — current platform home

bm-online.id today

bm-online.id — matching workflow

Matching workflow, current

bm-online.id — dashboard

Participant dashboard

Lessons Carried Forward

What four rewrites of the same government platform teach you.

Rewrite Beats Patch

Each era replaced the foundation rather than patching it. Migrations were planned around program milestones — never mid-event — so the platform never went dark for participants.

Decouple Only When It Pays

The React + Hono split was right for its moment — real mobile usage, multiple API consumers. When the team no longer needed that flexibility, the Svelte + Go era consolidated again.

Type the Contracts

Every era tightened the contract between frontend and backend: PHP 8 types, then TypeScript end-to-end, then shared schemas between Svelte and Go. Each step deleted a class of integration bugs.

Own the Deploy

From FTP uploads on shared hosting to single-binary Go deploys — each era made shipping safer. The current stack deploys in minutes with a rollback story that actually works.

Where It Stands Today

bm-online.id is the living result of all four eras — the same Business Matching program Kemenperin started on PHP 5, now running on a stack designed to last the next era. The history above documents what changed, why it changed, and what each version looked like in production.