|
| 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