Claude Code Plugins

Community-maintained marketplace

Feedback

wrongodb-blogging

@gabrielelanaro/wrongodb
2
0

Plan and write WrongoDB devlog posts in this repo. Use when asked to plan, outline, draft, or revise posts under blog/, generate blog images, or follow the series structure for WrongoDB. This skill embeds the canonical planning and writing prompts and uses blog/generate_image.py for image generation.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name wrongodb-blogging
description Plan and write WrongoDB devlog posts in this repo. Use when asked to plan, outline, draft, or revise posts under blog/, generate blog images, or follow the series structure for WrongoDB. This skill embeds the canonical planning and writing prompts and uses blog/generate_image.py for image generation.

WrongoDB Blogging

Overview

Create blog post plans and drafts for the WrongoDB series without re-reading or re-deriving the series structure. Use the canonical prompts embedded below and the image generator script in this repo.

Workflow (plan -> write -> images)

1) Planning a post

  • Read the "Planning prompt (canonical)" section below and follow it exactly.
  • Before locking the topic, grab inspiration from recent work:
    • Scan git history beyond the last 20 commits and pinpoint the relevant change:
      • git log --oneline --reverse --since="2025-12-01" (widen/narrow dates as needed)
      • git log --oneline -- src/blockfile.rs src/leaf_page.rs src/btree.rs docs/decisions.md (file-focused)
      • git log -S "BlockFile" -S "FULLFSYNC" -S "checkpoint" -S "slot" --oneline (string-focused)
    • Cross-check PLAN.md, docs/decisions.md, blog/SERIES.md
    • Codex session logs for narrative hooks: ~/.codex/sessions and ~/.codex/history.jsonl (use rg for keywords like blockfile, fs_usage, BTree, checkpoint)
  • Do not reread or re-discover prior posts; the prompt already encodes the structure and voice.
  • Produce a plan with the required sections (Title + hook, scope, 7 beats, decisions, artifact, images, verification).
  • If details are uncertain, tag as TO VERIFY.
  • Outline clarity guidelines (apply when the user asks for simpler language or stronger pedagogy):
    • Reduce jargon and define any unavoidable terms in plain language.
    • Add a one-sentence definition for the core concept (e.g., “A B+tree is…”).
    • Deepen the “Why” beyond the immediate symptom (e.g., not just “page full,” but why the structure is a standard DB building block).
    • Keep each beat short and explanation-forward (one or two sentences max).
  • Aha-moment mining (when planning or revising posts):
    • Scan ~/.codex/sessions and ~/.codex/history.jsonl for the exact questions/confusions you had (e.g., “what the hell is a slot,” “when do we compact?”).
    • Extract 2–4 of those questions and answer them in the post as short, teachable inserts.
  • Image planning lessons:
    • Each image prompt must state the story purpose (e.g., “show the durability boundary” or “map trace lines to meaning”), not just the subject.
    • Prefer narrative structures (before/after, timelines, mappings) over generic box-and-arrow diagrams.
    • Specify labels and icons that reinforce the story (e.g., crash bolt, shield, timeline bands).
    • After generation, validate files are real images (file blog/<post-dir>/images/*.png); if invalid or dull, revise prompts and regenerate.
  • Story/structure lessons:
    • After any significant change anywhere, re-check that the arc still flows.
    • Introduce new concepts inline before using jargon; keep definitions direct (no metaphors).
    • Use sections for readability; include explicit transitions or “lightbulb” moments where they help.
    • Diagrams must be narrated in the text and placed near the concept they illustrate.
    • Include a brief “how I ran the tool” line in the post when a tool is central; mention other options you did not use.
  • Keep series continuity: add a short recap/link to the previous post when relevant; ensure numbering/order is updated.

2) Writing a post

  • Read the "Writing prompt (canonical)" section below and follow it exactly.
  • Use the plan as the single source of truth; do not add new slices.
  • Keep the voice candid, playful, learning-first, “wrong on purpose.”
  • Keep the body tight (5–10 minute read).
  • Include the images specified in the plan.

3) Generating images

  • For each image prompt, run: python blog/generate_image.py "<prompt>" --post <post-dir> --out blog/<post-dir>/images/<NN-short-name>.png
  • Prefer sizes/aspects by intent:
    • Hero: --aspect 16:9 --size 2K
    • Diagrams: --aspect 4:3 --size 1K or --aspect 1:1 --size 1K
  • Filenames must be prefixed with the order they appear in the post: 01-, 02-, 03-, ...
  • If an image prompt is unclear, revise the prompt text first (do not guess).

QA checklist

  • Keep TO VERIFY tags until verified against code or notes.
  • Confirm the plan matches the thin-slice scope.
  • Ensure images were generated with blog/generate_image.py, stored under blog/<post-dir>/images/, and filenames match the post markdown.

Planning prompt (canonical)

Blog Post Planning Prompt (WrongoDB series)

Use this prompt to plan a new post in the WrongoDB devlog series.


Goal

Produce a tight, publish-ready plan for a single new post (5–10 minute read) that advances the series by one thin slice.

Known series DNA (do NOT re-derive)

  • Voice: candid, playful, learning-first
  • Structure rhythm: hook → context → mental model → one key decision → concrete artifact → why it matters → what’s next.
  • Teaching moves: rhetorical questions, crisp definitions, zoom from concept to bytes, explicit layer separation.
  • Visual rhythm: 2–4 images per post
  • Scope: one slice only, no roadmap dumps.

Planning rules

  • Plan the next post using the structure above
  • Pick one core concept and one key decision to explain, if not provided by the user.
  • Include one concrete artifact to anchor the explanation (code, struct, layout, file header, algorithm step, etc.).
  • Prefer examples that can be verified against the repo if needed.
  • If details are uncertain, mark as TO VERIFY (do not invent).

Output format

Return a plan with the following sections, in order:

1) Title + Subtitle + One-line hook

  • Proposed title
  • A meaningful subtitle that sharpens the focus (not a generic label)
  • A single-sentence hook that sounds like the existing voice

2) Thin-slice scope

  • One sentence: “This post explains … and stops before …”

3) Outline (7 beats)

Use exactly these beats:

  1. Hook
  2. Context / Why this exists
  3. Mental model (diagram candidate)
  4. Key decision (trade-off + rationale)
  5. Concrete artifact (code/struct/layout)
  6. Why it matters (behavior + invariants)
  7. What’s next (2–3 bullets)

4) Key decisions

  • Decision: …
  • Alternatives considered: … (2–3 options max)
  • Trade-offs: …

5) Concrete artifact

  • Name the artifact and where it lives (file path or conceptual object)
  • Bullet list of the 2–4 elements you will show or explain

6) Images

  • 2–4 image prompts (short, literal)
  • Include the intended filename for each image with an ordered prefix (e.g., 01-..., 02-...)

7) Verification checklist

  • 3–6 bullets of facts to verify against code/notes
  • If anything is speculative, tag it TO VERIFY

Style constraints for the plan

  • Keep each section short; avoid narrative prose.
  • Prefer plain language; avoid jargon unless defined.
  • If the topic is concept-heavy, include a one-sentence definition in the plan.

Example: acceptable brevity (mini)

  • “Key decision: explicit allocation vs implicit append; trade-off: clarity vs convenience.”

Writing prompt (canonical)

Blog Post Writing Prompt (WrongoDB series)

Use this prompt to write a full post from an existing outline created with the planning prompt above. Do not reread or re-discover the existing posts. The structure and voice are already known and summarized here.


Inputs

You will be given a plan that follows the 7-beat outline and includes:

  • Title + One-line hook
  • Thin-slice scope
  • Outline beats
  • Key decisions
  • Concrete artifact
  • Images
  • Verification checklist

Goal

Produce a complete markdown post that follows the plan exactly, in the established voice and structure, and is ready to drop into blog/NN-title.md.

Known series DNA (do NOT re-derive)

  • Voice: candid, playful, learning-first, “wrong on purpose.”
  • Structure rhythm: hook → context → mental model → one key decision → concrete artifact → why it matters → what’s next.
  • Teaching moves: rhetorical questions, crisp definitions, zoom from concept to bytes, explicit layer separation.
  • Visual rhythm: 2–4 images per post.
  • Scope: one slice only, no roadmap dumps.

Writing rules

  • Follow the plan’s 7 beats in order.
  • Do not add new topics or extra slices.
  • Include 2–4 inline images as markdown: ![Alt](images/<NN-filename>.png).
  • Image filenames must be prefixed in order of appearance: 01-, 02-, 03-, ...
  • Generate images by running python blog/generate_image.py "<prompt>" --post <post-dir> --out blog/<post-dir>/images/<NN-short-name>.png.
  • If a fact is uncertain, mark it inline as TO VERIFY and keep going.
  • Do not invent code details; only reference file paths or structs if the plan says they exist.
  • Avoid markdown links unless the plan explicitly provides them.

Output format

Return a single markdown document with:

  1. # Title
  2. ## Subtitle
  3. Optional hero image (if the plan calls for it)
  4. Body sections in a natural flow (no numbered headings required)
  5. “What’s next” as a bullet list

Style constraints

  • Tight paragraphs (3–6 lines each)
  • Occasional rhetorical questions
  • Definitions in short, punchy sentences
  • Avoid marketing language

Post template (skeleton)

</h1> <h2><Subtitle></h2> <p><img src="images/%3Chero_filename%3E.png" alt="<Hero Alt>"></p> <Hook paragraph> <p><Context / why this exists></p> <p><Mental model + image></p> <p><Key decision + trade-off></p> <Concrete artifact explanation> <Why it matters> <h2>What’s next</h2> <ul> <li><bullet></li> <li><bullet></li> <li><bullet></li> </ul> <hr> <h2>After writing</h2> <ul> <li>Ensure all <strong>TO VERIFY</strong> flags are still present (do not resolve them).</li> <li>Ensure all images mentioned in the plan are included.</li> <li>Ensure each image was generated with <code>blog/generate_image.py</code>, stored under <code>blog/<post-dir>/images/</code>, and matches the prompt.</li> <li>Ensure the post matches the thin-slice scope.</li> </ul> </div> </article> </section> </div> </main> <vercel-analytics data-props="{}" data-params="{"slug":"@gabrielelanaro/wrongodb/wrongodb-blogging"}" data-pathname="/skills/@gabrielelanaro/wrongodb/wrongodb-blogging"></vercel-analytics> <script type="module">var f="@vercel/analytics",l="1.5.0",w=()=>{window.va||(window.va=function(...r){(window.vaq=window.vaq||[]).push(r)})};function d(){return typeof window<"u"}function u(){try{const e="production"}catch{}return"production"}function v(e="auto"){if(e==="auto"){window.vam=u();return}window.vam=e}function m(){return(d()?window.vam:u())||"production"}function c(){return m()==="development"}function b(e,r){if(!e||!r)return e;let n=e;try{const t=Object.entries(r);for(const[a,i]of t)if(!Array.isArray(i)){const o=s(i);o.test(n)&&(n=n.replace(o,`/[${a}]`))}for(const[a,i]of t)if(Array.isArray(i)){const o=s(i.join("/"));o.test(n)&&(n=n.replace(o,`/[...${a}]`))}return n}catch{return e}}function s(e){return new RegExp(`/${h(e)}(?=[/?#]|$)`)}function h(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function y(e){return e.scriptSrc?e.scriptSrc:c()?"https://va.vercel-scripts.com/v1/script.debug.js":e.basePath?`${e.basePath}/insights/script.js`:"/_vercel/insights/script.js"}function g(e={debug:!0}){var r;if(!d())return;v(e.mode),w(),e.beforeSend&&((r=window.va)==null||r.call(window,"beforeSend",e.beforeSend));const n=y(e);if(document.head.querySelector(`script[src*="${n}"]`))return;const t=document.createElement("script");t.src=n,t.defer=!0,t.dataset.sdkn=f+(e.framework?`/${e.framework}`:""),t.dataset.sdkv=l,e.disableAutoTrack&&(t.dataset.disableAutoTrack="1"),e.endpoint?t.dataset.endpoint=e.endpoint:e.basePath&&(t.dataset.endpoint=`${e.basePath}/insights`),e.dsn&&(t.dataset.dsn=e.dsn),t.onerror=()=>{const a=c()?"Please check if any ad blockers are enabled and try again.":"Be sure to enable Web Analytics for your project and deploy again. See https://vercel.com/docs/analytics/quickstart for more information.";console.log(`[Vercel Web Analytics] Failed to load script from ${n}. ${a}`)},c()&&e.debug===!1&&(t.dataset.debug="false"),document.head.appendChild(t)}function p({route:e,path:r}){var n;(n=window.va)==null||n.call(window,"pageview",{route:e,path:r})}function k(){try{return}catch{}}customElements.define("vercel-analytics",class extends HTMLElement{constructor(){super();try{const r=JSON.parse(this.dataset.props??"{}"),n=JSON.parse(this.dataset.params??"{}");g({...r,disableAutoTrack:!0,framework:"astro",basePath:k(),beforeSend:window.webAnalyticsBeforeSend});const t=this.dataset.pathname;p({route:b(t??"",n),path:t})}catch(r){throw new Error(`Failed to parse WebAnalytics properties: ${r}`)}}});</script> </body></html>