Blog Writer
Create blog posts for the Hackathon Playbook site. Posts are structured data in lib/blog.ts; rendering, metadata, JSON-LD, and sitemap entries are handled by the blog templates.
Start With Context
Read lib/blog.ts and, if needed, app/blog/[slug]/page.tsx before writing. Identify existing post slugs, reusable internal links, the exact BlogPost and ContentBlock shapes, and any renderer constraints.
If the user did not provide enough direction, ask for the missing essentials:
- Topic or working title
- Target reader
- Primary search keyword
- Desired angle, such as beginner guide, tactical checklist, teardown, or opinionated recommendation
If the user is unsure, suggest three ideas that fill gaps in current coverage.
Plan Before Editing
Share a short outline and wait for approval unless the user explicitly asked you to proceed without review. Include:
- Slug matched to the target query
- Title under 70 characters when practical
- Description of 150-160 characters with the primary keyword early
- Four to six keywords
- Five to eight sections with planned block types
- Internal links to related playbook, non-coder, or blog pages
- Estimated reading time
Content Rules
Prefer the blocks array over legacy paragraphs. Each section should normally start with a paragraph block, then use visual blocks to make the article scannable.
Use these block types from lib/blog.ts:
paragraph: context, transitions, and narrative explanations
callout: one important warning, tip, background note, or takeaway
stat-row: two to four metrics that support the argument
step-list: three to six sequential steps
quote: social proof or expert framing
pro-con: decisions, tradeoffs, or do/don't guidance
code-snippet: commands, config, or code examples
checklist: preparation or launch checklists with four to eight items
link-card: internal links, especially in the final section
Composition guidance:
- Use three to five different block types per article.
- Avoid back-to-back visual blocks without a
paragraph transition when the reader needs context.
- Use callouts sparingly. If everything is highlighted, nothing feels important.
- Put terminal commands in
code-snippet blocks.
- Emphasize key phrases by wrapping them in
**double asterisks** inside paragraph or callout text; the renderer converts them to bold. Use sparingly. This is the only inline markdown the renderer supports (no italics, links, or *single* asterisks in body text).
- Include at least one
link-card to existing site content.
- Every quote must include a real attribution with the person's full name and credential, title, or source.
Write To Be Finished
Most readers never reach the end. Optimize for completion, grounded in docs/blog-engagement-research.md (read it for the evidence and sources). The highest-leverage moves:
- Front-load the payoff. Put the core answer in the first sentence and above the fold (inverted pyramid). Readers absorb only about 20 to 28% of a page's words (NN/g, 2008).
- Short first sentence. Start momentum at near-zero effort; the headline's job is just to earn sentence one (Joseph Sugarman, 1998).
- One concrete curiosity gap in the intro, paid off later.
- Cut verbosity. Word count is not a ranking factor; edit until no word can be removed. Cover the intent, then stop.
- A surprise in the middle and a forward-looking payoff at the end, not a recap.
Before finishing, run the post through docs/blog-engagement-checklist.md.
Add The Post
Append the post object to BLOG_POSTS in lib/blog.ts. Preserve local formatting and do not rewrite unrelated posts. Use today's date unless the user specifies a publication date.
Minimum post shape:
{
slug: "target-keyword-slug",
title: "Keyword-Rich Title",
description: "150-160 character SEO description with the primary keyword early.",
date: "YYYY-MM-DD",
readingTime: "X min read",
keywords: ["primary keyword", "secondary keyword"],
content: [
{
heading: "Section Heading",
paragraphs: [],
blocks: [
{ type: "paragraph", text: "Section introduction." },
{ type: "callout", variant: "tip", text: "Important guidance." },
],
},
],
}
Verify
Check the post against the SEO plan:
- Slug targets the search query
- Title contains the primary keyword naturally
- Description is 150-160 characters
- Keywords list has four to six entries
- Internal link-card is present
- Quote attributions are complete
- Metadata, JSON-LD, and sitemap are covered by the existing blog templates
- The post passes
docs/blog-engagement-checklist.md (short first sentence, front-loaded payoff, scannable structure, no padding)
Run the project validation that matches the repo. Prefer the existing build command if package scripts reveal one; otherwise use npx next build.
Final Response
Return:
- Post Summary: title, slug, keyword, section count, and block types used
- SEO Status: checklist results and any tradeoffs
- Verification: command run and outcome, or why it was skipped
- Next Step: one useful content improvement or promotion idea
1---2name: blog-writer3description: Write or expand Hackathon Playbook blog posts in `lib/blog.ts` using the site's rich content block system and SEO rules. Use this skill whenever the user asks for a new article, blog idea, SEO post, content update, or anything that should become a `/blog/[slug]` entry, even if they only describe the topic casually.4---56# Blog Writer78Create blog posts for the Hackathon Playbook site. Posts are structured data in `lib/blog.ts`; rendering, metadata, JSON-LD, and sitemap entries are handled by the blog templates.910## Start With Context1112Read `lib/blog.ts` and, if needed, `app/blog/[slug]/page.tsx` before writing. Identify existing post slugs, reusable internal links, the exact `BlogPost` and `ContentBlock` shapes, and any renderer constraints.1314If the user did not provide enough direction, ask for the missing essentials:1516- Topic or working title17- Target reader18- Primary search keyword19- Desired angle, such as beginner guide, tactical checklist, teardown, or opinionated recommendation2021If the user is unsure, suggest three ideas that fill gaps in current coverage.2223## Plan Before Editing2425Share a short outline and wait for approval unless the user explicitly asked you to proceed without review. Include:26271. Slug matched to the target query282. Title under 70 characters when practical293. Description of 150-160 characters with the primary keyword early304. Four to six keywords315. Five to eight sections with planned block types326. Internal links to related playbook, non-coder, or blog pages337. Estimated reading time3435## Content Rules3637Prefer the `blocks` array over legacy `paragraphs`. Each section should normally start with a `paragraph` block, then use visual blocks to make the article scannable.3839Use these block types from `lib/blog.ts`:4041- `paragraph`: context, transitions, and narrative explanations42- `callout`: one important warning, tip, background note, or takeaway43- `stat-row`: two to four metrics that support the argument44- `step-list`: three to six sequential steps45- `quote`: social proof or expert framing46- `pro-con`: decisions, tradeoffs, or do/don't guidance47- `code-snippet`: commands, config, or code examples48- `checklist`: preparation or launch checklists with four to eight items49- `link-card`: internal links, especially in the final section5051Composition guidance:5253- Use three to five different block types per article.54- Avoid back-to-back visual blocks without a `paragraph` transition when the reader needs context.55- Use callouts sparingly. If everything is highlighted, nothing feels important.56- Put terminal commands in `code-snippet` blocks.57- Emphasize key phrases by wrapping them in `**double asterisks**` inside `paragraph` or `callout` text; the renderer converts them to bold. Use sparingly. This is the only inline markdown the renderer supports (no italics, links, or `*single*` asterisks in body text).58- Include at least one `link-card` to existing site content.59- Every quote must include a real attribution with the person's full name and credential, title, or source.6061## Write To Be Finished6263Most readers never reach the end. Optimize for completion, grounded in `docs/blog-engagement-research.md` (read it for the evidence and sources). The highest-leverage moves:6465- **Front-load the payoff.** Put the core answer in the first sentence and above the fold (inverted pyramid). Readers absorb only about 20 to 28% of a page's words ([NN/g, 2008](https://www.nngroup.com/articles/how-little-do-users-read/)).66- **Short first sentence.** Start momentum at near-zero effort; the headline's job is just to earn sentence one ([Joseph Sugarman, 1998](https://thisiscopy.com/joseph-sugarmans-copywriting-approach/)).67- **One concrete curiosity gap** in the intro, paid off later.68- **Cut verbosity.** Word count is not a ranking factor; edit until no word can be removed. Cover the intent, then stop.69- **A surprise in the middle and a forward-looking payoff at the end**, not a recap.7071Before finishing, run the post through `docs/blog-engagement-checklist.md`.7273## Add The Post7475Append the post object to `BLOG_POSTS` in `lib/blog.ts`. Preserve local formatting and do not rewrite unrelated posts. Use today's date unless the user specifies a publication date.7677Minimum post shape:7879```typescript80{81 slug: "target-keyword-slug",82 title: "Keyword-Rich Title",83 description: "150-160 character SEO description with the primary keyword early.",84 date: "YYYY-MM-DD",85 readingTime: "X min read",86 keywords: ["primary keyword", "secondary keyword"],87 content: [88 {89 heading: "Section Heading",90 paragraphs: [],91 blocks: [92 { type: "paragraph", text: "Section introduction." },93 { type: "callout", variant: "tip", text: "Important guidance." },94 ],95 },96 ],97}98```99100## Verify101102Check the post against the SEO plan:103104- Slug targets the search query105- Title contains the primary keyword naturally106- Description is 150-160 characters107- Keywords list has four to six entries108- Internal link-card is present109- Quote attributions are complete110- Metadata, JSON-LD, and sitemap are covered by the existing blog templates111- The post passes `docs/blog-engagement-checklist.md` (short first sentence, front-loaded payoff, scannable structure, no padding)112113Run the project validation that matches the repo. Prefer the existing build command if package scripts reveal one; otherwise use `npx next build`.114115## Final Response116117Return:1181191. **Post Summary**: title, slug, keyword, section count, and block types used1202. **SEO Status**: checklist results and any tradeoffs1213. **Verification**: command run and outcome, or why it was skipped1224. **Next Step**: one useful content improvement or promotion idea