Pipe text through LLMs from the terminal. Pattern-based prompts, streaming output, plugin ecosystem.
go install hop.top/foo@latestRequires Go 1.26+. Set a provider key:
export ANTHROPIC_API_KEY=sk-...
# or
export OPENAI_API_KEY=sk-...foo "hello"
# [foo] info: seeded default pool config at ~/.config/hop/llm.yaml; edit to taste.
# Hello! How can I help you today?If that prints a model response, you are done. If it errors, read docs/troubleshooting.md.
The first run seeds a default pool — a list of models foo picks
from based on what each request needs. The balanced tier is the
default; switch with --budget cheap for cheaper, faster picks
or --budget premium for the most capable. Full tour:
docs/how-to/route-across-models.md.
| I want to... | Read |
|---|---|
| Understand what foo is | docs/concepts.md |
| Try foo in 5 minutes | docs/quickstart.md |
| Embed content for semantic search | docs/how-to/embed-content.md |
| Search across embedded content | docs/how-to/search-semantically.md |
| Manage reusable prompt fragments | docs/how-to/manage-fragments.md |
| Manage named system prompts (patterns) | docs/how-to/manage-patterns.md |
| Manage structured-output schemas | docs/how-to/manage-schemas.md |
| Apply chain-of-thought + other strategies | docs/how-to/use-strategies.md |
| Switch or default a model | docs/how-to/configure-models.md |
| Route across models (pool + --budget, fallback chain, RouteLLM) | docs/how-to/route-across-models.md |
| Run destructive commands in scripts | docs/how-to/confirm-destructive-ops.md |
| Upgrade foo in place | docs/how-to/upgrade-foo.md |
| Install and use plugins (youtube, scrape, custom) | docs/how-to/use-plugins.md |
| Write a new plugin (subcommand or LLM tool) | docs/how-to/write-plugins.md |
| Look up the exact flag, command, or value | docs/reference/commands.md |
| Look up a config key or env var | docs/reference/config.md |
| Look up the schema DSL grammar | docs/reference/schema-dsl.md |
| Check compatibility + deprecations | docs/reference/compatibility.md |
| Something broke | docs/troubleshooting.md |
foo discovers extension binaries on $PATH: any executable named
foo-<name> is callable as foo <name>. Tool-call extensions follow
the foo-tool-<name> convention.
Available first-party plugins:
| Plugin | Install | Purpose |
|---|---|---|
foo youtube |
go install hop.top/foo/cmd/foo-youtube@latest |
YouTube transcripts (needs yt-dlp) |
foo scrape |
go install hop.top/foo/cmd/foo-scrape@latest |
URL to markdown |
Plugins emit markdown on stdout, pipeable into foo:
foo youtube "https://youtube.com/watch?v=xxx" | foo -p summarizeAll plugins support --ext-info for discovery metadata. Full
walkthrough: Use plugins.
See LICENSE.
Maintained by jadb.