Scholaris en tu ordenador o en tu propia cuenta de Cloudflare
La misma aplicación con SQLite y tu disco: en Node, en Docker, como ejecutable de escritorio o desplegada en tu cuenta de Cloudflare. Qué se queda en tu máquina y cómo funciona sin conexión.
Revisado el Esta página en Markdown
Cuatro maneras
La instancia de scholaris.joseluissaorin.com es la versión alojada, la que se paga con el plan Pro. El mismo código funciona también en tu ordenador:
| Cómo | Qué es | Dónde quedan tus datos |
|---|---|---|
| Node | La misma API sobre Node, SQLite (con sqlite-vec para los vectores) y el disco, con una cola que se reanuda si se corta; escucha en el puerto 8790 | La carpeta que elijas |
| Docker | Lo mismo en un contenedor con ffmpeg; una variante lo monta sin conexión con sus modelos (Ollama, EmbeddingGemma 2 y Whisper), con o sin GPU NVIDIA | Un volumen de Docker |
| Escritorio | Un solo ejecutable (Bun) para macOS, Windows y Linux, con la web dentro, que abre el navegador al arrancar | ~/Scholaris |
| Tu cuenta de Cloudflare | Un guion crea la base de datos, el almacenamiento, el índice de vectores y la cola, y despliega el Worker (necesita Workers de pago) | Tu cuenta |
La versión local no tiene cuotas: el plan «local» no limita documentos, páginas ni búsquedas, y admite ficheros de hasta 16 GB. Puede tener un solo usuario, varios sin cuenta externa o usar Clerk para iniciar sesión.
Código abierto
El código se publicará con licencia EUPL-1.2 en github.com/joseluissaorin/scholaris-v2. Mientras se termina de revisar, el repositorio es privado: no damos fecha. Las órdenes exactas de instalación estarán en su README, que manda sobre esta página. El SDK de Python ya tiene esa misma licencia.
Qué se queda en tu máquina y qué no
En la versión local, tus ficheros, tu biblioteca, los vectores y el índice viven en tu disco. La inteligencia se elige:
- Con tus claves (Gemini; OpenRouter, TypeSafe y Workers AI opcionales): lo más rápido y lo más fiel. Las páginas, el audio y los pasajes van a esos proveedores, con sus condiciones.
- Sin conexión (
SCHOLARIS_SIN_CONEXION=1): ninguna clave de nube. Todo corre en tu máquina o en tu red y nada sale a internet; una guardia de red bloquea y anota cualquier intento, y una prueba de punta a punta lo comprueba.
| Pieza | Sin conexión | Con un proveedor en la nube |
|---|---|---|
| Leer páginas (escaneados, fotos, diapositivas) | Un modelo de visión propio: Qwen3-VL 8B Instruct en Ollama, llama.cpp o vLLM | Gemini, OpenRouter (Mistral OCR) o Workers AI |
| Vectores | EmbeddingGemma 2 (texto, imagen, audio y vídeo, 768 dimensiones), en un servidor propio o en InferBox | Gemini Embedding 2 |
| Reordenar | bge-reranker-v2-m3 | Jev (TypeSafe) o Workers AI |
| Juzgar citas y redactar | El mismo modelo de visión, con probabilidades de los logprobs | Jev, Gemini u OpenRouter |
| Transcribir | Whisper large-v3-turbo (whisper.cpp) o Parakeet en InferBox | Gemini Transcribe o Whisper en Workers AI |
| Fichas bibliográficas | Solo lo que dice el documento (los catálogos en línea se abren con SCHOLARIS_CATALOGOS=1) | Crossref, OpenAlex, Open Library, Wikidata |
Lo que cuesta, medido en un Mac con M4 Max: una página escaneada del siglo XVIII tarda unos 26 s (la nube lee el libro entero en 13-20 s), con un CER de 0,06 en la página transcrita a mano frente a 0,006 con Gemini; 19 minutos de audio quedan listos en 2 min 34 s; la búsqueda da 0,804 de nDCG@10 frente a 0,899; y las citas que acepta son todas correctas y ninguna inventada, aunque deja sin cita más afirmaciones que la nube (61,5 % de exhaustividad frente a 100 %). Solo con CPU, leer escaneados se mide en minutos por página. El informe completo, con cómo reproducirlo, está en el repositorio (packages/proveedores/SIN-CONEXION.md), y el Docker de todo junto en deploy/docker/compose.sin-conexion.yml.
Además, abrir y buscar un .spdf ya leído funciona sin nada de lo anterior, con el SDK de Python (ver El formato SPDF).
Lo mismo por fuera
La versión local habla la misma API (v1 y v2) y el mismo MCP que la nube, así que el SDK de Python, los ejemplos de la guía de la API y los agentes funcionan igual apuntando a http://localhost:8790.