{"id":28461,"date":"2023-10-11T07:00:00","date_gmt":"2023-10-11T14:00:00","guid":{"rendered":"http:\/\/generating-image-collages-in-a-nuxtjs-app"},"modified":"2025-11-27T14:16:03","modified_gmt":"2025-11-27T22:16:03","slug":"generating-image-collages-in-a-nuxtjs-app","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app","title":{"rendered":"Generating Image Collages Using Nuxt.js"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>A collage is a combination of multiple pictures combined into a single image. They\u2019re useful in various applications from presenting memories to summarizing events. Instead of exploring multiple applications to generate collages, let\u2019s explore how we can build a simple Nuxt.js app to generate them.<\/p>\n<h2>Codesandbox<\/h2>\n<p>The completed project is available on <a href=\"https:\/\/codesandbox.io\/s\/nuxt-image-collage-udi883\">Codesandbox<\/a>.<\/p>\n<\/div>\n\n\n  <div class=\"wp-block-cloudinary-code-sandbox \">\n    <iframe\n      src=\"https:\/\/codesandbox.io\/embed\/nuxt-image-collage-udi883?theme=dark&amp;codemirror=1&amp;highlights=&amp;editorsize=50&amp;fontsize=14&amp;expanddevtools=0&amp;hidedevtools=0&amp;eslint=0&amp;forcerefresh=0&amp;hidenavigation=0&amp;initialpath=%2F&amp;module=&amp;moduleview=0&amp;previewwindow=&amp;view=&amp;runonclick=1\"\n      height=\"500\"\n      style=\"width: 100%;\"\n      title=\"nuxt-image-collage\"\n      loading=\"lazy\"\n      allow=\"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking\"\n      sandbox=\"allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts\"\n    ><\/iframe>\n  <\/div>\n\n\n<div class=\"wp-block-cloudinary-markdown \"><p>You can find the full codebase on my <a href=\"https:\/\/github.com\/musebe\/Image-collage\">Github<\/a>.<\/p>\n<h2>Nuxt.js Setup<\/h2>\n<p>We\u2019ll use <a href=\"https:\/\/nuxtjs.org\">Nuxt.js<\/a> for this tutorial. It\u2019s an intuitive Vue.Js framework designed for simplicity and productivity.<\/p>\n<p>To set up our project, we\u2019ll use the <a href=\"https:\/\/github.com\/nuxt\/create-nuxt-app\">create-nuxt-app<\/a> utility. Ensure you have Yarn or NPM v5.2+ or v6.1+ installed and open your terminal in your preferred working directory.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">yarn create nuxt-app nuxtjs-image-collage\n<span class=\"hljs-comment\"># OR<\/span>\nnpx create-nuxt-app nuxtjs-image-collage\n<span class=\"hljs-comment\"># OR<\/span>\nnpm init nuxt-app nuxtjs-image-collage\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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>The above will trigger a set of setup questions. Here are our recommended defaults:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1764281500\/blog-Generating_Image_Collages_Using_Nuxt.js-1.png\" alt=\"Setup questions\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"1472\" height=\"964\"\/><\/p>\n<p>You may now run the project on <a href=\"http:\/\/localhost:3000\">http:\/\/localhost:3000<\/a>:<\/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\">cd nuxtjs-image-collage\n\nyarn dev\n<span class=\"hljs-comment\"># OR<\/span>\nnpm run dev\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<h2>@nuxtjs\/cloudinary setup<\/h2>\n<p>We\u2019ll use <a href=\"https:\/\/cloudinary.com\">Cloudinary<\/a> to generate the image collage. It\u2019s a powerful media management platform with a comprehensive set of APIs and SDKs.<\/p>\n<p>Let\u2019s install the recommended Nuxt.js plugin: <a href=\"https:\/\/cloudinary.nuxtjs.org\">@nuxtjs\/cloudinary<\/a>.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">yarn<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-keyword\">@nuxtjs<\/span>\/cloudinary\n# <span class=\"hljs-keyword\">OR<\/span>\nnpm install @nuxtjs\/cloudinary\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Register the plugin to the <code>modules<\/code> section of our <code>nuxt.config.js<\/code> file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ nuxt.config.js<\/span>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n ....\n modules: &#91;\n <span class=\"hljs-string\">'@nuxtjs\/cloudinary'<\/span>\n ]\n ...\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>Once the above is done, let\u2019s configure our Cloudinary instance by adding a <code>cloudinary<\/code> section in our <code>nuxt.config.js<\/code> file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ nuxt.config.js<\/span>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n ...\n cloudinary: {\n <span class=\"hljs-attr\">cloudName<\/span>: process.env.NUXT_ENV_CLOUDINARY_CLOUD_NAME,\n <span class=\"hljs-attr\">useComponent<\/span>: <span class=\"hljs-literal\">true<\/span>,\n }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><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>The <code>NUXT_ENV_CLOUDINARY_CLOUD_NAME<\/code> variable we see above is an environmental variable. These are values we configure outside of our project code. Let\u2019s create our ENV file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">touch<\/span> <span class=\"hljs-selector-class\">.env<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>To obtain your Cloudinary cloud name, check the Account Details section on your account <a href=\"https:\/\/cloudinary.com\/users\/login\">dashboard<\/a>. If you don\u2019t have an account, you may <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">register here<\/a>.<\/p>\n<p>Add your cloud name to your ENV file:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-comment\">&lt;!-- .env --&gt;<\/span>\nNUXT_ENV_CLOUDINARY_CLOUD_NAME=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">your-cloud-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Setting Up the Collage Template<\/h2>\n<p>Before we start, we need to set up the template. Upload this <a href=\"https:\/\/res.cloudinary.com\/hackit-africa\/image\/upload\/v1646730450\/nuxtjs-image-collage\/templates\/Pink_Handdrawn_Heart_Polaroid_Photo_Collage.png\">template<\/a> to the <code>nuxtjs-image-collage\/templates<\/code> folder.<\/p>\n<h2>Selecting and Uploading Collage Images<\/h2>\n<p>We want to allow our users to select the images they want to be displayed in the collage. Let\u2019s set up an HTML form to do this.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"> <span class=\"hljs-comment\">&lt;!-- pages\/index.vue --&gt;<\/span>\n ...\n   <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span> @<span class=\"hljs-attr\">submit.prevent<\/span>=<span class=\"hljs-string\">\"upload\"<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span> <span class=\"hljs-attr\">for<\/span>=<span class=\"hljs-string\">\"file\"<\/span>&gt;<\/span> Images <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"mt-1\"<\/span>&gt;<\/span>\n              <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> @<span class=\"hljs-attr\">change<\/span>=<span class=\"hljs-string\">\"handleImagesChanged\"<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"file\"<\/span> <span class=\"hljs-attr\">accept<\/span>=<span class=\"hljs-string\">\"image\/*\"<\/span> <span class=\"hljs-attr\">required<\/span>  <span class=\"hljs-attr\">multiple<\/span> \/&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\n          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span> <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"uploading\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"text-center\"<\/span>&gt;<\/span>Please wait, upload in progress<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">v-else<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span> &gt;<\/span>\n              Upload &amp; Generate Collage\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n          <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span>\n ...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>When a file is selected, we trigger the <code>handleImagesChanged<\/code> method. We also trigger the <code>upload<\/code> method when the form is submitted.<\/p>\n<p>Let\u2019s add the JavaScript logic to support this.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  data(){\n    <span class=\"hljs-keyword\">return<\/span> {\n      <span class=\"hljs-attr\">images<\/span>:<span class=\"hljs-literal\">null<\/span>,\n      <span class=\"hljs-attr\">uploading<\/span>:<span class=\"hljs-literal\">false<\/span>,\n      <span class=\"hljs-attr\">cloudinaryImages<\/span>:&#91;],\n      ...\n    }\n  },\n  <span class=\"hljs-attr\">methods<\/span>:{\n    handleImagesChanged(e){\n     <span class=\"hljs-keyword\">this<\/span>.images = e.target.files;\n    },\n    <span class=\"hljs-attr\">readData<\/span> : <span class=\"hljs-function\">(<span class=\"hljs-params\">f<\/span>) =&gt;<\/span>\n        <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> {\n          <span class=\"hljs-keyword\">const<\/span> reader = <span class=\"hljs-keyword\">new<\/span> FileReader();\n          reader.onloadend = <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> resolve(reader.result);\n          reader.readAsDataURL(f);\n    }),\n    <span class=\"hljs-keyword\">async<\/span> upload(){\n      <span class=\"hljs-keyword\">this<\/span>.uploading = <span class=\"hljs-literal\">true<\/span>;\n      <span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-keyword\">let<\/span> image <span class=\"hljs-keyword\">of<\/span> <span class=\"hljs-keyword\">this<\/span>.images){\n        <span class=\"hljs-keyword\">const<\/span> data = <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">this<\/span>.readData(image);\n        <span class=\"hljs-keyword\">const<\/span> instance = <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-keyword\">this<\/span>.$cloudinary.upload(data, {\n          <span class=\"hljs-attr\">folder<\/span>: <span class=\"hljs-string\">\"nuxtjs-image-collage\"<\/span>,\n          <span class=\"hljs-attr\">uploadPreset<\/span>: <span class=\"hljs-string\">\"default-preset\"<\/span>,\n        });\n        <span class=\"hljs-keyword\">this<\/span>.cloudinaryImages.push(instance);\n      }\n      <span class=\"hljs-keyword\">this<\/span>.uploading = <span class=\"hljs-literal\">false<\/span>;\n    },\n    ...\n  }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>When the files are selected, we save them to state in the <code>handleImagesChanged<\/code> method. The <code>upload<\/code> method iterates through the images uploading them to the <code>uxtjs-image-collage<\/code> folder while storing the Cloudinary response instances.<\/p>\n<p>The <code>default-preset<\/code> upload preset will be used for the uploads. Upload presets are rules we configure to be applied to each of our uploads. To create one, proceed to the <a href=\"https:\/\/cloudinary.com\/users\/login?RelayState=%2Fconsole%2Flui%2Fupload_presets%2Fnew\">add upload preset page<\/a>. Here are our recommended defaults:<\/p>\n<ul>\n<li>Name: default-preset<\/li>\n<li>Mode: unsigned<\/li>\n<li>Unique filename: true<\/li>\n<li>Delivery type: upload<\/li>\n<li>Access mode: public<\/li>\n<\/ul>\n<h2>Rendering the Collage<\/h2>\n<p>Our app needs to understand which template we\u2019re using and the positions to place the images. For this, let us add the template and coordinates in our state.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  data(){\n    <span class=\"hljs-keyword\">return<\/span> {\n        ...\n        template:<span class=\"hljs-string\">'nuxtjs-image-collage\/templates\/Pink_Handdrawn_Heart_Polaroid_Photo_Collage'<\/span>,\n        <span class=\"hljs-attr\">templateCoordinates<\/span>: &#91;\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">-20<\/span>, <span class=\"hljs-attr\">label<\/span>:<span class=\"hljs-string\">'Center left'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">-654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">-20<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Center right'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">510<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Bottom center'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">-535<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Top center'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">-535<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Top right'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">-654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">510<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Bottom left'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">510<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Bottom right'<\/span>},\n            {<span class=\"hljs-attr\">x<\/span>:<span class=\"hljs-number\">-654<\/span>, <span class=\"hljs-attr\">y<\/span>:<span class=\"hljs-number\">-535<\/span>,<span class=\"hljs-attr\">description<\/span>:<span class=\"hljs-string\">'Top left'<\/span>},\n        ],\n    }\n  },\n  ...\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>We also need a method to get a random image from the <code>Cloudinary image<\/code> array and process the public_id for usage in our overlay transformation. This is by replacing all <code>\\<\/code> in the path with <code>:<\/code>. Let\u2019s add this method.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">\/\/ pages\/index.vue\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span>&gt;<\/span><span class=\"javascript\">\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {\n  ...\n  methods:{\n    ...\n    getRandomImageUrl(){\n      <span class=\"hljs-keyword\">const<\/span> randomIndex = <span class=\"hljs-built_in\">Math<\/span>.floor(<span class=\"hljs-built_in\">Math<\/span>.random() * <span class=\"hljs-keyword\">this<\/span>.cloudinaryImages.length);\n      <span class=\"hljs-keyword\">const<\/span> randomImage = <span class=\"hljs-keyword\">this<\/span>.cloudinaryImages&#91;randomIndex];\n      <span class=\"hljs-keyword\">return<\/span> randomImage.public_id.replace(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">RegExp<\/span>( <span class=\"hljs-string\">'\/'<\/span>,<span class=\"hljs-string\">'g'<\/span>), <span class=\"hljs-string\">':'<\/span>);\n    },\n  }\n}\n<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>With the above method and the above state, our app knows which images to overlay and where to overlay them in the template. Let us now add the final HTML to render the final collage.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-comment\">&lt;!-- pages\/index.vue --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n    ...\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-image<\/span>\n        <span class=\"hljs-attr\">v-if<\/span>=<span class=\"hljs-string\">\"!uploading &amp;&amp; cloudinaryImages.length\"<\/span>\n        <span class=\"hljs-attr\">:public-id<\/span>=<span class=\"hljs-string\">\"template\"<\/span>\n        <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"600\"<\/span>\n        <span class=\"hljs-attr\">height<\/span>=<span class=\"hljs-string\">\"680\"<\/span>\n    &gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cld-transformation<\/span>\n        <span class=\"hljs-attr\">v-for<\/span>=<span class=\"hljs-string\">\"(coordinate,index) in templateCoordinates\"<\/span>\n        <span class=\"hljs-attr\">:key<\/span>=<span class=\"hljs-string\">\"index\"<\/span>\n        <span class=\"hljs-attr\">:overlay<\/span>=<span class=\"hljs-string\">\"getRandomImageUrl()\"<\/span>\n        <span class=\"hljs-attr\">width<\/span>=<span class=\"hljs-string\">\"574\"<\/span>\n        <span class=\"hljs-attr\">:y<\/span>=<span class=\"hljs-string\">\"coordinate.y\"<\/span>\n        <span class=\"hljs-attr\">:x<\/span>=<span class=\"hljs-string\">\"coordinate.x\"<\/span>\n        \/&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">cld-image<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Thus with the above code, the collage will only be displayed when uploading is complete and there are contents in the <code>cloudinaryImages<\/code> array. We display the template and in it overlay images at the coordinate locations.<\/p>\n<p>On uploading images, a collage similar to this should be generated.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-marketing-res.cloudinary.com\/image\/upload\/c_limit,w_2000\/f_auto\/q_auto\/v1764281503\/blog-Generating_Image_Collages_Using_Nuxt.js-2.png\" alt=\"Sample collage\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"2000\" height=\"1633\"\/><\/p>\n<h2>Conclusion<\/h2>\n<p>To learn more about how to apply Cloudinary transformations, feel free to refer to the <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations\">image transformations documentation<\/a> or <a href=\"https:\/\/cloudinary.com\/contact\">contact us<\/a>.<\/p>\n<p>To implement the above at scale, you may also look to set the image overlay coordinates in the <a href=\"https:\/\/cloudinary.com\/documentation\/cloudinary_glossary#contextual_metadata\">contextual metadata<\/a> of the template and have multiple templates.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":31409,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[381,370,372],"class_list":["post-28461","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-imagecdn","tag-image","tag-nuxtjs"],"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>Generating Image Collages Using Nuxt.js<\/title>\n<meta name=\"description\" content=\"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.\" \/>\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\/generating-image-collages-in-a-nuxtjs-app\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Generating Image Collages Using Nuxt.js\" \/>\n<meta property=\"og:description\" content=\"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-11T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T22:16:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\/generating-image-collages-in-a-nuxtjs-app#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Generating Image Collages Using Nuxt.js\",\"datePublished\":\"2023-10-11T14:00:00+00:00\",\"dateModified\":\"2025-11-27T22:16:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\"},\"wordCount\":6,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA\",\"keywords\":[\"(Image)CDN\",\"Image\",\"NuxtJS\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2023\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\",\"url\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\",\"name\":\"Generating Image Collages Using Nuxt.js\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA\",\"datePublished\":\"2023-10-11T14:00:00+00:00\",\"dateModified\":\"2025-11-27T22:16:03+00:00\",\"description\":\"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Generating Image Collages Using Nuxt.js\"}]},{\"@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":"Generating Image Collages Using Nuxt.js","description":"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.","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\/generating-image-collages-in-a-nuxtjs-app","og_locale":"en_US","og_type":"article","og_title":"Generating Image Collages Using Nuxt.js","og_description":"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.","og_url":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app","og_site_name":"Cloudinary Blog","article_published_time":"2023-10-11T14:00:00+00:00","article_modified_time":"2025-11-27T22:16:03+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app"},"author":{"name":"","@id":""},"headline":"Generating Image Collages Using Nuxt.js","datePublished":"2023-10-11T14:00:00+00:00","dateModified":"2025-11-27T22:16:03+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app"},"wordCount":6,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","keywords":["(Image)CDN","Image","NuxtJS"],"inLanguage":"en-US","copyrightYear":"2023","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app","url":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app","name":"Generating Image Collages Using Nuxt.js","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","datePublished":"2023-10-11T14:00:00+00:00","dateModified":"2025-11-27T22:16:03+00:00","description":"A collage is a combination of multiple pictures combined into a single image. They are useful in various applications from presenting memories to summarising events. Instead of exploring multiple applications to generate collages, let us explore how we can build a simple NuxtJS app to generate them.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/generating-image-collages-in-a-nuxtjs-app#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Generating Image Collages Using Nuxt.js"}]},{"@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\/v1697058127\/Blog-image_collages_Nuxtjs\/Blog-image_collages_Nuxtjs.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28461","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=28461"}],"version-history":[{"count":12,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28461\/revisions"}],"predecessor-version":[{"id":39503,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/28461\/revisions\/39503"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/31409"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=28461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=28461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=28461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}