Bento es un workspace de escritorio modular y open source. Una caja donde pones los paneles que quieras: reproductor TV, terminal real, navegador, notas, monitores, lo que se te ocurra.
Inspirado en VSCode, pero genérico: no asume que trabajas con código. Funciona en Linux, macOS, Windows. Paneles redimensionables, tabs, workspaces guardados, ventanas flotantes, multi-window.
Estado: paneles Terminal, TV, Web, Notas y HTTP funcionando, con sesiones atadas a proyecto, temas, layout tile/tabs, persistencia y un asistente de IA opcional vía terminal. Pendiente: ventanas flotantes y multi-window.
| Panel | Qué hace |
|---|---|
| Terminal | Shell real (xterm + PTY): temas por terminal, perfiles, búsqueda, historial, zoom, restaura el directorio al reabrir |
| TV | IPTV con HLS.js: lista de canales (M3U + iptv-org), favoritos, embeds (YouTube/Twitch…) |
| Web | Navegador embebido (webview nativo): bookmarks por proyecto, historial, user-agent por sitio |
| Notas | Editor markdown en archivos .md (~/.config/bento/notes/): frontmatter (categoría, tags), vista previa, undo propio |
| HTTP | Cliente tipo Postman: métodos, cabeceras, body, plantillas, e importa OpenAPI/Swagger como colecciones navegables |
Sesiones = proyectos: una sesión se ata a la carpeta de la terminal activa, y las terminales nuevas arrancan ahí.
Un workspace modular y personal donde:
- Cada panel es independiente: TV, terminal, navegador, notas, lo que quieras.
- Los paneles se organizan en un layout tile (como VSCode) o flotante (como Photoshop).
- Puedes tener múltiples tabs dentro de cada panel (varias terminales, varios canales).
- Los layouts se guardan como workspaces — cada uno es una configuración completa.
- Las ventanas flotantes persisten entre workspaces.
- Multi-window: varios windows reales del SO, útil para 2+ monitores.
- Open source desde el principio: MIT license, aportes bienvenidos.
| Componente | Decisión | Por qué |
|---|---|---|
| Framework app | Tauri 2 | 5-15 MB binarios; WebView del sistema; backend Rust seguro |
| Backend | Rust | Requerido por Tauri; pty, plugins nativos |
| Frontend | TypeScript + Vite | Tipado, HMR rápido, soporte nativo de Tauri |
| Layout system | Dockview | Paneles tile + tabs + floating |
| Terminal | xterm.js + portable-pty | Emulador profesional; shell real |
| Reproducción | hls.js + HTML5 Audio | Streaming adaptativo |
| Persistencia | JSON en ~/.config/bento/ | Sin BBDD; versionable |
| Licencia | MIT | Máxima permisividad |
El entorno de desarrollo corre 100% en Docker. No necesitas instalar Rust, Node ni nada más — solo Docker Desktop y un servidor X11 para mostrar la ventana gráfica.
Instala Docker Desktop para tu SO.
Además, según tu SO, necesitas un servidor X11:
Instala XQuartz (vídeo) y PulseAudio (audio):
brew install --cask xquartz
brew install pulseaudioLuego:
- Abre XQuartz
- Ve a XQuartz → Preferences → Security
- Activa "Allow connections from network clients"
- Cierra y vuelve a abrir XQuartz
make dev arranca PulseAudio automáticamente.
Ya tienes X11. No necesitas instalar nada extra.
Instala VcXsrv:
- Descarga e instala VcXsrv
- Lánzalo con XLaunch: selecciona "Multiple windows" → "Start no client" → activa "Disable access control"
- VcXsrv quedará corriendo en la bandeja del sistema
git clone <repo>
cd bento
make setupmake setup construye la imagen Docker con Rust, Node, Tauri CLI y todas las dependencias.
# 1. Abre XQuartz (si no está abierto)
open -a XQuartz
# 2. Autoriza conexiones desde Docker
xhost +127.0.0.1
# 3. Lanza la app
make devmake dev# 1. Asegúrate de que VcXsrv está corriendo
# 2. Lanza la app
$env:DISPLAY = "host.docker.internal:0"
docker-compose run --rm bento sh -c 'dbus-run-session -- npm run tauri:dev'make dev-native # desarrollo nativo en el host (sin Docker)
make build # genera binarios de distribución
make shell # abre una shell dentro del contenedor
make test # ejecuta los testsNota sobre el terminal: dentro de Docker el WebView es WebKit2GTK sobre X11, que no enruta el teclado al terminal embebido (xterm.js). El resto de paneles funcionan. Para probar el terminal usa
make dev-native(requiere Rust + Node en el host) o el binario distribuido — en WKWebView (macOS) y WebView2 (Windows) el teclado funciona con normalidad.
Los binarios para distribución (.AppImage, .dmg, .msi) se generan automáticamente en GitHub Actions (matrix: Linux/macOS/Windows) en cada push a main.
bento/
├── package.json / tsconfig.json / vite.config.ts
├── index.html
├── src/ ← Frontend (TypeScript)
│ ├── main.ts ← composition root: registra paneles, monta la app
│ ├── app/ ← createSessionManager, createWorkspaceView
│ ├── core/ ← lógica pura testeada (session, terminal, channel, web, notes, http…)
│ ├── panels/ ← terminal/, tv/, web/, notes/, http/ + registry
│ ├── ui/ ← commandPalette, contextMenu, icons, preferencias
│ ├── adapters/ · ports/ ← repos (canales, favoritos, estado) e interfaces
│ ├── assets/ ← M3U bundled, etc.
│ └── styles.css
├── src-tauri/ ← Backend (Rust)
│ ├── Cargo.toml · tauri.conf.json · icons/
│ └── src/
│ ├── main.rs ← comandos (http_request…) + menú + arranque
│ ├── pty.rs ← terminal PTY (+ restaura cwd)
│ ├── web_panel.rs ← webview nativo embebido
│ ├── notes.rs ← notas como archivos .md
│ ├── traffic_lights.rs ← semáforos macOS
│ └── window_prefs.rs ← decoraciones de ventana
├── tests/ ← Vitest (núcleo puro)
└── README.md
- Fase 0: Setup entorno ✅
- Fase 1: Scaffold Tauri mínimo ✅
- Fase 2: Layout con paneles (Dockview: splits, mover, maximizar) ✅
- Fase 3: Panel TV (IPTV + hls.js, favoritos, embeds) ✅
- Fase 4: Terminal embebida (xterm.js + PTY, temas, perfiles, búsqueda) ✅
- Fase 5: Tabs dentro de paneles ✅
- Fase 6: Persistencia y sesiones (renombrar, duplicar, export/import) ✅
- Fase 7: Panel Web (webview nativo, bookmarks, historial) ✅
- Fase 8: Panel Notas (archivos
.md, frontmatter, vista previa) ✅ - Fase 9: Sesiones atadas a proyecto ✅
- Fase 10: Panel HTTP (cliente REST + import OpenAPI/Swagger) ✅
- Fase 11: Ventanas flotantes — pendiente
- Fase 12: Multi-window (varios windows del SO) — pendiente
- Fase 13: Pulido y distribución — en curso
bento no trae IA empaquetada: es un workspace, no un agente. Pero como sus terminales son reales, puedes correr ahí cualquier agente de IA. Lo único que bento aporta es que al reabrir, la terminal vuelve al proyecto donde estaba (vía OSC 7), así el agente trabaja sobre el código correcto.
El motor de contexto y el agente los instalas tú:
| Pieza | Rol | Instalación |
|---|---|---|
| lexis | Motor de contexto: indexa el código y se lo da "masticado" al agente vía MCP | cd lexis && npm link |
| OpenCode (o aider, cline, Claude Code…) | Agente que edita el código, multi-proveedor (gratis y de pago) | ver su web |
# 1. lexis disponible como comando (una vez)
cd /ruta/a/lexis && npm link
# 2. Conecta lexis como MCP a tu agente
lexis setup --client opencode --global # o claude-code, cursor, cline…
# 3. En una terminal de bento, dentro de tu proyecto:
cd ~/mi-proyecto
lexis index . # indexa el proyecto (una vez)
opencode # o claude — el agente ya tiene el contexto de lexisEl flujo: lexis da el contexto preciso → el agente (con su propia key) implementa los cambios. bento es el espacio donde todo ocurre.
La API key la gestiona cada agente con su propio login (
opencode auth, etc.). Para preguntas rápidas:lexis ask "qué hace X"con tu modelo configurado.
MIT — libre para usar, modificar y distribuir.