CUST/OS

CUST/OS/kuh-stohs/

The Agentic Custom Operator's System

Guardian of the Tactical Edge

From the Latin custos — guardian, keeper, warden. An edge-first, mission-customizable agentic runtime built into ATAK that watches the tactical picture, reasons over mission context, and acts through TAK's protocols — with the operator always in command.

Three Theses, One Product

Three commitments. None of them negotiable.

CUST/OS isn't a feature pile — it's the consequence of three design commitments that reinforce each other. Drop any one of them and the runtime collapses into something else. Hold all three, and you get an agent that gets better when the network is up, keeps working when it isn't, and never acts without the operator's authority.

Thesis I

Edge-First

The right place to run tactical AI is on the device the operator is fighting from. Not in someone else's data center. Not behind a contested network. Inside the trust boundary the operator already trusts.

Thesis II

Customizable to the Mission

Tactical needs change at mission cadence, not release cadence. Skills are Lua scripts the operator owns. Authority rules live in YAML. The same APK runs every deployment — the operator shapes the runtime to the mission, not the other way around.

Thesis III

Operator Always in Command

The agent serves the operator, not the other way around. Every consequential action passes an approval gate. Every decision lands in an immutable audit log. Every guardrail is a runtime property — never an operator chore.

The runtime is the guardian. The operator is the principal.

A Guided Tour

Fourteen stops through the runtime.

01 / 14

01 · Meet CUST/OS

It lives on the edge of ATAK.

The NavBar sits on the left side of ATAK's main screen. ATAK itself keeps the full canvas behind it. No separate app, no context switch, no second window to alt-tab. Every surface — chat, audit, automations, settings — is a single tap away.

Runs as a plugin in ATAK's process, not alongside it.

Scroll to advance

Thesis I — Edge-First

Why edge-first matters

Five concrete reasons the device is the default, not the fallback.

Comms Denial Is the Rule, Not the Exception

In a contested environment the network is the first thing to fail — jamming, distance, terrain masking, EMCON, mesh saturation. An agent that depends on the cloud stops working at exactly the moment the operator needs it most. CUST/OS keeps reasoning. Voice still works. Tool calls still work. Automations still fire.

My agent works in the same conditions I work in.

Classification Boundaries Are Enforced

Every provider declares a maximum classification. The router refuses to send a query to a provider whose classification is below the operator's clearance. UNCLASSIFIED providers cannot receive SECRET context. Period.

I can use cloud providers for back-line analysis without ever risking classified leakage. The runtime is the guardrail.

Latency Is a Tactical Variable

A cloud round-trip is 1–3 seconds on a good day, 5–10 on a bad one, and forever on a denied one. A small local model on modern handheld hardware produces tool calls in a few hundred milliseconds. Voice → STT → reason → tool call → TTS happens in under two seconds end-to-end on a handheld device with no network in the loop.

My agent feels like a teammate because it answers at the speed of one.

Sovereignty Is Non-Negotiable

Every cloud LLM contract has logging, retention, third-party subprocessors, jurisdictional risk. CUST/OS sidesteps the entire problem by not requiring a cloud provider at all. Conversations, audit, vectors — all live locally on the device.

Nothing I say to my agent leaves my device unless I deliberately route it through a cloud provider.

The Cloud Is the Fallback, the Device Is Primary

CUST/OS is built device-first from the beginning, not retrofitted. Native inference shipped inside the APK — in-process LiteRT-LM via JNI and subprocess llama.cpp, whisper.cpp, and vision servers. Voice pipeline, hot-reloading skills from /sdcard, in-app code editor — every architectural choice lines up.

The runtime was designed for the conditions I actually fight in, not adapted to them after the fact.

Six Compute Tiers

Tier is trust. Priority is fallback order.

Every provider declares a tier — what kind of trust environment it lives in — and a taskPriority — what order to try it in. The two are orthogonal. Security modes filter by tier. The router sorts by priority. One config line can disable every cloud provider without touching a single priority number.

handheldFull operator trust

The operator's own device. Native subprocess servers running locally. No network involved. Nothing leaves the device.

"If my unit goes EMCON for 12 hours, my agent keeps working for 12 hours."

packFull operator trust, wired

On-person wired compute — Jetson Nano in a ruck via USB tether, Pi in a chest rig via Ethernet. No RF emissions. Bigger model than handheld, still on the operator's body. EMCON-safe.

"I carry a bigger brain in my ruck. Wired to my phone, no radio signature, stays with me when the squad's edge box is out of range."

mobileSquad-level trust

A companion edge device the squad carries — tactical edge brick, compute pack. Inside the squad's physical perimeter, but not on the operator's own device.

"When the squad's edge box is up, I get a bigger model without doing anything different."

mountedVehicle-crew trust

Vehicle-mounted compute with real cooling, real power, real GPU. Physically mobile with the unit. Gone when the operator dismounts.

"In the vehicle I get a vehicle-class model. When I dismount, the router quietly switches back."

command-postCross-trust-boundaryWIP

Back-line workstation reachable over the TAK mesh via split-ReAct. Reasoning crosses the mesh, actions stay local — both sides keep their trust boundaries. CoT delegation transport ships in the APK but has not been vetted end-to-end on a real multi-device deployment. Treat as a design commitment with working scaffolding, not a production-ready capability.

"The CP is the cloud. I don't need cellular. I don't need satcom."

cloudLowest trust

Internet-hosted provider. The wire goes through someone else's network, infrastructure, and jurisdiction. Bound by classification and the operator's clearance ceiling.

"When the network is good, I get cloud-grade reasoning. When it drops — automatic fallback, no reconfiguration."

security.mode

normalAll tiers
no-cloudhandheld → command-post
field-onlyhandheld → mounted
squad-onlyhandheld → mobile
emconhandheld + pack
standalonehandheld only

One line change. The router instantly drops every provider outside the allowed tier set.

yaml
providers:
  - name: on-device
    tier: handheld       # trust category
    protocol: litert
    model: gemma-4-E2B-it
    taskPriority: 1      # fallback order

  - name: ruck-jetson
    tier: pack           # wired, no RF
    protocol: openai
    url: http://127.0.0.1:8082
    taskPriority: 3

  - name: cloud-fallback
    tier: cloud
    protocol: anthropic
    model: claude-sonnet-4
    taskPriority: 100

security:
  mode: emcon  # only handheld + pack
               # everything wireless is gone

tier answers "what kind of thing is this?" taskPriority answers "what order should I try?" Both fields are required. Neither replaces the other.

Skills & Runtime

A runtime they can extend in the field

The APK ships with zero skills by design. The open-source starter kit (44 skills, 101 tools, MIT-licensed) is a reference library — clone it, fork it, or drop it in. The number that matters is whatever the operator writes next.

markdown
---
group: custos
name: markers
description: Place, find, and delete map markers
script_paths:
  - custos.markers/place_marker.lua
  - custos.markers/find_items.lua
  - custos.markers/delete_markers.lua
tags:
  - markers
  - map
  - navigation
examples:
  - "place a marker at 38.9, -77.0"
  - "drop a hostile marker"
  - "find all friendly markers"
---

# Markers

Tools for placing, finding, and querying markers on the ATAK map.

## Rules
- Confirm with the operator before deleting more than 5 markers.
- Use CoT type a-h-G (hostile), a-f-G (friendly), a-n-G (neutral).

A skill is a directory. SKILL.md declares metadata and docs the agent reads; the .lua scripts declare tools with LDoc annotations. Sandboxed, instruction-capped, scoped to an allowlist of ATAK APIs. Ship skills by sending a directory.

Hot-Reload on Save

Save a file in /sdcard/atak/custos/skills/ — the runtime picks it up. The next agent turn calls the new tool. No APK rebuild, no signing, no release cycle.

In-App Code Editor

Operators don't need a workstation. The full-screen tabbed editor has syntax highlighting (Lua, YAML, Markdown), find-in-file, save-and-review diff, and debug-mode landing on script errors.

Author by Asking, Test Before Shipping

The agent can write its own skills via custos.skill_creator — reflect over the ATAK class index, write the Lua, save it. Then run tests from the editor before you ship to the squad.

Automations Without the LLM Tax

Three triggers — Scheduled, Monitors (intervals), Events (ATAK broadcasts). Every automation runs as deterministic Lua. An interval firing every 15 seconds costs milliseconds, not a full ReAct loop. LLM reasoning is opt-in via an explicit delegate call — small on-device models are never hammered.

Delegation Is Explicit, Not Automatic

The orchestrator runs whatever chat provider has the lowest taskPriority — typically the on-device handheld model. It does not auto-route to the cloud because a query 'feels hard.' A specialist runs only when the operator (or an authored skill) explicitly calls delegate.

Thesis III — Operator Always in Command

A safety model with seven layers

Not a feature dump — the mechanical expression of one commitment: the agent does not act without the operator's authority.

01

Pattern-Matched Hooks

Hook rules in custos.yaml deny entire categories of tools, allow specific ones, or force approval on otherwise-routine actions. Tier-aware hooks fire only when reasoning at remote tiers — e.g., require approval for comms tools when using cloud.

02

Impact-Level Approval Gates

Tools at SIGNIFICANT impact or higher — SIGNIFICANT, STRATEGIC, LETHAL — cannot run without an approval dialog showing name, args, impact, and rationale. The operator picks Approve, Deny, or Modify (edit args inline before approving).

03

Sandbox Enforcement

Java package allowlist, method denylist, filesystem path scoping, instruction-count caps, concurrency limits. A bug or hostile script cannot do what the runtime does not allow.

04

Immutable SQLite Audit

Every tool call, approval decision, LLM call, delegation, and security event written to SQLite with UPDATE/DELETE triggers blocked. Pull with adb for after-action review.

05

Lockdown Modes & Classification

Six security modes — normal, no-cloud, field-only, squad-only, emcon, standalone — filter the active provider set to a tier subset with one config line. Per-provider classification declarations prevent classified context from reaching unauthorized tiers.

06

Encrypted Secret Store

API keys live in Android EncryptedSharedPreferences backed by the Android Keystore — never in YAML, never reachable from a Lua script.

07

Optional PKI Skill Signing

WIP

SkillSignatureVerifier and the VERIFIED / COMMUNITY trust split are designed to enforce signed skills when requirePki: true. Verifier and config surfaces ship; integration with the skill-load loop is not yet complete — treat as a design commitment, not a shipping feature.

Every layer exists so the operator stays in command. The runtime is the guardian; the operator is the principal.

Who Should Care

Built for the people doing the work

From the dismounted operator to the command post — and the engineers who need to ship capability without a release cycle.

Operators in Denied Environments

The whole agent loop runs on your device. When comms drop, the agent keeps reasoning. When you go EMCON, the agent keeps reasoning. The runtime was designed for your conditions.

Operators Handling Classified Data

Per-provider classification declarations and a clearance-aware boundary mean classified context cannot leak to a provider that shouldn't reach it. Configure the deployment with on-device-only providers and the trust boundary is the device itself.

Squad Leaders Needing Force Multiplication

Every action passes the approval gate. Every decision is in the immutable audit log. The agent is a teammate, not a black box.

Mission Planners Wanting Repeatable Playbooks

Composed Lua scripts — one skill calling another through tools.call — run the same way every time with no LLM tax for routine ops. Arm them as scheduled or event-triggered automations. Threat checks, route validation, comms diagnostics, mission preflight.

Commanders Running Multi-Tier Deployments

Configure specialist agents with protocol: cot providers and the orchestrator on a field device can delegate hard problems to a CP over the TAK mesh. The cloud you've always wanted is just the CP, and the network is just the mesh.

Operators on Tactical Android Hardware

Built for arm64-v8a on the standard tactical Android stack (PRC-style devices, ATAK-CIV phones, ruggedized tablets). Sandboxed native subprocesses — a crash in the inference server never takes down ATAK.

Security Reviewers Needing Hard Guarantees

Seven-layer security model, immutable SQLite audit, allowlist sandbox, encrypted secret store, classification boundary on every provider, plus a PKI skill-signing layer (scaffolded, not yet end-to-end).

Mission Engineers Shipping Capability Without Releases

Skills are data, not code. Drop a directory on a device and it works. Operator-authored skills live in the same runtime as vendor skill packs, with different trust levels enforced by the runtime.

What CUST/OS Is Not

The negative space matters too

These are choices, not gaps. Every "not" buys a property we care about.

Cloud-bound

Cloud is optional. Edge is primary.

Bundled with one model

The operator picks which model runs at each tier.

Bound to one vendor

Provider-agnostic. Switch with a config edit, no rebuild.

A general-purpose chatbot

The agent's job is tactical work.

A separate app

Runs inside ATAK as a plugin, in the same process.

Bundled with skills inside the APK

Skills live on disk and are operator-controlled.

A document RAG plugin

Vector store is for skill selection and lightweight knowledge.

A build-time customization

Every customization is data, not code — except the runtime itself.

Dependent on third-party API uptime

When a vendor goes down, the runtime falls back to whichever tier is healthy.

Every "not" buys a property we care about: edge sovereignty, offline capability, runtime extensibility, security posture, vendor neutrality, and the operator's right to run the agent against whatever model the mission can field.

The Thesis, Restated

The right place to run tactical AI is on the device the operator is fighting from — against whatever model the mission can field — with the operator always in command.

CUST/OS is available on the Google Play Store. Download, point it at your inference providers, and start building skills.