BG0: quita el fondo de una imagen gratis en tu navegador, sin subirla (alternativa open source a remove.bg)
BG0 es un quitador de fondos open source que funciona entero dentro de tu navegador. Eliges una foto, un modelo de IA llamado BiRefNet la procesa en tu propia tarjeta gráfica (WebGPU) o en la CPU (WebAssembly) y descargas un PNG transparente. La imagen no se sube a ningún servidor, no hay cuenta ni límite de uso, y el código se publica con licencia Apache 2.0.
Hemos leído el código del repositorio opencoredev/bg0 (commit 420442c, del 29 de septiembre de 2026) para explicarte qué hace exactamente con tu foto, cómo decide qué modelo usar según tu equipo, cómo meterlo en tu propia web con la librería @bg0/browser y qué límites tiene. Si te interesan otras alternativas libres a programas de pago, en este mismo tema tienes FigCraft, la alternativa open source a Figma.
Qué es BG0 y para qué sirve
BG0 ("Background → zero") resuelve una tarea muy concreta: quitar el fondo de una imagen y darte un PNG con transparencia. Es lo que hacen servicios como remove.bg, con una diferencia de diseño: en BG0 la inferencia ocurre en tu dispositivo. El servidor solo entrega la página y el modelo; la foto no sale de la pestaña.

Sirve para recortar fotos de producto para una tienda, retratos para un perfil, logotipos o cualquier imagen que vayas a pegar en un diseño. Su archivo de instrucciones para colaboradores (AGENTS.md) deja claro que no quiere ser más que eso: nada de editor, biblioteca de recursos ni proyectos.
| Dato | Valor |
|---|---|
| Web | [bg0.dev](https://bg0.dev) (gratis, sin cuenta) |
| Código revisado | commit `420442c`, 29 de septiembre de 2026 |
| Licencia del código | Apache 2.0 |
| Modelo | BiRefNet (pesos con licencia MIT), exportado a ONNX |
| Motor | Transformers.js 4.3.0 con ONNX Runtime: WebGPU o WebAssembly |
| Formatos de entrada | PNG, JPG, WebP, HEIC y HEIF, hasta 60 MB |
| Salida | PNG con canal alfa (descarga o portapapeles) |
| Librería | `@bg0/browser` en npm (0.1.1 publicada; el repo ya va por 0.1.2) |
| Stack de la web | TanStack Start, React 19, Tailwind, Bun y Turborepo |
Cómo funciona por dentro
Todo el trabajo con la imagen vive en el paquete packages/browser, que la web usa como una caja negra: la interfaz nunca toca ONNX ni los detalles del modelo. El recorrido completo es este:

- Entrada. Eliges la imagen, la arrastras a la página o la pegas con
Ctrl+V. Se decodifica en memoria. Los HEIC de iPhone se leen con un decodificador WebAssembly (heic-to) que solo se descarga si tu navegador no los abre por sí mismo. - Modelo. La primera vez el navegador descarga el modelo BiRefNet en formato ONNX desde Hugging Face, con una revisión fijada en el código para que no cambie por sorpresa. Se guarda en la caché del navegador (Cache API, o IndexedDB en orígenes de desarrollo) y las siguientes visitas lo leen de ahí.
- Inferencia. El modelo recibe la imagen reducida a 512 píxeles y devuelve una máscara: un valor por píxel que dice cuánto pertenece al primer plano.
- Salida. La máscara se escala al tamaño original y se aplica como canal alfa sobre tu imagen a resolución completa. El resultado es un PNG que puedes descargar (con el sufijo
-bg0en el nombre) o copiar al portapapeles.
El modo "quality": una segunda pasada sobre el sujeto
La librería tiene dos modos, fast (el predeterminado) y quality, que es el que usa bg0.dev. La diferencia está en refinement.ts: un modelo de 512 px desperdicia casi todo su detalle si el sujeto ocupa una parte pequeña de la foto. En modo quality, BG0 busca el recuadro que ocupa el sujeto en la primera máscara, recorta esa zona con un margen y vuelve a pasarla por el modelo. Así el pelo o los bordes finos se calculan con más resolución. Si el sujeto ya llena el encuadre, se salta la segunda pasada para no gastar tiempo, y si la segunda pasada falla, se queda con la primera máscara.
Qué modelo usa según tu equipo
BG0 trae dos variantes de BiRefNet de escritorio y una para iPhone. Antes de la primera imagen, @bg0/browser mira lo que informa el navegador (la GPU, la memoria y los núcleos) y elige por dónde empezar:

- BiRefNet completo (red Swin-L, unos 452 MiB): el de mejor calidad. Lo intenta en Chrome o Edge si la GPU soporta
shader-f16y tiene límites de memoria suficientes, o en la CPU si tienes al menos 4 núcleos. - BiRefNet-lite (Swin-T, unos 94 MiB): la opción ligera para equipos con poca memoria y el último recurso de todos.
- Lite cuantizado para iOS (unos 53 MiB): en iPhone y iPad corre en un worker de WebAssembly de un solo hilo, y la salida se limita a 1280 px en el lado largo para no agotar la memoria que Safari da a cada pestaña.
WebGPU solo se usa en navegadores Chromium. En Firefox o Safari de escritorio BG0 va directo a WebAssembly, que funciona pero es más lento.
Si el modelo elegido no carga o falla al ejecutarse, la librería baja un escalón: completo → lite en el mismo motor → lite en WebAssembly. Hay temporizadores para no quedarse colgada: una GPU que no responde en 5 segundos cuenta como "sin GPU", y una descarga que pasa 30 segundos sin recibir datos se da por perdida. Si una pestaña muere mientras carga el modelo completo, BG0 lo apunta y ese dispositivo usa el lite durante una semana.
Privacidad: qué sale de tu equipo y qué no
Es la razón de ser del proyecto, así que lo comprobamos en el código y en ARCHITECTURE.md:
- Nunca sale: los bytes de la imagen, los píxeles, la máscara, las miniaturas, el nombre del archivo, su tamaño ni sus dimensiones. La regla está escrita como invariante del producto: no se envían ni a analítica, ni a logs, ni a informes de errores.
- Sí sale: la petición para descargar el modelo (Hugging Face solo ve una descarga normal de un archivo) y, en bg0.dev, eventos anónimos de PostHog como "se eligió una imagen", "el recorte terminó" o "se descargó el resultado".
Esos eventos están más recortados de lo habitual. La duración del proceso se manda por tramos (<5s, 5-15s...) y no en milisegundos, porque un tiempo exacto podría delatar el tamaño de la imagen. Las grabaciones de sesión, la captura automática de clics y los perfiles de persona están desactivados, y el único texto libre de las encuestas pasa por un filtro que elimina correos, enlaces, nombres de archivo y números largos antes de enviarse.
Puedes verificarlo tú: abre las herramientas de desarrollo (F12), pestaña Red, y procesa una imagen. Verás la página, la descarga del modelo y peticiones pequeñas a PostHog, pero ninguna que lleve la foto. Si alojas BG0 tú mismo, la analítica viene apagada: el código solo la activa en bg0.dev, salvo que pongas VITE_POSTHOG_ENABLED=true.
Cómo quitar el fondo de una imagen con bg0.dev
- Entra en bg0.dev.
- Arrastra una imagen a la página, pégala con
Ctrl+Vo ábrela conCtrl+O. - La primera vez espera a que se descargue el modelo (la barra de progreso muestra los megas). Las siguientes veces sale de la caché.
- Revisa el resultado en la vista de comparación: arrastra la línea divisoria o muévela con las flechas.
- Descarga el PNG con
Ctrl+So cópialo conCtrl+Cpara pegarlo en Figma, Canva o un chat.

Los atajos de teclado que documenta el proyecto (en Mac, ⌘ en lugar de Ctrl):
| Teclas | Acción |
|---|---|
| `Ctrl+O` / `Ctrl+V` | Abrir el selector o pegar una imagen |
| `Espacio` (mantener) | Ver el original completo |
| `←` `→` (con `Mayús` va más rápido) | Mover la línea de comparación |
| `1` `2` `3` | Vista comparar, resultado u original |
| `Ctrl+S` / `Ctrl+C` | Descargar o copiar el PNG |
| `Esc` | Limpiar y esperar otra imagen |
Cómo usar @bg0/browser en tu propia web
El motor de bg0.dev se publica como librería, así que puedes añadir el recorte de fondos a tu aplicación sin pagar una API ni montar un servidor de inferencia:
npm install @bg0/browserimport { removeBackground } from '@bg0/browser'
const input = document.querySelector<HTMLInputElement>('#foto')!
input.addEventListener('change', async () => {
const file = input.files?.[0]
if (!file) return
const result = await removeBackground(file, {
quality: 'quality',
onProgress: ({ stage, progress, message }) => {
console.log(stage, Math.round(progress * 100), message)
},
})
const url = URL.createObjectURL(result.blob)
document.querySelector<HTMLImageElement>('#resultado')!.src = url
console.log(result.model, result.provider, `${result.durationMs} ms`)
})Lo que te da la API, según packages/browser/src/index.ts:
removeBackground(blob, { quality, onProgress, signal })devuelve el PNG (blob), su ancho y alto, el modelo y el motor que se usaron y la duración en milisegundos. Acepta unAbortSignalpara cancelar.onProgressinforma de la fase (preparing,downloading,processing,finishing) y, durante la descarga, de los bytes recibidos: útil para una barra de progreso real.prepareBackgroundRemoval()descarga e inicializa el modelo antes de que el usuario elija la imagen.getBrowserCapabilities()dice si hay WebGPU;clearModelCache()borra el modelo guardado.- Los errores llegan como
BackgroundRemovalErrorcon uncode(image-too-large,model-load-failed,out-of-memory,cancelled...) para que muestres un mensaje útil.
Un detalle importante antes de usarla en producción. Transformers.js 4.3.0 deja de cargar modelos en la página después de un primer fallo de ONNX. bg0.dev aplica un parche pequeño que lo evita, pero npm no lo aplica por ti. Sin él, la librería funciona igual mientras todo vaya bien; si una carga falla, el usuario tendrá que recargar la página antes de reintentar. Para igualar el comportamiento de bg0.dev, fija @huggingface/transformers en 4.3.0 y aplica el parche con patch-package o con patchedDependencies de Bun.
Ejecutar BG0 en local
El repositorio es un monorepo de Bun 1.4 con Turborepo:
git clone https://github.com/opencoredev/bg0
cd bg0
bun install --frozen-lockfile
bun run devLa web arranca en el puerto 3000 y la documentación en el 4321 (también servida en /docs). Antes de proponer cambios, el proyecto pide pasar bun run lint, bun run typecheck, bun run test y bun run build. No necesita base de datos ni variables secretas: la web desplegada no hace ningún procesamiento en el servidor.
Licencia de BG0: ¿se puede usar en un proyecto comercial?
Hay tres licencias distintas y conviene separarlas:
| Pieza | Licencia | Qué implica |
|---|---|---|
| Código de BG0 y `@bg0/browser` | Apache 2.0 | Uso comercial, modificación y redistribución permitidos; conserva el aviso de copyright y la licencia. |
| Pesos de BiRefNet (completo y lite) | MIT | No van dentro del repositorio: el navegador los descarga de Hugging Face y se rigen por su propia licencia, también permisiva. |
| Decodificador HEIC (`heic-to`, libheif, libde265) | LGPL-3.0 o posterior | Se sirve como módulo aparte y BG0 incluye el código fuente exacto para cumplir la LGPL. |
En resumen: puedes usar BG0 o su librería en un producto comercial. Si redistribuyes el decodificador HEIC, mantén sus avisos y el acceso a su código fuente, como hace el propio proyecto en THIRD_PARTY_NOTICES.md.
Límites y errores frecuentes
- La primera vez tarda. El modelo completo pesa unos 452 MiB y el lite unos 94 MiB. En una conexión lenta la primera imagen puede llevar minutos; después sale de la caché.
- Al recargar no es instantáneo. Aunque el modelo esté guardado, hay que inicializar ONNX y subir los pesos a la GPU. Navegación privada o borrar los datos del sitio obligan a descargarlo otra vez.
- "This image needs more memory than your browser can provide. Try a smaller image." El navegador se quedó sin memoria. Cierra pestañas o reduce la imagen; en iPhone el mensaje equivalente menciona Safari.
- "The local model could not be loaded. Check your connection and try again." No se pudo descargar el modelo. Revisa que tu red o tu bloqueador no corten el acceso a huggingface.co.
- "This image could not be opened. Try exporting it as PNG or JPG." El archivo no se pudo decodificar. Las secuencias HEIC/HEIF (fotos en ráfaga o "Live") no están soportadas.
- Límite de 60 MB por imagen.
- Pruebas limitadas a ciertos equipos. El propio proyecto dice que las verificó en un Mac con M4 Max y Chrome, y la versión de iOS en un iPhone 13. Firefox, Safari y otros dispositivos se consideran sin verificar.
Qué comprobamos nosotros
Revisamos el código completo de packages/browser y de la web, la arquitectura, las licencias y la documentación, e instalamos sus dependencias. No pudimos ejecutar la inferencia en nuestro entorno de pruebas, porque no tiene acceso a Hugging Face, de donde se descargan los modelos. Por eso la imagen del gato es la muestra que trae el propio repositorio, hecha con BG0 en el navegador, y los esquemas de este artículo están dibujados a partir del código, no de capturas inventadas.
Preguntas frecuentes
¿BG0 es gratis?
Sí. bg0.dev no tiene cuenta, suscripción ni créditos, y el código es Apache 2.0. El único coste es la descarga del modelo y el trabajo de tu propio equipo.
¿BG0 sube mis fotos a internet?
No. La imagen se procesa en la memoria del navegador. Lo único que se descarga es el modelo, y lo único que se envía son eventos anónimos de uso sin información de la imagen.
¿Funciona sin conexión?
La primera vez necesitas conexión para descargar el modelo. Después el modelo está en la caché del navegador, pero la página en sí sigue cargándose desde bg0.dev; si quieres un uso totalmente offline, ejecuta BG0 en local.
¿Funciona en el móvil?
Sí. En Android usa el mismo sistema que en escritorio. En iPhone y iPad usa un modelo lite cuantizado y limita la salida a 1280 px por el límite de memoria de Safari.
¿Qué diferencia hay con remove.bg?
remove.bg es un servicio en la nube: subes la imagen a sus servidores y la descarga en alta resolución se paga con créditos. BG0 procesa en tu equipo, gratis y sin límite, pero depende de tu hardware: en un equipo sin GPU compatible será más lento.
¿Puedo usar @bg0/browser en una app comercial?
Sí: el código es Apache 2.0 y los pesos de BiRefNet son MIT. Respeta los avisos de licencia y aplica el parche de Transformers.js si quieres el mismo comportamiento ante fallos que bg0.dev.
Conclusión
BG0 demuestra que hoy un navegador puede ejecutar un modelo de segmentación serio sin servidor: BiRefNet sobre WebGPU, con caídas ordenadas a WebAssembly y un trato de la privacidad que se puede auditar leyendo el código. Si solo necesitas recortar fotos, entra en bg0.dev; si tienes una web que lo necesita, @bg0/browser te ahorra pagar una API por imagen.
Si te gusta probar herramientas open source que sustituyen a servicios de pago, sigue con It's a Plan, la alternativa a Linear y Jira, o con HyperFrames, para crear vídeos con HTML.
// código fuente
// implementación
Más sobre Herramientas open source

- Alternativas gratis a apps de pago
- Instálalo en tu servidor

- Diseño, imagen y vídeo
- Alternativas gratis a apps de pago

- Alternativas gratis a apps de pago
- Diseño, imagen y vídeo