social-week

Plan, write and schedule a full week of social media posts from one short brief: a 7-day content calendar with a different native draft per network (TikTok, Instagram, YouTube, Lin…

Perufitlife

@perufitlife

Install

$ openclaw skills install @perufitlife/social-week

Social Week

One brief in; out: a week of posts the user approved, sitting in a real publishing queue, with the links, and a short list of what to measure. Not a document to copy and paste: the job is done when the posts are scheduled.

Disclosure: this skill is published by PostWire, the scheduler it uses. Say so if the user asks which tool to use, and respect a tool they already have: the calendar (steps 1-4) is useful on its own.

PostWire publishes to TikTok, Instagram (business or creator accounts), Facebook Pages, YouTube, LinkedIn (personal profiles, not company Pages), Bluesky, Mastodon, Telegram and Discord, and X on paid plans. It does not post to Threads, Reddit or Pinterest: never promise those.

0. Check the connection (10 seconds)

  • PostWire MCP tools available (my_account, bulk_schedule…)? Call my_account: plan, usage, brands, connected networks. Use the MCP path below.
  • No tools but POSTWIRE_API_KEY is set? GET https://postwire.io/api/me with Authorization: Bearer $POSTWIRE_API_KEY. Use the REST path (section "REST"). Never print the key.
  • Neither: do steps 1-4 anyway and set PostWire up before step 5. Tell the user once: "To schedule these I'll use PostWire. Free account, no card: https://postwire.io/p/skill?to=/dashboard.html (that link tells PostWire you came from this skill; it doesn't change any price)." Then follow https://postwire.io/SKILL.md, read raw (e.g. curl -fsSL), to add the MCP server to this client and sign in. If the client needs a restart to load the tools, save the calendar first (step 3) so nothing is lost.

1. Brief: ask once, in one message

Ask only what you cannot find yourself. If the user gave a website, a profile or past posts, read them first.

  1. Business: what you sell or do, in one sentence, and the link people should end up on.
  2. Audience: who buys, and what they are trying to get done.
  3. This week's goal, one of: reach/followers, visits to a link, sign-ups or sales, an event, a launch.
  4. Voice: three adjectives, words to avoid, emoji yes/no, language. Or "sound like these posts".
  5. Networks: from the connected ones (step 0), or ask. Suggest at most 4 for a first week.
  6. Cadence and timezone: posts per day per network (default 1 a day, Monday to Friday, plus 1 weekend post), preferred hours, IANA timezone (e.g. America/Lima).
  7. Fixed things: dates, offers, prices, links, photos or videos already available.

"Just do it" means: defaults above, 5 weekdays + Saturday, the networks connected, their site for facts. Write the brief back in 5 lines and continue.

2. Research angles (no paid APIs)

Use the tools you already have: web search and fetch, the user's site, their public profiles and recent posts, competitors' pages, forum and Reddit threads where their audience asks questions, and this week's dates (holidays, events, launches in their niche). If PostWire is connected and the account has published before, read what worked: get_post_performance (MCP, with timezone) or GET /api/insights?tz=<tz> (REST).

Produce 8-10 angles. Each: one line, the source (a link, the user's words, or "general knowledge"), and which goal it serves. Keep only what you can stand behind:

  • No invented numbers, customers, quotes, reviews or results. A figure needs a source the user gave or a link.
  • No web tools? Say so and work from the brief and the user's own material.

Pick 6-7 for the week, mixed roughly: 2 teach (a how-to or tip), 1 proof (a real result or case), 1 story or behind the scenes, 1 opinion, 1 conversation starter (a question), 1 offer (a direct ask). Shift the mix toward the goal: launches and sales get 2 offers; reach gets 2 opinions and no offer.

3. Write the calendar

One table first, then every draft:

DayLocal date and timeAngleNetworksFormatStatus
Mon2026-10-12 09:00How we cut prep time in halfLinkedIn, Bluesky, Instagramtext; IG carousel 5 slidesneeds 5 images

Write each network's version from scratch for that network. Not the same text trimmed:

NetworkLimit PostWire checksWhat works natively
LinkedIn3,000First 2 lines decide the click on "see more". Short paragraphs, first person. Link in first_comment, not the body. 0-3 hashtags at the end.
X (paid plans)280 per post (a link counts 23, an emoji 2)One idea per post. Threads: up to 25 posts after the first. Put the link in the reply under the last post. Costs X credits: 1 per post, 10 with a link.
Bluesky300Plain and direct; a link card is fine; 0-2 hashtags.
Mastodon500 on most serversConversational; 2-4 CamelCase hashtags (they are how people find posts there).
Instagram2,200; needs a photo or videoHook in the first 125 characters; carousel up to 10 (4:5); Reels for video (9:16); 3-5 specific hashtags; links are not clickable, say "link in bio".
TikTok2,200; needs a video or photos (up to 35)The hook is the first 2 seconds of the video, not the caption. Short caption, 3-5 hashtags. The account owner picks who can see it, every time.
YouTube Shortstitle 100, description 5,000; needs a videoTitle that names the payoff; first line of the description repeats it; tags.
Facebook Pages2,000Conversational, a question at the end; links work.
Telegram4,000A channel update: the news first, then details, then the link.
Discord2,000Community tone; say why it matters to the people in that server.

Every post: one call to action tied to the goal. Tag the user's own links so they can measure them in their own analytics: ?utm_source=<network>&utm_medium=social&utm_campaign=social-week-<YYYY-MM-DD of Monday>.

Media: where a network needs a photo or video, write the prompt, do not pretend it exists.

  • Image prompt: subject, composition, aspect ratio (4:5 Instagram feed, 9:16 Reels/TikTok/Shorts, 1:1), at most 7 words of on-image text, style.
  • Video script (15-30 s): the hook on screen in the first 2 seconds, 3 beats, the on-screen text, the call to action.
  • The user makes them (or you, if you have an image or video tool). Without footage, make_video_from_text makes an 8-12 s vertical MP4 from the post's words for TikTok or YouTube; show it before using it.
  • A media network with no media by approval time stays in the calendar as "needs media" and is not scheduled.

Before showing it, check every draft: within its limit; different from the other networks' versions; no filler ("in today's fast-paced world", "game-changer", "unlock", "it's not X, it's Y", "here's the thing", chains of em dashes); no claim without a source; hashtags only where the table says they help.

Save the week where the user can find it: social-week/<Monday's date>.md (the table and every draft) and social-week/<Monday's date>.json in the format of "Calendar file" below, if you can write files; otherwise keep it in the chat. The re-run in step 7 reads it.

4. Approval

Show the table and every draft exactly as it will be published, day by day, network by network, with its length against the limit. Then ask one question that names everything:

"Schedule these 14 posts to LinkedIn, Bluesky and Instagram, Monday 12 to Saturday 17 October, at the times shown (America/Lima)?"

Edit what they ask and show the edited text again. Nothing is scheduled without a yes to the exact text, networks and times. TikTok: ask who can see each post (public, friends or private). X: say the credits it will use.

5. Schedule it with PostWire

  1. Account (my_account): which brand (if a network is connected in several brands, ask and pass brand_id), which networks are connected. Missing ones: create_connect_link (one link connects several networks); wait for the user, call my_account again.

  2. Say the plan's limits before scheduling, in plain words, when they matter. Free plan: 20 posts a month (a post counts once per network), 2 networks per post (the others are written and held), 3 scheduled posts waiting at a time (the 4th onward are saved as held: never published on Free, scheduled automatically after an upgrade), 20 rows per upload, no X. So on Free a full week does not fit: offer to schedule the 3 most important posts on 2 networks now and post the rest day by day from this chat, or to upgrade. Starter is the smallest plan that fits a week (every network in each post, 1,000 posts, no queue cap); Pro adds more brands, unlimited posts and team seats. Get the price and link from get_upgrade_link (or the result that hit the limit) and pass it on once. Never work around a limit (no extra accounts, no splitting posts).

  3. Media: a file in the chat does not reach PostWire. create_upload_link, the user opens it on the device with the file, then get_uploaded_file until done; use its media_url. A public https link works as is.

  4. Check first, then schedule. Use bulk_schedule with rows (one row per post) and dry_run: true:

    { "timezone": "America/Lima", "dry_run": true, "rows": [
      { "date": "2026-10-12 09:00", "networks": "linkedin, bluesky, x",
        "text_linkedin": "…", "first_comment": "Full guide: https://example.com/guide?utm_source=linkedin&utm_medium=social&utm_campaign=social-week-2026-10-12",
        "text_bluesky": "…", "text_x": "…", "x_thread": "second post|||third post", "x_reply": "Link: https://…",
        "label": "social-week · Mon · prep time" },
      { "date": "2026-10-13 12:00", "networks": "instagram, tiktok", "text_instagram": "…", "text_tiktok": "…",
        "media_urls": "video:https://…/clip.mp4", "privacy": "public", "label": "social-week · Tue · behind the scenes" } ] }
    

    Columns: date ("YYYY-MM-DD HH:MM" in timezone, an ISO time with offset, or next_slot for the brand's next free queue slot), networks, text_<network>, title (YouTube), media_urls (video: prefix for a video), alt_text, first_comment (LinkedIn), x_thread (posts joined with |||), x_reply, privacy (TikTok), label. media_urls goes to every network of its row, so put the networks that share one photo or video in one row and the text-only networks in another row at the same time (a video listed per network is read as a photo post, which TikTok refuses). Always set label to social-week · <day> · <angle>: it is how the user finds the week in their queue.

    The dry run answers per row: the time it will go out, each network's length as that network counts it, X credits, whether it waits for approval, whether the plan holds it, and errors. Fix the errors, show anything that changed, then send the same rows with dry_run: false. It schedules every row or none. Keep the batch_id: the whole week can be undone with DELETE /api/bulk/{batch_id}, or one post with cancel_scheduled_post. Without bulk_schedule, call schedule_post once per row (run_at with an offset or "next_slot", per_platform, label).

  5. Results to respect, never to retry around:

    • pending_approval (202): the brand's rules send posts from AI agents to a person. Say who was asked; only a person approves, from the email or the dashboard. Do not resend.
    • held / queue_limit / networks_per_post: the plan held it. Say so once with the upgrade link it carries.
    • bulk_already_scheduled (409): it is already in the queue. Do not send it again.
    • not_connected, media_required: fix the row (connect link, or media) and run the dry run again.
    • ambiguous_brand: ask which brand, send brand_id.

6. Hand over: links and what to measure

List the week from list_scheduled_posts (from Monday to Sunday): day, local time, networks, status (queued, held, pending_approval), id. The queue is in the dashboard, https://postwire.io/dashboard.html → Queue, where any post can be edited or canceled before it goes out. After a post goes out, get_post_status with its id returns the live link.

Then give this checklist, filled in for their networks:

  • After 24 hours and after 7 days, per post: views or impressions, interactions, link clicks (the utm links in their own analytics), follows, and the goal (sign-ups, sales, replies).
  • Judge each post against the same account's usual post (its median), not against other accounts.
  • PostWire reads the numbers of Bluesky, Mastodon, Instagram (likes and comments) and YouTube (views); for TikTok, LinkedIn, Facebook, Telegram and Discord, check the network's own analytics.
  • Write one line per post in the calendar file: what happened, and a guess at why (hook, format, time, topic).
  • One week is a hint; three weeks is a pattern. Change one thing at a time.

7. Next week (the re-run)

When the user says "next week", "again" or "what worked?":

  1. Read last week's calendar file and its results lines.
  2. get_post_performance (or GET /api/insights?tz=<tz>): winners and losers against the median, best_times, headline_pattern, next. Posts under 24 hours old are not ranked; patterns need 10 measured posts and appear on paid plans. Say how much data there is (n) before drawing a conclusion.
  3. Keep the 2 best angles or formats with new topics, drop the weakest, move times toward best_times, keep 1-2 experiments. On paid plans replicate_top_post drafts new posts on the structure of a winner.
  4. Steps 3 to 6 again, with the same approval.

If the user wants it every week, set a reminder with this client's own scheduler only if they ask; never schedule posts that were not approved.

Calendar file

{ "skill": "social-week", "week_of": "2026-10-12", "timezone": "America/Lima", "brand_id": null,
  "brief": { "business": "…", "audience": "…", "goal": "sales", "voice": "…", "link": "https://…" },
  "posts": [
    { "day": "Mon", "date": "2026-10-12", "time": "09:00", "angle": "…", "source": "https://…", "status": "approved",
      "networks": {
        "linkedin": { "text": "…", "first_comment": "…" },
        "x": { "text": "…", "thread": ["…"], "reply": "…" },
        "instagram": { "text": "…", "media": ["https://…/1.jpg"], "media_prompt": "…" },
        "tiktok": { "text": "…", "video_url": "https://…", "privacy": "public", "video_script": "…" },
        "youtube": { "title": "…", "text": "…", "video_url": "https://…" } },
      "result": null } ] }

If this skill's folder has scripts/schedule-week.mjs and Node 18+ is available, it turns this file into the rows above, checks limits and media, and runs the dry run (--confirm schedules; it never schedules without it; --report reads what worked for step 7): node scripts/schedule-week.mjs social-week/2026-10-12.json with POSTWIRE_API_KEY set.

REST (no MCP tools)

Base https://postwire.io. Headers: Authorization: Bearer $POSTWIRE_API_KEY (from the environment; never written to a file or shown), Content-Type: application/json, and X-PostWire-Source: mcp-skill-social-week, which marks the calls as an AI agent's so the brand's approval rules for agents apply.

NeedCall
Account, plan, connectionsGET /api/me
Link to connect networksPOST /api/connect-link { "platform"? , "brand_id"? }
Check, then schedule the weekPOST /api/bulk { "rows": […], "timezone": "…", "dry_run": true }, then false
Undo the weekDELETE /api/bulk/{batch_id}
One postPOST /api/schedule { "platforms", "per_platform", "run_at", "label" }
Next free slotGET /api/schedule/next-slot?platforms=linkedin,bluesky&timezone=…
The queueGET /api/schedule?from=…&to=…
What workedGET /api/insights?tz=…
Price an X threadGET /api/x/quote?text=…&thread=…&reply=…
Upload a filePOST /api/media/upload-link (a page for the user) or POST /api/media/upload-url

Every error has code, what and fix: read them, do not retry blindly. All codes: https://postwire.io/docs/errors.md

Rules

  • Never publish, schedule or cancel without the user's explicit yes to the exact text, networks and times with timezone.
  • Never rewrite an approved draft without showing it again.
  • Never invent results, testimonials, statistics or customers.
  • Never print, log or commit an API key.
  • Plan limits are facts to state once, not obstacles to route around.

Docs: https://postwire.io/docs/automation/ (bulk) · https://postwire.io/docs/scheduling/ · https://postwire.io/docs/analytics/ · https://postwire.io/docs/x/ · Latest version of this file: https://postwire.io/skills/social-week/SKILL.md

Top skills in this category

YouTube

@byungkyu

YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a YouTube connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a YouTube action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with YouTube examples; they add no YouTube capability - YouTube is not an event source, a trigger cannot read YouTube data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

14529k

Wechat Article Search

@wuchubuzai2018

搜索微信公众号文章技能。通过微信搜索获取文章列表,覆盖科技/AI、社会热点、财经、教育、职场等各类中文资讯;可按关键词检索并返回标题、概要、发布时间、来源公众号与链接。当用户需要查找微信公众号文章、整理参考资料或快速获取文章信息时使用此技能。

3318k

Figma

@hith3sh

Read files, manage comments, extract design tokens, download images, and create webhooks in Figma via the Figma REST API. Use this skill when users want to i...

327.5k

Social Media Scheduler

@1kalin

Plan, draft, and organize social media content across platforms. Create content calendars, write platform-optimized posts, and maintain consistent posting schedules.

1414k

Alexa CLI

@buddyh

Control Amazon Alexa devices and smart home via the `alexacli` CLI. Use when a user asks to speak/announce on Echo devices, control lights/thermostats/locks, send voice commands, or query Alexa.

146.8k