# Post Studio

> Generate ad-hoc FinVerge product-led content (product-feature, positioning, product-launch posts) across LinkedIn / X / Blog / WhatsApp Business with typographic cards and multi-slide carousels. Use whenever Himani (or the marketing team) wants a one-off post that is NOT part of the scheduled 10-week campaign. Triggers on phrases like "draft a LinkedIn post about [feature]", "make a product-feature post for [product]", "positioning post on [topic]", "we're launching [X], draft the announcement", "create a carousel on NACH failure rates", "post for the sales head on [objection]". Inherits voice rules, persona tags, CTA framework, and the 4-criteria filter from content-campaign. Produces ready-to-post drafts + branded visuals + audit report.

- Skill: `himanisharrma/post-studio` (Agent Skill, multi-file: 11 files)
- Install (CLI): `npx skillmds@latest add himanisharrma/post-studio`
- Raw SKILL.md: https://api.skillmd.com/api/skills/himanisharrma/post-studio/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: himanisharrma (https://skillmd.com/u/himanisharrma)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/himanisharrma/post-studio

---


# Post Studio Skill — FinVerge Ad-Hoc Product Content

Use this skill when you need a one-off post outside the scheduled campaign. Examples:
- the NACH owner wants to explain NACH ML-scoring to NBFC CFOs this week
- Swapnesh needs a positioning post about why most PGs can't do hybrid
- A new partnership just signed — we need a launch announcement today

## When to use

Triggering phrases (non-exhaustive):
- "Draft a post about [product/feature]"
- "Make a product-feature post for [NACH / PG / Collect / Orchestrate]"
- "Positioning post on [topic]"
- "We're launching [X] — write the announcement"
- "Create a carousel on [topic]"
- "Post for [owner] on [topic]"

Do NOT use this skill for:
- Scheduled campaign posts (W1–W10) — use `content-campaign` + its Friday batch
- Hiring / event / employer-brand posts — not in scope for v1
- Bank proposals — use `bank-proposal-generator`
- Per-product demo decks — use the relevant product skill

## The 7-step conversational flow

When triggered, walk through these 7 questions one at a time. Do NOT ask them all at once — teammates using this for the first time need the steps spaced out.

### Step 1 — Post type

Ask:
> "What kind of post is this?
>  1. **Product-feature** — explain one product/module (e.g., 'how Lightning Onboarding works')
>  2. **Positioning** — category framing (e.g., 'why hybrid matters for enterprise')
>  3. **Product-launch** — announce a new product, module, or partnership"

Capture choice → sets `post_type` in the meta scratchpad.

All three post types are fully wired in v1.1 — each has its own structure guide (`references/product-feature-patterns.md`, `positioning-patterns.md`, `product-launch-patterns.md`) and its own carousel template.

### Step 2 — Topic

Ask:
> "What's the topic or angle? Paste any supporting context (URL, transcript snippet, raw notes) if you have it."

Capture: `topic` (free text), `supporting_context` (optional paste).

### Step 3 — Owner voice

Ask:
> "Whose voice? Default for a product-feature post is the feature owner: the NACH owner (NACH/onboarding), the PG owner (PG/settlement), the Collect owner (Collect/Orchestrate), Chaitanya (FRM), or PruthviRaj (Product Head / architecture). For positioning, default is PruthviRaj or the CBO. For launch, default is the founder or Himani."

Capture `owner` → pulls voice_tag from `content-campaign`'s `OWNER_MAP`.

### Step 4 — Persona tag

Default per `OWNER_MAP[owner]["default_persona"]`. Offer to override from the 5-tag taxonomy:
- `[For NBFCs]` · `[For D2C Founders]` · `[For Enterprise CFOs]` · `[For Fintechs]` · `[For Payments Leaders]`

### Step 5 — Platforms

Ask:
> "Which platforms? LinkedIn is always on. Multi-select: X / Twitter, Internal newsletter / blog, WhatsApp Business."

All four platforms are wired via `fanout.py` in v1.1:
- **LinkedIn** — primary draft (Claude writes against the brief)
- **X / Twitter** — auto-compressed from LinkedIn (20-50 words, 1-2 hashtags)
- **Blog / Newsletter** — auto-expanded from LinkedIn (H2 sections, email-based CTA, 800-1500 word target)
- **WhatsApp Business** — auto-reformatted from LinkedIn (3-5 short lines, plain text, finverge.in link)

### Step 6 — Design output

Ask:
> "Any visuals? Multi-select:
>  - No graphic
>  - Quote card (1200×627 typographic)
>  - Stat card (big-number hero)
>  - Headline card (clean title + subhead)
>  - Carousel (5–7 slide deck)"

Design rendering is fully implemented in v1.1:
- **Cards** — PIL-based 1200×627 PNGs (quote / stat / headline) with FinVerge brand frame + white logo
- **Carousels** — python-pptx decks (1080×1080 square format) + PIL-rendered PNG preview sequence. `.pptx` is editable in Keynote/PowerPoint; PNGs are LinkedIn-ready
- **Composite** — "quote card + positioning carousel" (positioning default) and "launch deck + headline card" (launch default)

For carousel renders you'll need to provide `design_inputs.sections` in meta.json with the per-slide content. If missing, the script writes a template explaining what's needed.

### Step 7 — CTA type

Default per `OWNER_MAP[owner]["default_cta_type"]` + post-type:
- Product-feature → Authority CTA (*"DM the sales head"*)
- Positioning → Soft CTA (open question)
- Product-launch → Soft CTA
- Can override: Soft / DM / Authority / Comment

## Then: generate

Once inputs are collected, run:

```bash
python3 skills/post-studio/scripts/generate_post.py \
    --meta <path-to-scratchpad.json> \
    --output-dir ~/Downloads/ad-hoc-posts/
```

(Or call it directly from Claude — it's a simple Python module.)

It will:
1. Load voice rules from `content-campaign/campaign_meta.py`
2. Load product KB (for product-feature posts) via `shared/kb_loader.py`
3. Write a LinkedIn draft following `references/product-feature-patterns.md`
4. Run `audit_post.audit()` on the draft — block on hard-fail
5. Render selected graphics (v1: stubbed)
6. Compress to X / expand to Blog / re-format to WhatsApp (v1: stubbed)
7. Save everything to `~/Downloads/ad-hoc-posts/YYYY-MM-DD_<topic-slug>/`

## Output structure

```
~/Downloads/ad-hoc-posts/
└── 2026-04-21_nach-mandate-failures/
    ├── meta.json           # the 7-step inputs + resolved defaults
    ├── linkedin.md         # the LinkedIn post (ready to copy-paste)
    ├── x.md                # X/Twitter variant (v1: stubbed)
    ├── blog.md             # Long-form blog expansion (v1: stubbed)
    ├── whatsapp.md         # WhatsApp broadcast (v1: stubbed)
    ├── audit.json          # structural + strategy-doc audit results
    ├── graphic.png         # Rendered card (v1: stubbed)
    └── carousel.pptx       # Multi-slide deck (v1: stubbed)
```

## Inherited rules (from content-campaign)

All posts produced by post-studio MUST follow the same rules as campaign posts:

- **Persona tag mandatory** — first line of every post
- **No fabricated numbers** — approved quantification only (1.4M cash counters, RBI PA-O/PA-P, 10 years, 2× revenue)
- **No weak openers** — "I'm excited to announce…" is hard-fail
- **"Hybrid" is the hero word** — lead with it when framing FinVerge differentiation
- **"Bharat" for inclusion framing** / "India" for regulatory framing
- **Hashtag bounds** — LinkedIn 3-5, X 1-2
- **CTA framework** — every post closes with one of the 4 CTA types
- **All inbound routes to the sales head** — regardless of CTA type, the ultimate destination is a discovery call

These are enforced by `scripts/audit_post.py` (same module used by content-campaign).

## v1.1 status — full feature set

| Feature | Status |
|---|---|
| Product-feature post → LinkedIn | ✅ Working |
| Positioning post → LinkedIn | ✅ Working |
| Product-launch post → LinkedIn | ✅ Working |
| X / Blog / WhatsApp fanout | ✅ Working (structural transforms, no LLM) |
| Quote / Stat / Headline cards | ✅ Working (PIL, 1200×627, brand frame) |
| Carousels (feature 5 / positioning 5 / launch 7) | ✅ Working (python-pptx + PNG preview) |
| Auditor integration | ✅ Working |
| Voice rules inheritance | ✅ Working |

## Coming in v1.2+

- AI-assisted image generation (hero illustrations, not just typography)
- Canva/Figma MCP integration for per-user template customisation
- Direct-to-LinkedIn scheduler API (Buffer / native)
- Additional post types (use-case stories, deal stories, poll posts)

## Shared code reused

- `shared/kb_loader.py` — product KB access
- `shared/brand.py` — design tokens (for when design is implemented)
- `skills/content-campaign/campaign_meta.py` — PERSONA_TAGS, CTA_FRAMEWORK, FINVERGE_VOICE_RULES, OWNER_MAP
- `skills/content-campaign/scripts/audit_post.py` — the 4-criteria + strategy-doc auditor

