Releases: gristlabs/grist-core
Release list
v1.7.17
What's Changed
New features
- Row numbers, row IDs, or neither. A new "Row numbers" setting on grid widgets, in Grid Options and in a menu at the grid's top-left corner. Choose Numbers (position in the current sort, as before), Row IDs (bracketed like
[15], matching how references render), or Hidden, which collapses the left-hand gutter. Addresses #220, open since 2022, and #1927. (#2448) - Setup checklist for notifications and automations. Notifications, automations, invite emails, and the AI assistant each need plumbing behind them (an email backend, a Redis queue, an AI provider, the full edition), and when a prerequisite is missing the feature simply isn't there. Document Settings now lists what's ready and what each unfinished feature is waiting on. Users can press "Ask the admin" to request a step; admins see the requests in a new Admin Panel item. (commit)
- Switch to the full edition from the Admin Panel. Previously this meant changing Docker image. Now it's a button, in the Admin Panel or the first step of Quick Setup: the server downloads the extensions matching its own version, checks their SHA-256, and restarts in place. Offered on release builds only, not on
main, nightlies, or dev checkouts.GRIST_EXT_FULL_EDITION_BASE_URLpoints it at a mirror, or turns it off for air-gapped installs. (#2450) - "Help us improve" in Quick Setup. First-time setup now ends with an optional card: how you heard about Grist, what kind of user you are, and a switch subscribing an email address to product and security updates. It appears during setup only, and if you leave it blank nothing is sent at all. What you fill in goes to Grist Labs, along with your installation ID. (commit)
Improvements
- Accessibility
- Modals and popups are announced as dialogs by screen readers, and Tab is trapped inside an open modal. Fixes a Mousetrap bug that let keyboard focus wander behind a modal. Contributed by @manuhabitela (#2371). Keyboard focus now works from the tooltip-style popups inside modals as well (commit)
- API
- Temporary row IDs are now translated inside RefList values, not just Ref values and row-ID positions. Rows that reference each other through RefList columns can be created in one bundle (#2477)
- UI/UX
- The Grist edition and version show in the left panel footer, with links to compare editions and to release notes. Previously visible only in the Admin Panel (#2470)
- Internationalization
- Documentation
documentation/database.mdis back in sync with the schema, with a regenerated home DB diagram. Contributed by @fflorent (#2458)- Freshened the comments that feed the generated reference on support.getgrist.com, with formatting fixes and a broken link repaired (#2462)
- The README caught up with the last several releases: accessibility, Automations, OAuth apps, the MCP server, three new environment variables, and a table of full edition feature flags (#2443)
Fixes
- "View as" is preserved for attachment previews and whole-document exports, which previously resolved as the document owner (#2478)
- An Airtable reference column holding a single value imported as unusable text rather than a working reference, leaving the raw Airtable ID behind as alt text (#2446)
- Airtable count columns no longer error when the column they count was imported as a Ref rather than a RefList (#2447)
- In Markdown cells at a max row height, wrapped list items could overlap the lines below (#2465)
- Improved error reporting when comparing documents via the API (
/compare) (commit) - The server could crash when a client disconnected part-way through a proxied request (commit)
- The "reachable" self-check reported a false failure whenever anonymous access was disabled (#2420)
- Redirects when
GRIST_PERSONAL_ORGSis disabled have been improved (#2420)
Full Grist edition extensions
- OAuth apps
- Re-authorizing a client pre-selects the resources you granted before instead of resetting the grant to everything, and skips the account picker when it can identify the account. Switching accounts no longer invalidates the previous account's tokens (commit)
- A server without
GRIST_ENABLE_OIDC_SERVERexplains how to enable OAuth apps, instead of rendering UI over endpoints that 404 (commit)
- MCP
- A banner on the home page and a card on the OAuth apps page explain how to connect using MCP. See the MCP docs (commit)
- Clients passing a document's urlId in place of
doc_idno longer get "Doc belongs to a different DocWorker" (commit) - Document calls now travel to the server holding the document through the same forwarding as the rest of the document API, rather than MCP's own, which means MCP works with Fleet (commit)
- Grist Fleet
- New. Any Grist server in a pool of servers will now proxy WebSocket connections and document API calls to whichever peer server holds the document. Every server can then be deployed the same way behind a load balancer, with no separate home / static / doc worker configuration. Requires
GRIST_FLEET=trueand theinstallationFleetfeature in an Enterprise activation key (commit)
- New. Any Grist server in a pool of servers will now proxy WebSocket connections and document API calls to whichever peer server holds the document. Every server can then be deployed the same way behind a load balancer, with no separate home / static / doc worker configuration. Requires
Contributions
- Grist Labs: @berhalak, @dsagal, @georgegevoian, @paulfitz, @Spoffy
- @manuhabitela: keyboard and screen-reader support in modals and popups (#2371)
- @fflorent: refresh and expand the database documentation (#2458), localize remaining UI strings (#2451)
Translations
- Barna Kovács
- linke
- Martin Harari Thuresson
- npluto
Full Changelog: v1.7.16...v1.7.17
Join our Discord Community if you'd like to get into development of Grist.
v1.7.16
What's Changed
Airtable imports of large schemas no longer time out. Forms can substitute the new record's ID into a redirect URL with {{ID}}. ACL condition editors no longer render blank in Firefox below 100% zoom. The Quick Setup flow gained a telemetry toggle and a recommendation to use getgrist.com authentication. Two new Admin Panel boot probes warn when document data may not survive a restart and report how outgoing requests are gated. Building grist-core from source now produces the full edition by default, with yarn run set-community-edition for the previous behavior. In the full edition, OAuth apps now support OAuth Dynamic Client Registration (RFC 7591), so OAuth and MCP (Model Context Protocol) clients can register without being pre-provisioned, and apps can manage webhooks with just the doc:webhooks permission instead of the broader doc.schema:write.
Improvements
- Forms
- Redirect URLs can substitute the submitted record's ID with
{{ID}}, so a form can send the user to a page about their own submission (#1831)
- Redirect URLs can substitute the submitted record's ID with
- Airtable import
- Large schemas are imported by submitting
ModifyColumnactions in batches of 25, avoiding gateway timeouts on bases with many columns (commit)
- Large schemas are imported by submitting
- Custom widgets
- Reverted a restriction that disallowed same-origin custom-widget URLs, which had broken some unusual but legitimate setups (commit)
- Quick Setup
- Admin Panel
- New "persist-data" boot probe warns when documents and the home DB sit on ephemeral storage and would be lost on restart (the Docker default with no volume at
/persist, a RAM filesystem, or the container's root mount). Shown in the Admin Panel and as a banner on the Backups page; external storage or Postgres count as durable (#2396) - New "Outgoing requests" boot probe and Security Settings entry report how user-triggered outgoing requests (
REQUEST(), webhooks, Import from URL) are gated byGRIST_PROXY_FOR_UNTRUSTED_URLS(#2294) - Edition is now its own card, the legacy Enterprise toggle is gone, switching edition clears the activation key, and the trial banner links to Admin Panel / Edition (commit)
- New "persist-data" boot probe warns when documents and the home DB sit on ephemeral storage and would be lost on restart (the Docker default with no volume at
- Build / packaging
yarn installin grist-core now builds the full edition by default, via a post-install hook that downloads theextmaterial from grist-ee. Useyarn run set-community-editionto skip it (the previous behavior) oryarn run set-full-editionto opt in explicitly. The chosen edition is saved togrist-edition,GRIST_EDITIONtakes precedence, andGRIST_SKIP_EXT_AUTOSETUPskips the hook for contexts where extensions are installed manually (Docker builds, grist-desktop, grist-static) (commit)
- Internal / infrastructure
- File uploading refactored so uploads route to the correct doc worker (doc-specific endpoints) or travel in the main request (imports), in preparation for simpler multi-server configuration (commit)
- Bump
@gristlabs/node-sqlite3(#2392) - Test database connection now verifies it points at the database the caller asked for, fixing
DocApiMiscshare tests that failed after certain other suites (#2402)
Fixes
- Duplicate document and Save Copy no longer fail with "Unknown Host" when both
GRIST_PROXY_FOR_UNTRUSTED_URLSandAPP_DOC_INTERNAL_URLare set, since trusted internal URLs now use a direct fetch instead of the untrusted-URL proxy (#2344) - ACL condition editors no longer render blank in Firefox at browser zoom below 100% (#2390)
- Undo no longer fails for certain action bundles that combine a table or column rename with a column removal in the same step. Normal web-client editing was unaffected, since those happen as separate bundles (#2387)
- Locale document setting description now correctly says it affects only number formatting and the default currency, not date formatting (#2397)
Full Grist edition extensions
- OAuth apps
- Dynamic Client Registration (RFC 7591): OAuth and MCP clients can register without being pre-provisioned, enabled with
GRIST_ENABLE_OIDC_DCR. ThePOST /oidc/regendpoint is rate-limited (GRIST_OIDC_DCR_RATE_LIMIT), clients can register without specifying scopes (common for MCP servers), and a Housekeeper job prunes clients with no grants or only expired ones (commit). See the OAuth apps and Connected apps docs. - Apps can manage webhooks with just the
doc:webhookspermission. Webhook changes used to count as editing document structure, which requireddoc.schema:write; they now go through a helper that only touches the webhooks table, so the narrower permission is enough (commit)
- Dynamic Client Registration (RFC 7591): OAuth and MCP clients can register without being pre-provisioned, enabled with
- Assistant
- Conditional style tools are now part of the v2 AI assistant, and
set_table_conditional_stylesis no longer destructive: it changes styles only, with no data loss (commit)
- Conditional style tools are now part of the v2 AI assistant, and
- MCP
- Telemetry added for MCP calls (
mcpToolCallandmcpSessionStartevents, full telemetry level only), counting tool calls and unique sessions per doc and per org. The server now reads client name and version on initialize (commit). The Grist MCP server is now documented - Further MCP tool work (hosted Grist only):
create_tablebuilds columns in one atomic transaction, new tools for widget field config (column width) and table conditional styles,add_records/update_recordspreserve unspecified fields across mixed-shape records, widget tools gained sort and per-column filter support, and a fix for self-referentialRefcolumns with a show column (commit)
- Telemetry added for MCP calls (
- Automations and Audit Logs
- Dropped the "New" tag from Automations and Audit Logs, and changed the Audit Logs tag to "full Edition" (commit)
Contributions
- Grist Labs: @berhalak, @dsagal, @georgegevoian, @paulfitz, @Spoffy
- @guillett: id substitution in form redirect URLs (#1831)
- @eloupias: direct fetch for trusted URLs behind a proxy (#2344)
- @fflorent: bump
@gristlabs/node-sqlite3(#2392)
Translations
- Arif Budiman
- Barna Kovács
- Grégoire Cutzach
- Kévin DUPOND
- Martin Harari Thuresson
Full Changelog: v1.7.15...v1.7.16
Join our Discord Community if you'd like to get into development of Grist.
v1.7.15
What's Changed
An infrastructure release. First, an upgrade for OAuth access token authentication in Grist's REST API: a new credential framework in grist-core, with the token validator and OIDC server (including CIMD registration and MCP server tools) shipping in the Full Grist edition, where OAuth apps also move from experiment to available by default. Second, a wave of security hardening: a metadata leakage in GET /forms is closed, server-rendered pages get stricter value escaping, websocket reconnection now requires a matching authenticated session, custom-widget URLs can no longer be same-origin, and triggers are disabled when a document is downloaded or copied. TypeScript was upgraded to 5.9.3, and several dependencies were bumped to clear known vulnerabilities.
Improvements
API
- OAuth support extended to home API endpoints.
GET /orgs,GET /orgs/:oid/workspaces,POST /workspaces/:wid/docs, and a newGET /profile/usernow accept OAuth tokens, with resource-level filtering so a scoped token sees only the orgs and documents it was granted, and is rejected when creating documents in un-granted workspaces or orgs. (commit)
Internal / infrastructure
- TypeScript upgraded to 5.9.3, with
tscandesbuildtargets bumped to es2020. (commit) - External storage configuration tidied. Each storage backend now owns its option spec, and a configured S3 bucket is probed at startup so a misconfiguration (such as a missing
AWS_REGION) fails fast at startup rather than mid-request. (commit) - Translation keys cleaned up to unblock auto-pruning. Five call sites passed a variable rather than a literal to
t(), hiding the keys from the i18next scanner; each is now wrapped in a helper with an explicit switch so every key is visible. Orphaned onboarding-choice and theme-label keys were migrated to the scopes the runtime actually looks them up under, fixing labels that previously always showed in English. (#2368) - Dependency bumps.
ws8.18.0 to 8.20.1 (fixes an uninitialized memory disclosure inwebsocket.close()) (#2370),axios1.15.2 to 1.16.0 (the fetch adapter now enforcesmaxBodyLengthandmaxContentLength) (#2375),tmp0.2.5 to 0.2.6 (#2369),shell-quote1.8.1 to 1.8.4 (#2386), and an upgrade ofpicomatch,minimatch,glob, andserialize-javascriptthat cuts the high-severity advisories reported byyarn audit(#2381).
Documentation
- README updated for the Quick setup first-run flow. Quickstart, Admin Panel, Logins, and building-from-source sections now describe the boot-key login and Quick setup wizard, with a new
GRIST_IN_SERVICEentry in the env var table. (#2366)
Fixes
Security
- Harden value interpolation in server-rendered pages. Values embedded into inline
<script>blocks insendAppPageandOAuth2Clientsare now escaped withjsescand inserted without interpretingString.replacepatterns (such as$'and$&), andopenerOriginis canonicalized to its bare origin. (commit) - Require a matching authenticated session to reconnect a websocket. A
clientIdalone is no longer enough to attach to an existing session; the new connection must belong to the same authenticated user, so aclientIdcannot be used on its own to impersonate a user. (commit) - Disallow same-origin custom-widget URLs. A new
disallowCustomWidgetUrl()helper refuses widgets whose URL is same-origin or on Grist's configured base domain, as defense in depth against an XSS payload being weaponized through a widget URL. (commit) - Disable triggers when a document is downloaded or copied. Webhooks and email triggers are turned off in a downloaded or copied document and must be re-enabled by hand, preventing accidental sends from forks and clones. Webhook secrets are also regenerated correctly when a document with webhooks is uploaded. (commit)
- Sanitize link URLs in two more places. URLs from the
nextparameter on/welcome/select-accountare now sanitized and required to be same-origin, and URLs in document tours are sanitized too. (commit) - Close a metadata leakage in
GET /forms. The endpoint read table metadata directly instead of throughfetchMetaTables, and did not check that the section was actually a form. Anyone could pass the section ID of a non-form widget and read metadata that access rules would otherwise censor. (commit)
Other
- Crash instead of silently failing when login middleware cannot initialize. When
GRIST_IN_SERVICE=trueand the configured identity provider is unreachable at startup, the server now exits rather than falling back to the boot-key login page, so an auto-restart can retry instead of leaving users unable to sign in. (#2384) - Fix card widget bugs. New card widgets no longer borrow the record card's layout while record cards are disabled, and a card whose saved layout references only stale fields now falls back to a default layout instead of throwing and leaving the widget broken. (#2379)
Full Grist edition extensions
The Full Grist edition ships OAuth apps, an OIDC server, and an MCP server on top of grist-core.
OAuth apps
- OAuth apps are now available by default. The experiment flag was removed now that the feature is ready, so all full Grist users can register and manage OAuth apps without opting in. (commit)
OIDC server
- CIMD registration support. A new
GRIST_OIDC_CIMD_ALLOWED_HOSTSenvironment variable enables Client ID Metadata Document registration (set it to an allowlist of hosts; leaving it empty disables CIMD), and theoidc-providerlibrary was updated. (commit) - Optional
client_idfor OAuth grants, plus a portless loopback fix. Loopbackredirect_urisfrom a terminal app or CIMD flow that omitapplication_typeare now treated as native clients, solocalhostcallbacks are accepted instead of rejected. The CIMD flow no longer requires registering clients in the home database. (commit) - JWKS handling cleaned up. JWKS loading moved from
ext/toapp/, removing a misleading warning when no JWKS is configured and surfacing a clear error only if a signing operation is ever actually needed. (commit)
MCP server
- MCP server improvements. New
list_attachmentsandget_attachment_urltools, stricterdoc_idinput validation, agrist_prefix on all tool names to avoid collisions with other tools, and smoke tests for the remaining endpoints. (commit) - MCP endpoints put behind the API throttle. Throttle middleware moved to the usage tracker and is now wired through to the MCP doc endpoint. (commit)
- Per-tool permission checks on the MCP endpoint. Each MCP tool now enforces the OAuth scopes it requires, a user-profile tool was added to the MCP home endpoint, OIDC token requests support resource indicators, and tool descriptors gained titles and annotations. (commit)
Other
- Restore the missing site-settings page in the full Grist edition. The
/site-settingsroute and its client rendering had been dropped, even though the "Site settings" menu item is shown in all non-SaaS deployments. The core billing pages are composed back into the enterprise and hosted factories, and the page now renders based on itspageTyperather than the edition. (commit)
Contributions
- Grist Labs: @berhalak, @dsagal, @georgegevoian, @paulfitz, @Spoffy
- @fflorent: crash on login-middleware init failure so auto-restart can retry (#2384), bump dependencies to clear
yarn auditadvisories (#2381)
Translations
- Alberto Azzalini
- Arif Budiman
- Barna Kovács
- Grégoire Cutzach
- Kevin Kandlbinder
- Martin Harari Thuresson
- SadCivilian
Full Changelog: v1.7.14...v1.7.15
Join our Discord Community if you'd like to get into development of Grist.
v1.7.14
What's Changed
The first-run experience for self-hosted installations matures. The setup wizard previewed last release is now the default flow a fresh install lands on. It checks earlier which formula sandboxes are available, handles authentication changes more cleanly, and lets you edit the install-wide default permissions from the Admin Panel. Accessibility takes a big step forward too: screen-reader support and keyboard navigation now reach grid views, menus, and the page widget picker. There are also new date formats, a POST /records/list API endpoint for large queries, custom CSS inside widgets, and the usual dependency bumps and fixes. Two more features are under development in the full edition: OAuth Apps and an MCP (Model Context Protocol) endpoint. See "Full Grist edition extensions" below.
New features
- Guided first-run setup wizard. The setup wizard previewed in v1.7.13 is now the flow fresh self-hosted installations land on. Sign in with the boot key (the
GRIST_BOOT_KEYadmin secret printed at startup), and the wizard walks you through/admin/setupto configure your instance. The "Quick setup" entry is now active in the admin sidebar. Refinements this release:- The wizard now checks which formula sandboxes are available as soon as it opens, not when you reach that step. No more waiting on a spinner (#2341)
- Smoother entry into the wizard: cleaner redirects after an authentication change and after signing in with the boot key (#2340)
- Set up "Sign in with getgrist.com" from the wizard, and returning from getgrist.com's registration page now brings you back into the wizard, not the main Admin Panel (#2310)
- Signed-out and non-admin users can no longer open the Quick setup page. They get the same "unavailable" card as the Admin Panel (#2323)
- Authentication changes are now staged like the wizard's other pending changes. Admins are sent back through sign-in after changing them (#2315, #2331)
- The four install-wide default permissions (team sites, personal sites, anonymous access, anonymous playground) can now be changed from the Admin Panel's Security Settings, not just during the wizard (#2314)
POST /records/listendpoint. A POST companion to the records endpoint. Large queries can be sent in the request body instead of the URL (#2321).
Improvements
- Accessibility (contributed by @manuhabitela)
- Custom widgets
- A custom CSS file configured with
APP_STATIC_INCLUDE_CUSTOM_CSSis now also applied inside widgets, not just the main app. Contributed by @manuhabitela (#2089) - The built-in calendar widget now loads from the copy bundled with Grist instead of the one hosted on GitHub. The GitHub copy pulled in external CDN files that ad blockers and privacy extensions sometimes blocked (#2262)
- A custom CSS file configured with
- Localization
- API
- Action summaries (the change summaries used by features such as webhooks) now mark which cell values are genuinely unknown. Before, merging two summaries could replace a known value with a wildcard. Now it keeps the real value where it has one (#2361)
- Internal / infrastructure
Fixes
- Edit a document from the assistant popup, and Grist now copies (forks) it first if it is a template or an unsaved scratch document ("fiddle"). The original is no longer changed in place (commit)
- Fixed a case where editing through the assistant could slip past access checks. It happened while previewing a document as owner, before the fork was made, and could leave the data engine in a bad state (commit)
- Prevent anonymous users from forking documents (#2319)
- On first startup, the
/statushealth check now returns "starting" (HTTP 503) until the server is ready. Before, it could report healthy too early (#2322) - Prevent a console error when pressing ctrl+alt+o on the homepage (#2343)
Documentation
- New accessibility documentation covering keyboard navigation, screen reader support, and the high-contrast theme. Contributed by @manuhabitela
- Document how to run the browser-based end-to-end (nbrowser) tests locally (#2214)
Full Grist edition extensions
These features are under development in the full edition.
- OAuth Apps. A way to register and manage OAuth apps, with a developer UI and REST API. Users can authorize an app, limit it to specific organizations, workspaces, or documents, and later review or revoke that access.
- MCP (Model Context Protocol) endpoint. Lets external clients such as Claude or ChatGPT talk to Grist over JSON-RPC.
Dependency bumps
Thanks to the grist.gouv team for monitoring Grist dependencies.
- Bump @gristlabs/grist-widget to 0.0.6 (#2329), file-type to 22.0.0 (#2209), uuid to 14.0.0 (#2290)
- Bump axios (#2260, #2333), webpack-dev-server (#2357), ws (#2359), multiparty (#2355), fast-uri (#2342), basic-ftp (#2274, #2338), node-forge (#2210), postcss (#2316), lodash (#2238), fast-xml-parser (#2257), svgo (#2149), flatted (#2192), follow-redirects (#2264), dompurify (#2270), @xmldom/xmldom (#2289)
Contributions
- Grist Labs: @berhalak, @dsagal, @paulfitz, @Spoffy
- @manuhabitela: screen-reader support in grid views (#2114), keyboard access for row/column menus (#2230), keyboard access for the widget context menu (#2226), keyboard and screen-reader support in the page widget picker (#2273), custom CSS applied inside widgets (#2089), fine-tuning the experimental "New record" button (#2312), locale guessing and fallback improvements (#2313), console error fix on ctrl+alt+o (#2343)
- @fflorent: prevent anonymous users forking documents (#2319), bump file-type (#2209), document running the browser-based (nbrowser) tests locally (#2214)
- @cbontemps: add new date formats (#2347)
- @wvengen: include package.json and yarn.lock for the Pyodide worker (#2297)
- @machinelearningprodigy: tighten ISandbox types and resolve sort-spec lint/type-safety issues (#2211)
Translations
- Arif Budiman
- Igor Freire Rodrigues
- Kévin DUPOND
- Martin Harari Thuresson
- Paul Janzen
- Renato Portela
- René Neumann
- ssantos
- xabirequejo
- younger
Full Changelog: v1.7.13...v1.7.14
Join our Discord Community if you'd like to get into development of Grist.
v1.7.13
What's Changed
New self-hosted installations now print a boot key at startup that lets you log in as the install admin, with no pre-existing account needed. WebSocket connections now accept API keys, boot keys, and access tokens, not just session cookies, so consoles, scripts, and out-of-page custom widgets can talk to Grist over the same channel browsers use. The Pyodide sandbox jumped from 0.23.4 to 0.28.1. Airtable imports can update existing rows in place and bring choice colors with them. The (Bulk)AddOrUpdateRecord API hands back the IDs of the rows it added or updated, so upserts are easier to chain. Custom widgets now know whether they're a target or source of section linking. "Search in document" ignores accents. Team site owners on self-managed installations get a new Site Settings page for name, domain, and logo. And Grist can restart in place to apply config changes without dropping its listening socket.
New features
- Boot key login. New installations generate a
GRIST_BOOT_KEYand print it at startup. Visit/boot, paste the key, and you're logged in as the install admin and ready to set the admin email. No pre-existing account needed, and no window where the server is open to the world before authentication is configured. The key (and the relatedGRIST_IN_SERVICEflag) can also be set via env vars or managed from the Admin Panel. Existing installations are unaffected. (commit) - Restart in place. Grist can now apply config changes by restarting itself without dropping the listening socket. During the brief gap,
/statuskeeps answering for liveness checks while readiness flips to 503. On by default for Linux under Node, off for Windows and Electron. Toggle withGRIST_RESTART_SHELL=true/false(#2265). - Site Settings page. Team site owners on self-managed installations can edit team name, domain, and logo from a new
/site-settingspage (commit). - WebSocket auth for API keys, boot keys, and access tokens. The WebSocket side now goes through the same identity-resolving code path as the REST API, so any auth method that works on one works on the other. Opens the door to console clients and out-of-page custom widgets. Also tidies up auth priority and unifies API rate-limiting between the two. (commit)
Improvements
- Airtable import
- API
- Custom widgets
- New
linkingfield onInteractionOptionstells a widget whether it's an incoming-link target (asTarget) or used as a source by other sections (asSource) (#2259)
- New
- Sandboxing
- Pyodide updated from 0.23.4 to 0.28.1 (#1754)
- Suggestions
- Admin Panel
- Authentication section rebuilt with a status-coded hero card, getgrist.com Reconfigure / Deactivate, and a collapsible "other methods" list (#2227)
- UI/UX
- "Search in document" now ignores accents (#2221)
- Forms scroll like a normal page, fixing Tab not appearing to do anything on first press in Firefox (#2179)
- Account settings split into Profile and Developer subpages, in preparation for OAuth Apps (commit)
- Clearer error messages when personal orgs are disabled (#2285)
- Internal / infrastructure
- Documentation
- Cleaned up style inconsistencies in the README (#2200)
Fixes
- Fix wrong active section in the creator panel after duplicating a page with collapsed widgets (#2298)
- Fix CORS handling for opaque (
"null") origins, eliminating spurious 500s forhttps://widgets onhttp://hosted sites (#2299) - Fix padded checkboxes so the border and tick line up inside padded wrappers (#2300)
- Fix
SELF_HYPERLINK()returning a share-key URL when a doc was first opened via a share link (commit) - Wrapped row height is preserved after modifying a cell in suggestions, removing a flicker from unwrapped to wrapped (commit)
- Airtable import UI translations are picked up properly (#2236)
- Bump handlebars from 4.7.7 to 4.7.9 (#2208)
In progress: admin setup wizard
Work is under way on a new /admin/setup page, a guided first-run flow for self-hosted operators covering sandbox choice, base URL and edition, authentication, default permissions, and backups. It is not wired up by default this release, but the building blocks are in and you can preview by visiting /admin/setup directly. We expect this to be the official first-run experience next release.
Landed so far:
- Sandbox setup card that auto-detects available sandbox flavors and recommends one (#2272)
- Server section with a Test-URL-then-Confirm flow for the base URL, plus an edition picker (#2280)
- Backups section that shows external storage status and lists how to enable each backend (#2283)
- Final step with three permission presets (Locked, Recommended, Open) for
GRIST_ORG_CREATION_ANYONE,GRIST_PERSONAL_ORGS,GRIST_FORCE_LOGIN,GRIST_ANON_PLAYGROUND(#2293) - Harmonized card styling, headers, and apply-and-restart flow across the steps (#2307)
- Several Grist server settings (
APP_HOME_URL,GRIST_SANDBOX_FLAVOR,GRIST_FORCE_LOGIN,GRIST_ANON_PLAYGROUND,GRIST_ORG_CREATION_ANYONE,GRIST_PERSONAL_ORGS,GRIST_BOOT_KEY,GRIST_IN_SERVICE,GRIST_ADMIN_EMAIL,GRIST_DEFAULT_EMAIL) can now be read from the home DB as well as the environment, so they can be edited from the browser during setup (commit) - Placeholder setup page and stepper component (commit)
Full Grist edition extensions
- Automations
- Emails are now grouped by action ID rather than subject (so test runs that reuse a subject still send each email). Padding restored on the automation page, name preserved when created with Enter, description converted to a text area, and scroll issues in the action log fixed (commit)
Contributions
- fflorent: server tests for session-store API key isolation (#2246), eslint rule enforcing
makeTfilename match (#2237), Airtable import UI translation fix (#2236), test fixes (#2232, #2248) - OdysseyOfTheDragons: accent-insensitive search in document (#2221)
- manuhabitela: form page scrolling fix for Firefox Tab navigation (#2179), flaky form view test (#2276)
Translations
- Barna Kovács
- Grégoire Cutzach
- Igor Freire Rodrigues
- Markus Spitzer
- Martin Harari Thuresson
- Renato Portela
- Theo Heller
- Xavi Montero
- xabirequejo
Full Changelog: v1.7.12...v1.7.13
Join our Discord Community if you'd like to get into development of Grist.
v1.7.12
What's Changed
Airtable imports are now smoother, and the import lands in your current workspace instead of somewhere unexpected. Suggestions got a visual refresh with automatic comparison highlighting as you type. Forms are more accessible, and the API now has a cellFormat=typed option so you can get properly typed values back without guessing.
If you include extra extensions in your build, there's a new automations UI that lets you set up triggers on your data. You can define conditions on any table, then fire off email notifications or webhooks when rows match. You can send dynamic emails to different recipients based on column values, filter with Python conditions, and monitor everything from a delivery log. Automations are part of the full edition of Grist, which has a 30-day trial, and is free for individuals and small orgs (under $1M annual funding). The full edition funds the development of grist-core.
Improvements
- Airtable import
- Formula columns with field references are imported as better comments (#2201)
- Single record link fields are imported as "Ref" (vs "RefList") columns (#2165)
- Imports now use the
/tablesendpoint for better availability (#2171) - Import now targets the current org and workspace (#2139)
- Show a nicer message when Airtable OAuth integration isn't configured (#2146)
- Suggestions
- Forms
- Make
selectfields better usable with screen readers (#2164)
- Make
- SCIM
- Speed up user search (#2070)
- Sandboxing
- Use
gristlabs/gvisor-unprivilegedin the base Docker image for a more up-to-date version of runsc
- Use
- API
- New
cellFormat=typedoption for both the REST API and Custom Widget API, providing consistent, self-describing values that preserve type information for Ref, RefList, Attachments, Date, and DateTime columns - Reduce
GRIST_LOG_API_DETAILSlogging: omit body and result, add docId (#2175)
- New
- UI/UX
- Improve accessibility of Undo / Redo action buttons (#2167)
- Add max length on text inputs in forms (#2097)
- Fix document icon when the second word of the doc name is an emoji (#2170)
- Fix unreadable dark mode colors in banners (#2138)
- Hide admin panel links in grist-desktop (#2181)
- Remove the ⌘⇧H / Ctrl+Shift+H shortcut from the "Use as table headers" command
- Store anchor links in comments as relative URLs
- Documentation
- Internal / infrastructure
- Upgrade @gristlabs/sqlite3
- Add Storybook for documenting Grist UI components
Fixes
- Fix 'Row unavailable' race condition (#2156)
- Fix NumericFormatter test flakiness across ICU versions (#2176)
- Fix typo in floating menu selector (#2187)
Full Grist edition extensions
- Automations, a new tool in the left-hand panel for document owners to create trigger-driven workflows
- Set conditions on any table, filter by column values, require specific columns to be filled, use custom Python filters
- Choose when to trigger: when a row enters the filtered view, when it's newly added, or on any update
- Actions: send an email (with dynamic recipients, variable placeholders, and Markdown support) or create a webhook
- Monitor all automations from a delivery log with success/error/pending status
- Automation tool visibility can be controlled via
GRIST_HIDE_UI_ELEMENTSandGRIST_UI_FEATURES
Contributions
- @fflorent: Speed up SCIM user search (#2070), improve Undo/Redo accessibility (#2167), fix document icon emoji handling (#2170), floating menu typo fix (#2187), bump axios (#2163), bump chrome driver (#2093), bump mocha-webdriver (#2198)
- @manuhabitela: Make form
selectfields better usable with screen readers (#2164), add missing translation strings in themes selection (#2205) - @imagoiq: Add "still working..." to translatable strings (#2188)
- @Vortezz: Add max length on text inputs (#2097)
- @webash: Fix formatting for Advanced Admin Controls in README (#2161)
Translations
- audus
- Barna Kovács
- Grégoire Cutzach
- imagoiq
- Martin Harari Thuresson
- Philip Steffan
- RapidShade
- ssantos
- xabirequejo
- Zaim Ali Karim
- தமிழ்நேரம்
Full Changelog: v1.7.11...v1.7.12
Join our Discord Community if you'd like to get into development of Grist.
v1.7.11
What's Changed
New features
- Optional authentication using getgrist.com accounts
- This provides an easy-to-use authentication option for self-hosted installations that don't want to run their own authentication servers or configure other external identity providers.
- Import from Airtable
- Airtable bases can be imported directly into new or existing Grist documents.
- New environment variables have been added to provide better control over which users are able to access your Grist instance.
GRIST_PERSONAL_ORGSwill disable personal organizations, whileGRIST_ORG_CREATION_ANYONEwill prevent any non-admins from creating new organizations. - Configurable email notifications for suggestions
Improvements
- Forms
- Allow the maximum options limit on Forms to be configured (defaults to 30 options, configurable up to 1000)
- Sandboxing / security
- Limit GVisor to 8 process by default
- Suggestions
- Display references and reference lists in a friendlier fashion
- Prevent conditional formatting changes from being displayed as suggestions
- UI/UX
- Add a confirmation dialog when a resource is being shared publicly
- Hide the bell icon showing connection state when Grist is connected and functioning normally
Fixes
- API endpoints
- Correct attachment endpoints having inconsistent permissions (#2116)
- Exports
- Fix XLSX downloads when the export options don't include tableId (#2054)
- Import
- Suggestions
- Fix suggestions occasionally displaying incorrectly in documents with deleted tables (#2069)
- SCIM
- Fix role members having incorrect entries (#2051)
- UI/UX
Contributions
Translations
@VaclavDort
@filiphanes
@qleroy
@mirithillion
@hexaltation
@alimahwer
@thuma
@audez
@vonbraun22
@umam15
@kraudio
@xabirequejo
@artur Dabrowski
@Thanyanit-J
Full Changelog: v1.7.10...v1.7.11
Join our Discord Community if you'd like to get into development of Grist.
v1.7.10
Hotfix
grist-core 1.7.10 is a hotfix release that fixes a regression from 1.7.9 where the Grist Labs custom widget repository stopped being included as the default repository by mistake. As a result, Grist Labs and community custom widgets are no longer shown when adding a new custom widget, and any previously added Grist Labs or community custom widgets will fail to load.
Contributions
Translations
Full Changelog: v1.7.9...v1.7.10
Join our Discord Community if you'd like to get into development of Grist.
v1.7.9
Security advisory
A security review identified a vulnerability in the "pyodide" sandboxing method that is available in Grist. You can check if you are affected in the sandboxing section of the Admin Panel of your instance. If you see "gvisor" there, then you are not affected.If you see "pyodide", then it is important to update to this version of Grist or later.
Link for advisory: GHSA-7xvx-8pf2-pv5g
Notable fixes and improvements
- New intro screen for Access Rules:
- A document without rules now shows an intro screen with an "Enable Access Rules" button:
- On confirming, it creates the initial recommended rules: namely, disable structure permission for non-owners
- There is also a "Disable Access Rules" button that's shown when there are no custom rules
- A document without rules now shows an intro screen with an "Enable Access Rules" button:
- Restrict users who can view all data from viewing Access Rules by default:
- If permission to view Access Rules is enabled, then there is a new option: to restrict non-owners from downloading or copying the document
- This restriction is added by default when permission to view Access Rules is given
- Granting permission to view Access Rules and removing the restriction on downloading/copying the document approximates the previous behavior
- Redesigned authentication section in Admin Panel for configuring user authentication in self-managed Grist
- Org and workspace modifications are now limited to users with owner permissions
- Document owners can now resolve and reopen comment threads, and delete comments
- Fixes for some frontend memory leaks
- Fixes for some styling issues when printing a document
- Fix for broken enable/disable document endpoints in multi-server environments
- Optimizations to row filtering in Access Rules
- Show a "record is unavailable" message when a user opens a record card blocked by ACLs PR #1896
- Fix how zero Date/DateTimes look to other formulas PR #1995
- Don't force reloads when a column is added to a user attribute table PR #2035
- Several improvements to RecordSet handling PR #1992
- Correctly share forms with references with no display column PR #2008
- Improve rendering of changes in suggestions PR #1977
- Show a count of changes when making a suggestion PR #1960
- Validate emails used to share access PR #2016
Contributions
- @fflorent: Bump js-yaml from 3.14.1 to 4.1.1 PR #1961
- @fflorent: Bump Typescript to version 4.9.4 PR #1993
- @fflorent: Eslint: Remove function appCommWaiter (dead code) PR #2001
- @fflorent: Upgrade eslint PR #2000 PR #2005 PR #2020 PR #2030
- @fflorent: develop.md: Simplify the paragraph detailing the coding rules PR #2031
- @manuhabitela: Make sure a Form Submit row can't be removed with keyboard PR #1979
- @manuhabitela: Choices text box: make sure all choice tokens are readable PR #1982
Translations
- @maksim2005UKR
- @hexaltation
- @h0r0m
- @winjie0618
- @audez
- @umam15
- @mirithilion
- @oliverne
- @vonbraun22
- Alexey
- Paul Janzen
Full Changelog: v1.7.8...v1.7.9
Join our Discord Community if you'd like to get into development of Grist.
v1.7.8
What's Changed
- There are new API endpoints for disabling and enabling documents
- Miscellaneous bug fixes and translations
Full Changelog: v1.7.7...v1.7.8
Join our Discord Community if you'd like to get into development of Grist.