{"id":6296,"date":"2025-02-19T11:57:51","date_gmt":"2025-02-19T16:57:51","guid":{"rendered":"https:\/\/ionic.io\/blog\/?p=6296"},"modified":"2025-02-19T12:22:09","modified_gmt":"2025-02-19T17:22:09","slug":"unifying-plugins-across-ionic-and-outsystems","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems","title":{"rendered":"Unifying Plugins across Ionic and OutSystems"},"content":{"rendered":"\n<p>One of the more exciting aspects of Ionic joining OutSystems was comparing our portfolios of supported plugins. Does Ionic provide functionality OutSystems is missing? Does OutSystems have plugins without a Capacitor equivalent? How do we bring the best of both worlds to OutSystems\u2019 low-code and Ionic\u2019s open-source communities?<\/p>\n\n\n\n<p>Some decisions were easy. For instance, Ionic didn\u2019t have a <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/barcode-scanner\">Barcode Scanner<\/a> or its own <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/inappbrowser\">InAppBrowser<\/a> plugin, so we pulled those into the Capacitor ecosystem from OutSystems\u2019 collection\u2014no brainer.<\/p>\n\n\n\n<p>But what about plugins like <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/filesystem\">Filesystem<\/a> that do essentially the same thing? We found a long list of plugins that exist in both ecosystems\u2014plugins that could, and should, be unified. Since we need to support both Cordova and Capacitor for compatibility across OutSystems versions, we took a thoughtful approach to merging these plugins while making them available to Ionic\u2019s open-source community.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-building-the-unified-plugin-architecture\">Building the Unified Plugin Architecture<\/h2>\n\n\n\n<p>To make this work, we designed a <strong>unified plugin architecture<\/strong> that breaks down the different building blocks of a plugin so the same functionality can be reassembled as both a Cordova plugin and a Capacitor plugin.<\/p>\n\n\n\n<p>Going forward, all unified plugins will follow this structure:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Native Libraries &#8211; <\/strong>&nbsp;Core implementation now lives in dedicated open-source native libraries. These can be used in Capacitor, Cordova, or even native mobile projects.<\/li>\n\n\n\n<li><strong>Capacitor Plugin &#8211;<\/strong> The Capacitor plugin remains on npm under its existing package name (e.g., <code>@capacitor\/geolocation<\/code>) but now lives in its own repository.<\/li>\n\n\n\n<li><strong>Cordova Plugin &amp; OutSystems Wrapper &#8211;<\/strong> The Cordova plugin and OutSystems-specific components are housed in a single repository, but usage will remain exclusive to OutSystems applications.<\/li>\n<\/ul>\n\n\n\n<p>Geolocation is the first plugin to adopt this model, starting with version 7.1.0. More plugins will follow in future releases.<\/p>\n\n\n\n<p>If you&#8217;re a Capacitor plugin developer, this is great news! This approach makes native functionality more modular and reusable, opening the door to more contributions and improvements across the ecosystem. And don\u2019t worry\u2013this won\u2019t change how you build plugins today. Our tooling will continue generating plugins the same way, and any new Capacitor-exclusive plugins (like the <a href=\"https:\/\/capacitorjs.com\/docs\/apis\/privacy-screen\">Privacy Screen plugin<\/a>) will follow the existing structure. This setup is just for plugins that need to support both OutSystems and Ionic, so unless that applies to you, keep doing what you&#8217;re doing!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-does-this-mean-for-me\">What Does This Mean for Me?<\/h2>\n\n\n\n<p>If you use Ionic&#8217;s plugins in your Capacitor apps, nothing will change\u2014everything will keep working just as it does today. But as we unify plugins, expect to see new features and enhancements along the way. We\u2019ll continue iterating on existing plugins and will provide plenty of notice for any API deprecations.<\/p>\n\n\n\n<p>If you keep an eye on our <a href=\"https:\/\/github.com\/ionic-team\">GitHub<\/a>, you\u2019ll start seeing new repositories for plugins that follow this unified architecture. We\u2019ll also be adding deprecation notices in the <a href=\"https:\/\/github.com\/ionic-team\/capacitor-plugins\">Capacitor Plugins monorepo<\/a>, with clear instructions on where to find their new and improved homes.<\/p>\n\n\n\n<p>By structuring plugins this way, we\u2019re opening the door to even more open-source contributions. Native libraries are now accessible to <strong>any<\/strong> mobile developer\u2014whether they use Capacitor, Cordova, Flutter, or React Native. If you\u2019re into native development and want to contribute, we&#8217;d love to have you!<\/p>\n\n\n\n<p>This is just the beginning\u2013our focus now is on unifying even more plugins! Huge shout-out to the engineers working on this initiative for all their hard work in making it happen! \ud83d\ude80<\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of the more exciting aspects of Ionic joining OutSystems was comparing our portfolios of supported plugins. Does Ionic provide functionality OutSystems is missing? Does OutSystems have plugins without a Capacitor equivalent? How do we bring the best of both worlds to OutSystems\u2019 low-code and Ionic\u2019s open-source communities? Some decisions were easy. For instance, Ionic [&hellip;]<\/p>\n","protected":false},"author":76,"featured_media":6302,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"1","publish_post_category":"26","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"584624","discourse_permalink":"http:\/\/forum.ionicframework.com\/t\/unifying-plugins-across-ionic-and-outsystems\/246761","wpdc_publishing_response":"success","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,121],"tags":[151,221],"class_list":["post-6296","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all","category-engineering","tag-capacitor","tag-plugins"],"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>Unifying Plugins across Ionic and OutSystems - 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\/unifying-plugins-across-ionic-and-outsystems\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unifying Plugins across Ionic and OutSystems\" \/>\n<meta property=\"og:description\" content=\"One of the more exciting aspects of Ionic joining OutSystems was comparing our portfolios of supported plugins. Does Ionic provide functionality OutSystems is missing? Does OutSystems have plugins without a Capacitor equivalent? How do we bring the best of both worlds to OutSystems\u2019 low-code and Ionic\u2019s open-source communities? Some decisions were easy. For instance, Ionic [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-19T16:57:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-19T17:22:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"1280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Eric Horodyski\" \/>\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=\"Eric Horodyski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\"},\"author\":{\"name\":\"Eric Horodyski\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/bec836be266e0046c56c120cdb9806d6\"},\"headline\":\"Unifying Plugins across Ionic and OutSystems\",\"datePublished\":\"2025-02-19T16:57:51+00:00\",\"dateModified\":\"2025-02-19T17:22:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\"},\"wordCount\":572,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png\",\"keywords\":[\"Capacitor\",\"plugins\"],\"articleSection\":[\"All\",\"Engineering\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\",\"url\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\",\"name\":\"Unifying Plugins across Ionic and OutSystems - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png\",\"datePublished\":\"2025-02-19T16:57:51+00:00\",\"dateModified\":\"2025-02-19T17:22:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png\",\"width\":1280,\"height\":1280},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unifying Plugins across Ionic and OutSystems\"}]},{\"@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\/bec836be266e0046c56c120cdb9806d6\",\"name\":\"Eric Horodyski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/07\/T024WJZKU-U010BLA2B9S-89f661f3bfad-512-150x150.jpeg\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/07\/T024WJZKU-U010BLA2B9S-89f661f3bfad-512-150x150.jpeg\",\"caption\":\"Eric Horodyski\"},\"url\":\"https:\/\/ionic.io\/blog\/author\/horodyski\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Unifying Plugins across Ionic and OutSystems - 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\/unifying-plugins-across-ionic-and-outsystems","og_locale":"en_US","og_type":"article","og_title":"Unifying Plugins across Ionic and OutSystems","og_description":"One of the more exciting aspects of Ionic joining OutSystems was comparing our portfolios of supported plugins. Does Ionic provide functionality OutSystems is missing? Does OutSystems have plugins without a Capacitor equivalent? How do we bring the best of both worlds to OutSystems\u2019 low-code and Ionic\u2019s open-source communities? Some decisions were easy. For instance, Ionic [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems","og_site_name":"Ionic Blog","article_published_time":"2025-02-19T16:57:51+00:00","article_modified_time":"2025-02-19T17:22:09+00:00","og_image":[{"width":1280,"height":1280,"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","type":"image\/png"}],"author":"Eric Horodyski","twitter_card":"summary_large_image","twitter_creator":"@ionicframework","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Eric Horodyski","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems"},"author":{"name":"Eric Horodyski","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/bec836be266e0046c56c120cdb9806d6"},"headline":"Unifying Plugins across Ionic and OutSystems","datePublished":"2025-02-19T16:57:51+00:00","dateModified":"2025-02-19T17:22:09+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems"},"wordCount":572,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","keywords":["Capacitor","plugins"],"articleSection":["All","Engineering"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems","url":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems","name":"Unifying Plugins across Ionic and OutSystems - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","datePublished":"2025-02-19T16:57:51+00:00","dateModified":"2025-02-19T17:22:09+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","width":1280,"height":1280},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/unifying-plugins-across-ionic-and-outsystems#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"Unifying Plugins across Ionic and OutSystems"}]},{"@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\/bec836be266e0046c56c120cdb9806d6","name":"Eric Horodyski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/07\/T024WJZKU-U010BLA2B9S-89f661f3bfad-512-150x150.jpeg","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/07\/T024WJZKU-U010BLA2B9S-89f661f3bfad-512-150x150.jpeg","caption":"Eric Horodyski"},"url":"https:\/\/ionic.io\/blog\/author\/horodyski"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2025\/02\/unnamed-1-1.png","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6296","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\/76"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=6296"}],"version-history":[{"count":3,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6296\/revisions"}],"predecessor-version":[{"id":6305,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/6296\/revisions\/6305"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media\/6302"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=6296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=6296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=6296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}