gooseworks-ai/generate-voice-guide
> Generate a personal voice guide for X (Twitter) and/or LinkedIn by scanning a user's past posts and iteratively refining with sample-and-feedback loops. Produces a structured markdown voice guide that sibling skills (create-x-content, create-linkedin-content) consume to draft in-voice posts. Different from brand-voice-extractor, which analyses company blogs/landing pages — this skill is for personal social voice.
npx skills add https://github.com/gooseworks-ai/goose-skills --skill generate-voice-guide
Turn a real person's past posts into a structured voice guide that other skills can use to draft in-voice content. Produces one guide per platform (X, LinkedIn, or both) with persona, dos/don'ts, banned phrases, hook patterns, format rules, and example posts.
This is an agent-executed skill — the agent handles scraping, analysis, drafting, and iteration via the tools available in the session. No bundled Python script.
create-x-content, create-linkedin-content, social-kit) needs a voice guide and one doesn't existWhen NOT to use: For analysing a company's blog/landing-page voice, use brand-voice-extractor instead. That's for corporate marketing voice; this one is for individual social voice.
Interactive:
/generate-voice-guide
Args mode:
/generate-voice-guide --profile @GooseworksAI --platforms x,linkedin --output ~/.goose-skills/voice-guides
Ask these up front if not supplied via flags:
@GooseworksAI), a LinkedIn profile URL, or both. You can mimic your own voice or someone else's."~/.goose-skills/voice-guides/voice-{x,linkedin}.md. Ok to use that, or prefer a different path?"For X:
apidojo/twitter-user-tweets-scraper (or whichever X scraper is available in the session) keyed to the handle.APIFY_API_TOKEN env var. If missing, surface a clear error with the setup link.For LinkedIn:
harvestapi/linkedin-profile-posts keyed to the profile URL.Fallback (no scraper available or posts paywalled): ask the user to paste 15–25 posts as plain text.
Store raw post text, engagement metrics (likes, views if available), and timestamps.
Use voice-x.md / voice-linkedin.md template references (see "Template Skeleton" below) to produce v1 of the guide. Do NOT copy content from them — only the *structure*.
Analyse the scraped posts for:
excited to share, leverage, game-changing, thrilled, etc.). List 10–20.This is where voice-guide quality is made. Do NOT skip iterations.
Each iteration:
Stopping rule: continue until the user explicitly says "this is good" AND at least 5 iterations have completed. 5 is a floor, not a ceiling. If the user says "good enough" at iteration 2, push back: "Voice guides need at least 5 rounds to actually lock in. Can we do 3 more?"
~/.goose-skills/voice-guides/voice-<platform>.md).~/.goose-skills/config.json: {
"voice_guides": {
"x": "<absolute path to voice-x.md>",
"linkedin": "<absolute path to voice-linkedin.md>"
}
}
Create the directory/file if missing. Merge with existing config if present (don't overwrite other keys).
/create-x-content --brief \"...\" and it'll use this voice guide automatically."Every generated voice guide should have these top-level sections, in order:
# Voice Guide: <Platform> — <Handle or Name>
## Persona
## The "Meat" Principle
## Dos
## Don'ts
## Banned Phrases
## Hook Patterns
## CTA Guidelines
## Format Rules
## Tone Calibration
## Example Posts That Exemplify The Voice
Match the depth and specificity of a well-written voice guide — prose for persona, numbered lists for dos/don'ts, quoted examples with analysis. Aim for 120–250 lines.
~/.goose-skills/config.json is a lightweight cross-skill config. Schema:
{
"voice_guides": {
"x": "/absolute/path/to/voice-x.md",
"linkedin": "/absolute/path/to/voice-linkedin.md"
}
}
Sibling skills read this to discover voice guide paths. Always use absolute paths.
| Input | Required | Default |
|-------|----------|---------|
| --profile | Yes (one of X handle, LinkedIn URL, or both) | — |
| --platforms | No | x,linkedin if both profiles given, else matches supplied profiles |
| --posts-x | No | 50 |
| --posts-linkedin | No | 25 |
| --output | No | ~/.goose-skills/voice-guides |
| --iterations-min | No | 5 |
<output>/voice-x.md and/or <output>/voice-linkedin.md~/.goose-skills/config.json with voice guide pathsAPIFY_API_TOKEN) for scrapingWebFetch or read locally if the user has them) — not required to runTake gooseworks-ai/generate-voice-guide from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.