Kip Blog Post
Write, illustrate, and publish a new entry on the kip.computer blog. The site is
a static SvelteKit project at {{HOME}}/Code/kip-claw; blog posts are mdsvex
Markdown files with YAML frontmatter, listed by a registry in src/lib/posts.ts
and rendered with a lead-art image.
Triggered when Ben asks to "write a blog post", "announce" something on
kip.computer, or publish a dispatch about a new app, skill, or project.
Repository layout
- Repo:
{{HOME}}/Code/kip-claw
- Post file:
src/routes/blog/<YYYY-MM-DD-slug>/+page.md
- Post registry:
src/lib/posts.ts (newest first)
- Lead art:
static/images/<slug-base>.jpg plus -1200.webp and -760.webp variants
- Voice reference:
{{HOME}}/.openclaw/workspace/SOUL.md
Voice
Read SOUL.md and skim two or three recent posts under src/routes/blog/
before writing. Match Kip's established voice:
- First person, plainspoken, unhurried. Short declarative sentences.
- Frame work as small, durable plumbing that "makes the invisible visible."
- Ground details in Ben's life and the Raspberry Pi in Kips Bay when natural.
- An occasional, light nod to Rudyard Kipling — only when it fits, never forced.
- Honest and concrete about what a thing does and does not do.
- No marketing hype, no emoji, no exclamation points.
Frontmatter schema
Every post +page.md begins with YAML frontmatter:
---
title: Say the Word
deck: One-line summary shown under the title.
description: Slightly longer SEO/meta description (one or two sentences).
url: https://kip.computer/blog/<YYYY-MM-DD-slug>/
slug: <YYYY-MM-DD-slug>
leadArt:
src: /images/<slug-base>.jpg
alt: Descriptive alt text for the lead image.
caption: Short caption shown beneath the lead image.
---
The body is Markdown. Mdsvex applies the BlogPostLayout automatically, which
renders the lead art from frontmatter — do not add an <img> for it in the body.
Workflow
Pick the slug and date. Use <YYYY-MM-DD>-<short-kebab-name>, e.g.
2026-06-18-ask-kip. The date is today's date.
Draft the post. Create
src/routes/blog/<slug>/+page.md with the frontmatter above and the body in
Kip's voice. Link to the relevant repo/app. Keep it tight — most posts are a
few short paragraphs.
Generate the lead art. Use the OpenClaw image pipeline (same model the
Bosch generator uses). Lead art is a photorealistic lobster in a scene that
illustrates the post:
cd {{HOME}}/Code/kip-claw
openclaw infer image generate \
--model "openai/gpt-image-2" \
--size 1536x1024 \
--output-format jpeg \
--timeout-ms 240000 \
--output "static/images/<slug-base>.jpg" \
--prompt "<photorealistic prompt>" \
--json
Write a vivid, photojournalistic prompt. Confirm "ok": true in the JSON
output and that the file was written.
Make the webp variants. The site expects -1200.webp and -760.webp
alongside the jpg:
{{HOME}}/.openclaw/workspace/skills/kip-blog-post/scripts/make-lead-art-variants.sh \
static/images/<slug-base>.jpg
Register the post. Add an entry to the top of the posts array in
src/lib/posts.ts (newest first). Use tabs for indentation to match the file:
{
slug: '<YYYY-MM-DD-slug>',
title: '<title>',
date: '<YYYY-MM-DD>',
displayDate: '<Month D, YYYY>',
description: '<one-sentence summary>'
},
Format and build to verify.
cd {{HOME}}/Code/kip-claw
npx prettier --write "src/routes/blog/<slug>/+page.md" src/lib/posts.ts
npm run build
The build prerenders the post; confirm build/blog/<slug>/index.html exists
and the post appears on build/blog/index.html.
Commit and push. A Husky pre-commit hook runs svelte-check and
prettier --check, so the tree must be clean first.
cd {{HOME}}/Code/kip-claw
git add src/lib/posts.ts "src/routes/blog/<slug>/" \
"static/images/<slug-base>.jpg" \
"static/images/<slug-base>-1200.webp" \
"static/images/<slug-base>-760.webp"
git -c user.name='kip-claw' -c user.email='kip-claw@users.noreply.github.com' \
commit -m "Add <slug-base> blog post"
git push origin main
Report. Tell Ben the post title, the live URL
(https://kip.computer/blog/<slug>/), and a one-line summary of the lead art.
Notes
- Deploy is automatic from
main; no manual deploy step.
- If
npm run build fails, read the error, fix the frontmatter or registry
entry, and rebuild before committing — never commit a broken build.
- Keep credentials and private machinery out of posts; publish the aggregate
view, not the plumbing.
1---2name: kip-blog-post3description: Authors and publishes a new blog post on kip.computer, including lead art generation.4---56# Kip Blog Post78Write, illustrate, and publish a new entry on the kip.computer blog. The site is9a static SvelteKit project at `{{HOME}}/Code/kip-claw`; blog posts are mdsvex10Markdown files with YAML frontmatter, listed by a registry in `src/lib/posts.ts`11and rendered with a lead-art image.1213Triggered when Ben asks to "write a blog post", "announce" something on14kip.computer, or publish a dispatch about a new app, skill, or project.1516## Repository layout1718- Repo: `{{HOME}}/Code/kip-claw`19- Post file: `src/routes/blog/<YYYY-MM-DD-slug>/+page.md`20- Post registry: `src/lib/posts.ts` (newest first)21- Lead art: `static/images/<slug-base>.jpg` plus `-1200.webp` and `-760.webp` variants22- Voice reference: `{{HOME}}/.openclaw/workspace/SOUL.md`2324## Voice2526Read `SOUL.md` and skim two or three recent posts under `src/routes/blog/`27before writing. Match Kip's established voice:2829- First person, plainspoken, unhurried. Short declarative sentences.30- Frame work as small, durable plumbing that "makes the invisible visible."31- Ground details in Ben's life and the Raspberry Pi in Kips Bay when natural.32- An occasional, light nod to Rudyard Kipling — only when it fits, never forced.33- Honest and concrete about what a thing does and does not do.34- No marketing hype, no emoji, no exclamation points.3536## Frontmatter schema3738Every post `+page.md` begins with YAML frontmatter:3940```yaml41---42title: Say the Word43deck: One-line summary shown under the title.44description: Slightly longer SEO/meta description (one or two sentences).45url: https://kip.computer/blog/<YYYY-MM-DD-slug>/46slug: <YYYY-MM-DD-slug>47leadArt:48 src: /images/<slug-base>.jpg49 alt: Descriptive alt text for the lead image.50 caption: Short caption shown beneath the lead image.51---52```5354The body is Markdown. Mdsvex applies the `BlogPostLayout` automatically, which55renders the lead art from frontmatter — do not add an `<img>` for it in the body.5657## Workflow58591. **Pick the slug and date.** Use `<YYYY-MM-DD>-<short-kebab-name>`, e.g.60 `2026-06-18-ask-kip`. The date is today's date.61622. **Draft the post.** Create63 `src/routes/blog/<slug>/+page.md` with the frontmatter above and the body in64 Kip's voice. Link to the relevant repo/app. Keep it tight — most posts are a65 few short paragraphs.66673. **Generate the lead art.** Use the OpenClaw image pipeline (same model the68 Bosch generator uses). Lead art is a photorealistic lobster in a scene that69 illustrates the post:7071 ```bash72 cd {{HOME}}/Code/kip-claw73 openclaw infer image generate \74 --model "openai/gpt-image-2" \75 --size 1536x1024 \76 --output-format jpeg \77 --timeout-ms 240000 \78 --output "static/images/<slug-base>.jpg" \79 --prompt "<photorealistic prompt>" \80 --json81 ```8283 Write a vivid, photojournalistic prompt. Confirm `"ok": true` in the JSON84 output and that the file was written.85864. **Make the webp variants.** The site expects `-1200.webp` and `-760.webp`87 alongside the jpg:8889 ```bash90 {{HOME}}/.openclaw/workspace/skills/kip-blog-post/scripts/make-lead-art-variants.sh \91 static/images/<slug-base>.jpg92 ```93945. **Register the post.** Add an entry to the top of the `posts` array in95 `src/lib/posts.ts` (newest first). Use tabs for indentation to match the file:9697 ```ts98 {99 slug: '<YYYY-MM-DD-slug>',100 title: '<title>',101 date: '<YYYY-MM-DD>',102 displayDate: '<Month D, YYYY>',103 description: '<one-sentence summary>'104 },105 ```1061076. **Format and build to verify.**108109 ```bash110 cd {{HOME}}/Code/kip-claw111 npx prettier --write "src/routes/blog/<slug>/+page.md" src/lib/posts.ts112 npm run build113 ```114115 The build prerenders the post; confirm `build/blog/<slug>/index.html` exists116 and the post appears on `build/blog/index.html`.1171187. **Commit and push.** A Husky pre-commit hook runs `svelte-check` and119 `prettier --check`, so the tree must be clean first.120121 ```bash122 cd {{HOME}}/Code/kip-claw123 git add src/lib/posts.ts "src/routes/blog/<slug>/" \124 "static/images/<slug-base>.jpg" \125 "static/images/<slug-base>-1200.webp" \126 "static/images/<slug-base>-760.webp"127 git -c user.name='kip-claw' -c user.email='kip-claw@users.noreply.github.com' \128 commit -m "Add <slug-base> blog post"129 git push origin main130 ```1311328. **Report.** Tell Ben the post title, the live URL133 (`https://kip.computer/blog/<slug>/`), and a one-line summary of the lead art.134135## Notes136137- Deploy is automatic from `main`; no manual deploy step.138- If `npm run build` fails, read the error, fix the frontmatter or registry139 entry, and rebuild before committing — never commit a broken build.140- Keep credentials and private machinery out of posts; publish the aggregate141 view, not the plumbing.