← Back to blog

Video Streaming is Here

We've been working on this one for a while, and we're thrilled to finally share it - xform now supports video streaming. Upload your videos to your own cloud storage, and xform handles the rest: transcoding, adaptive streaming, an embeddable player, and analytics. All without ever modifying your source files.

Your files stay yours

This is the principle we built xform on, and video works exactly the same way. When you ingest a video, xform reads the original file from your storage bucket - S3, R2, or any S3-compatible provider - and that's it. We never write to, modify, or delete anything in your bucket. Your source files remain completely under your control, exactly where you put them.

All transcoded output - the HLS streams, the MP4 download, the thumbnail, captions - lives on xform infrastructure. There's a clean separation: your bucket holds your originals, and xform handles everything needed to deliver them to viewers. If you ever decide to stop using xform, your originals are right where they've always been.

How it works

The workflow is straightforward:

  1. Upload a video to your own storage bucket (or use the SDK to get a direct upload URL)
  2. Call ingest via the SDK to tell xform about the file
  3. xform transcodes the video into multiple quality levels using H.264
  4. Serve it - your video is available as an HLS stream, a progressive MP4 download, and via an embeddable player

Transcoding produces up to three quality renditions depending on the source resolution:

  • 1080p at 4 Mbps (only if the source is 1080p or higher)
  • 720p at 2 Mbps (only if the source is 720p or higher)
  • 480p at 800 kbps (always included)

We never upscale. A 720p source gets 720p and 480p renditions - nothing more. Along with the streams, xform automatically extracts a thumbnail and generates a progressive MP4 for direct download.

You can track the status of a transcode in real time using the SDK's event stream, or set up a webhook and we'll notify your server when the video is ready (or if something goes wrong).

Adaptive streaming with HLS

Every video is served as an HLS adaptive bitrate stream. The master manifest lists all available quality levels, and the player automatically switches between them based on the viewer's network conditions. Someone on a strong connection gets 1080p; someone on a mobile network gets 480p - seamlessly, without buffering.

Serving happens through your xform subdomain (or custom domain), just like images:

https://your-source.xform.media/_v/my-video.m3u8

HLS segments are cached aggressively - each segment is immutable content with a one-year cache header - while manifests use short TTLs so quality switching stays responsive. The result is fast, reliable playback with minimal origin load.

A built-in embeddable player

We've built a fully self-contained video player that you can embed anywhere with a single iframe:

<iframe src="https://your-source.xform.media/_embed/my-video" allow="autoplay; fullscreen" style="width:100%;aspect-ratio:16/9;border:none"></iframe>

The player includes everything you'd expect - play/pause, volume, fullscreen, a progress bar with buffer indicator - plus a few things you might not:

  • Adaptive quality switching with a manual quality selector
  • Playback speed controls from 0.5x to 2x
  • Caption support with a styled overlay and toggle
  • Caption search - viewers can search through your captions and jump to the right moment
  • Share with timestamp - copies a link that starts at the current playback position
  • Keyboard shortcuts - space to play, arrows to seek, M to mute, C for captions, F for fullscreen

You can customise the player's appearance with query parameters: set an accent colour, add your logo, show a title, enable autoplay, start at a specific timestamp, or loop the video. It works on every modern browser and falls back to native HLS on Safari and iOS.

No external JavaScript dependencies are loaded from your domain - the player is entirely self-contained.

Analytics out of the box

Every video tracks views, watch time, completion rate, and quality distribution automatically. The dashboard shows you which videos people are actually watching, how far they get, and where they drop off. You can see trends over time, break down by referrer, and drill into individual sessions.

Analytics data is collected client-side from the embedded player and stored separately from your billing usage, so the numbers you see are about viewer engagement, not bandwidth accounting.

Bandwidth enforcement that's fair

Video plans include a monthly bandwidth allowance. If you approach your limit, xform degrades gracefully rather than cutting viewers off abruptly:

  • Under the limit - all quality levels available
  • At 100% - streams are limited to 480p to slow usage growth
  • At 150% - playback is paused until the next billing cycle or an upgrade

This gives you a buffer to react without your viewers hitting a wall.

Plans and pricing

Video streaming is available on two plans:

  • Starter Videos at $9/month - 25 videos, 10 GB storage, 50 GB bandwidth
  • Pro Videos at $19/month - 250 videos, 100 GB storage, 500 GB bandwidth

Already using xform for images? The Bundle plans give you both images and video at a discount - $15/month for Starter or $35/month for Pro.

Need more? Get in touch about Enterprise pricing with custom limits.

Get started

If you're already on xform, head to the admin dashboard to enable video on your source. If you're new, pick a plan and you can have your first video streaming in minutes.

We're genuinely excited about what people will build with this. As always, we'd love to hear your feedback.


New to xform? Check out our plans and get started today.