>_ DevTrendsen

Language

Home

Languages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Security
TypeScript

A Relational Database Disguised as Familiar Spreadsheets

Every developer eventually faces a situation where the business or management needs a convenient interface for working with data. Usually the options are limited. Either we deploy a cumbersome admin panel like Django Admin or Forest Admin, or hand everything over to Google Sheets, where within a week formulas break, data types get mixed up, and linking two tables via a foreign key turns into a nightmare with VLOOKUP.

A while back I came across grist-core — an open-source engine that tries to bridge two completely different worlds: relational databases and flexible spreadsheets.

https://github.com/user-attachments/assets/fe152f60-3d15-4b11-8cb2-05731a90d273

Under the Hood

Looking under the hood, Grist doesn't resemble standard Excel clones at all. In classic spreadsheets, a cell lives on its own: one row in a column might hold a number, the next a string, and below that a formula. In Grist, columns are strictly typed and work like fields in SQL tables.

At the same time, each document is just a regular SQLite file. This means your data isn't locked into proprietary storage. Any utility that can read SQLite will open an exported .grist file directly. From the perspective of backups and portability between servers, this approach significantly simplifies things: grab the file — grab the entire database.

Interesting fact: French government bodies (ANCT and DINUM) actively invest in the codebase, so the project consistently receives commits related to accessibility, localization, and enterprise security.

Python Instead of Macros and Formula Dialects

The main killer feature for anyone who can write code is computations in pure Python. There's no restricted syntax or strange extensions. Cell formulas accept standard Python syntax along with its standard library.

For example, you can freely use list comprehensions, string slicing, regular expressions, or the datetime module. If you're used to tabular functions like SUM or AVERAGE, they're available here too, but when logic gets complex, switching to Python saves a lot of nerves.

# Пример вычисления в колонке: вытаскиваем домен из email и форматируем
if $Email and "@" in $Email:
    domain = $Email.split("@")[1].lower()
    return f"Корпоративный: {domain}" if domain != "gmail.com" else "Личный"
return "Не указан"

Code executes in an isolated sandbox. Depending on the environment, you can configure isolation via gVisor on Linux, native sandbox-exec on macOS, or Pyodide via WebAssembly if you're deploying on Windows.

If you don't want to write formulas manually, there's a built-in AI assistant. You can connect it to OpenAI or configure any other models through OpenRouter, including Claude 3.7 Sonnet or local LLMs via LM Studio.

Data Relationships and Visual Dashboards

In Airtable or Notion, you often lack proper configuration of linked views on a single screen. In Grist, a workspace is divided into multiple cards or widgets that can be linked to each other by clicking:

  • Client table on the left filters the order list on the right.
  • Selecting an order instantly updates the detail card with Markdown description and attached files.
  • Built-in calendar, chart, and summary table widgets group metrics without creating intermediate hidden sheets.

Bidirectional references (two-way references) work out of the box: link a task to a sprint — the sprint automatically gets the task added to its linked tasks list.

Granular Access Control

Many open-source no-code tools fall short on security, offering access on an "all or nothing" basis. In grist-core, access rules are defined at the level of individual tables, rows, and columns.

Access conditions can also be set via formulas:

  • A manager sees only deals where their email matches the user.Email field.
  • The salary column is visible only to users with a specific SSO attribute.
  • Block editing of archived records if the Status == 'Closed' field is set.

For enterprise installations, OIDC, SAML, and forward-auth authentication via proxy (e.g., Traefik or Authentik) are supported, along with user provisioning via SCIM.

Quick Start in Docker

You can try out the engine locally in a couple of minutes with a single command:

docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist

After startup, open http://localhost:8484 in your browser. The container will output a generated boot key to the console for initial administrator setup. If you want to skip the wizard and get a single instance without extra questions, just pass the -e GRIST_IN_SERVICE=true environment variable.

Integration with external systems goes through the standard REST API and outbound webhooks. Moreover, webhooks are flexibly configurable: you can trigger events only when specific columns change or when a given logical condition is met.

Comparing Editions and Limitations

The grist-core repository is distributed under the Apache 2.0 license. The base Docker image gristlabs/grist contains optional proprietary code for Enterprise features, which is disabled by default. If you strictly need exclusively free software without third-party inclusions, the developers build a separate image gristlabs/grist-oss.

Some features are moved out of the pure core grist-core into the commercial version. For example, streaming audit logs, built-in email automation chains, and a native MCP server for AI clients. However, nothing prevents you from connecting the same Claude via community adapters using the standard REST API.

Interface translations are curated through the Weblate community:

Translation status

Translation detail

Who Will Benefit from This Project

If you're looking for a self-hosted replacement for Airtable without row limits and per-user subscription fees, Grist looks like a great candidate.

It perfectly covers needs for internal CRMs, inventory trackers, financial registries, and simple back-office panels. You get a full relational data model, the flexibility of Python scripts, and complete control over SQLite files on your own server.

Source code and documentation are available in the official repository gristlabs/grist-core.

Related projects