research/comuline-krl-data/index.md
hermes 77b0a55c41 Add comuline-krl-data topic + jakarta-public-transport-data umbrella
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.
2026-10-12 12:17:01 +00:00

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
comuline
krl
commuter-line
kai-commuter
kci
schedule
api
jabodetabek
yogyakarta
jakarta-public-transport-data
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-station and /schedule?stationid=…&timefrom=00:00&timeto=23:00 from api-partner.krl.co.id with 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-fetch client.
  • 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

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.