One clip · every shape · every platform

Stop cropping the best part out of your own clips.

Going vertical throws away 68% of a 16:9 frame. Every other tool throws away the middle 68% and hopes. Framelock finds the action first, cuts every shape your destinations actually want, and posts to all of them at once.

Self-hosted and open source. Four destinations work the moment you add credentials — no app review, no subscription.

12:9
narom ⌁ Jett
62
17
9:16 · tracked

SOURCE · 2560×1440 · 16:9

Why it matters

The same clip, cropped two ways.

The action is left of centre, which is where action usually is — you were tracking someone. Here is what each crop keeps.

Centre crop

What you get from every other scheduler, and from posting a 16:9 file to a vertical feed.

Crosshair out Enemy out Teammate out Minimap out

Framelock, locked to the action

Motion centroid per frame, smoothed, speed-limited, then reduced to a handful of keyframes.

Crosshair in Enemy in Teammate in Killfeed out — pinnable

The killfeed is still a casualty — so put it back. Framelock can crop the HUD elements a vertical frame lost out of the original and composite them into the output, in one ffmpeg pass. Your kill counter survives the crop that geometrically deleted it.

Every shape, once

Six renders feed sixteen destinations.

Not one render per platform — one per shape. Deduplicated automatically from whatever you armed.

OutputResolutionFPSGoes toWhy it exists
9:161080×192060 TikTok, Reels, Shorts, Facebook Reels, Threads, BlueskyThe vertical feed shape.
4:51080×135060 Instagram feed, Facebook feedThe tallest the feed allows. Post 9:16 here and Instagram re-crops you, badly.
1:11080×108060 X, Mastodon, LinkedInSquare survives every timeline layout.
16:91920×108060 YouTube, Telegram, RedditNo crop at all — the source shape.
16:91280×72030 DiscordExists purely because a webhook caps at 25 MB.
2:31000×150030 PinterestThe only destination that wants 2:3.
SAFE ZONES

Their UI covers your video

TikTok, Reels and Shorts each paint a button rail and a caption block over the frame. Framelock shows the dead bands per platform and computes the rectangle that is visible on all of them.

FRAMING VERDICT

Warnings before you post

Pick your game and Framelock knows where the HUD lives. Every crop is checked against it across the whole clip — not just frame one — and reports the worst moment.

FACECAM

Baked in or a separate file

Box the camera where OBS burned it into the corner and Framelock cuts it back out and re-places it — or upload a separate camera track. Overlay it, or stack it in a band with the gameplay below.

LENGTH LIMITS

Refused early, not after encoding

Shorts caps at 60 s, Bluesky at 60 s, Reels at 90 s, TikTok at 10 min. A clip that is too long for one destination is skipped with a reason, not failed after a four-minute encode.

Honest status

Sixteen destinations, and what each one really costs you.

Most of the work in a tool like this is not code — it is app review. Here is where every platform actually stands.

PlatformIn v1.0What is in the way
BlueskyWorks todayNothing. Free, open, no review. Build against this one first.
TelegramWorks todayNothing. Bot token and a chat id.
DiscordWorks todayNothing. A webhook URL, and a 25 MB ceiling.
MastodonWorks todayNothing. Limits vary per instance; Framelock asks the instance.
YouTube & ShortsImplementedOAuth, plus 1 600 quota units per upload out of 10 000/day. Unaudited apps force uploads private.
TikTokImplementedContent Posting API audit. Until it passes, every post is locked to SELF_ONLY.
Instagram Reels & feedImplementedMeta app review, and it fetches media from a public URL rather than accepting an upload.
ThreadsImplementedSame Meta review, same public-URL requirement.
XNot yetOAuth 1.0a signing and chunked upload. X bills per call now rather than $200/month, but a chunked video upload bills every call — initialize, each append, finalize, then the post.
Facebook Reels & feedNot yetUses a start/transfer/finish protocol rather than media containers, so it needs its own adapter.
LinkedIn · Pinterest · RedditNot yetEach needs its own access upgrade before an adapter is worth writing.
SnapchatNeverNo public posting endpoint. Creative Kit only opens the app from a phone.
TwitchNeverClips are cut from live streams. Nothing accepts an upload.

Anything that claims to post to Snapchat or Twitch is driving a headless browser session. That breaks on every UI change and gets accounts flagged. Framelock says no instead.

Run it

Two commands and a bot token.

Node 20+ and ffmpeg on PATH. Nothing else — no database server, no Redis, no native build step.

# install and configure
npm install
cp .env.example .env       # fill in BLUESKY_* or TELEGRAM_* to start

# run
npm run dev                # studio on http://localhost:8080

# the maths is unit-tested without needing a video file
npm test                   # 71 passing
01 · DROP

Upload a clip

ffprobe reads the real dimensions. A downscaled greyscale pass finds the motion centroid at 8 fps — cheap enough to run on upload.

02 · REFRAME

Check the crops

Every shape previews against your actual video. Drag any crop to override the solver; the framing verdict updates as you drag.

03 · FIRE

Publish to all of them

One encode per shape, one upload job per destination, retries with backoff, and a live per-destination status board. Partial failure is expected and survivable.