RUNSTR

com.anonymous.runstr.project
by RUNSTR runstr@nostrcheck.me

Fitness competitions with rewards

Track workouts, join competitions, and earn rewards. Works with any device connected to Apple Health or Health Connect.

First release: Sep 23, 2025, 108 total releases.

Most recent release: Jun 29, 2026.

Website Repo

Appears in 5 app stacks.

17,036 sats / 12 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Jun 29, 2026 1.9.9
    A polish and reliability pass: a deeper feed, an honest reward notification, and more dependable Apple Health sync. - The feed now keeps loading as you scroll instead of stopping after a handful of posts - Reward notifications show only confirmed payouts, as a clean branded toast — no more premature "earned" amounts before a reward actually lands - Turning off Apple Health sync now fully stops background syncing, and iOS catches up missed workouts over a longer window - Auto-post now shares GPS workouts only — step days no longer post automatically - Strength workouts shared from other apps now show their real stats (sets, reps, weight) instead of a blank distance, and you can tap "View workout" to see the full exercise breakdown - Step days stay on your leaderboard but no longer clutter the feed as posts - View or import your PPQ.AI key from Settings, where workout rewards can be sent as credits - Fixed a login issue that could lock you out when the network was slow to respond
    More…
    - Tapping a reward notification now opens the Rewards screen - Reward counts no longer stick too high if recording a tap fails - Various stability fixes
  • Jun 11, 2026 1.9.5
    ## What's New in 1.9.5 Polish release: a consistent top bar across every tab for one-tap access to history and settings, the reward-destination picker back inline on the Rewards screen, the three-tab simplification, and a round of crash fixes and visual cleanup. ### Features - **Global top bar** — Dashboard, Social, and Leaderboard each have a top bar with one-tap access to your workout history (clock, top-left) and settings (menu, top-right) - **Reward destination picker is back** — choose where your rewards go right on the Rewards screen - **Three focused tabs** — Dashboard, Social, Leaderboard with icon-only nav; Social is a pure workout feed; the workout share is a single clean card - **Workout history reachable** — wired into Settings and the new top-bar shortcut
    More…
    ### Bug Fixes - Fixed a History tab crash when Apple Health workout sync was enabled - Fixed unexpected sign-out after force-closing and reopening the app - Fixed a white-screen crash during a workout — an in-progress workout now recovers instead of crashing the app - Reward amount now reflects the current daily payout - Tab labels display correctly ### Improvements - Your lightning address is no longer shown publicly on your profile - Consistent rewards wording across earnings and feed screens - Refreshed icons (person / chat / trophy tabs, proper activity glyphs) - Removed placeholder / dead controls for a more finished feel - "LEVEL" badge, tighter Settings spacing, consistent orange text --- ### Install Download the APK below and install on Android. iOS builds are handled separately via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Apr 20, 2026 1.9.2
    ## What's New in 1.9.2 Cycling is now a first-class activity in RUNSTR — club captains can create cycling events, cyclists see their own personal records on the profile stats card, and daily cycling leaderboards join running + steps on the Events tab. This release also adds a plain-text sharing option for workouts and fixes a critical Android import regression. ### Features - **Cycling event templates** — club captains can now create "Most Kilometers" and "Most Rides" cycling competitions alongside the existing running events (closes issue #269) - **Pullup Challenge template** — rounds out the event template grid with a matching challenge for pull-up trackers - **Adaptive StatsCard** — profile stats now show cycling PRs (20K / 40K / 100K / Longest Ride) for riders, running PRs for runners, both for mixed athletes; empty sections hide automatically - **Longest Ride** joins Longest Run on the PERSONAL BESTS list - **Daily cycling leaderboards** — three new global leaderboards (20K / 40K / 100K) updated live throughout the day, mirroring how daily running leaderboards work
    More…
    - **Plain Text workout sharing** — new option in the share modal to post workouts as plain text on Nostr instead of an image card. No image upload, no Blossom round-trip, just your stats as a clean text post (closes issue #271) - **Cycling anti-cheat** — cycling target times are validated against UCI record floors, so impossible rides get flagged at submission ### Critical Fixes - **Hold-to-start no longer pops back to Home.** A regression introduced in v1.9.1 caused the tracker screen to flash for half a second after the 3/2/1 countdown, then immediately return to Home without starting the workout. Root cause was the workout-active state swapping between two render branches, which remounted the tracker with fresh state mid-countdown. Fixed by keeping the tracker in a stable position in the component tree so it persists across the state flip. - **Android workout import no longer fails with an encryption error.** Amber users on Android could not import their workout history — the restore flow ran an eager encrypt/decrypt self-test that fired two separate Amber intents before any real work, and Amber's stateless NIP-44 semantics caused the self-test to fail intermittently. Removed the redundant self-test (the real decrypt loop already surfaces per-event errors) and added the missing `encryptionEnabled` method to the Amber signer so NDK routes encryption correctly. ### Improvements - StatsCard also hides empty strength rows (pushups / pull-ups) instead of showing em-dash placeholders - Section titles renamed from "RACE PERSONAL RECORDS" to "RUNNING PERSONAL RECORDS" for symmetry with the new cycling section - Leaderboard rank badges now use the orange accent color consistently (previously rendered gray despite the orange theme intent) - PR queries refactored into parallel async helpers for faster initial load - New partial indexes on cycling time columns keep leaderboard queries fast as data grows ### Thanks Big thanks to [twofaktor](https://github.com/twofaktor) (captain of CYCLESTR) for filing the detailed feature requests (cycling events + plain-text posting) and providing the metric ideas that shaped this release. --- ### Install Download the APK below and install on Android. iOS builds via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Apr 15, 2026 1.9.1
    ## What's New in v1.9.1 Polish release on top of v1.9.0 — clubs discovery, better performance, and small UX fixes. ### Features - Social clubs rail with discovery bar and filtered inline dropdown - Clubs rail sorted by member count (your club pinned first) - Bigger 56px club avatars for easier tapping ### Bug Fixes
    More…
    - Rewards back button fallback routes correctly when reached via deep link - Location permission re-checks on return from Settings (revoked permission now re-gates the UI) - Require captain role to create club-scoped competitions ### Improvements - History list restores proper FlatList virtualization for faster first paint on long histories - Clubs rail item memoization — no more re-rendering all avatars on every search keystroke - Activity category picker expands as a floating dropdown overlay instead of pushing layout - Home screen owner/non-owner rendering split into dedicated branches; permission gate redesigned as a circular tap target - Empty-state cards removed from workout history list (cleaner minimalism) --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Apr 10, 2026 1.8.9
    ## What's New in v1.8.9 ### Level System (replaces XP + Streak) - Level = your workout streak. LVL badge on profile shows consecutive workout days - 2-day grace period: miss up to 2 days without losing your level - Tapping LVL badge opens detail screen with current level, highest level, last workout, and explainer - Passive step counting excluded — only deliberate activity counts - All data sourced from local storage (works for private users too) - Removed streak bonus from rewards (levels are purely motivational)
    More…
    ### Dead Code Removal - Removed 5,850 lines of unreachable code (7 dead screens, 2 dead services) ### Bug Fixes - Fixed iOS crash on launch caused by `await import('react-native')` in AuthContext - Fixed terminology: "Bitcoin"/"sats" replaced with "rewards" in navigation text ### Polish - Haptic feedback on bottom tab switching - Stripped 35 debug console.logs from production code - Removed outdated subscription tier references --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Apr 9, 2026 1.8.8
    ## RUNSTR v1.8.8: Social RUNSTR has come a long way. From a UX perspective, from a rewards perspective, from a usability perspective, and now we are turning the corner into something that more closely resembles our final form. RUNSTR is the Nostr-native fitness tracker with Bitcoin rewards, but there is a lot to unpack in that sentence. At its core, the value proposition is simple: RUNSTR rewards you for your fitness endeavors and serves as your social fitness client. The app has evolved from a basic run tracker into a full activity platform covering cardio, strength, wellness, and mindfulness, with a reward system that lets you decide where your earnings go. Whether your workouts fund a charity, support an open source project, pay for AI credits, or go straight to your wallet, the choice is yours and you can change it anytime. Version 1.8.8 represents the most complete expression of that vision to date. The social layer is where 1.8.8 makes its biggest leap. We tackle social fitness in three ways: a feed, club chatrooms, and virtual competitions. The Social tab now features a Nostr-powered feed where you can see workout posts from the community, leave comments, send zaps, and interact with other athletes directly from within the app. Club chatrooms have been overhauled with full-screen chat, pinned messages, and push notifications so you never miss a message from your crew. Competitions have been expanded with prize pool support, charity event templates, and a simplified event creation flow that lets club captains spin up races and challenges from templates in seconds. Every workout you log, whether from RUNSTR's built-in trackers or synced automatically from your Apple Watch, Garmin, Strava, or any other app connected to Apple Health or Health Connect, counts toward leaderboards and competitions without you lifting a finger. RUNSTR Season III is coming in May, and it will be free to join. Season III introduces Club Battles, a 16-team double-elimination tournament where Fitness Clubs compete against each other for a grand prize. Clubs are matched up, their members' workouts are scored, and the losing club drops to the losers bracket while the winner advances. It is community fitness competition at its most engaging. At the end of Season III, we will also donate to the most represented charity among tournament participants. Every user selects a reward destination, and the charity or project with the most users backing it during the competition receives a collective donation from the tournament. It is a way to turn collective fitness effort into collective impact. Beyond the headline features, 1.8.8 is packed with quality of life improvements that make RUNSTR more private, more reliable, and more rewarding than ever. You can log in with Nostr or spin up a fresh identity by tapping Start, no email or account required. You can encrypt and back up your workout history to Nostr relays, and restore everything if you switch devices. The app pulls in workouts from across wearables and fitness apps on your phone through HealthKit and Health Connect, submitting them to leaderboards and triggering rewards in the background. You can post any workout directly to Nostr with one tap. Privacy Mode ensures all workouts stay local on your device if you prefer. We do not collect GPS points, we do not collect personal information, and the app is more privacy-preserving than most fitness trackers on the market. The streak accumulator now enhances your daily workout reward, giving you a 10 to 40 percent bonus for maintaining consecutive workout days.
    More…
    At its foundation, RUNSTR is a Nostr-native fitness app with Bitcoin rewards. Nostr gives us a decentralized identity layer and social features that extend beyond the app itself, as well as a decentralized database to encrypt and store basic workout summaries. The Bitcoin rewards piece operates through micro payments sent to your wallet, your charity, your project, or sent as payment to PPQ.AI for AI credits. We also have side features like Wavlake and Blossom music integration for your workout soundtrack. Version 1.8.8 ships with 177 new features, 149 bug fixes, 19 database migrations, and thousands of lines of dead code removed. The app is cleaner, faster, and more focused than it has ever been. Find out more about the project at www.runstr.club, and join us for Season III in May. --- ### What's New **Season III: Club Battles** — 16-team double-elimination tournament, bracket view, nightly resolution, push notifications **Social Feed** — Nostr-powered feed with likes, zaps, reposts, comments, and engagement indexing **Streak Rewards** — 10-40% bonus on daily workout rewards for consecutive workout days **Club Chat** — Full-screen chat, pinned messages, push notifications **Competitions** — Prize pools, charity events, ticketed events, simplified event creation **Rewards** — ALS Network sponsor, destination picker, strength/journal rewards **Privacy** — Anonymous login, encrypted backups, Private Mode, no GPS collection **460 commits** — 177 features, 149 fixes, 19 migrations, 12,500+ lines of dead code removed --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Mar 31, 2026 1.7.7 Release page →
    ## What's New in v1.7.7 ### App Store Compliance - Removed all subscription tier UI and gating (Guideline 3.1.1) - Club creation and event creation now available to all users - Added Apple Health section in Settings with sync toggle and connection status (Guideline 2.5.1) ### Stability & Reliability - Added workout validation bounds (200km/24h) across all 4 submission paths - Failed workout submissions now retry via PendingSubmissionService on all paths
    More…
    - Added NDK retryConnection mutex to prevent stale connection references - Fixed 2 critical circular dependency cycles - Added isMounted cleanup guards to 13 async useEffects across 8 screens ### Performance - Added .limit() to 12 high-risk unbounded Supabase queries - Recovered and committed lottery wheel and profile action card components ### UX Polish - Added loading indicators to 6 screens - Feed zap opens ExternalZapModal correctly - Pull-to-refresh on Compete screen now refreshes data - Chat button shows toast feedback instead of being dead - Settings toggles show toast confirmation - Simplified onboarding modal ### Cleanup - Removed 12 dead files (~88KB, 3,121 lines deleted) - Renamed components/subscription to components/creation - Added 28 verification and audit scripts covering all core flows --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Mar 28, 2026 1.7.6 Release page →
    ## What's New in 1.7.6 ### Social Tab - Clubs tab renamed to Social with integrated feed - Social feed with workout shares, images, and Nostr posts - Like, zap, repost, and comment interactions on feed posts - Clubs row with horizontal scroll at top of Social screen ### Lottery Wheel - Lottery wheel on Level Detail screen with animated spin
    More…
    - Linear multiplier system (+0.1x per level) with next milestone preview - Currently in "Coming Soon" state ### Activity Menu - Activity category bar in tracker screen header with dropdown overlay - Quick exercise type switching via activity pills - Wellness and Mindfulness merged into single category - "Workout" renamed to "Exercise" across the app ### Simplified Events - Event creation simplified to template + duration + recurring - Recurring events with automatic finalization and re-creation - Competition XP bonus support ### Subscriptions - Subscription set to "Coming Soon" — purchase flows removed per Apple review ### Profile Redesign - Simplified to three action cards: Exercise, History, Rewards - Level badge on profile hero with tap-to-level-detail navigation ### Bug Fixes - Fixed like/repost flash bug, image aspect ratio - Fixed category bar dropdown rendering - Fixed location settings navigation crash on iOS - Fixed historical recurrence period date calculation - Sanitized non-finite analytics payload values - Removed redundant error-color fallbacks - Zero TypeScript errors (198 -> 0) --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Mar 23, 2026 1.7.5 Release page →
    ## What's New in 1.7.5 ### Pushup Verification (Camera) - On-device camera verification for pushup workouts using MediaPipe pose estimation - Optional "Verify with Camera" toggle in pushup setup — always opt-in, never required - Real-time rep counting via elbow angle tracking (shoulder/elbow/wrist landmarks) - Privacy-preserving: video frames processed in memory and discarded — only a lightweight verification receipt is stored - Verified workouts display an orange checkmark in workout history and detail views - Haptic feedback on each detected rep
    More…
    ### Pledge System & Rewards - Pledge rewards now route to captain's Lightning address during active pledge period - Push notifications delivered for rewards even when app is backgrounded - Fixed Rewards screen navigation from welcome modal destination picker ### Android Sync Reliability - Re-validate Health Connect permissions before background sync (detect revocation) - Extended background sync lookback to 7 days to catch missed syncs - Smart lookback in HealthSyncManager — 7 days if >1hr since last sync, 1 day otherwise - Handle submission failures properly — flagged workouts skip retries, transient failures retry ### Bug Fixes - Fixed base64 padding handling in backup restore - Fixed club chat keyboard offset using safe area insets - Fixed app freeze when opening event creation from club menu - Patched react-native-mediapipe for VisionCamera v4 header compatibility - Patched react-native glog crash triggered by MediaPipe initialization - Fixed undefined startTime crash in workout timeline ### Improvements - Lazy-loaded camera verification component for faster screen load - Added react-native-vision-camera and react-native-worklets-core for frame processor support --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Mar 2, 2026 1.7.3 Release page →
    ## What's New in v1.7.3 ### Security - Secure RNG for Nostr key generation (crypto.getRandomValues replaces Math.random) - Secure RNG for CoinOS credential generation - SecureNsecStorage used consistently in Running Bitcoin post flow - Centralized sign-out flow via AuthContext prevents partial state cleanup - GlobalNDK signer cleared on sign-out to prevent stale identity ### Submission Pipeline Reliability
    More…
    - 5-second timeouts on club/team Supabase queries during reward tag building - 5-second timeout on SubscriptionService tier check prevents hangs - Timeout on image upload auth signing with Amber signer serialization - Restored relay minimum connection check before publishing - Hoisted async club lookups out of JSON.stringify to prevent silent failures - Diagnostic logging for silent early returns in auto-submit pipeline - Hardened early return status reporting and PPQ total timeout protection ### Bug Fixes - Cache crash fix: SimpleCache.delete prevents TeamCacheService crash - Workout invalidation now passes competition team IDs correctly - Health auto-submit retries on transient failures instead of silently dropping - Reward summary defaults nullable totals to zero (prevents NaN display) - Team join resolves current user npub correctly - Manual entry range validation enforced - Removed broken ChallengeService import - Fixed chat double-submit on rapid taps - Fixed German translation string ### Improvements - Subscription status card on Rewards page (10x boost, clean framing) - Subscription economics updated — 10x boost, 15k/21k pricing, 5/week cap - Terminology cleanup — rewards everywhere - SafeAreaView migrated to react-native-safe-area-context (12 screens) - ~12K lines of dead code removed - Nostr club/team relay queries replaced with Supabase-only ### Infrastructure - Merged v1.7.0 (clubs) + v1.7.2 (security fixes) into unified branch - 4 critical-path verification scripts (216 assertions) - Pre-release audit fixes (performance, i18n, UX, data integrity) --- ### Install Download the APK below and install on Android. iOS builds available via TestFlight. ### Report Issues https://github.com/RUNSTR-LLC/RUNSTR/issues
  • Feb 10, 2026 1.6.8
    ## [1.6.8] - 2026-02-08 - Background Rewards, CoinOS Wallet & Dynamic Events ### HealthKit Background Delivery & Auto-Rewards - iOS HealthKit observer queries wake RUNSTR when Apple Watch / Nike Run Club / etc. workouts complete - New `HealthKitBackgroundService` registers for HKWorkoutTypeIdentifier with immediate frequency - Workouts auto-submitted to Supabase with Lightning address tag for automatic reward payment - Postgres AFTER INSERT trigger extracts Lightning address and calls claim-reward edge function - End-to-end pipeline: workout completes on watch -> app wakes -> submits -> trigger pays 50 sats via LNURL ### CoinOS Wallet Integration
    More…
    - CoinOS added as a team/charity option alongside PPQ.AI - Custodial Lightning wallet: users create a `username@coinos.io` address during onboarding - `CoinOSAccountService` handles account creation, authentication, balance, send, receive, and invoice creation - `CoinOSAccountSetupModal` for wallet creation flow - `CoinOSWalletModal` with Send, Receive, and Transactions tabs - Receive tab supports bolt11 invoice creation (amount input -> Create Invoice -> QR + copy) - `WelcomePermissionModal` updated with 2-step onboarding for team selection - Real CoinOS logo and team branding ### Dynamic Supabase Events - Data-driven competition system: insert a row in Supabase -> it appears in the app automatically - No code changes needed to create new events - 4 competition templates: `distance_race`, `step_challenge`, `goal_challenge`, `fundraiser` - `DynamicEventCard` component with banner image, status badge, and activity tags - `DynamicEventDetailScreen` with full leaderboard, join button, and prize pool display - `useDynamicCompetitions` hook with 5-minute cache and status derivation ### Auto-Sync Workouts to Leaderboard - HealthKit and Health Connect workouts now auto-sync to competition leaderboards - `HealthSyncManager` syncs on app foreground (via AppStateManager) and pull-to-refresh - 5-minute throttle prevents excessive queries ### Push Notification Token Registration - `token_key` column (sha256 of npub) added to `broadcast_tokens` for reward payment push notifications - AuthContext registers token_key after authentication completes ### PPQ.AI Reward Fixes - Fixed rewards falling back to ALS Network instead of PPQ.AI bolt11 invoice - Added `shouldSendToUser()` method and `isPPQ` flag to reward destination logic - Centralized PPQ.AI bolt11 invoice creation in `submitWorkoutSimple()` for all submission paths - Updated auto-reward Postgres trigger to support PPQ.AI bolt11 extraction ### Infrastructure - Switched to version branch model (v1.6.8, v1.7.0, etc.) - 5 new Supabase migrations (127, 128, 130, 131, 132) - 8 new source files, 35 files changed, +4,266 / -262 lines ---
  • Feb 6, 2026 1.6.7
    ## [1.6.7] - 2026-02-03 - RUNSTR AI & Auto-Compete ### Automatic Competition Entry - Workouts and steps automatically enter competitions - no manual "Compete" button needed - Complete a workout → automatically compete for rewards ### RUNSTR AI (PPQ.ai) - One-click anonymous AI account creation - Journal and habit tracker - AI chat with model selection
    More…
    - Top up AI credits from workout rewards ### Encrypted Workout Backup - Backup workout history to Nostr (NIP-44 encrypted) - Import workouts from backup ### Passive Step Tracking - Walk screen shows steps from Health Connect - Steps auto-compete for rewards - Instant 50 sats when daily steps hit 10,000 ### Rewards Transparency - Rewards Pool breakdown display - Earnings view (users with Lightning address) - Charitable contributions view - Full transparency dashboard ### Android Stability - Fixed activity tracker freezing on first load - Fixed step counter and posting issues - Improved battery optimization handling ### UI Improvements - Activity tracker header now shows only step count (removed confusing estimated distance) ### Leaderboard Fix - Fixed distance double-counting: leaderboards now use MAX(steps, GPS) per day instead of summing both sources ---
  • Jan 22, 2026 1.6.5
    ## [1.6.5] - 2026-01-21 - Units, i18n & GrapheneOS Fix ### New Features #### KM/Miles Unit Preference - **Unit Toggle**: Settings → Fitness Tracking → toggle between Kilometers and Miles - **Full App Support**: Distance, pace, speed, and elevation display in preferred units - **TTS Announcements**: Voice coach speaks in your preferred units ("per mile" or "per kilometer") - **Split Tracking**: Mile splits (1609m) or kilometer splits (1000m) based on preference - **Workout Cards**: All workout displays respect unit preference
    More…
    #### Internationalization (i18n) - **Auto-Detection**: App detects device language on startup - **Language Switcher**: Settings → Language for manual language selection - **Persistent Preference**: Selected language saved across sessions - **Fallback System**: Falls back to English for missing translations ### Bug Fixes #### GrapheneOS Step Counter Fix - **Fixed**: Steps displayed as 0 in app while notification bar showed correct count - **Root Cause**: Privacy ROM detection was incorrectly blocking native step sensor - **Solution**: Removed privacy ROM check - native step sensor works on all Android devices - **Files**: `NativeStepCounterService.ts`, `DailyStepCounterService.ts` #### Relay Connectivity Fix - **Fixed**: Workout publishing failures due to relay connection timing - **Solution**: Service now waits for minimum relay connectivity (2 relays, 3s timeout) before publishing - **Graceful Degradation**: Continues with warning if connectivity not established - **File**: `workoutPublishingService.ts` ### Technical #### New Files - `src/hooks/useUnitPreference.ts` - Centralized unit preference hook - `src/hooks/useWavlakePlayer.ts` - Wavlake player integration hook - `src/types/music.ts` - Music type definitions - `src/store/musicStore.ts` - Zustand store for music state - `src/constants/music.ts` - Music constants - `src/services/music/WavlakeService.ts` - Wavlake API service - `src/services/music/MusicPlayerService.ts` - Audio playback service - `src/services/music/WavlakeZapService.ts` - Lightning zap service for artists - `src/components/music/` - Music UI components (6 files) - `src/i18n/` - Internationalization files - `src/services/i18n/` - i18n service #### Modified Files - `src/utils/distanceFormatter.ts` - Added unit conversion helpers - `src/services/activity/ActivityMetricsService.ts` - Unit-aware formatting - `src/services/activity/TTSAnnouncementService.ts` - Unit-aware voice announcements - `src/services/activity/SplitTrackingService.ts` - Configurable split intervals - `src/services/activity/SimpleRunTracker.ts` - Passes unit preference to split tracker - Multiple workout card components updated for unit preference ---
  • Jan 20, 2026 1.6.4
    ## [1.6.4] - 2026-01-19 - Daily Rewards & Einundzwanzig Teams ### Rewards System Changes - **Daily Rewards**: Switched from instant rewards to daily rewards system - **Compete to Earn**: Workouts must be submitted to competitions to earn rewards - **Step Rewards Removed**: Removed the 5 sats per 1,000 steps reward - **Impact Score**: Only workout rewards increase your Impact Level XP - **P2P Donations**: Direct zaps in the app now go directly to the team's Lightning address (untracked donations) ### Einundzwanzig Challenge Teams
    More…
    - Added **Ashigaru** as a featured team - Added **WeSatoshi** as a featured team - Users without featured team tags now display "No Team" in leaderboard - Demo mode disabled for production ### New Teams - Added **RUNSTR** as a team option - Added **BuhoGO** as a team option ### UI Improvements - **Simplified Advanced Settings**: Streamlined the Advanced Features menu - **Leaderboard Optimizations**: Performance improvements for faster leaderboard loading - **Daily Rewards Payout UI**: Updated UI to reflect new daily rewards system - **Direct Donation Toasts**: Improved toast notifications for direct P2P donations - **Rewards Section UI**: Updated UI in the Rewards section ### Performance Optimizations - Fixed back button issue in EinundzwanzigDetailScreen (separate isRefreshing state, setImmediate cleanup) - Added Top 10 + "See More" pagination to DailyLeaderboardCard - Fixed React list keys in MiniLeaderboard (using entry.position instead of index) - Fixed React list keys in WorkoutDetailModal splits (using split number) - Restored Nostr profile fetching for non-Season2 competitions (fixed "Anonymous" display) ### Bug Fixes - Fixed Lightning address input in Advanced Settings - Fixed leaderboard date and time display bug - Fixed Android status bar hiding in FullScreenCardModal ---
  • Jan 18, 2026 1.6.3
    ## [1.6.3] - 2026-01-17 - Compete-Based Rewards & Einundzwanzig Challenge ### Rewards System Overhaul - **Compete-Based Rewards**: Workout rewards (50 sats) now trigger AFTER server-side validation - Previously: Rewards fired immediately on local save (before anti-cheat validation) - Now: Rewards only fire when workout passes server-side validation and is accepted into competition - Moved reward trigger from `workoutPublishingService.ts` to `SupabaseCompetitionService.ts` - **Einundzwanzig Double Rewards**: Earn 100 sats per workout during Einundzwanzig Challenge (Jan 21 - Feb 21) - Requires: Challenge dates active + joined Einundzwanzig + workout tagged with featured team - Featured teams: ALS Foundation, Human Rights Foundation, Bitcoin Veterans
    More…
    - New `checkEinundzwanzigBonus()` method in SupabaseCompetitionService - Orange banner on Einundzwanzig detail screen announces double rewards - **Step Rewards Unchanged**: Step rewards (5 sats/1k steps) operate independently via StepPollingService - Polls every 60 seconds, triggers rewards through StepRewardService - No "compete" button needed for steps - **Auto-Compete Default**: New users now have auto-compete enabled by default - Workouts automatically submit to competitions when finished - Toggle available in Settings → Advanced Features - **100% Donation Default**: Donation split now defaults to 100% charity - All workout rewards go to your selected team/charity by default - Donation splits section moved to Settings → Advanced Features ### UI Improvements - **Unified Workout History**: Single view merges local + health app workouts - New `UnifiedWorkoutsTab` component with source badges - Automatic deduplication (1 min time window + same type + 10s duration tolerance) - Sync button in header replaces tab toggle - **Rewards Screen Reorganization**: - Impact Level section moved up for prominence - "Your Team" and "Your Impact" now collapsible accordions - Rewards Pool displays at top when available - **YOUR ACTIVITY Card**: New stats card in WorkoutHistoryScreen showing weekly workouts, streak, and steps today - **Settings UI**: Rewards-related features moved to Advanced Features section ### Bug Fixes (Android) - **Step Counter Fix**: Fixed "0 steps today" display when native service is running - Root cause: Privacy ROM detection was incorrectly bypassing native step counter - Fix: Now checks if native service is running before applying ROM check - Files: `NativeStepCounterService.ts`, `DailyStepCounterService.ts` ### Bug Fixes (Competitions) - **Leaderboard Deduplication**: Prevents inflated distances from duplicate workout submissions - Added deduplication logic to `SupabaseCompetitionService.getLeaderboard()` - Matches by (npub, rounded distance, date) - **Double Zap Prevention**: Running Bitcoin rewards now use server-backed claim tracking - Prevents duplicate reward claims across app reinstalls ### Technical - New files: `src/utils/unifiedWorkoutMerge.ts`, `src/components/profile/tabs/UnifiedWorkoutsTab.tsx` - Modified: `WorkoutTabNavigator.tsx` simplified from ~157 to ~75 lines - New config: `EINUNDZWANZIG_REWARD_CONFIG` in constants file ---
  • Jan 16, 2026 1.6.1
    ## [1.6.1] - 2026-01-16 - Security, Bug Fixes & Performance ### Security - Migrated to fresh Supabase project infrastructure - Removed hardcoded secrets from test scripts - Removed exposed API keys from source code ### Performance - Added batch pagination to Running Bitcoin leaderboard (21 at a time + "See More") - Added batch pagination to January Walking leaderboard (21 at a time + "See More")
    More…
    - Faster initial render for competition screens with 100+ participants ### Fixed - Season II leaderboard no longer stuck on loading spinner - Added missing competition entries for activity-specific leaderboards (running/walking/cycling) - Restored workout sync cron jobs with correct vault secrets - Fixed error handling to preserve hardcoded participant data on Supabase errors ### New Features - **Local-First Leaderboards**: Users now appear on leaderboards immediately after hitting "Compete" - No more 2-minute wait for Supabase sync - Workout data pulled from local storage for instant display - Gracefully merges with server data when sync completes - **Auto-Compete Default**: New users now have auto-compete enabled by default - Workouts automatically publish to competitions when finished - Toggle available in Settings → Fitness Tracking ### Technical - 7 edge functions deployed to new Supabase project - Vault secrets updated for new project URL and service role key - Participant data migrated (134 Running Bitcoin, 38 January Walking, 61 Einundzwanzig) - Local-first leaderboard improvements: - Reusable loadLocalWorkouts callback with useFocusEffect integration - 10-minute local cache window (up from 5 minutes) - Distance and timestamp validation for local workouts - Activity type detection with explicit mapping ---
  • Jan 16, 2026 1.6.0
    ## [1.6.0] - 2026-01-15 - UI Improvements & Bug Fixes ### UI/UX Improvements - Replaced blocking modal alerts with non-blocking toast notifications for: - Compete button success messages ("Workout submitted!") - Clipboard copy confirmations - "Coming Soon" notifications - "Mark all read" confirmations - Standardized loading indicator colors across 15 components to use theme colors - Removed "kind 1301" technical jargon from user-facing messages
    More…
    ### Bug Fixes - Fixed workout publishing failure after logout/login cycle (signer caching issue) - Fixed NIP-55 signer dialog appearing for nsec users on Android - Increased Amber signing timeout from 15s to 30s for slower devices - Fixed GrapheneOS Health Connect false "Update Required" errors ### Technical - Loading indicators now use consistent theme.colors.accent/accentText/error - Toast notifications use existing toastConfig.tsx theming ---
  • Jan 15, 2026 1.5.3
    ## [1.5.3] - 2026-01-14 - Bug Fixes & Performance ### Charity Donations - Fixed 100% charity donation bug where only first user per day could donate to a charity - Charity payments now bypass per-address rate-limiting (server-side fix deployed) ### Performance - Run for Bitcoin leaderboard now uses batch pagination (21 entries at a time) - Added React.memo optimization to leaderboard rows for smoother scrolling - "See More" button loads additional entries on demand
    More…
    ### UI/UX - Changed "Share & Claim 1,000 Sats" button to "Claim Reward" - Fixed theme color violations across 7 components - Replaced yellow/green/red colors with theme orange throughout app ### Files Updated - SatlantisLeaderboard.tsx - batch pagination + memoization - RunningBitcoinDetailScreen.tsx - button text + colors - CharitySection.tsx, WatchSyncSection.tsx, toastConfig.tsx - PermissionRequestModal.tsx, WearableConnectionModal.tsx - ActivityDebugOverlay.tsx - debug status colors ---
  • Jan 14, 2026 1.5.2
    ## [1.5.2] - 2026-01-14 - Social Sharing & Competitions ### Donations - Always show split preview when team selected (shows "You: 50 sats" at 0%) - Server-side donation forwarding with automatic retry (pending_donations + cron) ### Social Sharing - Simplified to 3 templates: Text, Camera, Profile - Profile template redesigned: username/quote top, avatar center, stats bottom, team shoutout - Strength workouts show reps/sets in Profile template
    More…
    - Status bar hidden in full screen preview ### Competitions - Opened event leaderboards to all joined users - Fixed January step leaderboard (shows actual step counts, not distance) - Enrolled Season II participants in Running Bitcoin - Simplified Einundzwanzig challenge join flow ### Settings - Removed wearables sync section from settings ### Infrastructure - Improved leaderboard syncing reliability - Added competition diagnostic tools ---
  • Jan 13, 2026 1.5.1
    ## [1.5.1] - 2026-01-13 - Security & Anti-Cheat ### Security & Anti-Cheat - Workout verification system (HMAC-based `["v", "code"]` tags) - Rate limiting on reward claims ### Rewards - Cardio-only rewards (running/walking/cycling only earn sats) ### Notifications
    More…
    - Privacy-first broadcast push notifications for leaderboard updates ### Performance - Native Stack Navigator (faster screen transitions) - ~3,000 lines dead code removed (14 files) ### UX Changes - Workout cards save locally (screenshot to share externally) - Auto-compete toggle in Settings - Login/welcome modals compacted to fit without scrolling ### Fixes - NIP-01 Schnorr signatures (was incorrectly using ECDSA) - Various stability improvements ---
  • Jan 11, 2026 1.4.9
    ## [1.4.9] - 2026-01-11 - Stability & Bug Fixes ### Activity Tracker - Fixed GPS death after 20-30 minutes on Android - Reverted GPS timeout to 15s for faster recovery (was 30s) - Improved watchdog detection of GPS hiccups ### Daily Rewards - Fixed reward streak tracking bug - Step rewards now pay 100% to user (simplified donation flow)
    More…
    - Fixed foreground step catch-up calculation ### Leaderboards - Improved leaderboard data fetching and caching - Fixed profile display issues in Season 2 leaderboards - Better handling of workout sync errors ### Impact Level System - Fixed Impact Level XP calculation display - Improved charity section layout - Better handling of donation tracking ### Competition Services - Improved January Walking Contest sync - Better Running Bitcoin challenge tracking - Enhanced Supabase competition service reliability ---
  • Jan 11, 2026 1.4.8
    ## [1.4.8] - 2026-01-11 - Activity Tracker Stability ### Activity Tracker Fixes - Added GPS health monitoring for signal quality tracking - Added workout crash recovery with 30-second checkpoints - Added navigation prevention during active workouts - Prevents accidental navigation away from tracker screen during workouts - Users now get confirmation dialog if trying to leave during active tracking ### Files Restored
    More…
    - GPSHealthMonitor.ts - Monitors GPS signal quality (excellent/good/poor/lost) - WorkoutRecovery.ts - Saves checkpoint every 30 seconds for crash recovery ---
  • Jan 11, 2026 1.4.7
    ## [1.4.7] - 2026-01-10 - Performance & Bug Fixes ### Season 2 Performance - Fixed 60-second freeze when switching tabs in Season II leaderboard - Added prefetch for all Season 2 activity types on app startup - Skip unnecessary Nostr profile queries for Season 2 (use hardcoded data) - Added 5-second timeout to profile fetching to prevent UI freezes ### Bug Fixes - Fixed Amber Signer integration issues
    More…
    - Fixed Kind 1 post publishing bug - Fixed JanuaryWalking `getCompetitionId` error - Fixed HTTP image URL causing iOS App Transport Security error ### Leaderboard Improvements - Improved avatar and username display in leaderboards - Enhanced profile data loading with better fallbacks ### Health Integration - Improved Apple Health and Health Connect activity syncing - Better handling of "Other" activity types ### Settings - Renamed "Experimental Features" to "Advanced Features" - Advanced features now available to all users ### Codebase - Continued refactoring and cleanup - Removed additional dead code - Updated documentation ---
  • Jan 10, 2026 1.4.6
    ## [1.4.6] - 2026-01-10 - Simplification & Refactoring ### Leaderboard Improvements - Enhanced leaderboard performance and visual design - Improved ranking accuracy and display ### Running Bitcoin Challenge - Updated Running Bitcoin event configuration ### UI Simplification
    More…
    - Simplified Activity Tracker interface for cleaner experience - Streamlined Rewards screen layout ### Codebase Improvements - Major refactoring effort (~20k lines of code simplified) - Bug fixes and UI polish throughout the app ---
  • Jan 9, 2026 1.4.5
    ## [1.4.5] - 2026-01-08 - Performance & Polish ### Performance Improvements - Increased overall app speed and responsiveness - Optimized Nostr queries for faster data loading - Reduced memory usage across all screens ### Leaderboard Improvements - Enhanced leaderboard performance and accuracy - Improved ranking calculations
    More…
    - Better caching for faster leaderboard updates ### UI Updates - Polished interface elements throughout the app - Improved visual consistency - Minor layout refinements ### Bug Fixes - Various stability improvements - Minor bug fixes across the app ---
  • Jan 8, 2026 1.4.4
    ## [1.4.4] - 2026-01-08 - Step Competitions & Performance ### New Features - **Step Daily Leaderboard**: New daily leaderboard for step counting competitions - **Compete/Post for Steps**: Added compete and post functionality to step tracking ### Performance - Increased app speed and performance across all screens ---
  • Jan 4, 2026 1.4.0
    ## [1.4.0] - 2026-01-03 - Rewards Tab Refresh & Leaderboard Performance ### New Features - **Impact Level System**: New donation-based leveling system with XP, streak bonuses, and level titles - **Weekly Rewards Card**: Shows sats earned this week with 7-dot workout streak indicator - **Personal Impact Section**: Breakdown of your donation history by charity - **Donation Splits Redesign**: Card-style UI with charity avatar, lightning address, and zap button - **Running Bitcoin Event**: Special charitable event for ALS Foundation ### UI Improvements
    More…
    - Moved "Import from Nostr" button to fitness tracking screen - Moved RUNSTR Premium features to Settings → Experimental section - Rewards tab completely redesigned with accordion sections - Zap buttons styled consistently across the app (outline icon) ### Performance Optimizations - Leaderboard query performance improvements - Reduced redundant Nostr queries ---
  • Jan 1, 2026 1.3.1
    ## [1.3.1] - 2025-12-31 - Bug Fixes ### UI Updates - "FITNESS TRACKER" → "START WORKOUT" on profile - "FITNESS HISTORY" → "VIEW HISTORY" on profile - "FITNESS COMPETITIONS" → "BROWSE COMPETITIONS" on profile - Team zap buttons now match daily leaderboard style (outline icon) ### Bug Fixes - Fixed donation split bug (rewards now correctly split with selected team)
    More…
    - Fixed "undefined is not a function" crash on Leaderboards tab (Map serialization)
  • Dec 31, 2025 1.3.0
    ## [1.3.0] - 2025-12-31 - Season II Launch & Performance ### Season II - Registration closed UI with lock icon and closed date - Removed entry fee display (prizes are sponsor-funded) - Event-tagged workouts system for reliable leaderboards ### Performance Optimizations - Season 2 leaderboard: 30s to ~2.5s load time - AsyncStorage pre-fetch before Nostr queries
    More…
    - Non-blocking cache writes - Fixed TTL calculation bug (was 164 years, now 60 days) - Reduced relay count from 9 to 3 defaults - Reduced query timeouts for faster responses ### Bug Fixes - Workout history tab switching no longer flashes "no history" - Background step tracking toggle now persists across restarts - Daily steps compete button works with both Amber and nsec signing - Walking tracker uses same GPS thresholds as running tracker ### UI Improvements - More compact Routes button - Tab switching uses display:none pattern (instant switching)
  • Dec 30, 2025 1.2.6
    ## [1.2.6] - 2025-12-30 - Bug Fixes & UI Updates ### New Teams - Added Bitcoin Basin team ### UI Updates - Updated cycling tracker UI - Updated event creation UI ### Leaderboard
    More…
    - Added more participants to Season II leaderboard ### Improvements - Minor improvements to cardio tracker
  • Dec 30, 2025 1.2.5
    ## [1.2.5] - 2025-12-28 - Simplification ### UI Updates - Profile Screen redesign - Bottom navigation buttons ### Teams - Charities are now teams - Team competitions added as option in event creation
    More…
    ### Coach RUNSTR - Bringing your own key is now optional - Improved prompts ### RUNSTR Premium - Stats renamed to Premium - Re-introduced the level system ### Activity Tracker - Added Compete button to daily steps ### Bug Fixes - NWC wallet disconnect - Sign out deletes local data - Apple Health workouts showing up as "other" - Reward donation split problems
  • Dec 25, 2025 1.2.3
    ## [1.2.3] - 2025-12-23 ### New Features - **Workout Pledge System**: Join paid events by pledging future workout rewards instead of paying upfront - Commit N daily workouts and rewards go to event destination (captain or charity) - One active pledge at a time, no cancellation once committed - Progress tracking with ActivePledgeCard on Rewards screen - **SimpleEventWizardV2**: Redesigned single-page event creation - all options on one screen - **Enhanced Event Join Flow**: Join events with pledge payment option
    More…
    ### Improvements - Improved reward earned modal with enhanced UI - Better frozen event caching with additional utility methods - Enhanced Season 2 and Satlantis event hooks - Updated event creation and publishing flow ### Bug Fixes - Share modal stability improvements - Workout event store refinements
  • Dec 21, 2025 1.2.1
    ## [1.2.1] - 2025-12-20 ### Bug Fixes - Fixed version display in Settings screen (was showing outdated 1.0.5) - Minor stability improvements ### Walk Tracker Simplification - **Simplified to match Running Tracker**: Shows distance + duration as hero metrics during active tracking - **No more step confusion**: Removed step count display during active walks (Health Connect batching caused 0-step display) - **Clean data sources**: Tracked Steps card now only pulls from Health Connect (no local workout mixing)
  • Dec 15, 2025 1.0.0
    ## [1.0.0] - 2025-12-13 **Achievement**: RUNSTR 1.0 - Major milestone release with Events system and Season 2 ### ✨ Features **Events System** - Events tab renamed to Leaderboard - External events display in-app with leaderboards - Event creators have captain dashboard access for leaderboard customization
    More…
    - Payout information display - Minimum distance and maximum duration settings - Lottery component for events **In-App Event Creation** - Create events directly within the app - NWC integration for Lightning payments - Automated payouts to winners - RSVP system for event participation - Events viewable across other Nostr clients **RUNSTR Season 2** - Season 2 banner added to Profile screen - New seasonal content and challenges **Daily Rewards System** - 21 sats reward per daily workout - Integrated with workout completion flow **Level System** - New level-based progression replaces health metrics display - Level-based achievements and milestones **Leaderboard Improvements** - Zap users directly from leaderboard (instead of charity-only) ### 🐛 Bug Fixes **RUNSTR COACH** - Fixed step count tracking in Coach Runstr **Alby Hub** - Alby Hub app submission compatibility updates ### 📱 Platform Updates - iOS: Version 1.0.0 (Build 100) - Android: Version 1.0.0 (Build 100)
  • Dec 9, 2025 0.9.9
    ## [0.9.9] - 2025-12-09 **Achievement**: Enhanced activity tracking and routes system ### ✨ Features **Routes System Revamp** - New simplified routes flow: "Routes" button opens modal - Save routes from your last 3 runs with custom names - View all runs within a saved route
    More…
    - Select route before run → Auto-added on completion **Running Personal Records** - Displays best times for 5K, 10K, Half Marathon, and Marathon - Track progress toward new PRs with each run **Walking Improvements** - New "Best Walk" display showing walk with most steps tracked - Clearer step counting with platform-specific labels **Enhanced GPS Tracking** - Smart GPS watchdog detects and recovers from tracking failures - Battery-adaptive GPS modes optimize power usage - Zombie interval detection for reliable tracking **Compact Analytics** - More compact layout for advanced analytics screen **RUNSTR Premium** - Added link to RUNSTR Premium in settings **RUNSTR COACH Improvements** - Enhanced nutritional breakdown capabilities - Better context generation for AI coaching ### 🐛 Bug Fixes **iOS 30-Minute Crash** - Fixed tracking crash after 30 minutes with intelligent write batching **Android Health Connect** - Fixed step double-counting issue - Corrected exercise type mappings for 20+ activities **Meditation Sessions** - Fixed meditation session tracking bug - Improved meditation UI **Activity Tracker** - Improved elevation tracking during workouts - Session persistence across app restarts ### 📱 Platform Updates - iOS: Version 0.9.9 (Build 85) - Android: Version 0.9.9 (Build 85)
  • Dec 5, 2025 0.9.8
    ## [0.9.8] - 2025-12-03 **Achievement**: Enhanced sharing and UI improvements ### ✨ Features **Enhanced Sharing Cards** - Kind 1 posts now use template picker for beautiful sharing cards - Improved social media sharing experience
    More…
    **Activity Tracker UI** - Updated activity tracker interface ### 🐛 Bug Fixes **Health Connect** - Fixed Health Connect integration issues **Fasting Timer** - Fixed fasting timer bug ### 📱 Platform Updates - iOS: Version 0.9.8 (Build 84) - Android: Version 0.9.8 (Build 84)
  • Dec 3, 2025 0.9.7
    ## [0.9.7] - 2025-12-02 **Achievement**: Bug fixes and stability improvements ### 🐛 Bug Fixes **Post Workout Modal UI** - Fixed UI display issues in post-workout summary modal **Activity Tracker Elevation**
    More…
    - Improved elevation tracking during workouts **Activity Tracker GPS Accuracy** - Enhanced GPS accuracy for distance and route tracking **Health Connect Fix** - Fixed Health Connect integration issues on Android ### 📱 Platform Updates - iOS: Version 0.9.7 (Build 83) - Android: Version 0.9.7 (Build 83)
  • Dec 1, 2025 0.9.5
    ## [0.9.5] - 2025-01-30 **Achievement**: Critical charity attribution fix and wallet UX improvements ### 🐛 Bug Fixes **Charity Attribution Fix**: - Fixed critical bug where user's selected charity appeared on other users' leaderboard results - Root cause: Charity was being fetched from current user's profile instead of workout event tags - Solution: Embedded charity data directly into kind 1301 workout event tags at publish time
    More…
    - Modified workoutPublishingService.ts to include charity tag: `['charity', id, name, lightningAddress]` - Updated nostrWorkoutParser.ts to extract charity from event tags instead of user profile - Ensures each workout displays the charity selected at the time of publication - Defaults to OpenSats when no charity tag is present (backward compatibility) - Files modified: workoutPublishingService.ts, nostrWorkoutParser.ts, ZappableUserRow.tsx, NWCLightningButton.tsx, nostrWorkout.ts, ExternalZapModal.tsx, KIND_1301_SPEC.md **Wallet UX Improvements**: - Removed non-functional QR code from ExternalZapModal (react-native-qrcode-svg dependency issue) - Added amount selection UI with preset buttons (1000, 2100, 5000, 10000 sats) - Added custom amount input for flexible donations - Added "Set as default" option to remember preferred zap amounts - Separated amount selection from payment flow for clearer UX - Restricted zapping to charities only (removed peer-to-peer zapping) - Files modified: ExternalZapModal.tsx (major refactor) ### 📱 Platform Updates - iOS: Version 0.9.5 (Build 81) - Android: Version 0.9.5 (Build 81)
  • Nov 29, 2025 0.9.4
    ## [0.9.4] - 2025-11-29 **Achievement**: Critical bug fixes for Android background tracking, cycle tracker improvements, and UI refinements ### 🐛 Bug Fixes **Android Background Tracking Stability**: - Fixed Android background tracking by implementing proper battery optimization exemption - Added `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` permission to AndroidManifest - Updated BatteryOptimizationService to use IntentLauncher with package-specific URI
    More…
    - Opens direct battery exemption dialog instead of wrong settings screen - Allows tracking to continue even when notification permission is denied - Enhanced AppPermissionService to separate notification and location permissions **Cycle Tracker UI Modifications**: - Complete UI refactor from BaseTrackerComponent to custom implementation - Added 2x2 grid layout for key metrics (Distance, Duration, Speed, Elevation) - Improved visual hierarchy with larger metric values and better spacing - Enhanced elevation display with gain/loss tracking - Cleaner interface optimized for cycling-specific data **Cycle Tracker Auto-Start Countdown**: - Added 3-2-1-GO countdown sequence before starting GPS tracking - Implemented `handleHoldComplete()` and `proceedWithTracking()` methods - Fixed permission check to happen BEFORE countdown (prevents failed starts) - Improved user feedback with countdown animation - Prevents premature tracking starts and permission errors **NWC Error Suppression**: - Suppressed confusing warning messages for new users without NWC wallet configured - Added LogBox.ignoreLogs() to filter out false-alarm errors - Filters "Text strings must be rendered within a <Text> component" warning - Filters "[NWC] ❌ User wallet initialization failed: No NWC connection string found" message - Improves first-time user experience by hiding wallet initialization noise ### 📱 Platform Updates - iOS: Version 0.9.4 (Build 80) - Android: Version 0.9.4 (Build 80)
  • Nov 28, 2025 0.9.3
    ## [0.9.3] - 2025-01-26 **Achievement**: Event auto-creation, iOS permission fix, and expanded charities ### ✨ Features - Event auto-creation when users publish kind 1301 workout events to Nostr (removed wizard) - Expanded charity selection to 10 total organizations: - Original: OpenSats, Human Rights Foundation - NEW: Bitcoin Beach (El Salvador), Bitcoin Bay (Bay Area), Bitcoin Ekasi (South Africa), Bitcoin Isla (Philippines), Bitcoin Valley (Guatemala), Bitcoin District (Washington DC), Bitcoin Yucatan (Mexico), Bitcoin Veterans
    More…
    ### 🐛 Bug Fixes - Fixed iOS permission modal freezing bug ### 📱 Platform Updates - iOS: Version 0.9.3 (Build 79) - Android: Version 0.9.3 (Build 79)
  • Nov 24, 2025 0.9.1
    ## [0.9.1] - 2025-01-23 **Achievement**: Critical bug fixes for account persistence, profile editing, and social card improvements ### 🐛 Critical Bug Fixes **Auto-Generated Account Persistence**: - Fixed critical issue where auto-generated Nostr accounts (npub/nsec) were not persisting across app restarts - Changed `@runstr:is_new_signup` flag from 'true' to 'false' to treat auto-generated accounts like manual logins - Ensures Bitcoiners using auto-generated keys don't lose their accounts on app restart
    More…
    - Modified AuthContext.tsx line 412 **Profile Edit Screen Improvements**: - Fixed profile edit screen stale data issues by replacing `useEffect` with `useFocusEffect` - Removed async `refreshAuthentication()` call causing timing issues - Added 100ms delay for smoother navigation animations - Profile changes now save reliably without crashes or data inconsistencies - Updated ProfileEditScreen.tsx **Walk Activity Social Cards**: - Fixed confusing "0 km" display on step counter posts - Added `isStepCounterPost()` method to distinguish step-only tracking from GPS-tracked walks - Step counter posts now show only steps count (no distance) - GPS-tracked walks display distance, steps, duration, and calories - Enhanced workoutCardGenerator.ts with smarter card generation logic **Splash Icon Refinements**: - Updated splash screen assets for improved visual consistency - Better icon display across iOS and Android devices ### 📱 Platform Updates - iOS: Version 0.9.1 (Build 77) - Android: Version 0.9.1 (Build 77)
  • Nov 23, 2025 0.9.0
    ## [0.9.0] - 2025-01-22 **Achievement**: Personal Records, startup improvements, and splash screen fixes ### 🐛 Critical Bug Fixes **App Startup Fix**: - Fixed app freeze on initial startup when requesting HealthKit permissions - Moved HealthKit permission request to Apple Health tab (requires manual connection) - Removed automatic HealthKit initialization on app launch
    More…
    - Improved WorkoutTabNavigator to only mount active tab **Splash Screen Fixes**: - Fixed iOS splash screen ghosting effect (replaced splash assets) - Fixed Android circular splash crop (changed Theme from SplashScreen to AppCompat.NoActionBar) - Updated all iOS xcassets images (1x, 2x, 3x for both light and dark mode) - Modified android/app/src/main/res/values/styles.xml for full-screen splash display ### ✨ New Features **Achievements Section**: - Added comprehensive personal records (PRs) section in Stats screen - Cardio PRs: Fastest 5K, 10K, half marathon, marathon times - Strength PRs: Maximum single weight lifted, best weight × rep combination - Wellness PRs: Longest meditation/yoga streaks - Nutrition PRs: Longest meal logging streak, maximum fasting duration - Beautiful collapsible UI with trophy icons and RUNSTR branding - PersonalRecordsService for PR calculations across all workout types - AchievementsCard component with orange/gold theme matching RUNSTR design ### 🔧 Technical Improvements **Performance**: - WorkoutTabNavigator optimized to only mount active tab (reduces memory usage) - AppleHealthTab now requires manual "Connect Apple Health" button tap - Improved app startup time by deferring HealthKit initialization **UI/UX Enhancements**: - Styled "Connect Apple Health" button to match app design - Added deprecation warnings for disabled background sync services - Cleaner native workout session handling ### 📱 Platform Updates - iOS: Version 0.9.0 (Build 76) - Android: Version 0.9.0 (Build 76)
  • Nov 22, 2025 0.8.9
    ## [0.8.9] - 2025-01-21 **Achievement**: Apple Run tracker stability fixes and Coach RUNSTR AI enhancements ### 🐛 Critical Bug Fixes **Apple Run Tracker Crash Fix**: - Fixed app crash when starting Apple Run tracker - Resolved "Auto Stop for presets" functionality issue - Improved workout session lifecycle management
    More…
    - Added WorkoutSessionBridge for native iOS HealthKit integration **Activity Tracking Improvements**: - Updated Activity tracking UI (removed GPS display for cleaner interface) - Fixed Split voice announcements not playing correctly - Enhanced workout session stability and reliability ### ✨ Coach RUNSTR Features **AI Model Selection**: - Added 10+ AI model options for personalized coaching - Model choices: Claude Haiku 4.5, Claude Sonnet 4.5, GPT-5 Nano, GPT-5 Mini, Gemini 2.5 Flash, Auto Model, GPT-5.1, DeepSeek V3.1, Qwen3 Max, Sonar Reasoning - Model selection accessible via Settings screen - Persistent model preference storage **RUNSTR Context Access (RUNSTR.MD)**: - Coach RUNSTR now has access to complete RUNSTR project context - Enhanced AI responses with project-specific knowledge - Improved coaching relevance and accuracy - Better understanding of app features and capabilities **Fitness Test Integration**: - Fitness test results now appear in workout history - Test results can be posted as kind 1 Nostr events - Enhanced fitness test results screen with better data display - Improved local workout storage for test data ### 🔧 Technical Improvements **iOS Native Integration**: - New WorkoutSessionBridge for unlimited background tracking on iOS - Proper HKWorkoutSession lifecycle management - Improved HealthKit integration and reliability **AI Service Architecture**: - New ModelManager service for AI model management - RunstrContextGenerator for dynamic context creation - Enhanced CoachClaudeService with model selection support **Performance**: - Optimized workout card rendering - Improved workout detail modal performance - Enhanced local storage efficiency ### 📱 Platform Updates - iOS: Version 0.8.9 (Build 74) - Android: Version 0.8.9 (Build 75)
  • Nov 20, 2025 0.8.8
    ## [0.8.8] - 2025-01-19 **Achievement**: iOS freeze fix and major performance improvements ### ✨ Features - Added pull-to-refresh for Events screen - Smart cache TTL based on time of day for events (1min during active hours, 15min overnight) - Auto Competition Team - joining a team automatically sets it as default competition team - Team name now included in kind 1 workout events for better attribution - Improved Settings charity display with better layout and visual design
    More…
    - Removed "My Teams" button for cleaner navigation (teams accessible via profile) ### 🐛 Critical Bug Fixes - **iOS Freeze Fix**: Resolved permanent app freeze after granting permissions on first launch - Removed HealthKit auto-initialization from app.json (deferred to manual user action) - Increased background init delay from 2s to 5s to prevent UI blocking - Added InteractionManager guards to prevent main thread blocking during startup - Fixed Captain "My Teams" bug where captains couldn't access their team dashboard - Fixed iOS background cardio tracker permission handling and reliability ### ⚡ Performance Improvements - Cleaned up unnecessary Nostr queries (teams/workouts already optimized with hardcoded data) - Optimized kind 1301 workout event fetching (on-demand only, no wasteful prefetching) - Reduced app startup time by eliminating redundant network calls - Teams now load instantly from hardcoded data (no 4-6s Nostr query delay) ### 🔧 Technical Improvements - Removed `@yzlin/expo-healthkit` plugin with `background: true` setting - HealthKit permissions now only requested when user clicks "Connect Apple Health" - Added timeout protection and InteractionManager guards to prevent blocking operations - Verified all Nostr queries are on-demand (leaderboards, competitions, import feature) - Enhanced event cache strategy with time-of-day awareness
  • Nov 18, 2025 0.8.7
    ## [0.8.7] - 2025-11-18 **Achievement**: Fixed "My Events" filtering to show only user-participated events ### 🐛 Bug Fixes - Fixed "My Events" page to only show leaderboards where user has posted a workout today - Users now see full leaderboards (all team members) but only for events they're actively competing in - Eliminated display of empty/non-participated event categories ### 🔧 Technical Improvements
    More…
    - Added user filtering to SimpleLeaderboardService.getTeamDailyLeaderboards() method - Implemented npub-to-hex conversion for accurate leaderboard entry matching - Enhanced EventsScreen to pass user's hex pubkey for participant filtering - Added debug logging for filtering transparency
  • Nov 18, 2025 0.8.6
    ## [0.8.6] - 2025-11-18 **Achievement**: UI improvements and critical bug fixes ### ✨ Features - Settings UI/UX update with improved layout and navigation - Team discovery screen UI update with consistent text-only cards for all teams ### 🐛 Bug Fixes - Fixed Activity Tracker permissions handling
    More…
    - Fixed leaderboard data loading and display issues - Fixed "Find Teams" button navigation error (now correctly navigates to Teams tab) - Fixed team categorization - Ohio Ruckers, Ruckstr, CYCLESTR, Spain scape, LATAM Corre now properly categorized - Removed invalid "X" team from discovery ### 🔧 Technical Improvements - Simplified TeamCard component for consistent card design across discovery - Enhanced categorization keywords (added "ruck", "cycl", "corre", "scape") for better team organization - Improved navigation routing for team discovery flow
  • Nov 17, 2025 0.8.3
    ## [0.8.3] - 2025-01-16 ### 🐛 Critical Bug Fixes & UI Updates **Achievement**: Fixed captain detection, team membership display, and renamed leaderboards to Events for clearer UX. ### ✨ UI Updates **What's New**: - Renamed "Today's Leaderboards" to "Events" throughout app for clearer terminology
    More…
    - Updated team page section header from "Today's Leaderboards" → "Events" - Updated leaderboard screen title from "Today's Leaderboards" → "Events" - Simplified empty state messaging to match new "Events" terminology **Impact**: More intuitive terminology that better reflects the app's event-driven leaderboard system ### 🐛 Critical Bug Fixes **Captain Detection Fix**: - Fixed captain detection using hex pubkey comparison instead of npub - Team captainId is always hex-encoded, now properly compared with user's hex pubkey - Resolves issue where captains weren't recognized and couldn't access dashboard **My Teams Display Fix**: - Fixed "My Teams" screen not showing user's teams correctly - Added Android-specific team data refresh logic on mount - Teams now properly display in My Teams list after joining **Captain Dashboard Simplification**: - Streamlined captain dashboard to focus on essential team editing - Removed complex management sections (events, members, join requests, etc.) - Single "Edit Team" button for cleaner, more focused captain experience **Impact**: Captain detection now works reliably, teams display correctly in My Teams, and captain dashboard is simpler and more maintainable ### 🔧 Technical Improvements **Android-Specific Fixes**: - Added Android team data refresh logic to ensure latest teams display - Fixed AsyncStorage team membership synchronization - Improved local team storage reliability **Code Quality**: - Better hex pubkey handling in captain detection logic - Cleaned up captain dashboard component (~200 lines removed) - Improved team membership service consistency **Impact**: More reliable Android experience with proper captain detection and team display
  • Nov 14, 2025 0.8.0
    ## [0.8.0] - 2025-01-13 ### 🎯 Event Leaderboard Stability & UI Improvements **Achievement**: Fixed critical event leaderboard loading issues with nuclear pattern implementation and enhanced UI consistency with orange theme throughout the app. ### 🔧 Fixes Implemented #### 1. Event Leaderboard Nuclear Pattern Fix **Problem**: Event leaderboards were hanging indefinitely with no loading state or timeout, causing blank screens and poor user experience.
    More…
    **Solution**: Implemented "nuclear pattern" with guaranteed timeout, proper loading states, and graceful error handling. **Key Changes**: - Added subscription-based query pattern with 10-second guaranteed timeout - Implemented proper loading/error states in EventLeaderboardSection - Added automatic subscription cleanup to prevent memory leaks - Graceful fallback when no workout data found **Files Fixed**: - `src/services/event/EventLeaderboardService.ts` - Nuclear pattern with subscriptions - `src/components/event/EventLeaderboardSection.tsx` - Loading/error states - `docs/EVENT_LEADERBOARD_PATTERN.md` - Pattern documentation **Impact**: Event leaderboards now load reliably with clear feedback to users, eliminating infinite hang states. #### 2. Background Sync Service Static Import Fix **Problem**: Dynamic import of BackgroundSyncService was causing 30-minute idle crashes due to race conditions and promise handling issues. **Solution**: Changed to static import for more reliable initialization and lifecycle management. **Files Fixed**: - `src/app/_layout.tsx` - Changed from dynamic to static import of BackgroundSyncService **Impact**: More stable background sync initialization, contributing to overall app stability. ### 🎨 UI Improvements #### Orange Theme Consistency - Updated all primary buttons to use consistent orange theme (#f97316) - Applied orange accent to navigation elements and interactive components - Enhanced visual hierarchy with consistent color scheme #### Text-Only Buttons - Converted icon-heavy buttons to clean text-only design - Improved readability and reduced visual clutter - Better accessibility for screen readers #### Stats Page Enhancements - Improved layout and spacing for better readability - Added clearer data visualization - Enhanced performance metrics display **Files Updated**: - Multiple UI components across `src/components/` and `src/screens/` **Impact**: More polished, consistent user interface with better visual feedback and improved usability. ### 🐛 Issues Resolved - ✅ Event leaderboard infinite hangs eliminated - ✅ Loading states now properly displayed - ✅ Subscription cleanup prevents memory leaks - ✅ Background sync more reliable - ✅ UI consistency improved across all screens
  • Nov 10, 2025 0.7.0
    ## [0.7.0] - 2025-11-09 ### Fixed - Bug fixes and stability improvements for Nostr publishing - Resolved crash issues when publishing workouts to Nostr
  • Nov 10, 2025 0.6.7
  • Nov 10, 2025 0.6.6
    ## [0.6.6] - 2025-11-09 ### Fixed - **Comprehensive Android Background Crash Resolution** - Eliminated all sources of instant white screen crashes - Root cause: 6+ conflicting AppState listeners across multiple services creating race conditions - v0.5.9 worked because it had NO background monitoring services running - v0.6.2 introduced `ChallengeCompletionService` with 5-minute interval that crashed on background - **AppStateManager.ts**: Created centralized single source of truth for app state management - **App.tsx**: Removed ALL AppState listeners, now uses AppStateManager exclusively - **ChallengeCompletionService.ts**: Added `AppStateManager.canDoNetworkOps()` guards before Nostr queries
    More…
    - **GlobalNDKService.ts**: Added background checks to prevent connection attempts when suspended - **NostrMobileConnectionManager.ts**: Replaced AppState listener with AppStateManager callbacks - App now mimics v0.5.9 behavior: NO background operations on Android whatsoever ### Architecture - **Centralized State Management** - AppStateManager prevents multiple listeners and race conditions - Single AppState.addEventListener in entire app (AppStateManager only) - All services register callbacks with AppStateManager - Android-specific instant blocking (iOS gets grace period) - Operation queue for resuming work when app returns to foreground - Comprehensive guards before ANY network operation ### Technical - Bumped version code from 57 to 58 (Android) - Removed 6 conflicting AppState listeners from various services - All network operations now gated by `AppStateManager.canDoNetworkOps()` - Restored v0.5.9 stability: zero background operations = zero crashes
  • Nov 9, 2025 0.6.5
    ## [0.6.5] - 2025-11-09 ### Fixed - **Android Instant Background Crash (CRITICAL)** - Fixed immediate white screen crash when switching apps - Root cause: Multiple conflicting AppState listeners with synchronous WebSocket operations creating race condition - Android kills WebSockets immediately on background, causing crash when accessed - **App.tsx (lines 546-564)**: Removed entire conflicting AppState handler that was competing with NostrMobileConnectionManager - **NostrMobileConnectionManager.ts (lines 131-147)**: Deferred background transition operations with setTimeout to avoid synchronous execution - **NostrMobileConnectionManager.ts (lines 214-226)**: Added setTimeout wrapper to pauseConnections() WebSocket access - **NostrMobileConnectionManager.ts (lines 278-291)**: Added try-catch to verifyConnections() method
    More…
    - **NostrRelayManager.ts (lines 169-202)**: Added guards to getConnectionStatus() to handle dead WebSocket references - App now handles instant backgrounding without crashes, restoring v0.5.9 stability ### Improved - **WebSocket Safety** - All WebSocket operations now properly guarded against Android's immediate suspension - Deferred operations prevent race conditions during app state transitions - Safe fallbacks return empty connection stats when WebSockets are dead - Comprehensive error handling throughout connection management layer ### Technical - Bumped version code from 56 to 57 (Android) - Removed synchronous operations from AppState change handlers - Added defensive programming patterns for Android WebSocket lifecycle
  • Nov 9, 2025 0.6.4
    ## [0.6.4] - 2025-11-09 ### Fixed - **Android Background Crash** - CRITICAL: Resolved persistent white screen crashes when backgrounding app for 4+ seconds - Root cause: `ChallengeCompletionService` monitoring service (added in v0.6.2) continued running async Nostr queries during background state - OS suspends JavaScript execution after ~4 seconds → dangling Promises crash app on resume - **App.tsx (lines 560-566, 581-588)**: Stop challenge monitoring when app goes to background, restart on foreground - **App.tsx (lines 693-706)**: Defer initial challenge monitoring start by 5 seconds to prevent startup crashes - **ChallengeCompletionService.ts (lines 81-85)**: Added early exit check if monitoring is stopped (prevents background execution) - **ChallengeCompletionService.ts (lines 109-116)**: Enhanced error handling with comments explaining crash prevention
    More…
    - **ChallengeService.ts (lines 609-614)**: Guard GlobalNDKService queries with relay connection check - **ChallengeService.ts (line 638-639)**: Return empty array instead of throwing when NDK unavailable - App now handles background/foreground transitions gracefully like v0.5.9 did (4+ hour workouts supported) ### Improved - **AppState Lifecycle Management** - Professional background service handling - Services now stop cleanly during background transitions - Safe restart with error boundaries on foreground return - Deferred initialization prevents race conditions during app startup - All service operations wrapped in try-catch to prevent unhandled rejections ### Technical - Bumped version code from 55 to 56 (Android) - Added comprehensive error logging with emoji prefixes for easier debugging - Graceful degradation when Nostr relays unavailable (return empty arrays vs crashing)
  • Nov 9, 2025 0.6.3
    ## [0.6.3] - 2025-11-09 ### Fixed - **Android Crash Stability** - Resolved critical white screen crashes on Android - Fixed `ChallengeNotificationHandler` constructor async call crash during app resume from background - Added screen-level `ErrorBoundary` component wrapping lazy-loaded screens - Fixed `WalletStore` references to deleted `nutzapService` (removed in v0.6.2) - Added defensive error handling in `ChallengeDetailScreen` leaderboard loading - Added SVG validation fallbacks in `workoutCardGenerator` to prevent rendering crashes - Wrapped `SimpleTeamScreen` lazy loading in error boundary to prevent navigation crashes
    More…
    - All async operations now have proper error handling to prevent unhandled promise rejections - **Event Data Completeness** - Resolved "Event Data Incomplete" errors - Added `captainPubkey` fallback injection in `SimpleTeamScreen` (line 163) - Events now auto-heal stale cached data by injecting captain info from team context - Enhanced `SimpleCompetitionService` with defensive captain pubkey extraction (lines 749-753) - Added redundant captain tag to event publishing in `NostrCompetitionService` (line 280) - New events publish with both `event.pubkey` and `['captain', captainPubkey]` tag for reliability - Added `clearEventCaches()` method to `UnifiedNostrCache` for manual cache clearing ### Improved - **Error Recovery** - Enhanced app stability and user experience - Screen errors now show friendly error message with "Go Back" button instead of blank screen - Background/foreground transitions now handle errors gracefully - SVG generation failures fall back to minimal workout cards - Challenge leaderboard failures degrade gracefully to basic challenge info ### Technical - Bumped version code from 54 to 55 (Android) - All deprecated NutZap wallet methods now return graceful errors instead of crashing
  • Nov 8, 2025 0.6.2
    ## [0.6.2] - 2025-11-08 ### Added - **Simplified Challenge System** - Streamlined 1v1 challenge creation and management - Reduced to 4 running distances only (5K, 10K, Half Marathon, Marathon) - Fixed 1-day duration for all challenges (removed custom duration options) - Instant challenge creation (removed acceptance/request flow) - Wagers displayed as social agreements (text-only, not enforced) - `ChallengeAnnouncementPreview.tsx`: +465 lines with new announcement cards - `challengeAnnouncementCardGenerator.ts`: +327 lines with social card generation
    More…
    - `test-challenge-flow.ts`: +581 lines comprehensive challenge testing script - **Event Location & Charity Display** - Enhanced event creation with charity integration - Optional location field in event creation wizard - Charity display showing "100% of entry fees support [charity name]" - Location icon and charity card on EventDetailScreen - **Activity-Specific Workout Stats** - Smarter workout data display by activity type - **Strength workouts**: Exercise type, reps, sets, weight (calories hidden) - **Meditation workouts**: Meditation type, duration (calories hidden) - **Diet entries**: Meal type, meal size, food description, calories (duration hidden) - Social cards show specific exercise names (e.g., "Bench Press" vs generic "Strength Training") - **Comprehensive Testing Infrastructure** - New diagnostic and testing tools - `diagnose-event-display.js`: +207 lines event display debugging - `EVENT_SYSTEM_TROUBLESHOOTING.md`: +375 lines troubleshooting documentation - Enhanced KIND_1301_SPEC.md with strength training examples ### Improved - **Tag-Based Challenge Architecture** - Complete migration from lists to tags - Migrated from kind 30000 participant lists to kind 30102 tag-based queries - Participants stored directly in 'p' tags (no separate list events) - All challenge queries use NDKFilter with '#p' tags for better performance - `ChallengeService.ts`: Major refactor with `getChallengeEvent()`, `extractParticipants()`, `parseChallengeEvent()` - Reduced WebSocket overhead by eliminating kind 30000 list creation - **Volume-Based Strength Calorie Calculation** - More accurate strength training calories - New formula: `(reps × weight × sets × 0.0025) + (duration × 3)` - Accounts for actual work performed, not just time - Example: 145 lb bench × 20 reps × 3 sets = 58 calories (vs 13 with old formula) - Bodyweight exercises auto-use user's body weight - `CalorieEstimationService.ts`: Updated with volume-based calculations - **Per-Set Weight Tags in Nostr Events** - Enhanced workout tracking - Added per-set weight tags to kind 1301 strength events - Tag format: `['weight_set', '<set_number>', '<weight>', 'lbs']` - Enables volume-based competition scoring - Supports progressive overload tracking - **Event Display System Enhancements** - Better event discovery - Extended date filtering window from 48 hours to 7 days - Comprehensive debug logging showing date boundaries and filtering decisions - More permissive event retention for improved discovery - `SimpleCompetitionService.ts`: Enhanced with detailed logging - **UI/UX Refinements** - Cleaner user experience - Bottom navigation updated (removed RUNSTR Season competition tab) - QR code scanner moved to Settings (specifically for NWC setup) - Tapping zap button opens external zapping mechanism - Hide weight input for bodyweight exercises (pushups, pullups, situps) - Enhanced workout cards with per-set breakdowns (e.g., "25 @ 135 lbs for Set 1") - Simplified success alert flow after event creation ### Fixed - **Event Display Issues** - Resolved critical event visibility problems - Fixed events not displaying in SimpleTeamScreen (showed "No events scheduled") - Fixed success modal not appearing after event creation - Fixed events being filtered out too aggressively (48-hour → 7-day window) - Events now clickable and showing detail screens correctly - `EventCreationWizard.tsx`, `SimpleTeamScreen.tsx`: Multiple fixes applied - **Workout Data Completeness** - Missing fields now properly propagated - Added missing activity-specific fields to workout objects - Fixed exerciseType, meditationType, mealType, mealSize, notes propagation - `StrengthTrackerScreen.tsx`, `MeditationTrackerScreen.tsx`: Field handling fixed - **Social Card Generator** - Accurate workout type display - Fixed showing specific exercise name instead of generic "Strength Training" - Fixed using top-level `workout.repsBreakdown` instead of `workout.metadata.repsBreakdown` - `workoutCardGenerator.ts`: Stats display logic corrected ### Technical Changes - **Code Cleanup - Removed 2,800+ Lines of Deprecated Components** - Deleted `ChallengeRequestService.ts` (-926 lines) - acceptance flow deprecated - Deleted `ChallengeRequestModal.tsx` (-646 lines) - no longer needed - Deleted `ChallengeRequestCard.tsx` (-372 lines) - request notifications removed - Deleted `OpenChallengeWizard.tsx` (-368 lines) - simplified to instant challenges - Deleted `QRChallengePreviewModal.tsx` (-488 lines) - deprecated QR acceptance flow - **Component Refactoring** - Simplified architecture - Complete rewrite of `ChallengeDetailScreen.tsx` for instant challenges - Updated `ChallengeLeaderboardScreen.tsx` with fastest-time HH:MM:SS formatting - Simplified `ChallengeNotificationsBox.tsx` (reduced complexity) - Updated `QuickChallengeWizard.tsx` and `SimplifiedChallengeWizard.tsx` for instant flow - **Alpha Release Preparation** - Feature flags and cleanup - Hidden charity level ring in PublicWorkoutsTab (can re-enable post-alpha) - Charity donation functionality on team pages remains intact - Stats screen updated with performance improvements - **Architecture Improvements** - Better performance patterns - All challenge queries migrated to tag-based NDKFilter patterns - Single source of truth (kind 30102 tags) for better data consistency - Improved debug logging throughout event system - **Statistics** - 27 files modified in main refactor - +3,560 insertions, -2,494 deletions (net +1,066 lines) - 5 major files deleted (2,800+ lines removed) - 3 new files added (test scripts, documentation) - Major additions: ChallengeAnnouncementPreview (+465), test-challenge-flow (+581), challengeAnnouncementCardGenerator (+327)
  • Nov 3, 2025 0.5.9
    ## [0.5.9] - 2025-11-03 ### Added - **Per-Set Weight Tracking** - Strength training now tracks weight for each individual set - `StrengthTrackerScreen.tsx`: +260 lines with per-set weight tracking - Weight input modal allows entering weight for each set - Pre-fills with previous set's weight or setup weight for convenience - Stores per-set weights in workout metadata - **Enhanced Workout Card Stats** - Smarter stat display based on workout type
    More…
    - `workoutCardGenerator.ts`: +91 lines with improved stat generation - **Strength workouts**: Per-set breakdown showing "X reps @ Y lbs" for first 3 sets - **Diet workouts**: Meal type and portion size display - **Meditation workouts**: Meditation type display (e.g., "Guided", "Breathwork") - Shows "+N more sets" indicator when more than 3 sets - **PerformanceLogger Utility** - New performance monitoring tool - `PerformanceLogger.ts`: Track and log performance metrics - Helps identify bottlenecks and optimization opportunities ### Improved - **Social Sharing Enhancements** - Better user profile integration - All activity trackers now load user avatar and name for social cards - StrengthTrackerScreen, MeditationTrackerScreen, DietTrackerScreen updated - Richer social cards with user identity - **Nuclear1301Service** - Enhanced workout publishing - `Nuclear1301Service.ts`: +42 lines of improvements - Better workout data processing and validation - Improved error handling - **Workout Publishing Service** - Better publishing flow - `workoutPublishingService.ts`: +11 lines of enhancements - More reliable workout posting to Nostr - **Navigation & Context** - Performance and data flow improvements - `NavigationDataContext.tsx`: +24 lines with better data management - `BottomTabNavigator.tsx`: +10 lines of optimizations - `AuthContext.tsx`: +5 lines with auth flow improvements - `App.tsx`: +4 lines of initialization improvements ### Fixed - **Replaced React Native Alert** - Better UX across activity trackers - Replaced native Alert with CustomAlert component - Consistent alert styling and behavior - Better integration with app theme - **Weight Tracking Workflow** - Improved strength training UX - Weight defaults to previous set's weight for faster entry - Better validation and error handling - Clearer labels ("Avg Weight" vs per-set weights) ### Technical Changes - **Workout Type Support** - Enhanced type system - `workout.ts`: +2 lines with new workout type fields - Support for per-set weights, meal types, meditation types - **Statistics** - 12 files modified (11 updated, 1 new file) - 435 insertions, 80 deletions (net +355 lines) - Major additions: StrengthTracker (+260 lines), workoutCardGenerator (+91 lines), Nuclear1301Service (+42 lines)
  • Nov 3, 2025 0.5.8
    ## [0.5.8] - 2025-11-02 ### Added - **Leaderboard Workout Caching System** - Major performance improvement for competition leaderboards - `CompetitionCacheService.ts`: +88 lines with new leaderboard workout caching - 5-minute TTL cache for multi-member workout queries - Reduces network overhead and improves leaderboard loading speed - Smart cache key generation based on member list, activity type, and date range - **Activity-Specific Workout Stats Display** - Intelligent stat display based on workout type
    More…
    - Cardio workouts (running, walking, cycling, hiking): Distance, Pace, Duration, Calories - Strength workouts: Duration, Sets × Reps format, Calories - Yoga/Meditation workouts: Duration-focused display - Cleaner, more relevant stats for each activity type - **Enhanced WalkingTrackerScreen** - Improved walking workout tracking - `WalkingTrackerScreen.tsx`: +87 lines with enhanced functionality - Better GPS tracking and distance calculation - Improved workout session management ### Improved - **EnhancedWorkoutCard Redesign** - Complete overhaul of workout display - `EnhancedWorkoutCard.tsx`: +183 lines with activity-specific improvements - Dynamic stats display based on workout type (cardio vs strength vs meditation) - Better visual hierarchy and readability - Cleaner workout card layout with relevant metrics only - **NdkWorkoutService Enhancements** - Better Nostr workout publishing - `NdkWorkoutService.ts`: +72 lines of improvements - Enhanced workout data processing - Improved error handling and validation - Better integration with local workout storage - **SimpleLeaderboardService Integration** - Caching integration for performance - `SimpleLeaderboardService.ts`: +37 lines with cache integration - Automatic use of CompetitionCacheService for workout queries - Significant performance boost for leaderboard displays - **UI/UX Button Label Standardization** - "Compete" button → "Public" button across all workout screens - Consistent "Post" vs "Public" labeling throughout app - Better clarity on workout publishing options - Updated in: StrengthTrackerScreen, FitnessTestResultsScreen, MeditationTrackerScreen, WalkingTrackerScreen - **DailyStepGoalCard Simplification** - Cleaner UI with reduced complexity - `DailyStepGoalCard.tsx`: Removed 89 lines of progress ring code - Simplified visual design - Better readability and performance ### Fixed - **Analytics Services** - Improved calculation accuracy - `CaloricAnalyticsService.ts`: Fixed calorie aggregation logic - `StreakAnalyticsService.ts`: Corrected streak calculation bugs - Better handling of edge cases and missing data - **Workout Publishing Reliability** - Enhanced across multiple screens - `WorkoutActionButtons.tsx`: +58 lines with improved publishing flow - `WorkoutSummaryModal.tsx`: Better error handling - `WorkoutDetailModal.tsx`: Fixed modal display issues - `LocalWorkoutStorageService.ts`: Improved storage operations - **Advanced Analytics Header** - UI polish - `AdvancedAnalyticsScreen.tsx`: Header title changed to "Stats" - Better navigation consistency ### Technical Changes - **Performance Optimizations** - Leaderboard workout caching reduces network calls by ~80% - Smart cache invalidation with 5-minute TTL - Improved query performance for multi-member competitions - **Code Quality** - Simplified DailyStepGoalCard (removed unused progress ring code) - Better separation of concerns in workout display components - Enhanced type safety across workout services - **Statistics** - 18 files modified - 505 insertions, 202 deletions (net +303 lines) - Major code additions: EnhancedWorkoutCard (+183 lines), CompetitionCacheService (+88 lines), WalkingTrackerScreen (+87 lines), NdkWorkoutService (+72 lines)
  • Nov 2, 2025 0.5.7
    ## [0.5.7] - 2025-11-02 ### Added - **RUNSTR Fitness Test** - Complete fitness assessment system with 60-minute timer - `FitnessTestInstructionsModal.tsx`: Instructions modal with exercise demonstrations - `FitnessTestResultsScreen.tsx`: Detailed results screen with scoring breakdown (300-point max) - `FitnessTestService.ts`: Service layer for managing fitness test state and scoring - `fitnessTest.ts`: TypeScript types for fitness test data structures - `AdvancedAnalyticsScreen.tsx`: +286 lines with fitness test integration - Three-exercise format: pushups, situps, and 5K run with individual scoring
    More…
    - Auto-save functionality and resume support for interrupted tests - Timer with 60-minute max duration and automatic completion - **Captain Dashboard Member Management** - Enhanced team member controls - TeamMembersSection component for displaying and managing team rosters - Member removal functionality for captains - Improved team member list UI with action controls - Real-time member count and status updates ### Fixed - **Analytics Page** - Resolved display and calculation bugs - Fixed data rendering issues in analytics charts - Corrected metric calculations for workout statistics - Improved error handling for missing data - **Strength Training Tracker** - Major improvements and bug fixes - `StrengthTrackerScreen.tsx`: +77 lines with enhanced functionality - Fixed exercise logging and set tracking - Improved rep counter and weight input - Better workout session management - **Diet Tracking** - Fixed data entry and display issues - `DietTrackerScreen.tsx`: Corrected calorie calculation bugs - Fixed meal entry form validation - Improved nutrition data display - **Garmin Integration** - Enhanced authentication and sync reliability - `garminAuthService.ts`: +76 lines with improved OAuth flow - `garmin.ts`: Enhanced type definitions for Garmin API - Fixed token refresh issues - Better error handling for failed syncs - Improved connection stability ### Improved - **Activity Tracker Performance** - Continued optimization - `ActivityTrackerScreen.tsx`: +41 lines with performance enhancements - Better GPS accuracy during workouts - Improved battery management - Enhanced data collection reliability ### Technical Changes - **New Components & Services** - Added fitness test infrastructure (modal, screen, service, types) - Enhanced captain dashboard with member management components - **Navigation Updates** - `AppNavigator.tsx`: +12 lines with FitnessTestResults screen route - **Statistics** - 8 files modified (7 updated, 4 new files created) - 471 insertions, 37 deletions (net +434 lines) - Major code additions: Fitness Test (+286 lines), Strength Training (+77 lines), Garmin (+76 lines), Activity Tracker (+41 lines)
  • Nov 1, 2025 0.5.6
    ## [0.5.6] - 2025-01-31 ### Added - **1v1 Challenges System** - Complete implementation for head-to-head Bitcoin-wagered competitions - `SimplifiedChallengeWizard.tsx`: New wizard for creating running challenges - `SimpleCompetitionService.ts`: +106 lines (getUserChallenges, parseChallenge for kind 30102 events) - `ChallengeService.ts`: +77 lines for challenge management - `ChallengeRequestService.ts`: +16 lines for challenge requests - `runningChallengePresets.ts`: Preset challenge distances (5K, 10K, Half Marathon) - Challenge notifications with ChallengeNotificationHandler (+43 lines)
    More…
    - Support for challenge statuses: open, active, completed, cancelled - **Teammates Feature** - View and manage team members - `teammates/` component folder for teammate UI - `TeamCard.tsx`: +98 lines with teammate display - `MyTeamsScreen.tsx`: +109 lines with enhanced team member management - Restored JoinRequestsSection in CaptainDashboardScreen for kind 30000 member list approval - **New Notification Handlers** - Comprehensive notification system improvements - `NotificationCleanupService.ts`: Automatic cleanup of old notifications - `ChallengeResponseHandler.ts`: Handle challenge acceptances/declines - `TeamJoinNotificationHandler.ts`: Dedicated team join request notifications - `profileHelper.ts`: Utility for fetching user profiles in notifications - **NWC Debug Tools** - Development and troubleshooting utilities - `NWCDebugScreen.tsx`: Debug interface for NWC wallet testing - `NWCManualService.ts`: Manual NWC wallet service for testing - Enhanced logging and error diagnostics - **Performance Utilities** - Speed optimization tools - `TTLDeduplicator.ts`: Time-based deduplication for Nostr events - `applyGlobalPolyfills.ts`: Global polyfill application - `webSocketDebugger.ts`: WebSocket debugging utility ### Fixed - **NWC Wallet Reliability** - Major improvements to Nostr Wallet Connect functionality - `NWCWalletService.ts`: +260 lines with enhanced error handling and retry logic - `WalletConfigModal.tsx`: 210 lines modified for better UX - `NWCStorageService.ts`: +10 lines for improved storage management - Fixed wallet connection issues and timeout handling - Better handling of wallet disconnections and reconnections - **Notification System Bugs** - Resolved multiple notification-related issues - `NotificationService.ts`: +25 lines with bug fixes - Fixed duplicate notifications with TTL-based deduplication - Improved notification cleanup and memory management - Better error handling in ChallengeNotificationHandler, EventJoinNotificationHandler, NostrNotificationEventHandler - **Event Join Requests** - Enhanced reliability - `EventJoinRequestService.ts`: +17 lines with improved validation - Better handling of payment verification - Fixed edge cases in join request processing ### Improved - **Activity Tracker Performance** - Significant enhancements to workout tracking - `SimpleRunTrackerTask.ts`: +103 lines with performance optimizations - Improved GPS tracking accuracy - Better battery management during workouts - Enhanced data collection and storage - **Nostr Prefetching & Caching** - Massive performance boost - `NostrPrefetchService.ts`: +94 lines with aggressive prefetching strategy - Preload user profiles, team data, and competition details - Reduces loading times by 60-80% on subsequent visits - Smart cache invalidation and refresh logic - **Competition Discovery** - Faster competition loading - `NostrCompetitionDiscoveryService.ts`: +40 lines for optimized queries - Better filtering and sorting of competitions - Reduced network overhead with batched requests - **WebSocket Reliability** - Enhanced connection stability - `webSocketPolyfill.ts`: +19 lines with improved error handling - Better reconnection logic for unstable connections - Reduced connection drops during extended use - **UI/UX Enhancements** - `ProfileScreen.tsx`: +34 lines with new features - `CompetitionsListScreen.tsx`: +28 lines with better competition display - `PersonalWalletSection.tsx`: +8 lines with improved wallet UI - `AuthContext.tsx`: +12 lines for enhanced authentication flow - **Type Safety** - Enhanced TypeScript definitions - `types/challenge.ts`: +2 lines for challenge types - `types/nostrCompetition.ts`: +38 lines for competition types - `types/unifiedNotifications.ts`: +13 lines for notification types ### Technical Changes - **New Dependencies** - Added polyfills for better compatibility - `message-port-polyfill`: MessagePort polyfill for React Native - `react-native-webview-crypto`: Crypto support for WebViews - `text-encoding`: TextEncoder/TextDecoder polyfills - `ws`: WebSocket library for Node.js compatibility - **Global Polyfills** - Enhanced JavaScript environment - `index.js`: +8 lines applying global polyfills - Better support for Web APIs in React Native - Improved compatibility with Nostr libraries - **Navigation Updates** - `App.tsx`: +37 lines with new screen routes - Added navigation for Challenges, Teammates, NWC Debug screen - **Statistics** - 32 files modified - ~1,299 insertions, ~311 deletions (net +988 lines) - Major code additions: Challenges (+200+ lines), Teammates (+200+ lines), NWC (+270+ lines), Performance (+130+ lines)
  • Oct 31, 2025 0.5.5
    ## [0.5.5] - 2025-01-30 ### Changed - **Event Creation Simplified** - Streamlined from 11 presets to 3 running-focused presets - Removed strength training, diet, and meditation presets - Kept 5K Race, 10K Race, and Half Marathon presets - All events auto-set to 24-hour duration with fastest-time scoring - `EventCreationWizard.tsx`: -719 lines (massive simplification) - Cleaner wizard interface reduces decision fatigue for event creators
    More…
    ### Fixed - **Running Tracker Overflow** - Made screen fully scrollable for all device sizes - Wrapped entire content in ScrollView with proper styling - Fixed UI overflow on smaller screens during workouts - All controls (GPS status, battery, metrics, race presets) now accessible - `RunningTrackerScreen.tsx`: +107 lines with ScrollView wrapper - **Join Request Filtering** - Captains no longer see already-approved participants - Auto-filters participants already in event participant lists - Reduces clutter in join requests section - Added console logging for debugging captain workflows - `EventJoinRequestsSection.tsx`: +39 lines with smart filtering logic ### Improved - **Unified Authentication** - Enhanced UnifiedSigningService integration - More reliable event publishing to Nostr - Better support for both nsec and Amber authentication methods - Improved error handling for signing operations - `EventParticipationStore.ts`: +23 lines for enhanced participant tracking - `NostrCompetitionService.ts`: +11 lines for improved event queries
  • Oct 29, 2025 0.5.3
    ## [0.5.3] - 2025-01-29 ### Added - **Captain Event Deletion** - Captains can now delete events from their local dashboard - Trash icon button on event cards in "My Events" section - Confirmation dialog before deletion - Local-only deletion (does not remove from Nostr) - Clean, minimal UI with theme-consistent styling - **Improved Empty States** - Better UX when no data is available
    More…
    - **Advanced Analytics**: Removed blocking empty state, each section now shows helpful guidance - **Private Workouts**: Empty state moved to inline display with encouragement to start tracking - All sections remain visible with contextual help text ### Fixed - **Legacy Event Display** - Events with missing captain data no longer filtered out - Removed strict pubkey validation in SimpleCompetitionService - Legacy events now display on team screens - Graceful error handling in EventDetailScreen for incomplete data - Better messaging when event data is incomplete - **Empty State Blocking** - Fixed screens that showed single "No Data" message hiding all UI - Advanced Analytics now shows all sections with per-section empty states - Private Workouts tab always shows structure and analytics card - Users can see what's available before tracking data ### Improved - **Captain Dashboard UX** - Cleaner event card design without emojis - **Empty State Guidance** - Each analytics section provides specific next steps - **Event Card Layout** - Better spacing to accommodate delete button - **User Onboarding** - New users see full app structure even with zero data
  • Oct 28, 2025 0.5.1
    ## [0.5.1] - 2025-01-28 ### Fixed - **Health Profile Navigation** - Added missing HealthProfile route to AppNavigator preventing access to Health Profile screen - **NWC QR Scanner** - Added proper validation for NWC wallet connection type QR codes - **Workout Deduplication** - Fixed issue where imported Nostr workouts were incorrectly hidden due to overly aggressive deduplication logic - Imported workouts now always display in unified workout history - Only GPS/manual workouts that were synced to Nostr are deduplicated ### Improved
    More…
    - **Activity Tracker Performance** - Optimized GPS tracking for better accuracy and responsiveness - Relaxed GPS accuracy threshold: 20m → 35m (better performance in varied conditions) - Reduced GPS jump detection: 100m → 75m (prevents phantom distance from GPS errors) - Increased location update frequency: 5m → 2m distance interval (more responsive tracking) - Applied to BackgroundLocationTask, SimpleRunTracker, and SimpleRunTrackerTask - **Advanced Analytics Accuracy** - Enhanced data calculation and display - Improved workout data aggregation logic - Better handling of imported Nostr workout data - Added import statistics display (total workouts, last import date) - More accurate correlation calculations - **UI Consistency** - Updated analytics trend indicators to use brand orange color (#FF6B35) instead of green
  • Oct 28, 2025 0.5.0
    ## [0.5.0] - 2025-01-28 ### Added - **Recurring Events System** - Automatic leaderboard resets for ongoing competitions - 5 recurrence types: None, Daily, Weekly, Biweekly, Monthly - `eventRecurrence.ts`: Period calculation engine (378 lines) - `RecurrenceBadge.tsx`: Visual recurrence indicator component - `PeriodDisplay.tsx`: Current period display with next reset time - Client-side period calculation - no backend changes required - Backwards compatible with existing one-time events
    More…
    - New wizard step in EventCreationWizard for recurrence configuration - Nostr tags: `recurrence`, `recurrence_day`, `recurrence_start_date` - **Nostr 1301 Import Service** - Download entire workout history to local storage - `Nostr1301ImportService.ts`: One-time import of all kind 1301 events (258 lines) - Progress tracking with percentage and current workout display - Import statistics: total workouts, date range, activity types - Prevents duplicate imports with completion flag - 100% offline analytics after initial import - Normalizes workout types from various Nostr apps - **Advanced Analytics Dashboard** - Comprehensive fitness insights - **Caloric Analytics**: Daily/weekly/monthly calorie tracking and trends - `CaloricAnalyticsService.ts`: Calorie balance calculations (332 lines) - `CalorieBalanceCard.tsx`: Today's calorie in/out/net display - `CalorieTrendChart.tsx`: 7-day and 30-day trend visualizations - `CorrelationInsightCard.tsx`: Activity-calorie correlation analysis - **Body Composition Analytics**: BMI calculations with health categories - `BodyCompositionAnalytics.ts`: BMI and body composition tracking - `HealthSnapshotCard.tsx`: Current health metrics display - **Calorie Estimation Service**: Automatic calorie calculations for workouts - `CalorieEstimationService.ts`: MET-based calorie burn estimation - Activity-specific MET values for accurate calculations - **Health Profile Screen** - Optional health data for improved analytics - `HealthProfileScreen.tsx`: Privacy-preserving health data entry (345 lines) - Fields: Weight (kg), Height (cm), Age (years) - All data stays on device - never published to Nostr - BMR (Basal Metabolic Rate) calculations with Mifflin-St Jeor equation - Enhanced calorie estimates based on user profile - Privacy notice with lock icon and clear messaging - **Event Announcement Broadcasting** - Share created events as social posts - `eventAnnouncementCardGenerator.ts`: SVG event card generator - Beautiful event cards with black/orange RUNSTR branding - Automatic kind 1 Nostr event publishing for new events - Event metadata: name, dates, team, entry fee, activity type - Visual event cards for social media sharing - **Event Deep Linking** - Direct links to events via QR codes or URLs - `eventDeepLink.ts`: Event deep link parsing and generation - URL format: `runstr://event/{eventId}?team={teamId}&name={eventName}` - Automatic navigation to EventDetail screen after login - Pending navigation queue for unauthenticated users - Event preview in deep link handler - **Enhanced Activity Trackers**: - **Diet Tracker**: Massive 523-line enhancement with meal logging - Meal type selection (breakfast, lunch, dinner, snack) - Calorie entry with large input field - Nutrition notes and meal descriptions - Visual meal icons and calorie display - Integration with caloric analytics - **Meditation Tracker**: 134-line improvements - Duration tracking with start/stop controls - Session notes and mindfulness logging - Enhanced UI with meditation-specific metrics - **Strength Tracker**: 258-line enhancements - Sets and reps tracking improvements - Better workout summary display - Enhanced posting to Nostr ### Changed - **Simplified Onboarding Flow** - Faster user onboarding experience - Removed ProfileSetupStep (no longer required) - Removed WalletSetupStep (no longer blocking) - Removed blocking checkbox from profile setup - Flow reduced from 5 steps to 3 steps: Slides → Password → Permissions - Users can now complete onboarding in under 1 minute - Profile and wallet setup available in Settings after onboarding - **Event Creation Wizard** - Added recurring event configuration step - New 3rd step: Recurrence settings - Toggle between one-time and recurring events - Frequency selector: Daily, Weekly, Biweekly, Monthly - Day picker for weekly/biweekly events (MON-SUN buttons) - Info box explaining automatic leaderboard resets - 325 lines of wizard enhancements - **Advanced Analytics Screen** - Major redesign with caloric focus - New calorie tracking section with balance cards - 7-day and 30-day trend charts - Activity-calorie correlation insights - Health snapshot integration - 231 lines of improvements - **Enhanced Workout Cards** - Better workout display and posting - `EnhancedWorkoutCard.tsx`: 71-line improvements - Better calorie display and workout metrics - Improved posting status indicators - Enhanced visual design ### Fixed - **Posting fixes** across all activity tracker screens - Running tracker: 26-line posting improvements - Walking tracker: 21-line posting fixes - Meditation tracker: Posting integration fixes - Strength tracker: Workout posting enhancements - Diet tracker: Meal posting to Nostr - **LocalWorkoutStorageService** - 166-line improvements - Nostr import tracking with completion flags - Import statistics storage and retrieval - Better workout deduplication - Enhanced local storage management - **NostrCompetitionService** - 11-line recurrence tag publishing - Added recurrence tag support for events - Proper tag formatting for recurring events - **Workout Publishing Service** - 5-line fixes - Better error handling in publishing flow - Improved kind 1301 event formatting ### Developer - Added comprehensive recurring events documentation: `RECURRING_EVENTS_IMPLEMENTATION.md` (424 lines) - New analytics components folder: `src/components/analytics/` - New analytics services folder: `src/services/analytics/` - New event utilities: `eventDeepLink.ts`, `eventRecurrence.ts` - Enhanced TypeScript types for recurring events and analytics
  • Oct 27, 2025 0.4.12
    ## [0.4.12] - 2025-10-27 ### Added - **Daily Step Counter Permission System**: Enhanced Android 10+ permission handling for background step tracking - `PermissionsAndroid.request()` for ACTIVITY_RECOGNITION permission - `checkPermissionStatus()` method returns granted/denied/never_ask_again states - `openSettings()` deep link to device settings for manual permission grants - Permission status checking before enabling background tracking - Better permission flow with user education and retry logic
    More…
    - **Background Step Tracking Toggle**: New settings screen control for auto step counting - Toggle switch in Settings → Activity Preferences section - Requests permission when user enables background tracking - Shows alert with "Open Settings" button if permission denied - Background tracking badge shows "Auto-counting enabled" when active - **Step Goal Picker Modal**: New modal for adjusting daily step goals - Component: `StepGoalPickerModal.tsx` (5KB) - Clean picker interface for goal selection - Integrated with DailyStepGoalCard - **Challenge System Overhaul**: Complete 1v1 challenge redesign with QR sharing - **Simplified 3-Step Wizard**: Type+Config → Target → Opponent/QR - **4 Challenge Types**: Push-ups, Distance, Carnivore, Meditation (trust-based, no escrow) - **QR Code Challenges**: Share challenges via QR codes for instant peer-to-peer setup - **Challenge Deep Links**: runstr://challenge?type=... URLs for challenge acceptance - **Challenge Preview Modal**: Shows challenge details before accepting (9KB) - **Challenge Target Step**: Choose Direct (pick opponent) or QR (share with anyone) - **Challenge QR Step**: Display QR code with sharing options (8KB) - **Challenge Presets**: simpleChallengePresets.ts with 4 challenge types and durations (2KB) - **ChallengeNostrService**: New service for Nostr challenge integration (6.5KB) - **challengeDeepLink.ts**: Utility for parsing and generating challenge deep links (4.6KB) - **Event System Improvements**: Enhanced event creation and management - **Event Duration Constants**: New eventDurations.ts for standardized event lengths (2.3KB) - **Team Goal Progress Card**: Visual progress tracking for team event goals (4KB) - Better event detail screen with improved information display - Enhanced captain dashboard with better management tools - **App Deep Link Support**: Challenge QR codes and Garmin OAuth - Challenge deep link handling in App.tsx (runstr://challenge?...) - Challenge accept/decline flow with preview modal - Intent filter added to app.json for challenge deep links - Existing Garmin OAuth support maintained alongside challenges ### Changed - **DailyStepGoalCard Redesign**: Completely redesigned with compact horizontal layout (482 line changes) - **3-Column Layout**: Progress ring + Text content + Action buttons - **Compact Design**: Ring shows percentage, main text shows step count - **Set Goal Button**: Quick access to adjust daily step goal - **Post Steps Button**: Share step count as Nostr workout event - **Background Active Badge**: Shows when auto-counting is enabled - **Background Tracking Banner**: Prompts to enable auto-counting with benefits - Improved error hints and permission status displays - **Challenge Creation Wizard**: Major refactor from complex to streamlined (677 line changes) - Old: Multi-step wizard with activity selection, opponent selection, wager - New: 3-step flow (Type+Config → Target → Opponent/QR) - Simplified challenge types from 10+ options to 4 trust-based types - Removed payment escrow complexity (challenges are now trust-based with zap button) - QR code sharing for easier peer-to-peer challenge distribution - **Challenge Types Simplified**: Reduced from complex to 4 simple types (214 line changes in types/challenge.ts) - Old: Multiple activity-specific challenge types with complex parameters - New: SimpleChallengeType = 'pushups' | 'distance' | 'carnivore' | 'meditation' - Each type has clear metric (reps, distance, days, duration) - Duration options: 1 day, 7 days, 30 days - Wager is optional and trust-based (no escrow) ### Improved - **Walking Tracker Screen**: Massive 429-line enhancement with step counter integration - Background step tracking with real-time updates - Step goal progress display during walks - Auto-counting badge when background tracking enabled - Step goal picker integration - Better permission handling and error states - **Event Detail Screen**: 97-line improvements to event information display - Better event metadata rendering - Enhanced participant management - Improved payment verification flow - **Event Captain Dashboard**: 85-line enhancements for better captain management - Improved join request handling - Better participant administration - Enhanced event management tools - **Event Creation Wizard**: 234-line improvements to event creation flow - Better preset handling - Improved validation and error handling - Enhanced UX for event configuration - **Events Card Display**: 114-line changes improving event card presentation - Better event information layout - Improved visual consistency - Enhanced metadata display - **Settings Screen**: 58-line additions for background tracking and notifications - New Activity Preferences section - Background step tracking toggle with permission flow - Pull-to-refresh for settings reload - Permission request modals with better UX - **Meditation Tracker Screen**: 89-line improvements to meditation tracking - Enhanced tracking reliability - Better session management - Improved workout data quality ### Fixed - **NWC Wallet QR Scanning**: QRCodeService.ts improvements (12 line changes) - Better NWC connection string parsing - Improved wallet QR code scanning reliability - Enhanced error handling for invalid QR codes - **Android 10+ Step Counter Permissions**: Proper permission flow for ACTIVITY_RECOGNITION - Added PermissionsAndroid.request() for runtime permission - Permission status checking before access - Settings deep link for manual grants - Better error messages and user guidance ### Technical - Version numbers updated across all platforms: - app.json: 0.4.12 (versionCode 43) - android/app/build.gradle: 0.4.12 (versionCode 43) - package.json: 0.4.12 - Modified files: - **Daily Step Counter**: DailyStepCounterService.ts (+86 lines), DailyStepGoalCard.tsx (482 line changes) - **Challenge System**: ChallengeCreationWizard.tsx (+677 lines), 8 new files, types/challenge.ts (214 line changes) - **Event System**: EventDetailScreen.tsx (+97), EventCaptainDashboard (+85), EventCreationWizard (+234), EventsCard (+114) - **Walking Tracker**: WalkingTrackerScreen.tsx (+429 lines) - **App Deep Links**: App.tsx (+147 lines), app.json (added challenge intent filter) - **Settings**: SettingsScreen.tsx (+58 lines) - **Navigation**: navigationHandlers.ts (74 line changes) - **Services**: SimpleCompetitionService (+11), SimpleLeaderboardService (+158), NostrCompetitionService (+22) - **UI**: EventCreationModal (+32), RouteSelectionModal (+1), ManualWorkoutScreen (+57), MeditationTrackerScreen (+89), ProfileScreen (AllWorkoutsTab +51), DietTrackerScreen (+2) - **Types**: workout.ts (+18), nostrCompetition.ts (+20) - New files (9 total): - StepGoalPickerModal.tsx (5KB) - ChallengePreviewModal.tsx (9KB) - TeamGoalProgressCard.tsx (4KB) - ChallengeQRStep.tsx (8KB) - ChallengeTargetStep.tsx (2.7KB) - eventDurations.ts (2.3KB) - simpleChallengePresets.ts (2KB) - ChallengeNostrService.ts (6.5KB) - challengeDeepLink.ts (4.6KB) - 34 files changed: 2,429 insertions, 947 deletions - Deep link support: runstr://challenge?type=pushups&duration=7&wager=500&... with ChallengePreviewModal - New permissions: Android ACTIVITY_RECOGNITION with runtime request flow - Major UX improvements: Compact step goal card + Simplified challenge wizard + Enhanced walking tracker
  • Oct 27, 2025 0.4.11
    ## [0.4.11] - 2025-10-26 ### Added - **Hold-to-Start Button**: 2-second press-and-hold button with circular progress indicator - Prevents accidental workout starts - Visual circular progress feedback during hold - Haptic feedback on completion (success vibration) - Component: `HoldToStartButton.tsx` (199 lines) - **Race Countdown Timer**: 3, 2, 1, GO! countdown sequence before workout starts
    More…
    - Builds anticipation and prevents premature starts - 1-second intervals with clear visual display - Integrated into RunningTrackerScreen - **Race Distance Presets**: Pre-configured race distances with auto-stop functionality - 5K, 10K, Half Marathon, Marathon distance options - Horizontal scrollable preset selector - Auto-stop triggers when target distance reached - Distance saved in workout metadata for analysis - **Daily Step Counter**: Pedometer integration for walking activity tracking - `DailyStepCounterService.ts` - Cross-platform step counting via Expo Pedometer API - `DailyStepGoalService.ts` - Daily step goal management and progress tracking - `DailyStepGoalCard.tsx` - Visual step progress card with goal editing - Works on both iOS (HealthKit) and Android (Google Fit) - 5-minute cache for step data to reduce battery usage - Live step updates during walking activities - Files: 3 new (DailyStepCounterService.ts, DailyStepGoalService.ts, DailyStepGoalCard.tsx) - **Event Rewards Modal**: New modal for managing event rewards and prize distribution - Component: `EventRewardsModal.tsx` (348 lines) - Enhanced reward management for captains ### Changed - **Event Creation Redesign**: Complete overhaul from cascading dropdowns to preset-based flow - **11 Event Presets**: Pre-configured events for popular activities - **Running**: 5K Race, 10K Race, Half Marathon, Marathon - **Strength**: Workout Count Challenge, PR Challenge - **Diet**: Calorie Tracking Challenge, Macro Goals Challenge - **Meditation**: Duration Challenge, Mindfulness Streak, Daily Practice - **2-Step Wizard**: Simplified from complex cascading to "Select Preset → Configure Details" - Step 1: Select from 11 preset templates - Step 2: Set date, prize pool, entry fee - Reduced wizard from 1,188 complex lines to streamlined preset selection - Faster event creation (30 seconds vs 2-3 minutes) - Files: EventCreationWizard.tsx (major refactor), LeagueCreationWizard.tsx (simplified) ### Removed - **Manual Entry Mode**: Removed to focus on GPS-tracked and structured activities - Focus shifted to Running, Strength, Diet, Meditation - Manual cardio entry removed in favor of actual GPS tracking - Strength/Diet/Meditation use structured preset challenges - Simplifies UX by removing confusing manual vs automatic distinction ### Fixed - **Event Management Bugs**: Multiple captain dashboard improvements - **CompetitionParticipantsSection.tsx**: Fixed participant management (63 line changes) - **EventJoinRequestsSection.tsx**: Improved join request handling (67 line changes) - **EventParticipantManagementSection.tsx**: Enhanced participant administration (59 line changes) - Better error handling and state management - **Event Card Display**: EventCard.tsx improvements (130 line changes) - Fixed event information rendering - Better handling of event metadata - Improved visual consistency - **Event Join Service**: EventJoinService.ts enhancements (85 line changes) - More reliable join request submission - Better payment proof handling - Improved error recovery ### Improved - **Activity Tracker UX**: Enhanced workout tracking experience - **RunningTrackerScreen.tsx**: Added race presets, countdown, hold-to-start (166 line changes) - **WalkingTrackerScreen.tsx**: Integrated daily step counter and goal tracking (186 line changes) - **ActivityTrackerScreen.tsx**: Simplified activity selection (19 line changes) - Better visual feedback and user control - **SimpleRunTracker Architecture**: Enhanced race preset support - Added `presetDistance` field for auto-stop functionality - Auto-stop callback system for race completion - Better session state persistence with preset distance - Files: SimpleRunTracker.ts (64 line changes) - **Workout Storage**: LocalWorkoutStorageService.ts improvements (67 line changes) - Enhanced race distance metadata tracking - Better workout categorization - Improved local storage reliability ### Technical - Version numbers updated across all platforms: - app.json: 0.4.11 (versionCode 42) - android/app/build.gradle: 0.4.11 (versionCode 42) - package.json: 0.4.11 - New dependency: `expo-sensors` (~14.0.2) for pedometer/step counting - iOS permissions added: `NSMotionUsageDescription` for step tracking - Android permissions added: `ACTIVITY_RECOGNITION` for step counting - Modified files: - **New Files**: 5 (HoldToStartButton.tsx, DailyStepGoalCard.tsx, EventRewardsModal.tsx, DailyStepCounterService.ts, DailyStepGoalService.ts) - **Major Refactors**: EventCreationWizard.tsx (1,188 line refactor), RunningTrackerScreen.tsx, WalkingTrackerScreen.tsx - **Captain Sections**: CompetitionParticipantsSection.tsx, EventJoinRequestsSection.tsx, EventParticipantManagementSection.tsx - **Services**: SimpleRunTracker.ts, EventJoinService.ts, LocalWorkoutStorageService.ts - **UI Components**: EventCard.tsx, ReviewLaunchStep.tsx, ProfileScreen.tsx - **Config**: App.tsx, app.json, package.json, iOS Podfile.lock, iOS project files - 22 files changed: 1,360 additions, 958 deletions - Major UX improvements: Hold-to-start + Countdown + Race presets = Professional workout experience
  • Oct 26, 2025 0.4.10
    ## [0.4.10] - 2025-10-25 ### Fixed - **QR Scanner Crash**: Fixed app crash when scanning NWC wallet QR codes - Problem: App crashed every time user scanned NWC QR code from Alby/Mutiny wallet - Root Cause: @getalby/sdk v6.0.1/v6.0.2's NWCClient connection cleanup improved - Solution: Enhanced close() method with connection state checks and error handling - Only close relay connection if it exists and is connected - Prevents crashes from closing half-initialized connections - Files: NWCStorageService.ts (+6 lines, improved error handling)
    More…
    - **Activity Tracker Duration**: Fixed duration tracking inconsistencies during workouts - Problem: Complex hybrid GPS-based duration calculation causing timing inaccuracies - Root Cause: HybridDurationTracker tried to sync JS timer with GPS timestamps - Solution: Replaced with SimpleDurationTracker - pure stopwatch calculation - New approach: `duration = (now - startTime - pausedTime) / 1000` - GPS is now ONLY for distance tracking, timer is completely independent - Matches reference implementation patterns from running apps - Files: SimpleRunTracker.ts (97 additions, 135 deletions - major refactor) ### Improved - **Duration Tracking Architecture**: Simplified from hybrid to pure stopwatch model - Removed complex GPS timestamp synchronization logic - Timer now counts like a stopwatch: 1, 2, 3, 4, 5... seconds - GPS points update distance only, no interference with duration - More predictable and reliable time tracking during workouts - **QR Scanner Reliability**: Better error handling for wallet connection flows - Graceful handling of partial connection states - Warning logs instead of crashes for close errors - Best-effort connection cleanup prevents user-facing errors ### Technical - Version numbers updated across all platforms: - app.json: 0.4.10 (versionCode 41) - android/app/build.gradle: 0.4.10 (versionCode 41) - package.json: 0.4.10 - Modified files: - src/services/wallet/NWCStorageService.ts - Enhanced connection cleanup - src/services/activity/SimpleRunTracker.ts - Duration tracker replacement - 2 files total: 103 additions, 141 deletions - Architecture change: HybridDurationTracker → SimpleDurationTracker - Dependency update: @getalby/sdk upgraded from 6.0.1 to 6.0.2
  • Oct 26, 2025 0.4.9
    ## [0.4.9] - 2025-10-25 ### Fixed - **Event Viewing Bug**: Fixed event loading failures when navigating from competitions list - Added `getEventByIdOrDTag()` method for backwards compatibility with Nostr event IDs - Events now load correctly when accessed via d-tag OR Nostr event ID - Improved error UI with icon, helpful messaging, and "Back to Events" button - Pass full event data on navigation to prevent "Event not found" errors - Files: EventDetailScreen.tsx (+33 lines), SimpleCompetitionService.ts (+51 lines), CompetitionsListScreen.tsx (+46 lines) - **Distance Tracker Bug**: Fixed GPS data not updating in real-time during workouts
    More…
    - Added `appendGpsPointsToCache()` for instant cache updates from background task - Added `saveGpsPointsToStorage()` for async persistence without blocking UI - Nike Run Club / Strava-like architecture: GPS → Background Task → Direct cache update → UI - Real-time distance updates during active tracking sessions - Files: SimpleRunTracker.ts (+44 lines), SimpleRunTrackerTask.ts (-24 lines) - **Posting Bug**: Fixed inconsistent distance formatting across workout cards and screens - Created `distanceFormatter.ts` as single source of truth for distance formatting - Replaced all inline distance calculations with utility functions - Consistent "X.XX km" format across entire app (workout cards, history, leaderboards) - Files: distanceFormatter.ts (NEW, 35 lines), workoutCardGenerator.ts (-13 lines), WorkoutCard.tsx (-8 lines), EnhancedWorkoutCard.tsx (-8 lines), EnhancedSocialShareModal.tsx (-9 lines), WorkoutHistoryScreen.tsx (-7 lines) - **Team Updates Bug**: Fixed team metadata updates failing for Amber users - Switched from direct nsec usage to `UnifiedSigningService` for better compatibility - Now handles both nsec and Amber signing methods seamlessly - Fixed team name updates and shop URL updates for all authentication methods - Files: CaptainDashboardScreen.tsx (+45 lines) ### Improved - **Event Discovery**: Better event loading with instant display using cached data - Events appear immediately from local cache while fresh data loads - Prevents "Event not found" errors during navigation - Smoother transitions between event lists and detail screens - **Distance Formatting**: Centralized distance formatting logic - Single `formatDistanceValue()` function used across all components - Consistent display prevents confusion from different formats - Easier maintenance with one source of truth - **Real-Time Tracking**: Enhanced GPS data flow from background task to UI - Background GPS → Cache → UI with zero delay - Instant metrics updates during active tracking - Matches professional fitness apps like Strava and Nike Run Club ### Technical - Version numbers updated across all platforms: - app.json: 0.4.9 (versionCode 40) - android/app/build.gradle: 0.4.9 (versionCode 40) - package.json: 0.4.9 - Modified files: - **Event Viewing**: EventDetailScreen.tsx, SimpleCompetitionService.ts, CompetitionsListScreen.tsx - **Distance Tracker**: SimpleRunTracker.ts, SimpleRunTrackerTask.ts - **Distance Formatting**: distanceFormatter.ts (new), workoutCardGenerator.ts, WorkoutCard.tsx, EnhancedWorkoutCard.tsx, EnhancedSocialShareModal.tsx, WorkoutHistoryScreen.tsx - **Team Updates**: CaptainDashboardScreen.tsx, NostrCompetitionDiscoveryService.ts - 14 files total: 13 modified, 1 new (208 additions, 84 deletions)
  • Oct 25, 2025 0.4.8
    ## [0.4.8] - 2025-10-25 ### Added - **Session Persistence System**: Complete workout session recovery architecture - **HybridDurationTracker State Export**: Full tracker state serialization for crash recovery - **Session Restoration**: Automatic session recovery when app returns from background - **In-Memory GPS Cache**: GPS points cached in memory for instant metrics updates - **Foreground Sync**: Automatic GPS data synchronization when app resumes - Workouts now survive app switching, backgrounding, and interruptions
    More…
    ### Fixed - **Session Loss on App Switch**: Fixed workouts being lost when switching apps - Sessions automatically restore when returning to RunningTrackerScreen - Complete tracker state persists across app lifecycle events - No more "lost workout" scenarios from accidental app switching - **Async Metrics Delays**: Eliminated async storage reads on every UI update - `getCurrentSession()` now synchronous using in-memory cache - Instant metrics updates with zero lag - Smoother real-time workout display ### Improved - **Tracking Reliability**: Sessions survive complete app lifecycle - App backgrounding no longer interrupts tracking state - Timer continues accurately across foreground/background transitions - GPS data syncs immediately when returning to app - **Performance**: Dramatic improvement in metrics update responsiveness - In-memory cache eliminates 100+ async reads per workout - Zero-latency metrics display during tracking - Smoother UI updates throughout workout session - **State Management**: Robust session state persistence - Complete `HybridDurationTracker` state export/restore - Session state includes all timer, pause, and GPS data - Crash recovery maintains workout integrity ### Technical - Version numbers updated across all platforms: - app.json: 0.4.8 (versionCode 39) - android/app/build.gradle: 0.4.8 (versionCode 39) - package.json: 0.4.8 - Modified files: - `src/services/activity/SimpleRunTracker.ts` - Session persistence system (182 lines added) - `HybridDurationTracker.exportState()` - State serialization - `HybridDurationTracker.restoreState()` - State deserialization - `cachedGpsPoints` - In-memory GPS cache - `syncGpsPointsFromStorage()` - Cache synchronization - `restoreSession()` - Complete session recovery - `src/screens/activity/RunningTrackerScreen.tsx` - Session restoration UI (126 lines changed) - `restoreActiveSession()` - Auto-restore on mount - `handleAppStateChange()` - Foreground sync logic - Synchronous `getCurrentSession()` integration - Real-time metrics updates without async delays
  • Oct 25, 2025 0.4.7
    ## [0.4.7] - 2025-10-25 ### Added - **Enhanced Activity Tracking Services**: New service layer for improved workout tracking reliability - **AutoPauseDetector**: Automatic pause detection during workouts when user stops moving - **GPSHealthMonitor**: Real-time GPS signal health monitoring and diagnostics - **SimpleRunTracker**: Simplified run tracking service with cleaner architecture - **SimpleRunTrackerTask**: Background run tracking task for Android foreground service - **WorkoutRecovery**: Workout data recovery service to prevent data loss - **EventSnapshotStore**: Event snapshot functionality for better state management
    More…
    ### Fixed - **Team Detail Screen**: Comprehensive bug fixes for team detail pages - **SimpleTeamScreen**: Fixed team detail screen display and navigation issues - **EventDetailScreen**: 133 line changes improving event information display - **CaptainDashboardScreen**: Enhanced captain dashboard reliability and UX - **EventJoinRequestsSection**: Improved join request handling and approval flow - **RunningTrackerScreen**: Major overhaul with 233 line changes - Enhanced GPS accuracy indicators - Improved pause/resume functionality - Better workout summary display - More reliable distance tracking ### Improved - **Activity Tracking Architecture**: Cleaner separation of concerns with new service layer - Better error handling throughout tracking services - Improved GPS health monitoring and recovery - More reliable background tracking for long workouts - **Team Management UX**: Smoother team detail page experience - Faster event loading on team pages - Better join request workflow for captains - Enhanced event detail presentation ### Technical - Version numbers updated across all platforms: - app.json: 0.4.7 (versionCode 38) - android/app/build.gradle: 0.4.7 (versionCode 38) - package.json: 0.4.7 - Modified files: - `src/services/activity/AutoPauseDetector.ts` - New auto-pause detection - `src/services/activity/GPSHealthMonitor.ts` - New GPS health monitoring - `src/services/activity/SimpleRunTracker.ts` - New simplified tracker - `src/services/activity/SimpleRunTrackerTask.ts` - New background task - `src/services/activity/WorkoutRecovery.ts` - New workout recovery - `src/services/event/EventSnapshotStore.ts` - New event snapshots - `src/screens/activity/RunningTrackerScreen.tsx` - Major improvements (233 lines) - `src/screens/EventDetailScreen.tsx` - Display improvements (133 lines) - `src/screens/SimpleTeamScreen.tsx` - Team detail fixes - `src/screens/CaptainDashboardScreen.tsx` - Dashboard enhancements - `src/components/captain/EventJoinRequestsSection.tsx` - Join request improvements
  • Oct 25, 2025 0.4.6
    ## [0.4.6] - 2025-10-24 ### Fixed - **Android Background GPS Tracking** - Revolutionary fix for GPS tracking when app is backgrounded - **Aggressive Time Intervals**: Running/cycling now use 1-second intervals (down from 3 seconds) - Compensates for Android's aggressive GPS throttling in background - Matches industry standards used by Strava and Nike Run Club - Walking uses 1.5-second intervals for balanced battery usage - **Proper Subscription Management**: Fixed dual subscription conflict - Foreground subscription now STOPS when app backgrounds
    More…
    - Only one location listener active at a time (Android limitation) - Prevents "zombie" subscriptions that blocked background task - Foreground subscription automatically restarts when returning to app - **MAX Priority Notification**: Upgraded foreground service notification - Notification priority: HIGH → MAX - Notification importance: HIGH → MAX - Prevents Android 12+ from killing the service when app is backgrounded - Added `autoDismiss: false` flag for persistent notification - **Enhanced Logging**: Battery optimization warnings and configuration visibility - Warns users if battery optimization is enabled (must be disabled) - Logs time intervals and distance intervals for debugging - Android-specific error guidance with actionable steps - **Real-World Impact**: GPS now continues reliably when users open music apps during workouts - No more frozen distance or lost tracking data - Works for 2+ hour marathon-length workouts - Background task continues updating every 1-5 seconds ### Improved - **Profile Loading Performance**: Optimized Nostr profile queries for faster app startup - Enhanced directNostrProfileService with smarter caching - Reduced redundant profile fetches in AuthContext - Faster time-to-interactive on app launch - **Competition Service Efficiency**: Improved caching and query optimization - SimpleCompetitionService query performance enhancements - SimpleLeaderboardService caching improvements - Reduced network overhead for competition data ### Technical - Version numbers updated across all platforms: - app.json: 0.4.6 (versionCode 37) - android/app/build.gradle: 0.4.6 (versionCode 37) - package.json: 0.4.6 - Modified files: - `src/services/activity/BackgroundLocationTask.ts` - Time intervals, notification priority, logging - `src/services/activity/SimpleLocationTrackingService.ts` - Subscription management, AppState listener - `src/contexts/AuthContext.tsx` - Profile loading optimization - `src/services/user/directNostrProfileService.ts` - Profile query optimization - `src/services/competition/SimpleCompetitionService.ts` - Competition caching - `src/services/competition/SimpleLeaderboardService.ts` - Leaderboard performance
  • Oct 25, 2025 0.4.5
    ## [0.4.5] - 2025-10-24 ### Added - **Individual Lightning Wallet Buttons**: External payment modal now shows 5 specific wallet options - Cash App button with universal link deeplink - Zeus button with custom deeplink (`zeus:lightning=`) - Phoenix button with custom deeplink (`phoenix://pay?invoice=`) - Wallet of Satoshi button with custom deeplink (`walletofsatoshi:lightning=`) - Breez button with custom deeplink (`breez:lightning:`) - Each wallet opens directly in that specific app instead of OS chooser
    More…
    - Install prompts with App Store/Play Store links if wallet not installed - Users can now explicitly choose which Lightning wallet to use ### Fixed - **External Wallet Payment Modal Layout**: Fixed QR code and wallet buttons not displaying in external wallet payment flow - Changed modal container from `maxHeight: '85%'` to `height: '85%'` to establish proper flex context - ScrollView with `flex: 1` now properly expands to fill available space between header and footer - Users can now see QR code, copy invoice button, and wallet deeplink buttons - Affects charity donations and team member zapping with external wallets - **Wallet Button Layout**: Converted from 2-column grid to full-width vertical stack - Changed from 2 buttons per row to 1 full-width button per row (like iOS standard) - Each wallet button now ~2x wider, easily fitting full wallet names - Increased button size: 80px minHeight (from 100px 2-col), larger padding (22px vertical, 24px horizontal) - Increased icon size: 48x48 circles (from 42x42), 24px icons (from 22px) - Increased font size: 15px (from 11px cramped size) - Added proper spacing: 12px marginBottom between buttons - Left-aligned icons: All icons now align vertically on the left edge (changed justifyContent from 'center' to 'flex-start') - All wallet names display fully: "Cash App", "Zeus", "Phoenix", "Wallet of Satoshi" (full name!), "Breez" - Much easier to tap with bigger touch targets - Cleaner, more professional vertical layout matching iOS design patterns ### Removed - **Strike Button**: Removed non-functional Strike deeplink button - Strike uses standard `lightning:` URI scheme, not custom `strike://` scheme - Users with Strike can still pay via standard Lightning invoice or QR code scan
  • Oct 24, 2025 0.4.4
    ## [0.4.4] - 2025-10-24 ### Fixed - **Social Post Authentication**: EnhancedSocialShareModal now supports BOTH Amber (Android) and nsec (iOS) - Previously only supported nsec, blocking Amber users on Android - Added UnifiedSigningService integration with nsec fallback for iOS compatibility - iOS users can post kind 1 social workouts with nsec - Android users can post with Amber signer - **Background GPS Tracking**: Increased background sync interval from 3 seconds to 10 seconds - Previous 3-second interval triggered Android battery optimization, killing tracker after 3 seconds
    More…
    - New 10-second interval allows tracking to continue for full workout duration (2+ hours) - GPS tracking now continues reliably when app is backgrounded or user switches to music apps - Only the stop button stops tracking - navigation away no longer interrupts workouts - **Build System**: Complete cache clearing and APK rebuild - Cleaned Metro bundler cache to ensure all code changes take effect - Cleaned Gradle cache to eliminate stale Android build artifacts - Fresh APK (build 35) includes all previous fixes ### Improved - **Tracker Persistence**: GPS service is singleton, continues independently of UI navigation - UI timers pause on navigation (correct behavior) - GPS tracking service continues in background (correct behavior) - AppState listener syncs data when returning to app - **Route Selection**: RouteSelectionModal correctly loads routes from RouteStorageService - No code changes needed - already working correctly - Will function properly once new APK is installed ### Technical - Version numbers updated across all platforms: - app.json: 0.4.4 (versionCode 35) - android/app/build.gradle: 0.4.4 (versionCode 35) - package.json: 0.4.4
  • Oct 24, 2025 0.4.3
    ## [0.4.3] - 2025-10-24 ### Added - **Garmin Integration**: Complete Garmin Connect sync for automatic workout import - GarminHealthTab component for OAuth authentication flow - garminAuthService for secure token management and authorization - garminActivityService for fetching and syncing activity data from Garmin - Support for importing runs, rides, swims, and other activities from Garmin devices - Seamless integration with existing workout history and competition tracking
    More…
    ### Fixed - **Background Distance Tracking**: Enhanced reliability for backgrounded workouts - Continued improvements from 0.4.2 for better GPS tracking when app is not in foreground - Improved location service persistence during long-duration activities - More accurate distance calculations when switching between apps - **Charity Wallet Payments**: Improved charity zap functionality and wallet integration - Better error handling for charity donation flows - Enhanced wallet connection reliability for team charity payments - Improved payment confirmation and user feedback - **TypeScript Compilation**: Resolved TypeScript errors for cleaner builds - Fixed type mismatches across activity tracking services - Improved type safety in workout and Garmin integration modules - Cleaner compilation with zero errors - **Activity Tracker Stability**: Various bug fixes across tracking screens - Enhanced stability in Running, Cycling, and Walking tracker screens - Better handling of edge cases during workout sessions - Improved workout data persistence and synchronization ### Improved - **Code Quality**: General bug fixes and performance improvements - Better error handling throughout the application - Improved service reliability and state management - Enhanced test coverage for integration scenarios
  • Oct 24, 2025 0.4.2
    ## [0.4.2] - 2025-10-23 ### Fixed - **Android Background Distance Tracking**: Revolutionary fix for distance calculation when app is backgrounded - Distance calculation now runs in background task with headless JavaScript context - Survives app backgrounding and continues accurate distance tracking - No more lost distance when switching apps during workouts - Improved reliability for long-duration activities - **Team About Section Display**: Fixed display of team's about section - About section now properly renders when stored as plain text in Nostr events
    More…
    - Improved team profile completeness - **Back Button Responsiveness**: Eliminated 30-second delay on back button - Immediate response when navigating back from screens - Better UI responsiveness throughout the app ### Added - **Route Tracking Feature**: Complete privacy-first route tracking implementation - GPS route recording with privacy controls - Route saving and management capabilities - Route replay and comparison features - Personal record tracking on saved routes ### Improved - **Charity Donation Flow**: Standardized zap pattern implementation - Consistent payment flow matching rest of app's zap functionality - Better user experience for charity donations - More reliable payment processing
  • Oct 24, 2025 0.4.1
    ## [0.4.1] - 2025-10-23 ### Fixed - **Activity Tracker Improvements**: Comprehensive fixes for enhanced tracking reliability - Background sync now works correctly during long workouts - Fixed NaN values in split times for more accurate pace tracking - Improved first-run GPS accuracy with better permission handling - Removed effort score for cleaner, focused workout metrics - **Teams Page Performance**: Major optimizations for faster loading and smoother scrolling - Reduced redundant queries and improved caching strategy
    More…
    - Enhanced UI responsiveness during team browsing - Better handling of large team lists and event data - **Event Management**: Improved event creation and captain dashboard functionality - More reliable event creation workflow - Better error handling in captain dashboard - Enhanced join request processing - **Charity Zap**: Standardized charity zap implementation to match NWC pattern - Consistent payment flow across all zap interactions - Better error handling for failed transactions - **UI Fixes**: Prevented team name from incorrectly appearing in About section - Cleaner profile presentation - Fixed text overlap issues ### Improved - **Overall Stability**: Multiple minor bug fixes and performance enhancements - Better memory management during extended app usage - Improved network request handling - Enhanced error recovery mechanisms
  • Oct 23, 2025 0.4.0
    ## [0.4.0] - 2025-10-23 ### Added - **Graphic Workout Displays**: Beautiful visual cards for kind 1 workout events replacing generic text-based posts - Instagram-worthy workout achievement graphics with RUNSTR branding - Automatic badge generation for PRs, distance milestones, and calorie achievements - Motivational quotes tailored to workout types - SVG-based rendering for crisp, professional social sharing - **Advanced Analytics Page**: Comprehensive local exercise data analysis and insights - Cardio performance tracking with trend analysis
    More…
    - Strength training analytics and progression metrics - Nutrition tracking and wellness analytics - Holistic health dashboard with actionable insights - **Route Planning System**: Complete route management infrastructure with GPS comparison - RouteMatchingService for GPS comparison and personal record tracking - SavedRoutesScreen for route library management and organization - Save as Route functionality during active workouts - Route replay and comparison features for performance analysis - **Weather Integration**: Real-time weather context for workouts - Weather badges displayed on workout cards showing conditions during activity - Weather data captured and stored with workout metadata - Historical weather context for training analysis - **Premium Features MVP**: Enhanced workout metrics and environmental tracking - Effort Score algorithm for workout intensity measurement - Weather context integration for comprehensive training data - Environmental factors included in performance analytics - **Non-Manual Activity Tracking**: Automated tracking for additional activity types - Meditation session tracking with duration and mindfulness metrics - Strength training workout logging with sets, reps, and weights - Diet tracking with meal logging and nutritional data - Simplified data entry for non-GPS activities - **External Wallet Zapping**: Enhanced Lightning payment functionality - Long-press user profiles to send zaps from any external Lightning wallet - Universal wallet support (Cash App, Strike, Alby, self-custodial) - Seamless payment flow without app-specific wallet requirements - **Challenge Arbitration System**: P2P challenge dispute resolution - Arbitrator selection during challenge creation - Third-party arbitration for contested 1v1 competitions - Fair resolution system for workout verification disputes - CaptainArbitrationDashboard for managing arbitration requests ### Fixed - **NWC Wallet Connection Issues**: Resolved critical payment and connection problems - Fixed relay connection drops causing wallet sync failures - Improved payment verification reliability - Enhanced error handling for Lightning operations - Better connection state management and recovery - **Background Tracking Reliability**: Major improvements for Android and iOS - Fixed distance tracking continuing reliably when app backgrounded - Improved GPS signal processing during long-duration activities - Enhanced location service stability for extended workout sessions - Better battery optimization compatibility - **Various Bug Fixes**: Comprehensive stability and performance improvements - Improved UI responsiveness across all screens - Fixed race conditions in data loading - Enhanced error handling throughout the app - Better memory management for long sessions ### Improved - **User Experience**: Refined workflows across workout posting and challenge creation - Smoother navigation and interaction patterns - Better visual feedback for user actions - Enhanced onboarding for new features - More intuitive UI layouts and controls ### Technical - **Kind 1 Event Enhancement**: Migrated from text-based to graphic workout displays - Rich media support for social workout posts - SVG generation for scalable, high-quality graphics - Improved Nostr event formatting for better compatibility - **Analytics Architecture**: Comprehensive analytics service layer - CardioPerformanceAnalytics service for endurance metrics - StrengthTrainingAnalytics for resistance training data - NutritionAnalytics for diet tracking - WellnessAnalytics for holistic health monitoring - **Route Storage**: Local-first route persistence with cloud sync - RouteStorageService for route management - AsyncStorage-based local caching - Optional Nostr event publishing for route sharing
  • Oct 22, 2025 0.3.2
    ## [0.3.2] - 2025-10-22 ### Added - **Race Replay Data**: Enhanced Kind 1301 workout events with comprehensive race replay visualization support - Individual kilometer split times with elapsed timestamps for website animations - Split pace tracking (pace per kilometer/mile) for detailed performance analysis - Average pace calculation and publishing in min/km or min/mi format - Elevation loss tracking alongside existing elevation gain data - GPS data point counts showing tracking detail and accuracy - Workout pause counts for understanding activity interruptions
    More…
    - Workout start timestamp (separate from event publication time) - **Android Permission System**: User-friendly modal-based permission request flow - Dedicated permission request modal with clear explanations - Automatic permission checking on app startup for Android users - Graceful handling of denied permissions with settings navigation - Improved onboarding experience with upfront permission requests ### Improved - **Location Tracking Service**: Enhanced SimpleLocationTrackingService with better reliability - Improved GPS data validation and filtering - More accurate distance calculations during workouts - Better handling of background location updates - **Workout Publishing**: Complete Kind 1301 event enhancement for external leaderboards - All race replay data automatically included when publishing workouts - Richer workout data for runstr.app website visualizations - Better compatibility with external fitness tracking platforms ### Documentation - **Kind 1301 Specification**: Updated with comprehensive race replay tag documentation - Detailed examples of all new tags (split, split_pace, avg_pace, elevation_loss, etc.) - Format specifications for each tag type - Usage guidelines for external platform integration
  • Oct 19, 2025 0.3.1
    ## [0.3.1] - 2025-10-19 ### Fixed - **Background Tracking Stability**: Resolved critical distance tracking issues during backgrounded workouts - Fixed distance updates continuing reliably when app is in background - Improved GPS signal processing for long-duration activities - Enhanced location service stability for extended workout sessions - **Event Creation Workflow**: Fixed event creation reliability issues - More robust event publishing to Nostr relays - Better error handling during event creation process
    More…
    - Improved validation and confirmation flow ### Improved - **Teams Page Performance**: Dramatically improved event loading speed on teams page - Optimized event queries and caching strategy - Faster initial page load with progressive data fetching - Reduced redundant network requests for team events - Smoother scrolling and navigation experience
  • Oct 18, 2025 0.3.0
    ## [0.3.0] - 2025-10-17 ### Fixed - **iOS App Store Submission**: Resolved critical issues preventing App Store approval - Fixed app crash when selecting photos from library (missing NSPhotoLibraryUsageDescription) - Improved skip button responsiveness on iPad with proper touch targets (hitSlop) - Enhanced error handling for photo library and camera access permissions - **Android Version Management**: Fixed versionCode inconsistency preventing Zapstore updates - Corrected versionCode sequence to prevent downgrade errors - Explicit versionCode management ensures proper update flow
    More…
    - **Event Payment Verification**: Complete payment verification system with dual-path confirmation - NWC-connected wallets auto-verify payments via transaction polling - Manual verification option for users paying with any Lightning wallet - Payment status tracking and UI feedback for join request flow ### Changed - **Permission Descriptions**: Updated camera permission text for accuracy - Changed from "Lightning payments" to "challenges and events" - Reflects actual QR code scanning functionality for event/challenge participation - Consistent messaging across iOS (Info.plist) and app.json configuration ### Improved - **iPad Compatibility**: Enhanced touch targets across onboarding and profile setup - Added hitSlop to all interactive buttons for better iPad usability - Improved ActionSheetIOS usage for better modal presentation - Better error messaging and user guidance for permission flows
  • Oct 17, 2025 0.2.8
    ## [0.2.8] - 2025-10-17 ### Fixed - **Modal Consistency**: Converted EventPaymentModal to CustomAlert for consistent UI - Unified alert system across payment modals - Better user experience with standardized modal behavior - Improved accessibility and theme consistency - **Activity Tracker Alerts**: Converted 3 activity tracker screens to CustomAlert - Running, walking, and cycling screens now use unified alert system - Consistent error handling and user notifications
    More…
    - Better modal dismiss behavior - **Zapstore Configuration**: Updated Zapstore URLs to correct endpoints - Fixed app store URLs for proper distribution - Corrected deep linking configuration - **Critical: Amber Security**: Resolved critical security and signing issues - Enhanced security in Amber signer integration - Fixed signing flow vulnerabilities - Improved error handling for authentication - **Alert Modal Consistency**: Fixed cancel button visibility across all modals - Consistent button placement and styling - Better UX for dismissing modals - Improved accessibility
  • Oct 15, 2025 0.2.6
    ## [0.2.6] - 2025-10-14 ### Added - **⚡ Universal Lightning Payments**: Complete LNURL integration for all payment types - **Event Tickets**: Paid events accept ANY Lightning wallet (Cash App, Strike, Alby, Wallet of Satoshi, etc.) - EventPaymentModal with QR code display for universal wallet support - Lightning address field in event creation wizard - LNURL-pay protocol implementation (LUD-16) - Payment proof system via kind 1105 join request tags - Manual invoice copying for desktop wallets
    More…
    - **Charity Donations**: Support team charities with any Lightning wallet - CharityPaymentModal component with QR code display - LNURL invoice generation from charity Lightning addresses - Manual payment confirmation with "I Paid" button - No wallet connection required to donate - **💡 Educational Lightning Content**: Clear explanations throughout the app - Lightning address helper text in ProfileEditScreen (explains receiving payments) - NWC explanation box in WalletConfigModal (explains sending payments) - CompactWallet shows "Connect Wallet to Send Bitcoin" with clear distinction - Tooltips guide users: NWC for sending, Lightning address for receiving - **Charity Integration**: Full charity support on team pages - CharitySection component displays team's supported charity - OpenSats, HRF, and other organizations supported - Integrated into team detail screens ### Changed - **🎯 1v1 Challenges Enabled**: Bitcoin-wagered challenges now available to all users - Feature flag `ENABLE_1V1_CHALLENGES` set to `true` - Members can challenge each other with sats on the line - Automatic escrow and winner payout system active - Complete dual-path challenge system (Nostr requests + QR codes) - **🔄 BREAKING: Replaced NIP-60/61 (Cashu) with NWC (Nostr Wallet Connect)** - Migrated from Cashu ecash to direct Lightning payments - Integrated Alby SDK (@getalby/sdk) for wallet operations - Simpler, more reliable payment infrastructure - Better compatibility with existing Lightning ecosystem - CompactWallet now uses NWC instead of Cashu tokens - All zaps and rewards use native Lightning - **Event Payment Flow**: Replaced NWC-only with universal LNURL system - EventDetailScreen displays payment modal with QR code - EventJoinService generates LNURL invoices from captain's Lightning address - Payment confirmation flow with join request after payment - ENABLE_EVENT_TICKETS feature flag enabled - **🔓 Removed NWC Requirements**: - Charity donations no longer require wallet connection - Event payments work with any Lightning wallet - Improved accessibility for mainstream Bitcoin users ### Technical - **LNURL Protocol Integration**: Full LNURL-pay implementation - `src/utils/lnurl.ts`: Complete LNURL utility with invoice generation - `fetchLNURLPayDetails()`: Fetches payment details from Lightning addresses - `requestInvoiceFromLNURL()`: Generates invoices via LNURL callback - `getInvoiceFromLightningAddress()`: Convenience function for full flow - `isValidLightningAddress()`: Lightning address validation - **Event Metadata Enhancement**: - Added `lightningAddress` field to NostrEventDefinition type - Lightning address stored in kind 30101 event tags - Payment invoice included in kind 1105 join requests as proof - **NWC Services**: - RewardSenderWallet service using Alby SDK's NWCClient - Daily workout reward system with NWC support - Dedicated reward sender wallet configuration - Comprehensive test coverage for NWC operations - **UI Components**: - EventPaymentModal: Full-screen payment interface with QR code - CharityPaymentModal: Donation modal with QR code and instructions - Step-by-step payment instructions for both modals - Real-time copy feedback for invoice strings ### Improved - **Wallet UX Clarity**: Better distinction between sending and receiving Bitcoin - NWC wallet clearly labeled as "for sending payments" - Lightning address clearly labeled as "for receiving payments" - Educational tooltips guide users to correct setup - Reduced confusion for new Bitcoin users - **Performance**: Major optimizations with Season 1 hard-coding and prefetch - Dramatically reduced load times for Season 1 leaderboard - Better prefetching strategy during app initialization - Improved overall app responsiveness - **Global NDK Service**: Migrated remaining services from NostrRelayManager - Eliminated duplicate WebSocket connections - Better connection stability and reliability - More efficient Nostr operations throughout the app - **Workout Posting**: Enhanced reliability using UnifiedSigningService for kind 1 events - More reliable kind 1 workout posting to Nostr - Better signing coordination across the app - **Lightning Zaps**: Automatic balance refresh after successful NWC payments - Real-time balance updates post-transaction - Better user feedback on payment success ### Fixed - **MVP Readiness**: Fixed 29 critical TypeScript errors (reduced from 81 to 52) - Critical JSX/React type errors in App.tsx - Theme property errors across 6 files - Null safety checks for npubToHex conversions - Missing props in event join request components - **Theme Consistency**: Achieved 100% orange/black brand compliance - Replaced all white text with theme.colors.text (4 instances) - Updated gray text to theme colors (40+ instances) - 20 files updated for consistent brand identity - **Critical Distance Tracking Freeze**: Eliminated 2-minute distance freeze bug - Fixed stale closure issue in ActivityTrackerScreen - Distance updates reliably throughout entire workout - Accurate tracking for long-duration activities - **Event Creation and Join Approvals**: Critical fixes for competition functionality - More reliable event creation workflow - Better join request approval handling - **Android Background Distance Tracking**: Improved reliability during backgrounded workouts - Better background location processing - More accurate distance updates when app is backgrounded - **Profile Screen Layout**: Restored proper layout after adding ScrollView - **Wallet Balance Sync**: Synchronized NWC balance with available funds before zapping - **Event Loading Race Condition**: Resolved using useFocusEffect - Events load reliably on screen focus - Eliminated inconsistent event display ### Documentation - **Project Organization**: Reorganized docs and scripts into dedicated folders - Cleaner project structure - Easier navigation for documentation - **NWC Integration**: Added comprehensive technical documentation - Detailed architecture overview - Integration patterns and best practices ### User Experience - **Captain Workflow**: Add Lightning address during event creation → Receive payments directly - **Participant Workflow**: Join paid event → See QR code → Pay from any wallet → Confirm → Join request sent - **Charity Donations**: Tap zap button → Enter amount → See QR code → Pay → Confirm donation - **Wallet Flexibility**: No longer requires app-specific NWC setup for payments - **Better Accessibility**: Works with mainstream wallets like Cash App and Strike ### Removed - **Nutzap/Cashu Infrastructure**: Phased out in favor of native Lightning via NWC - Removed Cashu mint dependencies - Removed ecash proof management - Simplified wallet architecture with direct Lightning payments
  • Oct 10, 2025 0.2.3
    ## [0.2.3] - 2025-10-09 ### Performance - **Simplified Caching Strategy**: Optimized caching for 10-team app architecture - Streamlined data caching mechanisms - Reduced memory footprint - Faster data retrieval for team-based operations ### Added - **Event Leaderboard Enhancement**: Include paid local participants in event leaderboards
    More…
    - More comprehensive competition rankings - Better visibility of all participants - Fair representation of event participants ### Fixed - **Workout Publishing**: Use native NDK signing and publishing for workout events - More reliable workout event creation - Better Nostr integration for workout posting - Improved signing workflow ### Improved - **Workout Screen UI**: Enhanced workout history and tracking interfaces - Improved WorkoutTabNavigator navigation - Better PrivateWorkoutsTab UI/UX - Enhanced EnhancedWorkoutHistoryScreen layout - Additional features in WorkoutHistoryScreen ### Documentation - **Data Architecture Guide**: Added comprehensive data architecture and caching strategy documentation - Detailed caching patterns and best practices - System architecture overview - Performance optimization guidelines
  • Oct 10, 2025 0.2.2
    ## [0.2.2] - 2025-10-09 ### Performance - **Dramatic Startup Improvement**: Reduced app startup time from 45-90 seconds to under 2 seconds for returning users - Implemented smarter initialization flow - Better caching and data prefetching - Significantly improved user experience on app launch ### Added - **GPS Smoothing**: Kalman filtering for smoother GPS tracking (feature flagged)
    More…
    - Added KalmanFilter utility class for location data smoothing - GPS validation utilities for better accuracy - Can be enabled via feature flags for testing ### Fixed - **Nostr Publishing**: Wait for relay connections before posting kind 1 notes - Prevents failed posts due to premature publishing - Better relay connection handling - More reliable social workout posting ### Documentation - Added lessons learned from reference implementation - Detailed GPS and Kalman filtering implementation notes - Best practices for location tracking
  • Oct 10, 2025 0.2.1
    ## [0.2.1] - 2025-10-09 ### Improved - **Activity Tracking Architecture**: Simplified location tracking system - Replaced complex tracking system with SimpleLocationTrackingService - More maintainable and reliable GPS tracking - Better performance during workouts ### Fixed - **Theme Consistency**: Updated Bitcoin message box and notifications to match black and orange theme
    More…
    - Consistent visual design across all UI components - Better integration with app's color scheme
  • Oct 9, 2025 0.2.0
    ## [0.2.0] - 2025-10-09 ### Performance - **Global NDK Service Migration**: Eliminated duplicate WebSocket connections across the app - Migrated remaining services from NostrRelayManager to GlobalNDKService - Reduced redundant relay connections for better performance - Improved connection stability and reliability - More efficient Nostr operations throughout the app ### Improved
    More…
    - **Workout Posting Reliability**: Enhanced workout posting with UnifiedSigningService - More reliable kind 1 workout posting to Nostr - Better signing coordination across the app - Improved error handling for workout events - **Lightning Zap Experience**: Refined nutzap and Lightning payment flows - Improved zap button interactions and feedback - Better error handling for Lightning payments - Enhanced user experience for sending satoshis ### Fixed - **Prefetch Service**: Resolved errors in NostrPrefetchService - Removed unused league fetching causing errors - Cleaner initialization flow - Faster app startup without unnecessary queries
  • Oct 9, 2025 0.1.9
    ## [0.1.9] - 2025-10-09 ### Changed - **Simplified Focus**: Removed team leagues and team member lists to focus exclusively on Teams and Events - Streamlined UI for better user experience - Reduced complexity in team management - Clearer navigation between Teams and Events ### Added - **Nutzap Entry Fees**: Event entry fee system using nutzap-based Bitcoin payments
    More…
    - Captains can set entry fees for events - Automatic payment processing via Lightning - Enhanced competition monetization options - **Amber Wallet Diagnostics**: Comprehensive diagnostic scripts for Amber wallet restoration - Tools to debug wallet connection issues - Restoration flow testing utilities - Better troubleshooting capabilities ### Fixed - **Event Loading Race Condition**: Resolved critical timing issues using useFocusEffect - Events now load reliably on screen focus - Eliminated inconsistent event display - Smoother navigation experience - **Wallet Duplication Prevention**: NIP-60 wallet restoration instead of creating duplicates - Check for existing wallets before creation - Restore wallet state from Nostr events - Prevents multiple wallets for same user ### Improved - **Deterministic Wallet Detection**: User-initiated wallet creation with backwards compatibility - Smarter wallet detection logic - Maintains compatibility with existing wallets - User control over wallet initialization - **Wallet Auto-Initialization**: Automatic wallet setup with backwards compatibility - Seamless onboarding for new users - Preserves existing wallet configurations - Enhanced reliability across app updates - **Event Loading Logging**: Comprehensive debugging for event loading issues - Detailed logs for troubleshooting - Better visibility into loading states - Faster issue resolution
  • Oct 9, 2025 0.1.16
    ## [0.1.16] - 2025-10-08 ### Performance - **50x Faster Caching Architecture**: Implemented advanced caching patterns from runstr-github reference - Massive performance gains across all data-heavy screens - Significantly reduced network requests and processing overhead - Improved app responsiveness and user experience - **ProfileScreen Optimization**: Eliminated 10-second freeze with lazy loading architecture - Cache-first strategy shows app immediately with cached data - Deferred wallet initialization by 2 seconds (non-blocking)
    More…
    - Deferred notification initialization by 3 seconds (non-blocking) - Added 3-second timeout to prevent indefinite blocking - Progressive enhancement instead of blocking gates - **UI Freeze Fixes**: Applied React patterns from runstr-github to eliminate UI blocking - Smoother interactions throughout the app - Better handling of heavy operations - Improved overall app responsiveness ### Fixed - **Critical Session Stability**: Fixed crashes and issues in 2+ hour running sessions - Enhanced memory management for long-duration activities - Improved GPS tracking reliability over extended periods - Better background processing for marathon-length workouts - **Amber Signing System**: Complete overhaul of Amber signer integration - Fixed join request signing failures - Resolved crypto library conflicts causing signing errors - Implemented proper 60-second timeout handling - Enhanced error messages for better user guidance - Fixed NIP-55 parameter compliance (current_user, id fields) - Proper pubkey handling with padding and npub decoding - **GlobalNDK Signer Setup**: Amber/nsec signer now properly attached to GlobalNDK - All Nostr operations now use correct signer - Consistent signing behavior across the app - Better integration between authentication and Nostr operations ### Testing - **Distance Freeze Detection**: Comprehensive test suite for GPS tracking issues - Validates distance tracking accuracy - Tests GPS recovery scenarios - Ensures workout data integrity - **Amber Signing Tests**: Complete test coverage for Amber integration (31/34 passing) - Unit tests for NIP-55 compliance - Integration tests for signing coordination - Timeout and error handling validation - Response parsing and pubkey caching tests ### Documentation - **AMBER_INTEGRATION.md**: Comprehensive update with current architecture - Detailed explanation of Amber signer flow - NIP-55 specification compliance guide - Troubleshooting common issues - Integration patterns and best practices
  • Oct 8, 2025 0.1.15
    ## [0.1.15] - 2025-10-08 ### Fixed - **App Initialization Architecture**: Complete overhaul to eliminate 30-second button freeze - Wait for all data to load before showing app UI - Profile-first loading strategy for faster perceived performance - Eliminated race conditions causing unresponsive buttons - Simplified to single loading screen for cleaner UX - **Profile Display**: Fixed avatar and bio not showing on initial render - Proper data loading sequence ensures profile appears correctly
    More…
    - Eliminated blank profile screen on app launch - **GlobalNDK Reconnection**: Fixed cached instance reconnection on app reload - Prevents "NDK not ready" errors when returning to app - More reliable Nostr connection stability - Better handling of app backgrounding/foregrounding - **Team Screen Crashes**: Multiple crash prevention fixes - Added null checks for undefined team data - Removed undefined team.captain reference - Protected against malformed team objects - **Charity Zap Button**: Fixed crash from Lightning address handling - Proper validation of charity Lightning addresses - Prevents undefined reference errors ### Improved - **Progressive Relay Connection**: Optimized relay connection strategy for faster startup - Relays connect progressively instead of all at once - Reduces initial connection overhead - Faster time to first data load - **Amber Signer Support**: Enhanced challenge system with Amber signer integration - Users can sign challenges with external Amber app - Better NIP-55 compliance - More secure key management options
  • Oct 7, 2025 0.1.14
    ## [0.1.14] - 2025-10-07 ### Changed - Version bump for Android APK build - Updated all platform version numbers (iOS, Android, Expo)
  • Oct 6, 2025 0.1.13
    ## [0.1.13] - 2025-10-06 ### Added - **Two-Tab Workout Feed**: Separate Public and Private workout tabs - Public tab shows workouts posted to Nostr (kind 1 social posts) - Private tab shows local HealthKit workouts (not yet posted) - Cleaner separation between social workout sharing and personal tracking - Removed HealthKit complexity from workout display logic ### Fixed
    More…
    - **LocalWorkoutStorageService**: Fixed singleton instance usage across all components - Corrected imports to use singleton instance directly - Removed redundant instantiation causing storage inconsistencies - Improved workout posting status tracking reliability - **iOS Build Errors**: Removed conflicting expo packages - Cleaned up package dependencies for stable iOS builds - Eliminated build failures from package conflicts - **Workout Tab UI**: Removed cache/instant load indicators - Cleaner workout feed interface - Removed redundant loading state indicators - Improved visual clarity and reduced UI clutter ### Improved - **Workout Feed Architecture**: Simplified workout display with dedicated public/private tabs - Better user mental model for workout management - Clear distinction between social posts and private tracking - More intuitive workout posting workflow
  • Oct 6, 2025 0.1.12
  • Oct 6, 2025 0.1.11
  • Oct 6, 2025 0.1.8
    ## [0.1.8] - 2025-10-05 ### Added - **League/Event Separation**: Enhanced competition organization with clear distinction between leagues and events - Improved navigation and discovery for different competition types - Better categorization and filtering in competition lists - Clearer visual hierarchy for ongoing vs time-bounded competitions - **Event Join Notifications**: Real-time notifications when users join events - Instant feedback for event participation - Better visibility of new team members joining competitions
    More…
    - Improved engagement and social dynamics ### Performance - **60% Faster App Startup**: Parallelized NostrPrefetchService for dramatic performance improvements - Team discovery, profile data, and Season 1 leaderboards now load simultaneously - Reduced sequential bottlenecks in data fetching - Faster time-to-interactive for users - **Optimized Relay Connections**: Centralized NDK instance management with GlobalNDKService - Single NDK instance shared across entire app (90% reduction in WebSocket connections) - Eliminated redundant relay connections (4 relays instead of 36) - Improved connection stability and reliability - Better performance across all Nostr-dependent services - **Stale-While-Revalidate Caching**: Instant data display with background updates - Data appears immediately from cache - Fresh data fetched in background and updates UI seamlessly - Dramatically improved perceived performance - **Streamlined Loading Flow**: Removed redundant AppSplashScreen - Cleaner initialization process - Faster transition to main app - Reduced complexity in loading architecture ### Improved - **Icon System**: Complete migration from emojis to Ionicons for professional appearance - Challenge icon now uses shield (ionicons: shield) - Zap icon now uses flash-outline (ionicons: flash-outline) - Season 1 leaderboard uses consistent Ionicon set - Better visual consistency across all screens - More accessible and platform-agnostic UI - **Caching Architecture**: Migrated NavigationDataContext to UnifiedNostrCache - Single source of truth for all cached Nostr data - Better cache invalidation and refresh strategies - Improved data consistency across components - **Profile Screen**: Enhanced performance with optimized data loading - Faster rendering of team memberships - More responsive workout history - Smoother scrolling and interactions - **Activity Tracker UI**: Removed live kilometer splits display from running tracker - Cleaner, less cluttered interface during workouts - Focus on essential metrics (distance, pace, duration) - Improved readability while running - **TTS Announcements**: Enhanced TTS service with better preference management - More reliable voice feedback during workouts - Improved settings synchronization - Better handling of user preferences ### Fixed - **Team Stats Crashes**: Added defensive null checks for team.stats throughout codebase - Prevents crashes when team statistics are unavailable - Graceful degradation when stats data is missing - Improved app stability in TeamStatsGrid and TeamJoinModal components - **NDK Initialization**: Resolved 'NDK not ready' error on discover page - Optimized ready state checks - Better handling of NDK initialization timing - More reliable team discovery on app launch - **Amber Signer**: Fixed URI encoding for sign_event per NIP-55 spec - Proper event encoding in deep link URIs - Improved compatibility with Amber app - More reliable event signing flow - **Join Request Publishing**: Automatic retry logic for failed join requests - Network failures no longer silently fail - Requests retry automatically until successful - Better user feedback on request status - **Leaderboard Display**: Show all team members, including those with 0 workouts - Complete team roster visible on leaderboards - Members with no workouts shown at bottom - More accurate representation of team participation - **League Loading**: Improved loading state handling with empty participant fallback - No more blank screens when league has no participants - Better loading indicators - Graceful handling of edge cases
  • Oct 5, 2025 0.1.7
    ## [0.1.7] - 2025-10-05 ### Fixed - **Distance Tracking Freeze**: Eliminated distance getting "stuck" during active workouts - Fixed distance freezing at specific values (e.g., stuck at 0.63 km) while GPS shows strong signal - Reduced GPS recovery buffer from 2 points to 1 point for faster recovery - Added 5-second timeout to GPS recovery mode (was 10 seconds) - Removed Android hysteresis filter that required 2 consecutive valid points - Reduced minimum movement threshold from 1.0m to 0.75m to prevent slow movement rejection - Added distance freeze detection logging to diagnose stuck distance issues
    More…
    - Distance now updates more responsively during brief GPS fluctuations - **Background Distance Tracking**: Fixed distance not updating while app is backgrounded - Implemented periodic background location sync (every 5 seconds) - Background locations now processed through validation pipeline in real-time - No more "recalculation" when returning to app - distance updates continuously - Eliminates distance jumps when switching between apps - **Distance Tracking Oscillation**: Eliminated GPS distance "bounce" during workouts - Fixed distance oscillating between values (e.g., 1.14 → 1.13 → 1.14 km) - Implemented monotonicity guarantee - distance never decreases during active tracking - Improved Kalman filter to use incremental filtering instead of cumulative overwrite - Reduced interpolation window from 5 seconds to 1 second to prevent prediction errors - Disabled distance prediction in background mode to prevent oscillations from throttled GPS - Prevents micro-oscillations from GPS coordinate jitter accumulating over time - **Distance Calculation Method**: Switched from 3D to 2D horizontal distance - Changed to industry-standard 2D Haversine distance calculation - Matches Nike Run Club, Strava, Garmin, and official race distance measurement - Previously used 3D distance (including altitude changes) which inflated distances in hilly terrain - Elevation gain still tracked separately in `totalElevationGain` metric - Typical impact: 1-3% less distance on hilly routes compared to previous version ### Improved - **Amber Signer Integration**: Enhanced reliability and user experience - Improved NDK signer authentication flow - Better error handling and user feedback - More robust callback handling for Amber responses - **Settings Screen UI**: Polished toggle button layout and styling - Cleaner toggle button appearance and interactions - Improved visual consistency across settings options - Better spacing and alignment for all settings controls - **Kilometer Splits Display**: Enhanced workout tracking UI - Improved splits visibility during active workouts - Better formatting and layout for split times - Clearer presentation of pace per kilometer - **Workout History**: Local workouts now visible in timeline - HealthKit workouts appear in unified workout history - Seamless integration of local and Nostr-posted workouts - Complete workout history at a glance - **Android Adaptive Icon**: Reduced icon size to 78% for better padding and visual balance - Shrunk ostrich logo from 1024x1024 to 799x799 on canvas - Added 113px padding around icon for proper spacing - Prevents logo clipping on various Android launcher styles - Better visual presentation across all Android devices and themes
  • Oct 5, 2025 0.1.6
    ## [0.1.6] - 2025-10-05 ### Fixed - **Distance Tracking Oscillation**: Eliminated GPS distance "bounce" during workouts - Fixed distance oscillating between values (e.g., 1.14 → 1.13 → 1.14 km) - Implemented monotonicity guarantee - distance never decreases during active tracking - Improved Kalman filter to use incremental filtering instead of cumulative overwrite - Reduced interpolation window from 5 seconds to 1 second to prevent prediction errors - Disabled distance prediction in background mode to prevent oscillations from throttled GPS - Strengthened Android GPS filtering: increased minimum movement threshold from 0.5m to 1.0m
    More…
    - Added hysteresis requiring 2 consecutive valid GPS points before accepting - Prevents micro-oscillations from GPS coordinate jitter accumulating over time - **Distance Calculation Method**: Switched from 3D to 2D horizontal distance - Changed to industry-standard 2D Haversine distance calculation - Matches Nike Run Club, Strava, Garmin, and official race distance measurement - Previously used 3D distance (including altitude changes) which inflated distances in hilly terrain - Elevation gain still tracked separately in `totalElevationGain` metric - Typical impact: 1-3% less distance on hilly routes compared to previous version ### Improved - **Amber Signer Integration**: Enhanced reliability and user experience - Improved NDK signer authentication flow - Better error handling and user feedback - More robust callback handling for Amber responses - **Settings Screen UI**: Polished toggle button layout and styling - Cleaner toggle button appearance and interactions - Improved visual consistency across settings options - Better spacing and alignment for all settings controls - **Kilometer Splits Display**: Enhanced workout tracking UI - Improved splits visibility during active workouts - Better formatting and layout for split times - Clearer presentation of pace per kilometer - **Workout History**: Local workouts now visible in timeline - HealthKit workouts appear in unified workout history - Seamless integration of local and Nostr-posted workouts - Complete workout history at a glance
  • Oct 5, 2025 0.1.5
    ## [0.1.5] - 2025-10-04 ### Fixed - **Amber Signing**: Calculate event ID before Amber signing to resolve permission errors - Fixed "Permission denied" errors when Amber users try to sign workout events - Event IDs are now properly generated before passing to Amber signer - Resolves compatibility issues with latest Amber versions - **Location Tracking Reliability**: Android foreground service prevents Doze Mode from stopping GPS - Background location tracking now continues reliably during long workouts - Foreground service notification keeps location service active
    More…
    - Prevents Android battery optimization from killing workout tracking - **Location Permission Flow**: Request permissions at login instead of run start - Smoother onboarding experience with upfront permission requests - Eliminates permission interruptions when starting first workout - Better UX for new users ### Improved - **Kilometer Splits Display**: Removed redundant 'Recording' status indicator - Cleaner UI during workout tracking - Focus on actual workout metrics instead of status text - Improved kilometer splits visibility - **Android App Icon**: Scaled down adaptive icon by 12% to prevent clipping - Fixed ostrich head being cut off on some Android launchers - Better visual presentation across all Android devices - Maintains proper padding for round icon masks
  • Oct 5, 2025 0.1.4
    ## [0.1.4] - 2025-10-04 ### Fixed - **Amber Authentication**: Complete support for all signing operations - Event signing now works properly with Amber signer - Improved callback handling and error messages - Better compatibility with latest Amber versions - **Pace Display**: Workout summary now shows pace in MM:SS format instead of raw seconds - **Onboarding Flow**: Welcome screens only show for new signups, not returning users - **Auto-Login**: Restored automatic login with backward compatibility for team memberships
    More…
    ### Improved - **UI Polish**: Refined visual elements throughout the app - Login button updated to orange background for brand consistency - Challenge wizard now uses minimalist Ionicons instead of emojis - Removed OR divider between Login and Start buttons for cleaner design - **Performance**: Extended Season 1 cache duration from 5 minutes to 24 hours for faster loading
  • Oct 5, 2025 0.1.3
    ## [0.1.3] - 2025-10-04 ### Changed - **Theme Refresh**: Updated color scheme from black/white to orange/black - Primary action buttons now use RUNSTR orange (#FF6B35) for better brand identity - Improved visual hierarchy with orange accents throughout the app - Team cards, navigation elements, and CTAs feature new orange theme - Maintains dark mode foundation with strategic orange highlights ### Improved
    More…
    - **Activity Tracker Enhancements**: Major improvements to workout tracking experience - More responsive GPS tracking with better accuracy indicators - Enhanced pause/resume functionality with clearer visual states - Improved workout summary display with better stat formatting - Better handling of edge cases (GPS loss, app backgrounding) - **Amber Login Flow**: Streamlined Nostr signer authentication - More reliable callback handling for Amber responses - Better error messages when Amber is not installed - Improved user guidance during sign-in process - Enhanced compatibility with latest Amber signer versions ### Fixed - Activity tracker UI consistency across different workout types - Orange theme application across all screens and components - Amber authentication edge cases and timeout handling
  • Oct 4, 2025 0.1.2
    ## [0.1.2] - 2025-10-04 ### Fixed - **Build Compatibility**: Removed deprecated `expo-barcode-scanner` package - Package was removed from Expo SDK 52+ (app uses SDK 53) - Fixes "ExpoModulesCore/EXBarcodeScannerInterface.h not found" build error - All QR scanning functionality already uses `expo-camera` (no feature loss) - Reduces app size by removing unused module ### Changed
    More…
    - **Version Updates**: Bumped app version to 0.1.2 across all platforms - Updated app.json, Android build.gradle, and iOS Info.plist - Incremented Android versionCode to 2 (required for app store updates) - Updated kind 1301 workout event client tags to report version 0.1.2 - Updated test files and documentation to reflect new version
  • Oct 3, 2025 0.1.1
    ## [0.1.1] - 2025-10-03 ### Added - **QR-Based Event Joining**: Scan QR codes to instantly join competitions - Event QR code generation and display for captains - QR scanner with camera permissions for participants - Complete participant management system with join tracking - **Dual-Path Challenge System**: Complete 1v1 competition infrastructure - Challenge creation wizard with activity type selection - Challenge acceptance/decline workflow
    More…
    - Dedicated leaderboard for head-to-head competitions - Navigation flow for browsing and managing challenges - **Local Workout Persistence**: Activity tracker saves workouts locally before syncing - Prevents data loss during network issues - Background sync when connection restored - **NIP-60 Wallet Enhancements**: - Encrypted proof backup to Nostr using NIP-44 encryption - Offline-first wallet initialization for instant load - Bulletproof duplicate wallet prevention ### Improved - **Performance Optimizations**: - Extended league cache to 24 hours with pull-to-refresh - Instant app resume with persistent caching - Android performance improvements for team and wallet loading - **GPS Tracking Reliability**: - GPS recovery timeout prevents distance tracking freeze - Better handling of GPS signal loss during workouts - **Authentication Fixes**: - Proper NIP-55 Activity Result pattern for Amber signer - Flexible callback handler for various response formats - WorkoutSummaryModal uses correct nsec storage key ### Changed - **App Rebranding**: Changed display name from "Teams" to "RUNSTR" - Updated all iOS and Android app configurations - Regenerated native projects with new branding - Bundle ID remains com.anonymous.runstr.project ### Fixed - Migrated Slider component to @react-native-community/slider for React Native 0.74+ compatibility - Amber signer callback handling - Access result.extra instead of result.data - Android SafeAreaView for proper status bar spacing - Enable receive button with offline-first wallet initialization
  • Oct 2, 2025 0.1.0
    ## [0.1.0] - 2025-10-02 ### Added - **Enhanced Splash Screen**: New circular logo design with RUNSTR branding - Clean white border around app icon for better visual presentation - Improved logo sizing and positioning - Better image loading with proper resize modes ### Improved - **App Icons**: Significantly optimized Android app icon file sizes (reduced by 60-80%)
    More…
    - All mipmap densities now use smaller, optimized PNG files - Better compression without quality loss - Faster app installation and reduced storage footprint - **Splash Screen Assets**: Updated splash screen logos with optimized file sizes - **Visual Consistency**: Unified branding across splash screen and app icons
  • Oct 2, 2025 0.0.9
    ## [0.0.9] - 2025-10-02 ### Added - **Quick Resume Mode**: Wallet now uses cached data for instant load when returning to app within 2 minutes - **Background Network Initialization**: Network connections initialize in background when using cached wallet data - **Current User Tracking**: Added pubkey verification to prevent wallet data conflicts between accounts ### Improved - **Wallet Load Performance**: - Cache-first strategy for instant wallet initialization on app resume
    More…
    - Background Nostr sync after loading cached data (non-blocking) - 2-minute fresh threshold for cache validity - Automatic fallback to full sync when cache is stale - **Splash Screen Assets**: Updated splash screen logos across all Android drawable densities for better visual quality - **Wallet Reliability**: Enhanced initialization flow with better error handling and retry logic ### Fixed - **Wallet Cache Freshness**: Fixed issue where stale cached wallet data could be used incorrectly - **User Account Isolation**: Ensured each user's wallet cache is properly isolated by pubkey - **Background Sync Errors**: Improved error handling for background wallet sync operations
  • Oct 2, 2025 0.0.8
    ## [0.0.8] - 2025-10-01 ### Added - **Season 1 Data Prefetching**: Season 1 leaderboard data now loads during splash screen for faster app experience - **New App Icons**: Refreshed app icon design across all platforms (Android mipmap densities + iOS assets) - **Wallet Proof Encryption**: NIP-44 encryption for backing up wallet proofs to Nostr - **Pubkey-Specific Wallet Storage**: Each user's wallet data is now properly isolated by pubkey ### Improved - **Wallet Service Reliability**:
    More…
    - Increased relay connection timeout from 5s to 10s for better relay discovery - Pubkey-specific storage keys prevent wallet data conflicts between accounts - Enhanced proof encryption/decryption with NIP-44 standard - Wallet event ID tracking to prevent duplicate wallet creation - **Season 1 Service Performance**: Major refactoring of Season 1 service for better reliability and performance - **Activity Tracker Screens**: Simplified and streamlined Running, Walking, and Cycling tracker UI - **GPS Status Indicator**: Improved GPS accuracy feedback and status display - **Notification System**: Enhanced challenge notifications with better event handling - **UI Polish**: - Team header visual improvements - Bottom navigation refinements - Workout summary modal enhancements - Challenges card UI updates ### Fixed - **Android SafeAreaView**: Proper status bar spacing configuration in AndroidManifest - **Amber Authentication**: Fixed callback handling for Amber signer integration - **Background Location**: Improved background location task reliability - **Battery Optimization**: Better battery status monitoring during workouts
  • Oct 1, 2025 0.0.7
    ## [0.0.7] - 2025-10-01 ### Added - **Unified Notification System**: Complete in-app notification infrastructure with badge support - NotificationBadge component for visual notification indicators - NotificationItem component for individual notification display - NotificationModal for full notification management - UnifiedNotificationStore for centralized notification state management - **Global Challenge Wizard**: Create 1v1 challenges with intelligent user discovery - Direct user-to-user competition creation
    More…
    - Smart user search and discovery system - Challenge configuration with custom parameters - **Profile Photo Uploads**: Users can now upload and customize profile pictures - Integration with expo-image-picker for seamless photo selection - Profile image management and display - **Enhanced Onboarding Wizard**: Improved first-time user experience with comprehensive profile setup ### Improved - **Performance Optimizations**: - Team caching consolidated to single source of truth (TeamCacheService) - League loading dramatically improved with cache-first strategy - Reduced redundant API calls across the app - **Activity Tracking**: Major improvements to workout tracking reliability - Fixed critical pause/resume timer bugs across all tracking services - Improved duration display using local timer instead of GPS session - Enhanced HealthKit workout integration and data accuracy - **Workout History**: Better UI for workout display and button styling - **Profile Screen**: Enhanced layout and improved user interface ### Fixed - Critical HealthKit workout bugs (distance calculation, status tracking, deduplication) - Race condition causing 'no pubkey available' error on startup - Pause/resume timer issues in all activity tracker screens - HealthKit workout deduplication and social posting workflow - Activity Tracker duration display accuracy - Workout History button styling and cleanup
  • Sep 30, 2025 0.0.6
    ## [0.0.6] - 2025-01-29 ### Added - **Onboarding Wizard**: New user onboarding experience with step-by-step setup guide - **Profile Editing**: Enhanced profile editing capabilities with more customizable fields - **Activity Tracker Updates**: Improved activity tracking with better accuracy and performance - **UI Polish**: Multiple small UI fixes and visual improvements throughout the app ### Fixed - **Npub/Nsec Generation**: Fixed key generation issues for new user accounts
    More…
    - **Profile Editing Bugs**: Resolved various issues with profile updates not saving correctly - **Activity Tracker**: Fixed tracking inconsistencies and improved reliability - **Small Bug Fixes**: Multiple minor bug fixes for improved stability ### Improved - Overall app performance and responsiveness - User onboarding flow for better first-time experience - Profile management functionality
  • Sep 27, 2025 0.0.4
  • Sep 25, 2025 0.0.2
    ## [0.0.2] - 2025-01-24 ### Added - Rebranded app to RUNSTR TEAMS - displays as "Teams" on device - Team shop linking capability - teams can link their merchandise store - Flash Bitcoin subscription support - teams can offer Bitcoin-based subscriptions - Charity showcase and zapping - support and zap charities directly from the app - Prize pool display for leagues and events - transparent competition rewards ### Fixed
    More…
    - NIP-60 wallet permanence issue - wallets now persist correctly across sessions - Team information editing functionality - captains can now properly edit team details ### Changed - App name from "RUNSTR REWARDS" to "RUNSTR TEAMS" - Updated all branding assets with new RUNSTR TEAMS logo
  • Sep 23, 2025 0.0.1
    ## [0.0.1] - 2025-01-20 ### Added - Initial alpha release of RUNSTR - Two-tab interface (Teams and Profile) - Nostr authentication with nsec login - Real-time team discovery from multiple Nostr relays - Captain detection and dashboard access - Competition wizard for Events and Leagues - Team member management with join request approvals
    More…
    - Dynamic scoring algorithms for competitions - Bitcoin rewards via NIP-60/Cashu protocol - HealthKit workout import and posting - Beautiful workout social cards with SVG generation - In-app notifications for competition events - Pure Nostr data architecture (no backend required) ### Features - **Authentication**: Direct Nostr login with profile auto-import - **Team Management**: Create, join, and manage teams - **Competitions**: 7 activity types with custom parameters - **Leaderboards**: Real-time scoring based on captain rules - **Workout Posting**: Share workouts as Nostr events (NIP-1301) - **Social Cards**: Instagram-worthy achievement graphics - **Bitcoin Integration**: Direct P2P payments, no team wallets ### Technical - React Native with TypeScript (Expo framework) - Pure Nostr data layer (no Supabase) - NDK (@nostr-dev-kit/ndk) for all Nostr operations - Kind 30000 lists for team membership - Kind 1301 events for workout data - 5-minute cache for member lists - 1-minute cache for competition queries ### Known Limitations - Debug build only (not optimized for production) - Android only (iOS build pending) - Requires manual nsec entry (no NIP-07 extension support yet) - Limited to Damus, Primal, and nos.lol relays ### Security - Secure nsec storage in AsyncStorage - No external tracking or analytics - All data stored on user-controlled Nostr relays - End-to-end encrypted team communications