editframe/playback

Your editor is only
as fast as your playback.

Without fast playback, your users wait. They upload a 2GB file to trim 3 seconds. They scrub and nothing moves. Point at any URL. Formats convert on the fly, no encoding step to run yourself.

Without Editframe playback

✗ Upload the whole file before previewing
✗ Convert formats before anything plays
✗ Scrubbing stalls on large files
✗ Users give up and leave

With Editframe playback

✓ Point at any URL and it streams immediately
✓ Converts on the fly, not upfront
✓ Frame-accurate scrubbing on any file size
✓ Your product feels fast

The whole integration

<!-- Point ef-video at any URL. No pre-processing needed. -->
<ef-video src="https://your-s3-bucket.s3.amazonaws.com/clip.mov"></ef-video>

<!-- Or Cloudflare R2. Or your own CDN. Any public URL works. -->
<ef-video src="https://your-bucket.r2.cloudflarestorage.com/clip.mkv"></ef-video>

<!-- Private file? One call for a signed URL. -->
const url = await client.files.signUrl(fileId, { expiresIn: 3600 })

Your files can live anywhere

Amazon S3Cloudflare R2Google Cloud StorageImageKitEditframe FilesAny public URL

JIT transcoding

Formats convert on the fly.
Not before you hit play.

The reason editors feel slow is usually format incompatibility. Your users upload MOV files, MKV files, random exports from any device. Most of it won't play directly in the browser.

JIT fixes this. Editframe converts formats on demand instead of upfront — no manual step, no separate pipeline to maintain. Your composition still points at the original URL.

Use the Vite plugin locally, and Editframe Cloud handles it in production. Same URL, no code changes.

FormatWithout JITWith JIT
.movConvert firstWorks directly
.mkvConvert firstWorks directly
.aviConvert firstWorks directly
.mp4Works directlyWorks directly
// vite.config.ts
import { editframe } from '@editframe/vite-plugin'

export default {
  plugins: [editframe({
    apiKey: process.env.EF_TOKEN
  })]
}

// Now this just works locally
<ef-video src="/assets/raw.mov"></ef-video>
// Same composition in production —
// Cloud handles JIT. No code change.
<ef-video
  src="https://s3.amazonaws.com/bucket/raw.mov"
></ef-video>

Private media (optional)

Keep videos private.
Share only what you mean to.

Public URLs work with no setup. For private media, generate a short-lived signed URL and pass it to ef-video like any other source. Expires when you say.

  • Set any expiry, from seconds to days
  • Same JIT transcoding as public files
  • Works for video, image, and caption files
URL signing docs →
// Only needed for private media
const signed = await client.files.signUrl(
  fileId, { expiresIn: 3600 }
)

// Passes straight into your composition
<ef-video src={signed}></ef-video>

// Or in React
<Video src={signed} />

Storage

Your files stay where they are.

Editframe doesn't need to own your files to render them. Keep them in S3, R2, or wherever you already store assets. Or use Editframe Files if you want storage and delivery in one place.

Keep files where they are

No migration, no lock-in

Point your composition at any URL. Editframe renders against it. Nothing moves.

Use Editframe Files

Storage and delivery in one API

Upload once. Get a signed URL alongside your renders. One bill.

Common questions

We already use S3. Do we have to move files into Editframe?

No. Point ef-video at your existing S3 URL. Editframe renders against it directly. Nothing moves.

Our users upload all kinds of formats. Which ones work?

MOV, MKV, AVI, MP4, WebM. All play automatically in local dev and production. No pre-processing, no setup.

Fast playback is the foundation
of a fast editor.

Point at any URL. Formats convert on the fly, not upfront. Your users get the snappy editor experience they expect.