https://github.com/gristlabs/grist-core Skip to content Toggle navigation Sign up * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} gristlabs / grist-core Public * * Notifications * Fork 214 * Star 4.9k Grist is the evolution of spreadsheets. www.getgrist.com/ License Apache-2.0 license 4.9k stars 214 forks Activity Star Notifications * Code * Issues 211 * Pull requests 9 * Actions * Projects 1 * Security * Insights More * Code * Issues * Pull requests * Actions * Projects * Security * Insights gristlabs/grist-core This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. main Switch branches/tags [ ] Branches Tags Could not load branches Nothing to show {{ refName }} default View all branches Could not load tags Nothing to show {{ refName }} default View all tags Name already in use A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch? Cancel Create 28 branches 23 tags Code * Local * Codespaces * Clone HTTPS GitHub CLI [https://github.com/g] Use Git or checkout with SVN using the web URL. [gh repo clone gristl] Work fast with our official CLI. Learn more about the CLI. * Open with GitHub Desktop * Download ZIP Sign In Required Please sign in to use Codespaces. Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Launching Xcode If nothing happens, download Xcode and try again. Launching Visual Studio Code Your codespace will open once ready. There was a problem preparing your codespace, please try again. Latest commit @PeterDaveHello @weblate PeterDaveHello and weblate Added translation using Weblate (Chinese (Traditional)) ... 1685b88 Nov 2, 2023 Added translation using Weblate (Chinese (Traditional)) 1685b88 Git stats * 2,016 commits Files Permalink Failed to load latest commit information. Type Name Latest commit message Commit time .github (core) Update dependencies October 11, 2023 17:36 app allow bundled widgets to be hidden from dropdown, and nested (#714) October 30, 2023 21:13 bower_components (core) add Dockerfile for grist-core October 12, 2020 15:45 buildtools (core) New Columns Menu October 13, 2023 22:35 documentation (core) Upgrade to Python 3.11 August 4, 2023 18:19 plugins/core (core) Switch excel import parsing from messytables+xlrd to openpyxl,... May 12, 2022 14:43 sandbox (core) Fix error in sandbox when removing multiple summary source col... September 27, 2023 16:23 static Added translation using Weblate (Chinese (Traditional)) November 2, 2023 13:37 stubs/app (core) updates from grist-core October 30, 2023 09:20 test allow bundled widgets to be hidden from dropdown, and nested (#714) October 30, 2023 21:13 .dockerignore add a pyodide-based "sandbox" flavor (#437) March 6, 2023 16:56 .editorconfig Dump the rule for ACL formula warnings (#639) August 23, 2023 09:23 .eslintignore Fixing all eslint's reported error January 3, 2023 17:22 .eslintrc.js (core) bump mocha version to allow parallel tests; move more tests to... June 27, 2023 02:55 .gitignore (core) Update dependencies October 11, 2023 17:36 .nvmrc (core) Update dependencies October 11, 2023 17:36 .yarnrc (core) Preserving cursor position when linked state is removed. February 8, 2023 21:54 Dockerfile (core) Update dependencies October 11, 2023 17:36 LICENSE.txt (core) freshen core README; support python3 in grist-core docker image January 8, 2022 18:27 NOTICE.txt (core) freshen core README; support python3 in grist-core docker image January 8, 2022 18:27 README.md (core) updates from grist-core October 30, 2023 09:20 bin Initial config with a few files that build on client and server side. May 20, 2020 00:50 crowdin.yml Make a good part of the app localizable and add French translations ( #... October 28, 2022 09:11 package.json Add option to serve Prometheus metrics #671 (#693) October 24, 2023 17:36 tsconfig-ext.json (core) add machinery for self-managed flavor of Grist May 12, 2022 12:39 tsconfig.eslint.json Fixing all eslint's reported error January 3, 2023 17:22 tsconfig.json (core) configure typedoc for generating plugin api documentation April 4, 2022 18:11 yarn.lock Add option to serve Prometheus metrics #671 (#693) October 24, 2023 17:36 View code [ ] Grist Features Using Grist Building from source Logins Translations Why free and open source software Sponsors Reviews Environment variables AI Formula Assistant related variables (all optional): Sandbox related variables: Forward authentication variables: Plugins: Google Drive integrations: Database variables: Testing: Tests License README.md Grist Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database to organize your data and make you more productive. This repository, grist-core, is the heart of Grist, and has what you need to run a powerful spreadsheet hosting server. If you wish to view and edit spreadsheets stored locally, another option is to use the grist-electron desktop app for Linux, Mac, and Windows. And to show Grist spreadsheets on a website without any special back-end support, your options include grist-static, a fully in-browser build of Grist. The grist-core repository is the basis for all these options, and for the hosted spreadsheet services offered by Grist Labs, an NYC-based company that is the main developer of Grist, and by ANCT Donnees et Territoires, a French government agency whose developers have made many contributions to the code-base. The grist-core, grist-electron, and grist-static repositories are all open-source (Apache License, Version 2.0). grist.mp4 Features Grist is a hybrid database/spreadsheet, meaning that: * Columns work like they do in databases. They are named, and hold one kind of data. * Columns can be filled by formula, spreadsheet-style, with automatic updates when referenced cells change. This difference can confuse people coming directly from Excel or Google Sheets. Give it a chance! If you are coming from Airtable, you'll find the model familiar though (and there's a Grist vs Airtable article that might interest you). Here are some specific feature highlights of Grist: * Python formulas. + Full Python syntax is supported, and the standard library. + Many Excel functions also available. * A portable, self-contained format. + Based on SQLite, the most widely deployed database engine. + Any tool that can read SQLite can read numeric and text data from a Grist file. + Great format for backups that you can be confident you can restore in full. + Great format for moving between different hosts. * Can be displayed on a static website with grist-static, no special server needed. * There's a self-contained desktop app available for viewing and editing: grist-electron. * Convenient editing and formatting features. + Choices and choice lists, for adding colorful tags to records without fuss. + References and reference lists, for cross-referencing records in other tables. + Attachments, to include media or document files in records. + Dates and times, toggles, and special numerics such as currency all have specialized editors and formatting options. + Conditional Formatting, letting you control the style of cells with formulas, to draw attention to important information. * Great for dashboards, visualizations, and data entry. + Charts for visualization. + Summary tables for summing and counting across groups. + Widget linking streamlines filtering and editing data. Grist has a unique approach to visualization, where you can lay out and link distinct widgets to show together, without cramming mixed material into a table. + The Filter bar is great for quick slicing and dicing. * Incremental imports. + So you can import a CSV of the last three months activity from your bank... + ... and import new activity a month later without fuss or duplicates. * Integrations. + A REST API, Zapier actions/triggers, and support from similar integrators. + Import/export to Google drive, Excel format, CSV. + Can link data with custom widgets hosted externally. + You can set up outgoing webhooks. * Many templates to get you started, from investment research to organizing treasure hunts. * Access control options. + (You'll need SSO logins set up to make use of these options; grist-omnibus has a prepackaged solution if configuring this feels daunting) + Share individual documents, or workspaces, or team sites. + Control access to individual rows, columns, and tables. + Control access based on cell values and user attributes. * Can be self-maintained. + Useful for intranet operation and specific compliance requirements. * Sandboxing options for untrusted documents. + On Linux or with docker, you can enable gVisor sandboxing at the individual document level. + On OSX, you can use native sandboxing. + On any OS, including Windows, you can use a wasm-based sandbox. * Translated to many languages. * Support for an AI Formula Assistant (using OpenAI gpt-3.5-turbo or comparable models). * F1 key brings up some quick help. This used to go without saying. In general Grist has good keyboard support. * We post progress on X or Twitter or whatever. If you are curious about where Grist is going heading, see our roadmap, drop a question in our forum, or browse our extensive documentation. Using Grist If you just want a quick demo of Grist: * You can try Grist out at the hosted service run by Grist Labs at docs.getgrist.com (no registration needed). * Or you can see an experimental fully in-browser build of Grist at gristlabs.github.io/grist-static. * Or you can download Grist as a desktop app from github.com/ gristlabs/grist-electron. To get grist-core running on your computer with Docker, do: docker pull gristlabs/grist docker run -p 8484:8484 -it gristlabs/grist Then visit http://localhost:8484 in your browser. You'll be able to create, edit, import, and export documents. To preserve your work across docker runs, share a directory as /persist: docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist Get templates at templates.getgrist.com for payroll, inventory management, invoicing, D&D encounter tracking, and a lot more, or use any document you've created on docs.getgrist.com. If you need to change the port Grist runs on, set a PORT variable, don't just change the port mapping: docker run --env PORT=9999 -p 9999:9999 -v $PWD/persist:/persist -it gristlabs/grist To enable gVisor sandboxing, set --env GRIST_SANDBOX_FLAVOR=gvisor. This should work with default docker settings, but may not work in all environments. You can find a lot more about configuring Grist, setting up authentication, and running it on a public server in our Self-Managed Grist handbook. Building from source To build Grist from source, follow these steps: yarn install yarn run build:prod yarn run install:python yarn start # Grist will be available at http://localhost:8484/ Grist formulas in documents will be run using Python executed directly on your machine. You can configure sandboxing using a GRIST_SANDBOX_FLAVOR environment variable. * On OSX, export GRIST_SANDBOX_FLAVOR=macSandboxExec uses the native sandbox-exec command for sandboxing. * On Linux with gVisor's runsc installed, export GRIST_SANDBOX_FLAVOR=gvisor is an option. * On any OS including Windows, export GRIST_SANDBOX_FLAVOR=pyodide is available. These sandboxing methods have been written for our own use at Grist Labs and may need tweaking to work in your own environment - pull requests very welcome here! Logins Like git, Grist has features to track document revision history. So for full operation, Grist expects to know who the user modifying a document is. Until it does, it operates in a limited anonymous mode. To get you going, the docker image is configured so that when you click on the "sign in" button Grist will attribute your work to you@example.com. Change this by setting GRIST_DEFAULT_EMAIL: docker run --env GRIST_DEFAULT_EMAIL=my@email -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist You can change your name in Profile Settings in the User Menu. For multi-user operation, or if you wish to access Grist across the public internet, you'll want to connect it to your own Single Sign-On service. There are a lot of ways to do this, including SAML and forward authentication. Grist has been tested with Authentik, Auth0, and Google/Microsoft sign-ins via Dex. Translations We use Weblate to manage translations. Thanks to everyone who is pitching in. Thanks especially to the ANCT developers who did the hard work of making a good chunk of the application localizable. Merci bien! Translation status Why free and open source software This repository, grist-core, is maintained by Grist Labs. Our flagship product available at getgrist.com is built from the code you see here, combined with business-specific software designed to scale it to many users, handle billing, etc. Grist Labs is an open-core company. We offer Grist hosting as a service, with free and paid plans. We also develop and sell features related to Grist using a proprietary license, targeted at the needs of enterprises with large self-managed installations. We see data portability and autonomy as a key value Grist can bring to our users, and grist-core as an essential means to deliver that. We are committed to maintaining and improving the grist-core codebase, and to be thoughtful about how proprietary offerings impact data portability and autonomy. By opening its source code and offering an OSI-approved free license, Grist benefits its users: * Developer community. The freedom to examine source code, make bug fixes, and develop new features is a big deal for a general-purpose spreadsheet-like product, where there is a very long tail of features vital to someone somewhere. * Increased trust. Because anyone can examine the source code, "security by obscurity" is not an option. Vulnerabilities in the code can be found by others and reported before they cause damage. * Independence. Grist is available to you regardless of the fortunes of the Grist Labs business, since it is open source and can be self-hosted. Using our hosted solution is convenient, but you are not locked in. * Price flexibility. If you are low on funds but have time to invest, self-hosting is a great option to have. And DIY users may have the technical savvy and motivation to delve in and make improvements, which can benefit all users of Grist. * Extensibility. For developers, having the source open makes it easier to build extensions (such as the experimental Custom Widget). You can more easily include Grist in your pipeline. And if a feature is missing, you can just take the source code and build on top of it. Sponsors [228914] Reviews * Grist on ProductHunt * Grist on AppSumo (life-time deal is sold out) * Capterra, G2, TrustRadius Environment variables Grist can be configured in many ways. Here are the main environment variables it is sensitive to: Variable Purpose comma-separated list of permitted domains to use in webhooks (e.g. webhook.site,zapier.com). You can set this to * to allow all domains, ALLOWED_WEBHOOK_DOMAINS but if doing so, we recommend using a carefully locked-down proxy (see GRIST_HTTPS_PROXY) if you do not entirely trust users. Otherwise services on your internal network may become vulnerable to manipulation. APP_DOC_URL doc worker url, set when starting an individual doc worker (other servers will find doc worker urls via redis) APP_HOME_URL url prefix for home api (home and doc servers need this) APP_STATIC_URL url prefix for static resources APP_STATIC_INCLUDE_CUSTOM_CSS set to "true" to include custom.css (from APP_STATIC_URL) in static pages APP_UNTRUSTED_URL URL at which to serve/expect plugin content. GRIST_ADAPT_DOMAIN set to "true" to support multiple base domains (careful, host header should be trustworthy) GRIST_ALLOWED_HOSTS comma-separated list of permitted domains origin for requests (e.g. my.site,another.com) GRIST_APP_ROOT directory containing Grist sandbox and assets (specifically the sandbox and static subdirectories). GRIST_BACKUP_DELAY_SECS wait this long after a doc change before making a backup GRIST_DATA_DIR directory in which to store document caches. GRIST_DEFAULT_EMAIL if set, login as this user if no other credentials presented GRIST_DEFAULT_PRODUCT if set, this controls enabled features and limits of new sites. See names of PRODUCTS in Product.ts. GRIST_DEFAULT_LOCALE Locale to use as fallback when Grist cannot honour the browser locale. GRIST_DOMAIN in hosted Grist, Grist is served from subdomains of this domain. Defaults to "getgrist.com". GRIST_EXPERIMENTAL_PLUGINS enables experimental plugins enables the REQUEST function. This function performs HTTP requests in a similar way to requests.request. This function presents a GRIST_ENABLE_REQUEST_FUNCTION significant security risk, since it can let users call internal endpoints when Grist is available publicly. This function can also cause performance issues. Unset by default. comma-separated list of UI features to disable. Allowed names of parts: GRIST_HIDE_UI_ELEMENTS helpCenter,billing,templates,multiSite,multiAccounts,sendToDrive,tutorials . If a part also exists in GRIST_UI_FEATURES, it will still be disabled. GRIST_HOME_INCLUDE_STATIC if set, home server also serves static resources GRIST_HOST hostname to use when listening on a port. GRIST_HTTPS_PROXY if set, use this proxy for webhook payload delivery. GRIST_ID_PREFIX for subdomains of form o-, expect or produce o-${GRIST_ID_PREFIX}. GRIST_IGNORE_SESSION if set, Grist will not use a session for authentication. GRIST_INST_DIR path to Grist instance configuration files, for Grist server. GRIST_LIST_PUBLIC_SITES if set to true, sites shared with the public will be listed for anonymous users. Defaults to false. GRIST_MANAGED_WORKERS if set, Grist can assume that if a url targeted at a doc worker returns a 404, that worker is gone GRIST_MAX_UPLOAD_ATTACHMENT_MB max allowed size for attachments (0 or empty for unlimited). GRIST_MAX_UPLOAD_IMPORT_MB max allowed size for imports (except .grist files) (0 or empty for unlimited). if set, all translated langauages are offered to the user (by GRIST_OFFER_ALL_LANGUAGES default, only languages with a special 'good enough' key set are offered to user). GRIST_ORG_IN_PATH if true, encode org in path rather than domain GRIST_PAGE_TITLE_SUFFIX a string to append to the end of the