How I gained 1000 followers in a week with two vibe-coded scripts and Loopi.
More videos, less time. That's the only goal of this loop. Two short Python scripts handle the boring parts — beaming raw clips off my phone, cutting them, burning captions for sound-off viewers — and Loopi schedules everything twice a day across TikTok, Instagram Reels, and YouTube Shorts. I gained 1000 followers in seven days running it on authentic content in my tech niche. The prompts that built each tool are below — copy them into Claude and you'll have the whole loop running by the end of the afternoon.
You can hand this page to your AI agent. Copy the URL — https://loopi.social/playbooks/vibe-coded-scripts-and-loopi — paste it into Claude with Loopi connected, and say "Read this Loopi playbook and set it up for me." The agent vibe-codes both scripts and wires the scheduling step. You bring the clips.
Is it worth the effort? Two prompts build the scripts once; after that it's about 90 minutes a week to ship 14 videos across three platforms. The cadence is what compounds — this loop is how a week of consistent posting becomes +1,000 followers instead of three posts and a shrug.
The play
Record raw talking-head clips on your phone in the morning. Beam them to your laptop. The cut + caption script does its thing while you grab coffee. Hand the finished MP4s to Loopi. Loopi schedules two posts a day across every platform for the next week. Four steps. About 90 minutes a week, end-to-end.
Record clips on phone
5-15 raw talking-head takes
→
Beam to laptop (transfer.py)
Local WiFi — no iCloud round-trip
→
Auto-cut + caption (Python)
Concat, trim dead space, burn captions
→
Loopi schedules everything
Twice-daily across TikTok / Reels / Shorts
The pipeline. Two scripts you'll vibe-code in one afternoon, plus Loopi for the platform-side scheduling.
Why this is new. Each of these tools used to be a multi-day build sold as SaaS for $20/month. With vibe coding, the file transfer is a 60-second one-shot prompt and the cut+caption pipeline is one prompt and maybe one round of revisions. You're not buying single-purpose tools anymore — you describe the tool you need and Claude writes it.
Tool 1 — Phone to laptop, no iCloud
iCloud Photos sync can lag up to an hour behind, which drags productivity when you're moving 20+ raw clips. A LAN transfer is instant: your phone uploads directly to your laptop over the WiFi network you're already on. transfer.py serves a self-contained web page over your local network; you scan the printed QR code from your phone, drop files into the page, and they land in ./received/ next to the script. No cloud round-trip, no sync delay, no "upload to iCloud" wait.
zsh — transfer.py
$ python3 transfer.py
┌──────────────────────────┐
│ http://192.168.1.42:8080 │
└──────────────────────────┘
####### # ###
# # ## ##
# ### # # ###
# ### # ## # #
# ### # # # ##
# # ## #
####### # # # #
#
####### ## # #
# # # ## #
# ### # # # ###
# ### # ## ## #
####### # # ###
Ready to receive files▍
📱iPhone · Camera
9:41
Point at the QR
transfer.py
Drop files to send
+ Tap to pick files
IMG_0421.mp4112 MB
📁./received/
🎬IMG_0421.mp4112 MB
🎬IMG_0422.mp489 MB
🎬IMG_0423.mp4143 MB
Server prints a URL + QR code → scan from your phone → web app opens → tap to pick clips → files land in ./received/ next to the script.
Paste this prompt into Claude (Desktop, Code, or claude.ai) and accept what it writes. Run python3 transfer.py, scan the QR code, drop your clips in.
prompt — vibe-code transfer.py
Write a single Python file transfer.py — a local WiFi file transfer server (desktop ↔ phone on same network).
Run: python3 transfer.py [port] (default 8080). Detect LAN IP via UDP socket to 8.8.8.8:80 (fallback 127.0.0.1). On startup, print the URL in an ASCII box and a terminal QR code (qrcode lib, inverted ASCII). Gracefully exit with install hints if flask or qrcode are missing.
Server: Flask, host=0.0.0.0, threaded, MAX_CONTENT_LENGTH=4GB. Auto-create ./received/ (uploads) and ./shared/ (downloads) next to the script.
Routes:
- GET / — serve a single self-contained HTML page (inline string).
- POST /upload — accept multiple files (request.files.getlist("files")), sanitize names with werkzeug.secure_filename, append _1, _2... on collision, return {"saved":[...]}.
- GET /files — JSON list of files in ./shared/ (skip dotfiles, sorted), each {name, size}.
- GET /download/<path:filename> — send as attachment; block path traversal by resolving and checking it stays inside SHARED_DIR; 403/404 as appropriate.
Frontend (inline, mobile-friendly dark theme):
- Two cards: Send (drop-zone + tap-to-pick <input type=file multiple>, drag-and-drop, upload queue with per-file progress bars using XMLHttpRequest progress events) and Browse (lists /files, each row has filename, human size, and a download button, plus a refresh button).
- JS helpers for human-readable sizes and emoji file icons by extension.
Keep it one file, no external assets.
Tool 2 — Cut and caption, automatically
85% of mobile short-form is watched with sound off — captions aren't optional. Dead space between sentences kills retention; tight cuts keep viewers past the algorithmic 3-second checkpoint. cut_and_caption.py handles both: it concatenates the raw clips, transcribes the merged cut with Whisper, and burns ASS subtitles on top using ffmpeg. One command, one MP4 out.
The script splits cut-building from caption-rendering, so you can re-tune caption position/size/opacity with --recaption without re-doing the merge or transcription. Useful when you're A/B-ing caption styles across a week.
prompt — vibe-code cut_and_caption.py
# Build: cut_and_caption.py — single-file Python CLI
Concatenates talking-head video clips from inputs/ into one cut, then burns captions onto it. Splits cut-building from caption-rendering so caption styling can be re-tuned without re-doing the merge + transcription.
## Dependencies
System:
ffmpeg, ffprobe (must be on PATH)
whisper CLI (`pip install openai-whisper`; uses GPU if available)
Python:
stdlib only — no API keys, no third-party Python deps beyond whisper.
## Layout (script creates dirs as needed)
inputs/ user drops clips here (and optional order.txt)
transcoded/ per-clip normalized h264 mp4 (cache)
intermediate/cut.mp4 merged cut, NO captions
intermediate/cut.transcript.json whisper segment-level transcript of cut.mp4
outputs/final.mp4 cut.mp4 with captions burned in
## CLI
python cut_and_caption.py # full run: build cut + caption
python cut_and_caption.py --recaption # only re-burn captions
--position {top,middle,bottom} default top
--margin INT default 400
--font-size INT default 42
--opacity FLOAT (0-1) default 0.3
## Pipeline
1. Discover clips. Look in inputs/ for *.{mp4,mov,mkv,avi,webm,m4v,mts,ts}. If inputs/order.txt exists, use it as the order (one filename per line; blank lines and `#` comments ignored; may be a subset to skip bad takes; error fast if it references a missing file). Otherwise sort by filename.
2. Transcode each clip → transcoded/{stem}.mp4 with libx264 -crf 18 -preset fast, **-g 1 (all-intra)** so concat-demux can stream-copy cleanly, aac 128k, +faststart. Skip if cached output exists.
3. Concat-demux all transcoded mp4s in order → intermediate/cut.mp4. Stream copy (no re-encode) since codecs match. Rebuild if cut.mp4 is missing or older than order.txt.
4. Transcribe intermediate/cut.mp4 with whisper CLI (model "medium", output_format json) → intermediate/cut.transcript.json. Segment-level is enough — captions don't need word timestamps. Skip if cached.
5. Caption: read cut.transcript.json segments, build an ASS subtitle file, burn it onto cut.mp4 with ffmpeg `-vf subtitles=...` -c:v libx264 -crf 20 -c:a copy -movflags +faststart → outputs/final.mp4.
## --recaption mode
Skips steps 1–4. Errors clearly if intermediate/cut.mp4 or cut.transcript.json is missing.
## Functions
get_dimensions(video) -> (w, h) # ffprobe
transcode(src, dst) # ffmpeg normalize
resolve_order() -> list[Path] # order.txt or filename sort
concat(clips, dst) # ffmpeg concat-demux
transcribe(video, dst_json) # whisper CLI
build_ass(segments, w, h, position, margin, font_size, opacity) -> str
burn_captions(video, ass_text, dst) # ffmpeg subtitles filter
build_cut() # steps 1–4
recaption(position, margin, font_size, opacity) # step 5
main() # argparse + orchestration
## ASS styling
Font Arial, font_size from CLI. Alignment 8/5/2 = top/middle/bottom. MarginV from CLI. Apply opacity to fill + outline alpha (alpha = round((1-opacity)*255) as 2-digit hex; ASS alpha is inverted — 00=opaque, FF=transparent). PlayResX/Y from ffprobe of cut.mp4.
## Constraints
Single file. No README, no extra docs, no comments beyond the module docstring. Cache by existence (and order.txt mtime for cut.mp4). Fail fast with readable errors when ffmpeg/whisper aren't on PATH or order.txt is malformed.
Drop your raw clips in inputs/, run python cut_and_caption.py, and a few minutes later outputs/final.mp4 is ready to post.
The scheduling step is where vibe coding stops paying off. Every platform has its own auth flow, its own rate limits, its own caption rules — TikTok wants the hook in the first two lines, Instagram wants line breaks, YouTube Shorts wants a searchable title. That's the part that's not a one-shot build. That's the part Loopi handles.
Hand your finished MP4s to Loopi through MCP. Your AI agent uploads each video, reads the transcripts Loopi generates automatically, composes platform-appropriate captions, and queues the schedule across every connected account.
What Loopi handles for you
Platform OAuth. Connect TikTok, Instagram, YouTube, LinkedIn, and Bluesky once in the app. Your agent reuses those connections forever — no per-script OAuth dance.
Per-platform caption shape. Your prompt says "TikTok hook in the first two lines, Instagram with line breaks, YouTube searchable title" — the agent composes each variant from the same transcript.
Scheduling + retries. Each post gets its own EventBridge timer. If a platform 5xx's, Loopi retries; if it permanently fails, the post lands in a retryable error state instead of disappearing.
Analytics rollup. One row per post per platform — views, likes, comments, and shares aggregated by video, so you can see which clip performed best across the week.
You provide
You get back
14 finished MP4s
Cut + caption output, ready to post
Cadence + tone brief
Twice daily, hook style per platform
Connected platforms
TikTok, Instagram, YouTube
→
AI agent
Claude via Loopi MCP
→
Captions per platform
Composed from transcript per your style brief
Proposed schedule for review
Per-platform captions + dates + times, before anything ships
Analytics rollup once live
Per-video views and engagement across platforms
Three inputs in, three outputs out. The agent handles the per-platform formatting, then waits for your green light before scheduling.
First time? Three quick setups before the prompt
Skip this section if you've already run Loopi before. If you're new, you need an account, your social platforms connected, and your AI agent connected to Loopi MCP — in that order.
1. Create your Loopi account. 60 seconds. Email + password.
2. Connect your social platforms. Inside the app, open the Content tab, expand the Profile setup panel, and scroll to Connected platforms. Click Connect on each platform you want to post to. Each one bounces you through that platform's OAuth screen once and then stays connected. Your agent reuses these connections on every schedule — no per-script OAuth dance.
loopi
Default ▾
Y
Profile setup
AI context · 3 platform(s) connected
▴
AI context
(brand voice, audience, posting style…)
Connected platforms
♪
TikTok
@yourstudio
Connected
▣
Instagram
@yourstudio
Connected
▶
YouTube
@yourstudio
Connected
in
LinkedIn
Not connected
Connect
Content tab → Profile setup → Connected platforms. Connect TikTok, Instagram, and YouTube once; the agent reuses each connection forever.
3. Connect Loopi MCP to your AI agent. Loopi works with any agent that speaks MCP — we'll use Claude Desktop here. Open Claude → Settings → Connectors → Add custom connector. Name it loopi and paste the URL https://api.loopi.social/mcp. Save. Claude prompts you to authorize in a browser; log in with your Loopi account and grant access. Then in Claude, say "connect to loopi mcp" and you're done.
Settings
General
Profile
Appearance
Customize
Models
Privacy
Connectors
+ Add custom connector
▣
Google Drive
Search and reference files
Connected
◆
GitHub
Repos, issues, PRs
Connected
✦
Notion
Pages and databases
Connected
Add custom connector
Custom connectors run on Claude. They aren't verified by Anthropic — only add servers you trust.
Name
loopi
Remote MCP server URL
https://api.loopi.social/mcp
Cancel
Add
Claude Desktop → Settings → Customize → Add custom connector. Name = loopi, URL = https://api.loopi.social/mcp.
4. Open Claude in the folder with your finished videos. In Claude Desktop, point the conversation at your project folder (or in Claude Code, cd into the folder with outputs/). Then paste the prompt:
prompt — schedule across platforms (review-first)
I just rendered 14 short-form videos to ./outputs/ — talking-head
clips, 30-60 seconds each, captions already burned in.
Schedule them across TikTok, Instagram Reels, and YouTube Shorts:
- Cadence: 2 posts a day for the next 7 days
- Times: 9 AM and 11 AM in America/New_York
- For each video, use Loopi's transcript to compose platform-
appropriate captions — TikTok with a hook in the first two lines
+ 3-5 hashtags; Instagram with line breaks and 5-8 tags; YouTube
Shorts with a searchable title and a 1-2 line description.
Upload everything in batches, then show me the full proposed
schedule — per-platform captions, dates, times — and wait for my
approval before you actually schedule any of it. I'll review and
either tell you to ship it or call out what to revise.
The agent uploads everything, drafts the captions per platform, and stops to show you the full proposed schedule. Read it. Ask for changes on the ones that don't land. When it looks right, tell it to ship — and the week is queued.
The numbers
Running this loop, posting twice a day for seven days straight: +1,000 followers across TikTok, Instagram Reels, and YouTube Shorts combined. Every video was authentic content in my own tech niche — no clickbait, no piggybacking trends I don't actually care about — so the followers are real leads who care about what I'm building, not random scroll-by traffic. Most of the gain came from one breakout video; the consistency is what gave it room to break. The cadence isn't optional — it's the table stakes.
Stop hand-scheduling. Vibe-code the boring parts once, run them every week.
The two scripts are one-shot prompts. The third step — multi-platform scheduling, captions, analytics — is what Loopi exists for. Connect your agent and start running it.