Remotion Best Practices for Israeli Developers
Problem
Creating programmatic videos with Hebrew text in Remotion is broken by default. Standard Remotion patterns produce left-aligned text, left-to-right typewriter reveals, and captions that render backwards for RTL content. Israeli developers waste hours debugging RTL layout issues, loading Hebrew fonts incorrectly, and fighting bidirectional text bugs that standard Remotion docs do not address.
Instructions
When to use
Use this skill whenever you are dealing with Remotion code to obtain domain-specific knowledge, especially when creating Hebrew or bilingual video content.
New project setup
When in an empty folder or workspace with no existing Remotion project, scaffold one using:
npx create-video@latest --yes --blank --no-tailwind my-video
Replace my-video with a suitable project name.
Starting preview
Start the Remotion Studio to preview a video:
npx remotion studio
Optional: one-frame render check
You can render a single frame with the CLI to sanity-check layout, colors, or timing.
Skip it for trivial edits, pure refactors, or when you already have enough confidence from Studio or prior renders.
npx remotion still [composition-id] --scale=0.25 --frame=30
At 30 fps, --frame=30 is the one-second mark (--frame is zero-based).
Hebrew & RTL Video Production
For any Hebrew video content, load the ./rules/hebrew-rtl.md file. It covers:
- Hebrew Google Fonts (Heebo, Rubik, Assistant, Noto Sans Hebrew) with
subsets: ["hebrew"]
- RTL text direction (
direction: "rtl", textAlign: "right")
- Bidirectional text handling (Unicode bidi isolates for mixed Hebrew/English)
- Hebrew captions with RTL word highlighting
- Hebrew typewriter effects (right-to-left character reveal)
- Hebrew voiceover with ElevenLabs
eleven_v3 (multilingual v2 does not cover Hebrew)
- Israeli map coordinates and Hebrew map labels
Captions
When dealing with captions or subtitles, load the ./rules/subtitles.md file for more information.
Using FFmpeg
For some video operations, such as trimming videos or detecting silence, FFmpeg should be used. Load the ./rules/ffmpeg.md file for more information.
Silence detection
When needing to detect and trim silent segments from video or audio files, load the ./rules/silence-detection.md file.
Audio visualization
When needing to visualize audio (spectrum bars, waveforms, bass-reactive effects), load the ./rules/audio-visualization.md file for more information.
Sound effects
When needing to use sound effects, load the ./rules/sfx.md file for more information.
Rendering and cloud render
Studio is for previewing only. To produce a final video file, render it. Load the ./rules/rendering.md file for the npx remotion render CLI, key flags (--concurrency, --scale, --codec), and cloud rendering with @remotion/lambda and @remotion/cloudrun.
Rule files
Read individual rule files for detailed explanations and code examples:
- rules/hebrew-rtl.md - Hebrew RTL text, fonts, captions, bidi, and Israeli maps
- rules/3d.md - 3D content in Remotion using Three.js and React Three Fiber
- rules/animations.md - Fundamental animation skills for Remotion
- rules/assets.md - Importing images, videos, audio, and fonts into Remotion
- rules/audio.md - Using audio and sound in Remotion
- rules/calculate-metadata.md - Dynamically set composition duration, dimensions, and props
- rules/can-decode.md - Check if a video can be decoded by the browser
- rules/charts.md - Chart and data visualization patterns for Remotion
- rules/compositions.md - Defining compositions, stills, folders, default props
- rules/display-captions.md - TikTok-style captions with word highlighting
- rules/extract-frames.md - Extract frames from videos at specific timestamps
- rules/fonts.md - Loading Google Fonts and local fonts in Remotion
- rules/get-audio-duration.md - Getting audio duration with Mediabunny
- rules/get-video-dimensions.md - Getting video width and height
- rules/get-video-duration.md - Getting video duration in seconds
- rules/gifs.md - Displaying GIFs synchronized with Remotion timeline
- rules/images.md - Embedding images using the Img component
- rules/import-srt-captions.md - Importing .srt subtitle files
- rules/light-leaks.md - Light leak overlay effects
- rules/lottie.md - Embedding Lottie animations
- rules/maps.md - Map animations with Mapbox
- rules/measuring-dom-nodes.md - Measuring DOM element dimensions
- rules/measuring-text.md - Measuring text dimensions and fitting text
- rules/parameters.md - Make a video parametrizable with Zod schema
- rules/sequencing.md - Sequencing patterns for timing and delay
- rules/silence-detection.md - Adaptive silence detection with FFmpeg
- rules/tailwind.md - Using TailwindCSS in Remotion
- rules/text-animations.md - Typography and text animation patterns
- rules/timing.md - Interpolation curves, easing, and spring animations
- rules/transcribe-captions.md - Transcribing audio to generate captions
- rules/transitions.md - Scene transition patterns
- rules/transparent-videos.md - Rendering video with transparency
- rules/trimming.md - Trimming patterns for animations
- rules/videos.md - Embedding videos with trimming, volume, speed
- rules/rendering.md - Rendering videos locally and in the cloud (Lambda, Cloud Run)
- rules/voiceover.md - AI-generated voiceover with ElevenLabs TTS
Examples
Example 1: Hebrew TikTok caption video
User wants a vertical (1080x1920) social clip with a Hebrew voiceover and word-highlighted captions.
- Scaffold a project:
npx create-video@latest --yes --blank --no-tailwind my-video.
- Generate the Hebrew voiceover (load
rules/voiceover.md, ElevenLabs eleven_v3).
- Convert the MP3 to a 16-bit 16kHz WAV, then transcribe to captions (load
rules/transcribe-captions.md, use the medium multilingual Whisper model with language: "he", never medium.en).
- Render TikTok-style word-highlighted captions (load
rules/display-captions.md and rules/hebrew-rtl.md): set direction: "rtl", textAlign: "right", and wrap any embedded Latin digits in LTR bidi isolates (\u2066 ... \u2069).
- Size the composition 1080x1920, drop the Hebrew display font two steps below the English size you would use (Gotcha #7).
- Preview in
npx remotion studio, then render with npx remotion render (load rules/rendering.md).
Example 2: Data-driven chart video
User wants a 16:9 explainer where a bar chart animates from a JSON dataset.
- Make the composition parametrizable with a Zod schema (load
rules/parameters.md) so the dataset is a typed prop.
- Compute duration and dimensions from the dataset in
calculateMetadata (load rules/calculate-metadata.md); keep it lazy so it does not slow every render.
- Build the animated bar chart driven by
useCurrentFrame() and interpolation/spring curves (load rules/charts.md and rules/timing.md). Never use CSS animations (Gotcha #1).
- For Hebrew axis labels and titles, apply RTL direction and bidi isolates around numbers (load
rules/hebrew-rtl.md).
- Render to MP4 with
npx remotion render, or batch-render many datasets in the cloud with @remotion/lambda (load rules/rendering.md).
Bundled Resources
Rule files (rules/)
The rules/ folder contains focused topic files loaded on demand. Highlights: hebrew-rtl.md (Hebrew fonts, RTL, bidi, Israeli maps), animations.md, timing.md, sequencing.md, transitions.md, compositions.md, calculate-metadata.md, parameters.md, charts.md, text-animations.md, 3d.md, audio rules (audio.md, audio-visualization.md, sfx.md, voiceover.md, get-audio-duration.md, silence-detection.md), video rules (videos.md, assets.md, images.md, gifs.md, lottie.md, transparent-videos.md, light-leaks.md, maps.md, tailwind.md, fonts.md), caption rules (subtitles.md, display-captions.md, transcribe-captions.md, import-srt-captions.md), measurement/decode helpers (measuring-dom-nodes.md, measuring-text.md, can-decode.md, extract-frames.md, get-video-dimensions.md, get-video-duration.md, trimming.md), ffmpeg.md, and rendering.md. See the full list under "Rule files" above.
Assets (rules/assets/)
Ready-to-use TSX component examples referenced by the rule files: charts-bar-chart.tsx (animated bar chart), text-animations-typewriter.tsx (typewriter effect), and text-animations-word-highlight.tsx (word-by-word caption highlighting).
Gotchas
CSS animations are forbidden in Remotion. Never use transition-*, animate-*, @keyframes, or Tailwind animation classes. All motion must be driven by useCurrentFrame(). CSS animations will not render correctly during video export.
Hebrew text without direction: "rtl" renders backwards. Punctuation, numbers, and parentheses will appear on the wrong side. Every Hebrew text container must explicitly set RTL direction.
Whisper needs BOTH a multilingual model and an explicit language for Hebrew. Use medium (or large-v3-turbo), never medium.en, which is English-only and produces garbage for Hebrew. Just as important, pass language: "he" to transcribe(): with auto-detect, whisper.cpp on short or noisy Hebrew voiceover routinely picks Arabic, Yiddish or English, or emits Latin transliteration, and every caption downstream is then wrong however correct the RTL container is. Also convert to a 16-bit 16kHz WAV first (npx remotion ffmpeg -i vo.mp3 -ar 16000 -ac 1 vo.wav); transcribe() accepts nothing else, and TTS providers emit MP3.
useFrame() from React Three Fiber is forbidden. Inside <ThreeCanvas>, only useCurrentFrame() from Remotion is allowed. Using useFrame() causes flickering during rendering because it animates outside Remotion's frame-based timeline.
Native <img> and <video> elements cause blank frames. Always use <Img> from remotion and <Video> from @remotion/media. These components ensure assets are fully loaded before rendering.
RTL flips flex-start and flex-end. In an RTL flex container, flex-start = RIGHT and flex-end = LEFT. To right-align icon+text rows in Hebrew, use justifyContent: "flex-start" (not flex-end). The RTL direction already reverses DOM order, so the first child (icon) renders on the right. Do not use flexDirection: "row-reverse" in RTL containers -- it double-reverses back to LTR order.
Hebrew text wraps to a second line at the same font size English fits on one line. Hebrew fonts (Heebo, Rubik, Assistant) at display weights render 20-30% wider than English at the same size. If an English title works at fontSize: 72, the Hebrew equivalent needs 54-60. Also set flexWrap: "nowrap" and whiteSpace: "nowrap" on any flex row containing display-size Hebrew words to prevent unwanted line breaks mid-phrase.
Hebrew captions must sound Israeli, not translated. Avoid corporate-sounding phrases like "תמיכה מלאה", passive-participle text descriptions, and literal translations of English idioms. Israeli dev slang: "עולים" (load), "מתיישרת" / "נדחפת" / "מופיעה" for movement, "אפקט הקלדה" (not "מכונת כתיבה"). Do NOT use "נופלת", which means falls DOWN, not sideways; see the verb table in rules/hebrew-rtl.md. Use "אפשר" not "ניתן", use active voice, and sprinkle natural connectors like "סוף סוף", "כמו שצריך", "באמת".
Never use em dashes or en dashes. Replace em/en dash characters with commas, colons, parentheses, or double hyphens (--). They are not on standard keyboards, don't render reliably across platforms, and make text feel machine-generated. This applies to both English and Hebrew content in SKILL.md, video captions, and UI copy.
Remotion is not unconditionally free. It is free for individuals, non-profits, and for-profit organizations with 3 or fewer employees. Organizations of 4 or more employees must buy a paid Company License from remotion.pro. This applies to using Remotion at all (Studio, rendering, CI), not just to a specific feature. Check https://www.remotion.dev/license and the bundled LICENSE file before shipping a commercial project.
Tune render performance, do not just accept defaults. Lower --concurrency if a render runs out of memory; raise it on many-core machines for faster renders. Use --scale below 1 for fast draft renders and above 1 for high-resolution masters. For embedded video, prefer the new <Video> from @remotion/media (frame-exact, off the main thread via Mediabunny); the older "prefer <OffthreadVideo> over <Video>" advice applies only to the legacy <Video> from the remotion package. Keep calculateMetadata cheap and lazy since it runs before every render. See rules/rendering.md.
Math.random() breaks renders. A render evaluates your component once per frame, often in parallel across several browser tabs, so Math.random() returns a different value on every frame and anything derived from it jitters or flickers. Use random() from remotion with a fixed seed instead: random("particle-3") is deterministic across frames and across machines. The same applies to Date.now() and new Date(). See https://www.remotion.dev/docs/using-randomness.
Plan for the Remotion 5.0 breaking set. Stable today is the 4.0.x line (4.0.518 as of August 2026); 4.1.0-alpha* is the pre-release train for 5.0 and the written migration guide targets 5.0. Four changes hit this skill's advice directly: @remotion/light-leaks and @remotion/starburst stop receiving releases and are replaced by lightLeak() and starburst() from @remotion/effects; loadFont() from @remotion/google-fonts will REQUIRE explicit weights and subsets (so subsets: ["hebrew"] goes from best practice to mandatory); <Sequence>, <Series.Sequence> and <TransitionSeries.Sequence> premount automatically for one second, with premountFor={0} as the opt-out; and contractors count towards the employee threshold for the Company License. See https://www.remotion.dev/docs/5-0-migration.
Reference Links
Troubleshooting
Hebrew text appears left-aligned
Add direction: "rtl" and textAlign: "right" to the text container style. For full-frame layouts, set direction: "rtl" on the <AbsoluteFill>.
Captions show words in wrong order
The caption container needs direction: "rtl" and whiteSpace: "pre". Without RTL direction, token rendering order is LTR.
Hebrew font not rendering (shows squares or fallback)
Ensure you loaded the font with subsets: ["hebrew"] and called waitUntilDone() before rendering. Without the subset, the Hebrew glyphs are not downloaded.
Numbers appear on wrong side of Hebrew text
Use Unicode bidi isolates: wrap numbers with \u2066...\u2069 (LTR isolate) when embedded in Hebrew text.
Whisper produces gibberish for Hebrew audio
Three causes, check all: (1) the model is medium.en, which is English-only, switch to medium or large-v3-turbo; (2) language: "he" was not passed to transcribe(), so auto-detect picked the wrong language; (3) the input was not a 16-bit 16kHz WAV.
Icons appear on the wrong side in flex rows
In an RTL container, justifyContent: "flex-start" aligns to the RIGHT, not left. Do not use flexDirection: "row-reverse" -- it double-reverses the order. Just put the icon as the first child in the DOM.
1---2name: remotion-best-practices3description: Best practices for Remotion video creation in React with Hebrew RTL support. Use when dealing with Remotion code, creating programmatic videos, building Hebrew video content with RTL captions and text animations, or generating social media videos with Hebrew fonts. Covers animations, compositions, sequencing, transitions, audio/video, captions, 3D, charts, voiceover, and Hebrew/RTL text rendering. Do NOT use for non-Remotion video editing, general React development, or static image generation.4license: MIT5---67# Remotion Best Practices for Israeli Developers89## Problem1011Creating programmatic videos with Hebrew text in Remotion is broken by default. Standard Remotion patterns produce left-aligned text, left-to-right typewriter reveals, and captions that render backwards for RTL content. Israeli developers waste hours debugging RTL layout issues, loading Hebrew fonts incorrectly, and fighting bidirectional text bugs that standard Remotion docs do not address.1213## Instructions1415### When to use1617Use this skill whenever you are dealing with Remotion code to obtain domain-specific knowledge, especially when creating Hebrew or bilingual video content.1819### New project setup2021When in an empty folder or workspace with no existing Remotion project, scaffold one using:2223```bash24npx create-video@latest --yes --blank --no-tailwind my-video25```2627Replace `my-video` with a suitable project name.2829### Starting preview3031Start the Remotion Studio to preview a video:3233```bash34npx remotion studio35```3637### Optional: one-frame render check3839You can render a single frame with the CLI to sanity-check layout, colors, or timing.40Skip it for trivial edits, pure refactors, or when you already have enough confidence from Studio or prior renders.4142```bash43npx remotion still [composition-id] --scale=0.25 --frame=3044```4546At 30 fps, `--frame=30` is the one-second mark (`--frame` is zero-based).4748### Hebrew & RTL Video Production4950For any Hebrew video content, load the [./rules/hebrew-rtl.md](./rules/hebrew-rtl.md) file. It covers:5152- Hebrew Google Fonts (Heebo, Rubik, Assistant, Noto Sans Hebrew) with `subsets: ["hebrew"]`53- RTL text direction (`direction: "rtl"`, `textAlign: "right"`)54- Bidirectional text handling (Unicode bidi isolates for mixed Hebrew/English)55- Hebrew captions with RTL word highlighting56- Hebrew typewriter effects (right-to-left character reveal)57- Hebrew voiceover with ElevenLabs `eleven_v3` (multilingual v2 does not cover Hebrew)58- Israeli map coordinates and Hebrew map labels5960### Captions6162When dealing with captions or subtitles, load the [./rules/subtitles.md](./rules/subtitles.md) file for more information.6364### Using FFmpeg6566For some video operations, such as trimming videos or detecting silence, FFmpeg should be used. Load the [./rules/ffmpeg.md](./rules/ffmpeg.md) file for more information.6768### Silence detection6970When needing to detect and trim silent segments from video or audio files, load the [./rules/silence-detection.md](./rules/silence-detection.md) file.7172### Audio visualization7374When needing to visualize audio (spectrum bars, waveforms, bass-reactive effects), load the [./rules/audio-visualization.md](./rules/audio-visualization.md) file for more information.7576### Sound effects7778When needing to use sound effects, load the [./rules/sfx.md](./rules/sfx.md) file for more information.7980### Rendering and cloud render8182Studio is for previewing only. To produce a final video file, render it. Load the [./rules/rendering.md](./rules/rendering.md) file for the `npx remotion render` CLI, key flags (`--concurrency`, `--scale`, `--codec`), and cloud rendering with `@remotion/lambda` and `@remotion/cloudrun`.8384### Rule files8586Read individual rule files for detailed explanations and code examples:8788- [rules/hebrew-rtl.md](rules/hebrew-rtl.md) - Hebrew RTL text, fonts, captions, bidi, and Israeli maps89- [rules/3d.md](rules/3d.md) - 3D content in Remotion using Three.js and React Three Fiber90- [rules/animations.md](rules/animations.md) - Fundamental animation skills for Remotion91- [rules/assets.md](rules/assets.md) - Importing images, videos, audio, and fonts into Remotion92- [rules/audio.md](rules/audio.md) - Using audio and sound in Remotion93- [rules/calculate-metadata.md](rules/calculate-metadata.md) - Dynamically set composition duration, dimensions, and props94- [rules/can-decode.md](rules/can-decode.md) - Check if a video can be decoded by the browser95- [rules/charts.md](rules/charts.md) - Chart and data visualization patterns for Remotion96- [rules/compositions.md](rules/compositions.md) - Defining compositions, stills, folders, default props97- [rules/display-captions.md](rules/display-captions.md) - TikTok-style captions with word highlighting98- [rules/extract-frames.md](rules/extract-frames.md) - Extract frames from videos at specific timestamps99- [rules/fonts.md](rules/fonts.md) - Loading Google Fonts and local fonts in Remotion100- [rules/get-audio-duration.md](rules/get-audio-duration.md) - Getting audio duration with Mediabunny101- [rules/get-video-dimensions.md](rules/get-video-dimensions.md) - Getting video width and height102- [rules/get-video-duration.md](rules/get-video-duration.md) - Getting video duration in seconds103- [rules/gifs.md](rules/gifs.md) - Displaying GIFs synchronized with Remotion timeline104- [rules/images.md](rules/images.md) - Embedding images using the Img component105- [rules/import-srt-captions.md](rules/import-srt-captions.md) - Importing .srt subtitle files106- [rules/light-leaks.md](rules/light-leaks.md) - Light leak overlay effects107- [rules/lottie.md](rules/lottie.md) - Embedding Lottie animations108- [rules/maps.md](rules/maps.md) - Map animations with Mapbox109- [rules/measuring-dom-nodes.md](rules/measuring-dom-nodes.md) - Measuring DOM element dimensions110- [rules/measuring-text.md](rules/measuring-text.md) - Measuring text dimensions and fitting text111- [rules/parameters.md](rules/parameters.md) - Make a video parametrizable with Zod schema112- [rules/sequencing.md](rules/sequencing.md) - Sequencing patterns for timing and delay113- [rules/silence-detection.md](rules/silence-detection.md) - Adaptive silence detection with FFmpeg114- [rules/tailwind.md](rules/tailwind.md) - Using TailwindCSS in Remotion115- [rules/text-animations.md](rules/text-animations.md) - Typography and text animation patterns116- [rules/timing.md](rules/timing.md) - Interpolation curves, easing, and spring animations117- [rules/transcribe-captions.md](rules/transcribe-captions.md) - Transcribing audio to generate captions118- [rules/transitions.md](rules/transitions.md) - Scene transition patterns119- [rules/transparent-videos.md](rules/transparent-videos.md) - Rendering video with transparency120- [rules/trimming.md](rules/trimming.md) - Trimming patterns for animations121- [rules/videos.md](rules/videos.md) - Embedding videos with trimming, volume, speed122- [rules/rendering.md](rules/rendering.md) - Rendering videos locally and in the cloud (Lambda, Cloud Run)123- [rules/voiceover.md](rules/voiceover.md) - AI-generated voiceover with ElevenLabs TTS124125## Examples126127### Example 1: Hebrew TikTok caption video128129User wants a vertical (1080x1920) social clip with a Hebrew voiceover and word-highlighted captions.1301311. Scaffold a project: `npx create-video@latest --yes --blank --no-tailwind my-video`.1322. Generate the Hebrew voiceover (load `rules/voiceover.md`, ElevenLabs `eleven_v3`).1333. Convert the MP3 to a 16-bit 16kHz WAV, then transcribe to captions (load `rules/transcribe-captions.md`, use the `medium` multilingual Whisper model with `language: "he"`, never `medium.en`).1344. Render TikTok-style word-highlighted captions (load `rules/display-captions.md` and `rules/hebrew-rtl.md`): set `direction: "rtl"`, `textAlign: "right"`, and wrap any embedded Latin digits in LTR bidi isolates (`\u2066` ... `\u2069`).1355. Size the composition 1080x1920, drop the Hebrew display font two steps below the English size you would use (Gotcha #7).1366. Preview in `npx remotion studio`, then render with `npx remotion render` (load `rules/rendering.md`).137138### Example 2: Data-driven chart video139140User wants a 16:9 explainer where a bar chart animates from a JSON dataset.1411421. Make the composition parametrizable with a Zod schema (load `rules/parameters.md`) so the dataset is a typed prop.1432. Compute duration and dimensions from the dataset in `calculateMetadata` (load `rules/calculate-metadata.md`); keep it lazy so it does not slow every render.1443. Build the animated bar chart driven by `useCurrentFrame()` and interpolation/spring curves (load `rules/charts.md` and `rules/timing.md`). Never use CSS animations (Gotcha #1).1454. For Hebrew axis labels and titles, apply RTL direction and bidi isolates around numbers (load `rules/hebrew-rtl.md`).1465. Render to MP4 with `npx remotion render`, or batch-render many datasets in the cloud with `@remotion/lambda` (load `rules/rendering.md`).147148## Bundled Resources149150### Rule files (`rules/`)151152The `rules/` folder contains focused topic files loaded on demand. Highlights: `hebrew-rtl.md` (Hebrew fonts, RTL, bidi, Israeli maps), `animations.md`, `timing.md`, `sequencing.md`, `transitions.md`, `compositions.md`, `calculate-metadata.md`, `parameters.md`, `charts.md`, `text-animations.md`, `3d.md`, audio rules (`audio.md`, `audio-visualization.md`, `sfx.md`, `voiceover.md`, `get-audio-duration.md`, `silence-detection.md`), video rules (`videos.md`, `assets.md`, `images.md`, `gifs.md`, `lottie.md`, `transparent-videos.md`, `light-leaks.md`, `maps.md`, `tailwind.md`, `fonts.md`), caption rules (`subtitles.md`, `display-captions.md`, `transcribe-captions.md`, `import-srt-captions.md`), measurement/decode helpers (`measuring-dom-nodes.md`, `measuring-text.md`, `can-decode.md`, `extract-frames.md`, `get-video-dimensions.md`, `get-video-duration.md`, `trimming.md`), `ffmpeg.md`, and `rendering.md`. See the full list under "Rule files" above.153154### Assets (`rules/assets/`)155156Ready-to-use TSX component examples referenced by the rule files: `charts-bar-chart.tsx` (animated bar chart), `text-animations-typewriter.tsx` (typewriter effect), and `text-animations-word-highlight.tsx` (word-by-word caption highlighting).157158## Gotchas1591601. **CSS animations are forbidden in Remotion.** Never use `transition-*`, `animate-*`, `@keyframes`, or Tailwind animation classes. All motion must be driven by `useCurrentFrame()`. CSS animations will not render correctly during video export.1611622. **Hebrew text without `direction: "rtl"` renders backwards.** Punctuation, numbers, and parentheses will appear on the wrong side. Every Hebrew text container must explicitly set RTL direction.1631643. **Whisper needs BOTH a multilingual model and an explicit language for Hebrew.** Use `medium` (or `large-v3-turbo`), never `medium.en`, which is English-only and produces garbage for Hebrew. Just as important, pass `language: "he"` to `transcribe()`: with auto-detect, whisper.cpp on short or noisy Hebrew voiceover routinely picks Arabic, Yiddish or English, or emits Latin transliteration, and every caption downstream is then wrong however correct the RTL container is. Also convert to a 16-bit 16kHz WAV first (`npx remotion ffmpeg -i vo.mp3 -ar 16000 -ac 1 vo.wav`); `transcribe()` accepts nothing else, and TTS providers emit MP3.1651664. **`useFrame()` from React Three Fiber is forbidden.** Inside `<ThreeCanvas>`, only `useCurrentFrame()` from Remotion is allowed. Using `useFrame()` causes flickering during rendering because it animates outside Remotion's frame-based timeline.1671685. **Native `<img>` and `<video>` elements cause blank frames.** Always use `<Img>` from `remotion` and `<Video>` from `@remotion/media`. These components ensure assets are fully loaded before rendering.1691706. **RTL flips `flex-start` and `flex-end`.** In an RTL flex container, `flex-start` = RIGHT and `flex-end` = LEFT. To right-align icon+text rows in Hebrew, use `justifyContent: "flex-start"` (not `flex-end`). The RTL direction already reverses DOM order, so the first child (icon) renders on the right. Do not use `flexDirection: "row-reverse"` in RTL containers -- it double-reverses back to LTR order.1711727. **Hebrew text wraps to a second line at the same font size English fits on one line.** Hebrew fonts (Heebo, Rubik, Assistant) at display weights render 20-30% wider than English at the same size. If an English title works at `fontSize: 72`, the Hebrew equivalent needs `54-60`. Also set `flexWrap: "nowrap"` and `whiteSpace: "nowrap"` on any flex row containing display-size Hebrew words to prevent unwanted line breaks mid-phrase.1731748. **Hebrew captions must sound Israeli, not translated.** Avoid corporate-sounding phrases like "תמיכה מלאה", passive-participle text descriptions, and literal translations of English idioms. Israeli dev slang: "עולים" (load), "מתיישרת" / "נדחפת" / "מופיעה" for movement, "אפקט הקלדה" (not "מכונת כתיבה"). Do NOT use "נופלת", which means falls DOWN, not sideways; see the verb table in `rules/hebrew-rtl.md`. Use "אפשר" not "ניתן", use active voice, and sprinkle natural connectors like "סוף סוף", "כמו שצריך", "באמת".1751769. **Never use em dashes or en dashes.** Replace em/en dash characters with commas, colons, parentheses, or double hyphens (`--`). They are not on standard keyboards, don't render reliably across platforms, and make text feel machine-generated. This applies to both English and Hebrew content in SKILL.md, video captions, and UI copy.17717810. **Remotion is not unconditionally free.** It is free for individuals, non-profits, and for-profit organizations with 3 or fewer employees. Organizations of 4 or more employees must buy a paid Company License from remotion.pro. This applies to using Remotion at all (Studio, rendering, CI), not just to a specific feature. Check https://www.remotion.dev/license and the bundled `LICENSE` file before shipping a commercial project.17918011. **Tune render performance, do not just accept defaults.** Lower `--concurrency` if a render runs out of memory; raise it on many-core machines for faster renders. Use `--scale` below 1 for fast draft renders and above 1 for high-resolution masters. For embedded video, prefer the new `<Video>` from `@remotion/media` (frame-exact, off the main thread via Mediabunny); the older "prefer `<OffthreadVideo>` over `<Video>`" advice applies only to the legacy `<Video>` from the `remotion` package. Keep `calculateMetadata` cheap and lazy since it runs before every render. See `rules/rendering.md`.18118212. **`Math.random()` breaks renders.** A render evaluates your component once per frame, often in parallel across several browser tabs, so `Math.random()` returns a different value on every frame and anything derived from it jitters or flickers. Use `random()` from `remotion` with a fixed seed instead: `random("particle-3")` is deterministic across frames and across machines. The same applies to `Date.now()` and `new Date()`. See https://www.remotion.dev/docs/using-randomness.18318413. **Plan for the Remotion 5.0 breaking set.** Stable today is the 4.0.x line (4.0.518 as of August 2026); `4.1.0-alpha*` is the pre-release train for 5.0 and the written migration guide targets 5.0. Four changes hit this skill's advice directly: `@remotion/light-leaks` and `@remotion/starburst` stop receiving releases and are replaced by `lightLeak()` and `starburst()` from `@remotion/effects`; `loadFont()` from `@remotion/google-fonts` will REQUIRE explicit weights and subsets (so `subsets: ["hebrew"]` goes from best practice to mandatory); `<Sequence>`, `<Series.Sequence>` and `<TransitionSeries.Sequence>` premount automatically for one second, with `premountFor={0}` as the opt-out; and contractors count towards the employee threshold for the Company License. See https://www.remotion.dev/docs/5-0-migration.185186## Reference Links187188| Source | URL | What to Check |189|--------|-----|---------------|190| Remotion Docs | https://www.remotion.dev/docs | API reference, latest version changes |191| Remotion GitHub | https://github.com/remotion-dev/remotion | Source code, issues, releases |192| Remotion License | https://www.remotion.dev/license | Free vs paid Company License, 4+ employee threshold |193| Remotion Render / CLI | https://www.remotion.dev/docs/cli/render | `npx remotion render` flags: concurrency, scale. Its `--codec` table is STALE and still lists `png`; use the list in `rules/rendering.md` |194| @remotion/lambda | https://www.remotion.dev/docs/lambda | Cloud rendering on AWS Lambda at scale |195| @remotion/google-fonts | https://www.remotion.dev/docs/google-fonts | Available Google Fonts with Hebrew subset support |196| @remotion/captions | https://www.remotion.dev/docs/captions | Caption types, TikTok-style captions API |197| ElevenLabs models | https://elevenlabs.io/docs/overview/models | Which model IDs list Hebrew (v3 family), which do not (multilingual v2) |198| Google Fonts Hebrew | https://fonts.google.com/?subset=hebrew | Browse Hebrew-supporting fonts |199200## Troubleshooting201202### Hebrew text appears left-aligned203Add `direction: "rtl"` and `textAlign: "right"` to the text container style. For full-frame layouts, set `direction: "rtl"` on the `<AbsoluteFill>`.204205### Captions show words in wrong order206The caption container needs `direction: "rtl"` and `whiteSpace: "pre"`. Without RTL direction, token rendering order is LTR.207208### Hebrew font not rendering (shows squares or fallback)209Ensure you loaded the font with `subsets: ["hebrew"]` and called `waitUntilDone()` before rendering. Without the subset, the Hebrew glyphs are not downloaded.210211### Numbers appear on wrong side of Hebrew text212Use Unicode bidi isolates: wrap numbers with `\u2066...\u2069` (LTR isolate) when embedded in Hebrew text.213214### Whisper produces gibberish for Hebrew audio215Three causes, check all: (1) the model is `medium.en`, which is English-only, switch to `medium` or `large-v3-turbo`; (2) `language: "he"` was not passed to `transcribe()`, so auto-detect picked the wrong language; (3) the input was not a 16-bit 16kHz WAV.216217### Icons appear on the wrong side in flex rows218In an RTL container, `justifyContent: "flex-start"` aligns to the RIGHT, not left. Do not use `flexDirection: "row-reverse"` -- it double-reverses the order. Just put the icon as the first child in the DOM.