Una base de datos relacional disfrazada de hojas de cálculo familiares
Todo desarrollador eventualmente se enfrenta a una situación donde el negocio o la gerencia necesita una interfaz conveniente para trabajar con datos. Por lo general, las opciones son limitadas. O desplegamos un panel de administración engorroso como Django Admin o Forest Admin, o entregamos todo a Google Sheets, donde en una semana las fórmulas se rompen, los tipos de datos se mezclan, y vincular dos tablas mediante una clave foránea se convierte en una pesadilla con VLOOKUP.
Hace un tiempo descubrí grist-core — un motor de código abierto que intenta tender un puente entre dos mundos completamente diferentes: las bases de datos relacionales y las hojas de cálculo flexibles.
https://github.com/user-attachments/assets/fe152f60-3d15-4b11-8cb2-05731a90d273
Bajo el Capó
Mirando bajo el capó, Grist no se parece en nada a los clones estándar de Excel. En las hojas de cálculo clásicas, una celda vive por su cuenta: una fila en una columna podría contener un número, la siguiente una cadena, y debajo una fórmula. En Grist, las columnas están estrictamente tipadas y funcionan como campos en tablas SQL.
Al mismo tiempo, cada documento es simplemente un archivo SQLite regular. Esto significa que tus datos no están bloqueados en un almacenamiento propietario. Cualquier utilidad que pueda leer SQLite abrirá directamente un archivo .grist exportado. Desde la perspectiva de las copias de seguridad y la portabilidad entre servidores, este enfoque simplifica significativamente las cosas: toma el archivo — toma toda la base de datos.
Dato interesante: los organismos gubernamentales franceses (ANCT y DINUM) invierten activamente en el código base, por lo que el proyecto recibe constantemente commits relacionados con accesibilidad, localización y seguridad empresarial.
Python en Lugar de Macros y Dialectos de Fórmulas
La característica principal para cualquiera que pueda escribir código son los cálculos en Python puro. No hay sintaxis restringida ni extensiones extrañas. Las fórmulas de celdas aceptan sintaxis estándar de Python junto con su biblioteca estándar.
Por ejemplo, puedes usar libremente list comprehensions, slicing de cadenas, expresiones regulares, o el módulo datetime. Si estás acostumbrado a funciones tabulares como SUM o AVERAGE, también están disponibles aquí, pero cuando la lógica se vuelve compleja, cambiar a Python ahorra muchos nervios.
# Пример вычисления в колонке: вытаскиваем домен из email и форматируем
if $Email and "@" in $Email:
domain = $Email.split("@")[1].lower()
return f"Корпоративный: {domain}" if domain != "gmail.com" else "Личный"
return "Не указан"
El código se ejecuta en un sandbox aislado. Dependiendo del entorno, puedes configurar el aislamiento mediante gVisor en Linux, sandbox-exec nativo en macOS, o Pyodide a través de WebAssembly si estás desplegando en Windows.
Si no quieres escribir fórmulas manualmente, hay un asistente de IA integrado. Puedes conectarlo a OpenAI o configurar cualquier otro modelo a través de OpenRouter, incluyendo Claude 3.7 Sonnet o LLMs locales a través de LM Studio.
Relaciones de Datos y Paneles Visuales
En Airtable o Notion, a menudo careces de una configuración adecuada de vistas vinculadas en una sola pantalla. En Grist, un espacio de trabajo se divide en múltiples tarjetas o widgets que pueden vincularse entre sí con un clic:
- La tabla de clientes a la izquierda filtra la lista de pedidos a la derecha.
- Seleccionar un pedido actualiza instantáneamente la tarjeta de detalles con descripción en Markdown y archivos adjuntos.
- Los widgets integrados de calendario, gráficos y tablas de resumen agrupan métricas sin crear hojas intermedias ocultas.
Las referencias bidireccionales (two-way references) funcionan de fábrica: vincula una tarea a un sprint — el sprint automáticamente obtiene la tarea agregada a su lista de tareas vinculadas.
Control de Acceso Granular
Muchas herramientas no-code de código abierto son deficientes en seguridad, ofreciendo acceso en base a "todo o nada". En grist-core, las reglas de acceso se definen a nivel de tablas individuales, filas y columnas.
Las condiciones de acceso también se pueden establecer mediante fórmulas:
- Un gerente ve solo los tratos donde su correo electrónico coincide con el campo
user.Email. - La columna de salario es visible solo para usuarios con un atributo SSO específico.
- Bloquear la edición de registros archivados si el campo
Status == 'Closed'está establecido.
Para instalaciones empresariales, se admiten autenticación OIDC, SAML y forward-auth a través de proxy (por ejemplo, Traefik o Authentik), junto con el aprovisionamiento de usuarios a través de SCIM.
Inicio Rápido en Docker
Puedes probar el motor localmente en un par de minutos con un solo comando:
docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist
Después del inicio, abre http://localhost:8484 en tu navegador. El contenedor mostrará una clave de inicio generada en la consola para la configuración inicial del administrador. Si quieres omitir el asistente y obtener una instancia única sin preguntas adicionales, simplemente pasa la variable de entorno -e GRIST_IN_SERVICE=true.
La integración con sistemas externos se realiza a través de la API REST estándar y webhooks salientes. Además, los webhooks son altamente configurables: puedes activar eventos solo cuando cambian columnas específicas o cuando se cumple una condición lógica determinada.
Comparando Ediciones y Limitaciones
El repositorio grist-core se distribuye bajo la licencia Apache 2.0. La imagen Docker base gristlabs/grist contiene código propietario opcional para funciones empresariales, que está deshabilitado por defecto. Si necesitas estrictamente software exclusivamente libre sin inclusiones de terceros, los desarrolladores construyen una imagen separada gristlabs/grist-oss.
Algunas características se han movido del núcleo puro grist-core a la versión comercial. Por ejemplo, logs de auditoría en streaming, cadenas de automatización de correo electrónico integradas y un servidor MCP nativo para clientes de IA. Sin embargo, nada te impide conectar el mismo Claude a través de adaptadores de la comunidad usando la API REST estándar.
Las traducciones de la interfaz son gestionadas a través de la comunidad Weblate:
Quién se Beneficiará de Este Proyecto
Si buscas un reemplazo autoalojado para Airtable sin límites de filas y tarifas de suscripción por usuario, Grist parece un gran candidato.
Cubre perfectamente necesidades de CRMs internos, rastreadores de inventario, registros financieros y paneles simples de back-office. Obtienes un modelo de datos relacional completo, la flexibilidad de scripts en Python y control total sobre los archivos SQLite en tu propio servidor.
El código fuente y la documentación están disponibles en el repositorio oficial gristlabs/grist-core.
Proyectos relacionados