Changelog
Every ship, every fix. In our own words.
UGC style preset
videougctiktokNew preset in the video generator: UGC. The "iPhone in someone's hand talking about a product" look, without the actual person or the actual iPhone.
What it wires up under the hood:
- Prompt scaffolding. The router gets an extra system message steering it toward handheld framing, natural indoor lighting, medium close-up, no cinematic camera moves. Aspect ratio locked to 9:16.
- Burned-in captions. Post-render we run an FFmpeg pass with
subtitles=captions.srt:force_style='Fontname=Inter,Fontsize=18,PrimaryColour=&HFFFFFF&,OutlineColour=&H000000&,BorderStyle=3,Outline=1'— the TikTok-native look, not a subtitle track a platform might strip. - Humanized TTS. ElevenLabs
eleven_multilingual_v2withstability=0.35, similarity_boost=0.75. Lower stability on purpose — the tiny imperfections read as human. - Product photo upload. Drop a JPEG/PNG in the UGC panel and it gets passed to Runway as a reference image so the product shape stays consistent shot-to-shot. Nothing fancy; the reference-image field was already there, we just exposed it.
Meant for creator-brand ads. Works surprisingly well for SaaS demo cutdowns too.
— AustinPer-brand voice AI
voiceaicaptionsCaptions used to sound like a robot doing an impression of you. Now they sound like you.
- Voice profiles live in Postgres with a
pgvectorembedding column. Paste in 10–50 sample captions, we chunk and embed withtext-embedding-3-small(1536-dim), and store them per workspace. - RAG at caption time: when you hit "generate caption", we pull the top-k nearest neighbors to the current draft topic (cosine distance,
k=6) and inject them as few-shot examples. The model gets your actual phrasing, not a description of it. - Dashboard at
/dashboard/voice: create profiles, paste samples, mark a profile as default, preview how a caption comes out with vs. without the profile.
Tested it against my own last 200 TikTok captions — the with-profile output is close enough that I don't need to rewrite it. That was the whole bar.
— Austin- Voice profiles live in Postgres with a
MCP + OpenAPI shipped
mcpapiautomationYou can now drive the whole app from Claude Desktop, Cursor, or n8n's AI Agent node without touching the UI.
/api/mcp— Model Context Protocol endpoint. Streamable HTTP transport. Six tools out of the gate:list_posts,create_post,schedule_post,generate_caption,upload_media,get_post_status. Auth viaAuthorization: Bearer pk_live_..../api/docs— OpenAPI 3.1 spec plus a Scalar-rendered reference. Same auth model. Every dashboard action has a matching endpoint; if it's not in the spec, it doesn't exist.- API keys live under Dashboard → Settings → API keys. Hashed with SHA-256 before insert; we show the plaintext exactly once at creation. Scoped per-workspace, revocable, last-used timestamp is tracked so you can spot stale ones.
The reason this exists: I wanted my own agents to schedule my own content. If you want the same, you now can.
— AustinABMediaX Poster is live
postingbillinglaunchFirst public build is up at poster.abmediax.com. Been running it privately for weeks; time to let other people use it.
What works today:
- YouTube posting is live and reviewed. Uploads via resumable session, sets title/description/tags, honors your default privacy setting.
- TikTok, Instagram, X are wired end-to-end but pending platform review. You can connect the accounts now; publishing turns on the moment each app is approved. No code change needed on your end when it flips.
- Captions via OpenAI (
gpt-4o-minifor drafts,gpt-4ofor the "make it better" pass). Prompt is boring on purpose — hook, body, CTA, hashtags — and it respects the brand voice profile if you have one set. - Auth is Supabase (email + Google). Sessions via
@supabase/ssr, middleware-gated everywhere except/,/login,/changelog,/api/docs,/api/mcp. - Storage is Vercel Blob. Videos land there first, then get pushed to each platform. No S3 bill to reason about.
- Custom domain: poster.abmediax.com, HTTPS via Vercel, wildcard subdomain reserved for future workspaces.
- Pro plan ($19/mo) unlocks the scheduler (Vercel Cron every 5 minutes checks
postswherestatus='scheduled' AND scheduled_at <= now()). - OAuth tokens for each connected platform are encrypted at rest (AES-256-GCM, key from
TOKEN_ENCRYPTION_KEYenv). We never store platform passwords, only refresh tokens.
There will be bugs. Report them and I'll ship a fix the same day.
— AustinAI video generation (Runway)
videoairunwayShipped a one-box AI video generator. Type any prompt, get a finished clip in your workspace. Preview-only — nothing auto-posts until you approve it.
How it works:
- Router. Your prompt goes to a
gpt-4orouter that plans cinematic shots — subject, camera move, lighting, duration per shot. Cheap and fast; output is a strict JSON schema. - Render. Shots go to Runway Gen-4.5 as the primary provider. There's a Sora fallback stub wired up but disabled until API access lands.
- Quality gate. Every returned file is probed with
ffprobe. If duration is off by more than ±0.5s, resolution is below the requested tier, or audio track length doesn't match video length, we reject and retry once. Failed twice = surfaced to you with the probe output so you know why. - Delivery. Passing clips land in Vercel Blob and show up under
/dashboard/videoas previewable assets. You pick one, edit the caption, then send it to the poster.
New route:
/dashboard/video. Runway credits pass through at cost — no markup, no re-billing.— Austin- Router. Your prompt goes to a