Inspiration Every subway commuter knows the feeling: you're tired, it's late, and you're terrified of missing your stop. You jerk awake at every station, check the map, and still can't relax. Parents with strollers, tourists navigating an unfamiliar system, and daily commuters on long routes all share this silent anxiety. We built Where because a smartphone with GPS should be smarter than this. The phone already knows where you are every second — why can't it tell you, "Get ready, your stop is next"? No wearable. No constant screen-checking. Just a quiet buzz that says, "This is your stop." The problem is universal. The solution is simple. And surprisingly — no one had done it well for Korea and Japan. What It Does Where is an Android app that tracks your subway ride in real-time using GPS and rings an alarm when you're approaching your chosen station. The user flow is three taps:

  1. Pick a subway line → Pick a station → Set how many stops before the alarm
  2. One alarm saved. That's it.
  3. When the train moves, Where silently tracks your location in the background. As you near your station, it triggers a full-screen, lock-screen-breaking alarm — even in Do Not Disturb mode. Key features:
  4. Bundled offline database — 949 stations across Korea (11 lines) and Japan (31 lines). No backend. No internet needed. Everything is on-device.
  5. Bilingual display — Station names show in both scripts (e.g., 新宿 / 신주쿠) with Korean, Japanese, and English UI.
  6. GPS-smart tracking — EMA smoothing filters out tunnel noise and GPS jitter. The state machine knows when you're at, approaching, or between stations — even in degraded signal.
  7. Emergency-grade alarm — Red LED, aggressive vibration, full-screen intent, bypasses silent mode. You will not miss your stop. How We Built It Layer UI Architecture Location Tracking Engine Data i18n Build CI The core tracking engine is a 5-state machine (Unknown → AtStation → ApproachingStation → BetweenStations → NoStation) running on a 150-line StationTracker class. The Haversine formula calculates distance in meters. A 0.3-alpha EMA smooths raw GPS into stable position estimates. Four thresholds (80m / 250m / 600m / 900m) define the proximity zones. The database is two JSON files totaling 949 stations — loaded once at startup into memory. No Room, no SQLite, no backend. The app literally works on a plane. Challenges We Ran Into
  8. GPS in subway tunnels is terrible. Raw location data in tunnels drifts 100–300 meters. The phone clings to the last known position, then suddenly teleports. We solved this with Exponential Moving Average smoothing (α=0.3) and a careful state machine that doesn't flip states on a single reading.
  9. Japanese subway data is fragmented across 8 operators. Tokyo alone has Tokyo Metro, Toei, JR East — each with different station code schemes and coordinate precision. We normalized 31 lines, 503 stations from 8 cities into a unified JSON schema with bilingual names (kanji + Korean reading).
  10. The notification system had to work when it matters most. Android's Do Not Disturb, battery optimization, and background restrictions all fight against a reliable alarm. We had to layer: bypassDnd=true, CATEGORY_ALARM, fullScreenIntent, red LED, and custom vibration patterns to guarantee the alarm breaks through.
  11. Only one alarm at a time is a feature, not a bug. The original concept allowed multiple alarms. We discovered through usage that a single, focused alarm dramatically reduces cognitive load. You save one station. You ride. You get off. This constraint makes the UI dead simple. Accomplishments That We're Proud Of
  12. 949 stations, 42 lines, 2 countries, 3 languages — all in a 2MB APK.
  13. Zero backend dependency. No servers, no API keys, no ongoing cost. Every byte the app needs ships with the app.
  14. Play Store–ready. Version 1.0.0 is built, signed, and prepared for production release. Privacy policy hosted. Data Safety declaration written. Demo video recorded.
  15. Full CI pipeline. GitHub Actions runs test + lint + debug build + release bundle on every push.
  16. Emergency-grade reliability. The alarm is designed to wake a sleeping passenger through DND, lock screen, and vibration-off scenarios. What We Learned
  17. Offline-first is the right call for transit. Subway riders lose signal constantly. Bundling the data makes the app work everywhere, every time — no loading spinners, no "no internet" errors.
  18. Constraints simplify UX. The "one alarm" model removed scheduling complexity, alarm lists, and most of the settings screen. The remaining three-tap flow is almost impossible to get wrong.
  19. GPS smoothing is not optional. Raw location data in a subway environment is unusable. The EMA + state machine combination was the minimum viable investment for acceptable accuracy.
  20. Japan's transit data is a hidden quality signal. By supporting 31 Japanese subway lines with bilingual display, Where signals a level of data craftsmanship that casual apps don't attempt. This matters for user trust. What's Next for Where Immediate (pre-launch):
  21. Google Play Store release in Korea and Japan
  22. Internal testing → production promotion Short-term (post-launch Q3 2026):
  23. Expand to more countries — Taiwan (Taipei Metro), China (Shanghai/Beijing), Southeast Asia (Singapore MRT, Bangkok BTS)
  24. Wear OS companion — glanceable next-stop info on your watch
  25. Transit alerts — push notifications for service disruptions on your saved line Medium-term (Q1 2027):
  26. Crowdsourced station accuracy — let users correct coordinates and add missing stations
  27. Route planner integration — "Set an alarm for this trip" directly from a route search
  28. Monetization — premium features (haptic patterns, custom voice alerts, multi-alarm mode) via a one-time purchase Long-term vision: Where aims to be the universal subway companion — the app you open once when you board any train in any city, set your stop, and put your phone away until the alarm tells you it's time.

Built With

Share this project:

Updates