Inspiration

Long songs, lessons, and podcasts are hard to resume exactly where you stopped. I wanted a simple, offline player that remembers my pause point without distractions—useful for music practice, language study, and lectures.

What it does

Plays local audio with a clean, folder-based browser. Saves the exact pause point and resumes instantly, even after app restarts. Background playback with notification controls. Free plan keeps 2 saved tracks; Premium unlocks unlimited saves. In‑app review entry, upgrade flow via a hosted paywall, and gentle battery optimization prompts on Android.

How we built it

Flutter + GetX for fast, reactive UI. Audio: just_audio, audio_session, audio_service for background controls. Persistence: sqflite + path_provider to store saved tracks and positions. Permissions: permission_handler with scoped‑storage friendly access. Monetization: RevenueCat (purchases_flutter + purchases_ui_flutter) with a hosted paywall and entitlements (premium). Android native glue (Kotlin) via MethodChannels for audio focus and battery optimization prompts. Min SDK 24 (to support hosted paywalls) and Play test tracks for realistic purchase testing.

Challenges we ran into

Scoped storage and folder browsing differences across Android versions. Ensuring stable background playback/notifications without extra battery drain. Making the UI flip to Premium immediately after purchase (solved by adding a global CustomerInfo listener and a post‑paywall refresh). Play test track nuances: opt‑in links, license tester setup, and avoiding local debug installs for billing tests. In‑app review not guaranteed to show every time—added fallback store links. Catching a package-name mismatch for the store review link and fixing it.

Accomplishments that we're proud of

A focused, distraction‑free player that “just remembers your place.” Smooth background controls and quick resume UX. Clean paywall integration with clear free vs. premium behavior. Solid local persistence and simple limits that encourage upgrade without nagging.

What we learned

Always test subscriptions from Play tracks (not local builds) and verify RevenueCat keys per project. Wire a CustomerInfo update listener and force a refresh after paywall to make upgrades feel instant. Add preflight checks for Offerings so users never see a spinner without context. Keep permissions lean and handle battery optimization gracefully.

What's next for pausepoint

iOS support and App Store rollout. Multiple bookmarks per track and quick-jump lists. Optional cloud sync/backup and export/import of saved positions. A/B‑test copy and defaults using RevenueCat Offering metadata. Accessibility polish (TalkBack labels, large text), and smarter search across folders.

Built With

  • android
  • audio-service
  • audio-session
  • dart
  • filesystem-picker
  • flutter
  • flutter-local-notifications
  • getx
  • google-play-billing-(via-revenuecat)
  • in-app-review
  • just-audio
  • lottie
  • path-provider
  • permission-handler
  • purchases-flutter-&-purchases-ui-flutter-(revenuecat)
  • sqflite-(sqlite)
  • url-launcher
Share this project:

Updates

Submission history