--- title: "Comuline — KRL Commuter Line Data (schedule API replication)" description: "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." status: concluded category: technical tags: [comuline, krl, commuter-line, kai-commuter, kci, schedule, api, jabodetabek, yogyakarta, jakarta-public-transport-data] draft: true created: 2026-10-12 updated: 2026-10-12 --- # Comuline — KRL Commuter Line Data ## Summary [comuline.com](https://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 - [[comuline-krl-data/sources|Sources]] — repos, endpoints, upstream, ecosystem - [[comuline-krl-data/analysis|Analysis]] — pipeline, data model, observed state, boundaries - [[comuline-krl-data/recipes|Recipes]] — using the public API (curl) - [[comuline-krl-data/next-steps|Next steps]] — open questions, risks, ideas ## Related Research - [[jakarta-public-transport-data/index|Jakarta Public Transport Data]] — umbrella topic - [[transjakarta-live-data/index|TransJakarta Live Data]] — 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.