Wear OS 6 · Pixel Watch 4 · v1.8.0

WTAK
install & field guide

A standalone tactical minimap for Wear OS. It puts your position on an offline-capable map, speaks real Cursor-on-Target over mesh or a TAK server, and shares your PLI with the team — from your wrist, with no phone required.

  • 456 × 456 round
  • Offline maps
  • 911 beacon
  • MGRS + Lat/Lon
  • MIL-STD-2525
  • TAK Protocol v1
  • mTLS enrollment
  • No API key

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.

It is not an ATAK plugin. ATAK plugins load inside ATAK on a phone or tablet and cannot run on Wear OS. This is an independent TAK client that speaks the same wire formats, so real ATAK end-user devices and TAK servers can see it and it can see them.

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

ItemNeeded
WatchWear OS 3 or newer (API 30+). Built and tuned for the Pixel Watch 4 (45 mm, Wear OS 6).
Android StudioLadybug (2024.2) or newer
Android SDKPlatform 36 + build-tools
JDK17 (bundled with Android Studio)
NetworkWi-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

No computer? Use WatchPush. It sideloads an APK onto a Pixel Watch straight from your phone over Wireless debugging — download the WTAK release APK on the phone, open WatchPush, and push it across. Everything below is the desktop route, for when you would rather use a cable.

Either way you only have to do this once: after the first install, WTAK updates itself from Settings → Update.

  1. Enable developer options on the watch

    Settings → System → About → tap Build number seven times.

  2. 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.

  3. Connect

    adb connect 192.168.1.42:5555   # IP from the watch
    adb devices                     # confirm it is listed
  4. Install

    adb install -r app/build/outputs/apk/release/app-release.apk

    The app appears in the watch's app list as WTAK.

The watch and your computer must be on the same network for 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 fix takes 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.

  1. Get an archive

    Export the area you need from MOBAC, QGIS or mbutil as .mbtiles, .sqlite, .gemf or .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
  2. 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/
  3. Select it

    Settings → MapOffline. The row confirms what was found — Offline · 1 file, or none found in red if the folder is empty.

Archives are read straight from storage, so put in only the area you actually need — a country-sized export will fill the watch. Zoom levels outside the archive have no tiles to draw.

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 ATAKBecomes on the watch
My CallsignWatch callsign
My TeamTeam colour
My RoleTeam role
My Display TypeSelf CoT type and affiliation
ServerStreaming 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

  1. 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.

  2. Pair the watch to the phone

    Normal Wear OS pairing. Nothing TAK-specific.

  3. 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.

The phone is optional. Choose Set up on watch and everything still works — its own mesh, its own server connection, its own certificate enrolment. Pairing removes duplicate setup and saves battery; it is not a dependency.

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.

TOP PILLYour callsign in your team colour, position in MGRS (or lat/long), heading, and GPS accuracy — green under 10 m, amber to 30 m, red beyond that or when the fix goes stale. Tap it to recenter on yourself.
BOTTOM PILLRange and bearing to the nearest contact. Tap it to open that contact.
CENTREYour blue-force marker. The arrow points the way you are facing.
☰ LEFTMenu — Radar, Contacts, GeoChat, Settings, About.
◎ RIGHTRadar — the same contacts as a proximity scope, with no basemap.

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.
A one-time hint on first launch names the three non-obvious gestures (long-press, crown, marker tap), then never shows again.
Panning never closes the app. Wear normally dismisses an app on any left-to-right swipe — which on a map is the same movement as a pan — so that window-level gesture is switched off and back navigation belongs entirely to the app. Every screen still swipes back to the one before it. The map is the home screen with nothing behind it, so to leave the app use the side button.

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.
The sweep is decorative, not a sensor: it paints contacts the app already knows about. Turn it off in Settings → Radar sweep if you would rather not run a continuous animation. In always-on the scope drops to the outer ring and your own marker.

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.

Friendlya-f-* rectangle
Hostilea-h-* diamond
Neutrala-n-* square
Unknowna-u-* quatrefoil
Teammateteam colour
Waypointb-m-p-w

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.

SettingOptionsWhat it does
Callsignyour own textHow you appear to the team. Opens the watch keyboard, handwriting or voice input.
AffiliationFriendly · Hostile · Neutral · UnknownYour own CoT affiliation.
Team14 ATAK coloursTeam colour, sent in the CoT __group element.
RoleTeam Member · Team Lead · HQ · …Team role, sent alongside the colour.
CoordinatesMGRS · Lat / LonPosition format in the HUD and roster.
UnitsMetric · ImperialRange display.
MapStandard · Topographic · OfflineTile source. Offline reads local archives and needs no network.
OrientationNorth up · Track upTrack up rotates the map to your heading.
Keep screen onOn · OffHolds the display awake while the map is open.
Follow GPSOn · OffAuto-recenter as you move.
Range ringsOn · Off100 / 250 / 500 / 1000 m reference circles around you on the map.
Radar sweepOn · OffAnimated sweep on the radar scope. Off leaves a static scope and no continuous animation.
Background trackOn · OffKeep tracking and sharing with the screen off.
CoT meshOn · OffLocal-network team sharing.
Mesh formatTAK proto · Legacy XMLWire format for mesh. Modern ATAK uses TAK proto.
TAK ServerOn · OffStreaming connection to a server.
Server hosthost:portTap to reload from tak_server.json.
TLSOn · OffUse the enrolled certificate for a mutual-TLS connection.
Enroll certactionRequest a client certificate from your server.
MeshtasticOn · OffUse a paired LoRa radio as the team link. Needs a radio picked first.
Radio setupscreenScan 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.

Mesh depends on the network passing multicast. Most home and hotspot Wi-Fi does; many corporate and guest networks deliberately block it. If nobody appears, that is the first thing to check.

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.

  1. Power the radio on and make sure it is not already connected to a phone — a radio only accepts one client at a time.
  2. On the watch: Settings → Radio setup, grant Bluetooth, then Scan. Only Meshtastic radios are listed; the scan is filtered at the hardware level.
  3. Tap yours. Android will show its own pairing prompt — enter the PIN shown by the radio there. This app never handles it.
  4. The Link row and the badge on the radar read Connected / LoRa once the radio has replayed its node database.
  5. 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.

Check the region. A radio with its region left 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.

LoRa is slow and shared by the whole team, so position is not sent every 3 seconds the way it is over IP. It goes out when you have moved about 30 m, no more often than every 30 seconds, with a keepalive every 5 minutes when you are standing still. This is deliberate: a team of radios all chattering would leave no airtime for anyone.
Not yet flown against physical hardware. The wire format is unit-tested against bytes built from Meshtastic's published schemas and the UI degrades honestly with no adapter, but the first connection to a real radio is the acceptance test. 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.

  1. Provide credentials

    Push tak_server.json with your server username and password and the enrollment port (usually 8446).

  2. 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.

  3. 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.

The enrollment request itself trusts the server on first contact — the CA is not known until the server returns it. Every CoT connection afterwards is pinned to that CA. Enroll on a network you trust.

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.
Continuous GPS is the single biggest drain on any watch. Expect materially shorter battery life with background tracking on, and plan around it for long operations.

15 Troubleshooting

SymptomTry 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.