Try it now: https://youngbinkim0.github.io/spoke-express/
Live train arrivals work instantly — no API keys, no setup.
NYC hybrid commute optimizer — bike to the subway, ride to work, get there faster.
Regular transit apps show you one option: take the train, or ride a bike. But in NYC, the fastest commute is often both — bike to a nearby station, lock up, and catch the express. Spoke Express finds these hybrid routes automatically, ranking every combination of bike + subway by real-time train arrivals and weather conditions.
Zero backend required — calls MTA APIs directly from your browser/device.
Current version: v0.1
Google Maps gives you a bike route OR a transit route. Citymapper offers some hybrid options, but won't exhaustively compare every nearby station against live arrivals to find the fastest combo right now.
Spoke Express does. It:
- Compares walk-to-station vs. bike-to-station for every nearby subway stop
- Uses live MTA arrivals to find the fastest connection right now
- Demotes bike options when it's raining (via weather API)
- Shows you the actual best commute, not just the default one
Works on any phone, tablet, or computer — nothing to install.
- Open https://youngbinkim0.github.io/spoke-express/
- The Live Trains page works immediately with 3 popular stations pre-loaded
- For full commute routing, tap Settings and enter your home/work addresses
- Use the Search tab for ad-hoc trips — enter any origin and destination on the fly
That's it. Pin it to your home screen (see below) and it works like a native app.
Pin the web app for instant, full-screen access — no app store needed.
Android (Chrome):
- Open the site in Chrome
- Tap the ⋮ menu (top right)
- Tap "Add to Home screen"
- Name it Spoke Express → tap Add
iPhone (Safari):
- Open the site in Safari
- Tap the Share button (square with arrow, bottom bar)
- Scroll down and tap "Add to Home Screen"
- Name it Spoke Express → tap Add
After pinning, Spoke Express opens full-screen like a native app — no browser chrome.
A Google API key unlocks weather-aware ranking and accurate transit directions with transfers. The free tier is generous for personal use.
- Go to Google Cloud Console
- Create a new project (or select an existing one)
- Navigate to APIs & Services → Library and enable these three APIs:
- Geocoding API — address lookup
- Routes API — transit directions with transfers
- Weather API — weather-aware route ranking
- Go to APIs & Services → Credentials → click Create Credentials → API Key
- (Recommended) Click your new key → Restrict key → add your domain or
localhostunder HTTP referrers - Copy the key → open Spoke Express → Settings → paste it into the API key field
Detailed link: Google Cloud Credentials
| Feature | Web | Android | iOS |
|---|---|---|---|
| Live train arrivals | ✓ | ✓ | ✓ |
| My Commute (home → work) | ✓ | ✓ | ✓ |
| Search (ad-hoc routes) | ✓ | ✓ | ✓ |
| Weather-aware ranking | ✓ | ✓ | ✓ |
| Service alerts | ✓ | ✓ | ✓ |
| Walk + Transit options | ✓ | ✓ | ✓ |
| Bike + Transit options | ✓ | ✓ | ✓ |
| Address prefill from settings | ✓ | ✓ | ✓ |
| Recent searches | ✓ | ✓ | ✓ |
| Home screen widget | - | ✓ | ✓ |
| Auto-refresh (My Commute) | 30s | 30s | 30s |
Open Settings in the app and configure:
| Setting | Required | Notes |
|---|---|---|
| Home address | Yes | Click "Lookup" to geocode |
| Work address | Yes | Click "Lookup" to geocode |
| Bike transfer stations | Auto | Automatically selected within 4-mile radius |
| Google API key | Yes | Enables weather + accurate transit directions |
Prefer a native Android app? Download the APK or build from source.
Install from APK: Download from GitHub Releases and sideload it.
Build from source:
cd android
./gradlew assembleDebug
adb install app/build/outputs/apk/debug/app-debug.apkRequires: Java 17+, Android SDK
No App Store distribution — build from source in Xcode.
Open ios/CommuteOptimizer/CommuteOptimizer.xcodeproj in Xcode → Run
Requires: Xcode 15+, Apple Developer account for device deployment.
The app uses a shared Cloudflare Worker by default (https://commute-directions.xmicroby.workers.dev). To self-host your own:
cd cloudflare-worker
npm install -g wrangler
wrangler login
wrangler secret put GOOGLE_API_KEY # paste your Google Maps API key
wrangler deployThen update the WORKER_URL constant in web/index.html to point to your deployed worker.
For local web development, see web/QUICKSTART.md.
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Web App / │────▶│ MTA API │────▶│ Real-time train │
│ Android/iOS │ │ (no key req) │ │ arrivals │
└─────────────┘ └──────────────┘ └─────────────────┘
│
├────────────────────────────────▶ Google Weather API
│
│ (via CF Worker proxy)
▼
┌─────────────┐ ┌──────────────┐
│ CF Worker │────▶│ Google Routes│
│ Proxy │ │ API │
└─────────────┘ └──────────────┘
- MTA GTFS-Realtime: Free, no API key, called directly from browser/app
- Google Weather API: Weather-aware ranking (uses your Google API key)
- Google Routes API: Accurate transit times with transfers (via CF Worker proxy)
├── web/ # Web app (start here)
│ ├── start.sh # Startup script
│ ├── index.html # My Commute (home → work)
│ ├── search.html # Search (ad-hoc routes)
│ ├── arrivals.html # Live train times
│ ├── settings.html # Configuration
│ ├── commute-engine.js # Shared commute calculation
│ ├── render-utils.js # Shared rendering utilities
│ ├── shared.css # Shared styles
│ └── mta-api.js # MTA GTFS-RT parser
├── android/ # Android app + widgets
├── ios/ # iOS app + widgets
└── cloudflare-worker/ # Optional Google Routes proxy
- Web: Vanilla HTML/CSS/JS, no build step
- Android: Kotlin, Material Design, Coroutines
- iOS: Swift, SwiftUI, WidgetKit
- APIs: MTA GTFS-Realtime, Google Weather API, Google Routes API
- Proxy: Cloudflare Workers (optional)
GPL-3.0 — see LICENSE