Second audit under the Jakarta public transport umbrella: comuline.com replicates KAI Commuter's official partner API (api-partner.krl.co.id); its data has been frozen since ~2025-03-30. Adds the umbrella hub, the comuline topic (sources/analysis/recipes/next-steps), and links the existing transjakarta-live-data topic under the umbrella.
3.3 KiB
| title | description | status | category | tags | draft | created | updated | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Comuline — KRL Commuter Line Data (schedule API replication) | Reverse-engineering comuline.com: an open-source KRL schedule app whose public API replicates KAI Commuter's official partner API (api-partner.krl.co.id). Covers the pipeline, current staleness (data frozen ~Mar 2025), and usable endpoints. | concluded | technical |
|
true | 2026-10-12 | 2026-10-12 |
Comuline — KRL Commuter Line Data
Summary
comuline.com is an open-source KRL commuter-line schedule app (web + iOS + Android) by Abiel Zulio M (github.com/comuline). Its "own public API replication" is a daily ETL copy of KAI Commuter's official partner API (api-partner.krl.co.id/krl-webs/v1 — an official, token-gated API on the krl.co.id domain), re-served publicly at api.comuline.com.
Status twist (verified 2026-10-12): the sync last ran ~2025-03-30. The public API still serves that frozen snapshot, and the project has been dormant since roughly the same month.
Key Findings
- Upstream is official, token-gated: the sync fetches
/krl-stationand/schedule?stationid=…&timefrom=00:00&timeto=23:00fromapi-partner.krl.co.idwith a bearer token hardcoded in the public repo (value not reproduced here). Unauthenticated probe (no token) returned HTTP 404; no credentialed upstream calls were made during this audit. - Architecture: daily cron → Cloudflare Workers (Hono + Bun) → Neon Postgres (Drizzle ORM) + Upstash Redis read cache → public REST API with OpenAPI spec → Vite/React web app (plus native apps) consuming it via a typed
openapi-fetchclient. - Coverage (from live API): 113 stations — 95 daop-1 (Jabodetabek), 17 daop-6 (Yogyakarta area), 1 daop-2 (Purwakarta); 111 typed KRL + 2 LOCAL (Cikampek, Purwakarta). Sample row counts: MRI = 1,045 departures; DP = 730; CLT = 683; JAKK = 367; TNG = 84; BEK = 0.
- No live tracking: schedules and departures only — no GPS/position data anywhere (bundle + API verified). "Real-time" in their copy means "current schedule lookup", not live trains.
- Data frozen: schedule rows show last updates 2024-11-13 (bulk) + 2025-03-30 (partial passes); nothing newer. Repo activity stops 2025-03-30 (api) / 2025-04-03 (web).
Files
- comuline-krl-data/sources — repos, endpoints, upstream, ecosystem
- comuline-krl-data/analysis — pipeline, data model, observed state, boundaries
- comuline-krl-data/recipes — using the public API (curl)
- comuline-krl-data/next-steps — open questions, risks, ideas
Related Research
- jakarta-public-transport-data/index — umbrella topic
- transjakarta-live-data/index — sibling audit (realtime bus feed)
Discussion
Triggered 2026-10-12 from a Telegram request ("comuline.com which is including krl/jabotabek train data here — can we reverse engineer this as well?"). Documented as the second branch under the Jakarta public transport data umbrella. Method: artifact inspection (site bundle, response headers), public source reading (GitHub), live API sampling, and freshness checks via updated_at fields.