How Skills Are Loaded and Shared
CUST/OS loads skills from /sdcard/atak/custos/skills/. They are installed separately from the APK, so you can change the available tools without rebuilding the plugin.
What this means
The APK provides the Lua sandbox, tool registry, inference router, and approval gate. Each skill has a directory containing SKILL.md and .lua files. Add a directory to install a skill, or save an existing file to update it. The runtime watches for changes and reloads the affected skills.
The open-source starter kit includes skills you can use or adapt. Its install.sh copies them to the skills directory. You can remove, replace, or add skills there.
Working with external skills
Update tools in the field
You can adjust marker placement, report formats, or other scripted tasks in the in-app editor. Review and test the changes on the device before using the updated tool. Only changes to the plugin runtime require a new APK.
Inspect installed skills
Run ls /sdcard/atak/custos/skills/ to see the installed skill directories. Read their manifests and Lua files to review their tools and behavior. A deployment review should also include the runtime configuration, permissions, and providers.
Skills can ship without the plugin
Share a skill by sending its directory and installing it under /sdcard/atak/custos/skills/ on another device. Check its dependencies and test it against that device's configuration before use.
Sandbox restrictions
Lua skills run inside a sandbox with:
- Java package allowlist
- Method denylist
- Filesystem path scoping
- Per-execution instruction limits
- Concurrency limits
- PKI signing hook (WIP — the verifier exists but is not yet called from the skill loader, so
security.requirePkiis a declared intent rather than enforced behavior in this release)
These restrictions apply to script execution regardless of the skill's source. Publisher signature checks and the associated trust levels are not yet enforced by the skill loader.
The agent can write skills
The custos.skill_creator skill includes tools that let the agent author new skills at runtime. The agent reads the SKILL.md format, introspects ATAK Java APIs, writes a Lua file, and the runtime hot-reloads it. The new tool is callable on the next turn.
Tradeoffs
- Performance -- benchmark scripts that perform large calculations or tight loops on the target device.
- Tooling -- Lua has no compile-time type check. LDoc annotations and runtime validation catch some errors; tests are still needed.
- Discovery -- the agent must be told what skills exist. The skill selector (keyword + semantic matching) picks 1-3 relevant skills per turn.
Distribution patterns
Keeping skill code outside the APK supports several ways to distribute it:
- Vendor-supplied skill packs -- intended to be signed with a publisher key and verified via
security.requirePki(WIP — signature verification path is not yet wired into the loader) - Mission-specific skill loads -- the same plugin can run a different skill set for different missions by changing the directory contents at deploy time
- Per-classification skill loads -- operators with different clearance levels can have different skills available without different APKs
- Community skill libraries -- operators can share skills as zip files, no build chain needed