SSS

SSS turns a song and its lyrics into a TikTok-ready lyric video and queues it for posting. It scores a track for its strongest 30 to 60 seconds, times every lyric line to the audio, and renders a 1080x1920 video through ffmpeg in one of several looks. A FastAPI backend and a polling worker carry each song through those stages, and a Next.js panel is where you review, approve and reschedule. Most of the design effort went into making the worker safe to leave running unattended.

SSS mobile preview
SSS desktop preview

Product focus

What it does

A lyric-video studio with no editing timeline: the pipeline makes the creative calls, and the worker is built so a crash or a retry can't post anything twice.

Problem

What it solves

Making one lyric video by hand means finding the hook, syncing every line, styling it and exporting it, and posting on a schedule multiplies that by every song. Automating it creates a worse problem: a worker that crashes mid-render or retries a failed upload can render the same clip twice or post it twice.

Solution

How it works

Rendering and uploading run as leased jobs. A worker claims a job with a lease (10 minutes for renders, 5 for uploads), and an expired lease puts the job back in the queue and writes a lease_expired event, so a dead worker never strands a clip. Each render and upload carries an idempotency key built from the clip and job ids, so a retry can't create a second post. Uploads default to simulation, and the settings check refuses to start in production with simulation on. Posting goes through TikTok's official Content Posting API, with render bitrate capped and uploads sent in chunks. I chose that over browser automation because browser automation is fragile.

Developer notes

My read on it

This is the most backend-heavy thing I've built, and the part I enjoyed most wasn't the video. It was making the worker boring: leases so two loops never render the same clip, idempotency keys so a retry never double-posts, and an event log so I can answer what happened and why. I went with the official posting API over automating the TikTok site because I didn't trust a bot to keep working. The hosted version only ever runs on sample data, so the real thing is the repo.