APD Defense, LLC

Privacy Policy

One policy, covering three Android apps: PulseLink, CommandLink and TerraLink.

Effective date: October 5, 2026  ·  Version 1.1.2

In short

These three Android apps are companions to an APD Defense encrypted mesh radio. They are built to work with no cell service and no internet.

  • We do not collect your records. Nothing you record in the apps — casualties, messages, positions, rosters, keys — is sent to us. We cannot see it.
  • The one exception is a problem report you choose to send. If you tap Report a Problem, you see the whole report first, and nothing is sent unless you tap Send. It goes to APD Defense over the internet. See Problem reports.
  • There are no ads, no analytics, no trackers and no automatic crash reporting. We checked the code, not just our intentions: there is no advertising library, no analytics library, no crash reporting library and no Google Play Services dependency in any of the three apps.
  • You need no account. There is nothing to sign up for and no login.
  • Your records stay on your phone, in each app's private storage, which other apps on the phone cannot read.
  • What leaves the phone goes over your radio, to the other radios on your own net, encrypted and authenticated by the radio hardware — and only when you send it, or when you have left position sharing on (see Location).
  • These apps are prototypes. They are not FDA cleared, and they are not certified or approved for any purpose.

The rest of this policy says exactly what each app holds, where it holds it, and what can leave.

Who we are

APD Defense, LLC
Idaho, United States
Email: support@apddefense.com
Web: apddefense.com

For any privacy question, or to ask us anything about this policy, email the address above.

The apps this policy covers

AppPackage nameWho it is for
PulseLinkcom.apddefense.pulselink A medic. Casualty triage records, MARCH treatment notes, the 9-line MEDEVAC request, a mission archive.
CommandLinkcom.apddefense.tacticalradio A leader or radio administrator. Radio link and diagnostics, messaging, map, network key management, radio firmware updates.
TerraLinkcom.apddefense.civ A handheld radio user, civilian or general government. Messaging, who is on the net, maps, network keys for the user's own radio.

All three connect to an APD Defense radio over a USB cable. CommandLink can also connect over Bluetooth Low Energy. All three also run without any radio attached, in Training Mode, where everything on screen is made up.

What each app stores, and where

Everything listed here is stored in the app's own private storage on your phone — the area Android gives each app and keeps other apps out of. It is protected by your phone's own encryption and your lock screen. None of it is uploaded anywhere. The one thing an app can send over the internet is a problem report you choose to send, and none of the records below go into one, apart from the technical part of the last crash record, as its row says.

PulseLink

WhatWhere it is keptNotes
Mission setup: your call sign, mission name, MEDEVAC frequency, receiving station call sign, map sheet, grid zone, magnetic declination, free-text notes App-private preferencesTyped by you
Squad roster: names and call signs you enterApp-private preferences Typed by you; used to put names on cards instead of radio numbers
Radios you have registered, and radios you have marked lost App-private preferencesRadio labels, scanned or typed
Mission archive: one file per finished mission — casualty names and call signs, triage category, the MARCH checklist, tourniquet times, what treatment you recorded, dispositions, and the positions that were reported App-private files Capped at 10 missions and 30 days. Older or surplus missions are deleted automatically, both at app start and after every write. Records are never edited, only added or deleted.
Readings received from radios In memory while the app runs; written into the archive when a mission ends See Vital signs
A 4-character random tag generated once per install App-private preferences Used to make each 9-line request uniquely identifiable so a re-send updates one marker instead of creating a second. It is not a device identifier and is not derived from your phone.
Your unit preference (feet/miles or meters/kilometers), map and display settings App-private preferences
A record of the last app crash, if one ever happened: the time and the technical stack traceOne app-private file Shown in Settings as a time. Only the most recent one is kept. Never sent automatically. It leaves the phone only inside a problem report you send with the diagnostic log switched on, and then with the error message text removed (see Problem reports).
Problem reports you sent that have not reached us yet App-private files Deleted from the phone as soon as our relay accepts them. A report the relay refuses outright stays on the phone, marked NOT ACCEPTED.
Offline map files you downloadedApp-private files See map downloads

Training Mode is never saved. The app always starts live, and training missions are never written to the archive.

CommandLink

WhatWhere it is keptNotes
Your call sign, and a random app-generated identifier (APD- plus 8 characters)App-private preferences The identifier goes over the radio inside your position and message reports so receivers can tell reports apart. It is randomly generated by the app. It is not your phone's advertising ID, IMEI, MAC address or serial number, and we do not read any of those.
Your radio inventory: the radios you have registered, and who you noted is carrying themApp-private preferences
Network keys for the radio net, if you generate or scan any App-private preferences, each key encrypted with AES-256-GCM under a key held in the Android hardware key store Shown only after your phone's own unlock. Never logged, never copyable to the clipboard. A key leaves the phone only when you choose Load To Radio, and then only to the radio on the USB cable (never over Bluetooth, never to us). Delete All Keys destroys the hardware key store key as well, so any remaining bytes are unreadable.
A key scanned for Fill Radio In memory only, for at most 5 minutes Never stored. Wiped when the radio reports it loaded, on Done or Discard, or when you leave the screen.
The hardware IDs of radios this phone has seen with an owner lock App-private preferences Used to warn you if such a radio later claims to be factory-fresh. Not secret: the IDs are printed on the radios' labels.
An administrator PIN, if you set one Stored only as a salted PBKDF2-HMAC-SHA256 hash, itself encrypted under a hardware key store key The digits are never stored. Wrong entries are counted and lock the screen for a while.
Leader mission archive: one file per finished mission — the 9-line MEDEVAC requests received (kept exactly as they arrived), roster pushes received, messages you sent, and the radio listApp-private files Capped at 10 missions and 30 days, pruned automatically. The in-progress mission is also written so a phone restart does not lose it. Received 9-lines can contain casualty information sent by a medic.
Messages received over the radio In memory only, most recent 500, for the session Not written to disk. Messages you send are recorded in the mission file above.
Map, alert-sound, ATAK bridge and USB settingsApp-private preferences
A record of the last app crashOne app-private file As PulseLink, above: never sent automatically.
Problem reports not yet sentApp-private files As PulseLink, above
Offline map files you downloadedApp-private files

CommandLink excludes all of its data from Android cloud backup and from device-to-device transfer, so a key store or a mission record cannot leave the phone that way.

TerraLink

WhatWhere it is keptNotes
Your name on the net, and a random app-generated identifier (CIV- plus 8 characters)App-private preferences Same kind of identifier as CommandLink's, above
Your radio listApp-private preferences
Network keys, if you generate or scan any App-private preferences, each key encrypted with AES-256-GCM under a key held in the Android hardware key store The same implementation as CommandLink's, above: shown only after your phone's own unlock, and sent only to the radio on the USB cable when you choose Load To Radio.
A key scanned for Fill Radio, and the hardware IDs of radios seen with an owner lockAs CommandLink, aboveAs CommandLink, above
Whether you are sharing your position on the net (on by default; there is a switch in Settings)App-private preferences
Map and USB settingsApp-private preferences
Messages received over the radioIn memory only, for the sessionNot written to disk
A record of the last app crashOne app-private file Never sent automatically; as PulseLink, above
Problem reports not yet sentApp-private files As PulseLink, above
Offline map files you downloadedApp-private files

TerraLink holds no casualty records, no triage and no 9-line. Those belong to PulseLink and CommandLink. TerraLink excludes all of its data from Android cloud backup and from device-to-device transfer, as CommandLink does.

Health information in PulseLink

This is the most sensitive information any of the three apps handles, so it gets its own section.

What PulseLink holds. Casualty records you create: a name and call sign from the roster you typed, the triage category shown for that person, the MARCH checklist and tourniquet times you recorded, what treatment you noted, the disposition you set, the last position reported for them, and any readings that arrived from their radio.

Where it lives. On your phone, in PulseLink's private storage. One file per mission. Capped at 10 missions and 30 days and pruned automatically. No other app on the phone can read it. PulseLink's records are excluded from Android cloud backup.

Where it can go. Every route is started by you.

  1. A 9-line MEDEVAC request you write and send. You fill it in, you review it against what the app read back to you, and you press send. It goes out over the radio as a broadcast to every radio on your net; a leader running CommandLink sees it as a 9-line. The radio encrypts and authenticates it with the network key before it goes on the air.
  2. A roster push you choose to send, so a leader's app can show who is carrying which radio. This sends call signs only unless you explicitly ask for names each time — the app defaults to call signs and requires you to opt in to names on every push.
  3. A casualty card handed to another medic by QR code, from your screen to their camera. It does not use the radio or the internet, and it is not encrypted: anyone who can see or photograph your screen while it is showing can read it. It carries the casualty ID; the name is included only if you switch on Include Name for that handoff.
  4. Android's share sheet or print service, when you choose them. PulseLink can hand a 9-line, a MIST report or a finished mission's text to another app you pick (a messaging app, email, notes), copy a 9-line to the clipboard, or send a casualty card to the phone's print service (including “Save as PDF”). Once it is in the other app, printer or file, it is under that app's or that service's rules, not ours, and it may leave the phone through them. Other apps on some Android versions can read the clipboard.

No route sends health information over the internet. PulseLink does contain network code, for two things only: downloading map images (see map downloads) and sending a problem report you chose to send. The map downloader has no access to the casualty board, the roster or a 9-line. A problem report is built from a fixed list of facts about the app, the phone and the radio, and it has no field that can hold a casualty, a card, a name, a call sign or a position; the only free text in it is what you type in the description. The part of the shared code that could relay a casualty over a network is wired, in PulseLink, to an implementation that does nothing.

No casualty record goes to APD Defense. Please don't type casualty details into a problem report's description: that text is sent as you typed it.

Vital signs — read this before you expect any

Important

The APD radios carry no vital-sign sensors. There is no pulse sensor, no oxygen sensor and no thermometer on the radio hardware. A live radio therefore reports no vitals at all, and the app shows dashes where a reading would go.

The apps are built so they never invent a value. “No reading” is carried as a specific value that means “nothing was reported”, kept deliberately distinct from a real measurement of zero, and shown on screen as dashes. A radio can report a motion state — moving, still, or immobile long enough that the radio itself flags it — and that is the only body-related reading the fielded hardware sends.

Made-up readings appear on screen in exactly one situation: Training Mode, which paints every screen magenta, marks every card SIM, and is never saved and never archived.

The medic decides

The medic decides

PulseLink is a prototype and a record-keeping aid for a trained medic.

  • It has no FDA clearance or approval, and has not been clinically validated.
  • It must not be relied on for medical care, for patient monitoring, or for any decision on which someone's safety depends.
  • The medic decides. The app shows what arrived, what the medic entered and any triage category it suggests. A suggested category counts nowhere until the medic confirms it, and the assessment of the person on the ground overrides the app in every case.

CommandLink and TerraLink are prototypes on the same terms.

Location

What is collected. Your phone's own position, from the Android platform location service, using the GPS provider and the network provider when one is available. The apps do not use Google Play Services' fused location provider and do not depend on Play Services at all.

When. Only while a screen that needs it is open, and only after you grant the location permission. Location is reference-counted: the Map screen and the 9-line form each turn it on while they are showing and turn it off when they close, so the GPS is not left running in your pocket. No app has background location permission, and none of them tracks you when you are not using them.

Where it goes.

AppWhat happens to your position
PulseLink Stays on the phone. It centers the map, and it can fill line 1 of a 9-line when you tap USE MY POSITION — which is the only way it leaves, inside a request you send.
CommandLink Sent over the radio to the other radios on your net when the phone decides you have moved (roughly 15 m on foot, 100 m in a vehicle, or a turn), rate-limited by the radio, with a periodic heartbeat. There is a Sharing switch in Settings, and it is on by default. Your choice is remembered across app restarts.
TerraLink Same as CommandLink: shared on the net so other people can see where you are. On by default, with a switch in Settings that is remembered.

What is never done. Your position is never guessed, never inferred from Bluetooth, never sent to us, and never sent to any advertising or analytics service. When the phone does not know where it is, the apps say NO POSITION or NO FIX rather than showing a plausible-looking wrong place. A person whose position has not been reported is listed as unknown and is never drawn at a guessed point on the map.

Every time on screen is marked L (local) or Z (Zulu). You choose which in PulseLink's mission setup, or in Settings in CommandLink and TerraLink; local is the default. Times that go inside ATAK Cursor-on-Target messages are UTC, because that is what the format requires.

Permissions, and why each one exists

We ask for as little as we can, we ask at the moment the feature is used rather than at install, and every app keeps working if you say no — with the feature that needed it turned off.

PermissionWhich appsWhyIf you refuse
Precise and approximate locationAll three Your own position on the map; line 1 of a 9-line; position sharing on the net Map is north-up with no marker for you; the app says NO POSITION; you can still type a grid into a 9-line
CameraAll three Scanning the QR code on a radio's label, and network key QR codes in CommandLink. Decoded on the phone by an on-device library. No image is ever uploaded, and camera frames are decoded in memory and discarded. Type the radio's 8-digit code instead
Internet / network stateAll three Three things only: (1) downloading map tiles on Settings → Map Data, and only while Map Downloads is switched on — it is off by default; (2) sending a problem report you chose to send; (3) CommandLink and TerraLink talk to ATAK on the same phone over loopback, and Android requires this permission even for 127.0.0.1. Map downloads, problem reports and the ATAK bridge do not work (a report waits on the phone). Everything else is unaffected.
NotificationsAll three Critical alarms (for example a received 9-line), message notifications, the persistent notification of the background services below, and a quiet notice when a problem report you sent has been delivered Alarms and messages still arrive inside the app, but Android may not show them when the app is not in front; the services still work
Full-screen alerts and vibration All three Showing a critical alarm over the lock screen and vibrating for it The alarm arrives as an ordinary notification
Do Not Disturb accessAll three Letting a critical alarm sound while the phone is in Do Not Disturb. Granted by you on Android's own settings screen, never automatically. Alarms follow your Do Not Disturb settings
Foreground service (connected device) All three Holding the radio link alive while you use another app or the phone is locked, so an alarm can still reach you; and, in CommandLink and TerraLink, running the ATAK bridge while ATAK is in front. The radio link service starts only when a real radio is connected (never in Training Mode), or the bridge when you turn it on. In CommandLink it is stopped by Disconnect, by unplugging, or by the notification's Stop. In PulseLink it stops when you close the app, and in TerraLink when you tap Disconnect; if the radio is unplugged first, its notification says NO RADIO LINKED until then. Never starts at boot. The radio link service never restarts itself. The ATAK bridge can: if Android stops it while it is running, Android may start it again on its own. It then shows its notification again and waits for ATAK on this phone, but it does not reconnect the radio, so nothing passes between ATAK and the radio until you connect one. Stop in its notification ends it. n/a (not a runtime prompt)
Run at startup and keep the phone awake All three Used only by Android's standard background-job library (WorkManager) to send a problem report you already chose to send, if the phone restarted before it got out. Nothing else runs at startup. n/a (not a runtime prompt)
Change Wi-Fi multicast stateCommandLink, TerraLink Only if you switch on the optional situational-awareness multicast output to the local network; the lock is taken then and released when the bridge stops The optional multicast output does not work
Bluetooth scan / connectCommandLink only Connecting to a radio over Bluetooth Low Energy. Declared as never used for location — we do not derive your position from Bluetooth. Use the USB cable instead
USB hostAll three Reaching the radio over the cable. This needs no manifest permission at all: Android asks you per device with its own dialog, and plugging a known radio in can launch the app. Use Training Mode, or Bluetooth on CommandLink
Map pack sharing (com.apddefense.permission.MAP_PACKS)All three Lets the three APD apps read each other's downloaded maps, read-only, so a map downloaded once serves all three. It is a signature permission: Android grants it only to apps signed with the same key, so no other app can use it. n/a

Permissions we deliberately do not have: no storage or photo/media permission, no contacts, no microphone, no SMS, no call log, no calendar, no background location, no “query all packages”, no advertising identifier. Where an app needs to open or save a file — a firmware image in CommandLink, or an imported map file — it uses Android's own document picker, which grants access to that one file you chose and nothing else.

Analytics, advertising and third-party code

There are none. No advertising SDK, no analytics SDK, no crash-reporting service, no attribution or marketing SDK, no Google Play Services, no Firebase, no push service, no A/B testing service, no remote configuration and no license check. The only APD Defense service the apps ever contact is the problem-report relay, and only to deliver a report you chose to send (see Problem reports).

The third-party code the apps do include is open-source library code that runs entirely on your phone and sends nothing anywhere:

Map downloads

If, and only if, you switch on Map Downloads and choose an area, the app fetches map tiles from the United States Geological Survey's The National Map service (basemap.nationalmap.gov). What it sends is the coordinates of the tiles you asked for and a user-agent string that identifies the app and nothing about you; USGS will see your IP address, as any web server does. The app only fetches — it uploads nothing, and the downloader has no access to your records, your roster or your messages. A short list of map hosts is hard-coded; the app cannot be pointed at an arbitrary server. USGS map data is public domain, and the license and credit line are written into each map file.

No map host is contacted while you are on a mission. Maps are downloaded before you go.

Problem reports

Each app has a Report a Problem screen. It is the only way anything from the apps reaches APD Defense, and it only happens when you choose to send a report.

What is sent, and only when you choose

The screen shows you the whole report before anything leaves the phone. Nothing is sent unless you tap Send. A report contains only what the preview shows:

A report never includes your location, any casualty or medical information, messages, rosters, names, call signs, mission details, network keys, the radio's label code, or your email address or phone number. This is built in, not a filter: the report is assembled from a fixed list of facts about the app, the phone and the radio, and there is no place in it to put anything else. The one exception is the description you type, which is sent exactly as you wrote it, so please don't type casualty or personal details into it.

Because a report carries no contact details, we cannot reply to it. If you want an answer, email support@apddefense.com and quote the report ID.

How it travels, and where it goes

  1. On your phone first. Tapping Send saves the report in the app's private storage. If you are offline, it waits there and goes out the next time the phone has an internet connection, even after a restart. The Report a Problem screen lists any report still waiting. It is deleted from the phone as soon as our relay accepts it. A report the relay refuses outright stays on the phone, marked NOT ACCEPTED.
  2. To APD Defense's relay, a small program APD Defense runs on Cloudflare, sent encrypted in transit (HTTPS). The relay checks the report's format and passes it on. It does not store the report.
  3. Into APD Defense's issue tracker on GitHub (GitHub is owned by Microsoft). Each report becomes an issue in a private repository that only APD Defense can open. APD Defense is one person, so in practice that is the company's owner.
  4. By email, only as a fallback. If the relay cannot file the report on GitHub, it emails the report instead, from reports@apddefense.com to support@apddefense.com, which are APD Defense mailboxes hosted by Microsoft 365.

Who can see it

No one else. We do not sell reports, share them with anyone else, or use them for advertising, analytics or anything other than fixing problems in the apps and the radio.

What the relay keeps

The relay keeps no copy of the report. To stop duplicate and spam submissions it keeps three small records, and deletes each one automatically:

The relay's stored logging is switched off. The only lines it writes are event names and error codes, which never include the report, its ID or your IP address. Cloudflare, which hosts the relay, handles your phone's connection to it, including your IP address, and may process that connection data under its own terms.

How long we keep a report

We keep a report while the problem it describes is open, and delete it 12 months after the issue is closed. An emailed copy is deleted on the same schedule.

Asking for deletion

Email support@apddefense.com with the report ID (it is at the top of the report, and on the Report a Problem screen while the report is waiting on your phone). We will delete the issue, and any emailed copy, and confirm by reply. A report that has not left your phone yet (waiting to send, or refused by our relay) can be deleted on the Report a Problem screen: tap DELETE next to it, then confirm.

Working offline

These apps are offline-capable by design, not offline-restricted. Everything they do works with no cell service, no Wi-Fi and no internet at all, because the radio net is the point. The apps reach the internet for only two optional things, downloading maps and sending a problem report you chose to send; with no connection, every app is fully functional, and a report simply waits on the phone.

Security

How long we keep things, and how you delete them

The only thing we ever receive is a problem report you chose to send; how long we keep it, and how to ask us to delete it, is under Problem reports. Everything below is on your phone and under your control.

WhatHow longHow to delete it
PulseLink mission archive Automatically: newest 10 missions, nothing older than 30 days Settings → Mission Archive deletes one mission, or DELETE ALL ARCHIVES
CommandLink mission archiveSame: 10 missions, 30 days The Missions screen deletes one, or DELETE ALL ARCHIVES
Network keys (CommandLink, TerraLink)Until you delete them Delete All Keys On This Phone, which also destroys the hardware key that protected them
Admin PIN (CommandLink)Until you change it Changed on the PIN screen; removed with the app
Mission brief, roster, radio list, settings Until you change them or remove the app Edit or clear the fields; or remove the app
Received messagesHeld in memory only, and gone when the app closes Close the app
Crash recordOnly the most recent oneRemoved with the app
Offline mapsUntil you delete them Settings → Map Data
Problem reports not yet sent Until our relay accepts them Clear the app's storage in Android's settings, or remove the app

To delete everything on the phone, uninstall the app. Android removes its private storage with it, which is every record, every setting, every key blob, every queued problem report and every map pack that app downloaded. Uninstalling does not remove a problem report we have already received; to have that deleted, email us as described under Problem reports.

Because there is no account, the only data of yours we can ever hold is a problem report you sent. If you have never sent one, a “please delete my data” request has nothing on our side to act on. If you would like us to confirm that in writing, email support@apddefense.com and we will.

Children

These apps are not directed at children and are not designed or marketed for anyone under 13. They are professional tools for radio operators, team leaders and medics, and they need APD Defense radio hardware to do anything real. We do not knowingly collect information from children; the only thing we ever receive from anyone is a problem report they chose to send. If you believe a child has used one of these apps in a way you are concerned about, email us and we will help you clear the phone, and delete any report they sent.

Changes to this policy

If we change what an app stores or what can leave your phone, we will update this policy, change the effective date at the top, and keep a short note of what changed. Material changes will be announced in the app's release notes on Google Play and on apddefense.com. Because we hold no contact details for you, we cannot email you — the date at the top of this page is the thing to check.

Version 1.1.2 (October 5, 2026) describes PulseLink accurately: it may suggest a triage category, which counts nowhere until the medic confirms it, and the medic makes every care decision. It removes the earlier statements that the apps are not medical devices and do not diagnose. The apps remain prototypes with no FDA clearance, and they have not been clinically validated. What the apps store and what can leave your phone are unchanged.

Version 1.1.1 (October 2, 2026) corrects statements in version 1.1 that were not true of the released apps:

Contact

APD Defense, LLC
Idaho, United States
support@apddefense.com
apddefense.com


A note on what this policy is derived from

Every factual claim above was taken from the apps' source code as it stands on the effective date — the manifests, the storage classes, the dependency lists and the network code — and, for problem reports, from the relay's own source code, rather than from intent or from marketing material. If you find a place where the apps behave differently from what this page says, tell us: the code is the thing that is meant to be true, and the page is what we will fix.