Install
$ agentstack add skill-anton-abyzov-vskill-social-media-posting Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Dangerous shell/eval execution.
What it can access
- ● Network access Used
- ● Filesystem access Used
- ● Shell / process execution Used
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Social Media Posting & Engagement
Primary goal: go viral, grow followers, and promote the user's products and personal brand.
Every post is an opportunity to attract new followers, build brand authority, and drive awareness of the user's products. Content that delivers value or tells a compelling story while naturally weaving in the brand is the highest-leverage output. Engagement, reach, and follower growth are the metrics that matter — optimize for them, not just for "posting something".
Post content across all major platforms with AI-generated visuals, strategic content planning, mandatory human approval, and daily engagement to grow your audience.
Before Starting
Before writing any content, gather context:
- Check for a product/brand context file. Look for
product-marketing-context.mdin the project's.claude/directory first, then the project root. This file contains brand voice, products, audience, content pillars, and guidance on weaving product mentions into posts. If it exists, read it -- every post should be informed by this context. If it doesn't exist, ask the user to briefly describe their brand/product/audience before proceeding.
- Check for a config file. Look for a
config.jsonin the skill directory or project. It tells you which Chrome profile to use (where social accounts are logged in), which platforms are active, default tone, and image preferences.
- Check published articles / reference material. If the brand context file has a list of published articles, check if any cover the current topic -- use them as source material for post angles.
- Ensure image generation is available. This skill uses the
nano-banana-proskill (Gemini image generation) for AI images. Check thatGEMINI_API_KEYis set. If not, warn the user and proceed with copy-only output.
- Ask the user for anything not already provided:
- Topic: What is the post about?
- Context/angle: Specific news, data, or event? Reference material?
- Tone: Override default? (casual, professional, provocative, educational)
- Visual direction: Specific image style or existing assets?
- Platforms to skip: Any platforms to exclude?
Core Rules (Non-Negotiable)
1. NEVER Post Without Approval
Every piece of content -- posts, comments, replies -- must be shown to you first. The workflow is always:
- Draft the content (text + images)
- Present it for review with a clear summary
- Wait for explicit "go ahead" / "approved" / "post it"
- Post only after approval
- Verify the post is live and report the URL
This exists because social media is public, permanent, and tied to your reputation. A bad post can't be unseen. The cost of waiting 30 seconds for approval is nothing compared to the cost of posting something wrong.
2. Always Generate Images
Every post gets AI-generated visuals. Use the nano-banana-pro skill (Gemini 3 Pro Image) to create photo-realistic, editorial-quality images. For each image needed, generate 3 options so the user can pick the best one. See the Image Generation section for exact dimensions per platform.
3. Check for Duplicates First
Before drafting any post, read the last 10 posts on each target platform. This prevents posting duplicate or near-duplicate content. Look for:
- Same topic covered in the last 48 hours
- Similar headlines or angles
- Overlapping key facts or data points
If you find overlap, flag it: "You posted about [topic] on [platform] [time ago]. Want to skip this platform, change the angle, or post anyway?"
4. Track Everything
After every post, collect the exact URL. Log all URLs (posts + engagement comments) to a daily log file. Never say "posted" without providing a clickable link.
5. Verify Before Reporting
Navigate to the profile/page after publishing and confirm the post actually appears. Be honest about failures -- never report unverified posts as successful.
Strategic Thinking
Before writing a single word, think strategically:
North Star
Every post serves one or more of these goals — always be explicit about which ones apply:
- Go viral — high shareability, broad appeal, stops the scroll. Prioritize hooks, proof, and emotional resonance.
- Grow followers — content that makes people think "I want more of this." End with a clear follow CTA or a hook into the next post.
- Promote the product — weave the product in naturally as the tool that enabled the result, solved the problem, or made the story possible. Never feel like an ad.
- Build personal brand — establish the user as a credible, interesting voice in their space. Opinions, behind-the-scenes, and unique perspectives beat generic tips.
Optimizing for all four simultaneously is possible — a viral behind-the-scenes post that mentions the product in passing is the gold standard. The worst outcome is content that does none of them (generic, forgettable, no CTA).
Hook Formula
The first line determines whether anyone reads the rest. Use one of these patterns:
- Curiosity gap: "I was wrong about..." / "Nobody's talking about this..."
- Contrarian take: "X is wrong, here's why" / "Unpopular opinion:"
- Story hook: "3 years ago I..." / "Last week something happened..."
- Value hook: "How to X without Y" / "The 5-minute trick that..."
- Data hook: "We analyzed 10,000..." / "The numbers are in:"
Psychological Angle
What makes this compelling?
- Social proof: Numbers, testimonials, adoption stats
- Curiosity gap: Incomplete information that demands completion
- Loss aversion: What they'll miss if they don't pay attention
- Authority: Expertise signal, credentials, experience
- Reciprocity: Giving value first, teaching something useful
Copy Principles
- Clarity over cleverness
- Benefits over features
- Specificity over vagueness ("Cut reporting from 4 hours to 15 minutes" beats "streamline your workflow")
- Customer language over company language
- One idea per post -- don't cram multiple messages
Content Pillar Check
Does this fit an existing pattern?
- Educational: Teaching something useful
- Behind-the-scenes: Process, struggles, real numbers
- Personal story: Lessons learned, failures, pivots
- Industry insight: Trends, analysis, predictions
- Promotional: Product launches, features, milestones
Keep promotional under 5% of posts. If a product/brand context file exists:
- ~60% of posts: mention a product as natural context (example, lesson, origin story)
- ~20% of posts: pure value, no product mention (builds trust and reach)
- ~15% of posts: directly about a product (releases, milestones, features)
- ~5% of posts: personal/humanizing, zero product angle
The test: Would a reader find the mention helpful, or would they roll their eyes? If helpful, include it. If eye-roll, skip it and just deliver value.
Workflow Overview
0. CONTEXT -> Read product-marketing-context.md + config, check published articles
1. DEDUP -> Read last 10 posts per platform, flag overlaps
2. STRATEGIZE -> Hook formula, psychological angle, content pillar selection
3. ANALYZE -> Check post analytics history, recommend optimal posting time
4. CONTENT -> Write platform-adapted copy + save per-platform copy files
5. IMAGES -> Generate 3 options per image with Nano Banana Pro (correct aspect ratio)
6. PROOF -> For X/Twitter & Threads: create proof/evidence screenshot as first image
7. VIDEO -> If video content: Veo 3.1 AI video (or Ken Burns fallback)
8. REVIEW -> Present everything + timing recommendation to user, wait for approval
9. POST -> Attach image FIRST, wait for preview thumbnail, THEN click Post (X/Twitter + Threads: mandatory verification)
10. VERIFY -> Navigate to published post URL, screenshot it, check text encoding + image/video present — see "Post-Publication Verification" section
11. ENGAGE -> Find 10 threads per platform, draft replies, get approval
12. LOG -> Write daily engagement log with all URLs + save copy files
Virality and Proof Screenshots
Why Proof Beats Generic AI Art
On X/Twitter and Threads, the first image in a post determines whether it gets engagement. Generic AI-generated art blends into the feed -- everyone's using it now. Screenshots of real results stop the scroll because they signal authenticity and evidence. A terminal showing test passes, a dashboard with real numbers, or a before/after comparison says "this is real" in a way that no AI-rendered abstract gradient ever will.
What Counts as Proof
- Terminal output: Test passes, deployment logs, benchmark results, build output
- Metrics dashboards: Download counts, user growth charts, revenue screenshots, analytics
- Before/after comparisons: Code diff, performance numbers, UI redesign side-by-side
- Code snippets with results: A function and its actual output, a query and its response
- Error messages that tell a story: "This error cost us 3 days..." with the actual stack trace
- Tool output: npm download stats, GitHub stars graph, Vercel analytics, CI/CD results
How to Create Proof Screenshots
- If the user provides a command or metric, run it or ask them to screenshot it
- Use Puppeteer or Peekaboo to capture the relevant screen/dashboard
- Crop to the key area -- full-screen screenshots are noisy. Focus on the number, the result, the graph
- For terminal output: Use a clean dark terminal theme, highlight the key numbers or success indicators
- For dashboards: Capture the specific graph or metric that tells the story, not the entire page
Image Order for X/Twitter and Threads
- Image 1: ALWAYS the proof screenshot (this appears in the timeline preview and drives clicks)
- Image 2+: AI-generated visuals from Nano Banana Pro (supporting/aesthetic images)
When Proof Isn't Available
If the topic is abstract (opinion piece, thought leadership, general advice) and no proof screenshot exists:
- Ask the user if they have any relevant screenshot, metric, or terminal output they could share
- If they don't, fall back to data visualization or infographic-style AI art -- charts, diagrams, annotated screenshots -- rather than generic abstract imagery
- NEVER generate fake/mock terminal screenshots -- that's dishonest and undermines trust
The workflow should never block over this. If no proof exists and the user confirms, proceed with the best available AI imagery.
Available Tools (Prefer Dedicated Tools)
Multiple tools may be available for posting. Always prefer dedicated CLI/API tools over browser automation -- they're faster, more reliable, and don't break when UIs change.
Tool Priority Order
| Platform | 1st Choice (Best) | 2nd Choice | 3rd Choice | Last Resort | |----------|-------------------|------------|------------|-------------| | X/Twitter | xurl CLI (if installed) | Puppeteer/browser | Peekaboo | Chrome-open | | Discord | discord skill actions | Webhook API (curl) | Browser automation | Chrome-open | | Telegram | Telegram Bot API (curl) | N/A | N/A | N/A | | Instagram Carousel | API (rupload_igphoto + configure_sidecar) | Puppeteer + Chrome profile | Peekaboo | Chrome-open | | Instagram Reel | API (rupload_igvideo + configure_to_clips) | Puppeteer + Chrome profile | Peekaboo | Chrome-open | | LinkedIn | Puppeteer + Chrome profile | Peekaboo | Chrome-open | - | | Threads | Puppeteer + Chrome profile | Peekaboo | Chrome-open | - | | YouTube Community | Puppeteer + system clipboard | Peekaboo | Chrome-open | - | | YouTube Video Upload | AppleScript + browser automation | Peekaboo | Chrome-open | - | | Reddit | Puppeteer (old.reddit.com) | Peekaboo | Chrome-open | - | | TikTok | Anti-bot override + AppleScript + cliclick | Peekaboo | Chrome-open | - | | dev.to | Puppeteer + Chrome profile | Peekaboo | Chrome-open | - | | Facebook | Puppeteer + Chrome profile | Peekaboo | Chrome-open | - |
X/Twitter via xurl (Preferred)
If the xurl CLI is installed (xurl auth status to check), use it instead of browser automation:
# Post with image
xurl media upload image.png # get MEDIA_ID from response
xurl post "Your tweet text" --media-id MEDIA_ID
# Thread: post main tweet, then reply
xurl post "Main tweet" # get POST_ID
xurl reply POST_ID "Thread continuation"
# Search for engagement threads
xurl search "topic keywords" -n 10
# Reply to a thread
xurl reply POST_ID "Your thoughtful reply"
# Read recent posts (dedup check)
xurl timeline -n 10
Discord via Skill Actions (Preferred)
If the discord skill is available, use its native actions:
{
"action": "sendMessage",
"to": "channel:",
"content": "Your announcement text",
"mediaUrl": "file:///path/to/image.png"
}
{
"action": "readMessages",
"channelId": "",
"limit": 10
}
Peekaboo (macOS UI Fallback)
When browser automation (Puppeteer) isn't available or breaks, use the peekaboo skill for macOS UI automation:
# See what's on screen, identify clickable elements
peekaboo see --app "Google Chrome" --annotate --path /tmp/see.png
# Click an identified element
peekaboo click --on B3 --app "Google Chrome"
# Type text
peekaboo type "Your post content" --app "Google Chrome"
# Paste from clipboard (for editors that reject keyboard input)
echo "Your text" | pbcopy
peekaboo hotkey --keys "cmd,v" --app "Google Chrome"
This is particularly useful when:
- Puppeteer can't connect to Chrome
- A platform's DOM changed and selectors broke
- File upload dialogs need native OS interaction
- You need to interact with system dialogs (CAPTCHA, etc.)
AppleScript File Picker: Keyboard Language Issue
This is a silent failure. When AppleScript uses Cmd+Shift+G to open the "Go to Folder" dialog in a macOS file picker, any keystrokes go through the currently active system keyboard input source. If the user has a non-Latin layout active (Russian, Japanese, Arabic, etc.), the typed path characters get converted — /Users/anton/image.png becomes garbage, the dialog finds nothing, and the file is never attached. No error is thrown.
Always switch the input source to English before typing any path, then restore it.
import subprocess, time
def ensure_english_input_source():
"""Switch to a Latin/English input source before typing paths in macOS dialogs.
Returns the name of the previous input source so it can be restored."""
script = '''
tell application "System Events"
set currentName to name of current input source
set allSources to input sources
set englishNames to {"U.S.", "ABC", "U.S. Extended", "U.S. International - PC", "British", "Australian"}
set alreadyEnglish to false
repeat with n in englishNames
if currentName is n then
set alreadyEnglish to true
exit repeat
end if
end repeat
if alreadyEnglish then
return "already_english"
end if
repeat with src in allSources
if (name of src) is in englishNames then
set current input source to src
return currentName
end if
end repeat
return "no_english_source_found"
end tell
'''
result = subprocess.run(['osascript', '-e', script], capture_output=True, text=True)
return result.stdout.strip()
def restore_input_source(original_name):
if original_name in ('already_english', 'no_english_source_found', ''):
return
script = f'''
tell application "System Events"
repeat with src in input sources
if (name of src) is "{original_name}" then
set current input source to src
exit repeat
end if
end repeat
end tell
'''
subprocess.run(['osascript', '-e', script])
# Usage p
…
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [anton-abyzov](https://github.com/anton-abyzov)
- **Source:** [anton-abyzov/vskill](https://github.com/anton-abyzov/vskill)
- **License:** MIT
- **Homepage:** https://verified-skill.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.