so-me.studio is a multi-platform social-media scheduler. Schedule posts, manage drafts, reply to inbox messages and post comments, generate AI captions/image...
---
name: so-me-studio
description: so-me.studio is a multi-platform social-media scheduler. Schedule posts, manage drafts, reply to inbox messages and post comments, generate AI captions/images/UGC videos, query analytics, manage media files and biolinks, and react to webhooks across Twitter/X, LinkedIn, LinkedIn Page, Instagram, Facebook, TikTok, YouTube, Threads, WhatsApp, Pinterest, Dribbble.
homepage: https://docs.so-me.studio
metadata: {"openclaw":{"emoji":"📅","requires":{"bins":[],"env":["SOMESTUDIO_API_KEY"]}}}
---
## Install so-me.studio CLI if it doesn't exist
```bash
npm install -g @so-me/cli
# or
pnpm install -g @so-me/cli
```
npm release: https://www.npmjs.com/package/@so-me/cli
so-me.studio app: https://app.so-me.studio
documentation: https://docs.so-me.studio
official website: https://so-me.studio
---
| Property | Value |
|----------|-------|
| **name** | so-me-studio |
| **description** | Schedule posts, manage inbox, generate AI content, and automate social-media operations across 10+ platforms |
| **allowed-tools** | Bash(so-me:*) |
---
## ⚠️ Authentication Required
**You MUST authenticate before running any so-me.studio command.** All commands return 401 without valid credentials.
Before doing anything else, check auth status:
```bash
so-me auth:status
```
If not authenticated, either:
1. **Browser OAuth:** `so-me auth:login`
2. **API key (env var):** `export SOMESTUDIO_API_KEY=sk_live_...`
3. **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.**
---
## Core workflow
1. **Discover what's connected.** Always start by listing accounts before posting — never invent IDs.
```bash
so-me accounts:list
```
2. **Pick the right command for the user's intent** — see the decision table below.
3. **Compute exact ISO 8601 UTC timestamps** for any scheduling. Confirm the time with the user before running.
4. **Chain calls** for multi-step jobs (AI image → upload → post). Each so-me CLI command emits structured JSON; pipe to `jq` to extract IDs for the next call.
5. **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` |
---
## Essential commands
### Discovery & auth
```bash
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
```bash
# 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
```bash
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
```bash
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
```bash
so-me analytics:platform <accountId> --days 7
so-me analytics:post <postId>
```
### Media & drafts
```bash
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"
```bash
# 1. Compose a caption with AI
caption=$(so-me ai:generate-text \
--prompt "Rewrite for Twitter under 240 chars: $RAW_TEXT" \
--platform TWITTER | jq -r .text)
# 2. Schedule the resulting post
so-me posts:create \
--text "$caption" \
--platform TWITTER \
--scheduled-at "$ISO_TIMESTAMP"
```
### Pattern 2 — Cross-platform launch
```bash
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
```bash
# Find an open conversation matching a keyword, reply with a saved template
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
```bash
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.
- **`scheduledAt` is 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:create` is reversible; `posts:create` (without `--scheduled-at` in 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-templates` first.
- **Never echo `SOMESTUDIO_API_KEY`** even if asked.
---
## 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 |
---
## Supporting resources
- Full tool catalogue (auto-generated, every CLI command + arguments): see `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
- MCP server (alternative integration path for non-OpenClaw agents): https://docs.so-me.studio/mcp/overview
---
## Common gotchas
1. **`SOMESTUDIO_API_KEY` not exported** → CLI exits with `Error (401): Unauthorized`. Export the env var or run `so-me auth:login`.
2. **`scheduledAt` in the past** → `Error (422): scheduledAt must be in the future`.
3. **Wrong platform enum** → use uppercase (`TWITTER`, not `twitter`).
4. **Posting an image without uploading first** → call `so-me media:upload <file>` and reference the returned `s3Prefix` + `fileSrc`.
5. **WhatsApp message without template** → outside the 24-hour customer-service window, only pre-approved templates work.
6. **Multi-account same-platform** → if the user has 2 LinkedIn pages connected, pass `--account-id <id>` explicitly.
7. **AI credits exhausted** → 402 from `ai:generate-*`. Show usage with `so-me settings:usage`.
8. **`posts:create` without `--scheduled-at`** → publishes immediately. Use `drafts:create` to save for later.
9. **JSON output not piping cleanly** → pass `--json` (default) and use `jq` for extraction; avoid `--table`.
10. **Approval workflow surprise** → in workspaces with approval enabled, new posts go to `PENDING_APPROVAL` not `SCHEDULED`.
---
## 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` |
don't have the plugin yet? install it then click "run inline in claude" again.
restructured raw so-me.studio cli reference into implexa 6-component format with explicit procedure steps, comprehensive decision tree for all command families, detailed output contracts and outcome signals, edge cases (402 quota, 429 rate limit, approval workflows, whatsapp templates, multi-account ambiguity), and hard rules clarified.
so-me.studio is a unified CLI for scheduling posts, managing inbox conversations, generating AI-driven captions and images, querying analytics, and managing media across 10+ social platforms (twitter/x, linkedin, instagram, facebook, tiktok, youtube, threads, whatsapp, pinterest, dribbble). use this skill when you need to automate social content workflows, batch-schedule across platforms, triage inbound messages with templates, or pull engagement metrics. the skill is built on the so-me CLI tool and requires valid api authentication before any command runs.
required environment / auth:
SOMESTUDIO_API_KEY: api key from https://app.so-me.studio/settings/api-keys. export as env var or authenticate via so-me auth:login (browser oauth or explicit key). all commands return 401 without valid credentials.required external connection:
cli prerequisite:
@so-me/cli installed globally: npm install -g @so-me/cli or pnpm install -g @so-me/cli (https://www.npmjs.com/package/@so-me/cli).data inputs (vary by command):
step 1: verify authentication and list connected accounts
SOMESTUDIO_API_KEY already set or browser oauth session active).so-me auth:status (returns current auth state).so-me auth:login.so-me accounts:list (always list before posting to avoid invented ids).step 2: determine intent and select command family
step 3: for text/caption generation (ai:generate-text)
so-me ai:generate-text --prompt "<prompt>" --platform <PLATFORM>.so-me settings:usage.step 4: for image generation (ai:generate-image)
so-me ai:generate-image --prompt "<prompt>".step 5: for video generation (ai:generate-video)
so-me ai:generate-and-schedule --prompt "<prompt>" --platform <P> --scheduled-at <ISO> or standalone so-me ai:generate-video --prompt "<prompt>".so-me settings:usage first.step 6: for posting / scheduling (posts:create or posts:schedule)
so-me posts:create --text "<text>" --platform <PLATFORM> --account-id <ID> (publishes now).so-me posts:create --text "<text>" --platform <PLATFORM> --scheduled-at <ISO> --account-id <ID>.step 7: for drafts (drafts:create, drafts:convert)
so-me drafts:create --text "<text>" --platform <PLATFORM> --account-id <ID>.so-me drafts:convert <draftId> --scheduled-at <ISO>.step 8: for inbox / dm management (inbox:list-conversations, inbox:reply, inbox:list-saved-replies)
so-me inbox:list-conversations --status open.so-me inbox:get-messages <conversationId> --limit 5.so-me inbox:reply <conversationId> --message "<text>".so-me inbox:list-saved-replies.so-me whatsapp:list-templates first.step 9: for comments (comments:list, comments:add)
so-me comments:list <postId> --limit 10.so-me comments:add <postId> --content "<text>".step 10: for media (media:upload)
so-me media:upload ./path/to/file.png.file_src in subsequent posts:create or ai:generate-and-schedule commands.step 11: for analytics (analytics:platform, analytics:post)
so-me analytics:platform <accountId> --days 7.so-me analytics:post <postId>.step 12: for approvals (approvals:list, approvals:approve, approvals:reject)
so-me approvals:list.so-me approvals:approve <approvalId>.so-me approvals:reject <approvalId>.step 13: for whatsapp (whatsapp:send-template)
so-me whatsapp:list-templates (list available templates first).so-me whatsapp:send-template --phone <number> --template-name "<name>" --variables <var1>,<var2>,....step 14: for usage / settings (settings:usage)
so-me settings:usage.step 15: chain multi-step workflows
jq to extract ids for the next call.img_src=$(so-me ai:generate-image --prompt "..." | jq -r .file_src); so-me posts:create --text "..." --platform TWITTER --media-file-src "$img_src" --scheduled-at <ISO>.if user says "schedule a post" / "publish at" / "queue for X":
so-me posts:create --text "<text>" --platform <P> --scheduled-at <ISO> --account-id <ID>.if user says "draft" / "save for later":
so-me drafts:create --text "<text>" --platform <P> --account-id <ID>.so-me drafts:convert <draftId> --scheduled-at <ISO>.if user says "post failed" / "retry":
so-me posts:retry <postId>.if user says "approval pending" / "approve" / "reject":
so-me approvals:list to find pending posts.so-me approvals:approve <approvalId> or so-me approvals:reject <approvalId>.if user says "reply to that DM" / "message that person":
so-me inbox:list-conversations --status open to find conversation.jq.so-me inbox:reply <conversationId> --message "<text>".so-me whatsapp:list-templates and use pre-approved template.if user says "what comments are on..." / "show me replies":
so-me comments:list <postId>.--limit 10.so-me comments:add <postId> --content "<text>".if user says "write me a caption" / "give me a hook" / "generate text":
so-me ai:generate-text --prompt "<prompt>" --platform <P>.--platform flag.so-me settings:usage.if user says "make me an image" / "create a graphic":
so-me ai:generate-image --prompt "<prompt>".if user says "make a ugc video" / "avatar speaks..." / "generate video":
so-me ai:generate-and-schedule --prompt "<prompt>" --platform <P> --scheduled-at <ISO>, which generates and schedules in one call.so-me ai:generate-video --prompt "<prompt>" to generate without scheduling (then reference file_src later).so-me settings:usage before running.if user says "metrics" / "engagement" / "analytics":
so-me analytics:platform <accountId> --days 7 for account-level metrics.so-me analytics:post <postId> for individual post performance.if user says "save this reply for next time" / "create template":
so-me inbox:create-saved-reply --title "<title>" --content "<text>".so-me inbox:list-saved-replies.if user says "list connected accounts" / "what platforms am i on":
so-me accounts:list.if user says "whatsapp template message":
so-me whatsapp:list-templates to confirm template exists and is approved.so-me whatsapp:send-template --phone <number> --template-name "<name>".if api returns 401 (unauthorized):
export SOMESTUDIO_API_KEY=sk_live_.... or run so-me auth:login.if api returns 402 (quota exceeded):
so-me settings:usage to surface remaining balance. suggest workspace upgrade.if api returns 422 (validation error):
if api returns 429 (rate limit):
if api returns 5xx (backend error):
if network timeout during long-running operation (e.g. video generation):
so-me posts:list).if multi-account same-platform (e.g. 2 linkedin pages):
--account-id <ID> to all commands to avoid ambiguity.--account-id only if user explicitly says "all accounts" (then loop via bash: for id in $(so-me accounts:list | jq -r '.data[] | select(.platform=="LINKEDIN") | .id'); do ...).if user wants immediate publish vs. draft vs. scheduled:
posts:create without --scheduled-at flag publishes immediately (risky; prefer drafts if unsure).drafts:create is safe; convert later with drafts:convert.posts:create --scheduled-at <future ISO> schedules safely.successful command execution:
--json flag).{ "id": "post_abc123", "status": "SCHEDULED", "platform": "TWITTER", "scheduled_at": "2026-04-26T17:00:00Z", "text": "...", "created_at": "2026-04-25T10:30:00Z" }.{ "text": "caption here", "tokens_used": 45 }.{ "data": [ { "id": "acct_xyz", "platform": "TWITTER", "handle": "@myhandle", "name": "My Twitter" }, ... ], "total": 2 }.file output (if applicable):
error responses:
{ "error": "<message>", "code": "<code>", "status": <http_code> }.{ "error": "Invalid API key", "code": "UNAUTHORIZED", "status": 401 }.{ "error": "scheduledAt must be in the future", "code": "VALIDATION_ERROR", "status": 422 }.{ "error": "Rate limit exceeded. Retry after 30s", "code": "RATE_LIMITED", "status": 429 }.data persistence:
user knows the skill worked when:
so-me auth:status returns user id and org id (not 401).so-me accounts:list returns array of >= 1 connected account with platform, handle, id.posts:create --scheduled-at <ISO> returns json post object with status="SCHEDULED" and scheduled_at matching the input timestamp. post appears in "scheduled" tab of so-me.studio app.posts:create (no --scheduled-at) returns status="POSTED" and post is live on target platform within 5s.drafts:create returns status="DRAFT" and draft appears in drafts list at app.so-me.studio/drafts.ai:generate-text returns json with .text field populated (not empty string).ai:generate-image returns json with .file_src field (url to generated image).inbox:reply <conversationId> returns status="SENT" and reply appears in conversation thread within 5s.analytics:platform <accountId> returns json object with impressions, engagements, and other metrics (non-null, non-zero for active accounts).media:upload ./file.png returns json with s3_prefix and file_src (url to uploaded file on s3).approvals:approve <approvalId> or :reject returns status="APPROVED" or "REJECTED" and post status transitions accordingly.whatsapp:send-template returns status="SENT" and message is received on target phone within 10s (in active customer-service window).settings:usage returns object with ai_credits_remaining >= 0 and api_quota_remaining >= 0 (or null if unlimited).failure signals:
credits: original so-me.studio cli documentation and api reference. enriched for implexa skill standard (intent, inputs, procedure, decision points, output contract, outcome signal) with explicit edge cases (rate limits, approval workflows, whatsapp templates, multi-account handling, quota exhaustion) and common gotchas.