# Platform Desk > Read one master against a whole platform set and see what one cut cannot do. Every > platform's specs look satisfiable alone; delivering ONE cut to all of them is an > intersection, not a list. The shared safe area is smaller than any single platform's, > the aspects do not intersect, the ceilings are a minimum, and a file-size cap implies > a bitrate that is in nobody's spec sheet. Free browser-side geometry, five paid lanes. Live at https://platform-desk.skillsafe.ai/ · API at https://platform-desk.skillsafe.ai/api.html Derived from the `video-ad-specs` and `youtube-thumbnail-design` skills in `inference-skills/skills` (https://github.com/inference-skills/skills). Not affiliated with or endorsed by any of the platforms named. ## The one thing to know **The safe area is an INTERSECTION, not a list.** Each platform overlays its own interface at its own insets, and each of them looks workable alone: ```text tiktok 59.9% of the master clear reels 60.5% of the master clear shorts 68.8% of the master clear feed 59.5% of the master clear linkedin 24.2% of the master clear --------------------------------------- all 5 21.8% 875x516 at (54,687) ``` The intersection is 21.8%, tighter than the tightest single platform (`linkedin` at 24.2%). Its four edges come from different platforms, so **dropping `linkedin` takes it to 50.3%** and dropping any of the other 3 buys back nothing at all. **The aspects do not intersect either.** A 9:16 master centre-cropped to 4:5 keeps 70.3% and to 16:9 keeps 31.6%. What survives EVERY target is the intersection of the crops - 31.6%, 1080x608 at (0,656) - which is composition space that was never usable. **The ceilings are a MINIMUM, and the binding one is in nobody's spec sheet.** ```text size = bitrate x duration / 8 shorts states 20 Mbps shorts caps files 256 MB at 180s that cap implies 11.93 Mbps <- what actually binds ``` **And legibility scales with the DELIVERED width.** Text at N master pixels renders at `N x platformWidth / cropWidth`, so a narrow crop makes type BIGGER. The sharpest case is the thumbnail: delivered at 1280px and judged at 246px, so 48px of master type is 56.9px in the file and 10.9px where the decision is made, against a 14px floor. One thing a single master can always do: every crop is centred on the master, and no platform in this catalogue insets any edge by half (the deepest is 21% off the bottom on `tiktok`), so every safe rectangle contains the centre of the master - and so does every intersection of them. Whatever the target set, the middle of the frame is always clear. ## The catalogue | Platform | Delivered | Aspect | Longest cut | File cap | Stated bitrate | Safe area | Smallest type | Judged at | | --- | --- | --- | --- | --- | --- | --- | --- | --- | | **TikTok** `tiktok` | 1080x1920 | 9:16 | 600s | 500 MB | 16 Mbps | **59.9%** of its frame | 24px | 1080px, as delivered | | **Instagram Reels** `reels` | 1080x1920 | 9:16 | 90s | 4 GB | 25 Mbps | **60.5%** of its frame | 24px | 1080px, as delivered | | **YouTube Shorts** `shorts` | 1080x1920 | 9:16 | 180s | 256 MB | 20 Mbps | **68.8%** of its frame | 24px | 1080px, as delivered | | **Instagram Feed** `feed` | 1080x1350 | 4:5 | 60s | 4 GB | 25 Mbps | **84.6%** of its frame | 22px | 1080px, as delivered | | **LinkedIn** `linkedin` | 1920x1080 | 16:9 | 600s | 5 GB | 30 Mbps | **76.5%** of its frame | 20px | 1920px, as delivered | | **Facebook Feed** `facebook` | 1080x1350 | 4:5 | 240s | 4 GB | 25 Mbps | **72.9%** of its frame | 22px | 1080px, as delivered | | **YouTube thumbnail** `thumbnail` | 1280x720 | 16:9 | _none stated_ | 2 MB | _none stated_ | **70.6%** of its frame | 14px | **246px preview** | Snapshot **2026-09-01**. The safe-area column is the share of that platform's OWN frame left uncovered by its own interface — every one of them looks workable on its own line, which is the whole difficulty. The last column is the width the artwork is actually judged at, and for a thumbnail that is not the width it is delivered at. ## How the intersection shrinks | Target set | Platform added | Its own safe area | Shared safe area | The set lost | | --- | --- | --- | --- | --- | | `tiktok` | `tiktok` | 59.9% | **59.9%** | — | | `tiktok` `reels` | `reels` | 60.5% | **58.2%** | 1.6% | | `tiktok` `reels` `shorts` | `shorts` | 68.8% | **58.2%** | 0% | | `tiktok` `reels` `shorts` `feed` | `feed` | 59.5% | **50.3%** | 7.9% | | `tiktok` `reels` `shorts` `feed` `linkedin` | `linkedin` | 24.2% | **21.8%** | 28.5% | One 1080x1920 master. **The fourth column only ever goes down**, and the fifth is not the new platform's own tightness — it is what that platform's insets take once they are compounded with everything already in the set. A platform whose own safe area is generous can still cost the set a great deal, and one whose safe area is tight can cost it nothing at all. ## The binding bitrate | Cut length | Encoded at | File cap | Cap implies | Platform states | What binds | | --- | --- | --- | --- | --- | --- | | 10s | 10s | 256 MB | 214.75 Mbps | 20 Mbps | **20 Mbps** | | 30s | 30s | 256 MB | 71.58 Mbps | 20 Mbps | **20 Mbps** | | 60s | 60s | 256 MB | 35.79 Mbps | 20 Mbps | **20 Mbps** | | 120s | 120s | 256 MB | 17.9 Mbps | 20 Mbps | **17.9 Mbps** _(the file cap)_ | | 180s | 180s | 256 MB | 11.93 Mbps | 20 Mbps | **11.93 Mbps** _(the file cap)_ | | 240s _(over)_ | 180s | 256 MB | 11.93 Mbps | 20 Mbps | **11.93 Mbps** _(the file cap)_ | `YouTube Shorts`. **`size = bitrate × duration ÷ 8`**, so a file-size cap is a bitrate cap that depends on how long the cut is. Encode to the published 20 Mbps on a long cut and the file is rejected for size; the number that actually binds appears in no documentation, because it is a function of a duration the platform does not know. The last rows flatten because a cut past the 180s ceiling has to be trimmed to it, so the divisor stops growing. ## Text at delivered width | Platform | Crop width | Delivered at | Scale | In the file | Judged at | Floor | Verdict | | --- | --- | --- | --- | --- | --- | --- | --- | | `tiktok` | 1080px | 1080px | 1× | 48px | 48px | 24px | ok | | `reels` | 1080px | 1080px | 1× | 48px | 48px | 24px | ok | | `shorts` | 1080px | 1080px | 1× | 48px | 48px | 24px | ok | | `feed` | 1080px | 1080px | 1× | 48px | 48px | 22px | ok | | `linkedin` | 1080px | 1920px | 1.78× | 85.3px | 85.3px | 20px | ok | | `facebook` | 1080px | 1080px | 1× | 48px | 48px | 22px | ok | | `thumbnail` | 1080px | 1280px | 1.19× | 56.9px | **10.9px** at 246px | 14px | **under** | 48px of type in a 1080x1920 master. Text scales with the DELIVERED width: `N × platformWidth ÷ cropWidth`. A narrow crop is scaled up and helps; the trap is the last row, where the file is delivered at one width and decided at another. ## Constants and thresholds | Constant | Value | What it decides | | --- | --- | --- | | `TIGHT_SAFE` | 50% | a shared safe area worth warning about | | `THIN_SAFE` | 25% | one there is almost nothing to compose in | | `SMALL_KEPT` | 40% | a surviving share of the master worth calling small | | `NEAR_CEILING` | 90% | how close to a limit is worth naming before it is passed | | `DEFAULT_MASTER_W` × `DEFAULT_MASTER_H` | 1080x1920 | assumed when the sheet states no master | | `DEFAULT_DURATION_S` | 30s | assumed when it states no duration — and it changes every implied bitrate | | `DEFAULT_TEXT_PX` | 48px | assumed for the smallest type in the master | | `SNAPSHOT` | 2026-09-01 | the day every platform figure was true | Only the catalogue is the platforms'; everything else is this page's threshold for when a difference is worth saying. The rectangles, the shares and the bitrates are measurements, not preferences — the thresholds decide only what gets called a warning. ## Sheet grammar A sheet is a header of `KEY: value` lines and a `PLATFORMS:` block. ```text JOB: what this delivery is (optional, echoed back) MASTER: 1080x1920 (the frame everything is measured from; assumed 1080x1920) DURATION: 30s (the cut; assumed 30s, and it changes every implied bitrate, so it is worth stating) SIZE: 90MB (the file; checked against the moving targets only) BITRATE: 12Mbps (the encode; likewise) TEXT: 48 (the SMALLEST type in the master, in master pixels; assumed 48px) PLATFORMS: tiktok reels shorts feed linkedin facebook thumbnail ``` **A duration is `30s`, `1500ms`, `2min`, `1:45` or a bare number read as SECONDS.** A size is `90MB`, `4GB`, `900KB` or a byte count. A bitrate is `12Mbps`, `800kbps`, `12M` or a bits-per-second count. A frame is `1080x1920`. **`TEXT` is the smallest type in the MASTER, measured in master pixels** — not the size it ends up on any platform. The page computes what it becomes on each, which is the whole point of the column. The catalogue is `tiktok`, `reels`, `shorts`, `feed`, `linkedin`, `facebook`, `thumbnail`. **Anything else is reported rather than skipped**, and so is a platform named twice: a target that quietly vanished would make every intersection on this page WIDER than it really is, which is the one direction of error that reads as good news. ## Lanes | Lane | What it produces | | --- | --- | | `plan` | Turn a campaign brief into a delivery sheet | | `ship` (primary) | What one master actually delivers to this set, and what it cannot | | `frame` | The composition question: crops, chrome, and the intersection | | `weight` | The ceilings question: duration, file size and the bitrate nobody publishes | | `decide` | Decide what changes: the composition, the encode, or the target list | ## A worked sheet ```text JOB: one launch cut, five surfaces, one master MASTER: 1080x1920 DURATION: 30s TEXT: 48 PLATFORMS: tiktok reels shorts feed linkedin ``` | Platform | Crop of the master | Kept | Its safe area | Longest cut | Binding bitrate | Type judged at | | --- | --- | --- | --- | --- | --- | --- | | `tiktok` | 1080x1920 at (0,0) | 100% | 59.9% of the master | 600s | 16 Mbps | 48px | | `reels` | 1080x1920 at (0,0) | 100% | 60.5% of the master | 90s | 25 Mbps | 48px | | `shorts` | 1080x1920 at (0,0) | 100% | 68.8% of the master | 180s | 20 Mbps | 48px | | `feed` | 1080x1350 at (0,285) | 70.3% | 59.5% of the master | 60s | 25 Mbps | 48px | | `linkedin` | 1080x608 at (0,656) | 31.6% | 24.2% of the master | 600s | 30 Mbps | 85.3px | | **all of them** | **1080x608 at (0,656)** | **31.6%** | **21.8% of the master** | **60s** | **16 Mbps** | **48px** | The sheet in the worked example. 5 platforms from one 1080x1920 master, 21.8% of the frame clear on all of them, 3 aspects, 31.6% surviving. **The last row is not a column of minima** — the crop and the safe area are INTERSECTIONS, so they are smaller than the smallest cell above them, while the duration and bitrate columns genuinely are minima. That difference is the page. ## Findings | Finding | Severity | Scope | What it says | | --- | --- | --- | --- | | `NO-PLATFORM-TO-DELIVER-TO` | error | sheet | The sheet names no platform | | `THE-SHARED-SAFE-AREA-IS-EMPTY` | error | frame | No part of the frame is clear on every platform | | `THE-SHARED-SAFE-AREA-IS-TIGHT` | warning | frame | Less than half the master is clear on every platform | | `THE-SHARED-SAFE-AREA-IS-A-THIN-STRIP` | warning | frame | There is almost nothing to compose in | | `THE-ASPECTS-DO-NOT-AGREE` | warning | frame | The set spans more than one aspect ratio | | `MOST-OF-THE-MASTER-DOES-NOT-SURVIVE` | warning | frame | The shared crop keeps very little of the frame | | `A-PLATFORM-IS-SHORTER-THAN-THE-CUT` | warning | weight | The cut is longer than a platform allows | | `THE-BINDING-BITRATE-IS-NOT-IN-ANY-SPEC-SHEET` | warning | weight | A file-size ceiling implies a lower bitrate than any stated ceiling | | `THE-MASTER-IS-OVER-A-BITRATE-CEILING` | warning | weight | The declared bitrate is above what a platform allows | | `THE-MASTER-IS-OVER-A-SIZE-CEILING` | warning | weight | The declared file size is above what a platform allows | | `TEXT-IS-BELOW-THE-LEGIBILITY-FLOOR` | warning | text | Text that is comfortable in the master is too small delivered | | `A-PLATFORM-IS-NAMED-TWICE-OR-NOT-AT-ALL` | warning | sheet | A platform line could not be used | | `THE-SHEET-HAS-LINES-THIS-PAGE-COULD-NOT-READ` | warning | sheet | Some lines were not readable | | `THE-SHARED-SAFE-AREA-IS-SMALLER-THAN-ANY-PLATFORMS` | note | frame | The intersection is tighter than the tightest platform | | `A-THUMBNAIL-IS-JUDGED-AT-ITS-PREVIEW-WIDTH` | note | text | The thumbnail is decided at a fifth of the size it is delivered at | | `WHICH-PLATFORM-BINDS-EACH-EDGE` | note | frame | Each edge of the shared safe area comes from one platform | | `EVERY-PLATFORM-TAKES-THE-SAME-ASPECT` | note | frame | The set agrees on the aspect ratio | | `A-PLATFORM-TAKES-THE-MASTER-UNCROPPED` | note | frame | One target needs no crop at all | | `THE-CROP-SCALES-THE-TEXT-UP` | note | text | A crop makes the text larger, not smaller | | `THE-SHORTEST-CEILING-BINDS` | note | weight | One platform's duration limit binds the whole delivery | | `A-CEILING-IS-CLOSE` | note | weight | Something is within a tenth of a limit | | `A-PLATFORM-HAS-NO-DURATION-LIMIT` | note | weight | A target imposes no duration ceiling | | `THE-SET-MIXES-STILLS-AND-VIDEO` | note | sheet | The set contains both a still and a moving target | | `THE-CATALOGUE-IS-A-DATED-SNAPSHOT` | note | sheet | These numbers were true on one day | | `A-MASTER-WAS-NOT-DECLARED` | note | sheet | The sheet does not state the master frame | | `NO-WEIGHT-WAS-DECLARED` | note | weight | The sheet states no size and no bitrate | 26 findings: 2 errors, 11 warnings, 13 notes. **Nothing that fires on every usable sheet is a warning.** The intersection is always smaller than the tightest platform and one duration ceiling is always the shortest, so those are notes; what gets a warning is a number that is over a limit or under a floor. ## What this page cannot do This page reads a description of a delivery, not your footage. It never decodes a frame, uploads anything or contacts a platform, so: - **The catalogue is a dated snapshot.** Every duration, file cap, bitrate and inset here was true on **2026-09-01**. Platforms change all of them without notice and this page cannot know when they do — the numbers are the ones to check against the platform's own current guidance, not the ones to trust. - **The safe insets are guidance, not a measurement of your build.** Interfaces move, they differ between the app and the web, and they differ again when a caption is long. The insets here are the conservative published figures; treat the intersection as the rectangle to design inside rather than the exact rectangle any one device draws. - **Every crop is a CENTRE crop.** That is what a platform's automatic crop does and what a human does by default, so it is the honest baseline. A deliberately reframed crop keeps a different rectangle, and this page has no way to know what it is. - **`size = bitrate × duration ÷ 8` assumes a constant rate.** A variable-bitrate encode can carry a higher peak inside the same file. The implied ceiling is the average the file has to hit, which is the number that decides whether it uploads. - **A legibility floor is a rule of thumb, not a study.** Typeface, weight, contrast and how long the text is on screen all move it. What is exact here is the SCALE — that `N` master pixels becomes `N × platformWidth ÷ cropWidth` delivered, and that a thumbnail is decided at its preview width. - **Nothing here says whether the film is any good.** It says what the frame, the weight and the type become on each surface you named. ## API `POST https://api.skillsafe.ai/v1/app-api/run` with an app session token. The body IS the input object — never wrapped in an `input` key. Fields: `task` (one of `plan`, `ship`, `frame`, `weight`, `decide`), `rules`, `prescan`, plus the lane's own fields. `POST .../estimate` with the same body returns `hold_credits` and costs nothing. ## Provenance Every table and every figure above is generated from `deliver.js` by `build-skill.js`. Nothing is typed twice, so nothing can drift.