tinyfish-io/skills: The Repo That Turns AI Agents Into Shell Operators
A look at how TinyFish uses SKILL.md, SSH tunneling, and hardened Bash tooling to make LLMs behave like reliable infrastructure clients.

AI feeding into other AI. So cool :)
- TinyFish treats markdown as an operational contract for agents, not documentation for humans.
- The repo’s most distinctive move is to use the shell as the execution surface, then constrain it with pre-flight checks and repeatable commands.
- SSH tunneling becomes more than a networking trick here. It becomes a zero-friction product primitive for agents that need a public endpoint.
- The security tooling matters because the repo assumes agents will run real commands in real environments, so determinism is part of the interface.
The real product is the manual
The surprise in tinyfish-io/skills is not that it can scrape the web or expose localhost. It is that the repo behaves like a manual written for an AI operator. The centerpiece is SKILL.md, which gives the agent a procedure, a guardrail set, and a command pattern to follow.
That matters because it changes the integration model. Instead of asking a developer to wire up callbacks or learn a bespoke SDK, TinyFish asks the agent to read instructions, run shell commands, and keep going. The repo is less a library than a disciplined workflow template.
Why SKILL.md is a better abstraction than a custom SDK
A custom SDK usually optimizes for developers. SKILL.md optimizes for an agent that needs to act without drifting. The difference is subtle but important: the file does not just describe what to do, it narrows how to do it.
The repo’s pattern is simple, but the effect is strong. Pre-flight checks catch missing secrets. Command templates reduce improvisation. Bad examples show the agent what not to do, while good examples constrain it toward deterministic execution.
That is why the shell is the right runtime here. It is ubiquitous, inspectable, and easy to harden. A model can reason in natural language, but the final step still needs a precise operational surface. TinyFish puts that surface in Bash.
The tunnel is the second product
The tunneling skill deserves to be treated as a product, not a utility. It turns reverse SSH forwarding into a fast path from localhost to a public endpoint, which is exactly the kind of thing an agent needs when it has to surface a working app or demo quickly.
| Dimension | Traditional tunnel service | TinyFish tunneling skill |
|---|---|---|
| Setup burden | Sign up, install, authenticate, configure | Load the skill, run the command, get a URL |
| Orchestrator | Developer | Agent |
| Interface | Generic forwarding tool | Instruction file plus shell procedure |
| Best fit | Manual endpoint sharing | Agent-driven workflows with minimal ambiguity |
| Failure mode | Too many knobs | Too little friction |
Hardening the agent’s shell
The repo’s maturity shows up in the unglamorous parts. Secret generation, secret scanning, Semgrep, OSV scanning, and pinned golden images all point to the same assumption: an agent will run commands in the wild, so the environment must be controlled as tightly as the prompt.
That is the real architectural posture. TinyFish is not pretending the shell is safe by default. It is wrapping the shell in checks, image policy, and reproducible infrastructure so that agent behavior stays predictable when the workflow gets messy.
# Representative hardening pattern
set -euo pipefail
if [ -z "${TINYFISH_API_KEY:-}" ]; then
echo "Missing TINYFISH_API_KEY"
exit 1
fi
curl -sS \
-H "Authorization: Bearer $TINYFISH_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"goal\":\"...\"}" \
https://api.tinyfish.ai/...
Why this feels different from ngrok, Playwright, or an SDK
The comparison is useful because TinyFish borrows from all three categories while fully belonging to none of them. It is not trying to out-browser Playwright, out-tunnel ngrok, or out-abstract a purpose-built SDK. It is trying to make the agent the orchestrator and the repo the rulebook.
| Tooling model | Who does the work | What gets optimized | Where TinyFish differs |
|---|---|---|---|
| API-first scraping | Developer | Maximum control | TinyFish shifts control into skill files and shell procedures |
| Playwright or Puppeteer | Developer | Browser automation flexibility | TinyFish optimizes for agent-run workflows, not imperative test code |
| ngrok-style tunneling | Developer | Public exposure of localhost | TinyFish makes endpoint exposure part of an agent skill, not a standalone service |
| TinyFish skills | Agent | Least ambiguity | The repository supplies bounded behavior, security, and command structure |
That is why the repo feels more opinionated than the category labels suggest. It is not chasing flexibility. It is chasing reliability under agent control. In practice, that can be the bigger win.
What this repo says about the next layer of agent tooling
The broader lesson is that the next useful interface layer for agents may not be another prompt trick. It may be a set of machine-readable playbooks that combine instructions, checks, and narrow capabilities. TinyFish points toward that future without dressing it up as something more magical than it is.
That restraint is the strongest signal in the repo. The shell is old. SSH is old. Markdown is old. But the combination creates a newer kind of interface: one where an LLM can act like a reliable operator because the environment was designed to make that possible.





