← ClaudeAtlas

web-publisher-publishlisted

Takes a finished blog post all the way to production — writes the App Router page, updates the blog index, commits on a publish branch, opens a PR, and confirms the Vercel deployment is healthy. Never commits or pushes on main. The post is not done until the build is green. Owned by the developer agent. Use when the operator says "publish", "push the post live", or "build the page", or a finished post + hero image are waiting.
talentedgeai/infinite-leverage · ★ 0 · Web & Frontend · score 62
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