Cross-Origin Storage: compartir modelos de IA entre webs sin duplicar
Una propuesta de API permitiría compartir caché de modelos de IA entre orígenes distintos, ahorrando cientos de MB.

Qué es
Transformers.js permite usar modelos de ML directamente en el navegador mediante pipelines task-specific. Pero tiene un problema de caché: los mismos archivos de modelo y runtime Wasm se descargan duplicados en cada origen distinto.
Thomas Steiner (Chrome team, Google) explora en este post cómo la propuesta de Cross-Origin Storage (COS) API podría resolverlo. La API es una propuesta en fase temprana —no implementada nativamente en ningún navegador todavía— pero hay una extensión de Chrome polyfill para experimentar.
El problema: caché aislada por origen
Los recursos de Transformers.js vienen de dos CDNs:
- Modelos: desde el Hub de HuggingFace (
https://huggingface.co/Xenova/.../resolve/main/config.json) - Runtime Wasm: desde jsDelivr (
https://cdn.jsdelivr.net/npm/onnxruntime-web@.../ort-wasm-simd-threaded.asyncify.wasm)
Los navegadores particionan la caché por origen para prevenir timing attacks. Chrome usa una Network Isolation Key compuesta por: top-level site + current-frame site + resource URL.
El resultado: aunque dos orígenes distintos pidan el exactamente el mismo recurso, no hay cache hit. Descarga duplicada, almacenamiento duplicado.
Impacto concreto
Xenova/whisper-tiny.en(modelo ASR por defecto): 177 MB de descarga y almacenamiento duplicado por cada origenort-wasm-simd-threaded.asyncify.wasm: 4.733 kB, compartido por todas las apps de Transformers.js sin importar el modelo- Añadir un segundo pipeline (sentiment analysis con DistilBERT) sigue necesitando el mismo runtime Wasm —descargado otra vez por origen
La API: Cross-Origin Storage
La propuesta introduce navigator.crossOriginStorage, una interfaz de almacenamiento cross-origin donde los archivos se identifican por hash criptográfico, no por URL u origen. El mismo archivo descargado por un origen se reconoce como idéntico cuando otro lo pide.
Flujo básico
const hash = {
algorithm: 'SHA-256',
value: '8f434346648f6b96df89dda901c5176b10a6d83961dd3c1ac88b59b2dc327aa4',
};
try {
const handle = await navigator.crossOriginStorage.requestFileHandle(hash);
// Cache hit: obtener el archivo y usarlo directamente
const fileBlob = await handle.getFile();
} catch {
// Cache miss: descargar de la red y almacenar
const fileBlob = await fetch('https://cdn.jsdelivr.net/.../ort-wasm-simd-threaded.asyncify.wasm')
.then(r => r.blob());
const handle = await navigator.crossOriginStorage.requestFileHandle(
hash,
{ create: true, origins: '*' },
);
const writableStream = await handle.createWritable();
await writableStream.write(fileBlob);
await writableStream.close();
}
Diseño de la API
- Modelada sobre el File System Standard (
FileSystemDirectoryHandle.getFileHandle(), familiar de OPFS) - El parámetro
hashes el identificador único del recurso (comonameen OPFS) options.create:false/ausente para solo lectura,truepara escritura- Devuelve un
FileSystemFileHandle→getFile()→File(hereda deBlob)
Control de acceso con origins
| Configuración | Comportamiento | Caso de uso |
|---|---|---|
origins: '*' |
Disponible globalmente — cualquier origen puede encontrarlo por hash | Modelos de IA, runtime Wasm |
origins: ['https://a.example.com', 'https://b.example.com'] |
Restringido a los sitios listados | Recursos propietarios entre propiedades de una empresa |
| Omitido | Solo orígenes del mismo sitio | Recursos compartidos entre subdominios |
Regla clave: la visibilidad se puede subir pero nunca bajar. Un archivo global no puede re-almacenarse con orígenes restringidos (se ignora silenciosamente). Un archivo restringido sí puede hacerse más permisivo, pero el sitio que lo sube debe escribir el archivo completo —esto previene detección side-channel de la presencia del archivo.
Integridad por diseño
- El navegador verifica el hash al escribir: si los datos no coinciden con el hash declarado, la escritura falla
- Cada archivo en COS está verificado implícitamente, sin importar la fuente (CDN oficial o mirror propio)
- Esto elimina el gap actual donde cualquier CDN puede servir contenido sin verificación
¿Para quién es relevante?
- Devs web que usan Transformers.js (o cualquier librería que cargue modelos pesados en el navegador)
- Equipos de ML en el edge que sirven modelos via web
- Navegadores y specs web — es una propuesta a seguir de cerca
Conclusiones
El problema es real: 177 MB por modelo por origen es un coste inaceptable para adopción masiva de IA en el navegador. La COS API lo resuelve de forma elegante —identificación por hash en vez de por origen— y con integridad verificada de serie. Es una propuesta temprana, pero merece atención: si los navegadores la adoptan, cambiará cómo se cachean los modelos de IA en la web.
📎 Fuente original: HuggingFace Blog ↗