<?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: Seerat Awan</title>
    <description>The latest articles on DEV Community by Seerat Awan (@seeratawan01).</description>
    <link>https://dev.to/seeratawan01</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%2F462095%2F6dd89b6d-a406-438d-adb8-c9d82b60e68d.png</url>
      <title>DEV Community: Seerat Awan</title>
      <link>https://dev.to/seeratawan01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seeratawan01"/>
    <language>en</language>
    <item>
      <title>How to Deploy GitHub Org Repos to Vercel for Free (Bookmark This)</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Tue, 30 Dec 2025 05:10:11 +0000</pubDate>
      <link>https://dev.to/seeratawan01/how-to-deploy-github-org-repos-to-vercel-for-free-bookmark-this-1b18</link>
      <guid>https://dev.to/seeratawan01/how-to-deploy-github-org-repos-to-vercel-for-free-bookmark-this-1b18</guid>
      <description>&lt;p&gt;If you ever hit this error on Vercel:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Cannot deploy from private repository on GitHub organization... Upgrade to Pro"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bookmark this. You'll need it.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://capturable.io/blog/deploy-github-organization-vercel-hobby-free" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcapturable.io%2Fblog%2Fdeploy-github-organization-vercel-hobby-free%2Fopengraph-image%3Fd2a50d0364a0b81f" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://capturable.io/blog/deploy-github-organization-vercel-hobby-free" rel="noopener noreferrer" class="c-link"&gt;
            Deploy GitHub Organization Repo to Vercel Hobby Plan for Free (2026 Guide) | Capturable Blog
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Can't deploy your GitHub organization's private repo to Vercel's free Hobby plan? Here's the proven workaround using GitHub Actions to mirror your org repo to a personal repo and deploy for free.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcapturable.io%2Ffavicon.ico%3F14ca4bc9cce0bb07" width="48" height="48"&gt;
          capturable.io
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;5-minute fix using GitHub Actions. No $20/month Pro plan needed.&lt;/p&gt;

&lt;p&gt;You are welcome 😉&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>github</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Crafting Unforgettable Digital Experiences, One Project at a Time</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Tue, 09 Apr 2024 20:01:45 +0000</pubDate>
      <link>https://dev.to/seeratawan01/crafting-unforgettable-digital-experiences-one-project-at-a-time-47af</link>
      <guid>https://dev.to/seeratawan01/crafting-unforgettable-digital-experiences-one-project-at-a-time-47af</guid>
      <description>&lt;p&gt;I'm Seerat Awan, a front-end development expert committed to delivering exceptional user experiences. &lt;/p&gt;

&lt;p&gt;Read about how I can unlock your project's full potential: &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.seeratawan.me/blog/hire-the-best-front-end-developer/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ItmJt-d2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://seeratawan.me/_astro/hire-the-best-front-end-developer.e092e44c.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.seeratawan.me/blog/hire-the-best-front-end-developer/" rel="noopener noreferrer" class="c-link"&gt;
          Hire the best Front-End developer: Unlock Next-Level User Experiences — Seerat Awan
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          As a seasoned Full-Stack Engineer, I, Seerat Awan, specialize in building exceptional SaaS platforms that deliver unparalleled user experiences. With over 8 years of expertise, I am the ideal partner to elevate your project's front-end and drive lasting success.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ducsrmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.seeratawan.me/favicon-32x32.png" width="32" height="32"&gt;
        seeratawan.me
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
      <category>hiring</category>
    </item>
    <item>
      <title>React Custom Hook: useDidMountEffect</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Sun, 31 Mar 2024 16:19:27 +0000</pubDate>
      <link>https://dev.to/seeratawan01/react-custom-hook-usedidmounteffect-86c</link>
      <guid>https://dev.to/seeratawan01/react-custom-hook-usedidmounteffect-86c</guid>
      <description>&lt;p&gt;In React development, managing side effects is crucial to building efficient and responsive applications. While the built-in use effect hook is a powerful tool for handling side effects, there are cases where you may want to skip the effect during the initial render and only execute it on subsequent updates based on specific dependencies.&lt;/p&gt;

&lt;p&gt;This is where the &lt;strong&gt;useDidMountEffect&lt;/strong&gt; hook comes into play. This custom hook is designed to provide precise control over when side effects are executed, helping you optimize your React components and improve their performance.&lt;/p&gt;

&lt;p&gt;Find out how to create it through this comprehensive guide -&amp;gt; &lt;a href="https://www.seeratawan.me/blog/react-custom-hook-use-did-mount-effect/"&gt;https://www.seeratawan.me/blog/react-custom-hook-use-did-mount-effect/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cross-Domain Tracking Implementation</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Thu, 15 Feb 2024 07:33:55 +0000</pubDate>
      <link>https://dev.to/seeratawan01/cross-domain-tracking-implementation-22ob</link>
      <guid>https://dev.to/seeratawan01/cross-domain-tracking-implementation-22ob</guid>
      <description>&lt;p&gt;At Usermaven, I built a seamless way to track users across domains without extra implementation work. Read on to learn how I designed and implemented it.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.seeratawan.me/blog/how-i-implemented-cross-domain-tracking-at-usermaven/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--R8CovVH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://seeratawan.me/_astro/cross-domain-tracking-at-usermaven.89c34763.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.seeratawan.me/blog/how-i-implemented-cross-domain-tracking-at-usermaven/" rel="noopener noreferrer" class="c-link"&gt;
          How I Implemented Cross-Domain Tracking at Usermaven — Seerat Awan
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Learn how I designed and built a transparent cross-domain tracking solution at Usermaven to connect user data across multiple websites.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ducsrmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.seeratawan.me/favicon-32x32.png" width="32" height="32"&gt;
        seeratawan.me
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>analytics</category>
      <category>coding</category>
      <category>javascript</category>
      <category>cookies</category>
    </item>
    <item>
      <title>Lazy Load Fonts in Next.js with Web Components</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Mon, 08 Jan 2024 20:56:05 +0000</pubDate>
      <link>https://dev.to/seeratawan01/lazy-load-fonts-in-nextjs-with-web-components-54cd</link>
      <guid>https://dev.to/seeratawan01/lazy-load-fonts-in-nextjs-with-web-components-54cd</guid>
      <description>&lt;p&gt;As a developer and co-founder of &lt;a href="https://postnitro.ai"&gt;Postnitro.ai&lt;/a&gt;, I've tackled numerous performance hurdles. &lt;/p&gt;

&lt;p&gt;One solution I'm really proud of is the creation of a custom web component &lt;code&gt;&amp;lt;font-previewer&amp;gt;&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Learn how I revolutionized font-loading in Next.js in my latest blog post!&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.seeratawan.me/blog/lazy-load-fonts-in-nextjs-with-web-components/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--i2s1Dx-f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://seeratawan.me/_astro/lazy-load-fonts-nextjs-webcomponents.3f3df826.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.seeratawan.me/blog/lazy-load-fonts-in-nextjs-with-web-components/" rel="noopener noreferrer" class="c-link"&gt;
          Lazy Load Fonts in Next.js with Web Components — Seerat Awan
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Learn to lazy load fonts in Next.js by building a custom web component with TypeScript. Conditionally loading fonts improves performance by preventing massive files from being served to all.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ducsrmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.seeratawan.me/favicon-32x32.png" width="32" height="32"&gt;
        seeratawan.me
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Postnitro.ai has officially launched on Product Hunt! 🚀</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Mon, 20 Nov 2023 11:44:27 +0000</pubDate>
      <link>https://dev.to/seeratawan01/postnitroai-has-officially-launched-on-product-hunt-1ema</link>
      <guid>https://dev.to/seeratawan01/postnitroai-has-officially-launched-on-product-hunt-1ema</guid>
      <description>&lt;p&gt;We're thrilled to announce that &lt;a href="//Postnitro.ai"&gt;Postnitro.ai&lt;/a&gt; has officially launched on Product Hunt! 🚀&lt;/p&gt;

&lt;p&gt;PostNitro 🎉🎉 helps you create carousels for social media in minutes using AI. &lt;/p&gt;

&lt;p&gt;It's been an amazing journey creating this tool, and we're so excited to share it with the Product Hunt community. &lt;/p&gt;

&lt;p&gt;If you get a chance, we'd hugely appreciate your upvote on our Product Hunt page: &lt;a href="https://www.producthunt.com/posts/postnitro-ai"&gt;https://www.producthunt.com/posts/postnitro-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This launch means the world to our small but dedicated team. Please show your support by checking out Postnitro on Product Hunt and sharing with fellow creators!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>AI-Powered Carousel Maker - Create Carousels 10x Faster</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Fri, 06 Oct 2023 19:18:17 +0000</pubDate>
      <link>https://dev.to/seeratawan01/ai-powered-carousel-maker-create-carousels-10x-faster-4n1b</link>
      <guid>https://dev.to/seeratawan01/ai-powered-carousel-maker-create-carousels-10x-faster-4n1b</guid>
      <description>&lt;p&gt;I'm so pumped to tell you about &lt;a href="https://postnitro.ai/"&gt;Postnitro.ai&lt;/a&gt; - the AI carousel maker we built that creates stunning carousels in minutes.&lt;/p&gt;

&lt;p&gt;All you do is enter a topic and Postnitro generates eye-catching carousels with optimized copy and branding tailored to you.&lt;/p&gt;

&lt;p&gt;I'm not &lt;u&gt;exaggerating&lt;/u&gt; when I say this AI is insanely fast and accurate. With Postnitro, anyone can create beautiful, high-converting carousels in under 5 minutes with zero design skills.&lt;/p&gt;

&lt;p&gt;And since we built Postnitro to leverage the latest AI models, you can produce unlimited top-notch carousels at scale for &lt;strong&gt;free&lt;/strong&gt;, customized to your brand and audience.&lt;/p&gt;

&lt;p&gt;If you want a smarter, faster way to make carousel content that works on social media, you need to try Postnitro today. I'm really proud of the AI carousel maker I created and know it can take your marketing to the next level.&lt;/p&gt;

&lt;p&gt;Let me know what you think once you see my AI in action! I'm confident Postnitro will blow you away just as much as it continues to amaze me each day. The future is here!&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://postnitro.ai/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--fnd-RIBN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://postnitro.ai/images/og/postnitro-homepage-facebook.png" height="420" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://postnitro.ai/" rel="noopener noreferrer" class="c-link"&gt;
          Free Carousel Maker And Generator - Postnitro
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Best and fastest way to create a carousel for your LinkedIn, Instagram and TikTok
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
        postnitro.ai
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>linkedin</category>
      <category>socialmedia</category>
      <category>marketing</category>
      <category>design</category>
    </item>
    <item>
      <title>Automating Fonts Previews with Python and Pillow</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Sat, 12 Aug 2023 12:27:51 +0000</pubDate>
      <link>https://dev.to/seeratawan01/automating-fonts-previews-with-python-and-pillow-3b2h</link>
      <guid>https://dev.to/seeratawan01/automating-fonts-previews-with-python-and-pillow-3b2h</guid>
      <description>&lt;p&gt;Selecting fonts from lists is a pain when you cant visualize how they'll look. Thats why I wrote a Python script using Pillow to auto-generate font previews.&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;# we're importing the needed libraries
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageFont&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;io&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BytesIO&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="c1"&gt;# open fonts.json file to load fonts
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'fonts.json'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fonts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# set directory for font previews
&lt;/span&gt;&lt;span class="n"&gt;outdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'./font_previews'&lt;/span&gt;

&lt;span class="c1"&gt;# creates previews directory if it doesn't exist
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&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="c1"&gt;# for each font in the fonts list, it will attempt the following:
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# downloads the font file from the URL provided in the font list
&lt;/span&gt;        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# create a bytesIO object with downloaded font. This object behaves like a file object.
&lt;/span&gt;        &lt;span class="n"&gt;font_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BytesIO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# if the response from the server is not successful (status code 200),
&lt;/span&gt;        &lt;span class="c1"&gt;# it will print a message and will skip the rest of the loop for the current font
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"Skipping font &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'postscript_name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; due to unsuccessful download from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="c1"&gt;# creates a new image with white background
&lt;/span&gt;        &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'RGB'&lt;/span&gt;&lt;span class="p"&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="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'white'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# we can now do drawing operations on this opened image
&lt;/span&gt;        &lt;span class="n"&gt;draw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageDraw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# loads the downloaded font file to be later used on the image
&lt;/span&gt;        &lt;span class="n"&gt;loadfont&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;truetype&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;font_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# calculates size in pixels of the font family string
&lt;/span&gt;        &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;textbbox&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'family'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;loadfont&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lower&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;upper&lt;/span&gt;

        &lt;span class="c1"&gt;# calculates the center position in the image for our string to be placed
&lt;/span&gt;        &lt;span class="n"&gt;text_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;img&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="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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="n"&gt;img&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="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# places the text (the font family string) at the calculated position
&lt;/span&gt;        &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text_pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'family'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'black'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;loadfont&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# sets the output filename
&lt;/span&gt;        &lt;span class="n"&gt;outfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'postscript_name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;'.png'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# and saves the image in a PNG format
&lt;/span&gt;        &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# notifies by printing
&lt;/span&gt;        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"Saved &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;outfile&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# handles exceptions during font handling, notifies about the error.
&lt;/span&gt;        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"An error occurred with font &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'postscript_name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read the full article here: &lt;a href="https://www.seeratawan.me/blog/generating-font-previews-with-python-pillow-for-enhanced-ux/"&gt;https://www.seeratawan.me/blog/generating-font-previews-with-python-pillow-for-enhanced-ux/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ux</category>
      <category>automation</category>
      <category>programming</category>
    </item>
    <item>
      <title>Unlock Innovation: How to Rewire Your Brain for Out-of-the-Box Thinking</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Mon, 31 Jul 2023 05:21:32 +0000</pubDate>
      <link>https://dev.to/seeratawan01/unlock-innovation-how-to-rewire-your-brain-for-out-of-the-box-thinking-172b</link>
      <guid>https://dev.to/seeratawan01/unlock-innovation-how-to-rewire-your-brain-for-out-of-the-box-thinking-172b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Challenge assumptions, disrupt routines, and stimulate creativity using the B.R.A.I.N. framework.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.seeratawan.me/blog/unlock-innovation-how-to-rewire-your-brain-for-out-of-the-box-thinking/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--XOHzv_Fu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://seeratawan.me/_astro/unlock-innovation.01363399.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.seeratawan.me/blog/unlock-innovation-how-to-rewire-your-brain-for-out-of-the-box-thinking/" rel="noopener noreferrer" class="c-link"&gt;
          Unlock Innovation - How to Rewire Your Brain for Out-of-the-Box Thinking — Seerat Awan
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Discover techniques based on neuroscience and cognitive research to purposefully disrupt habitual thinking and spark creative insights. The B.R.A.I.N. framework shows how breaking patterns, restricting choices, analyzing assumptions, inspiring novelty, and napping can reshape neural connections for innovative thinking.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ducsrmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.seeratawan.me/favicon-32x32.png" width="32" height="32"&gt;
        seeratawan.me
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>thinking</category>
      <category>innovation</category>
      <category>creativity</category>
      <category>psychology</category>
    </item>
    <item>
      <title>Why I Move from Pixels (px) to Relative Units (rem) in CSS</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Mon, 31 Jul 2023 05:17:22 +0000</pubDate>
      <link>https://dev.to/seeratawan01/why-i-move-from-pixels-px-to-relative-units-rem-in-css-1jhb</link>
      <guid>https://dev.to/seeratawan01/why-i-move-from-pixels-px-to-relative-units-rem-in-css-1jhb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Switching from pixels to relative CSS units like rems improves accessibility, responsiveness, and maintenance of sites over time.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.seeratawan.me/blog/why-you-should-move-from-px-to-rem-in-css/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--_SbVIbkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://seeratawan.me/_astro/px-to-rem-in-css.79139ee1.png" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.seeratawan.me/blog/why-you-should-move-from-px-to-rem-in-css/" rel="noopener noreferrer" class="c-link"&gt;
          Why You Should Move from Pixels (px) to Relative Units (rem) in CSS — Seerat Awan
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          An in-depth guide on why you should move from using pixels (px) to relative units like rems for sizing elements in CSS. Details the benefits of fluid relative units for responsiveness, accessibility, and maintaining sites over time.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ducsrmY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.seeratawan.me/favicon-32x32.png" width="32" height="32"&gt;
        seeratawan.me
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>css</category>
      <category>a11y</category>
      <category>webdev</category>
      <category>responsiveness</category>
    </item>
    <item>
      <title>🚀 Check out useReducer!</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Sun, 12 Mar 2023 16:10:16 +0000</pubDate>
      <link>https://dev.to/seeratawan01/check-out-usereducer-1ba3</link>
      <guid>https://dev.to/seeratawan01/check-out-usereducer-1ba3</guid>
      <description>&lt;p&gt;Are you tired of using multiple useState hooks to manage your state in React?&lt;/p&gt;

&lt;p&gt;🚀 Check out useReducer!&lt;/p&gt;

&lt;p&gt;🙌 With useReducer, you can manage multiple states in your components without creating a bunch of useState hooks. By passing a reducer function and an initial state to the hook, you can easily update your state with the dispatch function.&lt;/p&gt;

&lt;p&gt;👀 And the best part? useReducer is a lightweight solution that doesn't require any additional libraries or complex configurations.&lt;/p&gt;

&lt;p&gt;💡 So, next time you find yourself creating multiple useState hooks to manage your state, try out useReducer instead. It's a simple and effective way to streamline your state management in React.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--msxWLc6I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ugsbs4csb193wkj9w5b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--msxWLc6I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ugsbs4csb193wkj9w5b7.png" alt="Code Snippit" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>codequality</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cool library that I recently discovered: Zag.js</title>
      <dc:creator>Seerat Awan</dc:creator>
      <pubDate>Sun, 05 Mar 2023 15:31:04 +0000</pubDate>
      <link>https://dev.to/seeratawan01/cool-library-that-i-recently-discovered-zagjs-m05</link>
      <guid>https://dev.to/seeratawan01/cool-library-that-i-recently-discovered-zagjs-m05</guid>
      <description>&lt;p&gt;Today, I want to share with you a cool library that I recently discovered: Zag.js! 🎉&lt;/p&gt;

&lt;p&gt;🌟 Zag.js is framework-agnostic, which means you can use it with popular frameworks like React, Solid, and Vue, and more without sweating over the logic. With Zag.js, you can focus on creating visually stunning UI components and let the toolkit handle the rest.&lt;/p&gt;

&lt;p&gt;💻 This library is perfect for those who need to build custom UI components while minimizing the time spent reinventing the wheel by writing state logic from scratch.&lt;/p&gt;

&lt;p&gt;📚 Whether you're building menus, accordions, dialogs, or any other UI component, Zag.js provides a wealth of pre-built state machines to choose from. You can find a complete list of available state machines in their documentation.&lt;/p&gt;

&lt;p&gt;👨‍💻I highly recommend giving Zag.js a try. It's an excellent choice for building custom UI components in your web applications while ensuring accessibility, and it works with many frameworks!&lt;/p&gt;

&lt;p&gt;🔗 Head over to &lt;a href="https://zagjs.com/"&gt;https://zagjs.com/&lt;/a&gt; to learn more about Zag.js and get started with building accessible UI components in your web applications!&lt;/p&gt;

</description>
      <category>react</category>
      <category>vue</category>
      <category>solidjs</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
