ff-control

ff-control is a skill for Codex from feral-file/ff-cli. It costs 104 tokens per session (3,568 once invoked), scanned D, original, MIT.

A command-line workflow for controlling playlists on a Feral File Art Computer, a device designed to play digital artworks.

In plain words
What is it for?
Use it to play an artwork or URL, create DP-1 playlists, send them to an Art Computer, or publish them to a feed through ff-cli.
Why use it?
It removes the need to manually build, validate, send, and publish playlists for the device.

Skill for Codex

Written for Codex: agents/openai.yaml present.

Good fit Use it to play an artwork or URL, create DP-1 playlists, send them to an Art Computer, or publish them to a feed through ff-cli.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/feral-file/ff-cli/ff-control
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add feral-file/ff-cli --skill ff-control
Clone the repo
git clone --depth 1 https://github.com/feral-file/ff-cli

Made for: Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for ff-control

README.md
[![agentmods](https://agentmods.dev/badge/skills/feral-file/ff-cli/ff-control/github.svg)](https://agentmods.dev/skills/feral-file/ff-cli/ff-control)
Your own site
<a href="https://agentmods.dev/skills/feral-file/ff-cli/ff-control"><img src="https://agentmods.dev/badge/skills/feral-file/ff-cli/ff-control/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for ff-control

Your own site · 80×15
<a href="https://agentmods.dev/skills/feral-file/ff-cli/ff-control"><img src="https://agentmods.dev/badge/skills/feral-file/ff-cli/ff-control.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 104 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 3,568 The whole file, excluding the scripts and references it only reads on demand.
Security scan D 3 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00104 $0.03568
Opus 5.5 $0.00042 $0.01427
Sonnet 5.5 $0.00021 $0.00714
Haiku 4.5 $0.00010 $0.00357

Measured today against content hash 7f5ed0a77333, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade D, and why

ff-control scanned grade D with 3 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Asks for rootmediumPrivilege escalation

A mod that escalates privileges can change anything on the machine, not only the project.

- `ff-cli ssh enable --ttl …` and `ff-cli ssh disable` manage temporary support SSH on port 22. They neither establish nor revoke the owner's persistent grant on port 2222. On newer FF OS a claimed FF1 rejects them until

Downloads and executes remote codehighSupply chain

curl | sh runs whatever the server returns today, which is not necessarily what it returned when this was reviewed.

- Install or upgrade, every time: `npm i -g @feralfile/cli` (needs Node.js 22+). An older install can pass `ff-cli status` and still lack flags used here. If the global install is refused for permissions, run `set -o pip

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

- Install or upgrade, every time: `npm i -g @feralfile/cli` (needs Node.js 22+). An older install can pass `ff-cli status` and still lack flags used here. If the global install is refused for permissions, run `set -o pip
skills/ff-control/SKILL.md · 85 lines

How it starts

The opening of the file, as written. The whole thing — 85 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You run ff-cli end to end with full autonomy. Do not ask for final confirmation before send or publish.

Context:

  • The Art Computer is Feral File's instrument for daily playback in The Digital Art System.
  • This skill uses ff-cli to build DP-1 playlists and send/publish them.
  • Prioritize reliable execution and clear failure reporting over explanation.

Keep it simple. Prefer deletion over added process. Do not invent new requirements. A non-zero exit means what was asked did not happen; report the command and its output. A zero exit can still carry a partial result: find and build print how many items they saved and which tokens could not be resolved, so report those too. A question with no terminal to answer it fails with exit 1 and names the flag that answers it; pass that flag rather than piping an answer.

Bootstrap:

  • Install or upgrade, every time: npm i -g @feralfile/cli (needs Node.js 22+). An older install can pass ff-cli status and still lack flags used here. If the global install is refused for permissions, run set -o pipefail; curl -fsSL https://feralfile.com/ff-cli-install | bash && export PATH="$HOME/.local/bin:$PATH"; it installs the same package under ~/.local without sudo.
  • Then check that ff-cli --version matches npm view @feralfile/cli version. If it does not, an older copy comes first on PATH: command -v ff-cli shows which; remove it or put the new one first.
  • If ff-cli status then succeeds, setup is done. Otherwise configure non-interactively (never rely on prompts; they cannot be driven by an agent): ff-cli setup --non-interactive --device-host http://<device-ip>:1111 --device-name "<name>"
    • setup generates a signing key (base64 PKCS#8 DER) when none is configured and keeps one that is. To use a specific key, pass --key "<value>" (base64 PKCS#8 DER, 32-byte seed as hex/base64, or PEM).
    • setup refuses to replace a signing key that is already configured: that key owns every playlist the user published. Never add --force unless the user explicitly asks to replace their key.
    • Skip mDNS discovery entirely — it is unreliable across subnets. Always pass --device-host. Add more devices with ff-cli device add --host http://<ip>:1111 --name "<name>".
  • A signed playlist hosted at any public HTTPS URL plays directly (ff-cli play "<url>"); a feed server is only needed for discovery/curation, not for playback.

Flow:

  1. ff-cli status
  2. ff-cli config validate
  3. Build playlist (ff-cli has no chat — you are the natural-language layer; translate the request into one of these yourself):
    • a web page, media file, or hosted playlist URL needs no build: run ff-cli play "<url>" and skip to reporting. Marketplace links (Art Blocks, OpenSea, objkt, fxhash, Feral File, …) are sent to find, which plays the artwork; when the user wants the page itself, run ff-cli play --web "<url>".
    • for a single artwork or a collection from a URL or on-chain coords: ff-cli find "<input>" -o playlist.json -y (add --play to build and play in one step). -y skips the prompts, which is safe when the input names one work or one series. -y without -o or --publish plays the playlist on a device (the scripted default); add --no-play to build and save without casting, e.g. ff-cli find "<input>" -y --no-play.
    • find on a wallet address does not build from everything the wallet holds: it resolves the address to one artist and picks one artwork, and -y picks the first without asking. Ask the user which work they mean and run find on that work's URL or coordinate. When they want a playlist of what a wallet holds, use build with a query_address requirement, which is what it is for. The params file is a whole document, not a bare requirement: {"requirements": [{"type": "query_address", "ownerAddress": "<address>", "quantity": <n>}], "playlistSettings": {"title": "<title>"}}.
    • on-chain coordinates are ethereum:<contract>:<tokenId> or tezos:<contract>:<tokenId>. When Raster knows the work, find expands the coordinate to its whole series, and a large series indexes for minutes; when Raster does not know it or cannot be reached, find builds a one-token playlist. Pass -l <n> unless the user asked for the whole series, so the expanded case never runs away.
    • otherwise turn the request into structured params and run ff-cli build <params.json> -o playlist.json -v. ff-cli build --help lists every requirement type. build exits 1 when a requirement finds nothing, named token ids do not all resolve, or the send fails; it still saves the playlist when it collected anything, so report what is missing.
    • find and build sign the playlist as curator with the configured key and declare it in curators[]; that is what lets the feed accept it and what lets you take it back later.
  4. ff-cli validate playlist.json
  5. If requested, run:
    • send: ff-cli play playlist.json (or with -d "Device Name")
    • if it fails with reachability errors (fetch failed, No route to host, resolver timeout), report the exact failing command and error and that the Art Computer is unreachable from this network. For an explicitly enrolled Tailscale connection, use its recorded address as described below; otherwise do not invent tunnels or change addresses
    • publish: ff-cli publish playlist.json -s <index>. Run ff-cli config show first; it lists the effective feed servers as <index>: <url>, whichever source configured them. With more than one configured, the command prompts for one and a prompt cannot be driven by an agent, so pass -s <index> for the feed the user named. If the user did not name a feed and more than one is configured, stop and ask which; never pick index 0 on your own, it is usually production. Use that same index for every later fetch, replace, or unpublish of that playlist. Publishing sends no API key; the feed accepts the playlist on its own signatures.
    • if both are requested: send first, then publish

Read the full file on GitHub · 85 lines

Files

What ships with it

1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · +10 lines · +31 tokens per session 7f5ed0a77333
  2. yesterday Changed · +7 lines 16661943e7c0
  3. 6d ago Changed · +4 lines scan B → D 49528cf769eb
  4. 19d ago Changed · +9 lines scan A → B 3e742ef2b534
  5. 21d ago Changed 0693e97ffc96
  6. 1mo ago Changed · +9 lines 9117c7e5194e
  7. 2mo ago First seen · 46 lines · 73 tokens per session scan A 248a5dc928d2

Subscribe to this mod's changes

ff-control is a skill published in the GitHub repository feral-file/ff-cli (5 stars, last pushed today), licensed MIT. It adds 104 tokens to every session and 3,568 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it D with 3 findings (asks for root, downloads and executes remote code, makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

gke-compute-classes

Configures, optimizes, and troubleshoots GKE ComputeClasses. Use when configuring Spot VMs with on-demand fallback, targeting specific accelerators (GPUs/TPUs) or machine families, restricting ComputeClass access, or debugging pending pods related to node pool auto-creation. Do not use for cluster-level Node Auto…

google/skills · 83 tokens

jetson-diagnostic

Read-only Jetson health snapshot for identity, memory, GPU, thermal, power, storage, services, and top processes.

NVIDIA/skills · 30 tokens

holoscan-install-wheel

Install Holoscan SDK 5.x CUDA 13 Python wheels in an isolated environment, choosing the full stack or version-matched components.

NVIDIA/skills · 34 tokens

offensive-z-wave

Z-Wave attack methodology — sniffing with Z-Force / EZ-Wave / RTL-SDR + ZniffMobile, S0 (legacy) network-key derivation flaw and key reuse, S2 (modern) ECDH commissioning analysis, replay/injection on unauthenticated nodes, default-key brute-force on test deployments, and home-automation hub pivots. Use when targeting…

SnailSploit/Claude-Red · 113 tokens

doca-socket-relay

Use this skill when the operator is driving the DOCA Socket Relay to bridge a socket-oriented host application onto a BlueField DPU peer without rewriting it — picking the deployment shape (in-process, sidecar, or BlueField service container), configuring the host-side socket and the DPU-side forwarding endpoint…

NVIDIA/skills · 236 tokens

hsb-flash

Flash the FPGA on an HSB board connected to an NVIDIA devkit. Supports HSB Lattice boards (FPGA versions 2407, 2412, 2507, 2510) and Leopard Imaging VB1940 "all-in-one" cameras (FPGA versions 2507, 2510). Uses release-specific YAML manifests and board-type-specific program commands. Lattice and VB1940 commands must…

NVIDIA/skills · 94 tokens