Generate engaging LinkedIn posts with best practices, visual identity, and vault integration. Triggers: "linkedin post" | "write linkedin" | "generate linkedin" | "linkedin content" | "post for linkedin" | "create a linkedin post" | "draft a linkedin post" | "write a post for linkedin" | "linkedin update".
Scanned 9/23/2026
Install to Claude Code
npx -y skills add Roxabi/roxabi-plugins --skill linkedin --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Linkedin?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/roxabi-linkedin)More formats (shields.io, HTML) on the badges page.
---
name: linkedin-post-generator
description: 'Generate engaging LinkedIn posts with best practices, visual identity, and vault integration. Triggers: "linkedin post" | "write linkedin" | "generate linkedin" | "linkedin content" | "post for linkedin" | "create a linkedin post" | "draft a linkedin post" | "write a post for linkedin" | "linkedin update".'
version: 0.1.0
allowed-tools: Read, Write, Bash, Glob, Grep
---
# LinkedIn Post Generator
**Goal:** Generate a publish-ready LinkedIn post from a topic or idea, following best practices and the author's visual identity.
Let:
LC := ~/.roxabi-vault/config/linkedin.json — author config (optional)
CH := ~/.roxabi-vault/config/visual-charter.json — visual charter (optional)
VC := ~/.roxabi-vault/content/ — post output dir
## Phase 1 — Configuration
Load LC if ∃: author name, default language, tone, hashtag sets, post signature. ¬LC → defaults (professional-casual tone, English). Load CH if ∃.
## Phase 2 — Topic Input
∃ topic in $ARGUMENTS → use it. Otherwise → ask user: topic/idea. → present multi-select for preferences: tone override, target audience, content type (story/insight/question/how-to), hashtag set.
## Phase 3 — Research (Optional)
```bash
python3 -c "
import sys
sys.path.insert(0, '$CLAUDE_PLUGIN_ROOT')
from _sdk_bootstrap import ensure_sdk_on_path
ensure_sdk_on_path('$CLAUDE_PLUGIN_ROOT')
from roxabi_sdk.paths import vault_healthy
print('VAULT_OK' if vault_healthy() else 'VAULT_UNAVAILABLE')
"
```
VAULT_OK → search related content:
```bash
python3 -c "
import sqlite3, json
from pathlib import Path
home = Path.home() / '.roxabi-vault'
conn = sqlite3.connect(str(home / 'vault.db'))
rows = conn.execute(
'SELECT title, substr(content, 1, 200) FROM entries WHERE category = \"content\" ORDER BY created_at DESC LIMIT 5'
).fetchall()
conn.close()
for r in rows: print(json.dumps({'title': r[0], 'preview': r[1]}))
"
```
VAULT_UNAVAILABLE → skip; generate from topic alone.
## Phase 4 — Generate Post
```bash
cat "$CLAUDE_PLUGIN_ROOT/references/linkedin_best_practices.md"
cat "$CLAUDE_PLUGIN_ROOT/references/emoji_guide.md"
```
Apply rules: 1300-2000 chars; strong hook (pattern interrupt/bold claim/question/story opener); 1-3 sentence paragraphs; line breaks between paragraphs; bullet/numbered lists where appropriate; 3-5 hashtags at end; clear CTA in closing; emojis sparingly per guide. ∃CH → apply tone/voice. ∃LC signature → append.
## Phase 5 — Review
Present post in code block. Show stats: character count, word count, estimated read time, hashtag count. → present choice
- **Publish as-is** → Phase 6
- **Edit** → describe changes → regenerate
- **Regenerate** → different angle → Phase 4
- **Cancel** → discard
## Phase 6 — Save
```bash
mkdir -p -m 700 ~/.roxabi-vault/content
timestamp=$(date +%Y%m%d_%H%M%S)
# Write as: linkedin_${timestamp}.md
```
Write with YAML frontmatter:
```yaml
---
type: linkedin-post
title: "<topic summary>"
created: "<ISO 8601 timestamp>"
status: draft
hashtags: [<hashtags used>]
---
```
Followed by post body.
## Phase 7 — Index (Optional)
VAULT_OK → index:
```bash
python3 -c "
import sqlite3, json
from pathlib import Path
from datetime import datetime
home = Path.home() / '.roxabi-vault'
conn = sqlite3.connect(str(home / 'vault.db'))
conn.execute('''INSERT INTO entries (category, type, title, content, metadata, created_at)
VALUES ('content', 'linkedin-post', ?, ?, '{}', ?)''',
('<title>', '<full post content>', datetime.now().isoformat()))
conn.commit()
conn.close()
"
```
VAULT_UNAVAILABLE → skip; file saved locally.
## Phase 8 — Visual Companion
To generate a matching visual, run the **image-prompt** skill next.
$ARGUMENTS
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!