The post The Road to Capacitor 9 appeared first on Ionic Blog.
]]>Our summer has been quite busy: we’ve got more to share about Capacitor 9, three new plugins to showcase, and we’re looking for your input to help shape the agentic future of Capacitor. But first, a heads-up about CocoaPods.
On December 2, 2026, CocoaPods trunk goes permanently read-only — no new podspecs or version updates. The risk isn’t Capacitor itself, but the CocoaPods-hosted native dependencies your plugins pull in, like Firebase, Stripe, and other native SDKs. Once trunk freezes, those stop receiving updates too.
Capacitor has supported Swift Package Manager since Capacitor 6 and made it the default in Capacitor 8, so if you haven’t already, now’s the time to migrate your app to SPM to keep everything current.
We’re exploring what a Capacitor MCP server could look like — a way for agents to pull real, accurate information about your project instead of guessing from whatever they picked up in training.
To build the right thing, we need to know where AI is getting Capacitor wrong today. We’re looking to answer the following questions:
Specific examples help us the most, something like “it told me Camera.takePhoto() takes a quality string instead of a number” gives us more to work with than a general feature request.
Head over to our GitHub discussion to share what you’ve seen, or vote in the poll if you’d rather just weigh in quickly.
Plugins for native contacts, native calendar, and health & fitness data have existed as OutSystems-exclusive plugins for a while. Over the summer we’ve opened them up as part of official Capacitor plugins.
Contacts handles searching, picking, creating, updating, and removing device contacts. Calendar covers creating, finding, modifying, and removing calendar events. And Health & Fitness connects to Apple HealthKit and Android Health Connect for reading and writing health and fitness data. All three have already been running in production inside OutSystems apps, and now the rest of the Capacitor community gets to use them too.
The long-awaited Cordova Optionality feature — the ability to exclude the Cordova-compatibility layer from your app builds — is in Capacitor 9 and we’re excited to finally ship it! Special thanks to those who have already tested it in our Capacitor 9 alphas and filed bugs. Those bugs led to some much-needed iOS modernization refactors: we’ve converted the remaining objective-C code in Capacitor’s iOS implementation to Swift, and will no longer be distributing Capacitor as an XCFramework. Those changes are mostly internal, but plugin authors will need to run our migration tooling to make sure Capacitor is pulled in correctly.
Mobile computing used to mean running a single instance of an app, and using apps one-at-a-time. With the advent of foldable and large-screen devices this is no longer the case, and we’re laying the foundation for multi-instance and windowed apps in Capacitor 9. We’re committed to shipping a compatibility floor to ensure your apps will work on these form factors, with support for window management APIs and per-instance bridge state as fast follows if they don’t make it in 9.0.
Our final focus for Capacitor 9 is making Capacitor itself easier for AI agents to understand — clearer docs, better-annotated APIs, and tooling aware when an agent, not a person, is behind the wheel. It’s early, but it’s the same thread running through the MCP server exploration above: building towards agents that work from real information instead of guesses.
That just about wraps up our summer here on the Capacitor team! Remember to plan to migrate off CocoaPods if you haven’t already, give the early alphas of Capacitor 9 a test run, and kindly let us know what you’d like to see in a Capacitor MCP server. You can follow our progress on Capacitor 9 on GitHub and we’ll be reaching back out towards the end of the year as Capacitor 9 approaches GA!
The post The Road to Capacitor 9 appeared first on Ionic Blog.
]]>The post Announcing Ionic Framework 9 appeared first on Ionic Blog.
]]>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’t turn into a weekend project. The community was asking us to keep up.
So that’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.
Here’s what’s new in v9.
This was the number one request, and it’s done.
We’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.
Ionic now owns how views are retained and cleaned up during navigation rather than relying on React Router’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’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.
The community also helped test early builds and surfaced issues we wouldn’t have found on our own. Thank you to everyone who took the time to test, report issues, and provide feedback.
Check out the Migration Guide for all the details.
Vue Router 5 support is here, and for most Vue Router 4 users, the upgrade is straightforward. Your routes, navigation guards, and IonRouterOutlet integration can stay as they are, with no runtime breaking changes.
There is one migration to be aware of: calling next() in a navigation guard is deprecated in Vue Router 5. The minimum supported Vue version also moves to 3.5.
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.
Check out the Migration Guide for all the details.
Ionic Framework 9 supports Angular 18 through 22, giving Angular developers a straightforward path to the latest versions of Angular.
Ionic Framework 9 defaults to zoneless change detection, which Angular 21 enables by default. Ionic’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’s still supported.
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 await modal.onWillDismiss() or inside a setTimeout() may require a signal or markForCheck().
The Zoneless Guide covers these patterns in more detail.
Angular 22 introduces a few additional changes to be aware of when upgrading. Components now default to OnPush, and ng update handles the migration for you. Angular 22 also requires TypeScript 6.0 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.
Standalone is now the default import path, so @ionic/angular/standalone becomes @ionic/angular, and lazy imports move to @ionic/angular/lazy. The Ionic migration tool handles these import changes automatically.
Ionic’s components are built with Stencil, and its output targets package those components for use in React, Angular, and Vue applications. In v9, we’ve brought all three output targets up to date, including the latest bug fixes and improvements to type checking.
React and Angular move to their 1.x releases, and we’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.
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’ll need to upgrade React before moving to Ionic Framework 9.
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.
In v9, ion-select-option supports rich content across all four Select interfaces: alert, action sheet, popover, and modal.
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.
Descriptions work out of the box. Slotted markup is opt-in through the innerHTMLTemplatesEnabled configuration and is rendered inside the Select overlay, while the closed Select continues to display the option’s plain-text value. Existing plain-text options continue to work exactly as they always have.
For more information, refer to the Select documentation.
A lot of teams use font-based icon libraries as part of their design system, whether that’s Bootstrap Icons, Material Symbols, Font Awesome, Phosphor, or another library. Until now, ion-icon was designed to work only with SVG icons.
In v9, ion-icon supports font icons alongside the SVG icons you’re already using. Load your icon library’s stylesheet, then place the font icon inside ion-icon.
Properties such as color, size, and RTL flipping continue to work as expected. When using font icons, use font-size to control their size rather than width and height, since font glyphs are sized through their font properties.
Ionic Framework 9 also supports slotted SVG content, giving you another option for using custom icons.



For more information, refer to the Icon documentation.
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.
To make the upgrade easier, we’ve introduced npx @ionic/migrate.
The migration tool covers many of the v9 breaking changes and can automatically fix several of them, including the Angular import changes, the CSS ~ prefix, TypeScript and browser version requirements, and React Router’s component to element rewrite.
For changes that can’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 --dry-run to see what the tool would change before anything is written, or use --check in CI to verify that your project is ready for v9. The tool also won’t run against a dirty working tree, so you can review the changes safely and use Git to undo them if needed.
Ionic Framework 9 is also a step toward what’s next: Modular Ionic.
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.
Modular Ionic is planned for Q2 2027.
It’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’t the end of the road: between now and Q2 2027, we’ll continue working on issues, fixes, and improvements based on what we learn from the v9 release.
We’re excited about where this takes Ionic next.
Ionic Framework 9 is available now. Install the latest @ionic/angular, @ionic/react, or @ionic/vue to get started.
Coming from v8? Start with the Migration Guide, then run: npx @ionic/migrate
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.
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’s for you.
Questions? Find us on Discord, Reddit, or the Feedback Portal.
The post Announcing Ionic Framework 9 appeared first on Ionic Blog.
]]>The post Capacitor 8.5 Released appeared first on Ionic Blog.
]]>While UIScene adoption has been on our radar as part of Capacitor 9, we’ve heard the community and realized that we couldn’t hold off on adopting UIScene as you (rightfully) want to start testing your apps on the latest Xcode SDKs and iOS betas.
To address this we’ve released Capacitor 8.5, a breaking minor that adopts UIScene, along with documentation and tooling to help migrate existing apps. Changes in this version are iOS only, and for most apps the migration is one CLI command.
First, the scope of Capacitor 8.5: this only affects apps built with Xcode 27. Published apps keep running on iOS 27, and so will anything you build with Xcode 26. Nothing breaks in the App Store when iOS 27 ships.
But until you adopt scenes, Xcode 27 is closed to you, and that’s the real issue Capacitor 8.5 addresses. You can’t build against the new SDK, so you can’t find out what else has changed with your app. Migrate now and you have the whole beta to work through anything that needs addressing. Wait, and you’ll find issues alongside everyone else with no runway.
For most projects, the migration CLI command is enough:
npm i -D @capacitor/cli@latest
npx cap migrate
The migrator adds what your project needs and wires it into the iOS project. If it can’t do that safely, it stops and tells you why. For those cases, use the capacitor-uiscene-migrator skill added to our list of Capacitor Skills that walks the manual path with your coding agent.
As we would for a major release, we’ve published a upgrade guide covering every change in detail.
If you’ve been following updates to iOS and Android’s SDKs, it’s very clear that the future isn’t single full-screen apps —screens fold, apps get resized, two apps sit side-by-side.
Capacitor 9 is the first phase of that work: removing the single-window assumption so your app can be folded or resized, etc. UIScene adoption was always part of that. Capacitor 8.5 is us pulling that piece forward so you aren’t blocked in the meantime.
We’d like to thank the community for their continued support of Capacitor. A special thanks is in order for everyone who filed, commented, and shared workarounds while we caught up.
Update today and keep your iOS 27 testing moving. Then keep an eye out for Capacitor 9 towards the end of the year — you’ll have already done the first part.
The post Capacitor 8.5 Released appeared first on Ionic Blog.
]]>The post Introducing Official Capacitor Skills appeared first on Ionic Blog.
]]>The Capacitor team has been thinking about them — but we didn’t want to ship something just to say that we did. We have the luxury of moving methodically in this current AI landscape and we intend to use it.
To that end, we’ve settled on AI “primitives”: small, single-purpose tools that can be composed into bigger workflows. We don’t know what the final shape of Capacitor’s AI tooling looks like yet, so we’re starting with building blocks we can compose into whatever it turns out to be — serving whoever we’re building for: the open source community, OutSystems customers, or even ourselves, the Capacitor team.
Agents can already stand up a Capacitor app on their own pretty well. Where they need a hand is the hard part — plugins. Native code on both platforms, project configuration, behavior normalization, a single web API; plugin development is the part of Capacitor that asks the most of you and where good guidance pays off most.
So today we’re launching a repo of official Capacitor skills, starting with three primitives centered around plugin development:
capacitor-plugin-generator turns a description into a working first-pass Capacitor plugin, built on best practices and insights from the Capacitor team.cordova-plugin-migrator handles end-to-end Cordova-to-Capacitor plugin migration. Plugin-level only; it won’t migrate an entire app.build-actions-generator writes plugin build actions for OutSystems Developer Cloud (ODC) Capacitor apps. This one is OutSystems-specific and does nothing in a standalone Capacitor app.That last one is for our OutSystems customers; the other two are for anyone building Capacitor plugins. We use all three ourselves.
Install them for your agent of choice with skills.sh:
npx skills add ionic-team/capacitor-skills
We’ll be releasing more skills as we find the use cases best suited for us, so bookmark the repo.
The best thing about open source is that you don’t have to wait on us, and you haven’t. Plenty of Capacitor AI tools have already appeared, including two sizable skillsets from CapGo and CapAwesome. If you want help wiring AI into your workflow today — outside of what we launched — those are worth a look.
That’s open source working the way it should, and it’s exactly what shapes where we spend our effort. Where the community can build something, we want them to — we’re not here to reinvent the wheel for its own sake. We’ll take the other half: the tooling that takes deep knowledge of how Capacitor works, or that reaches into the internals of the framework itself. That’s where being first-party matters the most, and it’s the work we’re best positioned to do.
Beyond these skills, what comes next is wide open and we’d rather shape it with you than guess. So tell us, what are you reaching for when you build Capacitor apps with AI? What’s missing? Let us know on Canny.
The post Introducing Official Capacitor Skills appeared first on Ionic Blog.
]]>The post Capacitor Showcase – LocalLLM appeared first on Ionic Blog.
]]>In our first installment of Capacitor Showcase, we are introducing Oakline Bank.
Oakline Bank is a fictional digital-first regional bank built as a Capacitor demo application, showcasing how modern mobile banking experiences can be crafted with a single cross-platform codebase targeting both iOS and Android. The app demonstrates real-world patterns you’d find in production fintech apps: account dashboards, transaction histories, and, appropriately timed in our current AI craze: an AI-powered in-app assistant called OakBot.
The (fictional) team realized, when a user asks OakBot “What’s my account balance?” or “Summarize my spending this month,” answering that question requires sending real financial data to an AI model. With a cloud-based model (OpenAI, Anthropic, Google, etc.), that data leaves the device and travels to a third-party server, which would be a significant concern for any financial institution.
In 2026, there is now a way to solve this problem on modern mobile devices – on-device AI.
Capacitor LocalLLM is a native Capacitor plugin that brings the power of on-device AI directly to your iOS and Android apps. By using both Apple Intelligence and Android’s on-device AI frameworks, it gives developers a simple, unified TypeScript API to send prompts with conversation session support, all while respecting user privacy and working completely offline. Whether you’re building a smart assistant, a creative tool, or an offline AI-powered bank chatbot, LocalLLM makes it as straightforward as:
const response = await LocalLLM.prompt({
sessionId: chatSessionId,
instructions: instructions,
prompt: userMessageText,
options: {
temperature: 0.7,
maximumOutputTokens: 256,
},
});
With that you get a cross platform prompt interface without needing worry about the intricacies of local AI models on both iOS and Android, or without having to research and provide your own custom models.
On-device language models are trained on vast general knowledge, but they have no awareness of anything specific to the user running them. To be useful as a banking assistant, OakBot needs to answer questions like:
None of that exists inside the model’s weights. The only way to make it available is to inject it into the context window at inference time: essentially telling the model what it needs to know before it answers. Here is how:
In OakBot specifically, this happens in formatTransactionHistory(), which transforms structured Transaction objects into a plain-text block:
Spending by Category (all time):
- Housing: $7,400.00
- Groceries: $1,823.45
Recent Transactions (last 60):
- ...
- 2026-03-10: Whole Foods Market (Groceries) - -$87.43
- ...
Total transactions on record: 160
Current balance: $3,241.18
That block is then passed to LocalLLM.warmup() as the promptPrefix — a special parameter that pre-loads the context into the session before any conversation begins. This is the critical handshake between the app’s local data and the inference engine, and because it goes through the plugin’s abstraction layer, it works the same way in code regardless of whether the user is on iOS or Android.
await LocalLLM.warmup({
sessionId: chatSessionId,
promptPrefix: systemPromptWithTransactionContext,
});
Token efficiency actually favors natural language here. Each JSON object repeats field names for every entry. Compare:
{"date":"2026-03-10","merchant":"Whole Foods Market","category":"Groceries","amount":-87.43}
vs:
- 2026-03-10: Whole Foods Market (Groceries) - -$87.43
The natural language line is noticeably more compact. Multiply that across 60 transactions and the difference is meaningful on a tight context budget.
Small on-device models reason better over natural language. The models running via LocalLLM (Foundation Models, Gemini Nano) are far smaller than cloud models. Larger models like GPT-4 handle JSON structure reliably; smaller on-device models can stumble on it. Natural prose plays to their strengths.
To experiment with the Oakline Bank demo app yourself, check out the app source here, and run it on your own modern device that can support running on-device AI models.
LocalLLM will be launched as a Capacitor Labs plugin initially as the first party on-device AI story is still in flux, especially on Android, however feel free to submit feedback, bug reports and suggestions for future directions we can take the plugin.
Capacitor LocalLLM isn’t the only solution the Capacitor ecosystem for local AI usage. Check out some related efforts from the Capacitor community below
Stay tuned for more installments of the Capacitor Showcase series, as we continue to explore what can be built with Capacitor.
The post Capacitor Showcase – LocalLLM appeared first on Ionic Blog.
]]>The post Capacitor 9 Starts Here appeared first on Ionic Blog.
]]>This update covers two pieces of that work: the first Capacitor 9 alpha for early testing, and improved compatibility for Cordova plugins adopting Swift Package Manager through Cordova iOS 8.
Capacitor 9 Alpha 1 is now published!
The headline change in this alpha is that Cordova is now optional.
Historically, Cordova support has been bundled and part of the Capacitor runtime even for apps that never used Cordova plugins. In Capacitor 9, that changes. Cordova is no longer pulled in by default — it’s only included when you need it.
For apps that do not use Cordova plugins, this means less native code in your iOS and Android projects, and less initialization work at startup.
This is one of the most important runtime changes made to Capacitor, and we need real-world feedback before Capacitor 9 reaches GA.
If you have a project you can test with the alpha, these plugin setups are especially helpful:
To try the alpha, install the Capacitor packages using the next tag using your preferred package manager. For npm projects:
npm install @capacitor/core@next @capacitor/ios@next @capacitor/android@next --legacy-peer-deps
npm install --save-dev @capacitor/cli@next --legacy-peer-deps
The --legacy-peer-deps flag helps avoid npm peer dependency conflicts while testing this alpha. If you use pnpm, Yarn, or another package manager, use the equivalent command for your project.
Please file any bugs you find on the Capacitor repository with the label cap9-alpha.
Cordova iOS 8 introduced support for declaring Swift Package dependencies within a Cordova plugin. Capacitor did not previously support those declarations when a Cordova plugin with child SPM dependencies was used inside an SPM-based Capacitor iOS project.
Now it does — with fixes available in the latest Capacitor 7 and Capacitor 8 releases.
When a Capacitor iOS project uses Swift Package Manager, Cordova plugins that declare SPM dependencies through the Cordova iOS 8 format will now have those dependencies resolved automatically.
This is the first public step in the Capacitor 9 cycle. Alongside this work, the team is updating iOS to support Scene UI, exploring how Capacitor needs to flex for newer device form factors, and investing in AI-assisted tooling and community-facing AI skills.
Try the alpha, open issues for anything unexpected, and keep an eye on next as Capacitor 9 continues to take shape.
The post Capacitor 9 Starts Here appeared first on Ionic Blog.
]]>The post Help Us Define The Direction Of Ionic! appeared first on Ionic Blog.
]]>Every developer has feedback to give.
And yet… there always seems to be a disconnect between the two?
Well we’re aiming to solve that problem and we can use your help to define the roadmap of Ionic products!
We’re thrilled to announce the launch of our new, dedicated Developer Feedback Portal, as a way to make your experience of contributing ideas as seamless and effective as possible. We know that the developers using our tools are our most valuable resource, and your insights directly shape the future of our product.
This launch is more than just a new form—it’s a commitment to transparency, efficiency, and ensuring every piece of constructive input you provide lands exactly where it needs to go that the community has been asking for.
Our previous methods, while functional, often lacked the structure needed to quickly route complex technical suggestions to the right engineering teams or streamline development. We heard your pain points:
The Developer Feedback Portal addresses these issues head-on, creating a two-way street for product development.
Accessing the portal is simple:
There’s a lot of work ahead of us but we are incredibly excited about having a centralized place for the community to share feedback and present a roadmap as the feedback comes in. The Developer Feedback Portal is built to empower you, our developer community, to become integral partners in the evolution of our product. Your insights power our innovation. We look forward to seeing your submissions!
The post Help Us Define The Direction Of Ionic! appeared first on Ionic Blog.
]]>The post Announcing Ionic Framework 8.8 appeared first on Ionic Blog.
]]>Many of the features in this release support community-driven projects adapting Ionic Framework to implement both the latest iOS design system (Liquid Glass) and a Material Design 3 theme, giving developers the tools to create modern, fully branded design systems.
Take a look at the new features that make customizing Ionic Framework simpler and more flexible.
Modals now expose new drag events that let you hook into the complete drag lifecycle. With detailed movement data available, you can respond to position, velocity, progress, and breakpoint changes in real time, enabling richer, more interactive experiences.
ionDragStart — fires at the start of the drag gesture without any detailsionDragMove — fires continuously while the modal is being dragged with currentY, deltaY, velocityY, progress, and, for sheet modals, snapBreakpointionDragEnd — fires at the end of the drag gesture with currentY, deltaY, velocityY, progress, and, for sheet modals, snapBreakpointThese events make it possible to coordinate surrounding UI with the gesture. As the modal moves, you can reveal or conceal headers, footers, tab bars, or other interface elements, adjust layout and styling based on progress, and react instantly as the modal shifts position or approaches a breakpoint.
For more information, refer to the Modal documentation.
Range now includes significant improvements to dual knob behavior, bringing more predictable interactions and powerful new styling capabilities.
We fixed an issue where knob identities (A and B) would unintentionally swap when crossing over each other. Knobs now retain their static identity, ensuring consistent behavior and styling.
Beyond behavior improvements, Range now exposes additional host classes and Shadow Parts when dualKnobs is enabled, giving you complete control over styling and interaction states.
When dualKnobs is enabled, the following classes will be applied to the host element:
range-dual-knobs — always appliedrange-pressed-a — applied when the knob with identity A is pressedrange-pressed-b — applied when the knob with identity B is pressedrange-pressed-lower — applied when the knob with position lower is pressedrange-pressed-upper — applied when the knob with position upper is pressedThese classes allow you to style the component based on the existence of the dualKnobs property and which knob is currently being interacted with.
Dual knob ranges now support two styling models:
Static Identity (A / B)
These parts always refer to the same physical knob, even if the knobs cross.
knob-handle-a, knob-handle-b — applied to the handle of the knob with identity A or B, respectivelyknob-a, knob-b — applied to the knob itself with identity A or Bpin-a, pin-b — applied to the pin of the knob with identity A or BDynamic Position (Lower / Upper)
These parts reflect the knob’s current value position. If the knobs cross, these parts swap automatically.
knob-handle-lower, knob-handle-upper — applied to the knob handle in the lower or upper position, respectivelyknob-lower, knob-upper — applied to the knob itself in the lower or upper positionpin-lower, pin-upper — applied to the pin of the knob in the lower or upper positionThis makes it possible to style knobs either by consistent identity or by their relative position within the range.
To support advanced interaction styling, Range now applies state parts to the active knob’s handle, knob, and pin:
activated — applied when the knob is activefocused — applied when the knob is focusedhover — applied when the knob is hoveredpressed — applied when the knob is being pressedOnly one set of these state parts is applied at a time when dualKnobs is enabled, ensuring only the knob that has that state will be styled.
These updates make dual knob ranges more reliable, more accessible, and significantly more customizable. Build advanced filtering controls, price selectors, or ranges fully branded to match your design system.
For more information, refer to the Range documentation.
Refresher now emits two new events that give more visibility into the pull gesture lifecycle, letting you respond to user interactions in real time. You can detect exactly when a user starts pulling, and when the refresher has fully returned to its inactive state, including whether the pull completed successfully or was canceled.
ionPullStart — fires when the user begins pulling down, without any detailsionPullEnd — fires after the refresher returns to its inactive state, with a reason property ('complete' or 'cancel') indicating how the pull gesture endedionStart has been deprecated in favor of ionPullStart to improve consistency across event names. Going forward, event names follow a structure of action + timing (such as Start, Move, or End) to make their purpose more explicit and to allow for better scalability as new events are added.
The event payload is unchanged, so migrating only requires updating the event name.
Example Migration:
// Before
refresher.addEventListener('ionStart', () => {
console.log('Pull Start');
});
// After
refresher.addEventListener('ionPullStart', () => {
console.log('Pull Start');
});
For more information, refer to the Refresher documentation.
We’ve introduced several new CSS Shadow Parts and classes to provide granular control over component internals previously inaccessible via global CSS.
The .content-fullscreen class is now added to ion-content when the fullscreen property is set to true.
The following Shadow Parts give developers control over the headers and calendar elements in the Datetime component:
calendar-days-of-week — container for the day-of-the-week header (both weekdays and weekends) when using a grid style layoutcalendar-header — container for the month/year picker, navigation buttons, and days of the week in a grid layoutdatetime-header — contains the content for the title slot and the selected datedatetime-selected-date — contains the selected datedatetime-title — contains the title slot contentnavigation-button — buttons used to navigate to the next or previous month in grid layoutprevious-button — button used to navigate to the previous month in grid layoutnext-button — button used to navigate to the next month in grid layoutwheel — wheel container when using a wheel style layout or in the month/year picker in grid layoutTo provide greater flexibility in customizing the appearance and structure of list elements, the following Shadow Parts have been added for Item, Item Divider, Item Option, and List Header components:
Item
inner — arranges the item contentcontainer — contains the default slotItem Divider
inner — arranges the divider contentcontainer — contains the default slotItem Option
inner — arranges the option contentcontainer — contains the start, icon-only, default, and end slotsList Header
inner — arranges the list header contentThe .range-value-min and .range-value-max classes are applied to ion-range when the value reaches the configured min or max. When dualKnobs is enabled, both classes may be applied at the same time if the lower and upper knobs are set to the minimum and maximum values, respectively.
The following Shadow Parts allow developers to adjust the appearance of the Select component:
bottom — container for helper text, error text, and counterwrapper — clickable label element wrapping the entire form fieldinner — manages the slots, selected values or placeholder, and toggle iconsThe following Shadow Parts enable customization of the Toast overlay and its content:
wrapper — outer wrapper for the toast overlaycontent — live region containing the header and messageThanks to Hurubon for adding this feature!
A new swipeGesture property has been added to Segment View to control whether the view can be swiped.
This setting is independent of the swipeGesture property on Segment. If you want to fully disable swiping, you must set swipeGesture to "false" on both the Segment and Segment View components.
A new cancelText property has been added to the modal interface for Select.
When using interface="modal", developers can now customize the cancel button text by setting the cancelText property on ion-select. The value will be passed through to the underlying modal.
<ion-select label="Fruit" interface="modal" value="bananas" cancel-text="Close me">
<ion-select-option value="apples">Apples</ion-select-option>
<ion-select-option value="bananas">Bananas</ion-select-option>
<ion-select-option value="oranges">Oranges</ion-select-option>
</ion-select>
Thanks to niconaso for helping out with this!
The disabled and readonly properties on Textarea now reflect to the host element.
When either property is set, the corresponding HTML attribute is applied to the component’s host element. This improves consistency with native behavior and enables styling via attribute selectors.
Thanks to KillerCodeMonkey for implementing this!
ModalController and PopoverController in Angular now support passing a custom Injector when creating overlays.
By default, overlays use the root injector for dependency injection. With this update, you can provide a custom injector so that components rendered inside a modal or popover can access services and tokens that are scoped to a specific route or component tree.
This is especially useful when:
Dir directive for bidirectional text supportYou can pass the current component’s injector directly:
const modal = await this.modalController.create({
component: MyModalComponent,
injector: this.injector,
});
Or create a custom injector with specific providers:
const customInjector = Injector.create({
providers: [{ provide: MyService, useValue: myServiceInstance }],
parent: this.injector,
});
const modal = await this.modalController.create({
component: MyModalComponent,
injector: customInjector,
});
PopoverController supports the same injector option.
This enhancement removes the need for wrapper components or other workarounds when overlays need access to locally scoped dependencies.
Check out the Angular Overlays documentation for more information.
Stencil has been updated from v4.38 to v4.43. This update includes various compiler improvements and bug fixes. For a complete list of changes, check out the Stencil Changelog.
As with any dependency update, if you encounter issues related to this Stencil upgrade, please open a new issue so we can investigate.
Ionic Framework 8.8 marks the final minor release in the Ionic 8 lifecycle. As we look ahead, our focus is shifting to the next major evolution of the framework: Ionic Framework 9.
Ionic Framework 9 will introduce significant architectural changes aimed at making the framework more modular and easier to extend. These changes lay the foundation for greater flexibility in how developers customize and build on top of Ionic Framework.
One of the main areas to benefit from Ionic Framework 9’s new architecture is theming. Developers will be able to:
While we are not planning to ship an official Liquid Glass theme right now, the goal is to provide the underlying architecture that enables developers to implement these types of design systems themselves without waiting on us.
Ionic Framework 9 will add support for React Router 6, enabling developers to adopt modern React routing patterns. This update lays the groundwork for future support of React Router 7. We’ll share more details on this soon.
Ionic Framework 8.8 enhances customization today while also paving the way for the modular architecture and React Router 6 support coming in Ionic Framework 9. We can’t wait to see what you build with it!
The post Announcing Ionic Framework 8.8 appeared first on Ionic Blog.
]]>The post Keeping Capacitor’s Backlog Healthy appeared first on Ionic Blog.
]]>As a result, technical debt accumulated most visibly in our GitHub Issues and Pull Requests. Across several repositories in the Capacitor ecosystem, hundreds of issues and PRs — many dating back years — remain open, unreviewed, or no longer actionable. This makes it difficult to track what still matters today, slows down contributors who want to help, and can create the impression that Capacitor is not actively maintained.
This backlog is a sign that our previous processes and capacity for managing open-source work at scale were not sufficient. We also recognize that this has led some in the community to feel unheard, and that’s something we’re committed to changing—starting now.
To ensure Capacitor continues to move forward in a healthy, sustainable way, we’re taking a focused step to reset expectations, clean up outdated work, and put better long-term backlog management practices in place.
The sheer volume of open Issues and Pull Requests makes it difficult to distinguish between:
A one-time, comprehensive cleanup of this backlog is the most effective path forward. It allows the core team to focus where our attention delivers the most value: current development, forward-looking roadmaps, and bugs affecting the latest releases.
Behind the scenes, we’re also investing in better automation to help route community contributions more directly into our internal planning tools—improving triage, reducing manual overhead, and ensuring important signals don’t get lost in the noise.
This cleanup is not a one-time event; it’s a reset, paired with clearer triage rules and ongoing review so the backlog remains healthy going forward.
Our goal is not to dismiss community input, but to ensure that the issues which remain are relevant, actionable, and aligned with the modern Capacitor framework. For this process to be transparent and fair, we’re establishing clear, objective rules for which items will be closed and which will be retained.
This initial pass will focus on the highest-volume repositories in the Capacitor ecosystem:
Future cleanups may extend to additional repositories as part of ongoing backlog hygiene, based on clear activity and relevance. Any such efforts will be communicated in advance through a dedicated blog post.
We will begin closing issues and PRs that meet the following criteria:
These rules are designed to prioritize relevance and maintainability—not to discourage contributions. In fact, we encourage you to update issues if you are still experiencing them.
To give everyone time to review and respond, the cleanup process will begin February 23rd, 2026 — 3 weeks after the publication of this post.
Between now and then, we strongly encourage the community to:
Once the review window has passed, we will begin applying the closure rules across the impacted repositories.
Closed issues that are later found to be valid on current releases can always be reopened with updated reproduction details.
Our goal is simple: to provide a clean, focused, and efficient contribution tracker that better serves both the Capacitor team and the broader community going forward.
Finally, we want to sincerely thank the entire Capacitor community: maintainers, contributors, and users alike. Your support is what makes this project thrive. This reset is about making sure your contributions continue to have the greatest possible impact, now and into the future.
We truly appreciate your collaboration and your continued support.
The post Keeping Capacitor’s Backlog Healthy appeared first on Ionic Blog.
]]>The post Meet the Capacitor Team appeared first on Ionic Blog.
]]>Alongside our open-source responsibilities, we’re also one of several teams that enable mobile development within the OutSystems suite, helping ensure Capacitor and plugins integrate cleanly into the broader platform.
If you follow Capacitor closely, some of these names or GitHub handles may already be familiar. Here’s a closer look at the people behind them.

GitHub: @eric-horodyski
Favorite Language: TypeScript
Engineering Manager for the Capacitor team. Former Ionic Solutions Architect.

GitHub: N/A
Favorite Language: N/A
Product Manager for the Capacitor team.

GitHub: @OS-pedrogustavobilro
Favorite Language: Kotlin
Software engineer focusing on Android.

GitHub: @OS-ruimoreiramendes
Favorite Language: Swift
Software engineer focusing on iOS.

GitHub: @ItsChaceD
Fun Fact: I love working with Web3; my current favorite JS framework is Astro.
Started coding in high school, now focused on making Capacitor the best cross-platform framework and ecosystem.

GitHub: @alexgerardojacinto
Favorite Language: Kotlin
Software engineer with focus on mobile development and Android.

GitHub: @andredestro
Favorite Language: Swift
Software engineer focusing on iOS.

GitHub: @theproducer
Favorite Language: Swift/C++
Software engineer with a background in graphic design, web, and iOS development.

GitHub: @markemer
Fun Fact: I’ve worked with Swift since the Xcode 6 beta, integrating it on release day—essentially as early as possible in production.
Done everything from handcrafting transistors, to chip design, to (mostly) iOS mobile programming in the last 15 years or so.
Much of the work behind Capacitor happens in the open, alongside a wide community of contributors and maintainers. We’re grateful for the care, collaboration, and feedback that help keep the project moving forward — both from the people on this team and from the community that works with us every day.
The post Meet the Capacitor Team appeared first on Ionic Blog.
]]>