Pick "Controversial." Three of your five captions don't change.
Type "morning routine" into the AI TikTok Caption Generator, set vibe to Educational, hit Generate. You get five captions: Hook-based, Trend Format, CTA, Emoji-heavy, Minimalist. Switch to Controversial and Generate again. The Hook and Trend rewrite — "Controversial opinion: morning routine is overrated. Fight me." The other three come back byte-identical. The vibe picker, which looks like the main control, drives two of five outputs. The rest are vibe-blind.
The thing to understand: it's five deterministic templates with topic fills, and the vibe selector only threads into the two that vary. The "AI" framing and the 500 ms spinner oversell string slicing and a lookup table — no model, no randomness.
Five templates, fully deterministic
generateCaptions returns the same five structures every run, in the same order, with the same labels. The variation comes from your topic string and — for two of the five — the vibe. There's no random selection: hashStr(topic + vibe) is computed into a seed that is never read; si() next to it is dead code. Same topic + same vibe produces byte-identical output every click. There's no Regenerate button, and Generate doesn't reshuffle — nothing to reshuffle.
| # | Style | Vibe-aware? | Shape |
|---|---|---|---|
| 1 | Hook-based | yes | POV: You just discovered {topic}… 😭 (varies by vibe) |
| 2 | Trend Format | yes | Tell me you [X] {topic} without telling me… (varies by vibe) |
| 3 | CTA | no | Follow for more {topic} content — new videos every week! 📲 |
| 4 | Emoji-heavy | no | 🔥 {topic} 🔥 — This literally changed my life. 💯 Save this! 📌 |
| 5 | Minimalist | no | {topic}. That's it. That's the post. |
The CTA, Emoji-heavy, and Minimalist are single strings hardcoded in the return — they don't read the vibe variable. A "satisfying" video and a "controversial" video get the same CTA. If the CTA must match the tone, rewrite it; the tool won't.
Topic slicing cuts mid-word
The templates use short = topic.slice(0, 30) + '...' when the topic exceeds 30 characters, and topic.slice(0, 40) / topic.slice(0, 60) for the Emoji-heavy and Minimalist. None slice on word boundaries. A 45-char topic becomes a really long topic about morn... in the Hook — mid-word, then an ellipsis. The Minimalist uses slice(0, 60) with no ellipsis — ...and productiv. That's it. "productiv" cut mid-word, then a period. The Trend Format inserts {short} twice — double ellipsis, mid-sentence. The fix is upstream: keep topics under 30 chars, or end on a word boundary. The tool won't clean up a bad cut.
The 150 badge is always green
Each caption shows a {charCount}/150 badge — green at ≤150, yellow above. The FAQ frames 150 as the limit. Two problems:
- 150 is a display truncation, not a post limit. TikTok accepts captions up to 2,200 characters; the first ~150 show in-feed before "more." A 200-char caption still posts — it just gets cut in the feed preview. The badge implies a hard ceiling; it's a soft target.
- The built-in templates can't exceed 150. They're pre-truncated (short ≤33, Emoji ≤40, Minimalist ≤60), so the longest output is ~130 chars. The yellow warning is unreachable unless you hand-edit. The badge is decorative for generated output. (Emojis count as 2 UTF-16 code units each in
.length.)
Hashtags are vibe-locked and topic-agnostic
The 15 hashtags are HASHTAGS_BY_VIBE[vibe] — a fixed array per vibe, same order, every time. Your topic never enters hashtag selection. A "quantum physics" educational video and a "sourdough starter" educational video get the identical 15 — topic-agnostic.
Three consequences:
#fypand#foryouare in every vibe. Both appear in all five arrays — the most-used tags on TikTok, near-zero discriminative value. The algorithm treats them as noise.- 15 is a lot. TikTok recommends 3–5 relevant hashtags. 15 risks looking spammy, and the more generic tags you stack, the less the algorithm can categorize the video.
- Hashtags count toward your caption budget — the tool doesn't recount. On TikTok, hashtags are part of the caption text. 15 tags × ~10 chars = ~150 chars of tags alone, which would blow past the 150-char display budget. But the caption badge and the hashtag panel are separate; the tool never adds hashtags to the caption and recomputes. Paste caption and 15 hashtags into TikTok and you're well over 150 — no warning.
Gotchas
- No Regenerate, and no point to one. Output is deterministic — same topic + vibe = identical captions every click. To get variation, change the topic or the vibe (only Hook/Trend change).
- No persistence. No history, no favorites, no saved sessions. Copy anything you want to keep; refresh clears everything.
- The vibe picker oversells its reach. It looks like the primary control, but only affects 2 of 5 captions.
Summary
- The generator is five deterministic templates — no model, no randomness (the seed is dead code). Same topic + vibe produces byte-identical output every click; no Regenerate because there's nothing to reshuffle.
- The vibe picker only affects the Hook and Trend styles; CTA, Emoji-heavy, and Minimalist are hardcoded and vibe-blind. A "controversial" video gets the same CTA as a "satisfying" one.
- Topic slicing cuts mid-word —
morn...,productiv. That's it.Keep topics under 30 chars or end on a word boundary. - The 150-char badge is always green for built-in templates (pre-truncated below 150), and 150 is a display truncation point, not a post limit (TikTok accepts 2,200).
- 15 hashtags are vibe-locked and topic-agnostic —
#fypand#foryouin every set, your topic never enters selection, and the tool doesn't recount the caption budget when you paste them in. - Generate with the TikTok Caption Generator. For other platforms: YouTube descriptions, YouTube titles, email subject lines. For a different shape: slogan generator.