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?
- Product-feature — explain one product/module (e.g., 'how Lightning Onboarding works')
- Positioning — category framing (e.g., 'why hybrid matters for enterprise')
- 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.
.pptxis 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:
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:
- Load voice rules from
content-campaign/campaign_meta.py - Load product KB (for product-feature posts) via
shared/kb_loader.py - Write a LinkedIn draft following
references/product-feature-patterns.md - Run
audit_post.audit()on the draft — block on hard-fail - Render selected graphics (v1: stubbed)
- Compress to X / expand to Blog / re-format to WhatsApp (v1: stubbed)
- 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 accessshared/brand.py— design tokens (for when design is implemented)skills/content-campaign/campaign_meta.py— PERSONA_TAGS, CTA_FRAMEWORK, FINVERGE_VOICE_RULES, OWNER_MAPskills/content-campaign/scripts/audit_post.py— the 4-criteria + strategy-doc auditor