Give your agent the project and your brief
Send your coding agent the Arabic video starter on GitHub, along with the audience, dialect, message and any brand assets. You can start with this prompt:
Use https://github.com/SawtakArabi/arabic-video-starter to create a three-scene vertical video for [product or idea], aimed at [audience], in [Arabic dialect]. Read README.md, AGENTS.md and the matching dialect guide. Use the Sawtak Arabi skill, or my connected Sawtak Arabi MCP tools, for narration. Keep one voice across scenes, save the WAVs and render the video with Remotion. Return the MP4 and editable project.
The agent follows the repository's setup and adapts its scenes to your brief. The Sawtak Arabi skill or an existing MCP connection supplies narration; Remotion renders the video. Speech generation uses your Sawtak Arabi balance. Include a budget in your brief when you need a spending limit, or give the agent accepted recordings to reuse.
Ask for a change to one scene
After reviewing the first version, give a focused revision:
Change only scene two to emphasize [new message]. Keep the same narrator and reuse the accepted opening and closing recordings. Update the scene timing and render a new MP4. Keep both versions and the editable source.
Your deliverables are the video, separate narration WAVs and a Remotion project with editable scripts, artwork and timing. A longer replacement recording may lengthen the video.
Example brief: one audience, one narrator
The included Luma brief is a fictional ceramic-mug advertisement for Saudi viewers who enjoy coffee and simple homeware. Its three scenes introduce a quiet moment, show the mug's details and close on a morning ritual. The illustrations and logo are editable original SVGs.
Open briefs/saudi-ad.md, dialects/saudi-najdi.md and configs/najdi.json in your editor. The draft narration below is separate from each scene's title and caption.
Opening
وسط زحمة اليوم، خذ لك لحظة هادية مع كوب لوما.
Detail
لون دافي وتفاصيل بسيطة، تخلي قهوتك أحلى.
Closing
اختر لحظتك، وخل صباحك على ذوقك.
The project also includes Egyptian explainer and Emirati property drafts. Adapt a brief to your audience. If your recordings use different words, update each script to match the accepted take.
Optional: assemble the video yourself from existing WAVs
The steps below use recordings you already have permission to use. Follow this route when you want to run the project yourself or give your agent accepted takes.
You need Node.js 22+, Python 3.10+, a terminal and a machine able to run Remotion. A coding agent can edit the project and run the commands. On Linux, install Remotion's documented system dependencies on that rendering machine. The first render may download a browser. Read the included license notices before commercial use: Remotion has its own license.
1. Clone the starter and install
Clone the public repository on your rendering machine, read its README, then run:
git clone https://github.com/SawtakArabi/arabic-video-starter.git
cd arabic-video-starter
npm ci
npm run typecheck
npm test
The README includes a silent layout preview for checking the renderer before you add narration. The project uses the pinned Remotion packages directly; its source includes original artwork, draft scripts and dialect writing guidance.
2. Attach your accepted recordings
Place three complete 24 kHz, mono, PCM16 WAV recordings in public/audio/: opening-v1.wav, detail-v1.wav and closing-v1.wav. A filename alone does not tell you whether a recording is complete. Listen to the whole take and check its text; for API-generated audio, also follow stream completion checks.
The commands below create configs/najdi-import.json, link each scene to its recording, and render the video:
python3 - <<'PY_CONFIG'
import json
from pathlib import Path
source = Path("configs/najdi.json")
target = Path("configs/najdi-import.json")
config = json.loads(source.read_text(encoding="utf-8"))
config["voice"] = "my-accepted-narrator"
for scene in config["scenes"]:
scene["audio"] = "audio/" + scene["id"] + "-v1.wav"
with target.open("x", encoding="utf-8") as output:
json.dump(config, output, ensure_ascii=False, indent=2)
PY_CONFIG
python3 scripts/prepare.py configs/najdi-import.json --helper build/no-speech-helper
npm run render -- out/najdi-v1.mp4 --props=build/najdi-import.json
Here voice is a label for your imported narrator. The explicit audio fields select the existing recordings, so preparation makes no speech request and needs no API key. It validates every imported WAV before proceeding. The deliberately absent helper makes an accidentally missing audio field fail instead of generating speech.
The expected files are build/najdi-import.json (timings) and out/najdi-v1.mp4 (video). Your source config, artwork and accepted WAVs remain editable and reusable. Existing MP4s are protected from overwriting; choose a new output name when rendering again.
3. Let the audio set the scene length
Each scene begins with a 0.2-second pause and ends with a 0.4-second pause. The starter measures the WAV, rounds speech up to whole frames and uses at least four seconds per scene. At 30 fps, a 3.36-second take fits a 120-frame scene; a 3.52-second replacement requires 124 frames. That change adds four frames to the video if the other scenes stay the same.
Those numbers illustrate the timing rule, not a duration guarantee for your recordings. Read audio_seconds and duration_frames in the preparation output. Long narration extends a scene; the composition neither cuts off speech nor accelerates it to hit an arbitrary duration.
Titles and captions are display copy, not word-timed subtitles. Remotion uses normal browser Arabic shaping and right-to-left layout. Check the rendered text on a phone, including connected letters, line wrapping, brand names and numbers. Keep titles short enough for the supplied layout.
4. Revise only the middle scene
Keep the opening and closing WAVs. Record or generate the revised middle line with the same narrator and save it as public/audio/detail-v2.wav. For example, you might replace a general description of the mug's details with a more specific line about its warm color. Review the new words before recording.
Copy configs/najdi-import.json to configs/najdi-import-v2.json. In the copy, change only the middle scene's script, relevant display copy and audio value to audio/detail-v2.wav. Keep every scene ID unchanged. Changing a script does not modify an imported WAV: the new filename must point to the new accepted take.
python3 scripts/prepare.py configs/najdi-import-v2.json --helper build/no-speech-helper
npm run render -- out/najdi-v2.mp4 --props=build/najdi-import-v2.json
All imported files report reused: true, including your newly supplied middle take. That field means the file already existed; it does not mean every take stayed identical. Compare the two props files: opening and closing should retain the same audio paths and durations, while the middle path changes. Compare WAV hashes if you need proof that the accepted outer takes are byte-identical. A longer middle take can move the closing scene later without changing its recording.
When you need new narration
The released Sawtak Arabi skill works with coding agents and can save narration as WAV. Its installation page explains API-key setup, dependencies and ready-voice selection. Generation uses your Sawtak Arabi balance. Use your own approved script, select a ready voice and listen before accepting a take. Then import the finalized WAV using the steps above.
The starter README also explains how to generate narration directly with the skill. Before importing a generated recording, follow the stream completion checks to confirm that the operation completed and its PCM byte count matches your saved audio. Keep private receipts with your working project, outside anything you publish.
Fix the cause without losing accepted takes
- Missing asset: put the file inside
public/and use a relative path such asaudio/detail-v2.wav. Absolute paths and paths outside that directory are rejected. - Wrong format or truncated WAV: recover a complete 24 kHz mono PCM16 source. Do not rename raw PCM or MP3 to
.wav, and do not assume a retry is free. - Missing fonts: run
npm ciin the cloned starter. Preparation copies the installed Noto Sans Arabic fonts and their OFL license locally. - Uncertain speech outcome: keep partial audio and operation receipts; inspect the operation before requesting another paid take. A missing operation is not proof of failure.
- Text overflow or an overlong video: shorten display text or revise the affected script, then preview all scenes. Visual edits can reuse the same narration.
Review and hand off
Play both MP4s from start to finish, listen around every cut and check that no final word is lost. Have a reviewer familiar with the target dialect assess wording, pronunciation and delivery. Successful encoding and WAV validation are technical checks, not a listening review.
Deliver the MP4, accepted narration WAVs, source config, original artwork and editable Remotion source to the intended recipient. Exclude API keys, private receipts, temporary links and unused takes from anything public. The supplied source and original illustrations use MIT; installed dependencies keep their separate licenses.
For narration choices, start with Arabic text to speech, Saudi voices or Emirati voices. For a quick speech preview without a rendering project, use the free Arabic TTS demo.