v1.22.0
Released to production on November 12, 2026 at 04:28 CST. See every commit in this release on GitHub
New
- AI: native import job offers the next wave above its wave list, five waves at a time
- Native: Bring my site start screen in the apps
- AI: native import job page offers the next wave with Keep my site or Improve it
- Pos: take cards offline on a store's own Stripe account, Apple and Android
- Pos: offline card sales for stores on their own Stripe account, server and contracts
- Native: the Kotlin port of the one path resolver
- Native: one path resolver for every way into a place
Fixed
- Build: next.config prints nothing while Nx reads the project graph
- Build: the svg-icons build writes its package.json into dist again
- Apple: iPad Media's folder crumbs keep their names: Include subfolders and the view take a second row when the list column is narrow
- Native: Home stats match Figma: View details on the Traffic head row, the device split shrinks rather than truncates, Android's range is the white pill, Needs you lines 57 tall and 4 apart
- Apple: a phone area's title row draws the screen's actions with the row's own context, so its secondary actions fold into ⋯
- Kotlin: Android area heads: a phone title row with ▾ and ☆ for Pages, Content and Media; Home's Live line; a 40 dp phone search; CRM and Products head their list column
- Apple: a phone area's title row shows its secondary actions as one ⋯ and its actions as symbols
- Apple: every phone area gets its title row with ▾, the Activity sheet opens full height, Home drops its large title
- Kotlin: the phone Home's tile groups sit 120 apart again, not 172
- Native: a list pushed over an area (Bookings > Services) heads its own list column
- Native: a save pressed while it is held is kept and saves once confirmed
- Dependencies: drop the unused firebase-functions-test so cloud/functions installs on firebase-admin 14
- Native: an empty list's folded detail leaves the head and its crumbs to the shell
- Data: the Datasets card says it is loading until the server answers
- Console: a Save pressed during the seed hold is kept and saves once confirmed
- Native: an action's question shows on the iPad, so Site settings › Plugins switches ask and save
- Native: local-day-bounds joins the proven-pure modules
- Native: iPad and Mac area heads sit in the list column, with the sections under the title
- Native: the switcher names each account as its header last did
- Native: the account lists name the account on screen as the header does
- Apple: Add account shows its sign-in form again
- Native: a DNS or tag check that is not there yet shows as information
- Native: a list row's switch draws no label of its own inside a grouped form
- Native: a Setup row on the iPad and Mac opens as its area, under the crumbs
- AI: size an Improve redesign inside its page ceiling and tell it its room
- Ios: the offline banner's Retry sits beside its message
- Native: name the earlier Google address only to a site that used it
- Ios: a share button inside a POS sheet opens the share sheet
- Ios: a section pushed over a pinned tab draws its title like any pushed area
- Ios: the register's Day totals keeps its report, and Today stays today
- Tooling: the duplication measure reads factories nested in a strict-mode array
- Apple: System appearance clears every window override, so Dark never sticks
- Commerce: the cart asks its pickup and delivery options once per load
- Forms: a field cleared and saved reads Up to date again
- Native: an iPad list column's head fits it, and its crumbs head the detail
- Android: an answer's documentation link opens in the in-app browser
- Sales channels: name the earlier Google address only to a site that used it
- Android: Back on a tablet goes up a media folder before it leaves Media
- Native: the Reservations look-ahead reads the stays, and its chips wrap
- Native: the /products/reservations link opens the native Reservations screen
- Ios: a section opened on a pinned phone tab is pushed over it
- Android: the phone's bell opens Activity, not the wide shell's popover
- Android: a workspace's place leaves the site, and a pinned tab stays selected
- Ios: a starred setting selects its own row in its mode
- Tooling: scaffold the .swcrc the plugin build reads
- Android: a Starred or Recent place in another workspace waits for it
- Native: Android AI sheet answers render their links and inline markdown
- Pos: the register's offline banner and card notices follow every sync, Apple and Android
- Pos: release the customer's hold on an offline card refused as another account's
- Tooling: keep a test target in the plugin scaffold
- Build: run inferred lint and jest from the workspace root, as the executors did
- Tooling: read Next apps and scaffold plugins without removed executors
- Next: keep production builds in dist/apps/<app>/.next without withNx
- Build: finish the nx 24 target conversions the migrations left
- Android: open the whole path from Starred, Recent, search, notices, pushes and links
- Ios: open the whole path from Starred, Recent, search, notices, pushes and links
Performance
- CRM: the plugin's load reads small modules, not the field and report tables
- Sites: every published page stops loading the plugin catalog copy and lodash
- UI components: both collection search elements load the search box through one import
Documentation
- Typescript: record why the TS 6 bridge stays on TS 7.0.2
Behind the scenes
- Console: the kept-press specs press Save once they have seen it is pressable
- Tooling: raise the Linear issue ceiling to AGL-4222
- Apple: the tabs UI test taps the seeded site's row once, not its two matches
- Data: the Datasets card loading state is ready to merge
- Console: kept seed-hold presses ready to merge
- Native Apple: a filled form field keeps its name above it
- Native ownership transfer: candidates show the member's name, email and photo, as the console's member rows do
- Kotlin: the roster name check reads the stored roster
- CRM: plugin budget headroom ready to merge
- Sites: every-page headroom ready to merge
- Ios: the phone navigation test finds a tab by its tab bar button
- the next 16.4.6 reland is checked on merged main, ready to merge
- dependency sweep ready to merge
- AI: re-record the device audit on axe-core 4.14.0
- Dependencies: upgrade Next.js to 16.4.6 again for seven moderate advisories
- Tooling: raise the Linear issue ceiling to AGL-4220
- Data: find the grid's Filters panel by its dialog role
- cart options asked once, ready to merge
- Native counts read every match, not the query's window
- cleared field reads Up to date, ready to merge
- earlier Google address notice ready to merge
- Dependencies: adopt firebase-admin 14 in cloud/functions
- Dependencies: adopt jsdom 31
- Dependencies: adopt cypress 16
- Dependencies: adopt vitest 5 and @vitest/ui 5
- Dependencies: adopt framer-motion 14
- Dependencies: adopt eslint-plugin-mobx 0.2
- Dependencies: adopt mobx-state-tree 9
- Dependencies: adopt @stripe/stripe-js 10 and @stripe/react-stripe-js 7
- Dependencies: take every patch and minor in root, cloud/functions and apps/docs
- Native: openSite holds the app model strongly, as the shell's other hooks do
- Native Day report byline: an invented store name in its examples and tests
- Native Day totals test: check today's label after the spreadsheet's name
- Native iPhone Sites: drop the row's Edited column on a phone, card under the chips
- Native Day totals and Day report: dates, not ISO days; Day report gets its head
- Native: title-bar Back restores the sidebar's mode and scope
- POS iPad: the offline banner and kiosk queue sit in the register's catalog column, beside a full-height basket
- Native iPhone Orders: report rows are the orders' record rows
- Native Apple: iPhone grouped forms on the 16-point phone edge
- Nx migrate: convert console and tenant to @nx/next/plugin
- Nx migrate: register @nx/js/typescript for typecheck inference
- Nx migrate: replace nxViteTsPaths with resolve.tsconfigPaths
- Nx migrate: convert shared-svg-icons build to @nx/vite/plugin
- Nx migrate: convert console-e2e to @nx/cypress/plugin
- Nx migrate: convert @nx/eslint:lint targets to @nx/eslint/plugin
- Nx migrate: convert @nx/jest:jest targets to @nx/jest/plugin
- Nx migrate: keep project-level nx affected (affected.legacy)
- Nx migrate: add the nx 24 AI migration prompts written by nx migrate
- Pos: the offline kit request asks for the direct-charge kit on both apps
- Dependencies: nx 23.3.0 -> 24.0.6 via nx migrate latest
Share this article
We're building the open web platform. Follow along as we ship — and tell us what you need.