Install
$ agentstack add skill-fajrisilmi12-cyber-hermes-socmed-function-zernio-social-posting ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● 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.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
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
Zernio + Cloudinary Social Media Posting
Post to 16 platforms via a single API: Zernio handles publishing, Cloudinary hosts + optimizes the media. Free tier covers 1-2 accounts on Zernio (no credit card) and 25 credits/month on Cloudinary.
When to use this skill
- User wants to post an image/video to Instagram, Facebook, TikTok, X, etc.
- User has a media URL and wants to publish to a social platform
- User wants to schedule a post or cross-post to multiple platforms
- User wants Story (24h ephemeral) or Reel (vertical video) support
- User already has a Zernio account and an Instagram Business/Creator account
User preference: never auto-generate images
This user (Fajri) always supplies the source image themselves — usually via WhatsApp or Discord attachment. The pipeline is:
- User sends image + caption
- Save to
/tmp/(or wherever the platform's bridge drops it) - Run
post_to_ig.py /tmp/ "" - Reply with the live IG URL
Do NOT generate images from a prompt for this user unless they explicitly ask. Pair with the image-gen-9router skill only when they request text-to-image. The default request "post this to IG" means "I have an image, please upload and post it" — not "make me an image and post it."
The full text-to-image-then-post flow (e.g. "research Linux, generate an infographic, post it") is a separate, opt-in workflow that combines this skill with image-gen-9router.
What this skill assumes
- Zernio account at
https://zernio.com/signup(no CC for first 1-2 accounts) - At least one social account connected via Zernio OAuth
- Instagram account must be Business or Creator (Personal accounts cannot use Graph API)
- Cloudinary account for media CDN (free tier: 25 credits/month)
- Env vars in
~/.hermes/.env: ZERNIO_API_KEY=sk_...CLOUDINARY_CLOUD_NAME=...CLOUDINARY_API_KEY=...CLOUDINARY_API_SECRET=...- Optional:
ZERNIO_IG_ACCOUNT_ID=...(default for single-account flow)
The pipeline
Local file or URL
↓
Cloudinary upload (auto resource_type=image|video)
↓
Build URL with slash-chained transforms (NEVER commas — see pitfall below)
↓
POST to Zernio /v1/posts with bearer auth
↓
Zernio publishes to social platform(s)
↓
Live URL returned
Slash-chained Cloudinary URLs (the working pattern)
Cloudinary transform syntax has two flavors. Zernio's URL parser only accepts the slash-chained form. See references/cloudinary-comma-bug.md for the full transcript of the failure.
Broken (commas mis-parsed as multi-URL separator):
https://res.cloudinary.com/X/image/upload/w_1080,h_1080,c_fill,q_auto,f_auto/v123/id.jpg
↑ Zernio reads "h_1080" as second URL → 400 Invalid media URL
Works (slash-chained, equivalent transform):
https://res.cloudinary.com/X/image/upload/w_1080/h_1080/c_fill/q_auto/f_auto/v123/id.jpg
For video:
https://res.cloudinary.com/X/video/upload/q_auto/v123/id.mp4
Zernio content types (Instagram)
| Type | Zernio field | Notes | |---|---|---| | Feed post | omit contentType | default; image, video, carousel | | Story | contentType: "story" | 24h ephemeral; captions not shown | | Reel | contentType: "reel" | vertical 9:16 video, ≤90s; auto-applied to single video without the field |
{
"content": "caption with #hashtags",
"mediaItems": [{"type": "image", "url": ""}],
"platforms": [{
"platform": "instagram",
"accountId": "",
"platformSpecificData": {"contentType": "story"}
}],
"publishNow": true
}
Available templates
templates/post_to_ig.py— full one-shot post: upload to Cloudinary, post via Zernio, wait for live URL, print result. Supports feed/story/reel. Auto-loads~/.hermes/.env.templates/cloudinary_helper.py— Cloudinary SDK wrapper: upload + slash-chained IG URL + usage stats. Auto-loads~/.hermes/.env.
Usage
python3 templates/post_to_ig.py photo.jpg "caption #tags"
python3 templates/post_to_ig.py photo.jpg "caption" --content-type story
python3 templates/post_to_ig.py video.mp4 "caption" --content-type reel
Pitfalls
- Never use commas in Cloudinary transform URLs when posting via Zernio. Always slash-chain. See
references/cloudinary-comma-bug.md. - IG account must be Business or Creator. Personal accounts will fail at OAuth with no helpful error. Switch in IG app: Settings → Account type and tools → Switch to professional account.
- Zernio 401 with
Invalid API keyusually means the bearer token is the wrong env var.zernio auth:set --keywrites to~/.config/zernio/auth.json; the Python script reads fromZERNIO_API_KEYenv var (or auto-loads from~/.hermes/.env). - IG token lasts 60 days; Zernio will ask for reconnect. Watch for
token_expirederrors. n(count) field is provider-dependent. Some providers (gemini nano-banana, huggingface) ignore it.- Story captions are NOT shown on Instagram (Graph API limit, not Zernio).
- Reel
shareToFeed— default false. SettrueinplatformSpecificDatato also appear in main feed. - First-call latency — Zernio returns
status: publishingthen polls topublished. The Python template polls/v1/posts/{id}for up to 60s for live URL.
Reference docs
references/cloudinary-comma-bug.md— full transcript of the URL parser failurereferences/env-loader-pattern.md— Python pattern for auto-loading~/.hermes/.env
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: fajrisilmi12-cyber
- Source: fajrisilmi12-cyber/hermes-socmed-function
- License: MIT
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.