web-publisher-publishlisted
Install: claude install-skill talentedgeai/infinite-leverage
# Web Publisher: Publish Post
## Discovery
```bash
ls -1t content/topics/ # newest first
```
Find the first folder that has both `blog.md` AND `{slug}-hero.webp` but NO published page.
## Steps per Run
### Phase 1 — Content assembly
1. Read `blog.md` and `seo.md` — full content + front matter + SEO metadata
2. Read the project's web style guide for component conventions
3. Copy `{slug}-hero.webp` to `website/public/images/blog/`
### Phase 2 — Code
4. Write the page at `website/app/blog/{slug}/page.tsx` (App Router):
- `export const metadata` (or `generateMetadata`) with title, description, OG/Twitter, canonical
- `next/image` for all images; read-time estimate in post header; category tag from style guide; Tailwind classes (no inline styles)
- Follow the patterns of existing posts under `website/app/blog/`
5. Confirm `npm run build` passes clean
### Phase 3 — Index update
6. Add the post card at the top of the blog index (`website/app/blog/page.tsx`) — follow the existing card pattern exactly
### Phase 4 — Quality gate (run before commit)
- [ ] Page renders — correct TSX, no missing imports
- [ ] All images use `next/image` with correct `src`, `alt`, `width`, `height`
- [ ] `metadata` includes title, meta description, OG/Twitter tags
- [ ] Category tag matches a valid blog category
- [ ] Post card at top of blog index grid
- [ ] Read-time estimate in post header
### Phase 5 — Branch, commit, push the branch
Never commit or push on `main` — `.claude/rules/gl