{"id":21796,"date":"2018-09-12T15:54:14","date_gmt":"2018-09-12T15:54:14","guid":{"rendered":"http:\/\/introducing_the_cloudinary_demo_android_app_part_1"},"modified":"2024-06-04T15:51:04","modified_gmt":"2024-06-04T22:51:04","slug":"introducing_the_cloudinary_demo_android_app_part_1","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1","title":{"rendered":"Introducing the Cloudinary Demo Android App, Part 1"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Cloudinary has recently added the Cloudinary Demo- e-commerce App to the Google Play Store. The App demonstrates the best practices for optimal delivery of images on a storefront, including category pages, product pages, and a shopping cart.<\/p>\n<p>The Cloudinary Demo &#8211; eCommerce App was developed as an open source project so that you can explore the code for yourself and see how to improve your users\u2019 experience and the performance of your apps by delivering images, enhanced and optimized for different contexts. The demo app demonstrates how to leverage some of Cloudinary\u2019s capabilities, such as managing <a href=\"https:\/\/cloudinary.com\/blog\/automating_file_upload_and_sharing\">file uploads<\/a>, displaying images responsively, and optimizing delivery through global Content Delivery Networks (CDNs).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_5px_solid_black,f_auto,q_auto\/dpr_auto\/DemoApp1.jpg\" alt=\"CloudinaryDemoApp1\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"200\" height=\"396.36363636364\"\/>  <img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_5px_solid_black,f_auto,q_auto\/dpr_auto\/DemoApp2.jpg\" alt=\"CloudinaryDemoApp1\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"200\" height=\"396.36363636364\"\/>  <img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_5px_solid_black,f_auto,q_auto\/dpr_auto\/DemoApp3.jpg\" alt=\"CloudinaryDemoApp1\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"200\" height=\"396.36363636364\"\/><\/p>\n<div style=\"clear: both\"><\/div>\n<p>In addition to showcasing some of Cloudinary\u2019s features, the demo app also shows how to take advantage of existing open source libraries and get them to work together to create a functional app. The source code is available on <a href=\"https:\/\/github.com\/cloudinary\/android-demo\">GitHub<\/a> and can also be used as the code base for developing your own app. We\u2019ll walk you through that in <a href=\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_2\">Part 2<\/a> of this series.<\/p>\n<p>In this post, we\u2019ll give you an under-the-hood tour of how this eCommerce app was designed and how Cloudinary was integrated throughout.<\/p>\n<p>Whether you\u2019re building an app for eCommerce, or for any other purpose, the Cloudinary demo app can help you learn and adopt best practices for efficient management and optimal delivery of your images. Read on to get some technical insight into how the app was designed, and how the various components function together.<\/p>\n<h2>Showcasing Cloudinary best practices<\/h2>\n<p>Cloudinary enables you to simplify and automate the process of creating, managing, and delivering images, optimized for performance and user preferences. Specifically in this Android demo app:<\/p>\n<ul>\n<li>\n<p>The Cloudinary image URLs are generated on the fly, with <a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#responsive_images\">responsive behaviour<\/a> where needed. They load quickly by automatically delivering them in the most efficient format, quality, and resolution, depending on the content and viewing device. These URLs are then fetched and displayed using Picasso. <img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_5px_solid_black,f_auto,q_auto\/dpr_auto\/DemoApp4.jpg\" alt=\"Deliver responsive images\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"200\" height=\"396.36363636364\"\/><\/p>\n<\/li>\n<li>\n<p>Although not typical of an eCommerce app, the Cloudinary app also demonstrates functionality for uploading images and shows how to add this upload functionality for your app users. The demo app lets you upload new product images and provide metadata, such as description and price, that is saved with the image. That metadata is used when displaying the new products in the store. <img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/bo_5px_solid_black,f_auto,q_auto\/dpr_auto\/DemoApp5.jpg\" alt=\"Upload images\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"200\" height=\"396.36363636364\"\/><\/p>\n<\/li>\n<\/ul>\n<h2>The App Design<\/h2>\n<p>The backbone of the app is based on several modules from <a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/\">Google\u2019s Android Architecture Components<\/a>, which were selected for their compatibility. They offer a complete solution, work well together, are well supported, and were developed together as part of a whole solution. Specifically, the app is based on the following 3 components:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/livedata\">LiveData<\/a> implements an observer pattern library for syncing local data with the UI and view models. This component was selected because of its inherent compatibility and stability, and is currently the only library written from the ground up specifically for Android.<\/li>\n<li>\n<a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/room\">Room<\/a> is a persistence library that provides an abstraction layer over SQLite. Although there are many options for ORM libraries, we selected to go with this component as the new kid on the block, with the latest, simple, efficient and specialized features.<\/li>\n<li>\n<a href=\"https:\/\/developer.android.com\/topic\/libraries\/architecture\/viewmodel\">ViewModel<\/a> is a class designed to store and manage UI-related data. It\u2019s new, streamlined, and supplies what we need without all the extras from other libraries.<\/li>\n<\/ul>\n<p>In addition to these base components, the demo app also includes a few other open source components:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/google.github.io\/dagger\/\">Dagger<\/a> by Google. The standard, de facto component for dependency injection, with no real competition.<\/li>\n<li>\n<a href=\"https:\/\/square.github.io\/picasso\/\">Picasso<\/a> by Square, for image download and caching. Lightweight, easy to use, and very well suited to our needs (can be easily switched out for a component with more advanced features like Glide or Fresco).<\/li>\n<li>\n<a href=\"https:\/\/square.github.io\/retrofit\/\">Retrofit<\/a> by Square, for handling HTTP calls and networking. A popular, highly recommended component that integrates well with Android, one of the few not adapted from Java, but written specifically for Android devices.<\/li>\n<\/ul>\n<p>And of course the most important component of all &#8211; Cloudinary\u2019s <a href=\"https:\/\/cloudinary.com\/documentation\/android_integration\">Android SDK<\/a> &#8211; for handling image and video upload, optimization, transformations, responsiveness, fast delivery and all the other great <a href=\"https:\/\/cloudinary.com\/documentation\/solution_overview#features_overview\">features<\/a> Cloudinary brings to the table.<\/p>\n<h2>Bringing it all together<\/h2>\n<p>The core of the Cloudinary Demo App is the Room component, where all the data is accessed from an abstraction layer over an SQLite database. When used in conjunction with the ViewModel class, this component enables us to keep the app UI separate from the business logic and allows for easy testing. The data flow (Room -&gt; Repository -&gt; ViewModel -&gt; UI) methods always pass LiveData objects instead of actual data, so that any data updates are automatically reflected to any observed components. The LiveData aggregations and transformations are used to build custom Models for the ViewModel and UI, while keeping all the models \u2018alive\u2019.<\/p>\n<p>Dependency injection is the main pattern for all the different components. A ViewModel is injected into its respective Activity\/Fragment: the repository is injected into the ViewModels, the backend connector is injected into the repository, etc. Nothing is constructed \u2018manually\u2019.<\/p>\n<p>A single repository instance is the only access point for the ViewModels, as they do not interact directly with remote servers or the local DB. The repository handles everything internally, returning LiveData objects from the local DB, fetching fresh remote data when applicable (based on its own logic) and syncing the local DB. The fresh data is updated\/inserted into the DB and then automatically refreshed in the ViewModels (and then then UI) since the App uses LiveData objects. This means that the local DB is the single source of truth for the App.<\/p>\n<h2>To sum up<\/h2>\n<p>Besides demonstrating some of Cloudinary\u2019s image management and delivery capabilities, the Cloudinary Demo &#8211; eCommerce App also showcases best practices when building your own Android app. The demo app itself is available as open source and can be used as the basis for creating your own app. In <a href=\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_2\">part 2<\/a> of this blog series, we\u2019ll show you how to do just that. Meanwhile, if you don\u2019t have a Cloudinary account yet, you can <a href=\"https:\/\/cloudinary.com\/users\/register_free\">sign up for a free account<\/a> and give it a try.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21797,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,25,119,227,251,303,305],"class_list":["post-21796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-asset-management","tag-file-upload","tag-performance-optimization","tag-responsive-images","tag-video","tag-video-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>The Cloudinary Open Source Demo Android App<\/title>\n<meta name=\"description\" content=\"See what&#039;s under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Cloudinary Demo Android App, Part 1\" \/>\n<meta property=\"og:description\" content=\"See what&#039;s under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-12T15:54:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-04T22:51:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Introducing the Cloudinary Demo Android App, Part 1\",\"datePublished\":\"2018-09-12T15:54:14+00:00\",\"dateModified\":\"2024-06-04T22:51:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA\",\"keywords\":[\"Android\",\"Asset Management\",\"File-upload\",\"Performance Optimization\",\"Responsive Images\",\"Video\",\"Video API\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2018\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\",\"url\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\",\"name\":\"The Cloudinary Open Source Demo Android App\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA\",\"datePublished\":\"2018-09-12T15:54:14+00:00\",\"dateModified\":\"2024-06-04T22:51:04+00:00\",\"description\":\"See what's under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Cloudinary Demo Android App, Part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Cloudinary Open Source Demo Android App","description":"See what's under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.","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:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1","og_locale":"en_US","og_type":"article","og_title":"Introducing the Cloudinary Demo Android App, Part 1","og_description":"See what's under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.","og_url":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1","og_site_name":"Cloudinary Blog","article_published_time":"2018-09-12T15:54:14+00:00","article_modified_time":"2024-06-04T22:51:04+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1"},"author":{"name":"","@id":""},"headline":"Introducing the Cloudinary Demo Android App, Part 1","datePublished":"2018-09-12T15:54:14+00:00","dateModified":"2024-06-04T22:51:04+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA","keywords":["Android","Asset Management","File-upload","Performance Optimization","Responsive Images","Video","Video API"],"inLanguage":"en-US","copyrightYear":"2018","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1","url":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1","name":"The Cloudinary Open Source Demo Android App","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA","datePublished":"2018-09-12T15:54:14+00:00","dateModified":"2024-06-04T22:51:04+00:00","description":"See what's under the hood of this open-source eCommerce Android app, built to demo best practices for app performance and optimized image delivery.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/introducing_the_cloudinary_demo_android_app_part_1#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the Cloudinary Demo Android App, Part 1"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649722759\/Web_Assets\/blog\/CloudinaryDemoApp1\/CloudinaryDemoApp1.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21796"}],"version-history":[{"count":6,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21796\/revisions"}],"predecessor-version":[{"id":34367,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21796\/revisions\/34367"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21797"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}