FRAMEWORKS
SvelteKit video
Complete video infrastructure for a SvelteKit app. Install the packages and you get uploads, adaptive playback, live streams, DRM, analytics and AI features, without building your own encoding, storage and delivery.
Free plan: 10 videos, 100K streaming minutes, 300 minutes of subtitles and moderation. No credit card.
TRUSTED BY PRODUCT TEAMS SHIPPING VIDEO AT SCALE






What you get
What you get from FastPix for SvelteKit video
Four things you don't have to build or run yourself.
One video API
Upload, storage, delivery, the player, analytics and AI all come from the same API. No Vite plugin, nothing added to your build.
Built-in encoding
FastPix turns each upload into several quality levels and packages them for streaming. No FFmpeg, no queue workers.
Analytics already on
The player sends view data on its own. Add a title and a viewer ID and you can see who watched what.
Secure video streaming and DRM
Sign a token on your server and pass it to the player. Widevine, PlayReady and FairPlay are all supported.
Functionality
Every SvelteKit video capability, from upload to AI
Pick a group, then a capability. Each one tells you whether the code goes in a +server endpoint, a server load, or the Svelte component itself.
Video upload API
A +server.ts endpoint creates the signed URL. The browser then uploads the file straight to FastPix in chunks, which is also how you sidestep SvelteKit's BODY_SIZE_LIMIT entirely: the bytes never reach your server, so there is no body to limit.
Svelte video player
The player is a web component, so it goes straight into Svelte markup with no wrapper and no React. It registers against customElements, a browser-only API, so import it from onMount rather than at the top of the file or SSR throws on window.
Video engagement analytics
The player sends view data on its own. There is no second SDK and no component to write. On a framework that compiles away as much as it can, this is the rare capability that costs nothing at all.
Server-side AI processing
Every AI feature runs on the video after it is uploaded. You ask for it from a .server module and the result arrives on a webhook. None of it touches a component, so runes or stores makes no difference to any of it.
Setup
Install and configure the SvelteKit video packages
Install the SvelteKit video packages
The upload engine and the player run in the browser and neither needs React. The Node SDK runs in your endpoints, where it creates upload URLs, signs playback tokens and asks for AI features.
Configure the SvelteKit video packages
There's no API key. You get two values, an Access Token ID and a Secret Key, and they work as a username and password. SvelteKit refuses to compile if a component imports them.
Get your access tokenA SvelteKit project with all of it wired
The endpoint, the Svelte upload component, the webhook handler and the player page, in one project you can clone and run. Everything in one place instead of four doc pages.
Behind the scenes
What happens after your SvelteKit app uploads a file
Here's what happens between the file leaving the browser and the video reaching a viewer. None of it is code you write, and none of it runs in your app.
Your SvelteKit app only touches the two ends. A server call hands over a signed URL and the player takes the playback ID. In between, a video.media.ready webhook tells your server the video is ready.
FAQ
SvelteKit video questions, answered
How do I add a video player to a SvelteKit app?
The player is a web component, so it goes straight into Svelte markup with no wrapper and no React. The one rule is to import it inside onMount, because it registers against customElements and SvelteKit renders your components on the server first.
Can I upload video from SvelteKit without adding React?
Yes. The prebuilt uploader is a React component, but the chunked upload engine underneath is plain JavaScript with no view layer. Drive it from a Svelte component and build the UI with runes, or mount the React one inside onMount and accept two dependencies.
How do I get around SvelteKit's BODY_SIZE_LIMIT for video?
Stop sending the file through your server. Raising the limit moves the failure to Nginx's client_max_body_size, then to your platform's own cap, then to its execution timeout. A +server.ts endpoint that returns a signed URL is a few hundred bytes.
Why do I get 'document is not defined' during SSR?
Something touching the DOM is running on the server. React DOM, a player import at the top of the file, or anything reading document at the top of a module. Move it inside onMount, which never runs on the server.
Go deeper
More on SvelteKit video uploads and playback
Uploading large video files efficiently using chunking
The protocol detail behind chunk sizing and retry behaviour.
Read moreHow to allow users to upload large videos with pause and resume
The behaviour the uploader gives you, explained.
Read moreGuide to video playback in JavaScript
What the browser is doing underneath any player you pick.
Read moreABR vs MBR: adaptive and multi-bitrate streaming
Why one upload becomes several quality levels.
Read moreGuide to lazy loading HTML videos for your website
Stops a page of video elements blocking your first paint.
Read moreCreating a fully customizable video player interface
Restyling controls without rebuilding the player.
Read moreHow to protect video content with signed URLs
The access model behind private playback.
Read moreWebhooks for video: live events and UGC pipelines
The events that matter, and verifying a signature properly.
Read moreHow to set up monitoring for video player errors
Catching playback failures before support tickets do.
Read more