chris@schmid:~$
← ./projects

case study · personal project

Citibike Data Platform

A batch and streaming platform over NYC's Citibike system — combining historical trip data with the public real-time station feed to power rider segmentation, rebalancing signals, and live station monitoring.

SnowflakedbtAirflowKafka
01

The Problem

Citibike publishes historical trip records for batch analysis and a live GBFS feed for real-time station status — two very different shapes of data with two very different freshness requirements. Rebalancing decisions need both: slow-moving demand patterns from history, and up-to-the-minute station state from the feed.

02

Architecture

GBFS Feed

Realtime Station Status

Kafka

Streaming Ingestion

Airflow

Orchestration

Snowflake + dbt

Batch Transform

Marts

Segmentation & Demand

The GBFS feed streams through Kafka for near-real-time station status, while Airflow orchestrates scheduled batch loads of historical trip data into Snowflake. dbt models both paths into the same warehouse — segmentation and demand marts from the batch side, live station state from the streaming side.

03

What It Does

Rider Segmentation

Batch models over historical trip data group riders by usage pattern to inform product and rebalancing decisions.

Hourly Demand Patterns

Aggregated demand-by-hour marts surface when and where bikes run out, feeding rebalancing operations.

Real-Time Station Monitoring

A streaming path over the public GBFS feed tracks station status as it changes, independent of the nightly batch loads.

$ git clone chris017/jersey-city-bikeshare