--- title: Upgrading to 2025-10 description: > This guide describes how to upgrade your point-of-sale UI extension to API version `2025-10` and adopt [Polaris](/beta/next-gen-dev-platform/polaris) web components. api_version: 2025-10 api_name: pos_ui_extensions source_url: html: >- https://shopify.dev/docs/api/pos-ui-extensions/2025-10-rc/upgrading-to-2025-10 md: >- https://shopify.dev/docs/api/pos-ui-extensions/2025-10-rc/upgrading-to-2025-10.txt --- # Upgrading to 2025-10 This guide describes how to upgrade your point-of-sale UI extension to API version `2025-10` and adopt [Polaris](https://shopify.dev/beta/next-gen-dev-platform/polaris) web components. *** ## Update API version Set the API version to `2025-10` in `shopify.extension.toml` to use Polaris web components. Early access preview We do not recommend migrating your production point-of-sale UI extension to Polaris yet. However, now is a great time to explore this new version and start thinking about what it means for your own extensions. ### Examples * #### shopify.extension.toml ##### shopify.extension.toml ```toml api_version = "2025-10" [[extensions]] name = "your-extension" handle = "your-extension" type = "ui_extension" # Contents of your existing file... ``` ## Adjust package dependencies As of `2025-10`, Shopify recommends Preact for UI extensions. Update the dependencies in your `package.json` file and re-install. New dependencies with Preact Previous dependencies with React Previous dependencies with JavaScript ### Examples * #### New dependencies with Preact ##### package.json ```json { "dependencies": { "preact": "^10.10.x", "@shopify/ui-extensions": "~2025.10.0-rc" } } ``` ## Make TypeScript adjustments These steps make TypeScript aware of the new global `shopify` object. Skip these steps if your app was not built using TypeScript. 1\. Update your extension's tsconfig.json Update your extension config at a path like `extensions/{extension-name}/tsconfig.json`. You do **not** need to change your app's root `tsconfig.json` file. 2\. Generate type definition file to support new global shopify object These commands generate a `shopify.d.ts` file in your extension directory. This imports UI Extension component types and declares the shopify API object for each extension target. ### Examples * #### Update your extension's tsconfig.json ##### New tsconfig.json ```json { "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact", "target": "ES2020", "checkJs": true, "allowJs": true, "moduleResolution": "node", "esModuleInterop": true } } ``` ##### Old tsconfig.json ```json { "compilerOptions": { "jsx": "react-jsx" }, "include": ["./src"] } ``` ## Migrate API calls Instead of accessing APIs from a callback parameter, access them from the global `shopify` object. Here's an example of migrating API calls. New API calls in Preact Previous API calls in React Previous API calls in JavaScript ### Examples * #### New API calls in Preact ##### Preact ```tsx import '@shopify/ui-extensions/preact'; import {render} from 'preact'; export default function extension() { render(, document.body); } function Extension() { return Print; } async function onButtonClick() { await shopify.print.print('documents/test-print'); console.log('print completed'); } ``` ## Migrate hooks If you had previously been using React hooks, import those same hooks from a new Preact-specific package. Here's an example of migrating hooks. New hooks in Preact Previous hooks in React ### Examples * #### New hooks in Preact ##### Preact ```tsx import '@shopify/ui-extensions/preact'; import {render} from 'preact'; import {useState, useEffect} from 'preact/hooks'; export default function extension() { render(, document.body); } function ConnectivityStatus() { const [isConnected, setIsConnected] = useState( shopify.connectivity.current.value.internetConnected === 'Connected', ); useEffect(() => { const unsubscribe = shopify.connectivity.current.subscribe( (newConnectivity) => { setIsConnected(newConnectivity.internetConnected === 'Connected'); }, ); return unsubscribe; }, []); return ( Status: {isConnected ? 'Online' : 'Offline'} ); } ``` ## Migrate to Polaris web components Polaris web components are exposed as custom HTML elements. Update your React or JavaScript components to custom elements. New components in Preact Previous components in React Previous components in JavaScript ### Examples * #### New components in Preact ##### Preact ```tsx /* eslint-disable react/self-closing-comp */ import '@shopify/ui-extensions/preact'; import {render} from 'preact'; export default function extension() { render(, document.body); } function Extension() { return ( Save ); } ``` ## Polaris web components Early access preview These web components are an early access preview of the [Polaris](https://shopify.dev/beta/next-gen-dev-platform/polaris) UI framework. We will add more components over time. Use the comparison table below to see which Polaris web components are available today, which are coming soon, and how they map to legacy components. ## Mapping legacy components to Polaris web components | **Legacy Component** | **Polaris Web Component** | **Migration Notes** | | - | - | - | | `Badge` | [`Badge`](polaris-web-components/titles-and-text/badge) | Available | | `Banner` | [`Banner`](polaris-web-components/feedback/banner) | Available | | `Box` | [`Box`](polaris-web-components/structure/box) | Available | | `Button` | [`Button`](polaris-web-components/actions/button) | Available | | `CameraScanner` | `CameraScanner` | Coming soon | | `DateField` | [`DateField`](polaris-web-components/forms/datefield) | Available | | `DatePicker` | [`DatePicker`](polaris-web-components/forms/datepicker) | Available | | `DatePicker` | [`DateSpinner`](polaris-web-components/forms/datespinner) | Available, Replaces `DatePicker.inputMode="spinner"` | | `Dialog` | [`Modal`](polaris-web-components/structure/modal) | Available | | `EmailField` | [`EmailField`](polaris-web-components/forms/emailfield) | Available | | `Heading` | [`Heading`](polaris-web-components/titles-and-text/heading) | Available | | `Icon` | [`Icon`](polaris-web-components/media/icon) | Available, more icons coming soon. | | `Image` | [`Image`](polaris-web-components/media/image) | Available | | `List` | VirtualizedList | Coming soon | | `Navigator` | | Removed. | | `NumberField` | [`NumberField`](polaris-web-components/forms/numberfield) | Available | | `PinPad` | | Coming soon | | `POSBlock` | [`POSBlock`](polaris-web-components/structure/posblock) | Available | | `POSBlockRow` | | Replaced by `POSBlock` | | `POSReceiptBlock` | | Replaced by `POSBlock` | | `PrintPreview` | `DocumentPreview` | Coming soon | | `QRCode` | `QRCode` | Coming soon | | `RadioButtonList` | [`ChoiceList`](polaris-web-components/forms/choicelist) | Available | | `Screen` | [`Page`](polaris-web-components/structure/page) | Available | | `ScrollView` | [`ScrollBox`](polaris-web-components/structure/scrollbox) | Available | | `SearchBar` | [`SearchField`](polaris-web-components/forms/searchfield) | Available | | `Section` | [`Section`](polaris-web-components/structure/section) | Available | | `SectionHeader` | | Use `Section.heading` | | `SegmentedControl` | `Tabs`/`Tab` | Coming soon | | `Selectable` | [`Clickable`](polaris-web-components/actions/clickable) | Available | | `Stack` | [`Stack`](polaris-web-components/structure/stack) | Available | | `Stepper` | [`NumberField`](polaris-web-components/forms/numberfield) | Use `NumberField` with stepper controls | | `Text` | [`Text`](polaris-web-components/titles-and-text/text) | Available | | `TextArea` | [`TextArea`](polaris-web-components/forms/textarea) | Available | | `TextField` | [`TextField`](polaris-web-components/forms/textfield) | Available | | `Tile` | [`Tile`](polaris-web-components/actions/tile) | Available | | `TimeField` | [`TimeField`](polaris-web-components/forms/timefield) | Available | | `TimePicker` | [`TimePicker`](polaris-web-components/forms/timepicker) | Available |