https://github.com/gristlabs/grist-core Skip to content Sign up * Why GitHub? + Features + Mobile + Actions + Codespaces + Packages + Security + Code review + Issues + Integrations + GitHub Sponsors + Customer stories * Team * Enterprise * Explore + Explore GitHub + Learn and contribute + Topics + Collections + Trending + Learning Lab + Open source guides + Connect with others + The ReadME Project + Events + Community forum + GitHub Education + GitHub Stars program * Marketplace * Pricing + Plans + Compare plans + Contact Sales + Education [ ] * # In this repository All GitHub | Jump to | * No suggested jump to results * # In this repository All GitHub | Jump to | * # In this organization All GitHub | Jump to | * # In this repository All GitHub | Jump to | Sign in Sign up {{ message }} gristlabs / grist-core Public * Notifications * Fork 62 * Star 1.6k * Grist is the evolution of spreadsheets. support.getgrist.com Apache-2.0 License 1.6k stars 62 forks Star Notifications * Code * Issues 46 * Pull requests 25 * Actions * Projects 1 * Wiki * Security * Insights More * Code * Issues * Pull requests * Actions * Projects * Wiki * Security * Insights 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 26 branches 4 tags Code Latest commit @paulfitz paulfitz Merge pull request #132 from mscherer/patch-1 ... bf7c46c Feb 18, 2022 Merge pull request #132 from mscherer/patch-1 Fix more links bf7c46c Git stats * 609 commits Files Permalink Failed to load latest commit information. Type Name Latest commit message Commit time .github/workflows (core) run test:docker target prior to pushing grist-core image Dec 14, 2021 app (core) Remove UI-imposed restriction against combining public edit ac... Feb 17, 2022 bower_components (core) add Dockerfile for grist-core Oct 12, 2020 buildtools (core) Move user profile to new page and begin MFA work Jan 14, 2022 plugins/core (core) Move file import plugins into core/sandbox/grist Aug 9, 2021 sandbox (core) Update documentation of CURRENT_CONVERSION function Feb 16, 2022 static (core) Add new Grist sign-up page Feb 14, 2022 stubs/app (core) Add new Grist sign-up page Feb 14, 2022 test (core) Add new Grist sign-up page Feb 14, 2022 .dockerignore (core) fix some rusting of the grist-core build Nov 30, 2021 .gitignore (core) fix browser check and favicon in grist-core Jan 5, 2022 Dockerfile (core) persist logins across docker restarts by default Jan 18, 2022 LICENSE.txt (core) freshen core README; support python3 in grist-core docker image Jan 8, 2022 NOTICE.txt (core) freshen core README; support python3 in grist-core docker image Jan 8, 2022 README.md Fix links Feb 18, 2022 bin Initial config with a few files that build on client and server side. May 20, 2020 ormconfig.js (core) move home server into core Jul 22, 2020 package.json (core) Move user profile to new page and begin MFA work Jan 14, 2022 tsconfig.json (core) freshen grist-core build Apr 3, 2021 yarn.lock (core) Move user profile to new page and begin MFA work Jan 14, 2022 View code [ ] Grist Features Using Grist Building from source Logins Why free and open source software Reviews Environment variables 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. grist.mp4 Features (By popular request: we have a specific write-up of Grist vs Airtable that may be helpful). 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. 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. * 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. * 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. * 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) + 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. 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 There are docker images set up for individual use, or (with some configuration) for self-hosting. Grist Labs offers a hosted service at docs.getgrist.com. To run Grist 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 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/ 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, and/or if you wish to access Grist across the public internet, you'll want to connect it to your own single sign-in service SAML. Grist has been tested with Authentik and Auth0. 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 intend to 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. 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 ALLOWED_WEBHOOK_DOMAINS domains to use in webhooks (e.g. webhook.site,zapier.com) doc worker url, set when starting an APP_DOC_URL 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_UNTRUSTED_URL URL at which to serve/expect plugin content. set to "true" to support multiple base GRIST_ADAPT_DOMAIN domains (careful, host header should be trustworthy) directory containing Grist sandbox and GRIST_APP_ROOT 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 if set, this controls enabled features GRIST_DEFAULT_PRODUCT and limits of new sites. See names of PRODUCTS in Product.ts. in hosted Grist, Grist is served from GRIST_DOMAIN subdomains of this domain. Defaults to "getgrist.com". GRIST_EXPERIMENTAL_PLUGINS enables experimental plugins GRIST_HOME_INCLUDE_STATIC if set, home server also serves static resources GRIST_HOST hostname to use when listening on a port. GRIST_ID_PREFIX for subdomains of form o-, expect or produce o-${GRIST_ID_PREFIX}. GRIST_INST_DIR path to Grist instance configuration files, for Grist server. host of cognito-based login helper, if GRIST_LOGIN_REDIRECT_HOST applicable (usually login.getgrist.com). if set, Grist can assume that if a url GRIST_MANAGED_WORKERS 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). max allowed size for imports (except GRIST_MAX_UPLOAD_IMPORT_MB .grist files) (0 or empty for unlimited). GRIST_ORG_IN_PATH if true, encode org in path rather than domain optional url for an api that allows GRIST_ROUTER_URL servers to be (un)registered with a load balancer set to "true" to access home server and doc workers on the same GRIST_SERVE_SAME_ORIGIN protocol-host-port as the top-level page, same as for custom domains (careful, host header should be trustworthy) GRIST_SESSION_COOKIE if set, overrides the name of Grist's cookie if set, associates the cookie with the GRIST_SESSION_DOMAIN given domain - otherwise defaults to GRIST_DOMAIN GRIST_SESSION_SECRET a key used to encode sessions GRIST_SINGLE_ORG set to an org "domain" to pin client to that org if set to 'true', show UI for GRIST_SUPPORT_ANON anonymous access (not shown by default) GRIST_THROTTLE_CPU if set, CPU throttling is enabled GRIST_USER_ROOT an extra path to look for plugins in. port number to listen on for REST API HOME_PORT server; if set to "share", add API endpoints to regular grist port. PORT port number to listen on for Grist server REDIS_URL optional redis server for browser sessions and db query caching Sandbox related variables: Variable Purpose can be pynbox, unsandboxed, docker, or GRIST_SANDBOX_FLAVOR macSandboxExec. If set, forces Grist to use the specified kind of sandbox. a program or image name to run as the GRIST_SANDBOX sandbox. See NSandbox.ts for nerdy details. can be 2 or 3. If set, documents without PYTHON_VERSION an engine setting are assumed to use the specified version of python. Not all sandboxes support all versions. can be 2 or 3. If set, newly created PYTHON_VERSION_ON_CREATION documents have an engine setting set to python2 or python3. Not all sandboxes support all versions. Google Drive integrations: Variable Purpose GOOGLE_CLIENT_ID set to the Google Client Id to be used with Google API client GOOGLE_CLIENT_SECRET set to the Google Client Secret to be used with Google API client GOOGLE_API_KEY set to the Google API Key to be used with Google API client (accessing public files) GOOGLE_DRIVE_SCOPE set to the scope requested for Google Drive integration (defaults to drive.file) Database variables: Variable Purpose TYPEORM_DATABASE database filename for sqlite or database name for other db types TYPEORM_HOST host for db TYPEORM_LOGGING set to 'true' to see all sql queries TYPEORM_PASSWORD password to use TYPEORM_PORT port number for db if not the default for that db type TYPEORM_TYPE set to 'sqlite' or 'postgres' TYPEORM_USERNAME username to connect as Testing: Variable Purpose GRIST_TESTING_SOCKET a socket used for out-of-channel communication during tests only. GRIST_TEST_HTTPS_OFFSET if set, adds https ports at the specified offset. This is useful in testing. GRIST_TEST_SSL_CERT if set, contains filename of SSL certificate. GRIST_TEST_SSL_KEY if set, contains filename of SSL private key. GRIST_TEST_LOGIN allow fake unauthenticated test logins (suitable for dev environment only). GRIST_TEST_ROUTER if set, then the home server will serve a mock version of router api at /test/router License This repository, grist-core, is released under the Apache License, Version 2.0, which is an OSI-approved free software license. See LICENSE.txt and NOTICE.txt for more information. About Grist is the evolution of spreadsheets. support.getgrist.com Topics awesome database spreadsheet Resources Readme License Apache-2.0 License Stars 1.6k stars Watchers 18 watching Forks 62 forks Contributors 10 * @paulfitz * @dsagal * @alexmojaki * @berhalak * @cpind * @georgegevoian * @nataliemisasi * @mscherer * @matthiaskoenig * @combinatorist Languages * TypeScript 65.6% * Python 22.8% * JavaScript 10.1% * CSS 1.3% * HTML 0.1% * Dockerfile 0.1% * (c) 2022 GitHub, Inc. * Terms * Privacy * Security * Status * Docs * Contact GitHub * Pricing * API * Training * Blog * About You can't perform that action at this time. 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.