Skip to main content
2026-10-22

Changed

  • experimental_useDataTable cells can return a Fragment to show several items, as well as an array.
2026-10-21

Added

  • Added ConfigSchema.attioActivity(), OutcomeSchema.attioActivity() and OutcomeValue.attioActivity(...) for workflow block config and outcomes that hold an activity, such as a call or meeting type. Pick one in the configurator with AttioActivityInput, and narrow an outcome to one activity with .activity({slug}).
  • Added ConfigSchema.attioActivityRecord(), OutcomeSchema.attioActivityRecord() and OutcomeValue.attioActivityRecord(...) for workflow block config and outcomes that hold an activity record. Bind one or many from a variable with AttioActivityRecordInput, limited to the activities in activitySlug, and narrow an outcome to one activity with .activity({slug}).
  • Added experimental_useDataTable, a virtualized data table. Pass it your rows and columns and render the DataTable it returns. Cells can show text, numbers, dates and SDK components such as Badge, Link and Button, columns sort, and rows can be selected.
2026-10-19

Added

  • Added first_name and last_name to User in GraphQL queries, alongside name.
2026-10-15

Changed

  • Widget.TextWidget now accepts Widget.Decoration and rejects a bare Badge.

Fixed

  • Fixed DescriptionList error messages referring to a component that doesn’t exist.
  • Fixed Divider overhanging the content on app pages and record tabs.
  • Fixed new apps failing lint and format:check on generated GraphQL types.
  • Fixed Chart.Funnel clipping its labels when it scrolls.
  • Fixed Chart.Line and Chart.Bar y-axes not ending on a round number.
  • Fixed fetch in server functions ignoring signal. Aborting the signal, for example with AbortSignal.timeout, now rejects with the signal’s reason and cancels the request.
2026-10-02

Changed

  • Settings pages can now render any component from attio/client, such as Stack, Typography or Table, alongside the components returned by Settings.useForm. The regular useForm, Button, EmptyState and LoadingState are not supported on settings pages: linting flags them, attio build fails, and they do not render.
  • New apps use ESLint v10. The lint rules in the default app template are unchanged, plus the rules ESLint v10 adds to its recommended set: no-unassigned-vars, no-useless-assignment and preserve-caught-error.
2026-09-22

Added

  • Added Image, which renders an image from an HTTPS URL and handles its loading and failure states. Size it with size (small, medium, large or fill) and aspectRatio; fit chooses between cropping and containing the image.
2026-09-21

Added

  • Table.Cell now accepts Button components. A cell that contains buttons must contain only buttons. A single button renders inline; two or more collapse into a menu on the cell, where picking an action runs that button’s onClick.
2026-09-14

Added

  • Added pages. Extensions.definePage defines a full page of your app, default-exported from src/app/pages/<slug>/page.tsx. Pages are listed under Apps in the workspace sidebar and served at /{workspaceSlug}/apps/{appSlug}/<slug>.
  • Added record tabs. Extensions.defineExtension({type: "record-tab", ...}) renders a React component as a tab on the record pages of the objects you choose.
  • Added navigation. Destinations builds a place inside Attio to point the user at: one of your app’s pages, a record (optionally on a given tab) or your app’s settings page. navigate takes the user there and AttioLink renders a link to it.
  • Added Chart, with Chart.Bar, Chart.Line, Chart.Pie, Chart.Metric, Chart.Funnel and Chart.Loading.
  • Added the layout components Card, Grid, Stack and EmptyState.
2026-09-10

Fixed

  • Fixed Badge and StatusBadge stretching to the full width of their container when placed directly inside a Section.
  • Fixed Badge rendering as plain text inside dialogs. It now renders as a badge anywhere StatusBadge does.

Changed

  • The default app template no longer includes Biome. Newly created apps lint with ESLint (eslint.config.js, replacing eslint.attio.config.js) and format with Prettier.
2026-09-08

Changed

  • Production builds (attio build and attio version create) now minify dependency code from node_modules and build it with process.env.NODE_ENV set to "production", so dev-only branches in dependencies are dropped. This shrinks the uploaded bundle. Your own application code is left unminified, and attio dev is unchanged.
2026-09-03

Added

  • Added ConfigSchema.record(...) for config that holds any number of keys under a single value schema, like a TypeScript Record<string, TValue>.
2026-08-24

Added

  • Added linting that flags components imported from attio/client inside Settings.defineWorkspacePage callbacks, where components returned by Settings.useForm must be used instead.

Fixed

  • Fixed a type error when binding CollectionInput to an optional array (ConfigSchema.array(...).optional()).
  • Fixed dev server and bundling issues on Windows operating system
2026-08-11
The App SDK is stable. attio and create-attio were previously published as dated 0.0.1-experimental.<date> builds. From 1.0.0 they follow semantic versioning, and are always released together at the same version.

What stable means

  • Everything exported from attio, attio/client and attio/server will not change incompatibly within the 1.x line unless marked as experimental or deprecated. Breaking changes require a new major version.
  • Additive changes ship as minor versions and fixes ship as patches, so ^1.0.0 picks up both.
  • Individual APIs that are still taking shape are marked as experimental in their documentation and carry an Experimental_ prefix. They are excluded from the guarantee above and can change or be removed in a minor release. Apps submitted for review must not use them.

What you can build

If you have not built on Attio before, start with creating an app.