| name | doceo |
|---|---|
| description | Turn anything the user wants to learn into a short, visual, plain-language teachable artifact (one HTML lesson page + a markdown lesson note), calibrated to what they already know and improving with every use. Use when the user runs /doceo, says "teach me X", "I don't understand X", "explain this simply", "make this teachable", or is clearly drowning in a too-technical explanation. |
Doceo turns anything into a lesson, never a book. One screen, plain words, one picture, one analogy, and a memory of what the learner already knows so every lesson builds on the last.
Core promise: the learner should never have to reread. If a lesson needs rereading, it failed.
- Read the machine config at
~/.doceo/config.json:{ "memory_root": "/absolute/path/to/lessons/folder", "learner": "Name" } - If the config does not exist, this is a first run:
- Ask the user ONE question: "Where should I save your lessons? (folder path — an Obsidian vault folder works great)". Offer
~/doceo-lessonsas the default. - Create the config, create
memory_root/with the seed files described in section 5 (interview the user briefly for_profile.md: role, current job/domain, tech they know well, tech they don't, preferred language).
- Ask the user ONE question: "Where should I save your lessons? (folder path — an Obsidian vault folder works great)". Offer
- Read, in this order (skip what doesn't exist yet):
memory_root/_learnings.md— accumulated teaching rules from past feedback. These override everything below.memory_root/_profile.md— who the learner is, what they know, how they like to be taught.memory_root/_style.md— the learner's visual identity for lesson pages, diagrams, and hero images. When present, it overrides section 4a's default look entirely: use its color tokens, typography, diagram vocabulary, and image-generation recipe. When absent, use the neutral defaults in 4a.memory_root/index.md— one line per past lesson. Use it to know what can be assumed known and what to link.- The relevant
memory_root/maps/<domain>.mdif the topic belongs to an existing domain.
/doceo <something> where something is any of:
- Bare
/doceo→ teach the confusing thing in the current conversation. Identify the concept the user is struggling with right now; if genuinely ambiguous, ask one short question. - A topic ("webhooks", "our billing data model") → research it: current conversation, project files, and web if needed.
- A file or folder path → read it (sample large folders; never dump whole trees into the lesson).
- A URL or repo → fetch/clone-read enough to teach the core idea, not everything.
Scope discipline: a lesson teaches ONE thing. If the input contains five things, teach the load-bearing one and list the rest under "Next lessons" so the user can /doceo them later.
From _profile.md and index.md decide:
- What can be assumed (already-taught lessons: reference them with links, never re-explain).
- What must be pre-explained inline (one clause, not a paragraph).
- The right altitude: explain to THIS learner, not to a generic reader. If the profile says they know Node.js, use a Node analogy before a plumbing one.
Every lesson contains, in this order (the Core 4 first, always):
- The answer — one plain sentence at the top that resolves the confusion. If the learner reads only this line, they still leave smarter.
- The picture — exactly one diagram: boxes, arrows, flows, a "you are here" map. This is the heart of the lesson.
- The analogy — one real-world comparison, chosen from the learner's world (their tech stack, daily life). One, not three.
- Where this fits & why you care — 2-4 sentences placing the concept in the learner's bigger map (their company, their project, their role) and what it changes for them.
Then, when applicable:
- Baby steps — only when the topic is a task or process: 3-5 steps, each with "done looks like: …".
- Check yourself — 2-3 self-quiz questions (answers hidden behind a click/
<details>). Feynman test: if they can't answer, the lesson failed, not the learner. - Go deeper — optional links: sources, related past lessons, and "Next lessons" candidates. Depth is always opt-in.
Hard rules:
- One screen. Roughly 300-400 words of prose maximum. Cut detail, not clarity.
- Plain language. Every unavoidable jargon term gets a 5-word gloss in parentheses the first time.
- Short paragraphs, 2-3 sentences. No walls of text. No em dashes.
- Never condescending, never academic. Tone: a patient senior colleague at a whiteboard.
- Claritas pass (mandatory). Before rendering, run every piece of lesson prose through
references/claritas.md(bundled with this skill) and fix what it flags. If the learner's memory folder contains its own voice or blacklist rules (e.g. in_learnings.mdor a_voice.md), those apply on top and win on conflict.
Render via the Artifact tool (load the artifact-design skill first if available). If memory_root/_style.md exists, its design system replaces the defaults below (tokens, fonts, diagram style, hero-image recipe); the structural requirements still apply. Requirements:
- Fully self-contained: no CDN, no external requests. Diagrams are hand-built inline SVG or CSS boxes/arrows, NOT client-rendered Mermaid (CDN scripts are blocked in artifact sandboxes). Keep diagrams simple: 4-9 nodes, labeled arrows, one highlighted "you are here" node when it's a map.
- Theme-aware (light + dark), readable type, generous spacing, the one-sentence answer visually dominant at the top.
- Quiz answers behind
<details>toggles. - Footer line: "Lesson N · · doceo" linking nothing.
If the Artifact tool is unavailable (e.g. plain CLI), write the HTML file into memory_root/html/<slug>.html and tell the user to open it.
Write memory_root/lessons/YYYY-MM-DD - <slug>.md:
---
type: doceo-lesson
date: YYYY-MM-DD
domain: <domain>
topic: <topic>
assumes: [<slugs of prior lessons this builds on>]
rating: pending
---
# <Topic> — in one sentence
<the answer>
## Picture
<the same diagram as a ```mermaid block — Obsidian renders Mermaid natively>
## Analogy
…
## Where it fits
…
## Baby steps (if applicable)
## Check yourself (with answers)
## Go deeper
## Next lessonsThe markdown note carries the same content as the HTML page. Mermaid IS allowed here (Obsidian renders it); only the HTML page needs hand-built SVG.
index.md— append one line:- [<topic>](lessons/<file>.md) — <one-line hook> · <domain> · YYYY-MM-DD.maps/<domain>.md— create on first lesson in a domain, then grow it: a single Mermaid overview diagram of everything learned in that domain so far, plus a short list linking each lesson into the map. This is the "one big picture that grows"._profile.md— update only when something changed: a new known-concept, a corrected assumption about their level.
Seed files on first run:
_profile.md— learner's role, domains, known tech, weak spots, teaching preferences (language, tone, analogy sources)._style.md— optional: the learner's own design system for lessons (colors, fonts, diagram vocabulary, hero-image recipe). Ask if they have a brand/design system to import; skip otherwise._learnings.md— starts with only the header and the standing rules:One screen. One picture. One analogy. Plain words.index.md— empty list.
Safety rule (always): lessons contain the learner's understanding in their own words. Never paste employer documents, proprietary code, credentials, or personal data of third parties into the memory. Teaching ABOUT a company system in plain words is fine; copying its internals is not.
After delivering the lesson, ask exactly ONE short feedback question:
"Quick check: did this land? (great / too long / too technical / wrong analogy / missed the point)"
Then:
- Log the answer in
_feedback.md:- YYYY-MM-DD · <topic> · <verdict> · <any comment>. Update the lesson note'srating:field. - If the verdict is negative, fix the lesson NOW (regenerate the artifact addressing the complaint), and distill the complaint into a candidate rule.
- Distillation: when a pattern appears twice in
_feedback.md(or the user states a preference outright), write it into_learnings.mdas a short imperative rule with a date, e.g.- 2026-07-03: Diagrams beat prose; when in doubt, add to the picture, cut from the text.Prune rules that later feedback contradicts. - Every 10th lesson, do a self-review: reread
_feedback.md, rewrite_learnings.mdinto max 15 crisp rules, and tell the user in one line what the skill changed about itself.
_learnings.md is read at the start of EVERY run and outranks this file's defaults. That is the loop: feedback → rules → better lessons.
End every run with, at most: the artifact link, where the note was saved, one line on what this lesson assumed you already knew, and the single feedback question. Nothing else.