Correr la app del navegador
Arranca el servidor de Bun y chatea con cerebros desde la UI.
La app del navegador es la contraparte más duradera de la CLI. Mantiene cerebros alrededor, soporta varios a la vez y te da un hilo de chat por cerebro.
Arrancar el servidor
PORT=4180 bun run devDeberías ver:
LocalLens is running at http://localhost:4180Sin PORT, el servidor escucha en 3000. Abre
http://localhost:4180 en cualquier navegador moderno.
Recorrer la demo
-
Ingresa un nombre de cerebro. Algo como
Sample brain. -
Haz clic en Choose folder. Se abre el file picker del navegador. Selecciona
examples/sample-braindel repo. -
Haz clic en Create and index. La UI hace stream del progreso mientras los archivos se leen, se cortan en chunks y se embeddean.
-
Una vez que el cerebro aparece como
indexeden el sidebar, escribe una pregunta en el input del chat. Por ejemplo:Why does LocalLens use QWEN3_1_7B_INST_Q4?
-
Dale a Send. La respuesta llega en stream con citas
[1],[2], y la lista de fuentes al fondo enlaza cada una de vuelta al archivo.
Qué hay detrás de la UI
La app del navegador es HTML, JS y CSS planos en src/ui/. Habla
con el servidor de Bun en src/server.ts sobre una API JSON
pequeña:
| Método | Ruta | Body | Devuelve |
|---|---|---|---|
GET | /api/health | — | { ok: true, name: "LocalLens" } |
GET | /api/brains | — | { brains: Brain[] } |
POST | /api/brains/from-files | CreateBrainFromFilesInput | { brain: Brain } |
POST | /api/brains/:id/chat | { question: string } | ChatAnswer |
DELETE | /api/brains/:id | — | 204 No Content |
Cada ruta aterriza en LocalLensApp en src/locallens.ts.
Elegir una carpeta en el navegador
La API <input type="file" webkitdirectory> le da al navegador el
contenido de la carpeta pero no su ruta absoluta. LocalLens
almacena el cerebro con una ruta virtual como browser://my-folder
así igual puedes saber de dónde vino.
Detener el servidor
Ctrl+C dispara el handler de SIGINT en src/server.ts. Llama a
app.close() y desmonta QVAC limpiamente:
process.on("SIGINT", async () => {
await app.close();
process.exit(0);
});