Install
openclaw skills install @social-media-skills/tiktok-slideshow-skillTikTok slideshow skill: plan, write and render TikTok photo-mode slideshows (photo carousels) that market an app, SaaS or product, then post them as native TikTok photo posts (inbox draft or direct) and Instagram carousels to one or many accounts with WoopSocial, read the results back and test the next hooks. Ships a free local slide renderer (Python + Pillow, TikTok Sans and TikTok's own text styles, 1080x1920 with safe zones, plus 4:5 Instagram copies) for your photos, free stock photos or any image model, with full-screen app screenshots; no paid API keys. Use when someone says "tiktok slideshow," "make tiktok slideshows for my app," "tiktok carousel," "photo mode post," "slideshow marketing," "automate tiktok slideshows," "app marketing on tiktok," "post slideshows to several tiktok accounts," or "turn this into a tiktok slideshow." Never promises views, never invents results, reviews or stories, confirms before anything posts. Standalone: needs no other skills.
openclaw skills install @social-media-skills/tiktok-slideshow-skillApp founders and indie hackers use TikTok slideshows because they are cheap to make, they can show up in TikTok search, and one good hook can be tested across many posts and accounts. Most fail for boring reasons: slide 1 is about the app instead of the viewer, the app shows up too late, the slides look like a presentation instead of a person's post, or every account posts the same thing until it looks like spam.
This skill does the whole job: it picks a format that fits the app, writes hooks worth testing, renders slides that look native to TikTok, posts them through WoopSocial after the user says yes, then reads the numbers back and decides what to test next. Everything it needs is in this folder.
Four commitments:
If the workspace has app or brand notes (app.md, brand-profile.md, a README), read them.
Otherwise ask, in one message:
Formats are in references/slideshow-recipes.md. The ones that carry app marketing:
Write 10 to 20 hooks per session (rules in references/slide-framework.md): about the
viewer or another person, specific, readable in under 2 seconds, no app name. Pick the best 3 to
5 for this batch and log the rest for later. Write each account's slides in that account's
language, with the words its audience searches for.
5 to 6 slides. Full framework: references/slide-framework.md.
"layout": "fullscreen") or a photo of the phone showing it. No screenshot yet? Say what it
does in plain words. Never mock up a screen.One text block per slide, one size, 1 to 3 short lines. A headline plus a smaller line reads like a presentation. Write like people post: lowercase, plain words, no marketing language.
Then write the caption (main search phrase in the first words, then one line and a question) and 1 to 3 specific hashtags.
Show the user the batch as a table (account, hook, slide text, caption) and wait for their OK or edits before rendering.
Pick one photo set per slideshow before writing any photo direction: the same person or the same room, the same light, so it reads as one person's camera roll. Six strangers in six rooms reads as stock. And avoid literal illustrations: no alarm clock for "strict", no cat for "pet". The photos set the scene; the text tells the story.
| Source | Use |
|---|---|
| The user's own photos | Best. Real rooms, desks, hands holding the phone. |
| Free stock photos | When the user has none. Pexels and Unsplash (free license, commercial use; skip Unsplash+). Look for a single shoot: photographers like Ketut Subiyanto or cottonbro publish many shots of one person in one place. No other apps' screens or logos visible. |
| An image model | Lock one scene description (person, room, light, camera) and change only what each slide needs. Realistic AI images need disclosure on TikTok (Step 5). |
| App screenshots | The reveal slide, full-screen. |
| Plain colors | Last resort; they look like a deck. |
Getting stock photos: with a browser tool, open a photo on pexels.com or unsplash.com, find the
rest of its shoot (same photographer, same model and room), and download those few photos one
by one (Pexels: images.pexels.com/photos/<id>/pexels-photo-<id>.jpeg?cs=tinysrgb&w=1080).
Without a browser, give the user the photo set direction and ask them to save 5 or 6 matching
photos into ./photos. Keep photos/CREDITS.md with each photo's source link.
Text style (TikTok Sans, the font TikTok's own text tool uses, is bundled). Set it once in
theme for the whole slideshow:
highlight: text on strips, one per line, like TikTok's background text. Set "strip": "black" or "white" in the theme so every slide matches. Readable on any photo.classic: white text with a thin outline and a soft shadow. Best on darker, calm photos.Place text on calm space (wall, bedding, sky) and never over a face: use "position"
(upper default, top, center, bottom) per slide.
Write slides.json (format at the top of scripts/render_slides.py) and render:
pip install pillow # once
python3 scripts/render_slides.py slides.json --out slideshow/
You get slideshow/tiktok/slide-01.jpg ... (1080x1920), slideshow/instagram/ (1080x1350),
slideshow/contact-sheet.png and slideshow/contact-sheet-instagram.png. Open both contact
sheets and every slide at full size (the contact sheet hides text over faces), and judge them
like a top TikTok creator would:
Read and fix every renderer warning (too long, mixed styles, subtext on many slides). Re-render until it passes.
No shell or code sandbox? Give the user the slide text, photo direction and text style per slide so they can build it in TikTok's own photo editor or CapCut, and skip to the caption.
Before anything ships (full list: references/slide-framework.md):
If a slide fails, rewrite it. Don't ship and hope.
How to connect, upload and post: references/woopsocial.md. Short version:
social_accounts_list. If WoopSocial isn't connected, give the
one connect path for the agent you're running in (directory listing or one command, sign-in in
the browser, free plan for 2 social accounts, no card). Then call oauth_create_authorization
for each platform and hand the user the link. Confirm with social_accounts_list. More than 2
accounts needs a paid WoopSocial plan; say so before planning a big batch.media_uploads_create_session with the project ID and
the exact byte size from slideshow/manifest.json, save the response as session.json, run
python3 scripts/upload_parts.py session.json <file>, then media_uploads_complete_session.
If its status isn't READY, poll media_uploads_get_session until it is; on FAILED, report
the failure message. Keep the media IDs in slide order.posts_validate on each. TikTok and Instagram use different image
sizes, so they are separate posts.
postType: PHOTO, the 9:16 images, settings from
social_accounts_get_platform_inputs. Two modes:
postMode: MEDIA_UPLOAD. The slideshow lands in the
user's TikTok inbox; they add a sound, set the AI label if needed, and publish. Safest for
new accounts.postMode: DIRECT_POST with a privacyLevel from the account's allowed
values and autoAddMusic: true. The API's AI-content flag covers videos only, so a direct
post with realistic AI images must disclose it in the caption (for example "images made
with AI"); otherwise use an inbox draft.postType: POST with the 4:5 images, at most 10. Tell the user plainly if
validation refuses it.DRAFT only saves the post in
WoopSocial and sends nothing to TikTok. For a TikTok inbox draft use MEDIA_UPLOAD with
PUBLISH_NOW or SCHEDULE_FOR_LATER.posts_create and report the result per account with posts_get.references/multi-account-testing.md). Stagger the times with SCHEDULE_FOR_LATER (UTC),
show the whole batch as one table and confirm once.Not connected and doesn't want to connect? Hand over the files and the caption and stop. Never claim something was posted when it wasn't.
After 48 to 72 hours, call social_account_posts_list and read the posts' stored lifetime
metrics (views, likes, comments, shares, saves, when TikTok provides them). Report every number
with its collection date; a missing number means "not reported", not zero.
For app marketing, installs matter more than views. Ask the user for downloads or trials per day
from App Store Connect, Play Console, RevenueCat or their analytics, and add them to hooks.md
next to each day's posts. Never estimate them. Then read the matrix:
| Views | Downloads | What it means | Do |
|---|---|---|---|
| High | High | Working | Scale: 2 to 3 variants of the hook, more accounts |
| High | Low | Hook works, the reveal or call to action doesn't | Fix the app slide, the caption and the bio link |
| Low | High | The idea converts, the hook doesn't stop people | Keep the slideshow, test new hooks |
| Low | Low | Not working | Retire after two tries; change the format |
"High" and "low" are against the same account's usual numbers, not against viral posts. Small
numbers are noisy: don't call a winner from one post on a new account. Rules for running this
across accounts: references/multi-account-testing.md.
references/multi-account-testing.md), then use
inbox drafts for the first weeks. Nobody can guarantee reach; say so.posts_validate before promising it will post.references/slide-framework.md: the SLIDE framework, hook rules, design and the honesty gate.
Start here.references/slideshow-recipes.md: the slideshow formats for app marketing with slide-by-slide
templates, captions and a worked example.references/multi-account-testing.md: warm-up, cadence, variants per account, the hook log.references/slideshow-2026-reality.md: what TikTok photo mode rewards, image specs, labels and
account-safety basics (verify quarterly).references/woopsocial.md: connecting WoopSocial and the upload, post and metrics steps.references/scope-and-connections.md: what this skill does and doesn't do.scripts/render_slides.py: the free slide renderer (TikTok Sans bundled in fonts/).scripts/upload_parts.py: uploads a file to a WoopSocial upload session.