Media infrastructure
for developers

Sube, transcodifica y transmite video. Sirve imágenes y archivos. Genera captions automáticamente. Un SDK, cero costos de egress. Self-host o déjanos correrlo por ti.

Funciona con tu stack

React
Next.js
TanStack
Convex
Supabase
Cloudflare
01

Qué incluye

Upload

Tus usuarios suben. Nosotros nos encargamos del resto.

URLs pre-firmadas, tracking de progreso, validación de archivos. UploadZone funciona listo para usar o en modo headless para UI custom.

Transcode

Video crudo entra, streaming HLS sale.

FFmpeg corre en máquinas Fly.io por segundo. Single-bitrate o adaptativo. Auto-thumbnails. Nunca administras una cola.

Deliver

Cero egress. En serio.

Cloudflare R2 almacena tus archivos. El bandwidth no cuesta nada. URLs firmadas, range requests, CDN caching incluido.

Captions

Transcripción en cualquier idioma, automáticamente.

Groq Whisper transcribe con timestamps por palabra. Mistral traduce a cualquier idioma. Archivos VTT se guardan junto al video.

Player

Agrega un video player con un componente.

hls.js por debajo. Atajos de teclado, selector de captions, reanudar desde última posición. Estilizado o headless.

Security

Tokens JWT vinculados a la sesión.

Vinculación por IP, huella de sesión, expiración configurable. Cuatro niveles desde URLs firmadas hasta segmentos HLS encriptados con AES-128.

02

SDK

Empieza con

lib/media.ts
import { createMediaRouter, video, image, file } from "@devultur/core";

export const media = createMediaRouter({
  apiKey: process.env.DEVULTUR_API_KEY,

  video: video({ maxSize: "2GB", locales: ["es-CO", "en"] }),
  image: image({ maxSize: "10MB" }),
  file:  file({ maxSize: "500MB" }),
});
components.tsx
import { UploadZone, VideoPlayer } from "@devultur/react";

<UploadZone
  onUploadUrl={async (file) => {
    const res = await media.createUploadUrl({
      filename: file.name,
      contentType: file.type,
    });
    return { url: res.url, key: res.key };
  }}
  onComplete={(r) => console.log("Uploaded:", r.key)}
/>

<VideoPlayer
  src={playlistUrl}
  captions={[
    { locale: "es-CO", label: "Espanol", src: captionUrl },
  ]}
  onProgress={(time) => saveProgress(id, time)}
/>
03

Precios

Free

$0
  • 2 GB storage
  • 10 GB bandwidth
  • 100 transforms
  • 720p HLS
  • React SDK
Empezar

Starter

$5.000 COP

/mes mínimo

  • $120 COP/GB storage
  • $20 COP/GB bandwidth
  • $20 COP /transform
  • Video, captions, progress add-ons
  • Dashboard + SDK
Empezar

Pro

$50.000 COP

/mes mínimo

  • $80 COP/GB storage
  • $16 COP/GB bandwidth
  • Transforms ilimitados
  • Soporte prioritario
  • Custom domain
Empezar

Todos los planes pagos son por uso. Pagas por lo que usas, no una asignación fija.