{"id":6843,"date":"2026-08-19T18:59:03","date_gmt":"2026-08-19T22:59:03","guid":{"rendered":"https:\/\/ionic.io\/blog\/?p=6843"},"modified":"2026-08-19T18:59:04","modified_gmt":"2026-08-19T22:59:04","slug":"announcing-ionic-framework-9","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9","title":{"rendered":"Announcing Ionic Framework 9"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Ionic Framework 9<\/strong> is here! \ud83d\ude80<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This one took a while, and it gave us a chance to step back and listen to the people using Ionic. On GitHub, Discord, and the Developer Feedback Portal, we kept hearing the same things: better router support, broader Angular compatibility, and upgrades that don&#8217;t turn into a weekend project. The community was asking us to keep up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So that&#8217;s what we did. Ionic Framework 9 brings React Router 6 and Vue Router 5 support, compatibility with Angular 18 through 22, updated Stencil output targets, richer Select options, font icon support, and a new migration tool to make upgrading from v8 easier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s what&#8217;s new in v9.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 id=\"h-react-router-v6\" class=\"wp-block-heading\">React Router v6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This was the number one request, and it&#8217;s done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;d looked at React Router 6 before and hit a wall. It changed how routing works, and our integration relied on parts of React Router 5 that no longer existed. Supporting v6 meant rethinking that integration from the ground up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic now owns how views are retained and cleaned up during navigation rather than relying on React Router&#8217;s internals. We chose to support v6 before moving to v7, which gave us the opportunity to validate the new approach and fix long-standing issues along the way, including swipe-to-go-back on parameterized routes. Because Ionic no longer depends on React Router&#8217;s internals and with the investment in comprehensive test coverage, moving to v7 should be a much smaller job. React Router 7 is next on our roadmap, and this new integration puts us in a much better position to support it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The community also helped test early builds and surfaced issues we wouldn&#8217;t have found on our own. Thank you to everyone who took the time to test, report issues, and provide feedback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check out the <a href=\"https:\/\/ionicframework.com\/docs\/updating\/9-0#react-router\">Migration Guide<\/a> for all the details.<br><\/p>\n\n\n\n<h2 id=\"h-vue-router-v5\" class=\"wp-block-heading\">Vue Router v5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vue Router 5 support is here, and for most Vue Router 4 users, the upgrade is straightforward. Your routes, navigation guards, and <code>IonRouterOutlet<\/code> integration can stay as they are, with no runtime breaking changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is one migration to be aware of: calling <code>next()<\/code> in a navigation guard is deprecated in Vue Router 5. The minimum supported Vue version also moves to <code>3.5<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also added a Playwright test suite for the Vue Router integration, giving us better coverage today and making future Vue Router upgrades easier to validate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check out the <a href=\"https:\/\/ionicframework.com\/docs\/updating\/9-0#vue-router\">Migration Guide<\/a> for all the details.<br><\/p>\n\n\n\n<h2 id=\"h-angular-18-through-22\" class=\"wp-block-heading\">Angular 18 through 22<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic Framework 9 supports Angular 18 through 22, giving Angular developers a straightforward path to the latest versions of Angular.<\/p>\n\n\n\n<h3 id=\"h-zoneless-angular\" class=\"wp-block-heading\">Zoneless Angular<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic Framework 9 defaults to zoneless change detection, which Angular 21 enables by default. Ionic&#8217;s lifecycle and overlay integrations work with zoneless Angular across all supported versions without requiring workarounds. If you prefer to continue using Zone.js, it&#8217;s still supported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One thing to keep in mind when using zoneless change detection is that state updates triggered from asynchronous callbacks may need to explicitly notify Angular. For example, state updated after <code>await modal.onWillDismiss()<\/code> or inside a <code>setTimeout()<\/code> may require a signal or <code>markForCheck()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/ionicframework.com\/docs\/angular\/zoneless\">Zoneless Guide<\/a> covers these patterns in more detail.<\/p>\n\n\n\n<h3 id=\"h-angular-22\" class=\"wp-block-heading\">Angular 22<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Angular 22 introduces a few additional changes to be aware of when upgrading. Components now default to <code>OnPush<\/code>, and <code>ng update<\/code> handles the migration for you. Angular 22 also requires TypeScript <code>6.0<\/code> and a newer version of Node. The last two changes in particular are why support for Angular 22 could not be released as part of v8.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Standalone is now the default import path, so <code>@ionic\/angular\/standalone<\/code> becomes <code>@ionic\/angular<\/code>, and lazy imports move to <code>@ionic\/angular\/lazy<\/code>. The Ionic migration tool handles these import changes automatically.<\/p>\n\n\n\n<h2 id=\"h-stencil-output-target-updates\" class=\"wp-block-heading\">Stencil Output Target Updates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic&#8217;s components are built with Stencil, and its output targets package those components for use in React, Angular, and Vue applications. In v9, we&#8217;ve brought all three output targets up to date, including the latest bug fixes and improvements to type checking.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">React and Angular move to their <code>1.x<\/code> releases, and we&#8217;ve also invested in comprehensive test coverage across all three output targets. This gives us a stronger foundation for maintaining them and makes future updates faster and more predictable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One important change to note: the React output target now requires React 18 or later. If your application is still using React 16 or 17, you&#8217;ll need to upgrade React before moving to Ionic Framework 9.<\/p>\n\n\n\n<h2 id=\"h-selects-with-rich-content\" class=\"wp-block-heading\">Selects with Rich Content<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Select options in Ionic have always been limited to plain text. If your app needed a contact picker with avatars, a product selector with images, or options with a description below the label, you were left working around the component or building something from scratch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In v9, <code>ion-select-option<\/code> supports rich content across all four Select interfaces: alert, action sheet, popover, and modal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can now use start and end slots for images, avatars, icons, and badges, along with a description property for displaying a second line of text.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Descriptions work out of the box. Slotted markup is opt-in through the <code>innerHTMLTemplatesEnabled<\/code> configuration and is rendered inside the Select overlay, while the closed Select continues to display the option\u2019s plain-text value. Existing plain-text options continue to work exactly as they always have.<\/p>\n\n\n\n<figure class=\"wp-block-video device-demo\"><video height=\"2556\" style=\"aspect-ratio: 1180 \/ 2556;\" width=\"1180\" autoplay controls loop muted src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Demo1_SelectRichContent.mp4\" playsinline><\/video><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For more information, refer to the <a href=\"https:\/\/ionicframework.com\/docs\/api\/select#rich-content-options\">Select documentation<\/a>.<\/p>\n\n\n\n<h2 id=\"h-font-icon-support\" class=\"wp-block-heading\">Font Icon Support<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A lot of teams use font-based icon libraries as part of their design system, whether that&#8217;s Bootstrap Icons, Material Symbols, Font Awesome, Phosphor, or another library. Until now, <code>ion-icon<\/code> was designed to work only with SVG icons.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In v9, <code>ion-icon<\/code> supports font icons alongside the SVG icons you&#8217;re already using. Load your icon library&#8217;s stylesheet, then place the font icon inside <code>ion-icon<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Properties such as <code>color<\/code>, <code>size<\/code>, and RTL flipping continue to work as expected. When using font icons, use <code>font-size<\/code> to control their size rather than <code>width<\/code> and <code>height<\/code>, since font glyphs are sized through their font properties.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic Framework 9 also supports slotted SVG content, giving you another option for using custom icons.<\/p>\n\n\n\n<div class=\"wp-block-columns are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-532x1024.jpeg\" alt=\"Ionicons sample screen\" class=\"wp-image-6847 lazyload\" style=\"--smush-placeholder-width: 532px; --smush-placeholder-aspect-ratio: 532\/1024;aspect-ratio:0.5195410613458717;object-fit:cover;width:250px;height:auto\" title=\"Ionicons sample screen\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-532x1024.jpeg 532w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-768x1478.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-798x1536.jpeg 798w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-1064x2048.jpeg 1064w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2.jpeg 1179w\" data-sizes=\"auto, (max-width: 532px) 100vw, 532px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-532x1024.jpeg\" alt=\"Ionicons sample screen\" class=\"wp-image-6847\" style=\"aspect-ratio:0.5195410613458717;object-fit:cover;width:250px;height:auto\" title=\"Ionicons sample screen\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-532x1024.jpeg 532w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-768x1478.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-798x1536.jpeg 798w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2-1064x2048.jpeg 1064w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Ionic2.jpeg 1179w\" sizes=\"auto, (max-width: 532px) 100vw, 532px\" \/><\/noscript><figcaption class=\"wp-element-caption\">Ionicons<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-532x1024.jpeg\" alt=\"Phosphor sample screen\" class=\"wp-image-6848 lazyload\" style=\"--smush-placeholder-width: 532px; --smush-placeholder-aspect-ratio: 532\/1024;aspect-ratio:0.5195410613458717;object-fit:cover;width:250px;height:auto\" title=\"Phosphor sample screen\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-532x1024.jpeg 532w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-768x1479.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-797x1536.jpeg 797w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-1063x2048.jpeg 1063w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2.jpeg 1179w\" data-sizes=\"auto, (max-width: 532px) 100vw, 532px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-532x1024.jpeg\" alt=\"Phosphor sample screen\" class=\"wp-image-6848\" style=\"aspect-ratio:0.5195410613458717;object-fit:cover;width:250px;height:auto\" title=\"Phosphor sample screen\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-532x1024.jpeg 532w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-768x1479.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-797x1536.jpeg 797w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2-1063x2048.jpeg 1063w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Phosphor2.jpeg 1179w\" sizes=\"auto, (max-width: 532px) 100vw, 532px\" \/><\/noscript><figcaption class=\"wp-element-caption\">Phosphor<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"1024\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-533x1024.jpeg\" alt=\"Bootstrap sample screen\" class=\"wp-image-6850 lazyload\" style=\"--smush-placeholder-width: 533px; --smush-placeholder-aspect-ratio: 533\/1024;width:250px\" title=\"Bootstrap sample screen\" data-srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-533x1024.jpeg 533w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-768x1476.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-799x1536.jpeg 799w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-1066x2048.jpeg 1066w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2.jpeg 1179w\" data-sizes=\"auto, (max-width: 533px) 100vw, 533px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"1024\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-533x1024.jpeg\" alt=\"Bootstrap sample screen\" class=\"wp-image-6850\" style=\"width:250px\" title=\"Bootstrap sample screen\" srcset=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-533x1024.jpeg 533w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-156x300.jpeg 156w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-768x1476.jpeg 768w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-799x1536.jpeg 799w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2-1066x2048.jpeg 1066w, https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/Bootstrap2.jpeg 1179w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/noscript><figcaption class=\"wp-element-caption\">Bootstrap<\/figcaption><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For more information, refer to the <a href=\"https:\/\/ionicframework.com\/docs\/api\/icon#font-icons\">Icon documentation<\/a>.<\/p>\n\n\n\n<h2 id=\"h-migrating-from-v8-there-s-a-tool-for-that\" class=\"wp-block-heading\">Migrating from v8? There&#8217;s a Tool for That<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Major releases are also an opportunity to clean house. Ionic Framework 9 removes deprecated APIs and legacy patterns that have been around for years, and every breaking change has a documented migration path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To make the upgrade easier, we&#8217;ve introduced <a href=\"https:\/\/www.npmjs.com\/package\/@ionic\/migrate\"><u>npx @ionic\/migrate<\/u><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The migration tool covers many of the v9 breaking changes and can automatically fix several of them, including the Angular import changes, the CSS <code>~<\/code> prefix, TypeScript and browser version requirements, and React Router&#8217;s <code>component<\/code> to <code>element<\/code> rewrite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For changes that can&#8217;t be migrated automatically, the tool identifies what needs to change and points you to the relevant section of the upgrade guide. You can run <code>--dry-run<\/code> to see what the tool would change before anything is written, or use <code>--check<\/code> in CI to verify that your project is ready for v9. The tool also won&#8217;t run against a dirty working tree, so you can review the changes safely and use Git to undo them if needed.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1450\" style=\"aspect-ratio: 1600 \/ 1450;\" width=\"1600\" autoplay controls loop muted src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/migrate.mp4\" playsinline><\/video><\/figure>\n\n\n\n<h2 id=\"h-what-s-next-modular-ionic\" class=\"wp-block-heading\">What&#8217;s Next: Modular Ionic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic Framework 9 is also a step toward what&#8217;s next: Modular Ionic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modular Ionic is focused on separating how Ionic looks from how it behaves, so you can mix, replace, or build on either layer independently. This will give developers more flexibility to customize Ionic and build experiences around their own design systems.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Modular Ionic is planned for Q2 2027.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s not part of v9 because we wanted to deliver the features developers were asking for now rather than hold them back for the next major release. And v9 isn&#8217;t the end of the road: between now and Q2 2027, we&#8217;ll continue working on issues, fixes, and improvements based on what we learn from the v9 release.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;re excited about where this takes Ionic next.<br><\/p>\n\n\n\n<h2 id=\"h-try-it-now\" class=\"wp-block-heading\">Try It Now<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ionic Framework 9 is available now. Install the latest <code>@ionic\/angular<\/code>, <code>@ionic\/react<\/code>, or <code>@ionic\/vue<\/code> to get started.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Coming from v8? Start with the <a href=\"https:\/\/ionicframework.com\/docs\/updating\/9-0\"><u>Migration Guide<\/u><\/a>, then run: <code>npx @ionic\/migrate<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the feedback coming through the Developer Feedback Portal, GitHub, or Discord. Tell us what landed well, what still needs work, and what you want to see next.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And to everyone who filed issues, left comments, kept asking questions, and kept building with Ionic Framework even when things were moving slower than they should have: this one&#8217;s for you. \ud83d\udc99<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Questions? Find us on <\/em><a href=\"https:\/\/discord.gg\/uxG6EvFZ9Z\"><em><u>Discord<\/u><\/em><\/a><em>, <\/em><a href=\"https:\/\/www.reddit.com\/r\/ionic\/\"><em><u>Reddit<\/u><\/em><\/a><em>, or the <\/em><a href=\"https:\/\/outsystems.canny.io\/ionic-feature-requests\"><em><u>Feedback Portal<\/u><\/em><\/a><em>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ionic Framework 9 is here! \ud83d\ude80 This one took a while, and it gave us a chance to step back and listen to the people using Ionic. On GitHub, Discord, and the Developer Feedback Portal, we kept hearing the same things: better router support, broader Angular compatibility, and upgrades that don&#8217;t turn into a weekend [&hellip;]<\/p>\n","protected":false},"author":113,"featured_media":6844,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"","publish_post_category":"","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"","discourse_permalink":"","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,120,121,304,122],"tags":[23,3],"class_list":["post-6843","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all","category-announcements","category-engineering","category-ionic-framework","category-product","tag-framework","tag-ionic"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Announcing Ionic Framework 9 - Ionic Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Announcing Ionic Framework 9\" \/>\n<meta property=\"og:description\" content=\"Ionic Framework 9 is here! \ud83d\ude80 This one took a while, and it gave us a chance to step back and listen to the people using Ionic. On GitHub, Discord, and the Developer Feedback Portal, we kept hearing the same things: better router support, broader Angular compatibility, and upgrades that don&#8217;t turn into a weekend [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-19T22:59:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-19T22:59:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image-1024x512.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gon\u00e7alo Martins\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gon\u00e7alo Martins\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\"},\"author\":{\"name\":\"Gon\u00e7alo Martins\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/fc103b2938934d5ea2e09c2563698a06\"},\"headline\":\"Announcing Ionic Framework 9\",\"datePublished\":\"2026-08-19T22:59:03+00:00\",\"dateModified\":\"2026-08-19T22:59:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\"},\"wordCount\":1363,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png\",\"keywords\":[\"Framework\",\"Ionic\"],\"articleSection\":[\"All\",\"Announcements\",\"Engineering\",\"Ionic Framework\",\"Product\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\",\"url\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\",\"name\":\"Announcing Ionic Framework 9 - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png\",\"datePublished\":\"2026-08-19T22:59:03+00:00\",\"dateModified\":\"2026-08-19T22:59:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png\",\"width\":2240,\"height\":1120,\"caption\":\"Announcing Ionic Framework 9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Announcing Ionic Framework 9\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/fc103b2938934d5ea2e09c2563698a06\",\"name\":\"Gon\u00e7alo Martins\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/GM-150x150.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/GM-150x150.png\",\"caption\":\"Gon\u00e7alo Martins\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/gbrazmar\/\"],\"jobTitle\":\"Software Engineering Manager\",\"url\":\"https:\/\/ionic.io\/blog\/author\/gmartins\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Announcing Ionic Framework 9 - Ionic Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9","og_locale":"en_US","og_type":"article","og_title":"Announcing Ionic Framework 9","og_description":"Ionic Framework 9 is here! \ud83d\ude80 This one took a while, and it gave us a chance to step back and listen to the people using Ionic. On GitHub, Discord, and the Developer Feedback Portal, we kept hearing the same things: better router support, broader Angular compatibility, and upgrades that don&#8217;t turn into a weekend [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9","og_site_name":"Ionic Blog","article_published_time":"2026-08-19T22:59:03+00:00","article_modified_time":"2026-08-19T22:59:04+00:00","og_image":[{"width":1024,"height":512,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image-1024x512.png","type":"image\/png"}],"author":"Gon\u00e7alo Martins","twitter_card":"summary_large_image","twitter_creator":"@ionicframework","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Gon\u00e7alo Martins","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9"},"author":{"name":"Gon\u00e7alo Martins","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/fc103b2938934d5ea2e09c2563698a06"},"headline":"Announcing Ionic Framework 9","datePublished":"2026-08-19T22:59:03+00:00","dateModified":"2026-08-19T22:59:04+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9"},"wordCount":1363,"commentCount":0,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png","keywords":["Framework","Ionic"],"articleSection":["All","Announcements","Engineering","Ionic Framework","Product"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9","url":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9","name":"Announcing Ionic Framework 9 - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png","datePublished":"2026-08-19T22:59:03+00:00","dateModified":"2026-08-19T22:59:04+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/announcing-ionic-framework-9"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png","width":2240,"height":1120,"caption":"Announcing Ionic Framework 9"},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/announcing-ionic-framework-9#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Announcing Ionic Framework 9"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/fc103b2938934d5ea2e09c2563698a06","name":"Gon\u00e7alo Martins","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/GM-150x150.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/GM-150x150.png","caption":"Gon\u00e7alo Martins"},"sameAs":["https:\/\/www.linkedin.com\/in\/gbrazmar\/"],"jobTitle":"Software Engineering Manager","url":"https:\/\/ionic.io\/blog\/author\/gmartins"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2026\/08\/ionic-9-feature-image.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/113"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=6843"}],"version-history":[{"count":33,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6843\/revisions"}],"predecessor-version":[{"id":6902,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6843\/revisions\/6902"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/6844"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=6843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=6843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=6843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}