Skip to content

Repository files navigation

LocReminder Logo

LocReminder

Reminds you at the right place

Sleep on the bus. Remember the errand. It goes off when you arrive.


Download APK directly from GitHub

Download LocReminder    Coming to F-Droid



F-Droid status



How to use



Android Flutter Kotlin OpenStreetMap
VirusTotal scan result FOSS No ads, no tracking MIT licensed



📱 Download

Latest version v1.9.5, see what changed
Works on Android 6.0 or newer
Size 53 MB (universal), or about 16-20 MB if you pick a device-matched build (see below)
Price Free. No ads, no accounts, no in-app purchases.
F-Droid F-Droid status — this badge tracks the submission live, no need to keep checking back

What's new in v1.9.5. Place search finds far more than it used to. Typing now goes to Photon, an OpenStreetMap search engine built for search-as-you-type — it matches part of a word, forgives a misspelling, and puts places near you above better-known ones elsewhere with the same name. Nominatim still turns a dropped pin into an address and still answers when Photon finds nothing. Also fixes the search box needing two taps before the keyboard came up.

What v1.9.3 brought. The map now works without a connection: every tile you look at is kept on the phone for a month, the streets around an alarm are saved the moment you set it, and when there is no signal the saved map is drawn rather than a blank grid. You can also type coordinates straight into the search box, which needs no connection at all — see does it need the internet? for what does and what doesn't. It is also easier on the battery: nothing is checked at all on days none of your alarms are set for, and the checking interval is now worked out from how far and how fast you are travelling instead of fixed steps. See the changelog for the full history.

Installing an APK. Open the downloaded file and Android will ask for permission to install from your browser or file manager. That prompt is normal for any app installed outside the Play Store. Allow it once and you are done.

Smaller downloads. The GitHub button at the top of the page downloads the universal APK (53 MB), which works on any Android device. The GitHub Release page also has architecture-specific builds, about 16-20 MB each. If you want a smaller download, pick app-arm64-v8a-release.apk (right for almost all phones made after 2015). F-Droid users get the right-sized APK automatically, no choice needed.

Prefer auto-updates? LocReminder is also on Uptodown. Install it through their app store client (or just the APK from the page) and you will not have to come back here for every new version, the same convenience F-Droid will offer once it lands.

⚠️ Already have an older LocReminder from GitHub, from before v1.6.6? Please uninstall it first. Those builds went out signed with the wrong key by mistake, and Android will not replace one with the other. Your saved alarms will be lost in the swap. Sorry about that. It only affects this one upgrade.




📖 How to use it

1

Search for where you are going
Type a place name, paste coordinates, or drag the map under the pin. No account needed.

2

Choose how early to be woken
Anywhere from 100 m to 3 km out. A bigger radius gives you more time to gather your things.

3

Put your phone away and rest
A quiet notification shows how far you have left. When you arrive, the alarm rings.

⚡ Do this before your first real journey

Open Menu → Alarm reliability and tap Run alarm test. It rings the alarm after 15 seconds, so you can lock your phone and check that it gets through.

Much better to find out at home than on a train.




🛡️ Safe to install

🔬 Scanned by VirusTotal Every release gets checked by around 70 antivirus engines before it is published, so a build that looks like malware never reaches you. See every scan, with checksums
✍️ Signed and verifiable Each release carries LocReminder's own signature, and its SHA-256 checksum is published so you can confirm your download is the exact file that was scanned.
👀 Open source, all of it Every line is public and MIT licensed. Nothing is hidden, and you can build the app yourself from the same source.
🚫 No tracking, no accounts, no server No analytics, no ads, no sign up. There is nowhere for your locations to go, so they never leave your phone.
🧩 No Google Play Services Runs fine on de-Googled phones, Huawei and Honor devices, and LineageOS. Maps come from OpenStreetMap.



🚏 Why it exists

You know roughly where you are going, but not exactly when you will get there. Traffic, delays and unfamiliar routes make that impossible to predict, so a normal alarm is no use. Instead you spend the whole journey glancing out of the window, unable to properly rest or focus.

LocReminder fixes that. Drop a pin on your destination, choose how close you want to get, and put your phone away. When you arrive it rings a real alarm: a looping sound that plays even on silent, vibration, and a full screen alert over your lock screen. Just like a morning alarm, except that arriving somewhere is what sets it off.

😴 Long bus or train rides Actually sleep, instead of half watching for your stop.
🌏 An unfamiliar city You do not know what your stop looks like, so let the phone know for you.
📚 Commuters Read, work or listen to something without keeping one eye on the route.
🚗 Passengers on road trips Get woken before the turn off instead of 20 km past it.
📦 Pickups and errands A nudge when you are near the shop, the post office, or a friend's place.



✨ Features

A real alarm, not a notification Loops on the alarm audio stream, so it sounds even when your phone is on silent. It shows a full screen alert over your lock screen with a big Stop button.
🔊 Your own alarm sound Any system ringtone, or an audio file of your own.
🔍 Search by name Type "Kamalapur Railway Station" instead of hunting across the map for it.
📝 Give it a task Type what you're there to do, like "Buy medicine". Leave it blank and the place name is used instead.
🔁 Repeat it Set an alarm once, every day, or just on the days you pick. Good for a regular commute or a standing errand.
📍 As many alarms as you like Each with its own label and radius. Pause one without deleting it, and see live distance to each.
📶 Works with no signal The alarm runs on GPS alone and never needs a connection. Maps you have looked at are kept on the phone for a month, and the streets around a new alarm are saved the moment you set it, so the map still draws in a signal hole.
🔋 Easy on the battery Checks rarely when you are far away and more often as you get close, and not at all on days none of your alarms are set for, so a three hour journey does not flatten your phone.
🛡️ Reliability check Works out your phone's brand and shows the exact settings it needs, plus a test that proves the alarm gets through.
🌙 Light and dark themes Material 3 throughout, with map tiles tuned so dark mode is not a white rectangle at night.



📶 Does it need the internet?

The alarm does not. Not for a moment of it.

GPS is a receive-only radio. The satellites broadcast, your phone listens, and nothing is sent anywhere. LocReminder compares the position that comes back against the spot you saved, both on the phone. It rings in a tunnel, on aeroplane mode, on a phone with no SIM card in it, on the 2G edge of a village cell. There is no server in this app to be out of reach of.

Two things do need a connection, and only while you are using them:

What Why What happens without it
The map pictures Map tiles are images held on OpenStreetMap's servers. Nobody can send you a picture of a street your phone has never seen without a connection to send it over — this is true of Google Maps and every other map app, which is why they all have an offline-areas feature. Everywhere you have looked at is kept on the phone for a month and still draws. So is the area around each alarm, saved when you set it. Outside that, the map goes blank — but the alarm, the distance readout and the arrival check all carry on.
Searching by name "Kamalapur Railway Station" has to be looked up somewhere. Type the coordinates into the same box instead — 23.8103, 90.4125, or a geo: link somebody sent you — and the map goes straight there with no request at all. Or drag the pin, which shows its coordinates. Either way the alarm is set exactly the same.

So the bus journey works like this: set the alarm before you go, or at the stop, while you still have signal. Then put the phone away. Whether the signal dies after that makes no difference to whether it rings.




🛡️ Making sure it rings

Please read this once. It is the difference between an alarm that works and one that does not.

Android lets apps ask for permission to run in the background, but phone manufacturers overrule it. Xiaomi, Samsung, Oppo, Vivo, OnePlus and Huawei each add their own app killer, and no app can switch those off by itself. You have to allow it by hand, once.

Menu → Alarm reliability works out which phone you have and walks you through it. For reference:

Your phone What to allow
Xiaomi, Redmi, Poco Autostart, and Battery saver set to No restrictions
Samsung Battery, then Background usage limits, then Never sleeping apps
Oppo, Realme Allow Auto startup and Allow background running
Vivo, iQOO High background power consumption and Autostart
OnePlus Don't optimise, Auto launch, and turn off Advanced optimisation
Huawei, Honor App launch, set to Manage manually, all three switches on
Google, Motorola, Sony, Nokia, Nothing, Fairphone Nothing extra. Stock Android respects the standard settings.



👩‍💻 For developers

Everything below is about building and contributing to LocReminder.
If you just want to use the app, you are all set.


🔧 Under the hood

How the alarm survives a locked screen (click to expand)

The obvious approach, polling GPS from a Dart Timer, works in an emulator and fails on a real trip, because Android kills the app as soon as you lock the screen.

Android's own geofencing did not survive field testing either. An alarm was set 150 m away with a 100 m radius, then the phone walked in and waited 30 seconds. Nothing happened. It rang the instant the app was reopened, because Doze had held the geofence broadcast back until the app became active.

So geofencing was dropped entirely in favour of a foreground service that watches location itself. The alarm is native Kotlin, which means the Flutter engine can be completely dead and it still rings, and the app uses only platform APIs, so it needs no Google Play Services and works on de-Googled and HMS only devices.

                     ┌──────────────────┐
                     │   Flutter UI     │  search · pin · radius
                     │  (config only)   │  settings · reliability
                     └────────┬─────────┘
                              │  arms alarm
                              ▼
              ┌──────────────────────────────┐
              │  Foreground location watcher │
              │  platform LocationManager    │
              │  adaptive polling            │
              └──────────────┬───────────────┘
                             ▼
                    ARRIVAL DETECTED
                             │
                             ▼
              ┌──────────────────────────┐
              │  Native alarm service    │  ← no Flutter engine needed
              └──────────┬───────────────┘
                         │
          ┌──────────────┼──────────────┐
          ▼              ▼              ▼
    alarm-stream     vibration     full-screen UI
       audio                       over lock screen
Layer Role
Foreground watcher The whole detection mechanism. Holding a foreground service keeps the process out of the idle state that defers everything else. It ignores fixes too imprecise to confirm arrival, so a coarse cell tower fix cannot ring the alarm kilometres early.
Polling interval Derived rather than tabulated: a gap between fixes is safe as long as it cannot cover the distance to the far side of your destination circle at the speed you are travelling, so the interval is that time divided by three. Ten seconds on the final approach, a quarter of an hour two hundred kilometres out, and every step between arrived at continuously. On Android 12+ it also asks for the cheaper of the platform's location tiers whenever the destination is far enough that the expensive one buys nothing.
Days off On a day when every armed alarm is set for other days of the week, the watcher asks for no fixes at all. A weekday commute alarm used to hold the GPS open all weekend for something that could not ring until Monday.
Alarm service Looping USAGE_ALARM audio, vibration, wake lock, full screen activity. Stops itself after 10 minutes.
Watchdog An inexact allow-while-idle alarm. Restarts the watcher if a vendor power manager killed it, or if it is running but receiving no fixes, which is the state left behind when location is switched off at the OS level.
Boot receiver Restores alarms and the watcher after a restart, or after the app itself is updated.

Built with

┌─────────────────────────────────────────────────────────────┐
│  UI               Flutter 3 · Dart 3 · Material 3           │
│  Native engine    Kotlin (watcher, alarm, watchdog, boot)   │
├─────────────────────────────────────────────────────────────┤
│  Maps             OpenStreetMap via flutter_map, no key     │
│                   tiles kept on device for offline use      │
│  Search           Nominatim geocoding, no key               │
│  Location         Platform LocationManager, no Play Services│
├─────────────────────────────────────────────────────────────┤
│  Storage          SharedPreferences (device-local only)     │
│  Build            Gradle 9 · AGP 9 · R8 shrinking           │
│  CI/CD            GitHub Actions, signed and scanned        │
└─────────────────────────────────────────────────────────────┘



🚀 Building it yourself

Prerequisites

No Maps API key, no Google Cloud billing account, no signup. The map is OpenStreetMap.

git clone https://github.com/zaifears/locreminder.git
cd locreminder
flutter pub get
flutter run --release

--release is worth using even for testing, because background location behaves closest to real conditions in a release build.

App icons under android/app/src/main/res/mipmap-* are hand drawn and committed as they are. Do not run flutter_launcher_icons, as it would overwrite them.

Commands

Command Description
flutter pub get Install dependencies
flutter analyze Static analysis (CI treats warnings as failures)
flutter test Run unit tests
flutter build apk --release Build a release APK

Signing

For local builds, signing falls back to Android's debug key so that flutter build apk --release always produces something installable. To sign with your own key instead:

keytool -genkey -v -keystore locreminder-release.jks -keyalg RSA \
  -keysize 4096 -validity 10000 -alias locreminder
cp android/key.properties.example android/key.properties

Fill in your keystore path and passwords. key.properties is git ignored.

Published releases work differently. Tagged builds refuse to publish unless all four of RELEASE_KEYSTORE_BASE64, RELEASE_STORE_PASSWORD, RELEASE_KEY_ALIAS and RELEASE_KEY_PASSWORD are set as repository secrets, and CI reads the certificate back out of the finished APK to prove the debug key was not used. That check exists because the fallback is silent, and every release up to v1.6.5 shipped debug signed without anything complaining.




🤝 Contributing

Contributions are welcome. Fork, branch, commit, and open a pull request.

  1. Fork the project
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a pull request

📄 License

Source code MIT. Free to use, modify and distribute, commercially or otherwise.
Logo, app icon and the name "LocReminder" © Shahoriar Hossain, all rights reserved

Fork the code freely. Please use your own name and artwork when publishing a derivative.

Map data and search © OpenStreetMap contributors, under the Open Database License.




🚏 Never miss your stop again.



Download  ·  Report an issue  ·  Website  ·  Contact





Free Palestine



About

LocReminder is a location-based alarm for Android, which helps you wake up at the right place

Resources

Stars

16 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages