Skip to content

Releases: gristlabs/grist-core

v1.7.17

Choose a tag to compare

@paulfitz paulfitz released this 29 Jul 20:25
fe67281

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_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)
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)
  • 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, 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 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_ORGS is 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_SERVER explains 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_id no 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=true and the installationFleet feature in an Enterprise activation key (commit)

Contributions

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

Choose a tag to compare

@paulfitz paulfitz released this 30 Jun 01:28
0408b15

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)
  • Custom widgets
    • Reverted a restriction that disallowed same-origin custom-widget URLs, which had broken some unusual but legitimate setups (commit)
  • 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)
  • 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)
  • 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 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 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. The POST /oidc/reg endpoint 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:webhooks permission. Webhook changes used to count as editing document structure, which required doc.schema:write; they now go through a helper that only touches the webhooks table, so the narrower permission is enough (commit)
  • Assistant
    • Conditional style tools are now part of the v2 AI assistant, and set_table_conditional_styles is no longer destructive: it changes styles only, with no data loss (commit)
  • MCP
    • Telemetry added for MCP calls (mcpToolCall and mcpSessionStart events, 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_table builds columns in one atomic transaction, new tools for widget field config (column width) and table conditional styles, add_records/update_records preserve unspecified fields across mixed-shape records, widget tools gained sort and per-column filter support, and a fix for self-referential Ref columns with a show column (commit)
  • Automations and Audit Logs
    • Dropped the "New" tag from Automations and Audit Logs, and changed the Audit Logs tag to "full Edition" (commit)

Contributions

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

Choose a tag to compare

@paulfitz paulfitz released this 10 Jun 20:57
6044766

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)

Internal / infrastructure

  • TypeScript upgraded to 5.9.3, with tsc and esbuild targets 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. 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 <script> blocks in sendAppPage and OAuth2Clients are now escaped with jsesc and inserted without interpreting String.replace patterns (such as $' and $&), and openerOrigin is canonicalized to its bare origin. (commit)
  • Require a matching authenticated session to reconnect a websocket. A clientId alone is no longer enough to attach to an existing session; the new connection must belong to the same authenticated user, so a clientId cannot 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 next parameter on /welcome/select-account are 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 through fetchMetaTables, 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=true and 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_HOSTS environment variable enables Client ID Metadata Document registration (set it to an allowlist of hosts; leaving it empty disables CIMD), and the oidc-provider library was updated. (commit)
  • Optional client_id for OAuth grants, plus a portless loopback fix. Loopback redirect_uris from a terminal app or CIMD flow that omit application_type are now treated as native clients, so localhost callbacks 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/ to app/, 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_attachments and get_attachment_url tools, stricter doc_id input validation, a grist_ 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-settings route 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 its pageType rather than the edition. (commit)

Contributions

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

Choose a tag to compare

@paulfitz paulfitz released this 28 May 19:44
3b8acc0

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_KEY admin secret printed at startup), and the wizard walks you through /admin/setup to 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/list endpoint. 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)
    • Screen-reader support in grid views (#2114)
    • Open the row and column menus via keyboard shortcuts in a grid view (#2230)
    • Open the context menu via keyboard shortcuts when in widgets (#2226)
    • Page widget picker now works with keyboard and screen readers (#2273)
  • Custom widgets
    • A custom CSS file configured with APP_STATIC_INCLUDE_CUSTOM_CSS is 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)
  • Localization
    • New date formats (#2347)
    • Improved locale guessing and locale fallback logic (#2313)
  • 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
    • Added a filesystem-based document storage backend for tests, enabled with GRIST_FS_STORAGE_DIR. It implements Grist's external storage interface, normally backed by S3-compatible object storage (commit). It also gets a (test-only) card in the Admin Panel backups section (commit)

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 /status health 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.

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

Choose a tag to compare

@paulfitz paulfitz released this 29 Apr 16:41
586a286

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_KEY and 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 related GRIST_IN_SERVICE flag) 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, /status keeps answering for liveness checks while readiness flips to 503. On by default for Linux under Node, off for Windows and Electron. Toggle with GRIST_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-settings page (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
    • Updates existing rows by default when the source has an Airtable ID column, and resolves references against rows already in the doc (#2216)
    • Brings Airtable choice colors along for the ride (#2199)
  • API
    • (Bulk)AddOrUpdateRecord now returns id / recordIds / createdRecordIds / updatedRecordIds, and BulkAddOrUpdateRecord accepts a record-shaped payload that can match different columns per row (#2193)
    • Webhook API ignores empty action payloads, matching the other endpoints (#2308)
  • Custom widgets
    • New linking field on InteractionOptions tells a widget whether it's an incoming-link target (asTarget) or used as a source by other sections (asSource) (#2259)
  • Sandboxing
    • Pyodide updated from 0.23.4 to 0.28.1 (#1754)
  • Suggestions
    • The number-of-suggestions badge is now a status dot, removing counting ambiguity (commit)
    • Per-document unsubscribe link for row-change notifications (commit)
  • 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
    • New eslint rule makes sure makeT(...) calls match their filename, with autofix (#2237)
    • Rebalanced nbrowser CI groups and added guards so silently skipped tests don't sneak through (#2267)
  • 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 for https:// widgets on http:// 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 makeT filename 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

Choose a tag to compare

@paulfitz paulfitz released this 31 Mar 10:52
0919e3e

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 /tables endpoint 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
    • Comparison highlighting is now shown automatically in suggestion mode (#2140)
    • Improved "compare to original" feature (#2068)
    • Fix suggestion count on a copied document that has been auto-forked (#2117)
    • Fix deleting rows correctly in suggestions (#2174)
  • Forms
    • Make select fields better usable with screen readers (#2164)
  • SCIM
    • Speed up user search (#2070)
  • Sandboxing
    • Use gristlabs/gvisor-unprivileged in the base Docker image for a more up-to-date version of runsc
  • API
    • New cellFormat=typed option 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_DETAILS logging: omit body and result, add docId (#2175)
  • 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
    • Rewrite grist-data-format.md to reflect actual Grist data format (#2177)
    • Freshen list of features in README.md (#2142)
  • 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_ELEMENTS and GRIST_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 select fields 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

Choose a tag to compare

@Spoffy Spoffy released this 27 Feb 17:13
d9267bd

What's Changed

New features

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
    • Fix an error that would pop up when doing multiple successive imports with the Pyodide sandbox enabled (#2073)
    • Fix an error with importing when the Grist instance is hosted on Windows (e.g. Grist desktop) (#2064)
  • Suggestions
    • Fix suggestions occasionally displaying incorrectly in documents with deleted tables (#2069)
  • SCIM
    • Fix role members having incorrect entries (#2051)
  • UI/UX
    • Fix doubled-up overlays in filter-linked widgets that have rows blocked by access control lists (#2056)
    • Fix virtual table display and scrollbar issues on MacOS (#2075)

Contributions

@fflorent

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

Choose a tag to compare

@georgegevoian georgegevoian released this 12 Jan 20:50
fd80aba

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

Choose a tag to compare

@georgegevoian georgegevoian released this 09 Jan 01:26
71c7e1e

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
  • 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

Translations

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

Choose a tag to compare

@jordigh jordigh released this 26 Nov 22:35

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.