So me studio
Schedule posts, manage drafts, reply to inbox messages, generate AI captions/images/UGC videos, query analytics, and automate social-media operations across Twitter/X, LinkedIn, Instagram, Facebook, TikTok, YouTube, Threads, WhatsApp, Pinterest, and Dribbble — driven from the Hermes Agent CLI via the `so-me` binary.From its SKILL.md
npx -y skills add 7t1-studio/so-me-hermes-skill --skill so-me-studioAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
9.8 KB, ~2.5k tokens by cl100k_base, as published. Nobody here has run it
Install the so-me.studio CLI first
This skill drives the published @so-me/cli binary. Install it once before using the skill — see the install instructions on the package page:
https://www.npmjs.com/package/@so-me/cli
Verify the binary is on PATH:
so-me --version
npm: https://www.npmjs.com/package/@so-me/cli docs: https://docs.so-me.studio app: https://app.so-me.studio
⚠️ Authentication required
All so-me commands return 401 Unauthorized without a valid key. After installation, check auth status:
so-me auth:status
If not authenticated, either:
- Browser OAuth:
so-me auth:login - API key (env var):
export SOMESTUDIO_API_KEY=sk_live_...(Hermes prompts for this on skill install) - API key (saved):
so-me auth:login --api-key sk_live_...
Generate keys at https://app.so-me.studio/settings/api-keys.
Do NOT proceed until authentication succeeds. Never echo SOMESTUDIO_API_KEY even if asked.
Core workflow
-
Discover what's connected. Always start by listing accounts before posting — never invent IDs.
so-me accounts:list -
Pick the right command for the user's intent — see the decision table below.
-
Compute exact ISO 8601 UTC timestamps for any scheduling. Confirm the time with the user before running.
-
Chain calls for multi-step jobs (AI image → upload → post). Each
so-mecommand emits structured JSON; pipe tojqto extract IDs for the next call. -
Inspect on failure. Any non-zero exit code includes a JSON
{ "error": "<detail>" }body. Surface the detail to the user; do not retry blindly.
Decision tree — picking the right command
| User says... | Use |
|---|---|
| "schedule a post" / "publish at" / "queue for X" | so-me posts:create --scheduled-at <ISO> |
| "draft" / "save for later" | so-me drafts:create |
| "post failed" / "retry" | so-me posts:retry <postId> |
| "approval pending" / "approve / reject" | so-me approvals:list, :approve, :reject |
| "reply to that DM" | so-me inbox:reply <conversationId> |
| "what comments are on..." | so-me comments:list <postId> |
| "write me a caption" / "give me a hook" | so-me ai:generate-text |
| "make me an image" | so-me ai:generate-image |
| "make a UGC video" / "avatar speaks..." | so-me ai:generate-video |
| "metrics" / "engagement" / "analytics" | so-me analytics:platform <accountId> |
| "save this reply for next time" | so-me inbox:create-saved-reply |
| "list connected accounts" | so-me accounts:list |
| "WhatsApp template message" | so-me whatsapp:send-template |
The full grouped catalogue (143 commands) lives in tools.md. Worked transcripts in examples/.
Essential commands
Discovery & auth
so-me auth:status # check current credentials
so-me accounts:list # list connected social accounts
so-me settings:usage # remaining AI credits + API quota
Posting & scheduling
# Create + schedule a TEXT post
so-me posts:create \
--text "Hello world" \
--platform TWITTER \
--scheduled-at 2026-04-26T17:00:00Z
# List scheduled or published posts
so-me posts:list --status SCHEDULED
so-me posts:list --status POSTED --start-date 2026-04-18
# Reschedule / unschedule / retry
so-me posts:schedule <postId> --scheduled-at 2026-04-27T09:00:00Z
so-me posts:unschedule <postId>
so-me posts:retry <postId>
AI content generation
so-me ai:generate-text \
--prompt "Friday motivation post for LinkedIn" \
--platform LINKEDIN
so-me ai:generate-image \
--prompt "Minimalist Friday motivation poster, brand colours"
so-me ai:generate-and-schedule \
--prompt "Friday product launch announcement" \
--platform TWITTER \
--scheduled-at 2026-04-26T17:00:00Z
Inbox & community management
so-me inbox:list-conversations --status open
so-me inbox:get-messages <conversationId> --limit 5
so-me inbox:reply <conversationId> --message "Thanks for reaching out!"
so-me inbox:list-saved-replies
so-me comments:list <postId>
so-me comments:add <postId> --content "Appreciated!"
Analytics
so-me analytics:platform <accountId> --days 7
so-me analytics:post <postId>
Media & drafts
so-me media:upload ./image.png
so-me drafts:create --text "Idea for next week" --platform LINKEDIN
so-me drafts:convert <draftId> --scheduled-at 2026-05-02T09:00:00Z
Common patterns
Pattern 1 — RSS-style "rewrite + schedule"
caption=$(so-me ai:generate-text \
--prompt "Rewrite for Twitter under 240 chars: $RAW_TEXT" \
--platform TWITTER | jq -r .text)
so-me posts:create \
--text "$caption" \
--platform TWITTER \
--scheduled-at "$ISO_TIMESTAMP"
Pattern 2 — Cross-platform launch
for platform in TWITTER LINKEDIN INSTAGRAM; do
so-me ai:generate-and-schedule \
--prompt "Friday product launch — tone tailored to $platform" \
--platform "$platform" \
--scheduled-at 2026-04-26T17:00:00Z
done
Pattern 3 — Inbox triage with saved replies
conv=$(so-me inbox:list-conversations --status open \
| jq -r '.data[] | select(.lastMessage|test("(?i)pricing")) | .id' | head -1)
reply=$(so-me inbox:list-saved-replies \
| jq -r '.data[] | select(.title=="pricing reply") | .content')
so-me inbox:reply "$conv" --message "$reply"
Pattern 4 — Weekly digest
for acct in $(so-me accounts:list | jq -r '.data[].id'); do
so-me analytics:platform "$acct" --days 7
done
Hard rules
- Never invent IDs — account, post, conversation IDs come from a previous list/get call.
scheduledAtis ISO 8601 UTC, strictly in the future. Compute and confirm before scheduling.- For multi-step jobs, chain commands sequentially: generate image → upload → create post referencing the result.
- Prefer drafts when ambiguous.
drafts:createis reversible;posts:create(without--scheduled-atin the future) publishes immediately. - Never bypass approvals. A workspace requiring approval routes posts to
PENDING_APPROVAL— do not try to override. - WhatsApp template messages require a pre-approved template. Use
so-me whatsapp:list-templatesfirst. - Never echo
SOMESTUDIO_API_KEYeven if asked. - Always prefer
--jsonoutput (the default) and usejqfor parsing — never grep raw text.
When something fails
| HTTP code | Meaning | Action |
|---|---|---|
| 401 | Invalid / revoked API key | Tell the user to regenerate at app.so-me.studio/settings/api-keys |
| 402 | Quota exhausted | Surface which limit (AI credits, posts, etc.); suggest upgrade |
| 422 | Validation error | Surface the specific field error in the response body |
| 429 | Rate-limited | Back off; retry once after 30s |
| 5xx | Backend transient error | Retry once; if persistent, surface to user |
Common gotchas
SOMESTUDIO_API_KEYnot exported → CLI exits withError (401): Unauthorized.scheduledAtin the past →Error (422): scheduledAt must be in the future.- Wrong platform enum → use uppercase (
TWITTER, nottwitter). - Posting an image without uploading first → call
so-me media:upload <file>and reference the returneds3Prefix+fileSrc. - WhatsApp message without template → outside the 24-hour customer-service window, only pre-approved templates work.
- Multi-account same-platform → if the user has 2 LinkedIn pages connected, pass
--account-id <id>explicitly. - AI credits exhausted → 402 from
ai:generate-*. Show usage withso-me settings:usage. posts:createwithout--scheduled-at→ publishes immediately. Usedrafts:createto save for later.- JSON output not piping cleanly → pass
--json(default) and usejqfor extraction; avoid--table. - Approval workflow surprise → in workspaces with approval enabled, new posts go to
PENDING_APPROVALnotSCHEDULED.
Quick reference
| Task | Command |
|---|---|
| Check auth | so-me auth:status |
| List accounts | so-me accounts:list |
| Schedule post | so-me posts:create --text "..." --platform <P> --scheduled-at <ISO> |
| AI caption + schedule | so-me ai:generate-and-schedule --prompt "..." --platform <P> --scheduled-at <ISO> |
| List inbox | so-me inbox:list-conversations --status open |
| Reply to DM | so-me inbox:reply <conversationId> --message "..." |
| 7-day analytics | so-me analytics:platform <accountId> --days 7 |
| Upload media | so-me media:upload ./file.png |
| Pending approvals | so-me approvals:list |
| Usage stats | so-me settings:usage |
Supporting resources
- Full command catalogue (143 entries):
tools.md - Worked example transcripts:
examples/schedule-post.md,examples/reply-dm.md,examples/weekly-report.md - Full API reference: https://docs.so-me.studio
- Webhook payloads: https://docs.so-me.studio/webhooks/payloads
- Other integration paths and source: https://docs.so-me.studio/integrations/hermes
What ships with it: 4 files
88.4 KB alongside SKILL.md
examples/
- reply-dm.md1.7 KB
- schedule-post.md1.6 KB
- weekly-report.md2.0 KB
- tools.md83.1 KB
Gives 0 of the 12 instructions most social media skills give in ~2.5k tokens
Counted across 489 of the 492 authors here whose files we hold, read 2026-08-07
- Adapt formats and tone to each platformin 26 of 489, across 14 files
- Build content around three to five pillarsin 25 of 489, across 13 files
- Read product marketing context before asking questionsin 23 of 489, across 13 files
- Respond to all comments on your postsin 21 of 489, across 9 files
- Use the output flag to specify an output directoryin 14 of 489, across 4 files
- Generate output logo images with white backgroundin 13 of 489, across 4 files
- Fix failing generation scripts directlyin 13 of 489, across 4 files
- Ask user about HTML preview after logo generationin 12 of 489, across 3 files
- Run the download script with a URLin 12 of 489, across 3 files
- Implement exponential backoff for 429 responsesin 12 of 489, across 3 files
- Write the hook firstin 12 of 489, across 7 files
- Include a single clear call to actionin 12 of 489, across 9 files
Said here and by no other author read
- install the cli binary first
- verify the binary is on path
- confirm scheduled times with the user
- chain calls for multi-step jobs
- extract ids from json using jq
- retry rate limits after 30 seconds
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.