YouTube Shorts safe zone: 1080x1920 pixel guide for captions
On YouTube Shorts, Reels and TikTok the app’s buttons and description sit on top of your video. Keep captions and faces inside x 65 to 950, y 288 to 1248 of a 1080x1920 frame, and check a frame of each caption before you post.
By Homingo Learn ·
Why vertical video needs a safe zone
On Shorts, Reels and TikTok the app draws its own interface over your video: the like, comment and share buttons down the right side, the account name, post description and audio line across the bottom, and search or tabs along the top. Anything you put under them is hidden or hard to read, and it is the captions (here: text you burn into the video, not the platform’s auto-captions) and faces that suffer most. A safe zone is the part of the 1080x1920 frame that stays clear on all three.
Shorts safe zone dimensions in pixels (1080x1920)
Meta’s Reels ads guidance, for example, asks for the top 14%, the bottom 35% and 6% at each side to stay clear of text and logos. On Shorts the like, comment and share column runs down the right, and the channel name, subscribe button, title and audio line sit along the bottom. YouTube and TikTok place their buttons differently and change them between app versions, so our working rule rounds the top up and widens the right side for the button column: one layout for all three apps.
- Top 15% (288 px): no text, no faces.
- Bottom 35% (672 px): no text, no faces; this is where the description and audio line sit.
- Left 6% (65 px) and right 12% (130 px): no text. The right side holds the like, comment and share column, so keep text centred in the safe box (about 30 px left of the frame centre), never right-aligned.
- Safe box: x 65 to 950, y 288 to 1248, so 885 x 960 px. For 4K vertical (2160x3840) the same percentages apply: roughly double every number (the percentages are what count).
Check it on a real phone once per video template: on YouTube upload a test as private or unlisted, on TikTok post it as “Only you”, on Instagram post from a separate private test account, so the test never reaches your followers. The rule leaves margin, but a new app version can move a button.
Where to put captions, faces and titles
- Captions: at the bottom edge of the safe box (around y 1100 to 1248), centred in the box, at most two lines. Keep each caption short, about seven words or fewer, so it reads in a glance.
- Faces and the main subject: the upper half of the safe box, well clear of the bottom band where the description covers them.
- Titles and hook text on frame 0: inside the safe box, never in the top band, where search and tabs sit.
- Backgrounds and atmosphere: can fill the whole frame. Only things a viewer must read or recognise need the safe box.
A safe-area overlay in Remotion
If you build videos as code with Remotion, keep the numbers in one place and draw a guide over the preview, so every shot is checked as you work. The guide draws only in the Studio (Remotion 4; it also stays hidden in the Player), so it can never end up in a render, and the caption component uses the same numbers:
import { AbsoluteFill, getRemotionEnvironment, useVideoConfig } from 'remotion';
// Share of the frame to keep clear of text: top 15%, bottom 35%, left 6%, right 12% (the button column).
export const SAFE = { top: 0.15, bottom: 0.35, left: 0.06, right: 0.12 };
// A dashed outline of the safe box, drawn only in the Studio, never in a render.
export const SafeAreaGuide = () =>
getRemotionEnvironment().isStudio ? (
<AbsoluteFill style={{ pointerEvents: 'none' }}>
<div
style={{
position: 'absolute',
top: `${SAFE.top * 100}%`,
bottom: `${SAFE.bottom * 100}%`,
left: `${SAFE.left * 100}%`,
right: `${SAFE.right * 100}%`,
border: '4px dashed rgba(255, 220, 0, 0.9)',
boxSizing: 'border-box',
}}
/>
</AbsoluteFill>
) : null;
// Captions sit at the bottom edge of the safe box, never in the bottom band.
// Pixels, not %: CSS padding percentages are measured against the width, even top and bottom.
export const Caption = ({ text }: { text: string }) => {
const { width, height } = useVideoConfig();
const s = width / 1080; // sizes scale with the frame, so 4K keeps the same look
return (
<AbsoluteFill
style={{
boxSizing: 'border-box',
justifyContent: 'flex-end',
alignItems: 'center',
paddingBottom: SAFE.bottom * height,
paddingLeft: SAFE.left * width,
paddingRight: SAFE.right * width,
}}
>
<div style={{ fontSize: 64 * s, fontWeight: 800, color: 'white', textAlign: 'center', lineHeight: 1.15,
textShadow: `0 ${4 * s}px ${12 * s}px rgba(0,0,0,0.8)`, WebkitTextStroke: `${2 * s}px black` }}>{text}</div>
</AbsoluteFill>
);
};
// In your composition, render <SafeAreaGuide /> as the last child so it draws on top of everything.src/SafeArea.tsx
At 64 px on a 1080-wide frame, roughly 20 to 25 characters fit on one line of the box; split longer captions into separate cues. For the whole spec-driven setup, see Remotion + Claude Code for vertical video.
Check any video with ffmpeg
Whatever tool made the video, you can check it. This script scales the frame to 1080x1920 (so check first that the file is 9:16, with the ffprobe command in the checklist below), grabs one frame, shades everything outside the safe box and outlines the box, so a quick look at the still shows any caption or face in the wrong place. It needs only Python and ffmpeg:
import subprocess
import sys
W, H = 1080, 1920
TOP, BOTTOM, LEFT, RIGHT = 0.15, 0.35, 0.06, 0.12 # share of the frame to keep clear of text
def safe_box():
"""Area where captions and key subjects stay readable."""
x, y = round(W * LEFT), round(H * TOP)
return x, y, W - x - round(W * RIGHT), H - y - round(H * BOTTOM) # x, y, width, height
def overlay_still(video: str, at: float, out_png: str):
"""Grab one frame and shade everything outside the safe box, for a quick review."""
x, y, w, h = safe_box()
shade = "color=black@0.55:t=fill"
vf = ",".join([
f"scale={W}:{H}", # any 9:16 file is checked at 1080x1920
f"drawbox=x=0:y=0:w={W}:h={y}:{shade}", # top band
f"drawbox=x=0:y={y + h}:w={W}:h={H - y - h}:{shade}", # bottom band
f"drawbox=x=0:y={y}:w={x}:h={h}:{shade}", # left edge
f"drawbox=x={x + w}:y={y}:w={W - x - w}:h={h}:{shade}", # right edge
f"drawbox=x={x}:y={y}:w={w}:h={h}:color=yellow@0.9:t=4", # the safe box outline
])
subprocess.run(["ffmpeg", "-v", "error", "-y", "-ss", str(at), "-i", video, "-frames:v", "1", "-vf", vf, out_png],
check=True)
if __name__ == "__main__":
print("safe box (x, y, w, h):", safe_box())
if len(sys.argv) == 4:
overlay_still(sys.argv[1], float(sys.argv[2]), sys.argv[3])
print("wrote", sys.argv[3])
else:
sys.exit("usage: python safe_zone.py VIDEO SECONDS OUT.png")
# safe box (x, y, w, h): (65, 288, 885, 960)safe_zone.py
Run python safe_zone.py episode.mp4 1.5 check.png for the frame at 1.5 seconds. Check frame 0 (the hook) and one frame per caption. To run checks like this as part of a review, see the reviewer agents in our Claude Code subagents guide.
A transparent safe-zone template. For any editor (CapCut, Premiere, DaVinci Resolve), this one ffmpeg command writes a 1080x1920 PNG with the bands shaded and the safe box outlined. Put it on the top track while you edit and hide it before export:
ffmpeg -f lavfi -i "color=c=black@0.0:s=1080x1920,format=rgba" -vf "drawbox=x=0:y=0:w=1080:h=288:color=black@0.55:t=fill:replace=1,drawbox=x=0:y=1248:w=1080:h=672:color=black@0.55:t=fill:replace=1,drawbox=x=0:y=288:w=65:h=960:color=black@0.55:t=fill:replace=1,drawbox=x=950:y=288:w=130:h=960:color=black@0.55:t=fill:replace=1,drawbox=x=65:y=288:w=885:h=960:color=yellow@0.9:t=4:replace=1" -frames:v 1 safe_zone_template.pngreplace=1 makes drawbox write the alpha channel too; without it the PNG comes out fully transparent.
A pre-post checklist
- Frame 0 shows the hook inside the safe box, readable on mute.
- Every caption sits inside the safe box, at most two lines, centred in the box.
- No face or key object in the top 15% or bottom 35%.
- Nothing important within 65 px of the left edge or 130 px of the right edge (the button column).
- The file is 1080x1920 (or 2160x3840):
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 episode.mp4prints1080,1920. A phone clip that prints1920,1080may carry a rotation flag; re-encode it upright before editing.
For what to put inside the safe box in the first seconds, see YouTube Shorts hooks: five patterns for the first three seconds.
FAQ
- Reels and TikTok safe zone: is it the same as Shorts? Each app differs, and the differences change between versions; one conservative box (the one above) covers all three.
- Does it apply to 4K vertical video? Yes, as percentages: at 2160x3840 every pixel value roughly doubles.
- Can the background go outside the safe box? Yes. Only text and things a viewer must recognise need to stay inside.
The safe-zone check is one of the pre-post QA steps in the skill below, alongside the hook, the episode spec and the camera, light and grade system.