Skip to content

Own product

TacLink: a live tactical map for airsoft and milsim

TacLink is my own product. An organiser creates an event on the web, players join in the app and see their side live on the map, even with the phone locked in a pocket or no signal on the field.

The problem

At airsoft and milsim games, players are spread across woods and hills and coordinate by radio. Knowing who is where is hard. Similar apps need mobile data the whole time, and the playing field is often exactly where there is no signal.

How it works

  • On the web, the organiser draws the game area, sets up sides, squads and commanders, and places map pins and a meeting point.
  • Each side gets a QR code and a link that can be printed or posted in a WhatsApp group.
  • A player signs in with Apple or Google, enters a callsign and scans their side's QR code.
  • The app downloads the area map and all game data, so the map works from the first second.
  • During the game, the player sees their side's positions, enemy markers, teammates' status and orders from the commander and squad leader.

Location with the screen locked

During a game the phone sits in a pocket or on a vest. So the app keeps sending its location with the screen off: through background location updates on iPhone and a foreground service on Android. While the player moves, positions go out more often, and less often while they stand still, to save battery. On iPhone the game also shows on the lock screen as a Live Activity.

Bluetooth mesh without signal

When signal drops, the phones at the game link up over Bluetooth and pass positions, statuses and orders to each other. Each side's messages are encrypted, so a phone on the other side can relay a message but cannot read it. As soon as one phone in the mesh finds signal, it becomes a bridge to the server and sends everything collected in the meantime.

Why native

The first version of TacLink was written in React Native and released on the App Store and Google Play. After a playtest with real players, the product was simplified and the mobile apps were rewritten from scratch, separately for iOS and Android. Background work, Bluetooth and location are the core of this app, and native code reaches them directly, without extra layers.

Technology

The iOS app is written in Swift and SwiftUI, with MapLibre for the map, GRDB for the local database and CoreBluetooth for the mesh. The Android app is written in Kotlin and Jetpack Compose, with MapLibre, Room and a Bluetooth LE mesh. Both platforms share one mesh message format and test it against the same fixtures, so iPhones and Android phones understand each other byte for byte.

The server runs on ASP.NET Core with PostgreSQL and SignalR for live data. The organiser console is built with React and Vite, and the public site tac-link.com with Astro. Organisers pay through Stripe. Everything runs on one dedicated server.

What this project shows

I built TacLink on my own, from the server and organiser console to both mobile apps and the public site. The same experience with background location, offline operation, sign-in, payments and store releases goes into client projects, such as apps used out in the field.