Skills are markdown files that act as the agent's persistent memory. The reserved general skill is always shared with the agent — put your standing preferences, context, and defaults there. Every other skill is listed to the agent by name and description; when one matches the task at hand (a site's quirks, a workflow recipe), the agent reads it before working, and on its final review pass it can save what it learned back with rtrvr.saveSkill.
Skills are the only memory that survives a task. vars last one task, sheets hold one deliverable, recordings replay one flow — a skill is what the agent still knows next week.
What a skill file looks like
A skill is plain markdown with optional YAML-style frontmatter. Write it however you like — headings, bullets, code blocks — the agent reads the raw text. name and description are the only special fields, and both are optional when you create a skill in the UI.
---
name: linkedin-outreach
description: How I run LinkedIn connection + follow-up campaigns, and LI's UI quirks.
---
## Rules
- Never send more than 20 invites per day.
- Always personalize the note with the prospect's most recent post.
## Site quirks
- The "Connect" button is behind the "More" overflow menu on most profiles.
- The invite-note modal caps at 300 characters and silently truncates.
## Output
- One row per prospect: name, headline, profile URL, note sent, date.Uploading a .md file with that frontmatter creates the skill with the right name and description; without frontmatter the file name becomes the skill name. A skill's id is the slugified name, so saving LinkedIn Outreach again updates linkedin-outreach rather than creating a duplicate.
The general skill
general is reserved: it is injected into every task in full, so it is the right home for anything that is true across all your work. It is created for you automatically with a short starter template — three sections to fill in:
- 01
About me — role, company, the sites and tools you work in. Lets the agent resolve "our CRM" or "the usual sheet" without asking.
- 02
Preferences — standing defaults: sheet vs. summary output, tone, language, units, timezone, sources to prefer or avoid.
- 03
Notes the agent has learned — where the agent appends what it picks up on its review pass. Edit or delete anything there; it is your file.
Managing skills
- 01
Extension: the Skills dropdown in the composer lists your skills — click one (or type
/name) to attach it in full to the next task, upload.mdfiles, and jump to the web editor with the pencil or by typing a new name + Enter. - 02
Cloud: rtrvr.ai/cloud?view=skills is the full library and the editor — live markdown preview, upload or drag-and-drop
.mdfiles, and per-skill delete. - 03
Agent-written updates are marked
agentin both UIs, so you can always see and revise what the agent taught itself.
Storage is local-first in the extension (skills work offline) and mirrors to your account as one file per skill, newest-write-wins. Edit on the web and the extension picks it up on its next sync; let the agent save one mid-task and it is on the web dashboard immediately.
Attaching a skill to one task
Named skills are normally summoned by the agent on demand. When you want to guarantee one is applied, attach it — attached skills are injected in full, at the same authority as general, for that task only:
- 01
Click the skill's row in the Skills dropdown — it shows an
attachedbadge and a pill above the composer. Click again to detach. - 02
Type
/skill-namein the composer. Sending/linkedin-outreachalone just attaches it;/linkedin-outreach find 20 prospectsattaches it and runs the task. - 03
Shortcuts win
/namecollisions — if a shortcut and a skill share a name, the shortcut runs. Rename one to disambiguate.
How the agent sees your skills
Your skills are snapshotted once per message and rendered into the task context like this — the general skill and any attached skills in full, everything else as a one-line listing:
=== User Skills ===
--- Skill: general (always applied) ---
## Preferences
Default to a Google Sheet for anything over 10 rows.
--- End skill ---
--- Skill: linkedin-outreach (attached by the user for THIS task — apply it) ---
## Rules
Never send more than 20 invites per day.
--- End skill ---
Other skills (read on demand with rtrvr.readSkill({ name })):
- hubspot-sync — How our HubSpot deal stages map to the pipeline sheet.
- expense-report — Monthly expense report format and the receipts folder.How the agent uses skills
- 01
await rtrvr.readSkill({ name })— read one skill's full markdown (free, no LLM call). The result is file-shaped, so plans can hand it to sub-agents viafileInputs. - 02
await rtrvr.saveSkill({ name, description?, content })— create or replace a skill (content ≤16K chars). The agent is taught to fold the smallest durable edit into the existing markdown, never secrets or one-off task data.
Saves REPLACE the whole file, so the agent is instructed to readSkill first and merge. It writes on the review pass — the same script that finishes the task — and only when something durable was learned: a fact you stated about yourself or your setup, a corrected preference, a site quirk that cost a repair pass, a recipe you refined. Most tasks teach nothing durable and save nothing.
It also decides WHERE the note goes: facts about you and how you work (your role, company, the accounts and sheets you name, a standing format or tone choice) go into general; knowledge scoped to one site, tool, or recurring workflow goes into its own named skill — created on the spot when nothing fits, named <domain>-<activity> like linkedin-outreach or hubspot-sync. You will see new skills appear in the library marked agent.
// The agent's own write-back pattern, in the final plan script.
const existing = await rtrvr.readSkill({ name: "linkedin-outreach" }).catch(() => null);
await rtrvr.saveSkill({
name: "linkedin-outreach",
description: "How I run LinkedIn outreach, and LI's UI quirks.",
content: `${existing?.extractedText ?? "## Site quirks"}
- Invite modal caps notes at 300 chars.`,
});
return rtrvr.done({ summary: "Sent 20 invites; noted the 300-char cap." });Limits
| Limit | Value | Notes |
|---|---|---|
| Skill name | 64 characters | Slugified into the skill's id |
| Description | 256 characters | The retrieval key — make it a concrete one-liner |
| Content | 16,384 characters | Roughly 4K tokens of markdown per skill |
| Skills per account | 100 | Delete unused skills to make room |
| Injected block | 64,000 characters | General + attached skills + the listing, per task |
Skills vs. the other memory
| Use | When | Lifetime |
|---|---|---|
| Skill | Knowledge that should change how FUTURE tasks run | Permanent, across tasks |
| Shortcut | A task you re-run with the same steps on demand | Permanent, replayed verbatim |
| Recording | Grounding the agent in an exact DOM flow you demonstrated | Permanent, per flow |
vars | Expensive intermediates reused by the next pass | One task |
| Sheet / artifact | The deliverable itself | One deliverable |
Getting reliable retrieval
- 01
Write descriptions for matching, not for humans. Name the sites, tools, and nouns a matching task would mention.
- 02
One skill per topic. A single 16K "everything" file is listed with one description and matches almost nothing; five focused skills each match their own tasks.
- 03
Attach it when it must apply. Retrieval is a judgment call the model makes —
/skill-nameremoves the judgment and injects the file in full. - 04
Put cross-cutting rules in
general. It is the only skill that never depends on retrieval. - 05
Smaller models retrieve less. Lightweight models (Inkling Small, MiMo, Flash-class) follow instructions that are in front of them but summon fewer optional resources on their own. Attach the skill explicitly — or run those tasks on a larger model — and keep
generaltight so the rules that matter are always in context.
MCP access
Skills are exposed on the rtrvr MCP server both as tools (list_skills, get_skill) and as MCP resources (rtrvr-skill://{id}, text/markdown) — so Claude, Cursor, or any MCP client can read the same memory your agent uses. Cloud-only: no extension session required.