<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sharon Yelenik</title>
    <description>The latest articles on DEV Community by Sharon Yelenik (@sharony).</description>
    <link>https://dev.to/sharony</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1400949%2F799026ed-9995-459f-a3de-326244e9950b.jpeg</url>
      <title>DEV Community: Sharon Yelenik</title>
      <link>https://dev.to/sharony</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharony"/>
    <language>en</language>
    <item>
      <title>Managing Media Files in Flask (Images, Videos, and Audio)</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Mon, 23 Mar 2026 19:07:00 +0000</pubDate>
      <link>https://dev.to/cloudinary/managing-media-files-in-flask-images-videos-and-audio-kdk</link>
      <guid>https://dev.to/cloudinary/managing-media-files-in-flask-images-videos-and-audio-kdk</guid>
      <description>&lt;p&gt;You’re building an app for a small business or website, maybe a portfolio site or boutique store, and you know high-quality visuals are key for attracting buyers and showcasing your work. But without a designer on the team, you’re responsible for handling all the images and videos yourself.&lt;/p&gt;

&lt;p&gt;So how do you manage a moderate amount of media files in the simplest and most efficient way?&lt;/p&gt;

&lt;p&gt;In this blog post, we’ll unveil transformative techniques for managing media files in Flask with Cloudinary to make your life easier as a developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Streamlined Media Management
&lt;/h2&gt;

&lt;p&gt;Before we get into the practical steps, here some of the advantages of establishing a solid media management approach in your Flask application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less custom code and reduced storage complexity.&lt;/strong&gt; Offloading large media files from your database or filesystem keeps your application simpler and avoids managing bulky binary data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable uploads that scale.&lt;/strong&gt; A predictable upload flow prevents issues with file size limits, timeouts, or custom route handling, especially when users submit large images or videos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent, high-quality digital media.&lt;/strong&gt; Automated tasks like resizing, compression, tagging, and background removal help keep your images and videos optimized without manual editing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimized, searchable delivery.&lt;/strong&gt; Well-structured metadata and scalable search make assets easier to find, while delivering the right size and format improves performance across devices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By &lt;a href="https://link.cloudinary.com/umWsT" rel="noopener noreferrer"&gt;storing your digital media in Cloudinary&lt;/a&gt; instead of on your server or in your database, you can take advantage of these benefits immediately, while keeping your Flask codebase lightweight and focused on application logic.&lt;/p&gt;

&lt;p&gt;Managing media files in Flask becomes much simpler with the steps we cover next (tap the icons to navigate to the related section):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcloudinary-res.cloudinary.com%2Fimage%2Fupload%2Fv1698223367%2Fblog%2Fdjango_media_management.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcloudinary-res.cloudinary.com%2Fimage%2Fupload%2Fv1698223367%2Fblog%2Fdjango_media_management.png" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup and Configuration
&lt;/h2&gt;

&lt;p&gt;Before we dive into the specifics of media management with Python and Flask, you'll need to sign up for Cloudinary. It's quick and straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing and Configuring Cloudinary in Your Python/Flask App
&lt;/h3&gt;

&lt;p&gt;To get started with Cloudinary in your Python/Flask app, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install the Cloudinary Python library using &lt;code&gt;pip install cloudinary&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure Cloudinary in your Flask application, typically inside app.py or a separate &lt;code&gt;config.py&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config.py or app.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudinary.uploader&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudinary.api&lt;/span&gt;

&lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;cloud_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_cloud_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_secret&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Replace &lt;code&gt;your_cloud_name&lt;/code&gt;, &lt;code&gt;your_api_key&lt;/code&gt;, and &lt;code&gt;your_api_secret&lt;/code&gt; with your actual Cloudinary credentials, which you can find on the &lt;a href="https://console.cloudinary.com/app/settings/api-keys" rel="noopener noreferrer"&gt;API keys&lt;/a&gt; page of the Console Settings.&lt;/p&gt;

&lt;ol start="3"&gt;&lt;li&gt;If you're using a &lt;code&gt;config.py&lt;/code&gt;, you'd load it in your Flask app like this:&lt;/li&gt;&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;  &lt;span class="c1"&gt;# or your preferred config structure
&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With these steps, you've successfully integrated Cloudinary into your Flask project, and you're ready to leverage its powerful media management capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhanced Media Processing With Upload Presets
&lt;/h2&gt;

&lt;p&gt;Upload presets in Cloudinary help you automate your media workflow by applying transformations, metadata rules, and upload behaviors the moment a file arrives. This means less processing in your Flask routes and far more consistent results across all your media.&lt;/p&gt;

&lt;p&gt;In this article, we’ll focus on two powerful capabilities you can unlock through presets: &lt;strong&gt;automated transformations&lt;/strong&gt; and &lt;strong&gt;auto-tagging&lt;/strong&gt;. You can explore many other preset options in Cloudinary’s &lt;a href="https://link.cloudinary.com/umWsU" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, but these two alone can dramatically simplify your media pipeline. &lt;/p&gt;

&lt;h2&gt;
  
  
  Automating Transformation Settings
&lt;/h2&gt;

&lt;p&gt;Upload presets allow you to automatically apply transformations such as resizing, cropping, recoloring, background removal, and more, without writing additional code in Flask. For example, you can create presets that remove backgrounds from uploaded logos, ensure all portfolio images are a consistent size, or sharpen older or lower-quality photos. &lt;/p&gt;

&lt;p&gt;Each preset applies its rules automatically when the file is uploaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; By applying the &lt;a href="https://link.cloudinary.com/umWsW" rel="noopener noreferrer"&gt;g_auto&lt;/a&gt; AI-powered transformation, you can ensure that crops preserve the important parts of your images and keep the main subject of your videos in focus.&lt;/p&gt;

&lt;p&gt;By defining these settings once, every uploaded media file stays consistent and optimized with no manual editing or external image processing tools required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Fw_500%2Ch_303%2Cc_scale%2Ff_auto%2Cq_auto%2Fv1698140107%2FWeb_Assets%2Fblog%2Frecolor%2Frecolor.gif%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Fw_500%2Ch_303%2Cc_scale%2Ff_auto%2Cq_auto%2Fv1698140107%2FWeb_Assets%2Fblog%2Frecolor%2Frecolor.gif%3F_i%3DAA" width="500" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leveraging Auto-TaggingCopy link to this heading&lt;br&gt;
If you enable auto-tagging through Cloudinary’s categorization engines, images are automatically analyzed and tagged based on their content. These tags can support a variety of downstream tasks, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organizing assets&lt;/li&gt;
&lt;li&gt;improving searchability&lt;/li&gt;
&lt;li&gt;enabling content discovery&lt;/li&gt;
&lt;li&gt;powering filters in your UI or internal tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, an image of a woman on a city street using a smartphone and carrying a bag might receive tags such as “woman,” “bag,” “mobile phone,” “purse,” or “car,” depending on the AI model you use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: Important: To use auto-tagging, you’ll need to subscribe to one of Cloudinary’s &lt;a href="https://cloudinary.com/documentation/cloudinary_add_ons#auto_tagging" rel="noopener noreferrer"&gt;auto-tagging add-ons&lt;/a&gt;. The examples in this blog use the &lt;a href="https://link.cloudinary.com/umWsX" rel="noopener noreferrer"&gt;Rekognition Auto Tagging&lt;/a&gt; add-on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1764259730%2FWeb_Assets%2Fblog%2Fwoman-business-suit%2Fwoman-business-suit.jpg%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1764259730%2FWeb_Assets%2Fblog%2Fwoman-business-suit%2Fwoman-business-suit.jpg%3F_i%3DAA" width="760" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Red-haired woman in stylish outfit chatting on phone&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Check out the &lt;a href="https://link.cloudinary.com/umWsY" rel="noopener noreferrer"&gt;Computer Vision Image Analysis for Your E-commerce Website&lt;/a&gt; demo to see Cloudinary in action, returning information about the content it identifies in your images.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating an Upload Preset
&lt;/h2&gt;

&lt;p&gt;You can create an upload preset using the Cloudinary Admin API right from your Flask application or a setup script. Here’s an example using the Python SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define the upload preset details
&lt;/span&gt;&lt;span class="n"&gt;upload_preset_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_preset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;upload_preset_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unsigned&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;folder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_folder&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;crop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;effect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vignette&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;categorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aws_rek_tagging&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto_tagging&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Create the upload preset using the SDK
&lt;/span&gt;&lt;span class="n"&gt;upload_preset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_upload_preset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;upload_preset_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;upload_preset_options&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Check if the upload preset was created successfully
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;upload_preset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;upload_preset_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Upload preset created successfully.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to create upload preset.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once created, simply reference the preset name during upload, and all rules will apply automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uploading Media With Python and Flask
&lt;/h2&gt;

&lt;p&gt;Uploading files is central to your Flask workflow, and Cloudinary provides two flexible methods: the Upload Widget for client-side uploads and server-side uploads from your Flask routes.&lt;/p&gt;

&lt;p&gt;Let’s explore both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upload Widget
&lt;/h3&gt;

&lt;p&gt;If your app accepts user-generated content (UGC), such as portfolio images from creators or product photos submitted by small business owners, the Cloudinary Upload Widget provides a smooth, reliable upload experience directly from the browser. You can attach any upload presets you’ve created so transformations, optimization, tagging, and other processing happen automatically on upload, without additional Flask code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can also create a preset that automatically &lt;a href="https://cloudinary.com/documentation/user_generated_content#moderate" rel="noopener noreferrer"&gt;moderates&lt;/a&gt; user-uploaded images and videos to help ensure that the content appearing on your site is appropriate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1764260271%2FWeb_Assets%2Fblog%2Fupload_widget_accessible-1_3948189bcb%2Fupload_widget_accessible-1_3948189bcb.png%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1764260271%2FWeb_Assets%2Fblog%2Fupload_widget_accessible-1_3948189bcb%2Fupload_widget_accessible-1_3948189bcb.png%3F_i%3DAA" width="1580" height="1220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Use Case
&lt;/h2&gt;

&lt;p&gt;A portfolio gallery or a simple shop catalog where users can upload photos or videos is an ideal scenario for the Upload Widget. It handles the entire client-side upload flow, while your presets manage all media processing in the background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_scale%2Cw_500%2Fl_moon_layer%2Fc_scale%2Cw_150%2Ffl_layer_apply%2Cg_north_east%2Fl_text%3Aroboto_20_bold%3AMoonlight%2Ffl_layer_apply%2Cg_north_east%2Cx_30%2Cy_65%2Fcity_night_time.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_scale%2Cw_500%2Fl_moon_layer%2Fc_scale%2Cw_150%2Ffl_layer_apply%2Cg_north_east%2Fl_text%3Aroboto_20_bold%3AMoonlight%2Ffl_layer_apply%2Cg_north_east%2Cx_30%2Cy_65%2Fcity_night_time.jpg" width="500" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo-res.cloudinary.com%2Fw_500%2Fl_docs%3Awedding.jpg%2Cc_pad%2Cw_250%2Ch_250%2Fl_radialize%2Ffl_layer_apply%2Ce_displace%2Cy_-8%2Ffl_layer_apply%2Cx_10%2Cb_transparent%2Fleft_mug" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdemo-res.cloudinary.com%2Fw_500%2Fl_docs%3Awedding.jpg%2Cc_pad%2Cw_250%2Ch_250%2Fl_radialize%2Ffl_layer_apply%2Ce_displace%2Cy_-8%2Ffl_layer_apply%2Cx_10%2Cb_transparent%2Fleft_mug" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fv1489074100%2Fgirl_camera.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fv1489074100%2Fgirl_camera.jpg" width="800" height="1195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Implement the Upload Widget in Flask
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a route that renders the template:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;render_template&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/upload-media&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload_media&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;render_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;upload_media.html&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol start="2"&gt;&lt;li&gt; Create the template (templates/upload_media.html):
&lt;/li&gt;&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Media&lt;/span&gt; &lt;span class="n"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;upload_widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cloudinary-button&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload-widget.cloudinary.com/global/all.js&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text/javascript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  

    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text/javascript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  
        &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;myWidget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createUploadWidget&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="n"&gt;cloudName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my_cloud_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;uploadPreset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my_preset&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="n"&gt;imageUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secure_url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Done! Here is the file info: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Send&lt;/span&gt; &lt;span class="n"&gt;imageUrl&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt;
                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/save-media&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;imageUrl&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;upload_widget&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;click&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;myWidget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol start="3"&gt;&lt;li&gt; Add the URL rule (if not using decorators):
&lt;/li&gt;&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app.py
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_url_rule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/upload-media&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view_func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;upload_media&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol start="4"&gt;&lt;li&gt; Test it by visiting:
&lt;/li&gt;&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;upload&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a complete client-side upload flow, with Cloudinary handling media processing automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-Side Upload
&lt;/h2&gt;

&lt;p&gt;Server-side uploads are perfect when you need automation or want to process files uploaded through a traditional &lt;/p&gt;.
&lt;h3&gt;
  
  
  Example Use Case
&lt;/h3&gt;

&lt;p&gt;News aggregators, podcast platforms, or content curation apps often automate large-scale ingestion:&lt;/p&gt;
&lt;h1&gt;
  
  
  analyze images
&lt;/h1&gt;
&lt;h1&gt;
  
  
  apply tags
&lt;/h1&gt;
&lt;h1&gt;
  
  
  create captions
&lt;/h1&gt;
&lt;h1&gt;
  
  
  run moderation
&lt;/h1&gt;
&lt;h1&gt;
  
  
  convert formats
&lt;/h1&gt;

&lt;p&gt;Cloudinary can handle these tasks server-side with very little code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Uploading From Flask
&lt;/h3&gt;


&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudinary.uploader&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/upload&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;file_to_upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;file_to_upload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;upload_preset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_upload_preset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;secure_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;And that’s it. Your media is uploaded, transformed, stored, and ready to deliver.&lt;/p&gt;
&lt;h2&gt;
  
  
  Searching Made Simple
&lt;/h2&gt;

&lt;p&gt;Once your assets are stored in Cloudinary, especially with auto-tagging enabled, searching becomes incredibly fast.&lt;/p&gt;

&lt;p&gt;Instead of digging through folders or writing custom queries, you can retrieve matching media with a single expression:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_media_by_tags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cloudinary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Example queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tags:portrait&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags:handmade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resource_type:video&lt;/code&gt; AND &lt;code&gt;tags:nature&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use search to build quick admin dashboards, galleries, filters, or automated content workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivering Your Media
&lt;/h2&gt;

&lt;p&gt;With Cloudinary managing your media, delivery becomes as powerful as upload. You can apply on-the-fly transformations directly in the image or video URL with no processing required in Flask.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Dynamic Image Sizing in a Flask Template
&lt;/h3&gt;



&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; 
  &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{ cloudinary_url(public_id, width=width, height=height, crop=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fill&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;) }}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
  &lt;span class="n"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Or, using the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cloudinary.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cloudinary_url&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cloudinary_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;public_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;crop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  Why It’s Powerful
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You don’t store multiple versions of each image&lt;/li&gt;
&lt;li&gt;Users automatically receive optimized formats (WebP, AVIF, MP4, etc.)&lt;/li&gt;
&lt;li&gt;Dynamic resizing keeps your site lightweight and fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For responsive layouts, check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloudinary.com/documentation/responsive_html" rel="noopener noreferrer"&gt;Responsive images using HTML and dynamic image transformations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudinary.com/documentation/video_overview" rel="noopener noreferrer"&gt;Managing and delivering videos at scale.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149581%2FWeb_Assets%2Fblog%2Fguitar-man-1%2Fguitar-man-1.jpeg%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149581%2FWeb_Assets%2Fblog%2Fguitar-man-1%2Fguitar-man-1.jpeg%3F_i%3DAA" width="1600" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149585%2FWeb_Assets%2Fblog%2Fguitar-man2-1%2Fguitar-man2-1.jpeg%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149585%2FWeb_Assets%2Fblog%2Fguitar-man2-1%2Fguitar-man2-1.jpeg%3F_i%3DAA" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149587%2FWeb_Assets%2Fblog%2Fguitar-man3-1%2Fguitar-man3-1.jpeg%3F_i%3DAA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fcloudinary-marketing%2Fimages%2Ff_auto%2Cq_auto%2Fv1698149587%2FWeb_Assets%2Fblog%2Fguitar-man3-1%2Fguitar-man3-1.jpeg%3F_i%3DAA" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Secret to Media File Management
&lt;/h2&gt;

&lt;p&gt;In short, the features we’ve covered include upload presets, smart uploads, AI-powered search, and dynamic delivery. Apply these features to take managing media files in Flask from “painful but necessary” to “effortless and scalable.”&lt;/p&gt;

&lt;p&gt;Instead of writing boilerplate logic for uploads, storage, and optimization, you can focus on building features your users care about.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cloudinary ❤️ developers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready to level up your media workflow? Start using Cloudinary for free and build better visual experiences today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 &lt;strong&gt;&lt;a href="https://link.cloudinary.com/umWs0" rel="noopener noreferrer"&gt;Create your free account&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>backend</category>
      <category>python</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Create a Digital Portfolio That Visually Pops</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Mon, 23 Mar 2026 18:13:17 +0000</pubDate>
      <link>https://dev.to/cloudinary/how-to-create-a-digital-portfolio-that-visually-pops-8li</link>
      <guid>https://dev.to/cloudinary/how-to-create-a-digital-portfolio-that-visually-pops-8li</guid>
      <description>&lt;p&gt;Job searching can be tough, and so is standing out among the competition.&lt;/p&gt;

&lt;p&gt;When putting together job applications, there’s always that question: How should I describe myself? Will potential employers care more about past experience or a list of skills? A digital portfolio answers that question in a way a résumé alone can’t. It shows what you’re actually capable of.&lt;/p&gt;

&lt;p&gt;That’s why I put together this digital portfolio demo project.&lt;/p&gt;

&lt;p&gt;Instead of talking about performance, polish, and visual quality in theory, I wanted to demonstrate what that looks like in practice. This portfolio is built the way I’d recommend anyone build one today: fast, visually sharp, and optimized from the start.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll walk you through how I build a frontend portfolio project using Cloudinary to handle all the image and video magic. No endless hours in Photoshop. No massive file sizes. And, no manual resizing for every device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live Demo (Optional, but Highly Recommended)
&lt;/h2&gt;

&lt;p&gt;Before diving into the code, you can check out the live portfolio demo here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/github/cloudinary-devs/digital_portfolio?file=README.md" rel="noopener noreferrer"&gt;View the live demo on StackBlitz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to explore it, then come back and see how everything works under the hood.&lt;/p&gt;


  
  Your browser does not support the video tag.


&lt;h2&gt;
  
  
  Keys to Making Your Digital Portfolio Stand Out
&lt;/h2&gt;

&lt;p&gt;Building a great-looking digital portfolio is a no-brainer. However, the real question is: How do you make yours stand out? One of the biggest differentiators is focusing on performance and visual polish. When your portfolio feels fast, smooth, and thoughtfully built, it immediately comes across as more professional. &lt;/p&gt;

&lt;p&gt;And when you build it efficiently, you’re also signaling to future employers that you know how to work efficiently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deliver images that load fast but look crisp.&lt;/li&gt;
&lt;li&gt;Make videos that play smoothly without eating bandwidth.&lt;/li&gt;
&lt;li&gt;Create responsive layouts that look perfect on every device.&lt;/li&gt;
&lt;li&gt;Apply visual effects that make content pop.&lt;/li&gt;
&lt;li&gt;Optimize everything without sacrificing quality.&lt;/li&gt;
&lt;li&gt;So really, building a great portfolio is just practice for the real * thing. And that’s pretty cool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Tech Stack I ChoseCopy link to this heading
&lt;/h2&gt;

&lt;p&gt;For my portfolio, I went with tools that are popular in the industry and honestly just fun to work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 19 with TypeScript for type safety and component architecture.&lt;/li&gt;
&lt;li&gt;Vite for lightning-fast development and optimized builds.&lt;/li&gt;
&lt;li&gt;CSS for beautiful, responsive styling.&lt;/li&gt;
&lt;li&gt;Cloudinary for all image and video transformations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/cloudinary-devs/digital_portfolio" rel="noopener noreferrer"&gt;clone my code&lt;/a&gt; and adapt it to whatever you’re used to working with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;I’m sharing my portfolio with you as a starting point. Once you get a feel for how it works, you can customize the design to match your style and add sections that show off what matters to you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the starter portfolio repo&lt;/span&gt;
git clone https://github.com/your-username/digital-portfolio.git

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;digital-portfolio
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start the development server&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m excited to see how you make it your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Cloudinary Helps Meet Stand-Out Goals
&lt;/h2&gt;

&lt;p&gt;A portfolio that stands out needs to be fast, visually sharp, and responsive across devices.&lt;/p&gt;

&lt;p&gt;Without automation, that usually means resizing images manually, generating multiple breakpoints, compressing files carefully, and managing large video assets.&lt;/p&gt;

&lt;p&gt;Cloudinary handles image and video delivery, optimization, and transformations through simple URL parameters. In this project, cropping, resizing, blur effects, format conversion, and quality optimization are all applied directly in the media URLs.&lt;/p&gt;

&lt;p&gt;Transformations run on the fly, and the right size and format are delivered automatically for each device and browser.&lt;/p&gt;

&lt;p&gt;Instead of maintaining multiple asset versions or editing files manually, I define the transformation once and move on, without sacrificing quality or performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swap the Demo Media for Your Own
&lt;/h2&gt;

&lt;p&gt;This project uses Cloudinary’s demo account (&lt;code&gt;res.cloudinary.com/demo&lt;/code&gt;) with sample images and videos, so it works out of the box. When you’re ready, switch to your own Cloudinary account to display your own images and videos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Cloudinary Account
&lt;/h3&gt;

&lt;p&gt;Sign up for a &lt;a href="https://link.cloudinary.com/umWb1" rel="noopener noreferrer"&gt;free Cloudinary account&lt;/a&gt; (the free tier is more than enough for a portfolio).&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Find Your Cloud Name
&lt;/h3&gt;

&lt;p&gt;After logging in, copy your cloud name from the dashboard. You’ll use it in URLs like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://res.cloudinary.com/&amp;lt;your_cloud_name&amp;gt;/image/upload/&amp;lt;public_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Update One Line in the Code
&lt;/h3&gt;

&lt;p&gt;In your project, change this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Set this to your cloud name when you're ready to use your own media&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CLOUDINARY_CLOUD_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;demo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…to your cloud name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CLOUDINARY_CLOUD_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;your_cloud_name&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. Since CLOUDINARY_BASE is built from CLOUDINARY_CLOUD_NAME, all image/video URLs that use CLOUDINARY_BASE will automatically point to your account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Upload Your Own Media and Swap the Public IDs
&lt;/h3&gt;

&lt;p&gt;In your code, you reference assets using public IDs — for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;docs/profile-pic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means Cloudinary is looking for an asset with the public ID &lt;code&gt;docs/catwalk&lt;/code&gt; in your cloud.&lt;/p&gt;

&lt;p&gt;After you upload your own images/videos to Cloudinary, replace those image values with your own public IDs, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;portfolio/catwalk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You don’t need to change the transformations. Everything in the URL after &lt;code&gt;/upload/&lt;/code&gt; (like &lt;code&gt;c_fill,g_auto,h_400,w_600/f_auto/q_auto&lt;/code&gt;) can stay the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cool Cloudinary Features I Used
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Smart Cropping With Face Detection
&lt;/h3&gt;

&lt;p&gt;For the testimonials section, I needed consistent circular profile images that focused tightly on each person’s face.&lt;/p&gt;

&lt;p&gt;Here’s the original image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/&lt;/a&gt;&lt;br&gt;
docs/profile-pic.jpg&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here’s the transformed version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_thumb%2Cg_face%2Ch_300%2Cw_300%2Fr_max%2Fe_sharpen%3A80%2Ff_auto%2Fq_auto%2Fdocs%2Fprofile-pic.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_thumb%2Cg_face%2Ch_300%2Cw_300%2Fr_max%2Fe_sharpen%3A80%2Ff_auto%2Fq_auto%2Fdocs%2Fprofile-pic.jpg" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_thumb,g_face,h_300,w_300/r_max/e_sharpen:80/f_auto/q_auto/docs/profile-pic.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_thumb,g_face,h_300,w_300/r_max/e_sharpen:80/f_auto/q_auto/docs/profile-pic.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;c_thumb,g_face&lt;/code&gt; automatically detects the face and crops around it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;h_300,w_300&lt;/code&gt; enforces a fixed square size.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r_max&lt;/code&gt; makes the image circular.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_sharpen:80&lt;/code&gt; restores clarity after resizing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;f_auto,q_auto&lt;/code&gt; handle format and compression.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result isn’t just a circle. It’s a consistent 300×300 headshot, centered correctly every time — regardless of how the original photo was framed.&lt;/p&gt;

&lt;p&gt;That means no manual cropping, guessing focal points, or layout inconsistencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hero Background Blur
&lt;/h3&gt;

&lt;p&gt;For the hero section, I wanted a full-width background image that wouldn’t compete with the foreground content.&lt;/p&gt;

&lt;p&gt;Original image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fvieste_italy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fvieste_italy.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/vieste_italy.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/vieste_italy.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Transformed version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_1080%2Cw_1920%2Fe_blur%3A800%2Ff_auto%2Fq_auto%2Fvieste_italy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_1080%2Cw_1920%2Fe_blur%3A800%2Ff_auto%2Fq_auto%2Fvieste_italy.jpg" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_1080,w_1920/e_blur:800/f_auto/q_auto/vieste_italy.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_1080,w_1920/e_blur:800/f_auto/q_auto/vieste_italy.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;c_fill,g_auto&lt;/code&gt; crops intelligently to 1920×1080.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_blur:800&lt;/code&gt; applies a strong blur effect.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;f_auto,q_auto&lt;/code&gt; optimize delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original image is detailed and high contrast — great for photography, not ideal for text overlays.&lt;/p&gt;

&lt;p&gt;By blurring it at delivery time, I keep the color and atmosphere while removing visual noise. The background supports the content instead of competing with it. No separate “blurred copy” of the file is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI-Enhanced Portrait
&lt;/h3&gt;

&lt;p&gt;For the hero portrait, I wanted a clean, high-quality look — even if the source image wasn’t studio-perfect.&lt;/p&gt;

&lt;p&gt;Original:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic1.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/docs/profile-pic1.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/docs/profile-pic1.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Transformed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_face%2Ch_300%2Cw_300%2Fr_max%2Cbo_2px_solid_green%2Fe_enhance%2Ff_auto%2Fq_auto%3Abest%2Fdocs%2Fprofile-pic1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_face%2Ch_300%2Cw_300%2Fr_max%2Cbo_2px_solid_green%2Fe_enhance%2Ff_auto%2Fq_auto%3Abest%2Fdocs%2Fprofile-pic1.jpg" width="304" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_fill,g_face,h_300,w_300/r_max,bo_2px_solid_green/e_enhance/f_auto/q_auto:best/docs/profile-pic1.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_fill,g_face,h_300,w_300/r_max,bo_2px_solid_green/e_enhance/f_auto/q_auto:best/docs/profile-pic1.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;g_face&lt;/code&gt; centers the subject.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r_max&lt;/code&gt; applies a circular crop.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bo_2px_solid_green&lt;/code&gt; adds a clean, circular border.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_enhance&lt;/code&gt; enhances lighting and contrast using AI.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;q_auto:best&lt;/code&gt; balances compression with quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The enhancement isn’t dramatic — it’s subtle. Skin tones are more balanced, contrast is cleaner, and the framing is consistent.&lt;/p&gt;

&lt;p&gt;It looks like a designed component, not just an uploaded image.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Responsive Project Images
&lt;/h3&gt;

&lt;p&gt;In my project grid, the source images came from different industries — fashion, e-commerce, outdoor photography — all with different aspect ratios.&lt;/p&gt;

&lt;p&gt;Here’s one of the original images:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fwoman_mountain_ledge.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fwoman_mountain_ledge.jpg" width="800" height="1058"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/woman_mountain_ledge.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/woman_mountain_ledge.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here’s the version used in the grid:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_400%2Cw_600%2Fr_20%2Fe_saturation%3A20%2Ff_auto%2Fq_auto%2Fwoman_mountain_ledge.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_400%2Cw_600%2Fr_20%2Fe_saturation%3A20%2Ff_auto%2Fq_auto%2Fwoman_mountain_ledge.jpg" width="600" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_400,w_600/r_20/e_saturation:20/f_auto/q_auto/woman_mountain_ledge.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_400,w_600/r_20/e_saturation:20/f_auto/q_auto/woman_mountain_ledge.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;c_fill,h_400,w_600&lt;/code&gt; forces a consistent 600×400 frame.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;g_auto&lt;/code&gt; intelligently selects the focal area.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r_20&lt;/code&gt; adds rounded corners.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_saturation:20&lt;/code&gt; slightly boosts color.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;f_auto,q_auto&lt;/code&gt; optimize delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original image has its own natural proportions.&lt;/p&gt;

&lt;p&gt;The transformed version guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every card in the grid is exactly the same size.&lt;/li&gt;
&lt;li&gt;No distortion.&lt;/li&gt;
&lt;li&gt;No manual cropping.&lt;/li&gt;
&lt;li&gt;No awkward whitespace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though the source images vary wildly, the layout stays predictable and clean. That’s what makes the grid feel cohesive.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Video Transformations That Actually Work
&lt;/h3&gt;

&lt;p&gt;Video is usually where portfolios fall apart. Files are large, aspect ratios are inconsistent, and playback isn’t optimized.&lt;/p&gt;

&lt;p&gt;Here’s the original full video:&lt;/p&gt;


  
  Your browser does not support the video tag.


&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/video/upload/v1731855790/guy_woman_mobile.mp4" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/video/upload/v1731855790/guy_woman_mobile.mp4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here’s the version used in the portfolio:&lt;/p&gt;


  
  Your browser does not support the video tag.


&lt;p&gt;&lt;em&gt;&lt;a href="https://cloudinary-res.cloudinary.com/video/upload/so_133,eo_147/c_pad,h_400,w_600/b_rgb:d4a520/f_auto/q_auto/guy_woman_mobile.mp4" rel="noopener noreferrer"&gt;https://cloudinary-res.cloudinary.com/video/upload/so_133,eo_147/c_pad,h_400,w_600/b_rgb:d4a520/f_auto/q_auto/guy_woman_mobile.mp4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;so_133,eo_147&lt;/code&gt; trims the clip to a specific 14-second segment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;c_pad,h_400,w_600&lt;/code&gt; fits it into a 600×400 frame without cutting off content.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b_rgb:d4a520&lt;/code&gt; fills extra space with a consistent background color.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;f_auto,q_auto&lt;/code&gt; optimize format and compression.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of uploading a separately edited clip, I trim and resize at delivery time.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The video is shorter and lighter.&lt;/li&gt;
&lt;li&gt;The layout dimensions are guaranteed.&lt;/li&gt;
&lt;li&gt;There are no black bars.&lt;/li&gt;
&lt;li&gt;The browser gets the best possible format automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It behaves like a designed component — not a raw media file dropped onto a page.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Small Details That Make a Difference
&lt;/h3&gt;

&lt;p&gt;Once layout and performance were handled, I added subtle refinements.&lt;/p&gt;

&lt;p&gt;Here’s the original image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fdocs%2Fprofile-pic1.jpg" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/docs/profile-pic1.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/docs/profile-pic1.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here’s the polished version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_800%2Cw_700%2Fe_vignette%3A30%2Fe_sharpen%3A100%2Fr_20%2Fbo_1px_solid_rgb%3Ae0e0e0%2Ff_auto%2Fq_auto%2Fdocs%2Fprofile-pic1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Fc_fill%2Cg_auto%2Ch_800%2Cw_700%2Fe_vignette%3A30%2Fe_sharpen%3A100%2Fr_20%2Fbo_1px_solid_rgb%3Ae0e0e0%2Ff_auto%2Fq_auto%2Fdocs%2Fprofile-pic1.jpg" width="702" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_800,w_700/e_vignette:30/e_sharpen:100/r_20/bo_1px_solid_rgb:e0e0e0/f_auto/q_auto/docs/profile-pic1.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_fill,g_auto,h_800,w_700/e_vignette:30/e_sharpen:100/r_20/bo_1px_solid_rgb:e0e0e0/f_auto/q_auto/docs/profile-pic1.jpg&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What the Transformation Does
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;c_fill,g_auto&lt;/code&gt; enforces consistent framing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_vignette:30&lt;/code&gt; darkens the edges slightly.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;e_sharpen:100&lt;/code&gt; restores clarity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r_20&lt;/code&gt; rounds the corners.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bo_1px_solid_rgb:e0e0e0&lt;/code&gt; adds a subtle border.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;f_auto,q_auto&lt;/code&gt; optimize delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these effects are dramatic, but together they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve edge definition.&lt;/li&gt;
&lt;li&gt;Add separation from the background.&lt;/li&gt;
&lt;li&gt;Standardize presentation across sections.&lt;/li&gt;
&lt;li&gt;These are small adjustments, but they’re the difference between “image placed on a page” and “designed component.”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What This Means for Performance
&lt;/h4&gt;

&lt;p&gt;You might be thinking, “All these effects must slow things down, right?” Actually, the opposite! &lt;/p&gt;

&lt;p&gt;With Cloudinary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;70-80% smaller file sizes&lt;/strong&gt; compared to unoptimized images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-5x faster loading&lt;/strong&gt; thanks to automatic optimization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero manual editing time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic device optimization&lt;/strong&gt; — phone users get mobile-sized images, desktop users get high-res.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone views your portfolio on their phone, they automatically get perfectly-sized images. On a 4K monitor, they get crisp, detailed versions. It just works.&lt;/p&gt;

&lt;p&gt;Notice how much this image was optimized and what that means for your website stats and loading time! Reduced from a 21.30 MB JPG to a 18.26 KB AVIF.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcloudinary-res.cloudinary.com%2Fimage%2Fupload%2Fv1771198908%2Fblog%2Fdigital_portfolio_mi_img.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcloudinary-res.cloudinary.com%2Fimage%2Fupload%2Fv1771198908%2Fblog%2Fdigital_portfolio_mi_img.png" width="800" height="1285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing It Full Circle
&lt;/h2&gt;

&lt;p&gt;Here’s what I love about this whole process: The skills you use to build an impressive portfolio are the same skills you’ll use every day in your job.&lt;/p&gt;

&lt;p&gt;When you build this portfolio, you’re learning how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build modern React applications with TypeScript.&lt;/li&gt;
&lt;li&gt;Create responsive, mobile-first designs.&lt;/li&gt;
&lt;li&gt;Optimize images and videos for real-world performance.&lt;/li&gt;
&lt;li&gt;Use cloud services to solve practical problems.&lt;/li&gt;
&lt;li&gt;Write clean, maintainable code.&lt;/li&gt;
&lt;li&gt;Think about user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your portfolio becomes a preview of what you can do. So, you’ve shown you can build websites that look great, load fast, and feel professional. That’s exactly what teams are looking for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Making a portfolio that stands out doesn’t have to be complicated or stressful. It’s really about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polish that shows you care about details.&lt;/li&gt;
&lt;li&gt;Performance that respects people’s time.&lt;/li&gt;
&lt;li&gt;Smart visual choices that guide the eye.&lt;/li&gt;
&lt;li&gt;Responsive design that works everywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using the right tools (like Cloudinary) to make your life easier.&lt;br&gt;
If you’re job searching right now, I hope this helps. You’ve got this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;a href="https://stackblitz.com/github/cloudinary-devs/digital_portfolio?file=README.md" rel="noopener noreferrer"&gt;https://stackblitz.com/github/cloudinary-devs/digital_portfolio?file=README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source code&lt;/strong&gt;: &lt;a href="https://github.com/cloudinary-devs/digital_portfolio" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudinary docs&lt;/strong&gt;: &lt;a href="https://link.cloudinary.com/umWb2" rel="noopener noreferrer"&gt;https://cloudinary.com/documentation&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cloudinary ❤️ developers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready to level up your media workflow? Start using Cloudinary for free and build better visual experiences today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 &lt;strong&gt;&lt;a href="https://link.cloudinary.com/umWb1" rel="noopener noreferrer"&gt;Create your free account&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>career</category>
      <category>design</category>
      <category>frontend</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Docs and LLM Clients in the IDE: Smarter Together</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Sun, 14 Sep 2025 11:33:24 +0000</pubDate>
      <link>https://dev.to/cloudinary/docs-and-llm-clients-in-the-ide-smarter-together-5hma</link>
      <guid>https://dev.to/cloudinary/docs-and-llm-clients-in-the-ide-smarter-together-5hma</guid>
      <description>&lt;p&gt;Docs and developers have always had a symbiotic relationship. Product documentation has existed to give developers what they need to use a platform: setup instructions, code snippets, sample apps, tutorials, and more. In return, developers have been empowered (or held back) by how clearly and completely that information has been delivered.&lt;/p&gt;

&lt;p&gt;Today, development is no longer just about browsing docs and writing code by hand. With AI, it’s about interacting, prompting, and building, often directly inside the IDE. Yet the traditional relationship still holds: &lt;strong&gt;an LLM client is only as good as the context it’s been given&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That means you need product documentation, compatibility rules, and a way to index code examples into your IDE. Without them, even the best LLM client can miss important details. But with the right context, it doesn’t just write accurate code. It can also reason about your system.&lt;/p&gt;

&lt;p&gt;Whether you’re just getting started, picking up a new tool, or leaning on AI to carry the load, the question is: &lt;em&gt;what docs do you need to get the most from your AI?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you’d like to follow along with the examples, you’ll need an IDE that supports MCP servers. This post uses Cursor. You can also &lt;a href="//cloudinary.com/ip/sharony"&gt;sign up for a free Cloudinary account&lt;/a&gt; to try the same tools. For hands-on help, see &lt;a href="https://cloudinary.com/documentation/cloudinary_llm_mcp#banner" rel="noopener noreferrer"&gt;Cloudinary MCP servers and LLM tools (Beta)&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  From Lookup to Execution
&lt;/h2&gt;

&lt;p&gt;LLM clients haven’t just changed how we use product documentation. They’ve changed where we use it. Inside your IDE, documentation isn’t something you look up anymore; it becomes part of your workflow. &lt;/p&gt;

&lt;p&gt;Today, developers use a variety of LLM-powered IDEs, i.e., Cursor, VS Code extensions, or Claude Code, but the principle is the same: the more context you give, the better the LLM’s suggestions.&lt;/p&gt;

&lt;p&gt;That means the code snippets, design patterns, and architectural suggestions provided by the AI are pulled directly from authoritative docs, keeping completions consistent and reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrhinoui51nijsrlqvre.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrhinoui51nijsrlqvre.png" alt="LLM prompt and code suggestion for adding a custom font with Cloudinary" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And with MCP servers, you can tap into agentic behavior, such as performing background or configuration tasks without breaking flow. For example, you can upload a custom font to Cloudinary directly from your IDE. When documentation is properly integrated into your IDE, execution has a higher chance of succeeding without glitches.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa3jvwp838kttnlui0mv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa3jvwp838kttnlui0mv.png" alt="LLM prompt that uploads a custom font to Cloudinary using MCP" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Guidance: Using Docs as Context
&lt;/h2&gt;

&lt;p&gt;To make an LLM client effective inside your IDE, combine the following documentation inputs. Each plays a distinct role in ensuring accuracy, efficiency, and performance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reference the documentation site&lt;/p&gt;
&lt;p&gt;Anchor your LLM client in the authoritative source of truth so its suggestions reflect not just valid syntax, but also best practices and consistent patterns drawn directly from the documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Index docs with Context7&lt;/p&gt;
&lt;p&gt;Bring all code snippets and examples from the documentation directly into your IDE, so AI can autocomplete from them instead of guessing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Leverage rules&lt;/p&gt;
&lt;p&gt;Supply the LLM client with structured, procedural rules (like Cloudinary’s transformation compatibility tables) so it produces valid, working code every time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pair docs with MCP Servers&lt;/p&gt;
&lt;p&gt;When the LLM client executes admin or configuration tasks in your IDE (like uploading assets or applying presets), MCP servers ensure those actions follow the documented patterns and succeed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, you can only incorporate the product documentation that the provider makes available.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference the Documentation Site
&lt;/h2&gt;

&lt;p&gt;Documentation has always been the source of truth for developers. That hasn’t changed. What’s new is that docs are now also the source of truth for your LLM client, as well. They define the parameters, requirements, and best practices to produce code that not just works but is also scalable and consistent.&lt;/p&gt;

&lt;p&gt;Take Cloudinary as an example. Suppose you’re preparing a Father's Day campaign landing page. Here's the original image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Ffathers-day-banner.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fdemo%2Fimage%2Fupload%2Ffathers-day-banner.jpg" alt="Father's Day banner - Original" width="800" height="1198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/fathers-day-banner.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/fathers-day-banner.jpg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need this, along with all hero images, cropped consistently at 1600×900.&lt;/p&gt;

&lt;p&gt;If your LLM isn’t grounded in the docs, it might recommend an inline transformation every time you resize or crop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Works, but inconsistent across your app

https://res.cloudinary.com/demo/image/upload/w_1600,h_900,c_fill,g_auto/f_auto/q_auto/fathers_day_banner.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That technically works, but it creates inconsistencies across projects. If parameters are rearranged, you risk generating unnecessary derived assets over and over.&lt;/p&gt;

&lt;p&gt;Armed with context from the &lt;a href="https://cloudinary.com/documentation/ecommerce_optimize_customize" rel="noopener noreferrer"&gt;Retail and e-commerce guide&lt;/a&gt;, the LLM knows a better practice: use a named transformation. Named transformations bundle your parameters into a reusable recipe that can be applied consistently across projects and teams.&lt;/p&gt;

&lt;p&gt;Because it has this context, the LLM can also apply the practice in the smartest way: delegate the one-time creation of the transformation to the MCP server, then always reference it in delivery URLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// One-time setup: MCP creates the named transformation
import { v2 as cloudinary } from "cloudinary";

cloudinary.api.create_transformation("campaign_hero", {
  width: 1600,
  height: 900,
  crop: "fill",
  gravity: "auto",
  fetch_format: "auto",
  quality: "auto"
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, when coding your delivery URLs, just reference the name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Best practice: consistent use of named transformation

https://res.cloudinary.com/demo/image/upload/t_campaign_hero/fathers_day_banner.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both URLs deliver a valid image, but providing your  LLM client the context increases the chances that it will code a solution that scales and implements best practices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7f8j0knipup4dr37sgk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7f8j0knipup4dr37sgk.jpg" alt="Father's Day banner - Transformed and optimized" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/t_campaign_hero/fathers-day-banner.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/t_campaign_hero/fathers-day-banner.jpg&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Add Docs in Cursor
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you’re using a different IDE, check its MCP or docs integration options. Many of the same principles apply.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Cursor &amp;gt; Settings &amp;gt; Indexing &amp;amp; Docs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Docs&lt;/strong&gt; section, click &lt;strong&gt;+ Add Doc&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your doc site (e.g. &lt;code&gt;https://cloudinary.com/documentation&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Some products make this even easier by providing Markdown versions of docs. With Cloudinary, every doc page includes:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Open as Markdown&lt;/strong&gt; — copy the URL and provide it as context.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Download Markdown&lt;/strong&gt; — save the file and upload it if your LLM doesn’t support URLs.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By anchoring your LLM to the doc site (or Markdown pages), you ensure its suggestions aren’t just valid code, but also reflect the documented best practices for your environment.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Index docs with Context7
&lt;/h2&gt;

&lt;p&gt;If the documentation site is the source of truth, then Context7 makes that truth usable inside your IDE. It indexes the code snippets and examples from the docs so your LLM client can autocomplete from them directly.&lt;/p&gt;

&lt;p&gt;That means the LLM client isn’t guessing at parameter order or inventing method names, it’s pulling from the same snippets you’d normally copy-paste from the docs.&lt;/p&gt;

&lt;p&gt;Why does this matter? Because without indexed examples, your LLM is more likely to generate code that looks fine but won’t actually run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Uploading Campaign Assets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose you’re adding images for your Father's Day campaign. Without Context7, the AI might suggest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Looks plausible, but this method doesn’t exist

cloudinary.upload("fathers_day_banner.jpg")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Cloudinary’s docs indexed by Context7, your IDE can surface the real snippet from the Node.js SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Pulled directly from the Cloudinary SDK docs

import { v2 as cloudinary } from "cloudinary";
cloudinary.uploader.upload("fathers_day_banner.jpg", {
  use_filename: true,
  unique_filename: false,
  overwrite: false,
  upload_preset: "campaign_assets"
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the code is syntactically correct, environment-aware, and aligned with documented best practices. Instead of breaking flow to check docs, you stay in the IDE and get it right the first time.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Add Context7 in Cursor
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Cursor &amp;gt; Settings &amp;gt; Tools &amp;amp; Integrations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;MCP Tools&lt;/strong&gt; section, click &lt;strong&gt;New MCP Server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add Context7 to your JSON list of MCP servers:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "context7": {
  "url": "https://mcp.context7.com/mcp"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol start="4"&gt; 
&lt;li&gt;Once set up, your LLM client can autocomplete directly from the indexed docs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpgeof5dqw4ivwwgswyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpgeof5dqw4ivwwgswyl.png" alt="Cursor Settings - Tools &amp;amp; Integrations" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tip:&lt;/strong&gt; To enable doc ingestion with the Context 7 MCP server for a different IDE, check out the Context 7 GitHub repo &lt;strong&gt;README&lt;/strong&gt; and choose an IDE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thousands of products already index their docs in Context7. If you’re using Cloudinary, you’re covered. If you’re using another product, make sure its documentation is included.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Leverage Rules
&lt;/h2&gt;

&lt;p&gt;Examples and snippets are helpful, but they don’t cover the constraints that make code actually work. Documentation also defines rules: which parameters can be combined, how qualifiers interact, and what syntax is supported.&lt;/p&gt;

&lt;p&gt;Without those rules as context, an LLM client might generate code that looks right but fails when you run it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Campaign Product Thumbnails&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose you’re creating thumbnails for product cards in your Father's Day campaign. You want them auto-cropped around the main subject. Your LLM knows about &lt;code&gt;g_face&lt;/code&gt; (automatically crop around the largest detected face), but if it isn’t grounded in the docs, it might pair it with the wrong crop mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Invalid: g_face doesn’t work with c_pad

https://res.cloudinary.com/demo/image/upload/c_pad,g_face,w_500,h_500/e_upscale/f_auto/q_auto/fathers_day_banner.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output URL looks fine, but the transformation will fail.&lt;br&gt;
With rules indexed from the docs, the AI knows &lt;code&gt;g_face&lt;/code&gt; only works with certain crop modes, such as &lt;code&gt;c_auto&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Valid: g_face with c_auto

https://res.cloudinary.com/demo/image/upload/c_auto,g_face,w_500,h_500/e_upscale/f_auto/q_auto/fathers_day_banner.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, instead of generating “almost right” code that you'll later have to debug, the LLM produces correct transformations that will run reliably in production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx13nwp6yx4bw3lcrvuvt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx13nwp6yx4bw3lcrvuvt.jpg" alt="Father's Day banner - Cropped to a thumbnail around the face" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/demo/image/upload/c_auto,g_face,w_500,h_500/e_upscale/fathers-day-banner.jpg" rel="noopener noreferrer"&gt;https://res.cloudinary.com/demo/image/upload/c_auto,g_face,w_500,h_500/e_upscale/fathers-day-banner.jpg&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Add a Rules File in Cursor
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; Cursor also has its own “rules” feature. In this case, you’re not adding a Cursor rule. You’re adding the product’s rules file as documentation context, so your LLM suggestions follow the product’s documented constraints.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the name of the rules file that the product you’re working with provides  (e.g. &lt;code&gt;cloudinary_transformation_rules.md&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Cursor &amp;gt; Settings &amp;gt; Indexing &amp;amp; Docs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In the Docs section, click &lt;strong&gt;+ Add Doc&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter the name of the rules file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When writing a prompt about transformations, add this rules doc as context. In chat, use &lt;strong&gt;@ Add Context → Docs → + Add new doc&lt;/strong&gt;, then paste the rules URL.&lt;/p&gt;

&lt;p&gt;With rules in place, your LLM isn’t just copying snippets. It’s following the same guardrails defined in the product documentation.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair Docs with MCP Servers
&lt;/h2&gt;

&lt;p&gt;Docs tell your LLM client what to do; MCP servers let it do it. Together they make documentation agentic so that the LLM client isn’t limited to suggesting code, but can also carry out actions correctly in your environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Upload Presets for Campaign Assets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to standardize uploads for your Father's Day campaign, ensuring assets land in the right folder with consistent transformations and policies. Cloudinary supports this with upload presets, but the exact fields and allowed values (&lt;code&gt;unsigned&lt;/code&gt;, &lt;code&gt;asset_folder&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;, &lt;code&gt;transformation&lt;/code&gt;, etc.) are defined in the documentation.&lt;/p&gt;

&lt;p&gt;The MCP server can handle this configuration in the background so you can use the preset directly in your code. No need to open another interface or set it up manually.&lt;/p&gt;

&lt;p&gt;Suppose you ask your LLM client to perform this agentic action:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Make an unsigned upload preset called &lt;code&gt;campaign_assets&lt;/code&gt; that stores images in &lt;code&gt;fathers_day_2025&lt;/code&gt; with a 1600×900 crop”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the LLM client guesses on the parameters instead of using the docs, the result is more likely to fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Plausible, but invalid (wrong folder format, unsupported option)

await cloudinary.uploader.upload("fathers_day_banner.jpg", {
  folder: "/fathers_day_2025",   // leading slash not allowed, parameter deprecated for dynamic folder mode
  crop_mode: "scale"        // invalid field name
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With docs + MCP, the LLM knows the correct fields and can act directly in your IDE to create and apply a preset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// One-time agentic action: create an upload preset for campaign assets

await cloudinary.api.create_upload_preset({
  name: "campaign_assets",
  unsigned: false,
  asset_folder: "fathers_day_2025",
  transformation: [
    { width: 1600, height: 900, crop: "fill", gravity: "auto" }
  ],
  tags: ["campaign", "fathers_day_2025"]
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once that's done, you can add the preset to your upload code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Use the preset to upload consistently

await cloudinary.uploader.upload("fathers_day_banner.jpg", {
  upload_preset: "campaign_assets"
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the docs provide the valid fields and constraints, and MCP makes it actionable right inside your IDE. The result: assets uploaded consistently, without guesswork or manual dashboard setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Add MCP Servers in Cursor
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Cursor &amp;gt; Settings &amp;gt; Tools &amp;amp; Integrations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the &lt;strong&gt;MCP Tools&lt;/strong&gt; section, click &lt;strong&gt;New MCP Server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add the Cloudinary MCP servers to your JSON list:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "cloudinary-asset-mgmt-remote": {
  "url": "https://asset-management.mcp.cloudinary.com/sse"
},
"cloudinary-env-config-remote": {
  "url": "https://environment-config.mcp.cloudinary.com/sse"
},
"cloudinary-smd-remote": {
  "url": "https://structured-metadata.mcp.cloudinary.com/sse"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol start="4"&gt;
&lt;li&gt;In &lt;b&gt;Cursor Settings&lt;/b&gt;, click &lt;b&gt;Needs Login&lt;/b&gt; for each MCP server and sign in with your Cloudinary email and password to connect to your product environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When documentation and MCP servers work together, your IDE doesn’t just generate suggestions. It also executes them correctly in your environment, turning “looks right” code into “works right” code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docs for Humans
&lt;/h2&gt;

&lt;p&gt;And don’t worry, product documentation is still there for you, not just your LLM client. AI can speed up routine coding and handle a lot of boilerplate, but when you need to understand what’s happening, debug an issue, or step back for a high-level view of the platform, the docs are still your best tool.&lt;/p&gt;

&lt;p&gt;Whether you’re learning a new capability, checking constraints, or exploring an unfamiliar API, reading the documentation yourself gives you the context and insight that no autocomplete can replace.&lt;/p&gt;

&lt;p&gt;Because ultimately, you’re still the guide. Documentation now serves two audiences, developers and LLM clients, but you remain the one steering the system toward the results you want.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonbfw01hcons0b45py09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonbfw01hcons0b45py09.png" alt="Human behind development" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Adaptive and Agentic Docs
&lt;/h2&gt;

&lt;p&gt;We’ve reached a point where documentation is no longer just static reference, but rather part of an adaptive, agentic workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context-aware&lt;/strong&gt;: available right where you code, without leaving your IDE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic&lt;/strong&gt;: paired with tools so your LLM client can not only explain concepts but also generate accurate code and perform actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-first&lt;/strong&gt;: still written to teach and guide developers, not just feed machines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafxet8h5c77d9e4mkeq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafxet8h5c77d9e4mkeq2.png" alt=" " width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking ahead, documentation could become even more dynamic. Imagine a feedback loop where developer usage and AI interactions surface gaps, corrections, and improvements automatically. Instead of relying solely on manual updates, docs could evolve in near real time, reflecting how products are actually being used.&lt;/p&gt;

&lt;p&gt;The future of product documentation is about giving LLM clients the best possible inputs, so they can reason and act safely while still giving developers the clarity they need to guide the process.&lt;/p&gt;

&lt;p&gt;That’s how we’ll spend less time fixing and more time building. And as LLM clients grow more agentic, able to reason, plan, and execute, the need for accurate, structured, and adaptive documentation will only increase.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Build the Next Generation of Docs
&lt;/h2&gt;

&lt;p&gt;We’re at an exciting point. AI can recommend, design, and even execute parts of our workflows—but only when given the right context. Documentation is no longer just for humans; it’s the fuel for intelligent, agentic tools.&lt;/p&gt;

&lt;p&gt;Now it’s your turn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Share your thoughts in the comments:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What do you wish your docs did better?&lt;/li&gt;
&lt;li&gt;When have docs and AI worked well together for you?&lt;/li&gt;
&lt;li&gt;How do you want docs to support AI inside your IDE?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Try it out:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up the Context 7 MCP server in your IDE.&lt;/li&gt;
&lt;li&gt;Pull in the Cloudinary MCP servers and doc tools, and upload an image from your local directory to Cloudinary.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Your feedback shapes the next generation of docs, for humans and AI. Let’s build smarter docs. And let’s keep them human.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cloudinary ❤️ developers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready to level up your media workflow? Start using Cloudinary for free and build better visual experiences today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 &lt;strong&gt;&lt;a href="https://cloudinary.com/users/register_free?utm_campaign=4870-&amp;amp;utm_medium=employee_referral&amp;amp;utm_source=dev-dot-to&amp;amp;utm_content=smarter-together" rel="noopener noreferrer"&gt;Create your free account&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>llm</category>
      <category>media</category>
      <category>webdev</category>
      <category>developers</category>
    </item>
    <item>
      <title>AI Video Workflows with PHP</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Thu, 30 Jan 2025 09:21:56 +0000</pubDate>
      <link>https://dev.to/sharony/ai-video-workflows-with-php-2ceg</link>
      <guid>https://dev.to/sharony/ai-video-workflows-with-php-2ceg</guid>
      <description>&lt;p&gt;Videos on your website can significantly boost conversions—by up to 80%, according to a study by &lt;a href="https://saleslion.io/sales-statistics/using-video-on-landing-pages-can-increase-conversion-by-80/" rel="noopener noreferrer"&gt;Eye View Digital&lt;/a&gt;. But to maximize their impact, you need an efficient approach to uploading, processing, and delivering video content. &lt;/p&gt;

&lt;p&gt;In this &lt;a href="https://cloudinary.com/blog/ai-video-workflows-with-php-and-cloudinary-from-upload-to-delivery" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;, you'll learn how to streamline AI-powered video workflows in your PHP app using Cloudinary. You'll explore a PHP Product Catalog app that demonstrates how to:&lt;/p&gt;

&lt;p&gt;✅ Enable seamless client-side video uploads&lt;/p&gt;

&lt;p&gt;✅ Automatically moderate content without disrupting availability&lt;/p&gt;

&lt;p&gt;✅ Edit videos dynamically to match your website’s needs&lt;/p&gt;

&lt;p&gt;✅ Optimize videos for fast loading and smooth playback&lt;/p&gt;

&lt;p&gt;✅ Deliver videos with a fully customizable video player&lt;/p&gt;

&lt;p&gt;Read the full post to see these features in action!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ecommerce</category>
      <category>video</category>
      <category>php</category>
    </item>
    <item>
      <title>Managing UGC Videos in Your App For Increased Engagement</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Wed, 29 Jan 2025 10:13:31 +0000</pubDate>
      <link>https://dev.to/sharony/managing-ugc-videos-in-your-php-app-for-increased-engagement-b0c</link>
      <guid>https://dev.to/sharony/managing-ugc-videos-in-your-php-app-for-increased-engagement-b0c</guid>
      <description>&lt;p&gt;User-generated content (UGC) videos can be a game-changer for your app. According to &lt;a href="https://www.sciencedirect.com/science/article/abs/pii/S1567422324000474#:~:text=The%20findings%20reveal%20that%20short,of%20UGC%20and%20perceived%20value" rel="noopener noreferrer"&gt;a study&lt;/a&gt; from ScienceDirect, short video UGC generates a stronger purchase intention than graphic UGC. In fact, user-generated videos are shown to generate 12 times more shares than text and images combined, significantly boosting engagement. (&lt;a href="https://www.keevee.com/user-generated-content-statistics?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;58 User-Generated Content Statistics for 2025&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;These sources highlight the power of UGC videos in enhancing website conversions, building trust, and driving higher engagement. However, to maintain performance, security, and a great user experience, you need a well-structured approach to handling these videos.&lt;/p&gt;

&lt;p&gt;Cloudinary makes it simple. Read this &lt;a href="https://cloudinary.com/blog/ai-video-workflows-with-php-and-cloudinary-from-upload-to-delivery" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; to learn how to:&lt;/p&gt;

&lt;p&gt;✅ Provide a seamless client-side upload interface&lt;/p&gt;

&lt;p&gt;✅ Automatically moderate videos asynchronously to prevent inappropriate content without disrupting availability&lt;/p&gt;

&lt;p&gt;✅ Edit videos on-the-fly to meet your website’s requirements&lt;/p&gt;

&lt;p&gt;✅ Optimize videos for fast loading and a lightweight site&lt;/p&gt;

&lt;p&gt;✅ Use adaptive bitrate streaming for smooth playback&lt;/p&gt;

&lt;p&gt;✅ Deliver videos with a customizable video player&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ugc</category>
      <category>ecommerce</category>
      <category>videoplayer</category>
    </item>
    <item>
      <title>AI Image Workflows with PHP and Cloudinary – From Upload to Delivery</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Tue, 21 Jan 2025 12:38:40 +0000</pubDate>
      <link>https://dev.to/sharony/ai-image-workflows-with-php-and-cloudinary-from-upload-to-delivery-ni3</link>
      <guid>https://dev.to/sharony/ai-image-workflows-with-php-and-cloudinary-from-upload-to-delivery-ni3</guid>
      <description>&lt;p&gt;Do you work with images in your PHP apps? Check out this must-read article on streamlining and scaling your image workflow with AI.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cloudinary.com/blog/ai-image-workflows-php" rel="noopener noreferrer"&gt;article&lt;/a&gt; walks you through a complete image workflow—from client-side upload and user-specified metadata to auto-generating alt text, dynamic transformations, and optimized delivery—all demonstrated in an end-to-end Product Catalog app.&lt;/p&gt;

&lt;p&gt;Learn how to automate it all with Cloudinary’s PHP SDK.&lt;/p&gt;

&lt;p&gt;Read the full post &lt;a href="https://cloudinary.com/blog/ai-image-workflows-php" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>ecommerce</category>
      <category>imageworkflow</category>
    </item>
    <item>
      <title>Transform Your WordPress Images with Generative AI</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Mon, 11 Nov 2024 08:59:08 +0000</pubDate>
      <link>https://dev.to/sharony/transform-your-wordpress-images-with-generative-ai-4l7f</link>
      <guid>https://dev.to/sharony/transform-your-wordpress-images-with-generative-ai-4l7f</guid>
      <description>&lt;p&gt;Creating a WordPress site involves extensive image management. Imagine if you could seamlessly enhance your images, apply effects, and manage backgrounds—all without leaving your WordPress dashboard.&lt;/p&gt;

&lt;p&gt;With the Cloudinary WordPress Plugin, you can use AI to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove or adjust backgrounds for product images&lt;/li&gt;
&lt;li&gt;Expand images to fit any layout&lt;/li&gt;
&lt;li&gt;Fill in missing parts of cropped images&lt;/li&gt;
&lt;li&gt;Recolor elements&lt;/li&gt;
&lt;li&gt;Remove unwanted artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://cloudinary.com/blog/transform-your-wordpress-images-with-generative-ai" rel="noopener noreferrer"&gt;Learn how to use AI with Cloudinary, and sign up to Cloudinary for free!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>mediafiles</category>
      <category>ai</category>
      <category>website</category>
    </item>
    <item>
      <title>Boost Your WordPress Media Management with Cloudinary</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Tue, 01 Oct 2024 11:14:03 +0000</pubDate>
      <link>https://dev.to/sharony/boost-your-wordpress-media-management-with-cloudinary-l5h</link>
      <guid>https://dev.to/sharony/boost-your-wordpress-media-management-with-cloudinary-l5h</guid>
      <description>&lt;p&gt;Managing media on a WordPress site can quickly reveal the limitations of the default WordPress media library, especially as your collection of images, videos, and other files grows. For a more robust solution, &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary’s WordPress Plugin&lt;/a&gt; offers a powerful Media Library. It’s accessible as a standalone extension that transforms media management with enhanced organization, optimization, and retrieval capabilities.&lt;/p&gt;

&lt;p&gt;Integrated directly into your WordPress instance from within any page, Cloudinary’s Media Library goes beyond basic file management. It provides a range of features that enhance media handling, making it more efficient and powerful. Let’s explore some of the capabilities that can transform how you manage media on your WordPress site with Cloudinary’s Media Library, powered by the Cloudinary WordPress plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabgcb1e746qj6g6a712t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabgcb1e746qj6g6a712t.png" alt="Cloudinary Plugin - Media Library" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;p&gt;Excited to explore Cloudinary’s Media Library? Start with these steps to get set up and ready for the features we’ll discuss in this blog post:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for a free Cloudinary account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Install&lt;/a&gt; the Cloudinary WordPress plugin. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the setup wizard, following the instructions to add your connection string and select your sync and optimization settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the Cloudinary WordPress Plugin is installed, make sure Cloudinary is selected in the left navigation menu, and select Cloudinary DAM from the Extensions drop-down.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note: DAM (Digital Asset Management)&lt;/strong&gt; refers to a system for efficiently organizing, storing, and managing digital files like images, videos, and documents. With the Cloudinary WordPress Plugin, this functionality is provided through the Cloudinary Media Library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkesl84jaf2mfnc1okhe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkesl84jaf2mfnc1okhe5.png" alt="DAM Extension" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Cloudinary’s Media Library
&lt;/h2&gt;

&lt;p&gt;Cloudinary’s Media Library offers a range of designed to streamline media management, enhance organization, and improve file discoverability. Here’s a glimpse of its transformative capabilities:&lt;/p&gt;

&lt;h3&gt;
  
  
  Centralized Media Management
&lt;/h3&gt;

&lt;p&gt;Upload your media files to the Media Library for streamlined, centralized management of all assets. Serving as the single source of truth, it’s accessible from WordPress, the Cloudinary Console, and other integrations, ensuring seamless collaboration across teams and platforms. This setup simplifies reusing assets across channels like social media, &lt;a href="https://home.mediaflows.cloudinary.com/sync-assets-to-shopify" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt; and &lt;a href="https://cloudinary.com/documentation/magento_integration" rel="noopener noreferrer"&gt;Magento&lt;/a&gt;. Additionally, collaboration tools—such as media file  &lt;a href="https://cloudinary.com/documentation/dam_collaboration_tools#adding_comments" rel="noopener noreferrer"&gt;commenting&lt;/a&gt; on individual media files, &lt;a href="http://cloudinary.com/documentation/dam_collaboration_tools#sharing_assets" rel="noopener noreferrer"&gt;user invitations&lt;/a&gt;, and &lt;a href="https://cloudinary.com/documentation/dam_folders_collections_sharing#sharing_collections_externally_via_public_links" rel="noopener noreferrer"&gt;public link creation&lt;/a&gt;—make it easy to coordinate workflows and share content effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To open the Cloudinary Media Library:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Inside WordPress, click &lt;strong&gt;Cloudinary DAM&lt;/strong&gt; in the left navigation menu. Make sure the &lt;strong&gt;Assets&lt;/strong&gt; or &lt;strong&gt;Folders&lt;/strong&gt; page is selected from the top navigation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alternatively, when adding an image to a page or post, select &lt;strong&gt;Media Library&lt;/strong&gt;, and select the &lt;strong&gt;Cloudinary&lt;/strong&gt; tab:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51jty2yr1cvfp1nd16i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51jty2yr1cvfp1nd16i4.png" alt="Block Editor" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4943ho0rhda04vpg9kh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4943ho0rhda04vpg9kh.png" alt="Cloudinary Media Library" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This shows the Cloudinary Media Library activated from the block editor. The library is accessible from the classic editor, as well.&lt;/p&gt;

&lt;p&gt;To open the Media Library outside of WordPress, go to cloudinary.com and login directly.&lt;/p&gt;

&lt;p&gt;For more information, see Digital Asset Management Overview.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Editing
&lt;/h3&gt;

&lt;p&gt;Cloudinary’s Studio provides an easy-to-use interface for editing multiple images at once, including AI-driven actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resize and Crop&lt;/strong&gt;: Set the crop of your choice and let AI center the most important part of the image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit the Background&lt;/strong&gt;: Remove backgrounds, add drop shadows, and select new background colors or images.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add an Image Overlay&lt;/strong&gt;: Enhance branding by adding watermarks or custom image overlays.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generative AI&lt;/strong&gt;: Restore and mend imperfections, recolor, remove, or replace elements using a prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhance&lt;/strong&gt;: Improve your image by adjusting colors, contrast, brightness, and sharpness, and highlighting edges and fine details.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you’re done, download your enhanced images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqviw56vs1kxj9ocjzno9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqviw56vs1kxj9ocjzno9.png" alt="Studio" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To open Studio for multiple images:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure  the &lt;strong&gt;Assets&lt;/strong&gt; or &lt;strong&gt;Folders&lt;/strong&gt; page is selected at the top navigation of the Cloudinary Media Library.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select multiple images and hover over the &lt;strong&gt;Edit&lt;/strong&gt; icon in the assets toolbar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose the tool you want to apply from the drop-down menu.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhbv3hy2l5c4qj8frvum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhbv3hy2l5c4qj8frvum.png" alt="Open Studio for multiple images" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-Tagging and Metadata
&lt;/h3&gt;

&lt;p&gt;With auto-tagging, you no longer need to manually tag each image or video. Cloudinary’s AI scans your media, identifying key elements and automatically generating relevant tags. This feature saves time and ensures consistent labeling for easy retrieval. You can also manually add tags and custom metadata to further enhance your media management.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfa5mb0bpbyvm07sjfif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfa5mb0bpbyvm07sjfif.png" alt="Analysis" width="800" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To run the Cloudinary WordPress Plugin auto-tagging feature:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Double-click an asset within the Media Library to open the asset management page. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;strong&gt;Analysis&lt;/strong&gt; tab to generate tags based on detected objects. If a subscription is required for the analysis, click the &lt;strong&gt;Register&lt;/strong&gt; button to subscribe.&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the tags to your file’s metadata from the options menu next to the &lt;strong&gt;Minimum confidence&lt;/strong&gt; slider. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;To view and edit these tags and add custom metadata:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;Metadata&lt;/strong&gt; tab to provide additional context and improve searchability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6oyq1xuzll63nyug8o3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6oyq1xuzll63nyug8o3.png" alt="Metadata" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, see the sections on &lt;a href="https://cloudinary.com/documentation/dam_analysis_insights" rel="noopener noreferrer"&gt;Analysis&lt;/a&gt; and insights and &lt;a href="https://cloudinary.com/documentation/dam_manage_metadata#setting_custom_metadata_values" rel="noopener noreferrer"&gt;Custom metadata&lt;/a&gt; in the Cloudinary documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Search and Filtering
&lt;/h3&gt;

&lt;p&gt;Cloudinary’s plugin offers powerful search capabilities, allowing you to quickly locate media based on tags, keywords, file names, and more. You can filter results by criteria such as file type, date, or tag, and sort them by relevance or other parameters. These tools make managing large media libraries more efficient and organized.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmm9a12ggl2v1sdalked.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmm9a12ggl2v1sdalked.png" alt="Search" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To perform a search:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Cloudinary Media Library, ensure the &lt;strong&gt;Assets&lt;/strong&gt; tab is selected, then enter your search criteria to find specific media quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information, see &lt;a href="http://dam_advanced_search" rel="noopener noreferrer"&gt;Advanced Search&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not Just a Media Library: Fast CDN Delivery and More
&lt;/h2&gt;

&lt;p&gt;Cloudinary’s WordPress Plugin is more than just a media library—it's a powerful all-in-one solution that saves you from managing multiple plugins. This single plugin streamlines your workflow by offering features like fast CDN delivery. Automatic integration with Cloudinary’s global CDN ensures your images and videos are served at lightning speed, significantly boosting load times and overall site performance without any additional setup. Enjoy the full power of seamless media delivery, keeping your site running smoothly no matter the scale. &lt;/p&gt;

&lt;h2&gt;
  
  
  Level Up Your Media Game
&lt;/h2&gt;

&lt;p&gt;Cloudinary’s WordPress Plugin Media Library transforms media management by providing a central source of truth for all your media files, auto-tagging capabilities, and comprehensive metadata support. Its advanced search and filtering features simplify finding and organizing your media. Additionally, the plugin includes a host of other essential capabilities, including seamless integration with Cloudinary’s global CDN for fast and efficient media delivery. &lt;/p&gt;

&lt;p&gt;Elevate your media management experience today with the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt;, where powerful features and exceptional performance come together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Read more about the Cloudinary WordPress Plugin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloudinary.com/blog/choosing-your-best-wordpress-storage-options" rel="noopener noreferrer"&gt;Choose the Best Storage Options for your WordPress Media Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudinary.com/blog/optimize-images-videos-wordpress" rel="noopener noreferrer"&gt;6 Ways to Optimize Your Images and Videos On WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloudinary.com/blog/5-ways-enhance-images-videos-wordpress" rel="noopener noreferrer"&gt;5 Ways to Enhance Your Images and Videos On WordPress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>mediamanagement</category>
      <category>medialibrary</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Choose the Best Storage Options for Your WordPress Media Files</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Sun, 15 Sep 2024 06:53:26 +0000</pubDate>
      <link>https://dev.to/sharony/choose-the-best-storage-options-for-your-wordpress-media-files-3mo6</link>
      <guid>https://dev.to/sharony/choose-the-best-storage-options-for-your-wordpress-media-files-3mo6</guid>
      <description>&lt;p&gt;The &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; integrates smoothly with WordPress, moving your media files to Cloudinary’s powerful cloud infrastructure. This can free up your WordPress storage, depending on your chosen settings. Your images and videos are delivered through a high-performance Content Delivery Network (CDN), ensuring fast loading times worldwide. Everything is managed within WordPress, so you enjoy better performance and easier media management without leaving your WordPress instance or disrupting your workflow. Plus, by storing your media in Cloudinary, you gain the flexibility to easily reuse those assets across other platforms, including any external CMS or e-commerce platform, for a consistent and efficient media management experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; WooCommerce, already integrated within WordPress, gains additional media management features from Cloudinary, enhancing its overall media handling capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42hiymbikz0m6qfq9jet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42hiymbikz0m6qfq9jet.png" alt="The Cloudinary Plugin saves bandwidth on a WordPress site" width="800" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Cloudinary Plugin saving bandwidth on a WordPress site&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In This Blog
&lt;/h2&gt;

&lt;p&gt;We’ll explore how the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; can streamline your media management by diving into its sync and storage options. In addition, discover use cases, practical tips, and tools to optimize your WordPress site and enhance your media workflow and storage efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for a free Cloudinary account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Install&lt;/a&gt; the Cloudinary WordPress plugin. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the setup wizard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the Cloudinary WordPress Plugin is installed, make sure Cloudinary is selected in the left navigation menu, and select &lt;strong&gt;Cloudinary DAM&lt;/strong&gt; from the Extensions drop-down to enable the Media Library.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9jvjn42y6g0scf65aef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9jvjn42y6g0scf65aef.png" alt="DAM extension" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol start="5"&gt;&lt;li&gt;Set storage and sync options by navigating to &lt;b&gt;Cloudinary &amp;gt; General settings&lt;/b&gt;.&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ms6hdjst8zg8pmt8npf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ms6hdjst8zg8pmt8npf.png" alt="Media Library sync settings" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Flexible Storage Solutions
&lt;/h2&gt;

&lt;p&gt;Cloudinary provides versatile storage options for your WordPress media files. Choose the best fit for your needs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyktj4nwwt12jsb44ajm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyktj4nwwt12jsb44ajm.png" alt="Cloudinary and WordPress storage options" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If freeing up WordPress storage&lt;/strong&gt; is your priority, choose the &lt;strong&gt;Cloudinary Only&lt;/strong&gt; option. This option is ideal for media-heavy sites like travel blogs or real estate listings. It stores all your media exclusively on Cloudinary, freeing up space on WordPress while ensuring fast loading times. You can easily switch back to serving assets from WordPress if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you prefer having a fallback plan while still saving storage&lt;/strong&gt;, select the &lt;strong&gt;Cloudinary and WordPress (Low Resolution)&lt;/strong&gt; option. This moves all your media to Cloudinary and keeps low-resolution copies on WordPress for basic visibility. It's perfect for small businesses like local cafés or bakeries, offering a good balance between cost savings and WordPress storage use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If having a full fallback is more important than saving storage&lt;/strong&gt;, go with the &lt;strong&gt;Cloudinary and WordPress (Default)&lt;/strong&gt; option. This stores your media on both Cloudinary and WordPress, providing Cloudinary’s optimization and fast delivery while enabling immediate access to assets in WordPress. It's ideal for sites like design portfolios or e-commerce stores that require complete redundancy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Seamless Syncing Options
&lt;/h2&gt;

&lt;p&gt;You can choose how your media files sync based on your needs for convenience or control:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sr747yr28su338c28wt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2sr747yr28su338c28wt.png" alt="Media Library sync settings" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto Sync (default)&lt;/strong&gt;: Automatically syncs all changes and uploads the media files to Cloudinary. This option prioritizes convenience by handling synchronization seamlessly in the background. For instance, if you frequently add new blog posts with images, Auto Sync ensures that all new media is instantly updated on Cloudinary without any extra effort from you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Sync&lt;/strong&gt;: Provides the flexibility to review and selectively sync media from WordPress to Cloudinary. This approach allows precise control over when files are delivered in their updated form. For example, if you want to review newly updated images and videos before delivering them from Cloudinary, Manual Sync lets you perform the sync only when you're ready.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; By default, your WordPress assets will sync to the root folder of your Cloudinary product environment. To specify a different location, set a folder path in your Media Library Sync Settings. For example, to store assets in the &lt;code&gt;cld-images&lt;/code&gt; sub-folder within the &lt;code&gt;wordpress-assets&lt;/code&gt; folder, configure the Cloudinary folder path as &lt;code&gt;wordpress-assets/cld-images&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Streamlined Delivery Methods
&lt;/h3&gt;

&lt;p&gt;The Cloudinary WordPress Plugin offers flexible delivery options to suit different needs. With Manual Sync, you gain control over how and when media files are synced between WordPress and Cloudinary. This method allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize performance:&lt;/strong&gt; Choose which assets are delivered from Cloudinary, taking advantage of its high-performance CDN for faster global delivery. For example, sync high-resolution images from a new blog post to boost page load speed without syncing all media.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Control storage:&lt;/strong&gt; Decide whether to keep files in WordPress for immediate access or offload them to Cloudinary, reducing storage demands on your WordPress site. For instance, sync old event photos that aren't frequently accessed to Cloudinary to save space on WordPress while keeping more recent, frequently accessed images locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manage file types:&lt;/strong&gt; Selectively sync specific file types, such as new gallery images that need optimization, to Cloudinary, while keeping others, such as PDFs that don’t need CDN benefits, in WordPress. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using Manual Sync, you can tailor media delivery to fit your performance needs and storage preferences, ensuring that your critical media is delivered efficiently while maintaining control over where files are stored.&lt;/p&gt;

&lt;p&gt;Use the bulk actions menu or the single file menu to sync and deliver files efficiently. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgo0eaf4mxhs4hw5sgwli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgo0eaf4mxhs4hw5sgwli.png" alt="Bulk options" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bulk options&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftli8j7yd1oz3qdf6wlvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftli8j7yd1oz3qdf6wlvt.png" alt="Single media file options" width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Single media file options&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can also add metadata for individual files to the &lt;a href="https://cloudinary.com/documentation/wordpress_integration#system_report" rel="noopener noreferrer"&gt;Cloudinary Report&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Delivery Status Indicator
&lt;/h4&gt;

&lt;p&gt;The color of the Cloudinary icon in your WordPress media library list view indicates the status of each asset:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76abai0heswxoy0mglnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76abai0heswxoy0mglnh.png" alt="Status indicator" width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;td&gt;
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qqx6609c6m83gw5wr5a.png" alt="Black icon" width="58" height="42"&gt;
    &lt;/td&gt;
&lt;td&gt;Black icon: Asset not synced.
  &lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau1vi2w8py8hr2eflrex.png" alt="Blue icon" width="52" height="40"&gt;
&lt;/td&gt;
    &lt;td&gt;Blue icon: Delivered from WordPress.&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33ukniykihl53apjsa8k.png" alt="Green icon" width="48" height="38"&gt;

&lt;/td&gt;
    &lt;td&gt;Green icon: Synced with Cloudinary.&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Extended Sync Options
&lt;/h2&gt;

&lt;p&gt;Take your WordPress storage optimization to the next level by utilizing Cloudinary’s advanced features for media management. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Additional Asset Sync Settings:&lt;/strong&gt; Extend Cloudinary’s benefits to media files beyond your WordPress media library. Sync assets from other plugins, themes, or external sources. For example, use this setting if your site uses a custom theme with built-in image assets that you want to sync to Cloudinary for optimization and delivery. Adjust settings in &lt;strong&gt;General Settings &amp;gt; Additional Asset Sync Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ubjwo1at37x17s6axw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ubjwo1at37x17s6axw2.png" alt="Advanced Sync Settings" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;External Asset Sync Settings:&lt;/strong&gt; Sync externally hosted media (e.g., S3 bucket) or assets across multiple environments (e.g., staging, production) to Cloudinary. For example, if you host videos on an S3 bucket and want to use Cloudinary’s optimization and CDN, you can sync those assets to Cloudinary as well. Go to &lt;strong&gt;General Settings &amp;gt; External Asset Sync Settings&lt;/strong&gt; to add relevant domains.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lo72a2d70ermhu0hrc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lo72a2d70ermhu0hrc0.png" alt="External Asset Sync Settings" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor Your Real-Time Media Status
&lt;/h2&gt;

&lt;p&gt;Stay updated on the delivery source of your assets directly from your website’s frontend. The Cloudinary plugin shows whether your images and videos are served from Cloudinary or directly from WordPress.&lt;/p&gt;

&lt;p&gt;When media files are delivered from Cloudinary, you can instantly see how much bandwidth you're saving through optimization. For instance, if you run an e-commerce business like a fashion boutique with high-quality product images, monitoring the real-time status helps you ensure that large files are being served in optimized formats like WebP, and transformations such as resizing or quality adjustments are correctly applied. &lt;/p&gt;

&lt;p&gt;You can compare the local file size with the optimized size, view the optimized format used for delivery, and check the percentage reduction to ensure optimal performance. And, you can see which transformations were applied to the delivered media, helping you verify that every asset meets your performance and quality standards directly from your site.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqtqa8m0erfmif3759of.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqtqa8m0erfmif3759of.png" alt="Monitor your media status" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enhanced Media Library
&lt;/h2&gt;

&lt;p&gt;The Cloudinary WordPress Plugin integrates Cloudinary as your central media management hub, offering features like bulk editing, AI-powered auto-tagging, metadata handling, and powerful search. The Cloudinary Media Library widget within WordPress lets you manage all your media files seamlessly. For instance, on your e-commerce site, you can upload product images to Cloudinary directly from WordPress and quickly find and place each product on the appropriate page.&lt;/p&gt;

&lt;p&gt;Non-WordPress users can also use Cloudinary’s Console to share media files, enhancing collaboration across teams and platforms. For example, designers can upload files to Cloudinary’s Console, making them instantly available in WordPress through the Media Library widget. This streamlines workflows and ensures all team members have access to the latest media.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsvr3ksmie6t2roinnu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsvr3ksmie6t2roinnu9.png" alt="Cloudinary Media Library" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Efficient Sync with WordPress CLI
&lt;/h2&gt;

&lt;p&gt;For large-scale operations, use the WordPress CLI to sync images via command line. This is ideal for extensive asset libraries. For example, if you’re migrating a vast collection of media files from a legacy site to your new WordPress site and need to sync thousands of images efficiently, using the CLI can streamline the process and save time.&lt;/p&gt;

&lt;p&gt;For more information, see &lt;a href="https://cloudinary.com/documentation/wordpress_developers#managing_media_sync_using_the_wp_cli" rel="noopener noreferrer"&gt;Managing media sync using the WP-CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elevate Your Media Management with Cloudinary
&lt;/h2&gt;

&lt;p&gt;Unlock the full potential of your WordPress site with the Cloudinary Plugin! Whether you choose to sync your images and videos automatically for seamless updates or manually sync for precise control, Cloudinary’s flexible storage and sync options help you streamline media management and save on WordPress storage. Don’t settle for less—enhance your site’s performance and efficiency today. Install the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; and transform the way you handle media. Start optimizing now!  &lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>mediafiles</category>
      <category>storage</category>
      <category>performance</category>
    </item>
    <item>
      <title>5 Ways To Enhance Your Images and Videos On WordPress</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Tue, 13 Aug 2024 21:26:54 +0000</pubDate>
      <link>https://dev.to/sharony/5-ways-to-enhance-your-images-and-videos-on-wordpress-lam</link>
      <guid>https://dev.to/sharony/5-ways-to-enhance-your-images-and-videos-on-wordpress-lam</guid>
      <description>&lt;p&gt;It's no secret that visuals are the heart of your website. Your images and videos pump life and energy, captivating visitors and keeping them coming back.&lt;/p&gt;

&lt;p&gt;Great visuals result in website success and increased sales. No doubt your images are carefully selected to fit your brand and captivate your audience. With the Cloudinary WordPress Plugin, the rest is automatic. You no longer have to worry about how a wide image will fit on mobile or allocate resources for personalizing 500 new product images and cropping them to fit the bounding box.&lt;/p&gt;

&lt;p&gt;The Cloudinary WordPress Plugin seamlessly integrates into your WordPress media library, posts, tags, and other functionalities, allowing you to easily enhance, retrieve and manage your visuals without changing your workflow. Additionally, the plugin offers numerous essential optimization features in a single, comprehensive image and video management solution, eliminating the need for separate plugins for each enhancement.&lt;/p&gt;

&lt;p&gt;Here are 5 ways to enhance the appearance of your images and videos on WordPress using the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary Plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  # 1 Crop Images and Videos with AI
&lt;/h2&gt;

&lt;p&gt;If you're dealing with a single image, manual cropping makes sense. But with hundreds of images, automation becomes essential--and sometimes comes out even better than the human touch. That's particularly true when cropping images and videos to focus on specific areas. Check out the results you can achieve using the Cloudinary WordPress Plugin AI automatic cropping feature:&lt;/p&gt;

&lt;p&gt;Here’s how to set cropping with AI in your Plugin’s Image settings. In the &lt;strong&gt;Additional image transformations&lt;/strong&gt; section of &lt;strong&gt;Image – Global Settings&lt;/strong&gt;, enter the automatic cropping and gravity parameters, &lt;code&gt;c_auto,g_auto&lt;/code&gt; along with the desired dimensions, in this case &lt;code&gt;w_600,h_600&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; For more cropping options, see &lt;a href="https://cloudinary.com/documentation/resizing_and_cropping" rel="noopener noreferrer"&gt;Image&lt;/a&gt; and &lt;a href="https://cloudinary.com/documentation/video_resizing_and_cropping" rel="noopener noreferrer"&gt;Video&lt;/a&gt; resizing and cropping.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb1neqflk47qhxe0whel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb1neqflk47qhxe0whel.png" alt="AI cropping" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now check out the results you can achieve using the Cloudinary WordPress Plugin AI automatic cropping feature:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image cropping:&lt;/strong&gt; This landscape image needs to fit a square bounding box. A standard center crop ruins the image. However, AI-powered cropping ensures a perfect crop that focuses on the essential areas. Moreover, AI face recognition cropping delivers a profile without unnecessary noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rnhldiw3lqiv3jnp71q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rnhldiw3lqiv3jnp71q.png" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Original&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftu6fkd02rr2mr1738mij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftu6fkd02rr2mr1738mij.png" alt="Cropped" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cropped: &lt;code&gt;c_crop,w_600,h_600&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p93hj9qxh9bgz24v02d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p93hj9qxh9bgz24v02d.png" alt="AI-powered crop" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI-powered crop: &lt;code&gt;c_auto,g_auto,w_600,h_600&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2iji3t5mncikwg7kx55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2iji3t5mncikwg7kx55.png" alt="AI-powered crop with face recognition" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI-powered crop with face recognition: &lt;code&gt;c_auto,b_face,w_600,h_600&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video cropping:&lt;/strong&gt; In this example, the same video needs to be landscape for desktops and portrait for mobile. Simply cropping a landscape video to portrait often results in losing focus on the main subject, in this case the dog, leaving much of the viewport empty. However, by applying AI to focus on the dog, we ensure that it remains in the viewport throughout the entire video. Watch it in action!&lt;/li&gt;
&lt;/ul&gt;


                
                Your browser does not support the video tag.
            

&lt;p&gt;Original&lt;/p&gt;


                
                Your browser does not support the video tag.
            
   

&lt;p&gt;Regular crop: &lt;code&gt;c_fill,h_400,w_244&lt;/code&gt;&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;p&gt;Crop with AI: &lt;code&gt;c_fill,g_auto:dog,h_400,w_244&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  # 2 Personalize Images and Videos
&lt;/h2&gt;

&lt;p&gt;Need to brand your visuals with watermarks? Looking to add some spice with special effects? Perhaps your videos need trimming, or your product image requires additional text? You can accomplish all that and more, with the flexibility to apply these modifications either site-wide or to specific files.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Video – Global Settings&lt;/strong&gt;, specify a transformation, in this case, &lt;code&gt;l_samples:logo/w_200,g_north_east,fl_layer_apply&lt;/code&gt; to add a watermark named “logo” from the “samples” folder of the Cloudinary Media Library, with a width or 200 pixels at the top left corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4pqh5g1wkzrznq6g5fe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm4pqh5g1wkzrznq6g5fe.png" alt="Video - Global Settings" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some examples:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw7g0z4vw9do87piaysu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiw7g0z4vw9do87piaysu.png" alt="Watermarked Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watermarked Image&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7zhe0bonq46batoak1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7zhe0bonq46batoak1i.png" alt="Zoompan Effect" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zoompan Effect&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbradlly43skuxkfv4saw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbradlly43skuxkfv4saw.png" alt="Background removal with drop shadow effect" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Background removal with drop shadow effect&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;p&gt;                                                              Video with image and text overlays&lt;/p&gt;

&lt;h2&gt;
  
  
  # 3 Customize Your Video Player
&lt;/h2&gt;

&lt;p&gt;When visitors scroll down the page, they might not notice a game-changing video you recently uploaded.&lt;/p&gt;

&lt;p&gt;You can use Cloudinary's top-notch HTML5 Video Player available via the Plugin to make your videos pop. For example, you can select to play the video automatically when it enters the viewport. In addition, you can hide video controls and play the video infinitely. These are just a few ways to enhance user engagement with this customizable video player.&lt;/p&gt;

&lt;p&gt;Monitor your usage using the Video Player metrics dashboard and watch your engagement increase.&lt;/p&gt;

&lt;p&gt;This is the settings page for customizing videos. Notice that, in addition to customizing the video player, you can brand your videos with watermarks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqus2joamsdxebwtonb4q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqus2joamsdxebwtonb4q.png" alt="Customizing videos" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a look at this example in action:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;h2&gt;
  
  
  # 4 Upgrade Your Product Gallery
&lt;/h2&gt;

&lt;p&gt;If your website is used for e-commerce, you undoubtedly showcase your product images within a gallery. As the essential method of conveying your product to visitors, the gallery you choose deserves careful consideration.&lt;/p&gt;

&lt;p&gt;Introducing the Cloudinary Product Gallery. This visually appealing feature includes a customizable slider, video support, 360-spin sets, augmented reality (AR), and a customizable zoom mode, making it ideal for enhancing specific product pages on WooCommerce stores.&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;h2&gt;
  
  
  # 5 Simplified management
&lt;/h2&gt;

&lt;p&gt;Finally, simplify the organization and management of your images and videos with Cloudinary's Media Library, seamlessly integrated directly within WordPress. Explore its advanced AI-powered features like auto-tagging and smart search capabilities, all presented through a user-friendly and intuitive interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypj9lnu67vthlvfb7pqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypj9lnu67vthlvfb7pqy.png" alt="Cloudinary WordPress Plugin Media Library" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  On Your Way to Enhanced Images and Videos
&lt;/h2&gt;

&lt;p&gt;The Cloudinary WordPress Plugin consolidates all these features into a single, easy-to-configure solution. With most functionalities available out of the box, it eliminates the need to juggle multiple plugins or manually optimize and manage your media assets. You’ll be able to monitor how these features impact your site’s performance from a centralized dashboard. And, for developers or advanced users, you can adjust the Plugin's functionality to your needs using a range of filters.&lt;/p&gt;

&lt;p&gt;Transform your WordPress site into a visual masterpiece with captivating images and videos. Start using the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; today to seamlessly enhance your media.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Watch a &lt;a href="https://www.youtube.com/watch?v=W5CpUWksq2s" rel="noopener noreferrer"&gt;quick setup video&lt;/a&gt; to get started enhancing your media assets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Feel free to share your thoughts with us on the &lt;a href="https://community.cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary Community Forum&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For more detailed information, visit the Cloudinary WordPress Plugin &lt;a href="https://cloudinary.com/documentation/wordpress_integration" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take the comprehensive &lt;a href="https://training.cloudinary.com/courses/introduction-to-cloudinary-for-wordpress-administrators-70-minute-course-zf3x" rel="noopener noreferrer"&gt;Introduction to Cloudinary for WordPress Administrators&lt;/a&gt; Cloudinary Academy course.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read about how the Cloudinary WordPress Plugin can &lt;a href="https://dev.to/sharony/6-ways-to-optimize-your-images-and-videos-on-wordpress-564k"&gt;optimize your images and videos&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can see this &lt;a href="https://cloudinary.com/blog/5-ways-enhance-images-videos-wordpress" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; on the Cloudinary site, as well.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>mediafiles</category>
      <category>ai</category>
    </item>
    <item>
      <title>6 Ways To Optimize Your Images and Videos On WordPress</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Thu, 08 Aug 2024 12:08:49 +0000</pubDate>
      <link>https://dev.to/sharony/6-ways-to-optimize-your-images-and-videos-on-wordpress-564k</link>
      <guid>https://dev.to/sharony/6-ways-to-optimize-your-images-and-videos-on-wordpress-564k</guid>
      <description>&lt;p&gt;If you're maximizing your website's potential, you're likely engaging visitors with lots of images and videos. While that's a real boon, it also comes with risks. If your website is heavy, your load times will be lengthy, and visitors won't necessarily have the patience to wait for your site to load before going elsewhere. Fast load times are not only crucial for user experience but also for improving search rankings--Google evaluates these metrics through Core Web Vitals, impacting your site's visibility and success.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; can help you achieve this. It seamlessly integrates into your WordPress media library, posts, tags, and other functionalities, allowing you to easily retrieve and manage your optimized visuals without changing your workflow. Additionally, the plugin offers numerous essential optimization features in a single, comprehensive image and video management solution, eliminating the need for separate plugins for each enhancement.&lt;/p&gt;

&lt;p&gt;To enrich your website with captivating visuals while keeping loading times to a minimum, optimize your images and videos on WordPress using just one efficient plugin. Keep reading to discover how.&lt;/p&gt;

&lt;h2&gt;
  
  
  #1 Optimize File Sizes
&lt;/h2&gt;

&lt;p&gt;You can reduce image and video sizes by activating Image optimization settings in the Cloudinary WordPress Plugin. This includes delivering images in the optimal format for each browser, automatically applying maximum compression without compromising visual quality, and resizing to avoid unnecessarily large dimensions. See how performant your website can become.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw8jbcnong67k8ptce8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw8jbcnong67k8ptce8v.png" alt="Image - Global Settings" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The size of this image was reduced from 147 KB to 27.8 KB:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dy7ldaansi9fgxh85kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dy7ldaansi9fgxh85kc.png" alt="Optimized image" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These settings are reflected in the image URL: &lt;strong&gt;f_auto&lt;/strong&gt; for automatic format, &lt;strong&gt;q_auto&lt;/strong&gt; for automatic quality and compression, and &lt;strong&gt;w_600&lt;/strong&gt; to reduce the width to 600 pixels.&lt;/li&gt;
&lt;li&gt;Click these links to open the &lt;a href="https://res.cloudinary.com/demo/image/upload/docs/model.jpg" rel="noopener noreferrer"&gt;original&lt;/a&gt; and &lt;a href="https://res.cloudinary.com/demo/image/upload/q_auto/f_auto/w_600/docs/model.jpg" rel="noopener noreferrer"&gt;optimized&lt;/a&gt; images in the browser.&lt;/li&gt;
&lt;li&gt;The original image is delivered as a JPG while the optimized one is delivered as an AVIF.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  # 2 Leverage Lazy Loading
&lt;/h2&gt;

&lt;p&gt;If you don't take action, your website will wait to render until all your visuals load. This can result in long wait times and unhappy visitors. The solution? Lazy loading. This technique allows your page to render immediately, while images load only when they enter the viewport.&lt;/p&gt;

&lt;p&gt;Watch this video to see lazy loading in action within the Plugin:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;p&gt;This is how lazy loading can look on your website:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;h2&gt;
  
  
  # 3 Render Responsive Images
&lt;/h2&gt;

&lt;p&gt;Most likely, you display the same images on your website for both desktop and mobile. While the design might be slightly modified—such as showing four images in a row on desktop and in a column on mobile—the images might also get smaller or larger depending on screen size. The Cloudinary WordPress Plugin implements this functionality for you automatically, adjusting image sizes based on need. Simply set the pixel distance at which a different image size will be displayed.&lt;/p&gt;

&lt;p&gt;Using responsive images ensures images are never delivered larger than necessary, saving bandwidth and speeding up loading times.&lt;/p&gt;

&lt;p&gt;See setting up responsive images with the Cloudinary WordPress Plugin:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;p&gt;Here's how responsive images can look on your website:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;h2&gt;
  
  
  # 4 Ensure Smooth Video Playback
&lt;/h2&gt;

&lt;p&gt;Let's say visitors are really enjoying a video when network conditions suddenly fluctuate. The video begins buffering, causing visitors to lose patience. Will they wait it out and finish watching? Maybe... but they also might lose interest and leave.&lt;/p&gt;

&lt;p&gt;You can avoid these scenarios by using Cloudinary's top-notch HTML5 Video Player available via the Plugin.&lt;/p&gt;

&lt;p&gt;Select your optimization method to ensure smooth playback. Progressive optimization ensures faster initial loading times and smoother playback from the start, while adaptive bitrate streaming automatically adjusts video quality in real-time based on network conditions, providing a seamless viewing experience throughout.&lt;/p&gt;

&lt;p&gt;Video Player metrics are provided within a user-friendly analytics dashboard.&lt;/p&gt;

&lt;p&gt;Here's what the video settings look like when selecting &lt;strong&gt;Adaptive bitrate streaming&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmxgv6emtcogoupasdqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmxgv6emtcogoupasdqu.png" alt="Adaptive bitrate streaming setup" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a Cloudinary video in action:&lt;/p&gt;


                
                Your browser does not support the video tag.
            

&lt;h2&gt;
  
  
  # 5 Enable SVGs
&lt;/h2&gt;

&lt;p&gt;The logos, icons and illustrations on your site shouldn't weigh it down because they can be delivered as light-weight SVGs. However, in order to have SVG support on your WordPress website, you need to enable the Cloudinary WordPress Plugin. Otherwise, you'll be serving resolution-independent images as PNGs or JPGs, which are several times larger than needed.&lt;/p&gt;

&lt;p&gt;Here's enabling SVG support within the plugin:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F222jkg9e6s7fu07eyv06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F222jkg9e6s7fu07eyv06.png" alt="Enabling SVG support" width="474" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's an example of a logo delivered as an SVG:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrh9qj8lv4q236y2lxwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrh9qj8lv4q236y2lxwl.png" width="471" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  # 6 Deliver via CDN
&lt;/h2&gt;

&lt;p&gt;Your website's most dedicated fans might be located halfway across the world. Consequently, they'll experience slower image and video loading times compared to someone nearby. Content Delivery Networks (CDNs) solve this issue by strategically placing servers worldwide to cache your media to optimize your images and videos on WordPress. This ensures that visitors from thousands of miles away are served as quickly as those next door. With the Cloudinary WordPress Plugin, your visuals are automatically delivered via CDN, optimizing global access and user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizing Your Visual Experience
&lt;/h2&gt;

&lt;p&gt;The Cloudinary WordPress Plugin consolidates all these features into a single, easy-to-configure solution. With most functionalities available out of the box, it eliminates the need to juggle multiple plugins or manually optimize and manage your media assets. You’ll be able to monitor how these features impact your site’s performance from a centralized dashboard. And, for developers or advanced users, you can adjust the Plugin's functionality to your needs using a range of filters.&lt;/p&gt;

&lt;p&gt;So, here's your ticket to a performant WordPress website, full of visually appealing images and videos. We invite you to get started right now with the &lt;a href="https://wordpress.org/plugins/cloudinary-image-management-and-manipulation-in-the-cloud-cdn/" rel="noopener noreferrer"&gt;Cloudinary WordPress Plugin&lt;/a&gt; to effortlessly optimize your images and videos on WordPress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Watch a quick &lt;a href="https://www.youtube.com/watch?v=W5CpUWksq2s" rel="noopener noreferrer"&gt;setup video&lt;/a&gt; to get started enhancing your media assets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Feel free to share your thoughts with us on the &lt;a href="https://community.cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary Community Forum&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For more detailed information, visit the Cloudinary WordPress Plugin &lt;a href="https://cloudinary.com/documentation/wordpress_integration" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take the comprehensive &lt;a href="https://training.cloudinary.com/courses/introduction-to-cloudinary-for-wordpress-administrators-70-minute-course-zf3x" rel="noopener noreferrer"&gt;Introduction to Cloudinary for WordPress Administrators&lt;/a&gt; Cloudinary Academy course.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read about how the Cloudinary WordPress Plugin can &lt;a href="https://dev.to/sharony/5-ways-to-enhance-your-images-and-videos-on-wordpress-lam"&gt;enhance the appearance of your images and videos&lt;/a&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can see this &lt;a href="https://cloudinary.com/blog/optimize-images-videos-wordpress" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; on the Cloudinary site, as well.&lt;/p&gt;

</description>
      <category>wordpress</category>
    </item>
    <item>
      <title>Build a Dynamic Photo Collection App With Django</title>
      <dc:creator>Sharon Yelenik</dc:creator>
      <pubDate>Mon, 15 Jul 2024 21:41:11 +0000</pubDate>
      <link>https://dev.to/cloudinary/build-a-dynamic-photo-collection-app-with-django-1ke2</link>
      <guid>https://dev.to/cloudinary/build-a-dynamic-photo-collection-app-with-django-1ke2</guid>
      <description>&lt;p&gt;Creating a dynamic photo collection app that spans different industries is an exciting opportunity in web development. These apps, also known as lookbooks, can be used in fields like fashion, real estate, and travel to showcase visual content effectively.&lt;/p&gt;

&lt;p&gt;Recently, I developed a comprehensive lookbook using Django and Cloudinary. You can get a thorough understanding of its functionalities by watching a video walkthrough and reading a detailed description. Additionally, we'll highlight some noteworthy features that developers may find intriguing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can fork the app from &lt;a href="https://github.com/ssyelenik/lookbook" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; to explore its capabilities firsthand and sign up for a free &lt;a href="//cloudinary.com/ip/sharony"&gt;Cloudinary&lt;/a&gt; account to get the app working. You can also watch a series of &lt;a href="https://youtu.be/QSIdpjN5sGc" rel="noopener noreferrer"&gt;YouTube videos&lt;/a&gt; that that focus on specific aspects of the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Description
&lt;/h2&gt;

&lt;p&gt;Here’s what the app offers:&lt;/p&gt;

&lt;h3&gt;
  
  
  Homepage Navigation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;View all lookbooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Filter lookbooks by the user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;See user profile pictures on their lookbooks.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ew6v9i7rppynxc42zer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ew6v9i7rppynxc42zer.png" alt="Homepage navigation features" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  User Account Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign up and log in to create a profile with a bio and profile picture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create, edit, and delete lookbooks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upload and customize images using Cloudinary.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74ynbbcznm01vrhut6hg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74ynbbcznm01vrhut6hg.png" alt="User account features" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Noteworthy Features
&lt;/h2&gt;

&lt;p&gt;This lookbook application integrates several advanced features for managing and displaying user-generated content. Below are some highlights that developers might find particularly interesting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrating Cloudinary for Image Management
&lt;/h3&gt;

&lt;p&gt;One of the standout features of this application is the integration of Cloudinary for managing images. Cloudinary's powerful image management, transformation and delivery capabilities make it an ideal choice for applications dealing with a lot of visual content. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CloudinaryField usage:&lt;/strong&gt;
&lt;p&gt;Using CloudinaryField in Django models simplifies image storage and management. It integrates seamlessly with Django's ORM and forms, and automatically uploads images to Cloudinary when the form is saved. (See Dynamic Form Handling.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# models.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cloudinary.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CloudinaryField&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Lookbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;overlay_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CloudinaryField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overlay_images&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transformations and overlays:&lt;/strong&gt;
&lt;p&gt;The application utilizes Cloudinary’s AI-powered capabilities to automatically enhance lookbook images. Users can customize their lookbooks by choosing image overlays, image orientation and border styling. AI paints out the images to fit the selected orientation, ensuring they’re displayed correctly without manual adjustments. These features are supported by utility functions designed for efficient image processing.&lt;/p&gt;
&lt;p&gt;In addition, when handling user-generated profile images, AI-based transformations optimize and uniformly crop and center the images, regardless of the original content.&lt;/p&gt;
&lt;p&gt;Here’s an example of an &lt;a href="http://res.cloudinary.com/yelenik/image/upload/admin" rel="noopener noreferrer"&gt;original&lt;/a&gt; and &lt;a href="http://res.cloudinary.com/yelenik/image/upload/c_auto,g_face,h_600,q_auto,w_600/admin" rel="noopener noreferrer"&gt;transformed&lt;/a&gt; profile picture, along with the code to generate it. Notice how the crop honors the face’s placement in the center.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Click the links to open the images in a browser tab and see their URLs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;profile_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CloudinaryImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;public_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;crop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gravity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;face&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6y7sud3v71zqwvsx10jr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6y7sud3v71zqwvsx10jr.png" alt="Profile image" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy retrieval and display:&lt;/strong&gt;
&lt;p&gt;Images stored in Cloudinary can be easily retrieved using their URLs, simplifying the process of displaying images in templates. For example, when displaying all images in a lookbook.&lt;/p&gt;
&lt;p&gt;When a user selects a lookbook to view, its ID is passed to the display function in the views.py file. The display function then retrieves a list of all images linked to that lookbook. The transformed delivery URLs of these images, stored in the Lookbook model, are sent to the template for rendering.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# views.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lookbook_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="n"&gt;lookbook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_object_or_404&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Lookbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lookbook_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;images&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;display.html&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photos&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lookbook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;photo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;photos&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gallery-col&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gallery-image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;Display&lt;/span&gt; &lt;span class="n"&gt;transformed&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{ photo.transformed_image }}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="n"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;img-fluid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gallery-overlay&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
             &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;Link&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
             &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{ photo.transformed_image }}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_blank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Click&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;View&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
   &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endfor&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability and reliability:&lt;/strong&gt; 
&lt;p&gt;Cloudinary handles large volumes of images and high traffic, providing a scalable solution that grows with your application. Its infrastructure ensures high availability and reliability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  User-Generated Content Management
&lt;/h3&gt;

&lt;p&gt;A focus in this app is user personalization and the ability for users to manage their own content. Here’s how that’s implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User associations:&lt;/strong&gt;
&lt;p&gt;Users are linked to their content using a ForeignKey relationship:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# models.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib.auth.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Lookbook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Profiles:&lt;/strong&gt;
&lt;p&gt;Another way user-generated content is personalized is through the integration of user profiles. Every user has a corresponding Profile that includes a bio and image. The profile is connected to its user and their lookbooks, enabling profile images to be displayed on the appropriate lookbooks. Here’s the code:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#models.py
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OneToOneField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;profile_picture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CloudinaryField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;profile_pictures&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;profile_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;URLField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://res.cloudinary.com/yelenik/image/upload/avatar&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;bio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;my_lookbooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ManyToManyField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Lookbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- templates/all_lookbooks.html --&amp;gt;&lt;/span&gt;

def __str__(self):
       return self.user.username
div class="row"&amp;gt;
   {% for lookbook in lookbooks %}
       &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"col-md-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card mb-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-body all"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                   &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"d-flex align-items-center mb-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                       &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"{{ lookbook.user.profile.profile_url }}"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"{{ lookbook.user.username }}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rounded-circle mr-2"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width: 40px; height: 40px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                       &lt;span class="nt"&gt;&amp;lt;h5&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mb-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ lookbook.user.username }}&lt;span class="nt"&gt;&amp;lt;/h5&amp;gt;&lt;/span&gt;
                   &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                   &lt;span class="nt"&gt;&amp;lt;h5&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ lookbook.title }}&lt;span class="nt"&gt;&amp;lt;/h5&amp;gt;&lt;/span&gt;
                   &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-text"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ lookbook.description }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
                   &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{% url 'display' lookbook.id %}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-primary card-btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;View&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
               &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
           &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   {% empty %}
       &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
           &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;No lookbooks found.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   {% endfor %}
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dynamic Form Handling
&lt;/h3&gt;

&lt;p&gt;Forms are essential for handling user inputs in any web application. This app uses LookbookForm and LookbookImageForm to manage lookbook creation and image uploads. These forms include custom save methods to handle specific logic, such as ensuring that image uploads are handled automatically via the CloudinaryImage field type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# forms.py
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LookbookForm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelForm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Lookbook&lt;/span&gt;
        &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overlay_image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utility Function for Image Processing
&lt;/h3&gt;

&lt;p&gt;Remember how users can customize lookbooks by choosing formatting options? Well, they can also update these customized lookbooks. This makes it crucial to handle the bulk of image-processing tasks within utility functions, ensuring the codebase remains maintainable and consistent.&lt;/p&gt;

&lt;p&gt;Functions like &lt;code&gt;generate_transformation_options&lt;/code&gt;, &lt;code&gt;get_public_id_from_url&lt;/code&gt;, and &lt;code&gt;create_transformed_url&lt;/code&gt; are reused within the application, ensuring consistency during both creation and editing processes. These functions use Cloudinary’s AI-based transformations to generate modified copies of lookbook images based on user choices and updates.&lt;/p&gt;

&lt;p&gt;Here’s an example of an &lt;a href="https://res.cloudinary.com/yelenik/image/upload/ppcscwrgelbgpolvipls" rel="noopener noreferrer"&gt;original&lt;/a&gt; and &lt;a href="https://res.cloudinary.com/yelenik/image/upload/b_gen_fill:ignore-foreground_true,c_pad,h_600,q_auto,w_800/fl_layer_apply,g_north_east,l_fashion_icon,o_80,w_100,x_20,y_20/c_scale,w_800/bo_10px_solid_red/ppcscwrgelbgpolvipls" rel="noopener noreferrer"&gt;transformed&lt;/a&gt; lookbook image, along with the code to generate it below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Click the links to open the images in a browser tab and see their URLs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsix0w5jyymvn4osrjwp9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsix0w5jyymvn4osrjwp9.png" alt="Lookbook image" width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# utils.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_transformation_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

   &lt;span class="c1"&gt;# Determine width and height based on orientation
&lt;/span&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;portrait&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
   &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;landscape&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;
   &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# square
&lt;/span&gt;       &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;

   &lt;span class="c1"&gt;# Initialize transformation list if not already present
&lt;/span&gt;   &lt;span class="n"&gt;transformation_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                    &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

   &lt;span class="c1"&gt;# Apply border style if border width is not '0px'
&lt;/span&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;border_width&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0px&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;border&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;border_width&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_solid_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;border_color&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

   &lt;span class="c1"&gt;# Define base transformation options
&lt;/span&gt;   &lt;span class="n"&gt;all_transformation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quality&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;height&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;crop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pad&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;background&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gen_fill:ignore-foreground_true&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;all_transformation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c1"&gt;# Apply overlay image if provided
&lt;/span&gt;   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;overlay_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;overlay_transformation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
           &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overlay&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;overlay_image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gravity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;north_east&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;flags&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;layer_apply&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;opacity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="p"&gt;]&lt;/span&gt;
       &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlay_transformation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c1"&gt;# Add scale transformation to make the width 800
&lt;/span&gt;   &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;transformation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;width&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;crop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scale&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;transformation_options&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_transformed_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;public_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CloudinaryImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;public_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;transformation_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Efficient Data Querying and Filtering
&lt;/h3&gt;

&lt;p&gt;Efficient data retrieval and filtering are vital for application performance. The lookbook app uses the Django ORM to fetch and filter lookbooks based on user selections. Take a look at the  all_lookbooks function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# views.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;all_lookbooks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;user_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user_ids&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;user_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;lookbooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Lookbook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user__id__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_lookbooks.html&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lookbooks&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lookbooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;users&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;selected_user_ids&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_ids&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Robust URL Routing
&lt;/h3&gt;

&lt;p&gt;A clear and intuitive URL routing scheme is essential for easy navigation within the application. The urls.py file defines clear URL patterns for accessing different views. In addition, it incorporates Django's built-in authentication views, simplifying user authentication management.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# urls.py
&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.urls&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;lookbook_app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;auth_views&lt;/span&gt;

&lt;span class="n"&gt;urlpatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;admin/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accounts/login/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoginView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_view&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;login&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accounts/logout/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LogoutView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_view&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logout&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;signup/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;signup&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;create_lookbook/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_lookbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;create_lookbook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;display/&amp;lt;int:lookbook_id&amp;gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;display&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;profile/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;profile&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my_lookbooks/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;my_lookbooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;my_lookbooks&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_lookbooks/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all_lookbooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_lookbooks&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all_lookbooks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_lookbooks&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;edit_lookbook/&amp;lt;int:lookbook_id&amp;gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edit_lookbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;edit_lookbook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This lookbook app demonstrates how Django and &lt;a href="//cloudinary.com/ip/sharony"&gt;Cloudinary&lt;/a&gt; can create a robust platform for user-generated content. With features like Cloudinary integration, dynamic forms, and efficient querying, this project is an excellent example for developers interested in advanced web application techniques. Explore the project in &lt;a href="https://github.com/ssyelenik/lookbook" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and see how you can enhance its functionality. Learn more about specific Photo Collection App features on &lt;a href="https://youtu.be/AjuhceU7Mk8" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cloudinary ❤️ developers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready to level up your media workflow? Start using Cloudinary for free and build better visual experiences today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 &lt;strong&gt;&lt;a href="https://cloudinary.com/users/register_free?utm_campaign=4870-&amp;amp;utm_medium=employee_referral&amp;amp;utm_source=dev-dot-to&amp;amp;utm_content=django-photo" rel="noopener noreferrer"&gt;Create your free account&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>django</category>
      <category>python</category>
      <category>appdev</category>
      <category>photoapp</category>
    </item>
  </channel>
</rss>
