Bull Horn GPS Alarm: one-tap SMS commands for an alarm
A Flutter app that works as a remote control for GPS vehicle and asset alarms. Each alarm is saved once with its phone number and password, and every command after that is one tap.
Our role: Client project for a GPS vehicle-alarm company, built by Simon Dziak, who made all 17 commits. The source lives in the App369 GitHub organization.
What Bull Horn GPS Alarm Needed to Solve
These alarms are controlled by text message. Each command is a code, such as *password*S# to arm the alarm, and every alarm has its own password. The README states the problem plainly: without the app, users must remember or keep a cheat sheet of passwords and commands for each alarm.
How We Built It
The app stores each alarm on the phone and shows large buttons for the common commands. A tap builds the exact command text and opens the phone's own SMS composer with the alarm's number and the message already filled in, so the person sees the text and presses send. The siren command asks "Are you sure you want to sound the alarm?" first.
What the Product Does
Saved alarms
Add, edit and delete alarms, each with a name, a location, a phone number and a password. The list is sorted by name.
One-tap commands
Arm, Disarm, Check GPS Location and Check Status, each as a single button on the alarm's page.
Quick Siren Locate
The siren command sits behind a YES / NO confirmation, so it cannot be set off by a stray tap.
Contact picker
Choose the alarm's number from the phone's contacts instead of typing it.
The Stack, Layer by Layer
- Client app
- Flutter and Dart with Provider for state and flutter_screenutil for sizing. Four main views: dashboard, alarm page, add alarm and edit alarm.
- Local storage
- sqflite with one Alarms table: id, name, location, phone number and password. Nothing leaves the device.
- Sending commands
- url_launcher opens an sms: link with the number and body filled in, with a small difference between the Android and iOS link formats. The command text follows the pattern *password*TYPE#.
- Tooling
- The Flutter version is pinned with FVM (3.7.8 for the production build).
Verifiable Facts
Counted from the source repository on October 13, 2026. This page makes no claims about store releases, installs or revenue.
What We Learned Shipping It
Let the phone send the text
The dependency list still has a commented-out SMS-sending package. Opening the composer instead means the person sees exactly what will be sent and to whom. For a command that can set off a siren, that visible step is a feature.
Put a confirm in front of the loud command
The siren is the loud command, and it is the only one with the YES / NO step.
Empty tables break MAX(id)+1
Adding the very first alarm threw an "invalid int" error because the next id came from MAX(id)+1 on an empty table. The fix was one null fallback to 1, shipped in August 2023 along with a fix for the alarm list reloading every time the app reopened.
The password has to be readable
The alarm only accepts the password in clear text inside the SMS, so the app keeps it in the device database rather than hashing it. That is a property of the hardware's protocol, and the app cannot fix it.
Planning Something Similar?
We build Flutter and Firebase apps for startups and small businesses. Get a ballpark with our app cost calculator, see Flutter development, or tell us about your project.
More Case Studies
Workspace369: a Flutter and Firebase SaaS for client work
An all-in-one workspace for freelancers and small service businesses: CRM, proposals, invoicing and payments, scheduling, a shared email/SMS/voice inbox, accounting and AI, in one Flutter app on iOS and the web.
3693: a private music app in Flutter and Firebase
A private music app built with Flutter: search, a now-playing screen with lyrics, a queue, playlists, liked songs, a cloud library, listening stats and light and dark themes, on a typed Firebase backend.
Deep Dream: a Flutter app and a PyTorch queue behind it
A Flutter app sends a photo to a Python API. A Redis queue hands the job to a PyTorch worker that runs DeepDream on a convolutional neural network, and the dreamed image comes back to save to the gallery.
DG Card: scan a trading card and match it on the device
A Flutter app for trading card players. Point the camera at a card, on-device text recognition reads it, and the app matches it against a synced card database. From there you track a collection, build decks and trade with other players.
Artificial Grass Masters: a field estimator and job sign-off app
A Flutter app for an artificial-turf installer. A rep measures a yard on a map, prices the grass, delivery and dumpster on the spot, and closes the job with photos, a customer signature and a rating. The company gets a text message when a new rating comes in.
saas-mcp-connector: a safe MCP server for a SaaS API
An MCP server that lets Claude Desktop, Claude Code and other MCP clients use a SaaS product's API safely. Every call is scoped to one user's workspace, writes need explicit confirmation, and the HTTP transport is rate limited.