publish
Installation
SKILL.md
Publish
One post, one or more channels, now or at a set time. For YouTube uploads use yt-upload; for Naver Blog posts use naver-post; for a week of posts use schedule-week.
Procedure
- Channels. Call
select_channels. With no scope it returns the candidates: show them and let the person choose. With what they named (platform names, handles or account ids, orall), it returnsaccountIdsto pass topublishunchanged, plusskipped(expired or not-yet-live channels, with a sentence to read out and a reconnect link) andlimits, the tightest rules across the chosen channels. If it answersworkspace_required, show the workspaces it lists, ask which one, and passworkspaceIdon this and every later call. - Rules. Write to
limitsfromselect_channels. When you need one channel's rules or what it can do (media required, chains, comments, edits after publishing), readlist_platformsand its features table. Never write a limit from memory. - Channel settings. Open
references/<channel>.mdonly for the channels in this post (threads,instagram,facebook,youtube,tiktok,telegram,discord,pinterest,x,bluesky,naver_blog,ghost,wordpress). They say whichoptions.<channel>.*fields exist and which ones you must ask about. - Text. If a voice file exists at
~/.uplika/<workspace-slug>/voice.md, read it first; if not, write plainly and offer thevoice-profileskill afterwards. A channel can get its own text withoptions.<channel>.content. A long post on a channel that supports chains goes inthreadItems(first item is the root). - Media.
- With a terminal (Claude Code, Codex, OpenClaw, Hermes) and a local file:
media_presignwith the file name, type and size, PUT the bytes to the returneduploadUrlwith curl, thenmedia_complete. - Without a terminal (claude.ai, ChatGPT): a public https file goes through
media_from_url; a file on the person's device goes throughmedia_upload_link(give them the link, then pollmedia_upload_statusuntil it is ready). In ChatGPT, files in the conversation go throughmedia_from_file: attached files come through as they are, and images ChatGPT made or files made by code come through by their /mnt/data path. A file id alone is refused. - Write
altTextwhen you can see the image. PassaiGeneratedwhen the media was made with AI.
- With a terminal (Claude Code, Codex, OpenClaw, Hermes) and a local file:
- Show and confirm. Before anything goes out, show the person the exact text per channel, the media, the channels and handles, and the time (now, or
scheduledAtwith its time zone). Publish only after they approve. A post they want to finish themselves can be saved withdraft: true. - Publish. Call
publishwithaccountIds,content,mediaIds,options, andwait: trueso the response tells you whether it is really out. For a later time passscheduledAt(ISO 8601 with offset). TikTok needsget_publish_optionsfirst (seereferences/tiktok.md). - Report. Call
get_postwith the returned id and give the person each channel's status and permalink. A target that failed has a reason: read it out, callget_helpwith its code, and offerretry_postonce the cause is fixed. A wait that times out is not a failure: the post is usually still going out, so check withget_postorlist_postsinstead of publishing again.