Changelog
Development changes for Neohollo Running.
[1.0.0] - 2026-04-11
🎉 Initial Release
First public version of Running Tracker: GPS & Stats.
Key Features
- Real-time GPS tracking — Distance, pace, calories, and elevation displayed live
- Route visualization — Running routes on Google Maps
- Weekly & monthly statistics — Beautiful charts and analytics
- Badge system — 14 badges for motivation
- Complete history — Run history organized by date
- Google Sign-In — Simple account authentication
- Voice announcements — Audio alerts at every kilometer milestone
- Privacy-first design — GPS route data stays only on your device
Pre-release Build History
It took four build iterations to reach the submitted version. Each build resolved issues discovered along the way.
Build 1 (2026-04-11 12:30)
- Initial upload
- Base app functionality
Build 2 (2026-04-11 12:59)
- Added Privacy Manifest —
PrivacyInfo.xcprivacyfile declaring Required Reason API usage (mandatory since May 2024) - Added in-app account deletion — To comply with App Store Review Guideline 5.1.1(v)
- Launch Screen branding — Replaced Flutter placeholder with branded image (#0C6848 background + centered app icon)
- Export Compliance automation —
ITSAppUsesNonExemptEncryption=falsein Info.plist
Build 3 (2026-04-11 13:29)
- Added location permission string —
NSLocationAlwaysAndWhenInUseUsageDescriptionkey (required because geolocator package references iOS APIs even though we don't use background location) - Resolved Apple's ITMS-90683 warning
Build 4 (2026-04-11) — Submitted build
- iPhone-only configuration — Changed
TARGETED_DEVICE_FAMILY = "1" - Avoided iPad screenshot requirement (1.0 ships iPhone-only)
Development Process (Pre-release)
🎨 Active Run Screen UX Redesign
The initial UI showed Duration as the largest element — typical tracker layout. We completely redesigned it around real runner needs.
New information hierarchy:
- Distance (Hero) — Massive centered number (84pt)
- Circular progress ring — Auto-expanding goals (5K → 10K → Half → Full → next 5K)
- Pace — Auto color-coded by zone
- Duration — Demoted to secondary
- Calories/Elevation — Minimal minor stats at bottom
Pace zone color system (understand state without reading numbers):
| Pace | State | Color | Label |
|---|---|---|---|
| < 4:00/km | Too fast | 🔴 Red | SPRINT PACE |
| 4:00~5:30/km | High intensity | 🟠 Orange | RACE PACE |
| 5:30~7:00/km | Optimal | 🟢 Green | TRAINING PACE |
| 7:00~9:00/km | Easy | 🔵 Blue | EASY PACE |
| > 9:00/km | Walking | ⚪ Gray | WALKING |
Visual effects:
- Pulsing border glow for running state
- Smooth count animations on distance numbers
- SweepGradient progress ring
- Color transitions between running (green) and paused (orange)
🔊 Voice Announcements + Wakelock
Integrated flutter_tts and wakelock_plus.
Voice alerts:
- Run start: "Let's run!"
- Every 1 km: "X kilometers. Pace M minutes S seconds per kilometer."
- Time-based (after first km, every 5 min): "M minutes. X kilometers."
- Run end: "Run complete. X kilometers in M minutes. Great job!"
Wakelock:
- Auto-enabled when a run starts (
WakelockPlus.enable()) - Auto-released when a run ends or is cancelled
- Users can pocket their phone and listen via Bluetooth earbuds
🎯 App Icon
Generated programmatically with a Python/Pillow script:
- Design: Deep emerald gradient background (#0C6848 → #043424) with a white running path curve
- Start marker: Ring on the left
- Runner position: Large circle on the right
- Drop shadow: For depth
- All iOS and Android sizes auto-generated via
flutter_launcher_icons - No alpha channel (App Store requirement)
🔐 Privacy Architecture Verified
Code analysis confirmed:
| Data | Storage |
|---|---|
| Account info (email, name) | Firebase Auth |
| Run summaries (distance, time, pace, calories) | Cloud Firestore (encrypted) |
| GPS route data | Local JSON files on device (ApplicationDocumentsDirectory/routes/) |
| GPS coordinates sent to server | Never |
→ Declared "Precise Location: Not Collected" in App Privacy — a rare claim for any running app.
🌐 English Documentation Site (Docusaurus i18n)
Extended the existing Korean-only docs site to be multilingual:
- Added English locale to
docusaurus.config.js - English translations of Privacy Policy and Terms of Service (with GDPR/CCPA sections)
- Multilingual navbar and footer
- Resolved Docusaurus 3.x
en→en-USpath normalization quirk - Auto-deploys via GitHub Actions on
mainbranch pushes
📱 Android Cleanup
- Removed unused location permissions
FOREGROUND_SERVICEFOREGROUND_SERVICE_LOCATIONACCESS_BACKGROUND_LOCATION
- Renamed app label from
running_trackertoRunning Tracker - Permissions that don't match code are a Google Play review risk
Versioning Policy
- Semantic Versioning:
MAJOR.MINOR.PATCH - MAJOR: Big UX changes or breaking compatibility
- MINOR: New features
- PATCH: Bug fixes
Build number (+N) increments on every App Store Connect upload.