Live web search, page retrieval, news, sitemap discovery, and trending topics through Search1API...
Live web research through the s1 command-line tool.
Every command in this skill runs through s1. Check that it is installed and
authenticated:
s1 balance
If the command is not found, install it:
curl -fsSL https://cli.search1api.com/install.sh | bash
Or via npm:
npm install -g search1api-cli
Then authenticate â prefer browser login, so no key is pasted into the conversation:
s1 login
Manual fallback:
s1 config set-key <your-api-key>
You can also set the environment variable SEARCH1API_KEY.
Do not install anything when s1 already works. To update an existing install,
the user can run s1 update â only suggest this when a command fails in a
version-related way.
If s1 is not found after installing, check that the npm global bin directory
is on PATH. npx -y search1api-cli <command> works as a fallback without any
install:
npx -y search1api-cli balance
Auth and credit errors are terminal. When a command reports an invalid key
or insufficient credits, confirm the state once with s1 balance, then tell the
user what is blocking and stop. Retrying the same command returns the same
error.
| User intent | Command |
|---|---|
| Shares a URL / link â read and summarize | s1 crawl <url> |
| Wants to search the web | s1 search "<query>" |
| Wants the full page behind a search result | s1 crawl <url> |
| Wants news | s1 news "<query>" |
| Wants to explore a site's links | s1 sitemap <url> |
| Wants trending topics | s1 trending <service> |
| Wants to check remaining credits | s1 balance |
| Wants an agent to keep a URL for later use | s1 learn <url> |
These look similar and are not:
s1 crawl. One page, answer now, nothing written to disk.s1 learn.
Produces an installable skill directory the user's agent can load later.--site pointed at its root â that
is the normal case, not an escalation. When it is genuinely unclear, run
--discover and show the user what a full run would cover.Adapt parameters to user intent â don't just use defaults:
-n 5, no crawl-n 15, then crawl top 3â5 results with separate s1 crawl calls-n-t day or -t month-s reddit, -s github, etc.--include arxiv.orggoogle, bing, wechat, or bilibili according to intents1 search "<query>" [options]
| Option | Description | Default |
|---|---|---|
-n, --max-results <N> |
Number of results (1â50) | 10 |
-s, --service <engine> |
Search engine | |
-c, --crawl <N> |
Crawl N results for full content | 0 |
--include <sites...> |
Only include these sites | |
--exclude <sites...> |
Exclude these sites | |
-t, --time <range> |
day, month, year | |
--json |
Raw JSON output |
Search engines: google, bing, duckduckgo, yahoo, x, reddit, github, youtube, arxiv, wechat, bilibili, imdb, wikipedia
s1 news "<query>" [options]
Same options as search. News services: google, bing, duckduckgo, yahoo, hackernews. Default service: bing.
When user asks for breaking/latest news, always add -t day.
s1 crawl <url>
Extracts clean content from a URL. Use this whenever the user shares a link.
s1 sitemap <url>
Returns all discovered links on a URL/domain.
s1 trending <service> [-n <N>]
Services: github, hackernews.
s1 learn <url> --name <name> [--site] [--exclude <paths...>] [--out <dir>]
s1 learn <url> --site --discover # list what would be learned; crawls nothing
s1 learn --from <dir> --install <global|project> [--name <new-name>]
s1 learn --refresh <dir> # relearn using the source and scope it recorded
s1 learn --validate <dir> # static checks on a learned directory
Turns a URL into an Agent Skill directory:
<name>/
SKILL.md # routing layer: when to use, what is in references/
references/*.md # page content with title/url frontmatter
references/sources.json # source URLs, hashes, and any pages that failed
| Option | Description | Default |
|---|---|---|
--name <name> |
Required. You choose it â see naming below | |
--site |
Learn everything under the URL's path, not just that page | off |
--discover |
With --site: print the section breakdown and stop |
off |
--exclude <paths...> |
Path prefixes to leave out, e.g. --exclude /docs/cloud |
|
--max-pages <N> |
Safety valve, not a knob to tune | 500 |
--out <dir> |
Where to write it | staging dir under the cache |
--from <dir> |
Install an already-learned directory (no crawl) | |
--refresh <dir> |
Relearn using the source, mode and --exclude it recorded |
|
--validate <dir> |
Report problems in a learned directory, exit 1 on errors | |
--install <scope> |
global (~/.agents/skills/) or project (./.agents/skills/) |
not installed |
--json |
Raw JSON output |
--site learns what lives under the URL you point at: the docs root gets
the whole set, /docs/api gets just that section.
One learn produces one skill, and one bundle per site is the default. Do not
split a documentation set you are meeting for the first time. Before crawling
you know only the URLs, and grouping pages by their slugs is a guess that goes
wrong on exactly the pages that matter: on umami's docs, links, pixels and
tags read like reporting features and are all instrumentation. What a page
actually covers is knowable only after it has been crawled â at which point you
already hold one complete bundle, and its routing table does the routing that
separate skills would have done.
Point --site at a single section instead of the root only when that section is
plainly its own job and you can already tell â a REST API reference under
/docs/api, an SDK under /sdk. When in doubt, take the whole set.
--discover crawls nothing; it only reads what the site publishes, so use it
to size a job before running it.
--discover gives you paths, not titles, and titles are what tell you whether a
bundle is one job or four. When a site is unfamiliar, learn it under a working
name, read the titles in references/sources.json, then rename on install:
s1 learn --from <staged dir> --name <real-name> --install global
That rewrites the folder, the frontmatter and sources.json together, and warns
you if the body still mentions the old name.
s1 learn will not invent a name â it has only the URL, which is the one thing
that should not decide the name.
The hard rules are just the shape: lowercase kebab-case, 64 characters or fewer,
starting with a letter, and the folder basename must equal the frontmatter
name. --validate checks those.
Everything else is judgement, and the user's judgement wins. Reuse the prefix of
related skills they already have (ls ~/.agents/skills). Think about what else
might live alongside it: umami-docs is a good name precisely when a separate
skill about analytics practice could exist for the same product, and
hono-build-api is a good name when nothing else will. Ask the user if two
readings are both defensible â they know what their skill library looks like.
The generated SKILL.md is a deterministic skeleton â no model writes it.
Replace the placeholder description with real trigger wording, and turn the page
list into a task-to-page routing table so the reader knows which file answers
which question. Until that description is rewritten the skill will not be
selected by an agent, and --validate fails on it.
Read the pages you need. Deciding what a section contains, what to exclude, what to call the skill, and what to put in the routing table all require knowing what is actually in the files â the URLs alone will mislead you. What to avoid is dumping the corpus into the conversation: read the pages that inform a decision, not all of them.
State no fact you have not read. The moment you write a concrete claim â a
header name, a base URL, a flag, a limit â open that reference file first and
cite it (Source: references/<file>.md). Writing API details from memory into a
skill whose whole purpose is to be sourced is the one failure this command
cannot survive.
Relearning the same URL rewrites references/, reports what changed, and keeps
a SKILL.md you have edited while refreshing its reference table in place.
s1 balance
Shows remaining API credits.
s1 search "<topic>" -n 15 for broad resultss1 crawl <url> on the top 3â5 relevant pagesNothing lands on disk until the user confirms, and nothing is installed until it is worth installing. Work in this order â scope decides coverage, coverage decides the name and the description, and all of that has to be settled before anything is installed.
Plan
--site, pointed at the docs root. Point at a single
section instead only when the user asked for that section, or when that
section is plainly its own job.s1 learn <url> --site --discover --json â crawls nothing, returns the
section breakdown and every URL it would learn.s1 learn <url-of-that-section> --site --discover. umami's
/docs/guides is 33 pages of which 21 are hosting guides and 11 are core
how-tos for tracking outbound links, form submissions, SPAs and server-side
events â excluding it wholesale silently drops those. When a section is
mixed, either keep it or exclude the individual pages.ls ~/.agents/skills before naming. If something for this product already
exists, compare the job, not the name: the same job means refresh that
skill instead (step 10), a different job means the two names must say which
is which. Then choose the name (see naming above) and report the plan to the
user: name, sections, page count, and what you are excluding.Learn and author
s1 learn <url> --site --name <name> [--exclude <paths...>] --json. It writes
to a staging directory and installs nothing.SKILL.md in the staging directory, before installing:s1 learn --validate <staging dir> and fix what it reports.Install
~/.agents/skills/), in this project (./.agents/skills/), or leave it
staged for now.s1 learn --from <staging dir> --install <global|project> â no further requests. Add --name <name> here to settle
on a different name; it rewrites the folder, the frontmatter and
sources.json together. Installing also links the skill into the agent
directories that already exist beside the store, and the output names them â
read that line, because a skill in the store that no agent is linked to is
invisible. Run s1 learn --validate <installed dir> afterwards too â if you
renamed on install, the installed copy is the only place the folder name and
the frontmatter can be checked against each other.Maintain
s1 learn --refresh <dir> relearns from the source, mode and
--exclude it recorded â no arguments to remember. Pass --exclude to
change the scope, and it is recorded for next time. A refresh rewrites
references/, keeps a SKILL.md you have edited while refreshing its
reference table in place, and reports what was added, changed or removed. If
the scope changed, update the description to match â a description that
still claims a section was excluded after you added it back is worse than no
description.references/sources.json. Name them to the user rather than letting the
skill look complete, and note that --refresh will try them again.s1 crawl <url> â get the page contents1 trending github -n 10 â discover hot topicss1 search "<interesting topic>" -t day â search for detailss1 crawl <url> â read full article if needed--json for
programmatic processing.