OpenParable
Skip to content
← Back to skills

Upload R2

DevOps & Security
upload-r2

Upload R2 is an Agent Skill for devops & security published in the remotion-dev/remotion repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

Upload large Remotion repository assets to the Cloudflare R2 bucket behind remotion.media and replace local public/ assets with hosted URLs. Use when a file is too large for Git or when a PR should avoid committing media binaries by hosting them on remotion.media.

View on GitHub ↗
QUICK START

How to use this skill

Bring this guide into your coding agent with a prompt tailored to the tool you use.

  1. Open your project in Codex.
  2. Copy and paste the prompt below.
  3. Review files and risks before approving any action.
Prompt to paste
Inspect the Agent Skill at https://github.com/remotion-dev/remotion/blob/HEAD/.agents/skills/upload-r2/SKILL.md and all supporting files. Report provenance, permissions, scripts, dependencies, and security risks. Propose an exact installation into .agents/skills/upload-r2, but wait for my approval before writing files or running scripts.

Copying this prompt does not install or run the skill. Review third-party files before use.

Upload R2 Asset

Use this for large media assets that should be hosted on https://remotion.media/ instead of committed to Git.

Workflow

  1. Find the main worktree:

    git worktree list --porcelain
    

    Prefer the worktree on refs/heads/main, usually /Users/jonathanburger/remotion.

  2. Load R2 credentials from the main worktree:

    --env-file=/Users/jonathanburger/remotion/packages/remotion-media/.env
    

    Do not print secret values. The required variables are AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY.

  3. Upload the file to the parser-media bucket using Bun's S3-compatible client:

    bun --env-file=/Users/jonathanburger/remotion/packages/remotion-media/.env -e "import {S3Client} from 'bun'; const filePath='<local-file>'; const key='<remote-file-name>'; const client=new S3Client({accessKeyId:Bun.env.AWS_ACCESS_KEY_ID, secretAccessKey:Bun.env.AWS_SECRET_ACCESS_KEY, endpoint:'https://2fe488b3b0f4deee223aef7464784c46.r2.cloudflarestorage.com', bucket:'parser-media'}); const file=Bun.file(filePath); if (await client.exists(key)) { const stat=await client.stat(key); if (stat.size===file.size) { console.log('exists-same-size', key, file.size); process.exit(0); } } await client.write(key, file); const stat=await client.stat(key); console.log('uploaded', key, stat.size);"
    
  4. Verify the public URL:

    curl -I --fail https://remotion.media/<remote-file-name>
    
  5. Replace local asset usage with the hosted URL and delete the local binary.

    Do not wrap remote URLs in staticFile(): staticFile() rejects http:// and https:// URLs. Use the URL string directly, for example:

    <Video src="https://remotion.media/example.mp4" />
    
  6. Run the focused lint or stylecheck for touched packages, then commit and push.