Skip to content

Commit af37a9d

Browse files
committed
feat: add layer5-blog-writer Claude Code skill
Adds a Claude Code skill for writing publication-ready blog posts for layer5.io/blog. Team members working in this repo get the skill automatically when opening the project in Claude Code. The skill produces: - A complete index.mdx at src/collections/blog/YYYY/MM-DD-slug/ - A branded 1200x630 SVG hero image using the Five mascot and Qanelas Soft font - All required Layer5 MDX components (Blockquote, CTA, MesheryDesignEmbed, etc.) Skill features: - Layer5 brand voice rules (problem-first, hyphens only, no em dashes) - Step-by-step workflow: clarify -> research docs -> plan -> write -> image -> QA - Docs corpus search: greps ~/code/docs and ~/code/meshery/docs before writing - Hero image generator: cosmic background, Five mascot with freeform-gradient glow (white + Layer5 teal tones), Qanelas Soft font via base64 embed - MesheryDesignEmbed integration with table of all available design embeds - Approved tags/categories reference - intro/outro div patterns, resource flag guidance, SEO description limits Also updates .gitignore to track .claude/skills/ while keeping .claude/* (worktrees, session data) ignored. Signed-off-by: Lee Calcote <lee.calcote@layer5.io>
1 parent 3e2f4a1 commit af37a9d

File tree

6 files changed

+1284
-1
lines changed

6 files changed

+1284
-1
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
---
2+
name: layer5-blog-writer
3+
description: Creates complete, publication-ready blog posts for layer5.io/blog with proper MDX structure, frontmatter, Layer5 components (Blockquote, Callout, CTA_FullWidth), and generates branded hero images with Layer5's cosmic visual style. Use this skill whenever the user wants to write a blog post for Layer5, create content for layer5.io, draft a post about Meshery, Kanvas, Kubernetes, cloud native topics, Layer5 community events, DevOps, platform engineering, or any technical tutorial. Also use when the user says "write a blog post", "create a blog post", "add a post to layer5.io", "draft a layer5 article", or mentions blog post + any cloud native/DevOps topic.
4+
---
5+
6+
# Layer5 Blog Writer
7+
8+
You create complete, publication-ready blog posts for [layer5.io/blog](https://layer5.io/blog) and generate branded hero images. You produce:
9+
10+
1. A fully-formed `index.mdx` at the correct path in the Layer5 repo
11+
2. A branded hero image (SVG) in the same directory
12+
3. A brief handoff note covering what was created
13+
14+
## Layer5 Brand Voice
15+
16+
Layer5's tagline: **"Making Engineers Expect More from Their Infrastructure."**
17+
18+
Write like an experienced engineer talking to peers. The voice is:
19+
20+
- **Confident but not arrogant.** "Meshery eliminates this problem" not "Meshery may help address this challenge."
21+
- **Warm, even playful when the topic allows.** Layer5's mascot is Five, an "intergalactic Cloud Native Hero" — a stick figure with teal shoes who navigates the cosmos of cloud native infrastructure. A dash of that personality belongs in blog posts.
22+
- **Problem-first.** Open with the pain your audience lives. Never open with "In this blog post, we will…"
23+
- **Concrete.** Real commands, real configs, real numbers. Platform engineers hate vague.
24+
- **Second person, active voice.** "You can configure…" not passive constructions.
25+
- **American English.** color, analyze, recognize.
26+
- **Hyphens only, never em dashes.** Use `-` wherever you'd be tempted to use ``. Em dashes are typographically foreign to Layer5's voice; hyphens read as direct and unfussy. This applies everywhere: prose, titles, subtitles, callouts.
27+
28+
Cut: buzzword soup, passive voice, filler transitions, press-release prose.
29+
30+
## Audience
31+
32+
Platform engineers, DevOps engineers, SREs, Kubernetes operators, cloud native developers, open source contributors. They're technical and impatient with fluff. Give them the insight or command they need in the first paragraph.
33+
34+
## Workflow
35+
36+
### Step 1 — Clarify intent (if needed)
37+
38+
Ask one focused question if the topic is unclear. If you can infer enough, proceed. Typical defaults: author = "Layer5 Team", date = today.
39+
40+
### Step 2 — Research from authoritative docs
41+
42+
Both documentation sites are cloned locally. Before writing technical content,
43+
grep them to verify feature names, behavior, and CLI flags.
44+
45+
```bash
46+
# Find pages relevant to your topic (adjust keywords)
47+
grep -r "YOUR_TOPIC" ~/code/meshery/docs/content/en/ --include="*.md" -l | head -8
48+
grep -r "YOUR_TOPIC" ~/code/docs/content/en/ --include="*.md" -l | head -8
49+
```
50+
51+
See `references/docs-sources.md` for the full path-to-URL mapping and search patterns.
52+
53+
**Key rule:** If you can't find a claim in the docs, either qualify it ("as of this writing") or omit it. Blog posts extend the docs — they don't contradict them.
54+
55+
### Step 3 — Plan the post
56+
57+
Before writing:
58+
59+
- **Title**: 50–60 chars, keyword-forward, avoids clichés like "Ultimate Guide"
60+
- **Angle**: What specific insight does this deliver that docs can't?
61+
- **Structure**: 3–5 main sections, each building on the last
62+
- **Cross-links**: Which Layer5 pages belong? (see docs-sources.md)
63+
- **CTA**: What does the reader do immediately after?
64+
- **Resource flag**: Worth adding `resource: true`?
65+
- **Design embed**: Does this post walk through a specific infrastructure topology (Redis, Dapr, a Kubernetes Deployment, an AWS pattern)? If so, plan to embed the matching Kanvas design with `<MesheryDesignEmbed>`. The available designs and their IDs are in `references/blog-structure.md`.
66+
67+
### Step 4 — Write the blog post
68+
69+
Read `references/blog-structure.md` for the full format spec.
70+
71+
**File path:**
72+
73+
```
74+
src/collections/blog/YYYY/MM-DD-descriptive-slug/index.mdx
75+
```
76+
77+
Work from the root of the Layer5 repo. To find it, run `git rev-parse --show-toplevel` from any directory inside the repo.
78+
79+
### Step 5 — Generate the hero image
80+
81+
```bash
82+
python3 "<skill_dir>/scripts/generate_hero_image.py" \
83+
--title "Your Blog Post Title" \
84+
--subtitle "Optional subtitle" \
85+
--category "Kubernetes" \
86+
--output "src/collections/blog/YYYY/MM-DD-slug/hero-image.svg" \
87+
--repo-root /path/to/layer5/repo
88+
```
89+
90+
Requires Pillow (`pip install Pillow`). Produces a 1200x630 SVG that:
91+
92+
- Generates a cosmic dark-gradient PNG background with nebula glows and teal star fields, color-keyed by `--category`
93+
- Overlays a real Five mascot SVG from the repo (curated standalone poses only - no complex scenes)
94+
- Embeds Qanelas Soft font (from `static/fonts/qanelas-soft/`) for brand-accurate typography
95+
- Renders a freeform-gradient light field behind Five using white and Layer5 brand teal tones, blended organically via Gaussian blur - consistent with the visual treatment used in Layer5's Adventures of Five artwork
96+
97+
**Five mascot rules (enforced by the script):**
98+
99+
- Uses real SVG assets from `src/assets/images/five/SVG/`
100+
- Five's colors are never modified: black skeleton, teal (#00B39F) shoes and hands
101+
- A multi-point freeform glow (white + brand teal blends) is placed behind Five so the black skeleton reads clearly on the dark background
102+
103+
Pass `--repo-root` as the absolute path to the Layer5 repo root. Without it, the script outputs a PNG-only background with no mascot or brand font.
104+
105+
Update frontmatter:
106+
107+
```yaml
108+
thumbnail: ./hero-image.svg
109+
darkthumbnail: ./hero-image.svg
110+
```
111+
112+
### Step 6 — Final quality check
113+
114+
- [ ] All frontmatter fields present
115+
- [ ] `published: true` (or `false` for draft)
116+
- [ ] At least one image with descriptive alt text
117+
- [ ] At least one `<CTA_FullWidth>` or `<KanvasCTA>`
118+
- [ ] At least one `<Blockquote>` for emphasis
119+
- [ ] Posts about specific infrastructure patterns: `<MesheryDesignEmbed>` with a matching design from the table in `references/blog-structure.md`
120+
- [ ] Multiple `<Link>` components for internal navigation
121+
- [ ] `className` in JSX (not `class`)
122+
- [ ] No em dashes (`—`) anywhere - hyphens (`-`) only
123+
- [ ] Opening lede wrapped in `<div className="intro">`
124+
- [ ] Closing next-steps wrapped in `<div className="outro">`
125+
- [ ] Technical posts: consider `resource: true`
126+
- [ ] Tags and categories from the approved list
127+
128+
## Reference files
129+
130+
- **`references/blog-structure.md`** — Complete MDX format, frontmatter fields, all component patterns including `<MesheryDesignEmbed>` with the full table of available designs. Read before writing.
131+
- **`references/tags-categories.md`** — Approved tags and categories.
132+
- **`scripts/generate_hero_image.py`** — Cosmic-style hero image generator.

0 commit comments

Comments
 (0)