Sanity Copilot eve Template is a Slack-based assistant that lets team members query and edit Sanity content, inspect schemas, manage drafts and releases, and send long-form drafts to Notion. Teams use it to work on Sanity projects through Slack with each person's permissions and approval controls for sensitive actions. The catalogue add-ons support this agent workflow.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add vercel-labs/sanity-copilot-eve-template --skill portable-text-conversiongit clone --depth 1 https://github.com/vercel-labs/sanity-copilot-eve-templateWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/vercel-labs/sanity-copilot-eve-template/portable-text-conversion)<a href="https://agentmods.dev/skills/vercel-labs/sanity-copilot-eve-template/portable-text-conversion"><img src="https://agentmods.dev/badge/skills/vercel-labs/sanity-copilot-eve-template/portable-text-conversion/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/vercel-labs/sanity-copilot-eve-template/portable-text-conversion"><img src="https://agentmods.dev/badge/skills/vercel-labs/sanity-copilot-eve-template/portable-text-conversion.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00089 | $0.00662 |
| Opus 5 | $0.00044 | $0.00331 |
| Sonnet 5 | $0.00018 | $0.00132 |
| Haiku 4.5 | $0.00009 | $0.00066 |
Grade A, and why
portable-text-conversion scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
This is a copy
97% identical to portable-text-conversion — 8 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 60 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Portable Text Conversion
Convert external content (HTML, Markdown) into Portable Text for Sanity. Three main approaches:
markdownToPortableText— Convert Markdown directly using@portabletext/markdown(recommended for Markdown)htmlToBlocks— Parse HTML into PT blocks using@portabletext/block-tools(for HTML migration)- Manual construction — Build PT blocks directly from any source (APIs, databases, etc.)
Portable Text Specification
Understand the target format before converting. PT is an array of blocks:
[
{
"_type": "block",
"_key": "abc123",
"style": "normal",
"children": [
{"_type": "span", "_key": "def456", "text": "Hello ", "marks": []},
{"_type": "span", "_key": "ghi789", "text": "world", "marks": ["strong"]}
],
"markDefs": []
},
{
"_type": "block",
"_key": "jkl012",
"style": "h2",
"children": [
{"_type": "span", "_key": "mno345", "text": "A heading", "marks": []}
],
"markDefs": []
},
{
"_type": "image",
"_key": "pqr678",
"asset": {"_type": "reference", "_ref": "image-abc-200x200-png"}
}
]
Key rules:
- Every block and span needs
_key(unique within the array) _type: "block"is for text blocks; custom types use their own_typemarkDefsholds annotation data;markson spans referencemarkDefs[*]._keyor are decorator strings- Lists use
listItem("bullet" | "number") andlevel(1, 2, 3...) on regular blocks
Conversion Rules
Read the rule file matching your source format:
- Markdown → Portable Text:
rules/markdown-to-pt.md—@portabletext/markdownwithmarkdownToPortableText(recommended) - HTML → Portable Text:
rules/html-to-pt.md—@portabletext/block-toolswithhtmlToBlocks - Manual PT Construction:
rules/manual-construction.md— build blocks programmatically from any source
Note:
@sanity/block-toolsis the legacy package name. Always use@portabletext/block-toolsfor new projects. The API is the same.
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 60 lines · 89 tokens per session scan A e3bf71da2b68
portable-text-conversion is a skill published in the GitHub repository vercel-labs/sanity-copilot-eve-template (5 stars, last pushed 22d ago), licensed MIT. It adds 89 tokens to every session and 662 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. It is 97% identical to portable-text-conversion, differing in 8 lines, and is treated as a copy.
Other skills, from other repositories
deliverability
Use when the question is whether email will reach the inbox, covering sending domain setup, authentication, list hygiene, complaint and bounce rates, or a drop in delivery.
email-adaptation
Use when turning existing copy, a blog post, an announcement, or a brief into an email that works in an inbox, including deciding what to cut and what to link out to.
resend-build
Use when building, editing, or sending anything in Resend, including broadcasts, templates, segments, and contacts, or when checking what a past send did.
email-style
Use when writing or editing the copy of an email, newsletter, or broadcast in the house voice, including subject lines and preview text.
brand-context
Use before writing or updating the team's shared brand context document: what belongs in it, how it's structured, how to merge new information without losing what's there, and what to keep out.
customer-research
Use when you need to find out what customers actually think rather than assume it: what to ask in an interview, how to mine language from reviews and support conversations, and how to tell a real finding from a polite one.