# Grist changelog > A modern relational spreadsheet that combines the flexibility of a spreadsheet with the robustness of a database. - Vendor: Grist Labs - Category: Productivity - Official site: https://www.getgrist.com - Tracked by: What's New (https://whatsnew.fyi/product/grist) - Harvested from: GitHub (gristlabs/grist-core) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v1.7.17 - Date: 2026-07-29 - Version: v1.7.17 - Original notes: https://github.com/gristlabs/grist-core/releases/tag/v1.7.17 - Permalink: https://whatsnew.fyi/product/grist/releases/v1.7.17 - **added** — Add a Row numbers setting on grid widgets to choose between Numbers (position in current sort), Row IDs (bracketed format), or Hidden (collapse left-hand gutter) - **added** — Add setup checklist in Document Settings showing which notifications, automations, invite emails, and AI assistant features are ready and what prerequisites each unfinished feature requires - **added** — Add ability for admins to request prerequisite setup steps through an Admin Panel item - **added** — Add button in Admin Panel and Quick Setup to switch to the full edition by downloading matching extensions, verifying SHA-256, and restarting in place - **added** — Add optional "Help us improve" card at the end of Quick Setup to collect feedback on how users heard about Grist and their user type - **changed** — Announce modals and popups as dialogs by screen readers and trap Tab key focus inside open modals - **changed** — Translate temporary row IDs inside RefList values in addition to Ref values and row-ID positions to enable creating mutually-referencing rows in one bundle - **changed** — Show Grist edition and version in left panel footer with links to compare editions and release notes - **changed** — Make "Enable Access Rules", form reset warning, and color picker labels translatable - **changed** — Improve OAuth apps re-authorization to pre-select previously granted resources and skip account picker when account can be identified - **changed** — Explain how to enable OAuth apps on servers without GRIST_ENABLE_OIDC_SERVER instead of rendering UI over 404 endpoints - **changed** — Add banner on home page and card on OAuth apps page explaining how to connect using MCP - **changed** — Route MCP document calls through the same server forwarding as the rest of the document API to enable MCP support with Fleet - **fixed** — Preserve "View as" for attachment previews and whole-document exports instead of resolving as document owner - **fixed** — Fix Airtable reference columns holding single values to import as working references instead of unusable text - **fixed** — Fix Airtable count columns to no longer error when the column they count was imported as a Ref rather than RefList - **fixed** — Fix wrapped list items in Markdown cells at maximum row height overlapping lines below - **fixed** — Fix server crash when a client disconnects part-way through a proxied request - **fixed** — Fix "reachable" self-check reporting false failure when anonymous access is disabled - **fixed** — Fix MCP clients passing a document's urlId in place of doc_id no longer receiving "Doc belongs to a different DocWorker" error ##### 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](https://github.com/gristlabs/grist-core/commit/a29e94aa)) * **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_URL` points 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](https://github.com/gristlabs/grist-core/commit/5af0acb7)) row-numbers ###### 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](https://github.com/gristlabs/grist-core/commit/6e175355)) * 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 * "Enable Access Rules", the form reset warning, and the color picker's `fill` / `text` / `default` / `none` labels are now translatable. Contributed by @fflorent (#2451) * Documentation * `documentation/database.md` is 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](https://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) version-footer ###### 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 c _[Truncated at 4000 characters — full notes: https://github.com/gristlabs/grist-core/releases/tag/v1.7.17]_ ### v1.7.16 - Date: 2026-06-30 - Version: v1.7.16 - Original notes: https://github.com/gristlabs/grist-core/releases/tag/v1.7.16 - Permalink: https://whatsnew.fyi/product/grist/releases/v1.7.16 - **fixed** — Airtable imports of large schemas no longer time out by submitting ModifyColumn actions in batches of 25 - **added** — Forms can substitute the submitted record's ID into a redirect URL with {{ID}} - **fixed** — ACL condition editors no longer render blank in Firefox at browser zoom below 100% - **added** — Telemetry can be turned on during the Quick Setup flow - **changed** — Quick Setup authentication step recommends getgrist.com authentication with a hero card when no other provider is configured - **added** — New persist-data boot probe warns when documents and home DB sit on ephemeral storage and would be lost on restart - **added** — New Outgoing requests boot probe and Security Settings entry report how user-triggered outgoing requests are gated by GRIST_PROXY_FOR_UNTRUSTED_URLS - **changed** — Edition is now its own card in Admin Panel, legacy Enterprise toggle is gone, and switching edition clears the activation key - **changed** — Building grist-core from source now produces the full edition by default, with yarn run set-community-edition for the previous behavior - **fixed** — Duplicate document and Save Copy no longer fail with Unknown Host when both GRIST_PROXY_FOR_UNTRUSTED_URLS and APP_DOC_INTERNAL_URL are set - **fixed** — Undo no longer fails for action bundles that combine a table or column rename with a column removal in the same step - **fixed** — Locale document setting description now correctly says it affects only number formatting and the default currency, not date formatting - **changed** — Custom widgets: reverted restriction that disallowed same-origin custom-widget URLs - **added** — OAuth apps now support Dynamic Client Registration (RFC 7591) so OAuth and MCP clients can register without being pre-provisioned - **changed** — Apps can manage webhooks with just the doc:webhooks permission instead of the broader doc.schema:write - **added** — Conditional style tools are now part of the v2 AI assistant and set_table_conditional_styles is no longer destructive - **added** — Telemetry added for MCP calls counting tool calls and unique sessions per doc and per org ##### 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) * Airtable import * Large schemas are imported by submitting `ModifyColumn` actions in batches of 25, avoiding gateway timeouts on bases with many columns ([commit](https://github.com/gristlabs/grist-core/commit/f8c45df3)) * Custom widgets * Reverted a restriction that disallowed same-origin custom-widget URLs, which had broken some unusual but legitimate setups ([commit](https://github.com/gristlabs/grist-core/commit/eb483ef5)) * Quick Setup * Telemetry can be turned on during the Quick Setup flow, instead of only from the Admin Panel or an environment variable (#2419) * The authentication step recommends getgrist.com authentication with a hero card when no other provider is configured (#2410) * 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 by `GRIST_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](https://github.com/gristlabs/grist-core/commit/3b2ee8e8)) * Build / packaging * `yarn install` in grist-core now builds the full edition by default, via a post-install hook that downloads the `ext` material from grist-ee. Use `yarn run set-community-edition` to skip it (the previous behavior) or `yarn run set-full-edition` to opt in explicitly. The chosen edition is saved to `grist-edition`, `GRIST_EDITION` takes precedence, and `GRIST_SKIP_EXT_AUTOSETUP` skips the hook for contexts where extensions are installed manually (Docker builds, grist-desktop, grist-static) ([commit](https://github.com/gristlabs/grist-core/commit/b0fa5fb8)) * 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](https://github.com/gristlabs/grist-core/commit/22343c37)) * Bump `@gristlabs/node-sqlite3` (#2392) * Test database connection now verifies it points at the database the caller asked for, fixing `DocApiMisc` share 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_URLS` and `APP_DOC_INTERNAL_URL` are 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 F _[Truncated at 4000 characters — full notes: https://github.com/gristlabs/grist-core/releases/tag/v1.7.16]_ ### v1.7.15 - Date: 2026-06-10 - Version: v1.7.15 - Original notes: https://github.com/gristlabs/grist-core/releases/tag/v1.7.15 - Permalink: https://whatsnew.fyi/product/grist/releases/v1.7.15 - **added** — OAuth support extended to home API endpoints including GET /orgs, GET /orgs/:oid/workspaces, POST /workspaces/:wid/docs, and GET /profile/user with resource-level filtering for scoped tokens - **changed** — TypeScript upgraded to 5.9.3 with tsc and esbuild targets bumped to es2020 - **changed** — External storage configuration tidied with each storage backend owning its option spec and S3 bucket probing at startup for early failure detection - **changed** — Translation keys cleaned up to unblock auto-pruning by wrapping variable calls to t() with explicit switches - **changed** — Dependency bumped: ws from 8.18.0 to 8.20.1 - **changed** — Dependency bumped: axios from 1.15.2 to 1.16.0 with fetch adapter now enforcing maxBodyLength and maxContentLength - **changed** — Dependency bumped: tmp from 0.2.5 to 0.2.6 - **changed** — Dependency bumped: shell-quote from 1.8.1 to 1.8.4 - **changed** — Upgraded picomatch, minimatch, glob, and serialize-javascript to clear high-severity advisories - **security** — Harden value interpolation in server-rendered pages by escaping values embedded into inline script blocks with jsesc and canonicalizing openerOrigin to bare origin - **security** — Require a matching authenticated session to reconnect a websocket instead of allowing clientId alone to attach to an existing session - **security** — Disallow same-origin custom-widget URLs as defense in depth against XSS payloads being weaponized through widget URLs - **security** — Disable triggers when a document is downloaded or copied and regenerate webhook secrets correctly when a document with webhooks is uploaded - **security** — Sanitize link URLs from the next parameter on /welcome/select-account to be same-origin and sanitize URLs in document tours - **security** — Close metadata leakage in GET /forms by reading table metadata through fetchMetaTables and checking that the section is actually a form - **fixed** — Crash instead of silently failing when login middleware cannot initialize with unreachable identity provider at startup - **fixed** — Fix card widget bugs where new card widgets no longer borrow the record card layout and cards with stale field references fall back to default layout - **changed** — README updated for Quick setup first-run flow including boot-key login and Quick setup wizard descriptions with new GRIST_IN_SERVICE environment variable ##### 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 new `GET /profile/user` now 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](https://github.com/gristlabs/grist-core/commit/f481fd1d)) ###### Internal / infrastructure * **TypeScript upgraded to 5.9.3**, with `tsc` and `esbuild` targets bumped to es2020. ([commit](https://github.com/gristlabs/grist-core/commit/7adf2e6c)) * **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](https://github.com/gristlabs/grist-core/commit/c4843f25)) * **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**. `ws` 8.18.0 to 8.20.1 (fixes an uninitialized memory disclosure in `websocket.close()`) (#2370), `axios` 1.15.2 to 1.16.0 (the fetch adapter now enforces `maxBodyLength` and `maxContentLength`) (#2375), `tmp` 0.2.5 to 0.2.6 (#2369), `shell-quote` 1.8.1 to 1.8.4 (#2386), and an upgrade of `picomatch`, `minimatch`, `glob`, and `serialize-javascript` that cuts the high-severity advisories reported by `yarn 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_SERVICE` entry in the env var table. (#2366) ###### Fixes ###### Security * **Harden value interpolation in server-rendered pages**. Values embedded into inline `