01 What it is
WTAK is a purpose-built Wear OS client for the TAK ecosystem. It runs entirely on the watch, draws OpenStreetMap tiles through osmdroid (no Google Maps API key), and models every entity as a Cursor-on-Target event with MIL-STD-2525 affiliations — the same data model ATAK uses.
Everything on screen is real: your own GPS fix, contacts received over the network, and waypoints you place. There is no sample or placeholder data — an empty contact list means nothing has been received yet.
02 Requirements
| Item | Needed |
|---|---|
| Watch | Wear OS 3 or newer (API 30+). Built and tuned for the Pixel Watch 4 (45 mm, Wear OS 6). |
| Android Studio | Ladybug (2024.2) or newer |
| Android SDK | Platform 36 + build-tools |
| JDK | 17 (bundled with Android Studio) |
| Network | Wi-Fi for map tiles and CoT. Tiles are cached to disk once loaded. |
03 Build the app
Open the project folder in Android Studio and let it sync, or build from the terminal:
./gradlew :app:assembleDebug # debug APK
./gradlew :app:assembleRelease # minified release APK (~9 MB)
./gradlew :app:testDebugUnitTest # protocol + crypto tests
Signing a release build
Release signing reads an untracked keystore.properties, so no
secrets live in the repo. Without it you still get a working
unsigned release APK.
keytool -genkeypair -alias atakwatch -keyalg RSA -keysize 2048 \
-validity 10000 -keystore release.jks
cp keystore.properties.sample keystore.properties
# then fill in storeFile / storePassword / keyAlias / keyPassword
04 Install to a watch
Either way you only have to do this once: after the first install, WTAK updates itself from Settings → Update.
-
Enable developer options on the watch
Settings → System → About → tap Build number seven times.
-
Turn on ADB debugging
Settings → Developer options → ADB debugging. For a cable-free watch, also enable Debug over Wi-Fi and note the IP address it shows.
-
Connect
adb connect 192.168.1.42:5555 # IP from the watch adb devices # confirm it is listed -
Install
adb install -r app/build/outputs/apk/release/app-release.apkThe app appears in the watch's app list as WTAK.
adb connect. If the watch refuses the connection, re-toggle
Debug over Wi-Fi to get a fresh pairing.
05 Run on an emulator
No watch handy? Create a Wear OS AVD once:
sdkmanager "emulator" "system-images;android-34;android-wear;x86_64"
avdmanager create avd -n atak_watch \
-k "system-images;android-34;android-wear;x86_64" -d wearos_large_round
Then build, boot, install, feed a GPS fix and screenshot in one command:
powershell -ExecutionPolicy Bypass -File scripts\run-on-emulator.ps1 \
-Lat 40.7580 -Lon -73.9855
Running a live demo
To show the app working — moving position, a teammate arriving over the mesh, live range and bearing — one command drives the whole scenario:
powershell -ExecutionPolicy Bypass -File scripts\demo.ps1
It boots a visible emulator, installs, enables CoT mesh, then walks your
position while a second callsign transmits genuine TAK Protocol v1
reports. Nothing is faked inside the app: BRAVO-2 appears
because something is really transmitting, and ages to red if it stops.
Drive the watch with the mouse while it runs; Ctrl-C ends the
walk and leaves the emulator up.
Two emulator quirks worth knowing
- Wear emulators boot onto a charging screen that covers the app.
Dismiss it with
adb shell dumpsys battery unplug. adb emu geo fixtakes longitude first, then latitude — easy to reverse.
06 Offline maps
Tiles normally stream from OpenStreetMap, which is fine for planning and useless in the field. Load a tile archive and the map renders entirely from local storage — no network, no requests.
-
Get an archive
Export the area you need from MOBAC, QGIS or
mbutilas.mbtiles,.sqlite,.gemfor.zip. To try the feature without downloading a basemap, the repo ships a generator:python tools/make_test_mbtiles.py area.mbtiles \ --lat 40.758 --lon -73.9855 -
Copy it to the watch
adb shell mkdir -p /sdcard/Android/data/com.atakwatch.minimap/files/maps adb push area.mbtiles /sdcard/Android/data/com.atakwatch.minimap/files/maps/ -
Select it
Settings → Map → Offline. The row confirms what was found —
Offline · 1 file, ornone foundin red if the folder is empty.
07 Pairing with your EUD
If you already carry a phone running ATAK, the watch can configure itself from it. Your callsign, team, role and server are read straight from ATAK's own settings, so the two devices can't drift apart — and you never type a callsign on a 1.4" screen.
| In ATAK | Becomes on the watch |
|---|---|
| My Callsign | Watch callsign |
| My Team | Team colour |
| My Role | Team role |
| My Display Type | Self CoT type and affiliation |
| Server | Streaming CoT host |
Once paired, the phone also relays the CoT it receives to the watch. The watch can then show the team picture without running its own mesh or server connection, which is a large battery saving.
Setting it up
-
Install the bridge plugin on the phone
The plugin source ships in
atak-plugin/. It builds against the ATAK Plugin SDK from tak.gov (registration required — it is not on Maven); that directory's README has the steps. -
Pair the watch to the phone
Normal Wear OS pairing. Nothing TAK-specific.
-
On the watch, choose "Set up from phone"
On first launch. Later, Settings → Sync from phone re-pulls — useful after changing your callsign or team in ATAK.
08 First run
On launch the app asks for location permission — it needs this to place you on the map. Grant it and the map centers on your position as soon as the GPS resolves. Outdoors this takes a few seconds; indoors it can take much longer or never resolve.
If you later enable background tracking, the watch also asks for permission to show a notification. That notification is the ongoing "tracking" indicator Android requires whenever an app uses location in the background.
09 Reading the map
The map is the home screen. Everything else is one swipe or tap away.
A 454 px round screen has no room for a button grid, so there is exactly one button — the menu — and the rest is gesture.
Gestures
- Long-press the map — drops a waypoint at that point, not just at your own position, and shares it to the team. The watch buzzes to confirm.
- Tap a marker — opens that contact's full CoT detail.
- Rotary crown — zooms the map; scrolls every list.
- Pinch or double-tap — zoom. Drag — pan.
- Swipe from the left edge — goes back a screen.
The radar scope
Tap ◎ on the right of the map (or Menu → Radar) for a proximity scope: you at the centre, everyone else placed by range and bearing, no tiles involved. It is the view that works identically with a full tile cache, an empty one, or no data connection at all — and it is usually the faster answer to "where is my team relative to me".
- The number at the top is the radius of the outer ring. It sizes itself so the furthest contact fits with room to spare. The crown pins it to a fixed range; tap the number to hand ranging back to the app.
- Tap a blip for that contact's detail; long-press to navigate to it. The target is the same one the map uses, so it is still there when you swipe back.
- Tap the centre — yourself — to return to the map.
- Tap the chip at the bottom for north-up or track-up.
- A contact past the outer ring becomes a chevron on the rim pointing its way. One that has stopped reporting goes hollow — a last known position, still shown, visibly not fresh.
Navigating to something
Open a contact or waypoint and tap Navigate to. The map
draws a dashed line from you to it, and the bottom pill switches to that
target — marked with › — reporting range and bearing
continuously as you move, rather than tracking whatever is nearest. Tap
Stop navigating to clear it. If the target is deleted or
stops reporting, the app drops it for you.
Raising an emergency
Hold the menu button to raise a 911 Alert. A red banner appears; tap it to stand down. Raising is a hold and cancelling is a tap on purpose — a real alert should be hard to trigger by accident and a false one easy to stop.
These are the ecosystem's own alert types (b-a-o-tbl,
b-a-o-pan, b-a-o-opn, cancelled with
b-a-o-can), so the alert shows up as a real emergency in ATAK
and on your TAK server rather than as a marker only this app understands.
While active it re-broadcasts every 10 seconds, and cancelling sends an
explicit stand-down instead of just going silent.
Your track
The map draws a trail of where you have been, so you can backtrack. It records only after real movement — standing still will not fill it with GPS jitter — and keeps the most recent stretch rather than stopping when it fills.
The tile
One swipe from the watch face shows your callsign, position, fix accuracy and nearest contact without opening the app; tap it to open the map. It always displays the age of the reading, because the system draws tiles on its own schedule and the figure may be minutes old.
Knowing what you can trust
- A scale bar above the bottom pill answers "how far is that?" — metric or imperial, following your Units setting.
- GPS accuracy is always on screen next to your heading, and turns red with an age if the fix stops updating.
- A LINK… or NO LINK badge appears top-right only when TAK Server is switched on but not connected. No badge means the link is healthy.
- Contacts older than 45 seconds dim and show their age in red.
The roster
Contacts are listed nearest-first, with you at the top. A contact whose last report is over 45 seconds old is dimmed and shows its age in red — a position that has stopped updating should not be trusted like a live one.
Tapping a contact opens its detail: CoT type, affiliation, team and role, position, range and bearing, accuracy, battery and age. From there you can show it on the map, or delete it if it is one of your waypoints.
Waypoints persist across restarts and are shared to your team when a transport is on.
10 Symbology
Contacts are drawn with standard MIL-STD-2525 affiliation frames, so a glance tells you what something is. Teammates who report an ATAK team colour are drawn as a filled circle in that colour instead — the same precedence ATAK uses.
11 Settings reference
Menu → Settings, grouped into Identity, Display, Power, Network and App. On/off options are switches; the rest cycle through their values on tap. Everything saves immediately, and each switch shows its live state underneath — the mesh group it joined, the server host, whether a certificate is held.
| Setting | Options | What it does |
|---|---|---|
| Callsign | your own text | How you appear to the team. Opens the watch keyboard, handwriting or voice input. |
| Affiliation | Friendly · Hostile · Neutral · Unknown | Your own CoT affiliation. |
| Team | 14 ATAK colours | Team colour, sent in the CoT __group element. |
| Role | Team Member · Team Lead · HQ · … | Team role, sent alongside the colour. |
| Coordinates | MGRS · Lat / Lon | Position format in the HUD and roster. |
| Units | Metric · Imperial | Range display. |
| Map | Standard · Topographic · Offline | Tile source. Offline reads local archives and needs no network. |
| Orientation | North up · Track up | Track up rotates the map to your heading. |
| Keep screen on | On · Off | Holds the display awake while the map is open. |
| Follow GPS | On · Off | Auto-recenter as you move. |
| Range rings | On · Off | 100 / 250 / 500 / 1000 m reference circles around you on the map. |
| Radar sweep | On · Off | Animated sweep on the radar scope. Off leaves a static scope and no continuous animation. |
| Background track | On · Off | Keep tracking and sharing with the screen off. |
| CoT mesh | On · Off | Local-network team sharing. |
| Mesh format | TAK proto · Legacy XML | Wire format for mesh. Modern ATAK uses TAK proto. |
| TAK Server | On · Off | Streaming connection to a server. |
| Server host | host:port | Tap to reload from tak_server.json. |
| TLS | On · Off | Use the enrolled certificate for a mutual-TLS connection. |
| Enroll cert | action | Request a client certificate from your server. |
| Meshtastic | On · Off | Use a paired LoRa radio as the team link. Needs a radio picked first. |
| Radio setup | screen | Scan for Meshtastic radios, pair one, see the live link state and mesh size. |
12 Connect your team
There are three independent ways to share position. You can run any or all of them at once.
A · CoT mesh (same Wi-Fi, no server)
Turn on CoT mesh. The watch joins the TAK default SA
multicast group 239.2.3.1:6969, broadcasts your position
every 3 seconds, and renders teammates it hears. Any ATAK device on the
same network will see you and you will see them — no configuration.
B · TAK Server
Point the watch at a server by pushing a small config file, then turn on TAK Server:
adb push tak_server.json \
/sdcard/Android/data/com.atakwatch.minimap/files/tak_server.json
{
"host": "192.168.1.50",
"port": 8087,
"tlsPort": 8089,
"enrollPort": 8446,
"username": "yourname",
"password": "yourpassword"
}
Tap Server host in Settings to load it. Port
8087 is a plain streaming-CoT input, which every TAK server,
FreeTAKServer and OpenTAKServer accepts.
C · Meshtastic radio (no server, no network at all)
The watch can talk straight to a Meshtastic LoRa radio over Bluetooth and use the mesh as the team link. No server, no Wi-Fi, no cell coverage, and no phone in the path — the watch is the client and the radio is the transport.
- Power the radio on and make sure it is not already connected to a phone — a radio only accepts one client at a time.
- On the watch: Settings → Radio setup, grant Bluetooth, then Scan. Only Meshtastic radios are listed; the scan is filtered at the hardware level.
- Tap yours. Android will show its own pairing prompt — enter the PIN shown by the radio there. This app never handles it.
- The Link row and the badge on the radar read Connected / LoRa once the radio has replayed its node database.
- Tap Configure radio. This sets the radio's device role to TAK — the role Meshtastic ships for exactly this job, which stops it emitting the routine chatter a general-purpose node sends — and writes your team and role into the radio so it identifies the same way the watch does. The radio reboots once to apply.
The same screen reads back what the radio actually is: firmware, device role, region, modem preset and primary channel. It is worth a glance — what a radio is doing and what you think you configured are not always the same thing.
UNSET cannot legally transmit, and from the watch that looks
identical to a mesh with nobody on it. The radio screen flags it in red.
WTAK will not set it for you: which band you may transmit on is a
licensing decision, so set it in the Meshtastic app yourself.
Position reports and GeoChat go out as TAK Packets on
Meshtastic's ATAK_PLUGIN port — the same thing Meshtastic's
own ATAK plugin sends — so a phone running that plugin sees you and you
see it. Plain Meshtastic nodes with no TAK plugin still show up as
contacts from their position and node-info packets, and their text
messages arrive in GeoChat.
adb logcat -s MeshtasticLink
narrates each stage.
13 TLS enrollment
Production TAK servers require a client certificate. The watch can request one itself, the same way ATAK's quick-connect does.
-
Provide credentials
Push
tak_server.jsonwith your server username and password and the enrollment port (usually8446). -
Enroll
Settings → Enroll cert. The watch generates a 2048-bit key and a certificate signing request, sends it to the server's certificate API, and stores the signed certificate.
-
Turn on TLS
The TLS row shows
On · cert ✓once a certificate is held. The watch now connects to the TLS port with mutual authentication, trusting only the CA your server returned.
Your password is used once, for enrollment, and is never stored by the app. The certificate and pinned CA live in the app's private storage.
14 Background & battery
By default, tracking runs only while the map is on screen. Turn on Background track and a foreground service keeps your position and CoT sharing alive with the screen off and the app closed, showing an ongoing notification while it does.
What the app does to save power
- Always-on display — in ambient the map is replaced by a black low-power readout; tiles and the compass stop, and GPS drops to a 30 second cadence.
- No polling — position updates are pushed by the system, not requested on a timer.
- Radios are opt-in — mesh and server connections only run when you switch them on.
15 Troubleshooting
| Symptom | Try this |
|---|---|
| Stuck on "Acquiring GPS…" | Go outside with a clear view of the sky. GPS rarely resolves indoors. On an emulator, send a location from the extended controls. |
| Map tiles are blank | Online sources download tiles on first view — connect to Wi-Fi once and pan the area you need. On Offline, check the Map row says a file was found, and that you are inside the archive's area and zoom range. |
| No contacts appear | Confirm a transport is on in Settings. For mesh, check the network passes multicast. For a server, check the host and port. |
| Enrollment fails | Verify the username, password and enrollment port, and that the server's certificate API is reachable from the watch's network. |
| TLS says "no cert" | Enrollment has not completed. Run Enroll cert and wait for it to report success before enabling TLS. |
| Battery draining fast | Turn off Background track when you do not need it, and turn off Keep screen on. |