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.

8 min read • View on GitHub • More from tinyfish-io

A large instruction sheet labeled SKILL.md dominates a desk while a hand hovers over a terminal prompt and another hand types a shell command. A small tunnel opens from a laptop toward the public internet in the background, showing how instructions, execution, and exposure connect in one workflow.
TinyFish’s core move is simple: write the operating manual for the agent, then let the shell do the work.

AI feeding into other AI. So cool :)

Simantak Dabhade, Commenter · TinySkills post on LinkedIn
Key Takeaways

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.

A WSJ-style hedcut portrait of Simantak Dabhade based on a verified GitHub avatar. The portrait supports the article’s origin context by identifying a real contributor behind the repo.

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 skill file is not just input. It is the control plane for the agent’s next move.

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.

DimensionTraditional tunnel serviceTinyFish tunneling skill
Setup burdenSign up, install, authenticate, configureLoad the skill, run the command, get a URL
OrchestratorDeveloperAgent
InterfaceGeneric forwarding toolInstruction file plus shell procedure
Best fitManual endpoint sharingAgent-driven workflows with minimal ambiguity
Failure modeToo many knobsToo little friction
A close-up three-layer stack shows SKILL.md at the top, a shell prompt in the middle running curl and ssh commands, and a structured response or public tunnel endpoint at the bottom. A thin pipe links the command line to the output, showing how instructions become bounded execution and usable results.
The point is not command-line nostalgia. It is a controlled loop from instruction to shell to machine-usable output.

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 modelWho does the workWhat gets optimizedWhere TinyFish differs
API-first scrapingDeveloperMaximum controlTinyFish shifts control into skill files and shell procedures
Playwright or PuppeteerDeveloperBrowser automation flexibilityTinyFish optimizes for agent-run workflows, not imperative test code
ngrok-style tunnelingDeveloperPublic exposure of localhostTinyFish makes endpoint exposure part of an agent skill, not a standalone service
TinyFish skillsAgentLeast ambiguityThe 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.