Grist is an open-source relational spreadsheet replacing Smartsheet and Airtable with Python formulas, SQLite storage, and self-hosted data ownership.
Internal tooling teams tracking infrastructure inventory and sprint metrics across fifty contributors face steep bills under commercial seat tiers. Grist provides a self-hosted alternative pairing a responsive spreadsheet grid with the relational integrity of an SQLite database. Sandboxed Python formulas turn flat tables into interconnected applications without recurring per-seat fees.
Smartsheet treats data as flat sheets with project tracking widgets, charging ascending monthly subscriptions for every user editing a cell. While Smartsheet suits project offices requiring native Gantt baselines and portfolio reporting, technical teams quickly outgrow its spreadsheet-bound relational logic. Grist replaces that subscription model with self-hosted relational tables where records link across views through foreign keys rather than fragile cell lookups. Instead of proprietary spreadsheet syntax, Grist runs Python expressions across columns, letting developers use standard libraries for string manipulation, date math, or data validation inside the grid.
The cost difference widens as headcount expands. Smartsheet restricts audit trails, granular permissions, and API access to higher tiers, turning broad internal adoption into a procurement hurdle. Grist removes per-seat charges by deploying as a lightweight container on internal infrastructure. While self-hosting requires managing backups and identity providers internally, it lets organizations onboard every developer and operator into shared data workflows without license penalties.
Can Grist replace Smartsheet for project management? Grist replaces Smartsheet for structured records, relational inventories, and custom team dashboards without per-seat licensing fees. However, organizations requiring built-in Gantt baselines, critical path tracking, and automated portfolio rollups still need dedicated project management software.
Is Grist free for commercial use? Yes. The core software is open-source, allowing businesses to self-host unlimited documents and users on private infrastructure without licensing costs.
Does Grist require an external database server? No. Grist stores each document as a self-contained SQLite file on local storage or S3-compatible buckets, needing only Node.js and a Python runtime.
Grist is an outstanding self-hosted choice for engineering teams needing relational spreadsheet flexibility without paying commercial seat taxes on internal data collection. It is less suited for organizations demanding automated multi-project Gantt schedules or turnkey enterprise automations out of the box. Active commits through September 2026 and an Apache-2.0 license give technical teams full freedom to embed and adapt the platform across self-managed infrastructure without proprietary constraints.
We started this exact setup from scratch in a clean Linux machine on Nov 2, 2026 and checked it through Grist's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p grist && cd grist
curl -fsSL https://open-source.store/tools/grist/compose.yml -o compose.ymlcat > .env <<EOF
APP_HOME_URL=http://localhost:8484
GRIST_BOOT_KEY=$(openssl rand -hex 12)
GRIST_SESSION_SECRET=$(openssl rand -hex 16)
GRIST_SINGLE_ORG=docs
EOFAPP_HOME_URL — Public URL where users access this Grist instance; change to your public domain when hosting behind a reverse proxy.GRIST_BOOT_KEY — Initial setup secret used to authenticate the operator on first boot. Generated above; keep it secret.GRIST_SESSION_SECRET — Random secret key used to sign and encrypt browser session cookies. Generated above; keep it secret.GRIST_SINGLE_ORG — Single organization / team site name for this installation.docker compose up -dservices:
grist:
image: gristlabs/grist:1.7.22
ports:
- "8484:8484"
environment:
APP_HOME_URL: ${APP_HOME_URL}
GRIST_BOOT_KEY: ${GRIST_BOOT_KEY}
GRIST_SESSION_SECRET: ${GRIST_SESSION_SECRET}
GRIST_SINGLE_ORG: ${GRIST_SINGLE_ORG}
volumes:
- grist-data:/persist
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8484/status"]
interval: 5s
timeout: 5s
retries: 10
volumes:
grist-data:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that Grist is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 37 s: gristlabs/grist:1.7.22.
Based on the upstream setup. Official compose example. Image pinned to 1.7.22; secrets and base URL moved to environment variables; persistent data stored in a named volume.
grist-1 | 2026-11-02T03:00:04.789527379Z 2026-11-02 03:00:04.789 - info: == grist.docStorage.vacuumOnClose: true [default] grist-1 | 2026-11-02T03:00:04.789528462Z 2026-11-02 03:00:04.789 - info: == grist.docWorker.updateLoadIntervalMs: 5000 [default] grist-1 | 2026-11-02T03:00:04.789579004Z 2026-11-02 03:00:04.789 - info: == grist.docWorker.updateLoadVarianceMs: 1000 [default] grist-1 | 2026-11-02T03:00:04.789584296Z 2026-11-02 03:00:04.789 - info: == grist.externalStorage.active: false grist-1 | 2026-11-02T03:00:04.789585796Z 2026-11-02 03:00:04.789 - info: == grist.externalStorage.activeDocTimeout: 30 [default] grist-1 | 2026-11-02T03:00:04.789586796Z 2026-11-02 03:00:04.789 - info: == grist.externalStorage.minio.bucket: - [GRIST_DOCS_S3_BUCKET] grist-1 | 2026-11-02T03:00:04.789602129Z 2026-11-02 03:00:04.789 - info: == grist.features.formFraming: border [default] grist-1 | 2026-11-02T03:00:04.789612004Z 2026-11-02 03:00:04.789 - info: == grist.features.sqlite.mode: nosync [default] grist-1 | 2026-11-02T03:00:04.789613212Z 2026-11-02 03:00:04.789 - info: == grist.history.action.maxBytes: 1000000000 [default] grist-1 | 2026-11-02T03:00:04.789614129Z 2026-11-02 03:00:04.789 - info: == grist.history.action.maxRows: 1000 [default] grist-1 | 2026-11-02T03:00:04.789624462Z 2026-11-02 03:00:04.789 - info: == grist.homeUrl: http://localhost:8484 [APP_HOME_URL] grist-1 | 2026-11-02T03:00:04.789625629Z 2026-11-02 03:00:04.789 - info: == grist.integrations.sql.timeout: 1000 [default] grist-1 | 2026-11-02T03:00:04.789637879Z 2026-11-02 03:00:04.789 - info: == grist.log.apiDetails: false [default] [GRIST_LOG_API_DETAILS] grist-1 | 2026-11-02T03:00:04.789648921Z 2026-11-02 03:00:04.789 - info: == grist.log.json: false [default] [GRIST_LOG_AS_JSON] grist-1 | 2026-11-02T03:00:04.789656129Z 2026-11-02 03:00:04.789 - info: == grist.log.level: info [default] grist-1 | 2026-11-02T03:00:04.789674671Z 2026-11-02 03:00:04.789 - info: == grist.login.active: minimal grist-1 | 2026-11-02T03:00:04.789683087Z 2026-11-02 03:00:04.789 - info: == grist.login.forced: false [default] grist-1 | 2026-11-02T03:00:04.789684087Z 2026-11-02 03:00:04.789 - info: == grist.login.system.getgrist.com.spHost: http://localhost:8484 [default] grist-1 | 2026-11-02T03:00:04.789692046Z 2026-11-02 03:00:04.789 - info: == grist.login.system.oidcServer.cookies.prefix: grist_oidc_ [default] grist-1 | 2026-11-02T03:00:04.789705546Z 2026-11-02 03:00:04.789 - info: == grist.login.system.oidcServer.dcr.enabled: false [default] grist-1 | 2026-11-02T03:00:04.789726712Z 2026-11-02 03:00:04.789 - info: == grist.login.system.oidcServer.dcr.rateLimit: 60 [default] grist-1 | 2026-11-02T03:00:04.789727962Z 2026-11-02 03:00:04.789 - info: == grist.mcp.enabled: false [default] grist-1 | 2026-11-02T03:00:04.789741462Z 2026-11-02 03:00:04.789 - info: == grist.oauth2.redirectHost: http://localhost:8484 [default] grist-1 | 2026-11-02T03:00:04.789742462Z 2026-11-02 03:00:04.789 - info: == grist.orgs.canAnyoneCreateOrgs: true [default] grist-1 | 2026-11-02T03:00:04.789750921Z 2026-11-02 03:00:04.789 - info: == grist.orgs.enablePersonalOrgs: true [default] grist-1 | 2026-11-02T03:00:04.789772171Z 2026-11-02 03:00:04.789 - info: == grist.proxy: - [GRIST_PROXY_FOR_UNTRUSTED_URLS] grist-1 | 2026-11-02T03:00:04.789773421Z 2026-11-02 03:00:04.789 - info: == grist.server.headersTimeoutMs: 306000 [default] grist-1 | 2026-11-02T03:00:04.789792796Z 2026-11-02 03:00:04.789 - info: == grist.server.keepAliveTimeoutMs: 305000 [default] grist-1 | 2026-11-02T03:00:04.789793962Z 2026-11-02 03:00:04.789 - info: == grist.server.requestTimeoutMs: 306000 [default] grist-1 | 2026-11-02T03:00:04.789802171Z 2026-11-02 03:00:04.789 - info: == grist.telemetry.syncWork.breakMs: 50 [default] grist-1 | 2026-11-02T03:00:04.789832254Z 2026-11-02 03:00:04.789 - info: == grist.telemetry.syncWork.limitMs: 50 [default] grist-1 | 2026-11-02T03:00:04.789833379Z 2026-11-02 03:00:04.789 - info: == grist.userPresence.enable: true [default] grist-1 | 2026-11-02T03:00:04.789834254Z 2026-11-02 03:00:04.789 - info: == grist.userPresence.iconPerTab: false [default] grist-1 | 2026-11-02T03:00:04.789870421Z 2026-11-02 03:00:04.789 - info: FlexServer is ready grist-1 | 2026-11-02T03:00:04.790824171Z Grist is available at http://localhost:8484 grist-1 | 2026-11-02T03:00:04.790828504Z 2026-11-02 03:00:04.790 - info: RestartShell: child ready grist-1 | 2026-11-02T03:00:06.049957880Z 2026-11-02 03:00:06.049 - info: Renaming user "[email protected]" to the new admin email "[email protected]" grist-1 | 2026-11-02T03:00:06.299683755Z 2026-11-02 03:00:06.299 - warn: Error during api call to /boot/verify-boot-key: Invalid boot key path=/boot/verify-boot-key, userId=undefined, altSessionId=undefined, body=undefined, params=undefined grist-1 | 2026-11-02T03:00:06.302380588Z 2026-11-02 03:00:06.302 - warn: Error during api call to /orgs: Grist is not yet configured. Visit /boot to set up this installation. path=/orgs, userId=1, altSessionId=oKXXYVvt2d6p7iRMuDDiss, body=undefined, grist-1 | 2026-11-02T03:00:06.306845755Z 2026-11-02 03:00:06.306 - warn: Error during api call to /orgs/1/workspaces: Grist is not yet configured. Visit /boot to set up this installation. path=/orgs/1/workspaces, userId=1, altSessionId=31j4bNrN3M5X8YyQbuPwgQ, body=undefined, grist-1 | 2026-11-02T03:00:15.531547134Z 2026-11-02 03:00:15.531 - warn: Error during api call to /project: Grist is not yet configured. Visit /boot to set up this installation. path=/project, userId=1, altSessionId=2Fa5MRJX7hGBjDdfM7ysTj, body=undefined, grist-1 | 2026-11-02T03:00:15.531759717Z 2026-11-02 03:00:15.531 - warn: Error during api call to /project: Grist is not yet configured. Visit /boot to set up this installation. path=/project, userId=1, altSessionId=wDY2MtTLJYN6gaVHRJG8oj, body=undefined, grist-1 | 2026-11-02T03:00:15.580641009Z 2026-11-02 03:00:15.580 - warn: Error during api call to /v0/compliance/profiles/search: Grist is not yet configured. Visit /boot to set up this installation. path=/v0/compliance/profiles/search, userId=1, altSessionId=shW1DaYdVPcfB5Bi2YY8sV, body=undefined, grist-1 | 2026-11-02T03:00:15.580823717Z 2026-11-02 03:00:15.580 - warn: Error during api call to /v0/compliance/profiles/search: Grist is not yet configured. Visit /boot to set up this installation. path=/v0/compliance/profiles/search, userId=1, altSessionId=gcjBNbFrXcwNYVc2sKSJ7U, body=undefined, grist-1 | 2026-11-02T03:00:16.432652760Z 2026-11-02 03:00:16.432 - warn: Error during api call to /v1/health/../flags: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/health/../flags, userId=1, altSessionId=9TRLeLgERzDEDvtFVfjWYu, body=undefined, grist-1 | 2026-11-02T03:00:16.433132176Z 2026-11-02 03:00:16.433 - warn: Error during api call to /v1/health/../flags: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/health/../flags, userId=1, altSessionId=hKZUAeBaukUV5bdqP3AVcd, body=undefined, grist-1 | 2026-11-02T03:00:16.436117385Z 2026-11-02 03:00:16.435 - warn: Error during api call to /v1/validate/code: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/validate/code, userId=1, altSessionId=jeCbaoxaPCL8YkTupNnjii, body=undefined, grist-1 | 2026-11-02T03:00:16.522404968Z 2026-11-02 03:00:16.522 - warn: Error during api call to /v1/validate/code: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/validate/code, userId=1, altSessionId=tCN6Pco6zX78PCGcbBBx1M, body=undefined, grist-1 | 2026-11-02T03:00:16.555342510Z 2026-11-02 03:00:16.554 - warn: Error during api call to /v4/projects: Grist is not yet configured. Visit /boot to set up this installation. path=/v4/projects, userId=1, altSessionId=pJRD22nvMyQAcKjRhYqSSY, body=undefined, grist-1 | 2026-11-02T03:00:16.555352551Z 2026-11-02 03:00:16.554 - warn: Error during api call to /v4/projects: Grist is not yet configured. Visit /boot to set up this installation. path=/v4/projects, userId=1, altSessionId=5M4gTRsc5DrK1MKihqGe1P, body=undefined, grist-1 | 2026-11-02T03:00:16.557775593Z 2026-11-02 03:00:16.557 - warn: Error during api call to /v1/version: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/version, userId=1, altSessionId=o8PkVdxm2nPZRzSH3SZp4g, body=undefined, grist-1 | 2026-11-02T03:00:16.557882676Z 2026-11-02 03:00:16.557 - warn: Error during api call to /v1/version: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/version, userId=1, altSessionId=g3WiCPS6vowXDxxAWfaq4N, body=undefined, grist-1 | 2026-11-02T03:00:16.568376885Z 2026-11-02 03:00:16.568 - warn: Error during api call to /system/recover-account: Grist is not yet configured. Visit /boot to set up this installation. path=/system/recover-account, userId=1, altSessionId=hhS8G5hc7UYn1YxL3JeSuB, body=undefined, grist-1 | 2026-11-02T03:00:16.568602301Z 2026-11-02 03:00:16.568 - warn: Error during api call to /system/recover-account: Grist is not yet configured. Visit /boot to set up this installation. path=/system/recover-account, userId=1, altSessionId=f9WTfXqhApx4se9ZRK8Xcm, body=undefined, grist-1 | 2026-11-02T03:00:16.568888676Z 2026-11-02 03:00:16.568 - warn: Error during api call to /v1/init_consts: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/init_consts, userId=1, altSessionId=wzBZX8MiG3KWXXoTCokg21, body=undefined, grist-1 | 2026-11-02T03:00:16.574348301Z 2026-11-02 03:00:16.574 - warn: Error during api call to /v1/init_consts: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/init_consts, userId=1, altSessionId=bHM6F1jB8S19QsHp8VbxmJ, body=undefined, grist-1 | 2026-11-02T03:00:16.589863843Z 2026-11-02 03:00:16.589 - warn: Error during api call to /v1/init_consts: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/init_consts, userId=1, altSessionId=bHM6F1jB8S19QsHp8VbxmJ, body=undefined, grist-1 | 2026-11-02T03:00:16.620102176Z 2026-11-02 03:00:16.620 - warn: Error during api call to /v1/init_consts: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/init_consts, userId=1, altSessionId=wzBZX8MiG3KWXXoTCokg21, body=undefined, grist-1 | 2026-11-02T03:00:16.643740968Z 2026-11-02 03:00:16.643 - warn: Error during api call to /v1/info/server: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/info/server, userId=1, altSessionId=t2xewBFZzqLXYbfhgv73Eb, body=undefined, grist-1 | 2026-11-02T03:00:16.644115593Z 2026-11-02 03:00:16.644 - warn: Error during api call to /v1/info/server: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/info/server, userId=1, altSessionId=8Y4BD6ZSJbGszf5dj3HgiW, body=undefined, grist-1 | 2026-11-02T03:00:17.435514052Z 2026-11-02 03:00:17.435 - warn: Error during api call to /upload: Grist is not yet configured. Visit /boot to set up this installation. path=/upload, userId=1, altSessionId=1qKpb87b7J73eRA263pR5B, body=undefined, grist-1 | 2026-11-02T03:00:17.437214135Z 2026-11-02 03:00:17.437 - warn: Error during api call to /upload: Grist is not yet configured. Visit /boot to set up this installation. path=/upload, userId=1, altSessionId=4Wmr6xv5ZpLwSqRbs9rp7a, body=undefined, grist-1 | 2026-11-02T03:00:17.437790385Z 2026-11-02 03:00:17.437 - warn: Error during api call to /2.0/mlflow/registered-models/create: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/registered-models/create, userId=1, altSessionId=st7fZWgC847Fr7S9D9A6kA, body=undefined, grist-1 | 2026-11-02T03:00:17.439358385Z 2026-11-02 03:00:17.439 - warn: Error during api call to /2.0/mlflow/registered-models/create: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/registered-models/create, userId=1, altSessionId=hrN8hTjVzFgPNqBGUaeLgs, body=undefined, grist-1 | 2026-11-02T03:00:17.460208135Z 2026-11-02 03:00:17.460 - warn: Error during api call to /2.0/mlflow/model-versions/create: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/model-versions/create, userId=1, altSessionId=hrN8hTjVzFgPNqBGUaeLgs, body=undefined, grist-1 | 2026-11-02T03:00:17.461326885Z 2026-11-02 03:00:17.461 - warn: Error during api call to /2.0/mlflow/experiments/list: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/experiments/list, userId=1, altSessionId=68LgbY9byx2JS5fS9JE5xq, body=undefined, grist-1 | 2026-11-02T03:00:17.461715468Z 2026-11-02 03:00:17.461 - warn: Error during api call to /2.0/mlflow/experiments/list: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/experiments/list, userId=1, altSessionId=4SkyfetWjRWk8o7qFeKA5h, body=undefined, grist-1 | 2026-11-02T03:00:17.473448343Z 2026-11-02 03:00:17.473 - warn: Error during api call to /2.0/mlflow/model-versions/create: Grist is not yet configured. Visit /boot to set up this installation. path=/2.0/mlflow/model-versions/create, userId=1, altSessionId=st7fZWgC847Fr7S9D9A6kA, body=undefined, grist-1 | 2026-11-02T03:00:17.549273802Z 2026-11-02 03:00:17.548 - warn: Error during api call to /v1/auth/password/forgot: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/auth/password/forgot, userId=1, altSessionId=6fCkuVeG4HDJ2rKuy5f2v8, body=undefined, grist-1 | 2026-11-02T03:00:17.549286635Z 2026-11-02 03:00:17.549 - warn: Error during api call to /v1/auth/password/forgot: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/auth/password/forgot, userId=1, altSessionId=1X1e38xGv5CfGM2dmNNs9T, body=undefined, grist-1 | 2026-11-02T03:00:17.592570135Z 2026-11-02 03:00:17.592 - warn: Error during api call to /system/system/string_render: Grist is not yet configured. Visit /boot to set up this installation. path=/system/system/string_render, userId=1, altSessionId=11fD8d4BexfwEpua4oa1qv, body=undefined, grist-1 | 2026-11-02T03:00:17.592955677Z 2026-11-02 03:00:17.592 - warn: Error during api call to /system/system/string_render: Grist is not yet configured. Visit /boot to set up this installation. path=/system/system/string_render, userId=1, altSessionId=fuzM1U9UwqcM9mBnRSsMYm, body=undefined, grist-1 | 2026-11-02T03:00:17.781087094Z 2026-11-02 03:00:17.780 - warn: Error during api call to /4/system: Grist is not yet configured. Visit /boot to set up this installation. path=/4/system, userId=1, altSessionId=qQ4QPLeVXndh5giMqtun4t, body=undefined, grist-1 | 2026-11-02T03:00:17.781253802Z 2026-11-02 03:00:17.781 - warn: Error during api call to /4/system: Grist is not yet configured. Visit /boot to set up this installation. path=/4/system, userId=1, altSessionId=2kSE5qtuR3hVYqWHCW8LXm, body=undefined, grist-1 | 2026-11-02T03:00:20.512609095Z 2026-11-02 03:00:20.511 - warn: Error during api call to /jolokia/: Bad request: unsupported Authorization scheme, expected 'Bearer' path=/jolokia/, userId=undefined, altSessionId=undefined, body=undefined, grist-1 | 2026-11-02T03:00:20.512635428Z 2026-11-02 03:00:20.512 - warn: Error during api call to /jolokia/: Bad request: unsupported Authorization scheme, expected 'Bearer' path=/jolokia/, userId=undefined, altSessionId=undefined, body=undefined, grist-1 | 2026-11-02T03:00:20.543962095Z 2026-11-02 03:00:20.543 - warn: Error during api call to /metalakes: Grist is not yet configured. Visit /boot to set up this installation. path=/metalakes, userId=1, altSessionId=5ZggtMSFC9EowVCSvurecU, body=undefined, grist-1 | 2026-11-02T03:00:20.544468595Z 2026-11-02 03:00:20.544 - warn: Error during api call to /metalakes: Grist is not yet configured. Visit /boot to set up this installation. path=/metalakes, userId=1, altSessionId=1XxXvD7aj9eu5Sdg8tsfZr, body=undefined, grist-1 | 2026-11-02T03:00:20.577283762Z 2026-11-02 03:00:20.577 - warn: Error during api call to /stripe/webhook: Grist is not yet configured. Visit /boot to set up this installation. path=/stripe/webhook, userId=1, altSessionId=hYJhWT2W6NQAAXMsxHWavQ, body=undefined, grist-1 | 2026-11-02T03:00:20.577788178Z 2026-11-02 03:00:20.577 - warn: Error during api call to /stripe/webhook: Grist is not yet configured. Visit /boot to set up this installation. path=/stripe/webhook, userId=1, altSessionId=7r6WLQ1kPU3qkN6warJuZ8, body=undefined, grist-1 | 2026-11-02T03:00:20.608242220Z 2026-11-02 03:00:20.608 - warn: Error during api call to /app:getInfo: Grist is not yet configured. Visit /boot to set up this installation. path=/app:getInfo, userId=1, altSessionId=sBUZ5Hrdr9kB98bLNibAMz, body=undefined, grist-1 | 2026-11-02T03:00:20.608405553Z 2026-11-02 03:00:20.608 - warn: Error during api call to /app:getInfo: Grist is not yet configured. Visit /boot to set up this installation. path=/app:getInfo, userId=1, altSessionId=6YPCrqrQce8vKQztCSzAJa, body=undefined, grist-1 | 2026-11-02T03:00:20.620371678Z 2026-11-02 03:00:20.620 - warn: Error during api call to /app:getInfo: Grist is not yet configured. Visit /boot to set up this installation. path=/app:getInfo, userId=1, altSessionId=iw84wr6q6RQc8WsWowgfTH, body=undefined, grist-1 | 2026-11-02T03:00:20.620380720Z 2026-11-02 03:00:20.620 - warn: Error during api call to /app:getInfo: Grist is not yet configured. Visit /boot to set up this installation. path=/app:getInfo, userId=1, altSessionId=2RLct76e3sFtQmJdHssQyY, body=undefined, grist-1 | 2026-11-02T03:00:20.671481470Z 2026-11-02 03:00:20.671 - warn: Error during api call to /action/status_show: Grist is not yet configured. Visit /boot to set up this installation. path=/action/status_show, userId=1, altSessionId=7wGKd3vf7xpAbbhnMMfXpq, body=undefined, grist-1 | 2026-11-02T03:00:20.672884137Z 2026-11-02 03:00:20.672 - warn: Error during api call to /action/status_show: Grist is not yet configured. Visit /boot to set up this installation. path=/action/status_show, userId=1, altSessionId=h85mY5FniL4s5bdeGXtfdi, body=undefined, grist-1 | 2026-11-02T03:00:20.703460262Z 2026-11-02 03:00:20.703 - warn: Error during api call to /install: Grist is not yet configured. Visit /boot to set up this installation. path=/install, userId=1, altSessionId=j556G3f3yEVyKVBHCgvxgC, body=undefined, grist-1 | 2026-11-02T03:00:20.705946720Z 2026-11-02 03:00:20.705 - warn: Error during api call to /install: Grist is not yet configured. Visit /boot to set up this installation. path=/install, userId=1, altSessionId=pJnhwMRjf6r82EH1pQKtxr, body=undefined, grist-1 | 2026-11-02T03:00:21.510974637Z 2026-11-02 03:00:21.510 - warn: Error during api call to /version: Grist is not yet configured. Visit /boot to set up this installation. path=/version, userId=1, altSessionId=dd9nktVyyRiZbxYsVeQbou, body=undefined, grist-1 | 2026-11-02T03:00:21.511508345Z 2026-11-02 03:00:21.511 - warn: Error during api call to /version: Grist is not yet configured. Visit /boot to set up this installation. path=/version, userId=1, altSessionId=ePkvYE15bMY4U642MzZeac, body=undefined, grist-1 | 2026-11-02T03:00:21.528800387Z 2026-11-02 03:00:21.528 - warn: Error during api call to /captcha: Grist is not yet configured. Visit /boot to set up this installation. path=/captcha, userId=1, altSessionId=keTDjSN2i573KhPLKEpSaq, body=undefined, grist-1 | 2026-11-02T03:00:21.531247179Z 2026-11-02 03:00:21.531 - warn: Error during api call to /captcha: Grist is not yet configured. Visit /boot to set up this installation. path=/captcha, userId=1, altSessionId=mB3QB2W5TtKSpE9BNqHAXe, body=undefined, grist-1 | 2026-11-02T03:00:21.669004929Z 2026-11-02 03:00:21.667 - warn: Error during api call to /system/getConf: Grist is not yet configured. Visit /boot to set up this installation. path=/system/getConf, userId=1, altSessionId=qDnMsofSZRJwCMKpWtFaxM, body=undefined, grist-1 | 2026-11-02T03:00:21.669021804Z 2026-11-02 03:00:21.668 - warn: Error during api call to /system/getConf: Grist is not yet configured. Visit /boot to set up this installation. path=/system/getConf, userId=1, altSessionId=smgzirEsxERMqv8LfkdJ7H, body=undefined, grist-1 | 2026-11-02T03:00:22.431425846Z 2026-11-02 03:00:22.431 - warn: Error during api call to /: Grist is not yet configured. Visit /boot to set up this installation. path=/, userId=1, altSessionId=uNdhZAVMmoEB3RK3zL4Bj7, body=undefined, params=undefined grist-1 | 2026-11-02T03:00:22.431983262Z 2026-11-02 03:00:22.431 - warn: Error during api call to /: Grist is not yet configured. Visit /boot to set up this installation. path=/, userId=1, altSessionId=2j77yVs5KUa5VM7amMZnkY, body=undefined, params=undefined grist-1 | 2026-11-02T03:00:22.439895346Z 2026-11-02 03:00:22.439 - warn: Error during api call to /v1/models: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/models, userId=1, altSessionId=ddkDxYsDfu1mhgMJoHXS4K, body=undefined, grist-1 | 2026-11-02T03:00:22.441343762Z 2026-11-02 03:00:22.441 - warn: Error during api call to /v1/models: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/models, userId=1, altSessionId=hLvLfjwyNBfqY11rrLz8y4, body=undefined, grist-1 | 2026-11-02T03:00:22.529082054Z 2026-11-02 03:00:22.528 - warn: Error during api call to /v1/repos/search: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/repos/search, userId=1, altSessionId=uCUgbCb3P1jppabhT1TePn, body=undefined, grist-1 | 2026-11-02T03:00:22.529394804Z 2026-11-02 03:00:22.529 - warn: Error during api call to /version: Grist is not yet configured. Visit /boot to set up this installation. path=/version, userId=1, altSessionId=vKZybep7fTr7dqNDsvASv1, body=undefined, grist-1 | 2026-11-02T03:00:22.540853971Z 2026-11-02 03:00:22.540 - warn: Error during api call to /version: Grist is not yet configured. Visit /boot to set up this installation. path=/version, userId=1, altSessionId=5UpFRFdCjzzuHuJWKnwcTC, body=undefined, grist-1 | 2026-11-02T03:00:22.609972638Z 2026-11-02 03:00:22.609 - warn: Error during api call to /v1/repos/search: Grist is not yet configured. Visit /boot to set up this installation. path=/v1/repos/search, userId=1, altSessionId=qyro5XMaYMPGKFjx4vKkhc, body=undefined, grist-1 | 2026-11-02T03:00:22.776487554Z 2026-11-02 03:00:22.775 - info: Comm: Got Websocket connection clientId=4501f75838aaa594, counter=null, urlPath=/, reuseClient=false grist-1 | 2026-11-02T03:00:22.776804679Z 2026-11-02 03:00:22.776 - info: Comm: Got Websocket connection clientId=fa746100b1def6b7, counter=null, urlPath=/, reuseClient=false grist-1 | 2026-11-02T03:00:22.779160679Z 2026-11-02 03:00:22.779 - info: Client onMessage: unknown method '{"type":"custom","event":"vite:invoke","data":{"id":"vite-invoke:send:0","name":... (129 length)' org=docs, [email protected], userId=1, clientId=4501f75838aaa594, counter=null grist-1 | 2026-11-02T03:00:22.779542638Z 2026-11-02 03:00:22.779 - warn: Client responding to #NaN ERROR Unknown method undefined org=docs, [email protected], userId=1, clientId=4501f75838aaa594, counter=null grist-1 | 2026-11-02T03:00:22.780331721Z 2026-11-02 03:00:22.780 - info: Client onMessage: unknown method '{"type":"custom","event":"vite:invoke","data":{"id":"vite-invoke:send:0","name":... (129 length)' org=docs, [email protected], userId=1, clientId=fa746100b1def6b7, counter=null grist-1 | 2026-11-02T03:00:22.780503804Z 2026-11-02 03:00:22.780 - warn: Client responding to #NaN ERROR Unknown method undefined org=docs, [email protected], userId=1, clientId=fa746100b1def6b7, counter=null grist-1 | 2026-11-02T03:00:22.781201846Z 2026-11-02 03:00:22.781 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=fa746100b1def6b7, counter=null grist-1 | 2026-11-02T03:00:22.781206846Z 2026-11-02 03:00:22.781 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=4501f75838aaa594, counter=null grist-1 | 2026-11-02T03:00:25.239150805Z 2026-11-02 03:00:25.238 - info: Publishing 1.7.22 as the latest available version grist-1 | 2026-11-02T03:00:25.239459472Z 2026-11-02 03:00:25.239 - info: Setting 1.7.22 as the latest available version grist-1 | 2026-11-02T03:00:25.775054306Z 2026-11-02 03:00:25.774 - info: Comm: Got Websocket connection clientId=38e1ba360035d3c8, counter=null, urlPath=/terminal/ws, reuseClient=false grist-1 | 2026-11-02T03:00:25.775565889Z 2026-11-02 03:00:25.775 - info: Comm: Got Websocket connection clientId=512f5667b78d827f, counter=null, urlPath=/terminal/ws, reuseClient=false grist-1 | 2026-11-02T03:00:25.791425306Z 2026-11-02 03:00:25.791 - info: Comm: Got Websocket connection clientId=203f6fa75e214401, counter=null, urlPath=http://169.254.169.254/metadata/v1.json, reuseClient=false grist-1 | 2026-11-02T03:00:25.791744847Z 2026-11-02 03:00:25.791 - info: Comm: Got Websocket connection clientId=5e4f409cffb76c30, counter=null, urlPath=http://169.254.169.254/metadata/v1.json, reuseClient=false grist-1 | 2026-11-02T03:00:45.156312550Z 2026-11-02 03:00:45.155 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=5e4f409cffb76c30, counter=null grist-1 | 2026-11-02T03:00:45.157032425Z 2026-11-02 03:00:45.156 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=512f5667b78d827f, counter=null grist-1 | 2026-11-02T03:00:45.157122133Z 2026-11-02 03:00:45.157 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=203f6fa75e214401, counter=null grist-1 | 2026-11-02T03:00:45.157182508Z 2026-11-02 03:00:45.157 - info: Client websocket closed; will discard client in 300 sec org=docs, [email protected], userId=1, clientId=38e1ba360035d3c8, counter=null