<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:media="http://search.yahoo.com/mrss/">
<channel>
    <title>thucde.dev</title>
    <link>https://thucde.dev/en</link>
    <description>Dev blog and snippets by thucde.dev</description>
    <language>en</language>
    <lastBuildDate>Thu, 10 Sep 2026 00:57:46 GMT</lastBuildDate>
    <atom:link href="https://thucde.dev/en/feed.xml" rel="self" type="application/rss+xml" />
    <item>
        <title>Enamel Keepsake: Making Cloisonné Enamel &amp; Celebrating Netcompany&apos;s Workshop Culture</title>
        <link>https://thucde.dev/en/workshop-enamel-keepsake</link>
        <guid isPermaLink="true">https://thucde.dev/en/workshop-enamel-keepsake</guid>
        <pubDate>Tue, 18 Aug 2026 17:25:42 GMT</pubDate>
        <description>Highlights from the Enamel Keepsake (Cloisonné) workshop and a celebration of Netcompany&apos;s generous, all-inclusive After Dark workshop culture.</description>
        <content:encoded><![CDATA[<p>Highlights from the Enamel Keepsake (Cloisonné) workshop and a celebration of Netcompany's generous, all-inclusive After Dark workshop culture.</p>
<p>I have previously shared stories about the workshops I attended on my blog, but I feel compelled to introduce and "brag" about them once again — that these workshops are completely free, just one of the dozens of amazing perks my company, Netcompany, provides for its employees.

Truly a wonderful and inspiring company culture.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Workshop</category>
        <category>lam sac</category>
        <category>phap lam</category>
        <category>enamel keepsake</category>
        <category>workshop</category>
        <category>after dark</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787073225/thucde.dev/hsdmjkp9pndbpmjfjwy8.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787073225/thucde.dev/hsdmjkp9pndbpmjfjwy8.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787073225/thucde.dev/hsdmjkp9pndbpmjfjwy8.jpg" />
    </item>
    <item>
        <title>My first mobile application</title>
        <link>https://thucde.dev/en/my-first-mobile-application</link>
        <guid isPermaLink="true">https://thucde.dev/en/my-first-mobile-application</guid>
        <pubDate>Sun, 26 Jul 2026 17:20:29 GMT</pubDate>
        <description>I have successfully released my first mobile application on the App Store with virtually no prior experience</description>
        <content:encoded><![CDATA[<p>I have successfully released my first mobile application on the App Store with virtually no prior experience</p>
<p>From my perspective, a good idea only truly &amp;ldquo;becomes&amp;rdquo; something when it is packaged as a complete product &amp;mdash; something that can stand on its own, be used, and delivered to others.

That&amp;rsquo;s why I built StarK &amp;mdash; a mobile app to help groups of people split expenses and manage shared spending together. Today, StarK is officially live on the App Store, with Google Play currently in Closed Beta.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>mobile app</category>
        <category>react native</category>
        <category>code</category>
        <category>tech</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376189/thucde.dev/z0khilgvvjxtin8jszjj.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376189/thucde.dev/z0khilgvvjxtin8jszjj.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376189/thucde.dev/z0khilgvvjxtin8jszjj.jpg" />
    </item>
    <item>
        <title>Jesmonite Workshop with Tiem Nua Thuoc</title>
        <link>https://thucde.dev/en/workshop-jesmonite-cung-tiem-nua-thuoc</link>
        <guid isPermaLink="true">https://thucde.dev/en/workshop-jesmonite-cung-tiem-nua-thuoc</guid>
        <pubDate>Fri, 03 Jul 2026 09:52:35 GMT</pubDate>
        <description>Jesmonite Workshop - Moments at the Jesmonite workshop with Tiem Nua Thuoc - Making light bulb bases using Jesmonite material</description>
        <content:encoded><![CDATA[<p>Jesmonite Workshop - Moments at the Jesmonite workshop with Tiem Nua Thuoc - Making light bulb bases using Jesmonite material</p>
<p>It's been a long time since I last joined a workshop, for a few reasons, but mostly because from the end of last year to the beginning of this year, there were few indoor events :)) (plenty of outdoor ones though hahaaa)

Actually, there were a few at the beginning of this year but I couldn't sign up in time, and company events are always super super hot because every single one is top quality... praising it repeatedly feels redundant but it is what it is. The proof is that after going out and having fun, I even got some spoils of war: workshop products and souvenir photos... Enough talking.. let's get into it.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Workshop</category>
        <category>jesmonite workshop</category>
        <category>after dark</category>
        <category>light bulb</category>
        <category>workshop</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376462/thucde.dev/miz4rejcn7gdfmyi3muj.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376462/thucde.dev/miz4rejcn7gdfmyi3muj.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787376462/thucde.dev/miz4rejcn7gdfmyi3muj.jpg" />
    </item>
    <item>
        <title>This is not evolution. This is compression.</title>
        <link>https://thucde.dev/en/ai-loop-now</link>
        <guid isPermaLink="true">https://thucde.dev/en/ai-loop-now</guid>
        <pubDate>Fri, 03 Jul 2026 09:44:23 GMT</pubDate>
        <description>AI doesn&apos;t replace people who know how to work — it replaces the old way of working of those who refuse to evolve.</description>
        <content:encoded><![CDATA[<p>AI doesn't replace people who know how to work — it replaces the old way of working of those who refuse to evolve.</p>
<p>Homo sapiens appeared about 300,000 years ago.

Not until around 10,000 BCE did humans enter the agricultural era: knowing how to cultivate, breed livestock, settle down, and begin building stable communities.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>programming</category>
        <category>code</category>
        <category>tech</category>
        <category>AI</category>
        <category>technology</category>
        <enclosure url="https://res.cloudinary.com/katyperrycbt/image/upload/v1781241507/thucde.dev/x85o41stb9b1grgqiwhu.png" type="image/jpeg" length="0" />
        <media:content url="https://res.cloudinary.com/katyperrycbt/image/upload/v1781241507/thucde.dev/x85o41stb9b1grgqiwhu.png" medium="image" />
        <media:thumbnail url="https://res.cloudinary.com/katyperrycbt/image/upload/v1781241507/thucde.dev/x85o41stb9b1grgqiwhu.png" />
    </item>
    <item>
        <title>Thucde.dev now speaks two languages</title>
        <link>https://thucde.dev/en/thucde-dev-now-speaks-two-languages</link>
        <guid isPermaLink="true">https://thucde.dev/en/thucde-dev-now-speaks-two-languages</guid>
        <pubDate>Tue, 30 Jun 2026 17:52:29 GMT</pubDate>
        <description>A very real Thucde.dev upgrade: i18n, Next.js, TypeScript, SEO, RSS, sitemap, feedback, and a production journey with plot twists.</description>
        <content:encoded><![CDATA[<p>A very real Thucde.dev upgrade: i18n, Next.js, TypeScript, SEO, RSS, sitemap, feedback, and a production journey with plot twists.</p>
<p>Sometimes I start with something that sounds tiny, and somehow it turns into a whole renovation.

This time, it was Thucde.dev.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Blog</category>
        <category>thucde.dev</category>
        <category>blog</category>
        <category>i18n</category>
        <category>upgrade</category>
        <category>post</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787378735/thucde.dev/devlu3j1cwjk6akq6auy.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787378735/thucde.dev/devlu3j1cwjk6akq6auy.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787378735/thucde.dev/devlu3j1cwjk6akq6auy.jpg" />
    </item>
    <item>
        <title>thucde.dev changed more than it looks</title>
        <link>https://thucde.dev/en/thucde-dev-major-changes-june-2026</link>
        <guid isPermaLink="true">https://thucde.dev/en/thucde-dev-major-changes-june-2026</guid>
        <pubDate>Mon, 15 Jun 2026 17:38:26 GMT</pubDate>
        <description>thucde.dev isn’t just more polished: it has a cleaner frontend, stronger editor, better security, and a more reliable deploy flow.</description>
        <content:encoded><![CDATA[<p>thucde.dev isn’t just more polished: it has a cleaner frontend, stronger editor, better security, and a more reliable deploy flow.</p>
<p>If you only glance at the homepage or a couple of dashboard screens, the easy reaction is probably: “ Looks like some nice UI polish. ”

One of the biggest shifts is that the frontend no longer feels like a codebase living between two eras. Over just a few days, thucde.dev went through a pretty substantial set of changes:</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>thucde.dev</category>
        <category>Next.js 15</category>
        <category>TypeScript</category>
        <category>shadcn</category>
        <category>SWR</category>
        <category>Engineering</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406187/thucde.dev/mqhnrppulfbbm10vmv0u.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406187/thucde.dev/mqhnrppulfbbm10vmv0u.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406187/thucde.dev/mqhnrppulfbbm10vmv0u.jpg" />
    </item>
    <item>
        <title>Why does useEffect keep running even when dependencies don’t change?</title>
        <link>https://thucde.dev/en/why-does-useeffect-keep-running-even-when-dependencies</link>
        <guid isPermaLink="true">https://thucde.dev/en/why-does-useeffect-keep-running-even-when-dependencies</guid>
        <pubDate>Mon, 02 Mar 2026 17:03:01 GMT</pubDate>
        <description>Why does useEffect keep running even when values don’t change? (React explained)</description>
        <content:encoded><![CDATA[<p>Why does useEffect keep running even when values don’t change? (React explained)</p>
<p>There’s a subtle React bug many developers run into without realizing why.

Looks completely harmless.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>react</category>
        <category>reactjs</category>
        <category>code</category>
        <category>frontend</category>
        <category>dependencies</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377950/thucde.dev/ot37d18xaotygp2br86e.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377950/thucde.dev/ot37d18xaotygp2br86e.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377950/thucde.dev/ot37d18xaotygp2br86e.jpg" />
    </item>
    <item>
        <title>How to Fix Node.js &quot;Application Error&quot; on Azure when using GitHub Actions</title>
        <link>https://thucde.dev/en/fix-nodejs-application-error-on-azure-github-actions</link>
        <guid isPermaLink="true">https://thucde.dev/en/fix-nodejs-application-error-on-azure-github-actions</guid>
        <pubDate>Wed, 14 Jan 2026 04:10:15 GMT</pubDate>
        <description>Node.js app not working on Azure? The issue might be your start script. See how to override the startup command in GitHub Actions and fix it for good.</description>
        <content:encoded><![CDATA[<p>Node.js app not working on Azure? The issue might be your start script. See how to override the startup command in GitHub Actions and fix it for good.</p>
<p>I avoided using GitHub Actions to deploy Node.js apps to Azure for years. Why? Because I simply couldn't get them to work. I would see "Build Succeeded" and "Deployment Successful" messages, yet the actual application would crash immediately upon launch.

Today, I faced the same issue again. However, this time I had my AI companion to help debug. After several prompts and failed attempts, I finally found the root cause and a permanent fix. I’m sharing it here to save you the headache.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>programming</category>
        <category>code</category>
        <category>nodejs</category>
        <category>cloud</category>
        <category>deployment</category>
        <category>Azure</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379255/thucde.dev/dltg8lz25ierif5h71nr.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379255/thucde.dev/dltg8lz25ierif5h71nr.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379255/thucde.dev/dltg8lz25ierif5h71nr.jpg" />
    </item>
    <item>
        <title>reverse() in React can surprise you — here’s why (and how to fix it)</title>
        <link>https://thucde.dev/en/reverse-in-react-can-surprise-you</link>
        <guid isPermaLink="true">https://thucde.dev/en/reverse-in-react-can-surprise-you</guid>
        <pubDate>Thu, 21 Aug 2025 05:39:28 GMT</pubDate>
        <description>Array.prototype.reverse() mutates the original array. Inside a React render—especially Strict Mode—that can shuffle your UI. Here’s a safe pattern.</description>
        <content:encoded><![CDATA[<p>Array.prototype.reverse() mutates the original array. Inside a React render—especially Strict Mode—that can shuffle your UI. Here’s a safe pattern.</p>
<p>Array.prototype.reverse() mutates the original array. That’s fine in isolated scripts, but inside a React render it can lead to surprising UI, especially in React 18 Strict Mode (development) where React intentionally invokes render twice to surface side effects.

Consider a parent passing an array as props:</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>javascript</category>
        <category>reverse</category>
        <category>react</category>
        <category>code</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379618/thucde.dev/npythla5qusobul5fiv2.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379618/thucde.dev/npythla5qusobul5fiv2.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379618/thucde.dev/npythla5qusobul5fiv2.jpg" />
    </item>
    <item>
        <title>MongoDB returns results in different order each time, why?</title>
        <link>https://thucde.dev/en/mongodb-returns-results-in-different-order-each-time</link>
        <guid isPermaLink="true">https://thucde.dev/en/mongodb-returns-results-in-different-order-each-time</guid>
        <pubDate>Thu, 07 Aug 2025 04:30:51 GMT</pubDate>
        <description>Discover how MongoDB may return results in different order when sorting with sort(), and/or skip(), limit()</description>
        <content:encoded><![CDATA[<p>Discover how MongoDB may return results in different order when sorting with sort(), and/or skip(), limit()</p>
<p>I recently ran into an issue with MongoDB query that I took ~30 mins to figuring out - so I am sharing in case you are facing this at a time - because I didn't notice this, had this issue before even though I have been using MongoDB for a long time.

--</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>mongodb</category>
        <category>sort</category>
        <category>code</category>
        <category>mongoose</category>
        <category>database</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379775/thucde.dev/h8olbbkrcxdzxdu3ojv0.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379775/thucde.dev/h8olbbkrcxdzxdu3ojv0.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379775/thucde.dev/h8olbbkrcxdzxdu3ojv0.jpg" />
    </item>
    <item>
        <title>Authorize your requests to secured endpoints in Postman programmatically!</title>
        <link>https://thucde.dev/en/authorize-your-requests-to-secured-endpoints-in-postman</link>
        <guid isPermaLink="true">https://thucde.dev/en/authorize-your-requests-to-secured-endpoints-in-postman</guid>
        <pubDate>Sat, 12 Jul 2025 09:50:29 GMT</pubDate>
        <description>This script runs before the request, automatically updating your authorization token to ensure it&apos;s always valid.</description>
        <content:encoded><![CDATA[<p>This script runs before the request, automatically updating your authorization token to ensure it's always valid.</p>
<p>As a software engineer in web development, how usually have you been using Postman for testing API endpoints? In my case, I use it sometimes, but Postman is a very strong tool to play with the APIs.&amp;nbsp;

So, do you use secured endpoints that require some sort of authorization? How do you do on that?</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>postman</category>
        <category>authorization</category>
        <category>script</category>
        <category>code</category>
        <category>tech</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379807/thucde.dev/crhh2biswtgu87b1mdpn.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379807/thucde.dev/crhh2biswtgu87b1mdpn.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787379807/thucde.dev/crhh2biswtgu87b1mdpn.jpg" />
    </item>
    <item>
        <title>Developer Terminal Productivity: Setting up Aliases on macOS &amp; Windows</title>
        <link>https://thucde.dev/en/create-aliases-for-commands-on-macos</link>
        <guid isPermaLink="true">https://thucde.dev/en/create-aliases-for-commands-on-macos</guid>
        <pubDate>Sun, 15 Jun 2025 17:04:05 GMT</pubDate>
        <description>Learn how to create persistent command aliases on both macOS (Zsh/Bash) and Windows (PowerShell) to speed up your daily developer workflow.</description>
        <content:encoded><![CDATA[<p>Learn how to create persistent command aliases on both macOS (Zsh/Bash) and Windows (PowerShell) to speed up your daily developer workflow.</p>
<p>Typing repetitive terminal commands multiple times a day slows down your workflow. Setting up shell aliases allows you to turn lengthy commands like pnpm run dev or terraform init into quick 2-letter shortcuts like pn dev or tf init .

On macOS (default shell is Zsh) and Linux (Bash), aliases are stored in your user profile configuration file.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>macos</category>
        <category>alias</category>
        <category>short command</category>
        <category>code</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380199/thucde.dev/n8kxtq4gmgkfgsup7ujf.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380199/thucde.dev/n8kxtq4gmgkfgsup7ujf.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380199/thucde.dev/n8kxtq4gmgkfgsup7ujf.jpg" />
    </item>
    <item>
        <title>Dynamic Preview Image | Every URL Deserves a Beautiful Preview</title>
        <link>https://thucde.dev/en/dynamic-preview-image</link>
        <guid isPermaLink="true">https://thucde.dev/en/dynamic-preview-image</guid>
        <pubDate>Mon, 26 May 2025 17:08:24 GMT</pubDate>
        <description>Dynamic Open Graph images create beautiful, real-time preview cards for your links — designed to catch attention and increase engagement.</description>
        <content:encoded><![CDATA[<p>Dynamic Open Graph images create beautiful, real-time preview cards for your links — designed to catch attention and increase engagement.</p>
<p>You’ve Probably Seen Dynamic Images—You Just Didn’t Know It

You might have come across dynamic images before without realizing that’s what they were.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>programming</category>
        <category>preview image</category>
        <category>tech</category>
        <category>code</category>
        <category>UI/UX</category>
        <category>SEO</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380391/thucde.dev/buspdooc3qpynsxrhlqj.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380391/thucde.dev/buspdooc3qpynsxrhlqj.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380391/thucde.dev/buspdooc3qpynsxrhlqj.jpg" />
    </item>
    <item>
        <title>TypeScript + Google Places API (Text Search)</title>
        <link>https://thucde.dev/en/bypassing-the-outdated-sdk-typescript-google-places</link>
        <guid isPermaLink="true">https://thucde.dev/en/bypassing-the-outdated-sdk-typescript-google-places</guid>
        <pubDate>Sun, 25 May 2025 08:01:40 GMT</pubDate>
        <description>The official @googlemaps/places client lags behind Text Search. This walkthrough builds a small TypeScript wrapper against the current Places API.</description>
        <content:encoded><![CDATA[<p>The official @googlemaps/places client lags behind Text Search. This walkthrough builds a small TypeScript wrapper against the current Places API.</p>
<p>If you've used the @googlemaps/places Node.js client library recently, you may have noticed it’s not keeping up with the latest Google Places API features—particularly the Text Search endpoint. While it’s convenient to rely on official libraries, sometimes they lag behind the actual REST API (Web Service). That’s exactly what happened to me.

Rather than wait for updates or work around limitations, I decided to go straight to the source: the REST API&amp;nbsp;&amp;nbsp;(Web Service)&amp;nbsp;itself. In this post, I’ll show you how to build a TypeScript class that makes direct HTTP requests to the Google Places Text Search endpoint. By using REST, we get full access to the latest features, more control over the requests and responses, and a better understanding of how the API really works.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>google places api</category>
        <category>search text</category>
        <category>typescript</category>
        <category>code</category>
        <category>react</category>
        <enclosure url="https://res.cloudinary.com/katyperrycbt/image/upload/v1748157287/thucde.dev/yvrdapbcbxskxkrzdsv0.png" type="image/jpeg" length="0" />
        <media:content url="https://res.cloudinary.com/katyperrycbt/image/upload/v1748157287/thucde.dev/yvrdapbcbxskxkrzdsv0.png" medium="image" />
        <media:thumbnail url="https://res.cloudinary.com/katyperrycbt/image/upload/v1748157287/thucde.dev/yvrdapbcbxskxkrzdsv0.png" />
    </item>
    <item>
        <title>IndexedDB vs. localStorage: The Best Way to Store Large Data in the Browser</title>
        <link>https://thucde.dev/en/indexeddb-vs-localstorage-the-best-way-to-store-large</link>
        <guid isPermaLink="true">https://thucde.dev/en/indexeddb-vs-localstorage-the-best-way-to-store-large</guid>
        <pubDate>Sat, 19 Apr 2025 09:11:21 GMT</pubDate>
        <description>localStorage tops out around 5MB and only stores strings. IndexedDB is the better fit when you cache images or structured search results in the browser.</description>
        <content:encoded><![CDATA[<p>localStorage tops out around 5MB and only stores strings. IndexedDB is the better fit when you cache images or structured search results in the browser.</p>
<p>While working on a feature that caches image data for the user's last searches, I ran into a limitation: localStorage caps out at around 5MB (and only stores strings). Not ideal when you're dealing with images or structured data.

That’s when I turned to IndexedDB — the browser’s built-in, asynchronous, low-level NoSQL database.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>IndexedDB</category>
        <category>storage</category>
        <category>code</category>
        <category>front-end</category>
        <category>react</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380484/thucde.dev/wpj0pk1mvufeutbhsete.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380484/thucde.dev/wpj0pk1mvufeutbhsete.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380484/thucde.dev/wpj0pk1mvufeutbhsete.jpg" />
    </item>
    <item>
        <title>A solution that saves me a LOT of time - work smarter not harder</title>
        <link>https://thucde.dev/en/a-solution-that-saves-me-a-lot-of-time-work-smarter-not</link>
        <guid isPermaLink="true">https://thucde.dev/en/a-solution-that-saves-me-a-lot-of-time-work-smarter-not</guid>
        <pubDate>Fri, 14 Mar 2025 11:32:58 GMT</pubDate>
        <description>A repetitive, error-prone task ate half a day. Here’s the boring-but-effective shortcut I used so I didn’t keep doing the same click over and over.</description>
        <content:encoded><![CDATA[<p>A repetitive, error-prone task ate half a day. Here’s the boring-but-effective shortcut I used so I didn’t keep doing the same click over and over.</p>
<p>While I'm doing an extremely boring task, is not too complicated, but it repetitive and I have to do the same thing for many many of times. It took me a day to get half the work done. And it's... even prone to error .

I'm implementing a feature that would change the whole Help page of an application. It is estimated (by me) to have almost 6 mds (man-days) for all the changes needed.&amp;nbsp;</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Blog</category>
        <category>programming</category>
        <category>code</category>
        <category>advice</category>
        <category>life</category>
        <category>work</category>
        <category>Perspectives</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380565/thucde.dev/gu1ijbddyiwtotz9ygp9.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380565/thucde.dev/gu1ijbddyiwtotz9ygp9.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787380565/thucde.dev/gu1ijbddyiwtotz9ygp9.jpg" />
    </item>
    <item>
        <title>Use Lodash&apos;s debounce in React applications</title>
        <link>https://thucde.dev/en/use-lodashs-debounce-in-react-applications</link>
        <guid isPermaLink="true">https://thucde.dev/en/use-lodashs-debounce-in-react-applications</guid>
        <pubDate>Sun, 02 Mar 2025 10:23:59 GMT</pubDate>
        <description>Understanding useMemo, useCallback with debounce: Avoiding Unnecessary Function Re-Creations</description>
        <content:encoded><![CDATA[<p>Understanding useMemo, useCallback with debounce: Avoiding Unnecessary Function Re-Creations</p>
<p>In this short blog, you'll know how to use debounce lodash in React or Next.js applications.

When handling user input in React, especially in scenarios like search bars or real-time form validation, it's common to run a function every time the user types. However, this can lead to excessive function executions, causing performance issues and unnecessary re-renders.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>debounce</category>
        <category>lodash</category>
        <category>react</category>
        <category>code</category>
        <category>useCallback</category>
        <category>useMemo</category>
        <enclosure url="https://thucde.dev/api/og?pageName=Use%20Lodash&apos;s%20debounce%20in%20React%20applications" type="image/jpeg" length="0" />
        <media:content url="https://thucde.dev/api/og?pageName=Use%20Lodash&apos;s%20debounce%20in%20React%20applications" medium="image" />
        <media:thumbnail url="https://thucde.dev/api/og?pageName=Use%20Lodash&apos;s%20debounce%20in%20React%20applications" />
    </item>
    <item>
        <title>Ensuring You’re Always Getting the Latest Data from Browser Storage</title>
        <link>https://thucde.dev/en/getting-latest-data-from-the-browsers-storage</link>
        <guid isPermaLink="true">https://thucde.dev/en/getting-latest-data-from-the-browsers-storage</guid>
        <pubDate>Thu, 31 Oct 2024 08:08:56 GMT</pubDate>
        <description>Let&apos;s say, you&apos;re implementing a feature that functions based on the browser&apos;s storage, such as local storage or session storage.</description>
        <content:encoded><![CDATA[<p>Let's say, you're implementing a feature that functions based on the browser's storage, such as local storage or session storage.</p>
<p>Let's say, you're implementing a feature that functions based on the browser's storage, such as local storage &amp;nbsp;or session storage .

You manipulate the storage programmatically based on the feature's events and use that data in the storage to do something. However, you might run into an issue which you're not getting the correct storage data - in other words - you're getting outdated information.&amp;nbsp;</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>session storage</category>
        <category>local storage</category>
        <category>javascript</category>
        <category>code</category>
        <category>react</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406293/thucde.dev/lzv9psoxtgrf8bd4b73e.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406293/thucde.dev/lzv9psoxtgrf8bd4b73e.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787406293/thucde.dev/lzv9psoxtgrf8bd4b73e.jpg" />
    </item>
    <item>
        <title>How to implement a Markdown editor in React?</title>
        <link>https://thucde.dev/en/how-to-implement-a-markdown-editor-in-react</link>
        <guid isPermaLink="true">https://thucde.dev/en/how-to-implement-a-markdown-editor-in-react</guid>
        <pubDate>Fri, 09 Aug 2024 11:36:20 GMT</pubDate>
        <description>A practical React Markdown editor setup: what Markdown actually is, which libraries to reach for, and how to wire a live preview without fighting the tree.</description>
        <content:encoded><![CDATA[<p>A practical React Markdown editor setup: what Markdown actually is, which libraries to reach for, and how to wire a live preview without fighting the tree.</p>
<p>Markdown is a lightweight markup language used to format plain text. It was created by John Gruber in 2004 with the goal of making it easy for writers to create web content that is both human-readable in its raw form and easily converted into HTML.

ChatGPT -&amp;nbsp; "what is markdown"</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>markdown</category>
        <category>code</category>
        <category>tech</category>
        <category>next.js</category>
        <category>react</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787409825/thucde.dev/e46q9gpevegn9diwyjuo.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787409825/thucde.dev/e46q9gpevegn9diwyjuo.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787409825/thucde.dev/e46q9gpevegn9diwyjuo.jpg" />
    </item>
    <item>
        <title>Integrate Unsplash API to Next.js applications</title>
        <link>https://thucde.dev/en/integrate-unsplash-api-to-nextjs-applications</link>
        <guid isPermaLink="true">https://thucde.dev/en/integrate-unsplash-api-to-nextjs-applications</guid>
        <pubDate>Thu, 27 Jun 2024 10:56:21 GMT</pubDate>
        <description>Hook Unsplash’s free Developers API into a Next.js app so you can search and embed photos from your own UI, without leaving the product.</description>
        <content:encoded><![CDATA[<p>Hook Unsplash’s free Developers API into a Next.js app so you can search and embed photos from your own UI, without leaving the product.</p>
<p>If you're really into Unsplash community, like photography and have something to do with React/Next.js, you may, sometimes, wish to have Unsplash photos integrated into your products/applications.

Unsplash Developers API got your back! And it's FREE.&amp;nbsp;</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>unsplash</category>
        <category>photography</category>
        <category>next.js</category>
        <category>code</category>
        <category>technology</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500380/thucde.dev/nq2uudvrdf2mjbkaiu23.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500380/thucde.dev/nq2uudvrdf2mjbkaiu23.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500380/thucde.dev/nq2uudvrdf2mjbkaiu23.jpg" />
    </item>
    <item>
        <title>How to publish Next.js components to NPM</title>
        <link>https://thucde.dev/en/how-to-publish-nextjs-components-to-npm</link>
        <guid isPermaLink="true">https://thucde.dev/en/how-to-publish-nextjs-components-to-npm</guid>
        <pubDate>Thu, 27 Jun 2024 08:09:25 GMT</pubDate>
        <description>Have you ever been thinking about how to publish a React Component to a registry such as NPM so that it can be installed and used by several React applications?</description>
        <content:encoded><![CDATA[<p>Have you ever been thinking about how to publish a React Component to a registry such as NPM so that it can be installed and used by several React applications?</p>
<p>Have you ever been thinking about how to publish a React Component to a registry such as NPM so that it can be installed and used by several projects but don't know how?

I feel you, there were several attempts that I've been through this, but there was no luck. I was able to publish a component to NPM, but the component is not working properly.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>npm</category>
        <category>react</category>
        <category>next.js</category>
        <category>code</category>
        <category>technology</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500483/thucde.dev/l2xk3hprabxip4ls3ii5.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500483/thucde.dev/l2xk3hprabxip4ls3ii5.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500483/thucde.dev/l2xk3hprabxip4ls3ii5.jpg" />
    </item>
    <item>
        <title>How to use BlurHash strings in React, Next.js</title>
        <link>https://thucde.dev/en/how-to-use-blurhash-strings-in-react-n-nextjs</link>
        <guid isPermaLink="true">https://thucde.dev/en/how-to-use-blurhash-strings-in-react-n-nextjs</guid>
        <pubDate>Sat, 22 Jun 2024 16:51:43 GMT</pubDate>
        <description>BlurHash strings benefit the web performance. But it may not work if we don&apos;t know how to use them. Let me show you how.</description>
        <content:encoded><![CDATA[<p>BlurHash strings benefit the web performance. But it may not work if we don't know how to use them. Let me show you how.</p>
<p>While developing a new cool application, I figured out how to deal with BlurHash strings. If you have heard about this before, you may notice that passing the BlurHash string won't help with your image loadings. See below:

In this example, we fetch the image data from Unsplash, with then Unsplash returns an object with images (including a blur_hash string for each), this app then decodes those blur_hash strings into image data (in base64 format), then shows them immediately in prior to the real image that still being loaded.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>react</category>
        <category>code</category>
        <category>tips</category>
        <category>blurhash</category>
        <category>nextjs</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500582/thucde.dev/zxoedft1zqfrl7pmeqfi.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500582/thucde.dev/zxoedft1zqfrl7pmeqfi.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787500582/thucde.dev/zxoedft1zqfrl7pmeqfi.jpg" />
    </item>
    <item>
        <title>Fix React Strict Mode renders twice in development</title>
        <link>https://thucde.dev/en/fix-react-strict-mode-renders-twice-in-development</link>
        <guid isPermaLink="true">https://thucde.dev/en/fix-react-strict-mode-renders-twice-in-development</guid>
        <pubDate>Thu, 20 Jun 2024 04:07:13 GMT</pubDate>
        <description>React Strict Mode double-invokes render in development. If you need an action to run once without turning Strict Mode off, this is the escape hatch.</description>
        <content:encoded><![CDATA[<p>React Strict Mode double-invokes render in development. If you need an action to run once without turning Strict Mode off, this is the escape hatch.</p>
<p>If React Strict Mode in development gets you into trouble in some cases, for example, you need a specific action to run only just once, but also don't want to lose the benefits of running the app in Strict Mode, I'll show you a way out!

First, you may need to check whether the environment your app is running on, like so:</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>react</category>
        <category>strict mode</category>
        <category>code</category>
        <category>tech</category>
        <category>IT</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787501583/thucde.dev/sv37c8mefwxqgc3gaggf.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787501583/thucde.dev/sv37c8mefwxqgc3gaggf.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787501583/thucde.dev/sv37c8mefwxqgc3gaggf.jpg" />
    </item>
    <item>
        <title>Fix Husky Precommit issue on GitHub Desktop on Windows</title>
        <link>https://thucde.dev/en/fix-husky-precommit-issue-on-github-desktop-on-windows</link>
        <guid isPermaLink="true">https://thucde.dev/en/fix-husky-precommit-issue-on-github-desktop-on-windows</guid>
        <pubDate>Wed, 22 May 2024 04:41:40 GMT</pubDate>
        <description>Let&apos;s fix the Husky Git pre-commit hook failures on GitHub Desktop on Windows!</description>
        <content:encoded><![CDATA[<p>Let's fix the Husky Git pre-commit hook failures on GitHub Desktop on Windows!</p>
<p>Let's fix the Husky Git pre-commit hook failures on GitHub Desktop on Windows!

First, if you are facing the same issue as mine, please try the following steps:</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>git</category>
        <category>husky</category>
        <category>precommit</category>
        <category>tips</category>
        <category>code</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377267/thucde.dev/il0aiw1uylvmiqxpbqxg.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377267/thucde.dev/il0aiw1uylvmiqxpbqxg.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787377267/thucde.dev/il0aiw1uylvmiqxpbqxg.jpg" />
    </item>
    <item>
        <title>Timeout requests in JavaScript</title>
        <link>https://thucde.dev/en/timeout-requests-in-javascript</link>
        <guid isPermaLink="true">https://thucde.dev/en/timeout-requests-in-javascript</guid>
        <pubDate>Wed, 01 May 2024 08:28:08 GMT</pubDate>
        <description>While JS continuing to evolve, there are several built-in support methods that we can easily signal a timeout for a long-run request.</description>
        <content:encoded><![CDATA[<p>While JS continuing to evolve, there are several built-in support methods that we can easily signal a timeout for a long-run request.</p>
<p>Have you ever faced an issue that your webpage fails to finish a request due to backend crashing or it's too long to respond, and the app just waits for it - which seems to take forever.&amp;nbsp;

In JavaScript, from ES6 and later*, there is a built-in method that we can use to implement the timeout feature very easily, called Promise.race . Let me show you how.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>js</category>
        <category>code</category>
        <category>javascript</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787503814/thucde.dev/vvusayrggqcj2fkksi6e.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787503814/thucde.dev/vvusayrggqcj2fkksi6e.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787503814/thucde.dev/vvusayrggqcj2fkksi6e.jpg" />
    </item>
    <item>
        <title>Three common normal forms in a nutshell</title>
        <link>https://thucde.dev/en/three-common-normal-forms-in-a-nutshell</link>
        <guid isPermaLink="true">https://thucde.dev/en/three-common-normal-forms-in-a-nutshell</guid>
        <pubDate>Mon, 11 Mar 2024 11:54:27 GMT</pubDate>
        <description>1NF, 2NF, and 3NF in plain language: why database normalization exists, what each form actually requires, and when the extra effort pays off.</description>
        <content:encoded><![CDATA[<p>1NF, 2NF, and 3NF in plain language: why database normalization exists, what each form actually requires, and when the extra effort pays off.</p>
<p>Normalization is the process of converting a database design into a standard format. The conversion is done into a normal form - which is the standard of designing a database.

Designing database following the normalization could help with some benefits:</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>code</category>
        <category>design</category>
        <category>erd</category>
        <category>Database</category>
        <enclosure url="https://res.cloudinary.com/katyperrycbt/image/upload/v1710141052/thucde.dev/mxknc7ht1dudapawwxhh.png" type="image/jpeg" length="0" />
        <media:content url="https://res.cloudinary.com/katyperrycbt/image/upload/v1710141052/thucde.dev/mxknc7ht1dudapawwxhh.png" medium="image" />
        <media:thumbnail url="https://res.cloudinary.com/katyperrycbt/image/upload/v1710141052/thucde.dev/mxknc7ht1dudapawwxhh.png" />
    </item>
    <item>
        <title>New Year Update 2024 — a few photos</title>
        <link>https://thucde.dev/en/some-photos-from-the-new-year-update-2024</link>
        <guid isPermaLink="true">https://thucde.dev/en/some-photos-from-the-new-year-update-2024</guid>
        <pubDate>Fri, 23 Feb 2024 14:44:08 GMT</pubDate>
        <description>Company New Year Update 2024 at New World Saigon Hotel, then a District 3 beer garden. A short memory from that day.</description>
        <content:encoded><![CDATA[<p>Company New Year Update 2024 at New World Saigon Hotel, then a District 3 beer garden. A short memory from that day.</p>
<p>A short photo note from the company New Year Update 2024 — less of a dump, more of a day I wanted to keep.

We had the quarterly update at New World Saigon Hotel. Second time there that year. Looking back on progress, new initiatives, and what was coming next felt genuinely energizing.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Work</category>
        <category>company update</category>
        <category>work</category>
        <category>business</category>
        <category>new world hotel</category>
        <category>event</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541953/thucde.dev/qgsfylajmbh6hhxd4w2e.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541953/thucde.dev/qgsfylajmbh6hhxd4w2e.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541953/thucde.dev/qgsfylajmbh6hhxd4w2e.jpg" />
    </item>
    <item>
        <title>Optimize website performance with WebP and AVIF image formats</title>
        <link>https://thucde.dev/en/optimize-website-performance-with-webp-and-avif</link>
        <guid isPermaLink="true">https://thucde.dev/en/optimize-website-performance-with-webp-and-avif</guid>
        <pubDate>Thu, 22 Feb 2024 15:20:06 GMT</pubDate>
        <description>Slow hero images bounce visitors before they read anything. WebP and AVIF cut weight without looking crunchy—plus how to serve them from Next.js.</description>
        <content:encoded><![CDATA[<p>Slow hero images bounce visitors before they read anything. WebP and AVIF cut weight without looking crunchy—plus how to serve them from Next.js.</p>
<p>First impressions matter, especially online . For websites showcasing stunning visuals, ensuring lightning-fast image loading is paramount. Slow loading times can leave a lasting negative impact on potential visitors, driving them away before they even experience your content.

While techniques like lazy loading, CDNs, edge servers, caching, and precise image sizing are crucial, there's another often-overlooked&amp;nbsp;factor: image format .</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>programming</category>
        <category>images</category>
        <category>image optimization</category>
        <category>webp</category>
        <category>avif</category>
        <category>next.js</category>
        <category>seo</category>
        <category>performance</category>
        <category>SEO</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541978/thucde.dev/ydpiqlip0kz6gtynvqi3.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541978/thucde.dev/ydpiqlip0kz6gtynvqi3.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787541978/thucde.dev/ydpiqlip0kz6gtynvqi3.jpg" />
    </item>
    <item>
        <title>Fix duplicate files caused by case-insensitive naming</title>
        <link>https://thucde.dev/en/fix-duplicate-files-caused-by-case-insensitive-naming</link>
        <guid isPermaLink="true">https://thucde.dev/en/fix-duplicate-files-caused-by-case-insensitive-naming</guid>
        <pubDate>Thu, 22 Feb 2024 04:07:17 GMT</pubDate>
        <description>git mv -f still left two files that differ only by case. This is the Windows/macOS case-insensitive trap, and the sequence that actually fixes it.</description>
        <content:encoded><![CDATA[<p>git mv -f still left two files that differ only by case. This is the Windows/macOS case-insensitive trap, and the sequence that actually fixes it.</p>
<p>Have you ever faced the situation that even using git mv -force doesn't work. Or have you ever decided to rename a file or a folder just by changing letter's case and ran into an issue that git doesn't detect changes, or has two versions of the same changes, one for old name, one for new?&amp;nbsp;

If those cases don't work for you, maybe this blog would help, at least one more try.</p>]]></content:encoded>
        <author>Thức Trần</author>
        <category>Programming</category>
        <category>Git</category>
        <category>windows</category>
        <category>tech</category>
        <category>code</category>
        <category>tips</category>
        <enclosure url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787542020/thucde.dev/btliri6vb7b1qrg4ocgi.jpg" type="image/jpeg" length="0" />
        <media:content url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787542020/thucde.dev/btliri6vb7b1qrg4ocgi.jpg" medium="image" />
        <media:thumbnail url="http://res.cloudinary.com/katyperrycbt/image/upload/v1787542020/thucde.dev/btliri6vb7b1qrg4ocgi.jpg" />
    </item>
</channel>
</rss>