All work

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.