persona
Persona — Writing Style & Social Intelligence
Operations
1. Capture Writing Style
Build a writing profile from a user's X posts. Requires X_BEARER_TOKEN.
${SKILL_DIR}/scripts/capture.sh --username <handle> [--count 50] [--output <path>] [--refresh]
- Fetches original English posts, scores by 60% recency + 40% engagement
- Writes profile to
.claude/persona/<username>.json - Cached for 7 days — pass
--refreshto force re-fetch
2. Track Users
Manage a pool of X users to monitor. Pool stored in .claude/persona/pool.json.
# Add a user (validates via X API, auto-captures profile)
${SKILL_DIR}/scripts/track.sh add <username> [--note "reason"]
# Remove a user
${SKILL_DIR}/scripts/track.sh remove <username>
# List all tracked users with profile status
${SKILL_DIR}/scripts/track.sh list
# Refresh profiles for one or all users
${SKILL_DIR}/scripts/track.sh refresh [username]
3. Scan Social Intelligence
Run a social intelligence scan via xAI Grok. Requires XAI_API_KEY.
${SKILL_DIR}/scripts/scan.sh [--topics "Bitcoin SV, AI agents"] [--pool] [--save-topics] [--refresh]
- Returns: Technical Developments, Content Opportunities, Notable Activity, Early Signals
--poolincludes recent activity from tracked users--save-topicspersists topics to.claude/persona/topics.json- Cached for 4 hours — pass
--refreshto force
4. Generate Draft (Full Pipeline)
Generate a styled draft post by combining all context layers — persona profile, body of work, git activity, social intelligence, and content strategy. Calls the Claude API directly.
${SKILL_DIR}/scripts/draft.sh [--profile <path>] [--scan <path>] [--topic "angle"] [--parts 3] [--output <path>] [--model claude-sonnet-4-6]
Context assembly (mirrors satchmo.dev pipeline):
- Voice examples from persona profile
- Body of work from
.claude/persona/work.json - Recent git commits from repos in work.json
- Social intelligence scan (cached or specify path)
- Content strategy rules
The LLM cross-references all layers — connecting trending topics to your actual work and recent commits. Requires ANTHROPIC_API_KEY.
5. Manage Body of Work
Configure the projects/products you've built — gives the LLM context about what to connect trending topics to.
# Add a project
${SKILL_DIR}/scripts/work.sh add --title "Project Name" --desc "What it does" --tags "tag1, tag2" [--repo owner/repo]
# List projects
${SKILL_DIR}/scripts/work.sh list
# Remove a project
${SKILL_DIR}/scripts/work.sh remove "Project Name"
Projects with a --repo field also feed into git activity fetching.
6. Fetch Git Activity
Fetch recent commits from configured repos (pulled from work.json repo fields + explicit repos).
${SKILL_DIR}/scripts/git-activity.sh [--repos "owner/repo1, owner/repo2"] [--per-repo 5] [--hours 48]
Uses GITHUB_TOKEN for private repos. Public repos work without auth.
7. Apply Style to Draft (Manual)
Assemble a style-matching prompt from a profile and draft content. Does NOT call an LLM — outputs a prompt payload for you to use. Use draft.sh instead for the full pipeline.
${SKILL_DIR}/scripts/apply.sh --draft <path-or--> [--profile <path>] [--format thread|single] [--max-chars 280]
- Loads the persona profile, content strategy rules, and draft
- Outputs JSON with
system,prompt, andoutput_schemafields - Feed this to
generateText()or your preferred model
8. Preview Post
Open a local preview of a styled post in the browser. Fully offline — no external services.
# Static preview (self-contained HTML, auto-opens browser)
${SKILL_DIR}/scripts/preview.sh --post <json-path> [--image <path>] [--username <handle>]
# Interactive playground (live editing, image generation, approval workflow)
bun run ${SKILL_DIR}/scripts/playground.ts --data <json-path> [--port 4747] [--open]
- preview.sh: Static HTML preview with base64-embedded images
- playground.ts: Live editor with real-time preview, image upload/generation, approve/reject workflow
--openflag opens browser automatically (default: no auto-open)- Shows real X avatar when token is available or profile has been captured
- Generate Image button uses gemskills (requires
claude plugin install gemskills@b-open-io) - Auto-exits 30s after browser tab closes (heartbeat-based)
Workflow: Generate a Post (Full Pipeline)
- Set up body of work:
work.sh add --title "..." --desc "..." --tags "..." --repo "..." - Capture voice profile:
capture.sh --username <handle> - Scan for intelligence:
scan.sh --topics "..." - Generate draft:
draft.sh --parts 3 --output post.json - Preview and edit:
bun run playground.ts --data post.json --open - Approve in playground
Or with a specific topic from the scan:
4b. draft.sh --topic "opportunity from scan" --parts 2 --output post.json
Workflow: Restyle an Existing Draft (Manual)
- Write a rough draft
- Run
apply.sh --draft <path> --profile .claude/persona/<handle>.json - Use the returned prompt payload with your preferred LLM
- Preview:
preview.sh --post <output.json>
Workflow: Set Up Tracking Pool
track.sh add wildsatchmo --note "self"track.sh add somedev --note "BSV builder"track.sh list— verify pool and profile statusscan.sh --pool— include pool activity in scans
Storage
All data lives in .claude/persona/ in the project root:
.claude/persona/
├── <username>.json # Individual writing profiles
├── pool.json # Tracked user roster
├── work.json # Body of work / projects config
├── topics.json # Configured scan topics
└── last-scan.json # Cached social intelligence scan
Environment Variables
Token resolution is automatic — scripts try tokens in order and fall back gracefully.
| Variable | Required For | Where to Get | Notes |
|---|---|---|---|
X_BEARER_TOKEN |
capture, track, playground | https://developer.x.com/en/portal/dashboard | App-only token (preferred, never expires) |
X_ACCESS_TOKEN |
capture, track (fallback) | OAuth 2.0 flow | User token, works for reads too |
X_REFRESH_TOKEN |
auto-refresh | OAuth 2.0 flow | Used with X_CLIENT_SECRET_ID |
X_CLIENT_SECRET_ID |
auto-refresh | https://developer.x.com/en/portal/dashboard | OAuth client ID |
XAI_API_KEY |
scan | https://x.ai/api | xAI Grok for social intelligence |
ANTHROPIC_API_KEY |
draft | https://console.anthropic.com/ | Claude API for draft generation |
GITHUB_TOKEN |
git-activity | https://github.com/settings/tokens | For private repo commit fetching |
Token resolution order: X_BEARER_TOKEN → X_ACCESS_TOKEN → OAuth refresh → fail with instructions.