Transform meeting transcripts and notes into engaging social media posts with AI
shippost is a human-in-the-loop CLI tool that processes your content into social media post ideas. Keep your workflow local and private with Ollama, or leverage Anthropic Claude for enhanced quality.
CLI command: ship
- Why shippost?
- Quick Start
- Commands
- Configuration
- Content Strategies
- Typefully Integration
- X (Twitter) Integration
- Customizing Prompts
- Community Style Examples
- Tips & Best Practices
- Troubleshooting
- Development
| Feature | shippost | Manual Writing | Other Tools |
|---|---|---|---|
| Privacy | Local LLM support (Ollama) | ✓ | Cloud-only |
| Human-in-the-loop | Review before posting | ✓ | Often auto-posts |
| Style consistency | Learns your voice | Manual effort | Generic |
| Content strategies | 64 proven formats | Ad-hoc | Limited |
| Integrations | Typefully + X API | N/A | Varies |
- Flexible LLM Providers — Ollama (local, private) or Claude (cloud, high-quality)
- 64 Content Strategies — Proven post formats for maximum variety
- Customizable Style — Define your brand voice in editable prompt files
- X Post Analysis — Auto-generate style guides from your existing tweets
- Reply Guy Mode — Find and reply to tweets from your timeline
- Typefully Integration — Stage posts directly as drafts
- Banger Scoring — Each post scored 1-99 for viral potential
- Node.js >= 18.0.0
- LLM Provider (choose one):
- Ollama — Local, free, private
- Anthropic Claude — Cloud, paid, high-quality
git clone <repo-url>
cd shippost
npm install && npm run build
npm link # Makes 'ship' command available globally# Initialize a new project
ship init
# Add your content
cp ~/meeting-notes.txt input/
# Generate posts
ship work
# Review and stage to Typefully
ship reviewThat's it! Your posts are in posts.jsonl, ready for review.
| Command | Description |
|---|---|
ship init |
Initialize project structure |
ship work |
Generate posts from input files |
ship posts |
View generated posts |
ship review |
Interactively review and stage posts |
ship analyze-x |
Generate style guide from your tweets |
ship reply |
Find and post replies on X |
ship x-status |
Check X API rate limits |
ship stats |
X metrics dashboard (Basic tier) |
ship sync-prompts |
Update prompts to latest defaults |
Initialize a new ship project in the current directory.
Creates:
| Path | Description |
|---|---|
.shippostrc.json |
Project configuration |
input/ |
Directory for source content |
prompts/style.md |
Your posting style and voice |
prompts/work.md |
Post generation instructions |
prompts/system.md |
System prompt (advanced) |
prompts/analysis.md |
Style analysis prompt (advanced) |
prompts/content-analysis.md |
Strategy selection (advanced) |
prompts/banger-eval.md |
Viral scoring criteria (advanced) |
prompts/reply.md |
Reply analysis (advanced) |
strategies.json |
Customizable content strategies |
Process all files in input/ and generate posts.
# Basic usage (auto-selects 8 diverse strategies)
ship work
# List available strategies
ship work --list-strategies
ship work --list-strategies --category educational
# Use specific strategies
ship work --strategy personal-story
ship work --strategies "how-to-guide,bold-observation,resource-list"
# More options
ship work --count 12 # Generate 12 posts per file
ship work --model llama3.1 # Use specific model
ship work --force # Reprocess all files
ship work --verbose # Detailed output
ship work --no-strategies # Legacy mode (no strategies)Options:
-m, --model <model>— Override the LLM model-v, --verbose— Show detailed processing info-f, --force— Force reprocessing of all files-c, --count <n>— Posts to generate per file (default: 8)-s, --strategy <id>— Use specific strategy--strategies <ids>— Multiple strategies (comma-separated)--list-strategies— List all strategies--category <name>— Filter strategies by category--no-strategies— Disable strategy system
How it works:
- Validates environment (LLM provider, required files)
- Loads your style guide and instructions
- Scans
input/for.txtand.mdfiles - Skips already-processed files (use
--forceto override) - Generates posts using selected strategies
- Scores each post for viral potential
- Saves to
posts.jsonl
Note: File tracking in
.ship-state.jsonprevents duplicate processing. Modified files are automatically reprocessed.
View generated posts with filtering options.
ship posts # Last 10 posts
ship posts -n 20 # Last 20 posts
ship posts --strategy "personal-story"
ship posts --min-score 70 # High-quality only
ship posts --source "meeting" # Filter by source file
ship posts --eval # Score posts missing scoresOptions:
-n, --count <n>— Number of posts to show (default: 10)--strategy <name>— Filter by strategy--min-score <n>— Minimum banger score--source <text>— Filter by source filename--eval— Evaluate unscored posts
Interactively review posts and decide their fate. Posts are sorted by banger score (highest first).
ship review # Review all new posts
ship review --min-score 70 # Only high-quality postsActions during review:
s— Stage to Typefully (creates draft)Enter— Keep for latern— Rejectq— Quit
Post statuses:
new— Not yet reviewedkeep— Saved for laterstaged— Sent to Typefullyrejected— Filtered outpublished— Reserved for future
Generate a personalized style guide by analyzing your X posts.
ship analyze-x # Analyze 33 tweets (default)
ship analyze-x --count 100 # More tweets for deeper analysis
ship analyze-x --overwrite # Replace existing analysis
ship analyze-x --setup # Reconfigure X API credentialsRequirements:
- Free X Developer account (sign up)
- OAuth 2.0 app with redirect URI:
http://127.0.0.1:3000/callback - Scopes:
tweet.read,users.read,offline.access
First-time setup:
- Create app at X Developer Portal
- Enable OAuth 2.0
- Set redirect URI to
http://127.0.0.1:3000/callback - Run
ship analyze-xand enter your Client ID
Rate limits: Free tier allows 100 reads/month. Upgrade to Basic ($200/month) for 10,000 reads.
Find tweets from accounts you follow and generate contextual replies.
ship reply # Analyze 10 tweets
ship reply --count 20 # Analyze more tweetsActions during review:
Enter— Post the replye— Edit before postingn— Skip this tweetq— Quit
Requirements:
- Same X API setup as
ship analyze-x - App must have "Read and Write" permissions
- Additional scope:
tweet.write
Basic tier features ($200/month): Tweets sorted by author follower count, shows engagement metrics.
Check X API rate limits and account info.
ship x-statusShows: connected account, API tier, rate limit status with progress bars, and reset times.
Comprehensive X metrics dashboard. Requires X API Basic tier ($200/month).
ship statsShows: follower counts, posting activity, impressions with sparklines, 90-day goal progress, engagement metrics, best posting times, and top performing posts.
Update local prompts to latest package defaults.
ship sync-prompts # Interactive update
ship sync-prompts --force # Update all without promptingConfiguration is stored in .shippostrc.json.
{
"llm": {
"provider": "ollama"
},
"ollama": {
"host": "http://127.0.0.1:11434",
"model": "llama3.1",
"timeout": 60000
},
"generation": {
"postsPerTranscript": 8,
"temperature": 0.7,
"strategies": {
"enabled": true,
"autoSelect": true,
"diversityWeight": 0.7,
"preferThreadFriendly": false
}
}
}{
"llm": {
"provider": "anthropic"
},
"anthropic": {
"model": "claude-sonnet-4-5-20250514",
"maxTokens": 4096
},
"generation": {
"postsPerTranscript": 8,
"temperature": 0.7
},
"typefully": {
"socialSetId": "1"
}
}Set API keys in .env:
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
TYPEFULLY_API_KEY=your-typefully-api-key-hereSee ANTHROPIC_SETUP.md for detailed Claude setup.
| Option | Default | Description |
|---|---|---|
llm.provider |
ollama |
ollama or anthropic |
ollama.host |
http://127.0.0.1:11434 |
Ollama server URL |
ollama.model |
llama3.1 |
Ollama model |
ollama.timeout |
60000 |
Request timeout (ms) |
anthropic.model |
claude-3-5-sonnet-20241022 |
Claude model |
anthropic.maxTokens |
4096 |
Max response tokens |
generation.postsPerTranscript |
8 |
Posts per input file |
generation.temperature |
0.7 |
Creativity (0.0-1.0) |
generation.strategies.enabled |
true |
Enable strategies |
generation.strategies.autoSelect |
true |
Auto-select strategies |
generation.strategies.diversityWeight |
0.7 |
Category diversity (0.0-1.0) |
generation.strategies.preferThreadFriendly |
false |
Prefer thread strategies |
x.clientId |
— | X API OAuth Client ID |
x.apiTier |
free |
free or basic |
typefully.socialSetId |
"1" |
Typefully Social Set ID |
shippost includes 64 proven content strategies inspired by Typefully's successful formats. Each strategy provides a unique angle for presenting your ideas.
Instead of generic posts, shippost applies specific frameworks:
- Personal Story — Share experiences and transformations
- How-To Guide — Step-by-step instructions
- Bold Observation — Provocative statements that capture attention
- Before & After — Show transformation or progress
- Resource Thread — Curate valuable tools or links
- Behind-the-Scenes — Show your process
| Category | Description |
|---|---|
| Personal | Stories, experiences, transformations |
| Educational | How-tos, frameworks, tips |
| Provocative | Bold statements, contrarian takes |
| Engagement | Questions, polls, thought experiments |
| Curation | Lists, recommendations, resources |
| Behind-the-Scenes | Process, WIP, building |
| Reflective | Lessons learned, retrospectives |
- Content Analysis — Analyzes your transcript for characteristics (personal stories, actionable advice, strong opinions)
- Strategy Selection — Selects applicable strategies ensuring category diversity
- Post Generation — Each post follows one strategy's format
Edit strategies.json to add, modify, or remove strategies:
{
"id": "weekly-reflection",
"name": "Weekly Reflection Post",
"prompt": "Share a key lesson from this week. What did you learn?",
"category": "reflective",
"threadFriendly": false,
"applicability": {
"worksWithAnyContent": true
}
}Applicability flags:
requiresPersonalNarrative— Needs personal storiesrequiresActionableKnowledge— Needs how-to contentrequiresResources— Needs tool/book mentionsrequiresProject— Needs project contextrequiresStrongOpinion— Needs strong viewpointsworksWithAnyContent— Always applicable
Stage posts directly to Typefully drafts.
- Get API key: Typefully → Settings → Integrations
- Add to
.env:TYPEFULLY_API_KEY=your-api-key-here
- (Optional) Configure Social Set ID for multi-account setups
# Review posts and stage the best ones
ship review --min-score 70Press s during review to stage a post. The draft URL is displayed for quick access.
Note: Posts are created as drafts, not published. Requires Typefully Pro plan.
- Create app at X Developer Portal
- Enable OAuth 2.0
- Set redirect URI:
http://127.0.0.1:3000/callback - For
ship reply: Enable "Read and Write" permissions
| Feature | Free | Basic ($200/mo) |
|---|---|---|
| Analyze tweets | ✓ (100/mo) | ✓ (10,000/mo) |
| Post replies | ✓ | ✓ |
| Follower counts | — | ✓ |
| Sort by influence | — | ✓ |
| Stats dashboard | — | ✓ |
Configure tier in .shippostrc.json:
{
"x": {
"clientId": "your-client-id",
"apiTier": "basic"
}
}- Free tier: ~15 requests per 15 minutes
- Use
--count 10or less forship reply - Check status with
ship x-status
All prompts are stored as editable markdown files in prompts/.
| File | Purpose | When to Edit |
|---|---|---|
style.md |
Brand voice, tone, examples | Voice not right, want different tone |
work.md |
Generation instructions | Posts need different structure |
| File | Purpose |
|---|---|
system.md |
System prompt wrapper |
analysis.md |
X post style analysis |
content-analysis.md |
Strategy selection criteria |
banger-eval.md |
Viral scoring criteria |
reply.md |
Reply opportunity analysis |
- No code changes — Customize by editing markdown
- Version controlled — Track prompt changes in git
- Project-specific — Each project can have unique prompts
Learn from real style.md files in community-examples/style/.
# Browse examples
ls community-examples/style/
# Use as starting point
cp community-examples/style/example-technical-founder.md prompts/style.mdShare your style.md:
- Copy to
community-examples/style/your-name.md - Remove sensitive information
- Add context at the top
- Submit a PR
- Use well-structured transcripts with clear sections
- Remove filler words for better results
- Longer transcripts (500+ words) generate better insights
Ollama:
llama3.1— Good balance (default)llama2— Faster iterationsmixtral— More creative
Anthropic:
claude-sonnet-4-5-20250514— Best balance (recommended)claude-3-5-haiku-20241022— Fastestclaude-3-opus-20240229— Most capable
- Let auto-selection work for most transcripts
- Use
--count 12for longer transcripts - Analyze which strategies perform best using scores
- Experiment with
diversityWeightconfig
# Filter posts with jq
cat posts.jsonl | jq 'select(.metadata.bangerScore > 70)'
# Group by strategy
cat posts.jsonl | jq -r '.metadata.strategy.category' | sort | uniq -c
# Find best strategy
cat posts.jsonl | jq -r 'select(.metadata.bangerScore > 70) | .metadata.strategy.name' | sort | uniq -c | sort -rn"Ollama is not available"
# Install from https://ollama.ai
ollama serve # Start server
curl http://localhost:11434 # Verify"Model not found"
ollama pull llama3.1"API key not found"
Add to .env:
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here"API not available"
- Check API key validity
- Verify account has credits
- Check status.anthropic.com
403 errors when posting:
- Change app to "Read and write" at Developer Portal
- Delete
.shippost-tokens.json - Re-authenticate
429 rate limit errors:
- Wait 15 minutes
- Use
--count 10or less - Check
ship x-status
"Not a ship project"
ship initConfiguration errors
Ensure .shippostrc.json is valid JSON with required fields.
npm install # Install dependencies
npm run dev # Development mode
npm run build # Build TypeScript
npm link # Link globally for testingsrc/
├── index.ts # CLI entry point
├── commands/ # Command implementations
├── types/ # TypeScript types
├── services/ # LLM, X API, Typefully integrations
└── utils/ # Helpers (logging, validation, etc.)
Uses bd (beads). See AGENTS.md for workflow.
bd list # View all issues
bd ready # See unblocked work
bd create "..." # Create new issuePosts are stored in posts.jsonl:
{
"id": "uuid",
"sourceFile": "input/meeting.txt",
"content": "Your generated post...",
"metadata": {
"model": "llama3.1",
"temperature": 0.7,
"strategy": {
"id": "personal-story",
"name": "Personal Story",
"category": "personal"
},
"bangerScore": 75,
"bangerEvaluation": {
"score": 75,
"breakdown": { "hook": 18, "emotional": 16, "..." : "..." },
"reasoning": "Strong opening hook..."
}
},
"timestamp": "2024-01-15T10:30:00.000Z",
"status": "new"
}Each post is scored 1-99 for viral potential:
| Score | Potential |
|---|---|
| 1-29 | Low |
| 30-49 | Below average |
| 50-69 | Average |
| 70-84 | High |
| 85-99 | Exceptional |
Scoring factors:
- Hook Strength (20 pts)
- Emotional Resonance (20 pts)
- Value & Shareability (15 pts)
- Format & Structure (15 pts)
- Relevance & Timing (10 pts)
- Engagement Potential (10 pts)
- Authenticity & Voice (10 pts)
Granola is an AI meeting transcription tool.
- Manual Copy: Click transcription button → copy →
pbpaste > input/meeting.txt - Chrome Extension: Granola Transcriber
- Raycast Extension: Granola for Raycast (bulk export)
- Use descriptive filenames:
YYYY-MM-DD-topic.txt - Clean transcripts before exporting for better quality
- Batch process multiple meetings at once
-
ship init,ship work,ship posts,ship review -
ship analyze-x,ship reply,ship x-status,ship stats - Typefully integration
- 64 content strategies
- Banger scoring
-
ship analyze— Success metrics (X Basic API) - News-aware post generation
- LinkedIn support
- Multiple output formats (CSV, Markdown)
- Bulk staging command
MIT