A real-time road safety app that warns drivers when a horse rider is close and riders when a vehicle is approaching. It has spoken alerts, battery-smart background GPS and ride recording on iOS and Android.
View siteWhat we did
- Designed and built a two-way proximity alert system that warns drivers and horse riders when they come within 250 metres of each other
- Built spoken, hands-free warnings that play through a car's speakers like a sat-nav prompt, even with the phone locked
- Engineered native background location tracking for iOS and Android that adapts GPS use to the user's speed to save battery
- Built a live map of nearby members, in light and dark mode, with MapLibre and MapTiler
- Delivered ride recording with route, time and distance, plus a "Stables" for each rider's horses
- Integrated Apple App Store and Google Play subscriptions with a free tier
- Built the OAuth 2.0 API and member platform on ExpressionEngine
- Took the app from first commit to App Store and Google Play submission in 38 days
About the project
V2Maps is a UK road safety start-up with a simple idea. If drivers knew a horse was round the next bend, they would slow down and pass wide.
The need is real. In 2025 the British Horse Society recorded 2,810 road incidents involving horses: 59 horses were killed and 86 people were injured. In 78% of those incidents a driver passed too closely (BHS, Dead Slow campaign).
V2Maps came to Tinderhouse with the concept and needed a production app on both stores, fast. We built it as a hybrid app: one shared codebase for the interface, with native Swift and Kotlin modules for everything that has to keep working when the phone is in a pocket or a car cradle. That covers location, alerts, notifications and payments.
Starting from Tinderhouse's own app foundation, already proven in production, meant accounts, email verification and settings were in place in the first week. That left the team free to spend its time on the hard part: location.
The challenge
Core problems we needed to solve
- Warning in time to act: a driver needs to know about a rider round a blind bend before they can see them
- Alerting without distraction: a driver can't look at a phone, so the warning had to be heard, not read
- Running in the background: iOS and Android both work hard to stop apps using GPS when they're off screen
- Protecting the battery: a safety app that drains a phone by lunchtime gets switched off, and then it protects nobody
- Avoiding alert fatigue: two riders hacking out together, or two cars passing, mustn't set each other off
- Coping with the countryside: patchy signal on rural lanes can't be allowed to lose data
- Building a business: subscriptions on both stores from launch, without a third-party billing service
Our solution
Two-way alerts, matched to who's riding
Every member with broadcasting on sends their position to the V2Maps server every three seconds. The server replies with anyone nearby, and the app decides who needs a warning.
A driver within 250 metres of a rider who is out on a ride hears: "Horse rider nearby. Pass wide and slow." The rider hears: "Vehicle approaching." Two riders out together, or two drivers passing, don't alert each other.
Positions older than 30 seconds are ignored, and a repeat warning sounds at most every five seconds while someone stays close. Alerts stay rare enough that people keep listening.
Spoken warnings that reach the car's speakers
We set the alert up the way sat-nav apps do. It plays as a navigation voice prompt over Bluetooth, CarPlay or the phone's speaker. It lowers music rather than stopping it, and the ring/silent switch doesn't mute it. The phone vibrates too, and a lock-screen notification shows what the alert was for.
The voice clips are generated on the phone by its own speech engine and cached, so a warning plays instantly. Without that, live speech can take a few seconds to start.
Background GPS that respects the battery
Keeping GPS on constantly would drain a phone in hours, so our native location engine adapts to speed. A walking horse gets a fix about every 20 metres travelled, somewhere between every 2 and 15 seconds. Between fixes, GPS drops to low-power mode. At driving speeds the engine switches to continuous high-accuracy tracking.
The phone's motion coprocessor notices when someone starts moving faster and triggers a fresh fix straight away. That's Core Motion on iOS and Activity Recognition on Android. Fixes that are inaccurate (worse than 100 metres) or out of date are thrown away before they can cause a false alert.
Built to keep running
On Android, a foreground service keeps tracking alive. It restarts if the system kills the app and resumes after the phone reboots. On iOS, significant-change monitoring relaunches the app in the background once the phone has moved about 500 metres.
Positions are queued in an on-device SQLite database and sent in batches, with automatic retries that back off when the signal drops. A dead spot on a rural lane doesn't lose data.
A permissions check screen walks members through every setting the app needs: location "Always", motion, notifications and, on Android, battery optimisation. Each comes with a plain-English reason and a button straight to the right setting.
A live map of who's around
The map is built with MapLibre GL and MapTiler's Outdoor style. It shows nearby members as anonymous markers, each with a one-minute trail showing their direction of travel. It follows the user, offers north-up and compass modes, and switches to a dark map at night.
Tapping a marker shows how far away that member is and when they were last seen. No names or profiles are shown.
Ride recording and the stables
Riders tap Record to start a hack. The app shows time and distance live, in miles or kilometres, and saves the route to their ride history. Each rider keeps a "Stables" of their horses and picks which one they're riding.
Subscriptions without a middleman
New riders get four free recorded rides. After that, V2Maps Premium, monthly or yearly, unlocks unlimited ride recording. We built purchases directly on StoreKit and Google Play Billing, with no third-party subscription service taking a cut. The app supports restoring purchases and has a subscription page showing the plan, renewal date and store.
The free-ride limit is a server setting, so V2Maps can change its offer without an app update.
Tested on the road before it reached a road
You can't ride a horse past a car for every build. So we built a test harness that replays recorded GPX routes through the real location engine on both platforms. We added an on-device diagnostic log that the client's testers could share straight from the iPhone Files app.
Before submission, the whole app was put through a code and security review across the web layer, iOS and Android. The critical and high-priority findings were fixed before release.
Trust & privacy
A road safety app asks for a lot of trust: it needs a member's location all the time. We designed for that from the start:
- Broadcasting can be switched off at any time in Settings, and the app says plainly what that means: nearby members won't be warned you're there, and you won't be warned about them
- Other members appear on the map without names or profiles
- Broadcast positions are kept on the server for up to ten minutes, just long enough to work out who's nearby
- Recorded rides are kept until the member deletes them, and members can request deletion of their whole account, horses and rides from inside the app
- Every permission request explains in plain English why it's needed
- Data is held on servers in London, and error reporting is EU-hosted
The results
- 38 days from first commit to store submission, on time and on budget, with beta builds in the client's hands in days
- One shared codebase for iOS and Android, with native code where it matters
- Spoken, two-way alerts that work with the phone locked, in a pocket or in a car cradle
- Tracking that only uses full-power GPS when the user's speed calls for it
- Subscriptions live on both stores from launch, with no third-party billing fees
- Standard, well-documented technology that V2Maps can keep building on
What the client says
Tinderhouse have been the attentive developer I needed to transform an idea into reality. Their pre-development communication gave me confidence in Tinderhouse's abilities and displayed willingness to listen and understand my vision. Their attention to detail, understanding of scope, reliable communication and continuous support from Nick and team resulted in an expertly built mobile application produced within the timeframe and budget promised. The development was completely stress free due to Nick's ability to articulate the stages of the build clearly with regular updates and professionalism throughout.
— Jake Holmes, Founder, V2Maps
Technical highlights
- Framework7 and Vite: one JavaScript/TypeScript codebase for the app interface on iOS and Android
- Native Swift (iOS) and Kotlin (Android) modules for location, alerts, purchases and notifications
- Core Location and Core Motion on iOS; fused location, Activity Recognition and a location foreground service on Android
- On-device speech synthesis with a navigation voice-prompt audio session for CarPlay and Bluetooth
- On-device SQLite queue with batched uploads and exponential back-off retries
- MapLibre GL JS with MapTiler Outdoor map styles, light and dark
- RESTful API on ExpressionEngine with OAuth 2.0 authentication and email one-time passcodes
- StoreKit and Google Play Billing Library 8 for subscriptions
- OneSignal push notifications
- Universal Links (iOS) and App Links (Android)
- Sentry and Firebase Crashlytics for error and crash reporting
- GPX route replay and on-device diagnostic logging for field testing
Building an app that depends on location?
Background location is one of the hardest things to get right on mobile. Operating systems restrict it, batteries punish it and users rightly question it. If you're planning a GPS, mapping, sports or safety app, we've solved these problems before.
Talk to us about sports app development, or get in touch to discuss your project.