Ketchup on Everything.
A Claude Code skill that generates in-depth technical research reports
shaped for your professional background.
Install · Quick Start · Flags · Plugins · Config
Step 1: Add the marketplace (one-time setup):
/plugin marketplace add RCellar/ketchup
Step 2: Install the plugin:
/plugin install ketchup@rcellar-ketchup
Then run /reload-plugins to activate. Skills are namespaced as /ketchup:<skill>.
Set your perspective, then research anything:
# Tell ketchup who you are
/ketchup --occ "Windows Systems Engineer"
# Research a topic — shaped for you
/ketchup --tgt "SELinux Administration"That's it. Ketchup decomposes the topic into facets, dispatches parallel research agents, and synthesizes an Obsidian-ready report that explains SELinux through the lens of Windows security concepts you already know — GPO, integrity levels, ACLs, Event Viewer, and more.
One-liner with everything:
/ketchup --occ "Windows Systems Engineer" --tgt "SELinux Administration" --plugin "Context7" --time 6This tells ketchup: "I'm a Windows sysadmin who hasn't been deep in the weeds for 6 years. Use Context7 docs. Ketchup me on SELinux."
| Flag | What it does | Example |
|---|---|---|
--occ |
Your occupation — shapes vocabulary, analogies, assumed knowledge | --occ "DBA" |
--tgt |
Topic to research | --tgt "Kubernetes" |
--plugin |
MCP data sources for pre-fetch (comma-separated) | --plugin "Context7" |
--time |
Years since your last deep engagement | --time 6 |
--registry |
Manage plugins: list, add, remove |
--registry list |
--fmt |
Output format: obsidian (default) or notebook |
--fmt notebook |
--kernel |
Kernelspec for notebook code cells: python or bash |
--kernel bash |
--annotate |
Reprocess a ketchup notebook for inline queries | --annotate ./report.ipynb |
Ketchup can output directly to Jupyter notebooks with executable code cells — ideal for hands-on learning topics.
/ketchup --occ "Linux Enthusiast" --tgt "systemd Service Management" --fmt notebook --kernel bashWhat changes from Obsidian output:
| Obsidian | Notebook |
|---|---|
| YAML frontmatter | metadata.ketchup JSON namespace |
> [!tip] callouts |
HTML <div class="alert"> divs |
[[wikilinks]] |
Standard markdown links |
| Fenced code blocks | Executable code cells (when language matches --kernel) |
| Static document | Runnable, annotatable document |
After generating a notebook, you can ask follow-up questions directly inside it. Add a markdown cell anywhere with %%ketchup on the first line:
%%ketchup
Expand on how SELinux booleans work — give me practical examples.
Then run:
/ketchup --annotate ./my-report.ipynbKetchup reads the perspective, plugins, and topic from the notebook's metadata (no need to re-specify --occ), dispatches a sonnet agent for each query, and inserts the response directly after the query cell.
Annotation index: Each processed query is replaced with a compact marker (*[Annotation #1](#ketchup-annotation-index)*) and the full query text is preserved in cell metadata. An annotation index table is appended to the end of the notebook, rebuilt on every --annotate run.
Idempotency: Answered queries are tagged ketchup:query-answered and skipped on re-runs. To re-ask, replace the marker with a new %%ketchup cell.
/ketchup --occ "Frontend Dev" --tgt "PostgreSQL" --plugin "Context7"
- Scope & decompose — Breaks the topic into 2-6 facets tuned to what matters for a frontend dev learning Postgres (not a DBA learning Postgres — different facets entirely)
- Plugin pre-fetch — Orchestrator discovers MCP tools at runtime by name, matches them to registry workflow hints, and queries Context7 for current Postgres docs per facet
- Pass 1: Fact extraction (haiku) — Cheap, fast agents collect raw facts, sources, and commands per facet via web search. No perspective shaping yet — just research.
- Pass 2: Perspective shaping (sonnet) — Each facet's raw research is reshaped for the reader's occupation and staleness window. No re-research — only reshaping Pass 1 output.
- Validate & synthesize — Citation audit, contradiction check, deduplicate, restore perspective across all sections
- Format & output — Obsidian markdown (default) or Jupyter notebook (
--fmt notebook) with executable code cells, HTML callouts, and ketchup metadata - Verification (haiku) — Independent agent checks frontmatter, section completeness, citation compliance, and confidence scoring before delivery
Ketchup uses a two-pass research model to control agent costs:
| Pass | Model | Purpose | Why this model |
|---|---|---|---|
| 1 — Fact extraction | haiku | Collect raw facts, sources, commands | Mechanical research — cheap and fast |
| 2 — Perspective shaping | sonnet | Reshape facts for the reader | Requires judgment — worth the cost |
| 2 (complex facets) | opus | Cross-domain synthesis | Only when facet covers >3 subtopics |
| Verification | haiku | Structural + citation checks | Mechanical validation — no judgment needed |
| Annotation | sonnet | Answer %%ketchup queries in notebooks |
Perspective shaping — one per query, parallel |
A dispatch table in the skill file governs model selection. The orchestrator consults it before every agent call — no ad-hoc escalation.
Every report gets a confidence grade based on citation density:
| Grade | Threshold | Meaning |
|---|---|---|
| high | >70% sourced claims | Most facts have URLs |
| medium | 40-70% sourced | Mixed sourcing |
| low | <40% sourced | Mostly unsourced or inferred |
The verification agent counts sourced vs unsourced vs inferred claims and sets the confidence field in frontmatter automatically.
Ketchup doesn't just add analogies. It restructures content through five lenses:
| Lens | What it does |
|---|---|
| Vocabulary bridging | Maps concepts to equivalents you know |
| Assumed knowledge | Skips what your role implies you know |
| Practical framing | Leads with why this matters to you |
| Risk calibration | Matches warning intensity to your operational stakes |
| Misconception correction | Preempts wrong mental models your background creates |
Haven't been in the weeds for a while?
/ketchup --occ "Java Developer" --tgt "Modern JavaScript" --time 8Ketchup bridges from 2018-era JS (ES6 was still new, Webpack was king, class components everywhere) to today. Every major shift gets flagged: "You may remember X — since then, Y replaced it."
Plugins are opt-in MCP data sources that run at the pre-fetch layer. The orchestrator queries them before dispatching research agents, injecting authoritative docs into each subagent's context.
Built-in plugins:
| Plugin | Match | What it fetches |
|---|---|---|
| Context7 | context7 |
Current library/framework/SDK documentation |
| Microsoft Docs | microsoft |
Official Microsoft and Azure documentation + code samples |
Manage plugins:
# List all registered plugins
/ketchup --registry list
# Add a new plugin (interactive — prompts for MCP tool workflow)
/ketchup --registry add "My Custom Docs"
# Add to the global registry instead of project-level
/ketchup --registry add "My Custom Docs" --global
# Remove a plugin
/ketchup --registry remove "My Custom Docs"Plugin registry files:
| File | Scope | Notes |
|---|---|---|
<project>/.ketchup-plugins.yaml |
Project-level overrides | User-editable |
~/.ketchup-plugins.yaml |
User global additions | Written by --registry add --global |
skills/ketchup/plugin-registry.yaml |
Shipped defaults | Read-only — overwritten on plugin update |
Persist your defaults in a .ketchup YAML file so you don't have to type flags every time.
# ~/.ketchup (global defaults)
occ: "Windows Systems Engineer"
time: 6
kernel: python
plugins:
- context7# <project>/.ketchup (project override — replaces per-key, not deep-merged)
occ: "Cloud Infrastructure Engineer"
plugins:
- context7
- microsoft-docsResolution order: CLI flags > project .ketchup (walks up from cwd to git root or filesystem root) > global ~/.ketchup > prompt user
| Override | How |
|---|---|
| Use a different occupation for one report | --occ "New Role" on the CLI |
| Disable staleness for one report | --time 0 |
| Use different plugins for one report | --plugin "Other" (replaces config list) |
Every ketchup report enforces a citation and tagging discipline defined in cite-and-tag.md. The goal: no claim goes unattributed, no inference masquerades as fact, and every report is findable by topic.
Every factual claim in a report must carry one of these markers:
| Claim type | Format | Example |
|---|---|---|
| Fact with URL | Inline hyperlink | SELinux uses MAC ([Red Hat docs](https://...)) |
| Fact, no URL available | _(unsourced)_ |
Pocket doors are common in tight spaces _(unsourced)_ |
| Inference / probability | _(~inferred: basis)_ |
This likely replaced the older module _(~inferred: pattern-match on changelog frequency)_ |
| URL not verified | _(link unverified)_ |
See the migration guide ([docs](https://...)) _(link unverified)_ |
| Training data only (no search result) | Explicit flag | Marked so the reader knows it wasn't independently verified |
Hard rules:
- No bare assertions. If a claim has no marker, it's a bug in the report.
- No "intuition" language. LLMs don't have intuition. Use "pattern-match," "aggregate likelihood," or "low-confidence extrapolation" instead.
Reports are tagged via YAML frontmatter — Obsidian's canonical, indexable tag location. Tags never appear as inline blockquotes.
tags:
- ketchup
- selinux
- windows-sysadminTag rules:
- Descriptive, searchable terms — not generic labels like
miscorgeneral - Sanitized: lowercase, hyphens for spaces, cannot start with a number
- Obsidian's search and Dataview index frontmatter tags reliably, making reports queryable across a vault
Citation compliance isn't just guidance — it's enforced at multiple stages of the pipeline:
- Subagent prompts include the full citation ruleset inline
- Self-reported counts — each subagent reports "X sourced, Y unsourced, Z inferred" at the end of its output
- Step 3a validation — the orchestrator checks citation density before synthesis; facets with zero sourced citations are flagged as low-confidence
- Step 3b audit — bare assertions are scanned for and either sourced, marked, or reframed before the final report is written
- YAML frontmatter (
topic,perspective,date,confidence,source_count,tags) > [!abstract],> [!tip],> [!warning]callouts- Mermaid diagrams where helpful
- Tags in frontmatter for proper Obsidian search and Dataview indexing
metadata.ketchupJSON namespace (same fields as Obsidian frontmatter)- HTML alert divs instead of Obsidian callouts
- Code blocks matching
--kernelextracted into executable code cells - Standard markdown links instead of wikilinks
- Mermaid diagrams preserved (JupyterLab 4.1+ renders natively)
- Annotation support via
%%ketchupinline queries
ketchup/
├── .claude-plugin/
│ ├── plugin.json # Plugin metadata
│ └── marketplace.json # Marketplace catalog
├── skills/
│ └── ketchup/
│ ├── SKILL.md # Main skill definition
│ ├── notebook-format.md # Jupyter notebook generation & annotation
│ ├── cite-and-tag.md # Citation rules reference
│ └── plugin-registry.yaml # MCP plugin registry
├── assets/
│ └── banner.svg
├── LICENSE
└── README.md
MIT