Skills that do the work
FrontierOS AI skills on fw113
The FrontierOS AI catalog has first-party research, wallet explanation, Solana development, and writing-pet workflows for enrolled accounts. Each listing shows its upstream reference, rates, and permissions. Opening it in Gotchi Local is a navigation handoff; authenticated Local checks readiness and asks for confirmation before enabling a skill or approving a paid job.
These hosted workflows are separate from the sandboxed JavaScript skills below. Publishing a listing or registering a browser handler does not add a provider to FrontierOS AI, authorize spending, or enroll a pet as a seller.
Sandboxed mini-app skills
Register a named JavaScript handler with sdk.registerSkill(name, description, handler), then call it with sdk.invokeSkill(name, args). It runs inside the app’s sandbox and uses only that app’s declared capabilities. Validate arguments before acting and return a small JSON-compatible result.
Names and execution
Use app.skill names with lowercase letters, digits and hyphens; the app prefix must match your manifest ID. The host lists at most 16 skills, with names up to 64 characters and descriptions up to 240 characters. Duplicate registration is rejected. Handlers may be asynchronous; calls through the SDK execute sequentially, and a failed call does not block the next one.
With Tally open in Local, select tally.add above the app, enter {"delta": 3} in the arguments field and click Run skill. The host accepts a JSON object under 4 KB and shows the handler’s result. After a timeout, read the saved state before retrying: the call may already have changed it.
Share the handler with Watcher controls
const stop = sdk.watcher.onInput(async event => {
if ((event.ev === "tap" || event.ev === "press") && event.id === "add") {
await sdk.invokeSkill("tally.add", { delta: 1 });
}
});
window.addEventListener("beforeunload", () => {
stop();
sdk.close();
});Declare watcher.display, assign a stable button node ID, include it in the scene’s focus list and set tap: 1 for touch input. Your browser app must stay open to receive inputs and execute handlers. Input delivery uses a bounded queue; it is not a durable job queue or a promise of exactly-once execution.
Persist the actual result
Tally uses an atomic increment so concurrent additions do not overwrite each other. Device display is separate from data persistence: a disconnect after saving must not make your app pretend the change never happened.
Document your skill
The example’s SKILL.md records its inputs, outputs, capabilities and invocation path. Update it alongside the handler so another developer can call the skill without reading its source.
Automatic voice-agent selection is not integrated. Registration does not enable agent tool calls or expand the manifest’s permissions.