Skip to main content

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 ManifestPrivacyInfo.xcprivacy file 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 automationITSAppUsesNonExemptEncryption=false in Info.plist

Build 3 (2026-04-11 13:29)

  • Added location permission stringNSLocationAlwaysAndWhenInUseUsageDescription key (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:

  1. Distance (Hero) — Massive centered number (84pt)
  2. Circular progress ring — Auto-expanding goals (5K → 10K → Half → Full → next 5K)
  3. Pace — Auto color-coded by zone
  4. Duration — Demoted to secondary
  5. Calories/Elevation — Minimal minor stats at bottom

Pace zone color system (understand state without reading numbers):

PaceStateColorLabel
< 4:00/kmToo fast🔴 RedSPRINT PACE
4:00~5:30/kmHigh intensity🟠 OrangeRACE PACE
5:30~7:00/kmOptimal🟢 GreenTRAINING PACE
7:00~9:00/kmEasy🔵 BlueEASY PACE
> 9:00/kmWalking⚪ GrayWALKING

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:

DataStorage
Account info (email, name)Firebase Auth
Run summaries (distance, time, pace, calories)Cloud Firestore (encrypted)
GPS route dataLocal JSON files on device (ApplicationDocumentsDirectory/routes/)
GPS coordinates sent to serverNever

→ 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 enen-US path normalization quirk
  • Auto-deploys via GitHub Actions on main branch pushes

📱 Android Cleanup

  • Removed unused location permissions
    • FOREGROUND_SERVICE
    • FOREGROUND_SERVICE_LOCATION
    • ACCESS_BACKGROUND_LOCATION
  • Renamed app label from running_tracker to Running 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.