{"id":22103,"date":"2020-06-15T16:53:43","date_gmt":"2020-06-15T16:53:43","guid":{"rendered":"http:\/\/cloudinary_s_next_generation_developers_sdks"},"modified":"2020-06-15T16:53:43","modified_gmt":"2020-06-15T16:53:43","slug":"cloudinary_s_next_generation_developers_sdks","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks","title":{"rendered":"Cloudinary\u2019s Next-Generation Developer SDKs"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>For the past eight years, Cloudinary powered media experience for countless websites and systems worldwide by managing, delivering, and optimizing their media. That\u2019s because Cloudinary\u2019s technology gives you, as developers, capabilities for creating, manipulating, and transforming media on the fly with a self-evident API in the form of a URL.<\/p>\n<p>If you\u2019re new to Cloudinary, to get started, just <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">sign up for a free account<\/a>, download a <a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_sdks\">software development kit (SDK)<\/a> for your favorite technology, and you\u2019re good to go.<\/p>\n<p>SDKs are code collections with which you can interact with services in your coding language. Be it <a href=\"https:\/\/cloudinary.com\/documentation\/java_integration\">Java<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/javascript_integration\">JavaScript (JS)<\/a>, <a href=\"https:\/\/cloudinary.com\/documentation\/php_integration\">PHP<\/a>, or any other programming lingo, the service blends into your project through the SDK. The Cloudinary SDKs are no different, through which you can access our platform\u2019s capabilities and perform tasks without having to build the URLs yourself.<\/p>\n<p>This post answers these questions:<\/p>\n<ul>\n<li>\n<a href=\"#why-revamp\">Why revamp Cloudinary\u2019s SDKs?<\/a>\n<\/li>\n<li>\n<a href=\"#focus\">What do Cloudinary\u2019s SDKs v2 focus on?<\/a>\n<\/li>\n<li>\n<a href=\"#dx\">How do Cloudinary\u2019s SDKs v2 elevate developer experience?<\/a>\n<\/li>\n<li>\n<a href=\"#syntax\">What\u2019s action-based syntax?<\/a>\n<\/li>\n<li>\n<a href=\"#size\">How does size matter?<\/a>\n<\/li>\n<li>\n<a href=\"#benefits\">What are other benefits of Cloudinary\u2019s SDKs v2?<\/a>\n<\/li>\n<li>\n<a href=\"#next\">What\u2019s next?<\/a>\n<\/li>\n<\/ul>\n<h2 id=\"why-revamp\">Why Revamp Cloudinary\u2019s SDKs?<\/h2> \n<p>As embedded libraries within code, SDKs must be stable and backward compatible, meaning that things that worked before must continue to work in new releases. However, backward compatibility exacts a price\u2014that of maintaining old code along with their outdated conventions and deprecated dependencies. Furthermore, the underlying Cloudinary technology has undergone many iterations since its inception, becoming much more complicated and resulting in complexity in the SDK code.<\/p>\n<p>Unquestionably, it\u2019s time for a major revamp of our SDK suite.<\/p>\n<h2 id=\"focus\">What Do Cloudinary\u2019s SDKs v2 Focus On?<\/h2> \n<p>We started with setting goals: what we wanted to achieve and what counted the most. Besides aspiring for state-of-the-art code, we also emphasized enhancing the developer experience. Why? Because, ultimately, developer experience sums up to \u201cYay, I love this!\u201d or \u201cNah, let me find something else.\u201d  It\u2019s all about how you feel when working with a library or service. Starting from the repo, it\u2019s README, the on-boarding phase, the flattened learning curve\u00a0\u00a0\ud83d\udcc8, and all the way to ease of use, discoverability, inline docs, and the IDE autocomplete.<\/p>\n<p>Hence, developer experience was a high-priority focus for us while designing SDK v2.<\/p>\n<h2 id=\"dx\">How Do Cloudinary\u2019s SDKs v2 Elevate Developer Experience?<\/h2> \n<p>Cloudinary\u2019s SDK v1 suite was all about wrapping our URL syntax. For example, to transform this image\u2014<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/bike.jpg\" alt=\"Bike\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"933\"\/><\/p>\n<p>\u2014to the one below (rotate it, crop only the face, and cartoonify it), you add a transformation string to the URL<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">https:<span class=\"hljs-comment\">\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/a_20,c_crop,g_face,e_cartoonify\/Web_Assets\/blog\/bike.jpg<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_400\/a_20,c_crop,g_face,e_cartoonify\/Web_Assets\/blog\/bike.jpg\" alt=\"bike cropped face\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"400\" height=\"456.25\"\/><\/p>\n<p>The generated URL through the SDK interface (PHP in this case) looks like this:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">cl_image(<span class=\"hljs-string\">\"bike\"<\/span>, <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"angle\"<\/span>=&gt;<span class=\"hljs-number\">20<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>=&gt;<span class=\"hljs-string\">\"crop\"<\/span>, <span class=\"hljs-string\">\"gravity\"<\/span>=&gt;<span class=\"hljs-string\">\"face\"<\/span>, <span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"cartoonify\"<\/span>));\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>See how the syntax is directly coupled with the transformation string in the URL?<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_700,c_fill,f_auto,q_auto,dpr_2.0\/Web_Assets\/blog\/syntax.png\" alt=\"syntax\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1400\" height=\"190\"\/><\/p>\n<p>So, SDK \u21d2 requires that you know the URL\u2019s transformation syntax. For all the flexibility of that syntax, the learning curve can be steep for simple and complex tasks alike.<\/p>\n<p>Inherently, learning curves are no-nos because, supposedly, libraries reduce development time by offering service or code that someone has already built. If using a library saves you time but costs you a learning curve, it misses the point.<\/p>\n<p>To us at Cloudinary, the learning curve mainly translates to the time spent reading the docs. Even though our docs site is up-to-date and search oriented, having to leave the IDE to check the values for the <code>crop<\/code> parameter, for example, is a hassle.<\/p>\n<p>Also, some of our URL API is cumbersome and complex. To simplify those thorny cases, action-based syntax that speaks your language emerged as the answer.<\/p>\n<h2 id=\"syntax\">What\u2019s Action-Based Syntax?<\/h2> \n<p>The approach we adopted involved exposing a set of actions that can be applied to high-level media objects and using a builder for you to set up the parameters for each action.<\/p>\n<p>An example: you want to resize and concatenate (play one after the other) two videos. The syntax looks like this in SDK v1:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">cloudinary_url(<span class=\"hljs-string\">\"kitten_fighting\"<\/span>, <span class=\"hljs-string\">\"transformation\"<\/span>=&gt;<span class=\"hljs-keyword\">array<\/span>(\n    <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"width\"<\/span>=&gt;<span class=\"hljs-number\">300<\/span>, <span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">200<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>=&gt;<span class=\"hljs-string\">\"fill\"<\/span>), \n    <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"layer\"<\/span>=&gt;<span class=\"hljs-string\">\"dog\"<\/span>,<span class=\"hljs-string\">\"flag\"<\/span>=&gt;<span class=\"hljs-string\">\"splice\"<\/span>, <span class=\"hljs-string\">\"width\"<\/span>=&gt;<span class=\"hljs-number\">300<\/span>, <span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">200<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>=&gt;<span class=\"hljs-string\">\"fill\"<\/span>));\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>In SDK v2, it\u2019s shorter, clearer, and much more readable:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">new<\/span> Video(<span class=\"hljs-string\">\"kitten_fighting\"<\/span>)\n    -&gt;resize(Resize::fill(<span class=\"hljs-number\">300<\/span>,<span class=\"hljs-number\">200<\/span>))\n    -&gt;concat(<span class=\"hljs-keyword\">new<\/span> Video(<span class=\"hljs-string\">\"dog\"<\/span>)-&gt;resize(Resize::fill(<span class=\"hljs-number\">300<\/span>,<span class=\"hljs-number\">200<\/span>));\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Here\u2019s the process:<\/p>\n<ol>\n<li>You declare that you\u2019re working on a <strong><code>Video<\/code><\/strong> with the public ID <code>kitten_fighting<\/code>.<\/li>\n<li>You apply an <strong>action<\/strong> of type <code>resize<\/code> and use the <code>Resize<\/code> <strong>builder<\/strong> to select the <code>fill<\/code> type for which you specify the required parameters (width and height).<\/li>\n<li>You <code>concat<\/code> another <strong><code>Video<\/code><\/strong> with the public ID <code>dog<\/code>, resizing the video in the same way.<\/li>\n<\/ol>\n<p>We based the syntax definition on the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fluent_interface\">fluent-interface<\/a> paradigm as much as possible. Plus, although the API aims at building a URL and the actual transformation occurs in the server, the design makes you feel as if you were transforming the image step by step, with each action returning a transformed image for your next step.<\/p>\n<p>The benefits are obvious: enhanced readability, more discoverability, and less error-proneness, with the IDE\u2019s autocomplete feature being the cherry on the cake.<\/p>\n<h2 id=\"size\">How Does Size Matter?<\/h2> \n<p>Another important goal was to minimize the package size according to your task, i.e., break up the SDKs v2 into smaller pieces, enabling you to import just the relevant parts.<\/p>\n<p>Even though the size has varying degrees of importance, depending on the package, we firmly believed that modularity is paramount. For example, package size matters less in back-end languages like PHP but is crucial in front-end technologies, such as React and JS. Ultimately, we defined the modules for each of the SDKs, parts or all of which you can download and use.<\/p>\n<p>See this high-level diagram of the modules:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/image\/upload\/w_400,c_fill,f_auto,q_auto\/Web_Assets\/blog\/diagram.png\" alt=\"modules\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"400\" height=\"252\"\/><\/p>\n<p>Clearly, the modules of the SDKs vary. For example, because size matters the most in JS,  everything in the JS SDK will be fully tree-shakable. That way, <strong>only<\/strong> the used code is bundled and you wouldn\u2019t download a single extra bit.<\/p>\n<h2 id=\"benefits\">What Are Other Benefits of Cloudinary\u2019s SDKs v2?<\/h2> \n<p>Cloudinary\u2019s SDKs v2 feature many other benefits.<\/p>\n<h3>Forward Compatibility<\/h3>\n<p>Forward compatibility is a predominant feature of Cloudinary SDK v1. That translates to no updates on your part for new features, such as <code>e_make-the-world-better<\/code>. Just write this code and you\u2019re all set:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">cl_image(<span class=\"hljs-string\">\"image\"<\/span>, <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"make-the-world-better\"<\/span>)); \n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Forward compatibility persists in the next-generation SDKs:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-keyword\">new<\/span> Image(<span class=\"hljs-string\">\"image\"<\/span>)-&gt;effect(Effect::generic(\u201cmake-the-world-better\u201d));\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h3>Backward Compatibility<\/h3>\n<p>Upgrading to a library\u2019s new version can be nerve wrecking. To head off that concern, we looked for a way to ensure that your existing code will continue to function and that you can leverage the new syntax capability for upcoming projects. Toward that end, SDK v2 contains a special method that builds actions from existing code.<\/p>\n<p>For example, take this SDK v1 code:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">cloudinary_url(<span class=\"hljs-string\">\"actor.jpg\"<\/span>, <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"transformation\"<\/span>=&gt;<span class=\"hljs-keyword\">array<\/span>(\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"cartoonify\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"radius\"<\/span>=&gt;<span class=\"hljs-string\">\"max\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"outline:100\"<\/span>, <span class=\"hljs-string\">\"color\"<\/span>=&gt;<span class=\"hljs-string\">\"lightblue\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"background\"<\/span>=&gt;<span class=\"hljs-string\">\"lightblue\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">300<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>=&gt;<span class=\"hljs-string\">\"scale\"<\/span>)\n  )))\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>For it to work in v2, convert it to read like this:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">Image::fromParams(<span class=\"hljs-string\">\"actor.jpg\"<\/span>, <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"transformation\"<\/span>=&gt;<span class=\"hljs-keyword\">array<\/span>(\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"cartoonify\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"radius\"<\/span>=&gt;<span class=\"hljs-string\">\"max\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"effect\"<\/span>=&gt;<span class=\"hljs-string\">\"outline:100\"<\/span>, <span class=\"hljs-string\">\"color\"<\/span>=&gt;<span class=\"hljs-string\">\"lightblue\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"background\"<\/span>=&gt;<span class=\"hljs-string\">\"lightblue\"<\/span>),\n  <span class=\"hljs-keyword\">array<\/span>(<span class=\"hljs-string\">\"height\"<\/span>=&gt;<span class=\"hljs-number\">300<\/span>, <span class=\"hljs-string\">\"crop\"<\/span>=&gt;<span class=\"hljs-string\">\"scale\"<\/span>)\n)))-&gt;toUrl();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>With a few string replacements, you\u2019ll have migrated to v2.<\/p>\n<h3>Documentation<\/h3>\n<p>The next-generation SDKs will contain inline <code>docString<\/code> instances that are compiled as references to your methods in the libraries. In other words, you can leverage doc annotations to create a static API reference on top of our docs\u2014without leaving the IDE.<\/p>\n<h2 id=\"next\">What\u2019s Next?<\/h2> \n<p>We\u2019d long been adding to the wish list for our SDKs and are moving full steam ahead to implement it. In the end, a better SDK spells efficiency for you to get more out of Cloudinary.<\/p>\n<p>Cloudinary\u2019s next-generation SDKs will be available soon, the first ones being those for PHP,  <a href=\"https:\/\/cloudinary.com\/blog\/get_ready_for_cloudinary_s_next_generation_javascript_sdks\">JavaScript<\/a>, and Svelte. Some of them are v2 of the existing SDKs; others will support technologies like Kotlin, Flutter, and Golang.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22104,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,263,303],"class_list":["post-22103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-sdk","tag-video"],"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>Cloudinary\u2019s Next-Generation Developer SDKs<\/title>\n<meta name=\"description\" content=\"Cloudinary&#039;s developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.\" \/>\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\/cloudinary_s_next_generation_developers_sdks\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cloudinary\u2019s Next-Generation Developer SDKs\" \/>\n<meta property=\"og:description\" content=\"Cloudinary&#039;s developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-15T16:53:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.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\/cloudinary_s_next_generation_developers_sdks#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Cloudinary\u2019s Next-Generation Developer SDKs\",\"datePublished\":\"2020-06-15T16:53:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\"},\"wordCount\":5,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA\",\"keywords\":[\"Asset Management\",\"SDK\",\"Video\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\",\"url\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\",\"name\":\"Cloudinary\u2019s Next-Generation Developer SDKs\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA\",\"datePublished\":\"2020-06-15T16:53:43+00:00\",\"description\":\"Cloudinary's developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloudinary\u2019s Next-Generation Developer SDKs\"}]},{\"@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":"Cloudinary\u2019s Next-Generation Developer SDKs","description":"Cloudinary's developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.","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\/cloudinary_s_next_generation_developers_sdks","og_locale":"en_US","og_type":"article","og_title":"Cloudinary\u2019s Next-Generation Developer SDKs","og_description":"Cloudinary's developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.","og_url":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks","og_site_name":"Cloudinary Blog","article_published_time":"2020-06-15T16:53:43+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks"},"author":{"name":"","@id":""},"headline":"Cloudinary\u2019s Next-Generation Developer SDKs","datePublished":"2020-06-15T16:53:43+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks"},"wordCount":5,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","keywords":["Asset Management","SDK","Video"],"inLanguage":"en-US","copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks","url":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks","name":"Cloudinary\u2019s Next-Generation Developer SDKs","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","datePublished":"2020-06-15T16:53:43+00:00","description":"Cloudinary's developer SDKs v2 for media management focus on developer experience: syntax, package size, forward and backward compatibility, documentation.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/cloudinary_s_next_generation_developers_sdks#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cloudinary\u2019s Next-Generation Developer SDKs"}]},{"@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\/v1649738005\/Web_Assets\/blog\/Cloudinary-Next-Generation-SDKs_2210425a12\/Cloudinary-Next-Generation-SDKs_2210425a12.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22103","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=22103"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22103\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22104"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}