Faruk Kamçıcı
← All work

DoluMu

How crowded will my train be? Hour-by-hour crowding forecasts for Istanbul's metro, Marmaray, Metrobüs, buses and ferries, on the web and on iPhone.

My own product · web and iOSdolumu.app ↗App Store ↗GitHub ↗
DoluMu line page for M2: crowding right now and for every hour of today
DoluMu lines screen: every metro line with how busy it is right now

The problem

Istanbul publishes hourly ridership for its lines as open data, but a data file does not answer the question you have on the platform: is my line busy right now, and is it worth waiting an hour?

What I built

A forecasting pipeline. A Polars pipeline joins hourly ridership with weather and calendar data into lag and rolling features, with validation and fallbacks. One LightGBM model covers hundreds of lines, and new forecasts are scored every night.

An API and two apps. FastAPI and PostgreSQL serve the forecasts. On top sit a web app and a native iPhone app with a network map, a page per line and a quieter hour to wait for. Each line's crowding is measured against its own busiest hour of the day.

What happened

The model reaches about 85% volume-weighted accuracy and about 75% lower error (MAE) than the lag baselines. DoluMu started as my graduation thesis; the iPhone app has been on the Turkish App Store since October 2026.

Stack

Python · Polars · LightGBM · FastAPI · PostgreSQL · Docker · Next.js · Expo