Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user mentions TikTok growth, slideshow ads, or social media marketing for their app. Covers competitor research (browser-based), image generation, text overlays, Discord delivery, analytics tracking, hook testing, CTA optimization, conversion tracking with RevenueCat, and a full feedback loop that adjusts hooks and CTAs based on momentum vs conversions. --- name: tiktok-app-marketing description: Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user m Capability contract not published. No trust telemetry is available yet. Last updated 2/25/2026.
Freshness
Last checked 2/25/2026
Best For
tiktok-app-marketing is best for distinguish, start, you workflows where MCP compatibility matters.
Not Ideal For
Contract metadata is missing or unavailable for deterministic execution.
Evidence Sources Checked
editorial-content, GITHUB OPENCLEW, runtime-metrics, public facts pack
Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user mentions TikTok growth, slideshow ads, or social media marketing for their app. Covers competitor research (browser-based), image generation, text overlays, Discord delivery, analytics tracking, hook testing, CTA optimization, conversion tracking with RevenueCat, and a full feedback loop that adjusts hooks and CTAs based on momentum vs conversions. --- name: tiktok-app-marketing description: Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user m
Public facts
4
Change events
1
Artifacts
0
Freshness
Feb 25, 2026
Capability contract not published. No trust telemetry is available yet. Last updated 2/25/2026.
Trust score
Unknown
Compatibility
MCP
Freshness
Feb 25, 2026
Vendor
Wotaso
Artifacts
0
Benchmarks
0
Last release
Unpublished
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Capability contract not published. No trust telemetry is available yet. Last updated 2/25/2026.
Setup snapshot
git clone https://github.com/Wotaso/LarryNoPostiz.gitSetup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Wotaso
Protocol compatibility
MCP
Handshake status
UNKNOWN
Crawlable docs
6 indexed pages on the official domain
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
Parameters
json
{
"researchDate": "2026-02-16",
"competitors": [
{
"name": "CompetitorApp",
"tiktokHandle": "@competitor",
"followers": 50000,
"topHooks": ["hook 1", "hook 2"],
"avgViews": 15000,
"bestVideo": { "views": 500000, "hook": "..." },
"format": "before-after slideshows",
"postingFrequency": "daily",
"cta": "link in bio",
"notes": "Strong at X, weak at Y"
}
],
"nicheInsights": {
"trendingSounds": [],
"commonFormats": [],
"gapOpportunities": "What competitors AREN'T doing that we could",
"avoidPatterns": "What's clearly not working"
}
}text
iPhone photo of a [specific room/scene], [specific style], [specific details]. Realistic lighting, natural colors, taken on iPhone 15 Pro. No text, no watermarks, no logos. [Consistency anchors: "same window on left wall", "same grey sofa", "wooden coffee table in center"]
text
clawhub install revenuecat
text
export RC_API_KEY=sk_your_key_here
text
Schedule: daily at 07:00 (user's timezone) Task: Run scripts/daily-report.js --config tiktok-marketing/config.json --days 3 Output: tiktok-marketing/reports/YYYY-MM-DD.md + message to user with summary
json
{
"app": {
"name": "AppName",
"description": "Detailed description",
"audience": "Target demographic",
"problem": "Pain point it solves",
"differentiator": "What makes it unique",
"appStoreUrl": "https://...",
"category": "home|beauty|fitness|productivity|food|other",
"isMobileApp": true
},
"imageGen": {
"provider": "openai",
"apiKey": "sk-...",
"model": "gpt-image-1.5"
},
"discord": {
"webhookUrl": "https://discord.com/api/webhooks/...",
"username": "Larry Marketing Bot"
},
"tiktok": {
"username": "your_handle",
"profileUrl": "https://www.tiktok.com/@your_handle",
"secUid": "",
"region": "US",
"language": "en"
},
"revenuecat": {
"enabled": false,
"v2SecretKey": "sk_...",
"projectId": "proj..."
},
"posting": {
"schedule": ["07:30", "16:30", "21:00"],
"manualPostingNotes": "Slides are delivered to Discord as image files. You post manually to TikTok."
},
"competitors": "tiktok-marketing/competitor-research.json",
"strategy": "tiktok-marketing/strategy.json"
}Full documentation captured from public sources, including the complete README when available.
Docs source
GITHUB OPENCLEW
Editorial quality
ready
Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user mentions TikTok growth, slideshow ads, or social media marketing for their app. Covers competitor research (browser-based), image generation, text overlays, Discord delivery, analytics tracking, hook testing, CTA optimization, conversion tracking with RevenueCat, and a full feedback loop that adjusts hooks and CTAs based on momentum vs conversions. --- name: tiktok-app-marketing description: Automate TikTok slideshow marketing for any app or product. Researches competitors, generates AI images, adds text overlays, delivers finished slides via Discord, tracks profile-level analytics, and iterates on what works. Use when setting up TikTok marketing automation, creating slideshow posts, analyzing post performance, optimizing app marketing funnels, or when a user m
Automate your entire TikTok slideshow marketing pipeline: generate → overlay → post → track → iterate.
Proven results: 7 million views on the viral X article, 1M+ TikTok views, $670/month MRR — all from an AI agent running on an old gaming PC.
This skill does NOT bundle any dependencies. Your AI agent will need to research and install the following based on your setup. Tell your agent what you're working with and it will figure out the rest.
npm install canvas) — used for adding text overlays to slide images. This is a native module that may need build tools (Python, make, C++ compiler) on some systems. Your agent should research the install requirements for your OS.You choose what generates your images. Your agent should research the API docs for whichever you pick:
gpt-image-1.5 (ALWAYS 1.5, never 1). Needs an OpenAI API key. Best for realistic photo-style images. This is what Larry uses and what we strongly recommend.clawhub install revenuecat) for full API access to subscribers, MRR, trials, churn, and revenue. There's also a RevenueCat MCP for programmatic control over products and offerings from your agent/IDE.Manual cross-posting to Instagram Reels, YouTube Shorts, Threads, Facebook, LinkedIn, and other platforms is still recommended. Same content, different algorithms, more reach.
When this skill is first loaded, IMMEDIATELY start a conversation with the user. Don't dump a checklist — talk to them like a human marketing partner would. The flow below is a guide, not a script. Be natural. Ask one or two things at a time. React to what they say. Build on their answers.
Important: Use scripts/onboarding.js --validate at the end to confirm the config is complete.
Before anything else, check if the user already has a TikTok account with posting history. If they're creating a fresh account, they MUST warm it up first or TikTok will treat them like a bot and throttle their reach from day one.
Explain this naturally:
"Quick question before we dive in — do you already have a TikTok account you've been using, or are we starting fresh? If it's new, we need to warm it up first. TikTok's algorithm watches how new accounts behave, and if you go straight from creating an account to posting AI slideshows, it flags you as a bot and kills your reach."
If the account is new or barely used, walk them through this:
The goal is to use TikTok like a normal person for 7-14 days before posting anything. Spend 30-60 minutes a day on the app:
The signal to look for: When they open TikTok and almost every video on their For You page is in their niche, the account is warmed up. The algorithm understands them. NOW they can start posting.
Tell the user: "I know two weeks feels like wasted time, but accounts that skip warmup consistently get 80-90% less reach on their first posts. Do the warmup. It's the difference between your first post getting 200 views and 20,000."
If the account is already active and established, skip this entirely and move to Phase 1.
Start casual. Something like:
"Hey! Let's get your TikTok marketing set up. First — tell me about your app. What's it called, what does it do?"
Then FOLLOW UP based on what they say. Don't ask all 9 questions at once. Pull the thread:
Don't ask for "brand guidelines" robotically. Instead: "Do you have any existing content or a vibe you're going for? Or are we starting fresh?"
Then ask about their app and monetization:
"Is this a mobile app? And do you use RevenueCat (or any subscription/in-app purchase system) to handle payments?"
This is critical because it determines whether we can close the full feedback loop. If they have a mobile app with RevenueCat:
clawhub install revenuecat). It gives full API access to subscribers, MRR, trials, churn, revenue, and transactions. Don't auto-install — just let them know it exists and what it unlocks, and they can install it if they want.If they don't use RevenueCat but have another subscription system, note it and work with what's available. If it's not a mobile app (e.g. physical product, SaaS, service), skip RevenueCat but still track whatever conversion metric they have (website signups, purchases, leads).
Store everything in tiktok-marketing/app-profile.json.
Before building any content strategy, research what competitors are doing on TikTok. This is critical — you need to know the landscape.
Ask the user:
"Before we start creating content, I want to research what your competitors are doing on TikTok — what's getting views in your niche, what hooks they're using, what's working and what's not. Can I use the browser to look around TikTok and the App Store?"
Wait for permission. Then:
tiktok-marketing/competitor-research.json:{
"researchDate": "2026-02-16",
"competitors": [
{
"name": "CompetitorApp",
"tiktokHandle": "@competitor",
"followers": 50000,
"topHooks": ["hook 1", "hook 2"],
"avgViews": 15000,
"bestVideo": { "views": 500000, "hook": "..." },
"format": "before-after slideshows",
"postingFrequency": "daily",
"cta": "link in bio",
"notes": "Strong at X, weak at Y"
}
],
"nicheInsights": {
"trendingSounds": [],
"commonFormats": [],
"gapOpportunities": "What competitors AREN'T doing that we could",
"avoidPatterns": "What's clearly not working"
}
}
"So I looked at what's out there. [Competitor A] is doing well with [format] — their best post got [X] views using [hook type]. But I noticed nobody's really doing [gap]. That's our angle."
This research directly informs hook generation and content strategy. Reference it when creating posts.
First, ask about format:
"Do you want to do slideshows (photo carousels) or video? Slideshows are what Larry uses and what this skill is built around — TikTok's data shows they get 2.9x more comments and 2.6x more shares than video, and they're much easier for AI to generate consistently. That said, if you want to try video, the skill supports it but it hasn't been battle-tested like slideshows have. Your call."
Store their choice as format: "slideshow" or format: "video" in config. If they pick video, note that the text overlay, 6-slide structure, and prompt templates are designed for slideshows. Video will require more experimentation and the agent should be upfront about that.
For slideshows (recommended):
Ask naturally:
"For the slideshows, we need images. I'd strongly recommend OpenAI's gpt-image-1.5 — it's what Larry uses and it produces images that genuinely look like someone took them on their phone. It's the difference between 'obviously AI' and 'wait, is that real?' You can also use Stability AI, Replicate, or bring your own images if you prefer."
⚠️ If they pick OpenAI, make sure the model is set to gpt-image-1.5 — NEVER gpt-image-1. The difference in quality is massive. gpt-image-1 produces noticeably AI-looking images that people scroll past. gpt-image-1.5 produces photorealistic results that stop the scroll. This one setting can be the difference between 1K and 100K views.
If they're unsure, always recommend gpt-image-1.5. It's the proven choice.
Store in config as imageGen with provider, apiKey, and model.
If they pick OpenAI, mention the Batch API:
"One thing worth knowing — OpenAI has a Batch API that's 50% cheaper than real-time generation. Instead of generating slides on the spot, you submit them as a batch job and get results within 24 hours (usually much faster). It's perfect for pre-generating tomorrow's slides overnight. Same quality, half the cost. Want me to set that up?"
If they're interested, store "useBatchAPI": true in imageGen config. The generate script supports both modes — real-time for quick iterations, batch for scheduled daily content.
Then — and this is critical — work through the image style with them. Don't just use a generic prompt. Bad images = nobody watches. Ask these naturally, one or two at a time:
"Now let's figure out what these images should actually look like. Do you want them to look like real photos someone took on their phone, or more like polished graphics or illustrations?"
Then based on their answer, dig deeper:
Build the base prompt WITH them. A good base prompt looks like:
iPhone photo of a [specific room/scene], [specific style], [specific details].
Realistic lighting, natural colors, taken on iPhone 15 Pro.
No text, no watermarks, no logos.
[Consistency anchors: "same window on left wall", "same grey sofa", "wooden coffee table in center"]
Save the agreed prompt style to config as imageGen.basePrompt so every future post uses it.
Key prompt rules (explain these as they come up, don't lecture):
NEVER use generic prompts like "a nice living room" or "a beautiful face" — they produce generic images that get scrolled past.
Discord is the delivery layer in this setup. Without it, distribution becomes messy and quality often drops.
This setup gives you:
This flow still feeds the daily feedback loop (see Phase 8), but analytics are now profile-level.
Frame it naturally to the user:
"So here's the key piece — we use Discord for delivery. I send you the finished slide files, then you post manually to TikTok with a trending sound. That gives us better quality control and avoids API brittleness."
"This is free and open source. We keep the workflow lightweight: generate, deliver, post, analyze, iterate."
Walk them through connecting step by step:
discord.webhookUrl to configscripts/send-to-discord.jsExplain the publish workflow:
"One important thing — delivery is automatic, publishing is manual. Before you publish each post on TikTok, add a trending sound from TikTok's sound library. Music is one of the biggest reach levers."
Don't move on until Discord delivery works end-to-end.
If they have a mobile app with RevenueCat (you should already know this from Phase 1), this is where the skill goes from "content automation" to "intelligent marketing system." This is the most important integration in the entire skill. Don't treat it as optional.
Explain WHY it matters:
"So right now, we can track profile momentum — follower growth, total likes growth, and video count changes. That's top-of-funnel direction. But momentum alone doesn't pay the bills."
"This is where RevenueCat comes in. It tracks your subscribers, trials, MRR, churn — the actual revenue. When I combine TikTok momentum signals with conversion data from RevenueCat, I can make genuinely intelligent decisions:"
"If momentum spikes but conversions stay flat, the hook works but CTA/funnel needs work. If momentum is modest but subscribers rise, content quality is strong and we should scale similar angles."
"Without RevenueCat, I'm optimizing for vanity metrics. With it, I'm optimizing for revenue."
Walk them through setup step by step:
Install the RevenueCat skill from ClaWHub:
clawhub install revenuecat
This installs the revenuecat skill (v1.0.2+) which gives full API access to your RevenueCat project — metrics overview, customers, subscriptions, offerings, entitlements, transactions, and more. It includes reference docs for every API endpoint and a helper script (scripts/rc-api.sh) for direct API calls.
Get your V2 secret API key from the RevenueCat dashboard:
sk_)Set the environment variable:
export RC_API_KEY=sk_your_key_here
Verify it works: Run ./skills/revenuecat/scripts/rc-api.sh /projects — should return your project details.
Optional: RevenueCat MCP — for programmatic control over products, offerings, and entitlements from your agent or IDE. Ask your agent to research setting this up.
What RevenueCat gives the daily report:
GET /projects/{id}/metrics/overview → MRR, active subscribers, active trials, churn rateGET /projects/{id}/transactions → individual purchases with timestamps (for conversion attribution)The intelligence this unlocks:
Without RevenueCat: The loop still works on profile analytics (follower/like/video deltas). You can optimize for momentum. But you're flying blind on revenue.
With RevenueCat: You optimize for actual paying users. You can tell the difference between a viral post that makes nothing and a quiet post that drives $50 in subscriptions. This is the entire point of the feedback loop. Every decision the daily report makes is better with RevenueCat data.
If they don't use RevenueCat or don't have subscriptions, the skill still works but the feedback loop is limited to profile-level optimization only.
Using the competitor research AND the app profile, build an initial content strategy:
"Based on what I found and what your app does, here's my plan for the first week..."
Present:
Save the strategy to tiktok-marketing/strategy.json.
This is what makes the whole system self-improving. Set up a daily cron job that:
scripts/scrape-tiktok-analytics.js)Explain to the user:
"I'm going to set up a daily check that runs every morning. It logs your TikTok profile momentum over the last few days and, if RevenueCat is connected, compares that with actual conversions. Then it tells you exactly what's working and what to change."
"Because this is profile-level analytics, attribution is directional. We use consistent daily snapshots and compare 3-7 day windows."
Set up the cron:
Use the agent's cron system to schedule a daily analytics job. Run it every morning before the first post of the day (e.g. 7:00 AM in the user's timezone) so the report informs that day's content:
Schedule: daily at 07:00 (user's timezone)
Task: Run scripts/daily-report.js --config tiktok-marketing/config.json --days 3
Output: tiktok-marketing/reports/YYYY-MM-DD.md + message to user with summary
The daily report uses the diagnostic framework:
This is the intelligence layer. Without it, you're just posting and hoping. With it, every day's content is informed by data.
Store everything in tiktok-marketing/config.json (this is the source of truth for the entire pipeline):
{
"app": {
"name": "AppName",
"description": "Detailed description",
"audience": "Target demographic",
"problem": "Pain point it solves",
"differentiator": "What makes it unique",
"appStoreUrl": "https://...",
"category": "home|beauty|fitness|productivity|food|other",
"isMobileApp": true
},
"imageGen": {
"provider": "openai",
"apiKey": "sk-...",
"model": "gpt-image-1.5"
},
"discord": {
"webhookUrl": "https://discord.com/api/webhooks/...",
"username": "Larry Marketing Bot"
},
"tiktok": {
"username": "your_handle",
"profileUrl": "https://www.tiktok.com/@your_handle",
"secUid": "",
"region": "US",
"language": "en"
},
"revenuecat": {
"enabled": false,
"v2SecretKey": "sk_...",
"projectId": "proj..."
},
"posting": {
"schedule": ["07:30", "16:30", "21:00"],
"manualPostingNotes": "Slides are delivered to Discord as image files. You post manually to TikTok."
},
"competitors": "tiktok-marketing/competitor-research.json",
"strategy": "tiktok-marketing/strategy.json"
}
Then generate the first test slideshow — but set expectations:
"Let's create our first slideshow. This is a TEST — we're dialing in the image style, not posting yet. I'll generate 6 slides and we'll look at them together. If the images look off, we tweak the prompts and try again. The goal is to get the look nailed down BEFORE we start posting."
⚠️ THE REFINEMENT PROCESS IS PART OF THE SKILL:
Getting the images right takes iteration. This is normal and expected. Walk the user through it:
Things to watch for and ask about:
You do NOT have to post anything you don't like. The first few generations are purely for refining the prompt. Only start posting once the images consistently look good. The agent learns from each round — what works, what doesn't, what to emphasise in the prompt.
Once the style is locked in, THEN use the hook strategy from competitor research and their category (see references/slide-structure.md) and start the posting schedule.
Use scripts/generate-slides.js:
node scripts/generate-slides.js --config tiktok-marketing/config.json --output tiktok-marketing/posts/YYYY-MM-DD-HHmm/ --prompts prompts.json
The script auto-routes to the correct provider based on config.imageGen.provider. Supports OpenAI, Stability AI, Replicate, or local images.
⚠️ Timeout warning: Generating 6 images takes 3-9 minutes total (30-90 seconds each for gpt-image-1.5). Set your exec timeout to at least 600 seconds (10 minutes). If you get spawnSync ETIMEDOUT, the exec timeout is too short. The script supports resume — if it fails partway, re-run it and completed slides will be skipped.
Critical image rules (all providers):
This step uses node-canvas to render text directly onto your slide images. This is how Larry produces slides that have hit 1M+ views on TikTok — the text sizing, positioning, and styling are dialled in from hundreds of posts.
Before you can add text overlays, your human needs to install node-canvas. Prompt them:
"To add text overlays to the slides, I need a library called node-canvas. It renders text directly onto images with full control over sizing, positioning, and styling — this is what Larry uses for his viral TikTok slides.
Can you run this in your terminal?"
npm install canvas"If that fails, it's because node-canvas needs some system libraries. Here's what to install first:"
macOS:
brew install pkg-config cairo pango libpng jpeg giflib librsvg npm install canvasUbuntu/Debian:
sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev npm install canvasWindows:
# node-canvas auto-downloads prebuilt binaries on Windows npm install canvas"Once installed, I can handle everything else — generating the overlays, sizing the text, positioning it perfectly. You won't need to touch this again."
Don't skip this step. Without node-canvas, the text overlays won't work. If installation fails, help them troubleshoot — it's usually a missing system library. Once it's installed once, it stays.
Exact code Larry uses:
const { createCanvas, loadImage } = require('canvas');
const fs = require('fs');
async function addOverlay(imagePath, text, outputPath) {
const img = await loadImage(imagePath);
const canvas = createCanvas(img.width, img.height);
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
// ─── Adjust font size based on text length ───
const wordCount = text.split(/\s+/).length;
let fontSizePercent;
if (wordCount <= 5) fontSizePercent = 0.075; // Short: 75px on 1024w
else if (wordCount <= 12) fontSizePercent = 0.065; // Medium: 66px
else fontSizePercent = 0.050; // Long: 51px
const fontSize = Math.round(img.width * fontSizePercent);
const outlineWidth = Math.round(fontSize * 0.15);
const maxWidth = img.width * 0.75;
const lineHeight = fontSize * 1.3;
ctx.font = `bold ${fontSize}px Arial`;
ctx.textAlign = 'center';
ctx.textBaseline = 'top';
// ─── Word wrap ───
const lines = [];
const manualLines = text.split('\n');
for (const ml of manualLines) {
const words = ml.trim().split(/\s+/);
let current = '';
for (const word of words) {
const test = current ? `${current} ${word}` : word;
if (ctx.measureText(test).width <= maxWidth) {
current = test;
} else {
if (current) lines.push(current);
current = word;
}
}
if (current) lines.push(current);
}
// ─── Position: centered at ~28% from top ───
const totalHeight = lines.length * lineHeight;
const startY = (img.height * 0.28) - (totalHeight / 2);
const x = img.width / 2;
// ─── Draw each line ───
for (let i = 0; i < lines.length; i++) {
const y = startY + (i * lineHeight);
// Black outline
ctx.strokeStyle = '#000000';
ctx.lineWidth = outlineWidth;
ctx.lineJoin = 'round';
ctx.miterLimit = 2;
ctx.strokeText(lines[i], x, y);
// White fill
ctx.fillStyle = '#FFFFFF';
ctx.fillText(lines[i], x, y);
}
fs.writeFileSync(outputPath, canvas.toBuffer('image/png'));
}
Key details that make Larry's slides look professional:
\n breaks but also auto-wraps lines that exceed 75% width. No squashing.\n in your text for control. Keep lines to 4-6 words.Text content rules:
The difference between OK slides and viral slides is in these details. Larry's slides consistently hit 50K-150K+ views because the text is sized right, positioned right, and readable at a glance while scrolling.
⚠️ LINE BREAKS ARE CRITICAL — Read This:
The texts.json file must contain text with \n line breaks to control where lines wrap. If you pass a single long string without line breaks, the script will auto-wrap, but manual breaks look much better because you control the rhythm.
Good (manual breaks, 4-6 words per line):
[
"I showed my landlord\nwhat AI thinks our\nkitchen should look like",
"She said you can't\nchange anything\nchallenge accepted",
"So I downloaded\nthis app and\ntook one photo",
"Wait... is this\nactually the same\nkitchen??",
"Okay I'm literally\nobsessed with\nthis one",
"Snugly showed me\nwhat's possible\nlink in bio"
]
Bad (no breaks — will auto-wrap but looks worse):
[
"I showed my landlord what AI thinks our kitchen should look like",
...
]
Rules for writing overlay text:
\n to break lines — gives you control over the rhythmThe script auto-wraps any line that exceeds 75% width as a safety net, but always prefer manual \n breaks for the best visual result.
Use scripts/send-to-discord.js:
node scripts/send-to-discord.js --config tiktok-marketing/config.json --dir tiktok-marketing/posts/YYYY-MM-DD-HHmm/ --caption "caption" --title "title"
Slides are delivered automatically, but TikTok publishing is manual. This is intentional and critical:
This is still the workflow that helped us hit 1M+ TikTok views and $670/month MRR. Don't skip the music step.
Tell the user during onboarding: "Slides land in Discord as image files. Before publishing on TikTok, add a trending sound — it makes a massive reach difference."
Cross-posts to other platforms (Instagram, YouTube, etc.) are manual in this setup.
Caption rules: Long storytelling captions (3x more views). Structure: Hook → Problem → Discovery → What it does → Result → max 5 hashtags. Conversational tone.
After publishing, analytics are collected at profile level (not exact per-post metrics).
Run daily collector:
node scripts/scrape-tiktok-analytics.js --config tiktok-marketing/config.json
Inspect trend window:
node scripts/check-analytics.js --config tiktok-marketing/config.json --days 3
Generate daily report:
node scripts/daily-report.js --config tiktok-marketing/config.json --days 3
What gets tracked daily:
followerCountfollowingCountheartCount (total profile likes)videoCountThis setup intentionally avoids fragile per-video API coupling. That means attribution is directional, not exact:
Best practice:
See references/analytics-loop.md for full analytics loop docs.
This is what separates "posting TikToks" from "running a marketing machine." The daily cron pulls data from two sources:
Combined, the agent can make intelligent decisions about what to do next — not guessing, not vibes, actual data-driven optimization.
Every morning before the first post, the cron runs the analytics scripts:
tiktok-marketing/reports/YYYY-MM-DD.md with findingsThis is the core intelligence. Two axes: momentum (are people discovering/responding?) and conversions (are people paying?).
High momentum + High conversions → 🟢 SCALE IT
High momentum + Low conversions → 🟡 FIX THE CTA
Low momentum + High conversions → 🟡 FIX THE HOOKS
Low momentum + Low conversions → 🔴 FULL RESET
High momentum + High downloads + Low paying subscribers → 🔴 APP ISSUE
High momentum + Low downloads → 🟡 CTA ISSUE
The daily report automates all of this. It cross-references TikTok profile momentum with downloads and revenue (RevenueCat) and tells you which part of the funnel is likely broken. It also auto-generates new hook suggestions based on your winning patterns and flags when CTAs need rotating.
Track in tiktok-marketing/hook-performance.json:
{
"hooks": [
{
"postRef": "2026-02-15-0730-bedroom-v1",
"text": "My boyfriend said our flat looks like a catalogue",
"app": "snugly",
"date": "2026-02-15",
"followerDelta": 38,
"heartDelta": 4600,
"videoDelta": 1,
"conversions": 4,
"cta": "Download Snugly — link in bio",
"lastChecked": "2026-02-16"
}
],
"ctas": [
{
"text": "Download [App] — link in bio",
"timesUsed": 5,
"totalFollowerDelta": 110,
"totalHeartDelta": 9200,
"totalConversions": 8,
"conversionRate": 0.067
},
{
"text": "Search [App] on the App Store",
"timesUsed": 3,
"totalFollowerDelta": 62,
"totalHeartDelta": 5100,
"totalConversions": 12,
"conversionRate": 0.141
}
],
"rules": {
"doubleDown": ["person-conflict-ai"],
"testing": ["listicle", "pov-format"],
"dropped": ["self-complaint", "price-comparison"]
}
}
The daily report updates this automatically. Each post gets tagged with its hook text, CTA, profile deltas, and attributed conversions. Over time, this builds a clear picture of which hook + CTA combinations actually drive revenue.
CTA rotation: When the report detects high momentum but low conversions, it automatically recommends rotating to a different CTA and tracks performance of each CTA separately. The agent should tag every post with the CTA used so the data accumulates.
Decision rules:
When momentum is good but conversions are low, cycle through CTAs:
Track which CTAs convert best per hook category.
Optimal times (adjust for audience timezone):
3x/day minimum. Consistency beats sporadic viral hits. 100 posts beats 1 viral.
Manual cross-posting of the same content to multiple platforms is still recommended:
Same slides, different algorithms, more surface area. Each platform's algo evaluates content independently.
See references/app-categories.md for category-specific slide prompts and hook formulas.
| Mistake | Fix |
|---------|-----|
| 1536x1024 (landscape) | Use 1024x1536 (portrait) |
| Font at 5% | Use 6.5% of width |
| Text at bottom | Position at 30% from top |
| Different rooms per slide | Lock architecture in EVERY prompt |
| Labels not reactions | "Wait this is nice??" not "Modern style" |
| Only tracking growth surface metrics | Compare profile momentum with conversions — growth without revenue can be vanity |
| Same hooks forever | Iterate based on data, test new formats weekly |
| No cross-posting | Reuse the same slide pack manually on 2-3 platforms |
| Posting without trend audio | Add sound manually before publish |
| Expecting exact per-video attribution | This flow is profile-level; use directional diagnosis across 3-7 day windows |
| spawnSync ETIMEDOUT | Exec timeout too short — image gen takes 3-9 min for 6 slides. Use a 10-minute timeout or generate slides one at a time |
Machine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
missing
Auth
None
Streaming
No
Data region
Unspecified
Protocol support
Requires: none
Forbidden: none
Guardrails
Operational confidence: low
curl -s "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/snapshot"
curl -s "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/contract"
curl -s "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Do not use if
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
83
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
80
A Model Context Protocol (MCP) server for GitLab
Traction
No public download signal
Freshness
Updated 2d ago
Rank
74
Expose OpenAPI definition endpoints as MCP tools using the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Rank
72
An actix_web backend for the official Rust SDK for the Model Context Protocol (https://github.com/modelcontextprotocol/rust-sdk)
Traction
No public download signal
Freshness
Updated 2d ago
Contract JSON
{
"contractStatus": "missing",
"authModes": [],
"requires": [],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": null,
"outputSchemaRef": null,
"dataRegion": null,
"contractUpdatedAt": null,
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"MCP"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_OPENCLEW",
"generatedAt": "2026-04-17T02:35:36.230Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "MCP",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
},
{
"key": "distinguish",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "start",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "you",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "close",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "install",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "only",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "i",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "also",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "be",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "track",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "make",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "optimize",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "tell",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "add",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "handle",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "preview",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "it",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "both",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "openai",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
},
{
"key": "resume",
"type": "capability",
"support": "supported",
"confidenceSource": "profile",
"notes": "Declared in agent profile metadata"
}
],
"flattenedTokens": "protocol:MCP|unknown|profile capability:distinguish|supported|profile capability:start|supported|profile capability:you|supported|profile capability:close|supported|profile capability:install|supported|profile capability:only|supported|profile capability:i|supported|profile capability:also|supported|profile capability:be|supported|profile capability:track|supported|profile capability:make|supported|profile capability:optimize|supported|profile capability:tell|supported|profile capability:add|supported|profile capability:handle|supported|profile capability:preview|supported|profile capability:it|supported|profile capability:both|supported|profile capability:openai|supported|profile capability:resume|supported|profile"
}Facts JSON
[
{
"factKey": "docs_crawl",
"category": "integration",
"label": "Crawlable docs",
"value": "6 indexed pages on the official domain",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
},
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Wotaso",
"href": "https://github.com/Wotaso/LarryNoPostiz",
"sourceUrl": "https://github.com/Wotaso/LarryNoPostiz",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-02-25T01:46:52.622Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "MCP",
"href": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-02-25T01:46:52.622Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/wotaso-larrynopostiz/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "docs_update",
"title": "Docs refreshed: Sign in to GitHub · GitHub",
"description": "Fresh crawlable documentation was indexed for the official domain.",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
}
]Sponsored
Ads related to tiktok-app-marketing and adjacent AI workflows.