06Personal project, 2026
Relay
Upload once. Post everywhere, in six different voices.
- What it is
- Full-stack, AI product
- Built with
- Next.js, TypeScript, Prisma, SQLite, LLM / vision, ffmpeg
- Where it lives
- Runs locally — live publishing needs each platform's API credentials
The best parts
- It watches the video first: sampled frames and the audio track decide what the post is about
- Captions, titles and hashtags written per platform, with live character-limit checks
- A scheduler and background publisher with retries, backoff and idempotency
- It never fakes a publish: unconnected platforms say so out loud
How it came together
Upload a video once. Relay watches it, writes the caption, title and hashtags for every platform in that platform's own register, and publishes on schedule. Auth, workspaces, an AI pipeline, a scheduler and a background publisher — a whole product, not a demo.
The problem
Posting one video to six platforms means writing it six times. The same clip needs a different voice on TikTok than on LinkedIn, and doing that by hand is the part everyone quietly gives up on.
The approach
Let the machine watch the video first. Sample frames, pull the audio, work out what the clip is actually about — then write each platform's post from that understanding instead of pasting one caption everywhere.
How it’s built
Next.js and Prisma over SQLite. ffmpeg probes the file, samples frames and extracts audio; a vision-and-transcript pass builds a cached analysis; per-platform generation writes the caption, title, description and hashtags with live character-limit validation. Scheduling stores UTC and renders in the user's timezone, and a background worker publishes with retries, backoff and idempotency.
What shipped
A working product end to end — sign-up, onboarding, upload, analysis, generation, editing, scheduling, publishing, analytics and an admin panel. Adapters for all six platforms are written against the real APIs; they stay marked “Not configured” until you supply credentials, and it never fakes a publish.
What I took from it
Being honest in the UI is a feature. It was tempting to show a green tick everywhere, but a tool that pretends to publish is worse than one that admits it can't yet. Saying “not configured” out loud made the whole thing more trustworthy.



