<?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>Forem: Paul</title>
    <description>The latest articles on Forem by Paul (@paul_freeman).</description>
    <link>https://forem.com/paul_freeman</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%2F1672505%2Ffcc02484-f159-4dac-a949-3444807ab84d.png</url>
      <title>Forem: Paul</title>
      <link>https://forem.com/paul_freeman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/paul_freeman"/>
    <language>en</language>
    <item>
      <title>I published my first Desktop App after 6 months of work — Everything I learnt</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Tue, 24 Jun 2025 10:00:16 +0000</pubDate>
      <link>https://forem.com/paul_freeman/i-published-my-first-desktop-app-after-6-months-of-work-everything-i-learnt-34m0</link>
      <guid>https://forem.com/paul_freeman/i-published-my-first-desktop-app-after-6-months-of-work-everything-i-learnt-34m0</guid>
      <description>&lt;p&gt;So, Python being among the most used Programming Language, by both professionals as well as hobbyist. From basic projects to large scale LLMs use Python&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%2Fwdpapufyw2445x9775yf.gif" 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%2Fwdpapufyw2445x9775yf.gif" alt="Python"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Something that always makes your project look professional is a GUI,but learning GUI especially if you never had past experience creating GUIs can be difficult.&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%2Fce14yprod2h77o5cdnbc.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%2Fce14yprod2h77o5cdnbc.png" alt="Python GUIs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I spent months working on &lt;a href="https://about.pyuibuilder.com" rel="noopener noreferrer"&gt;PyUIBuilder&lt;/a&gt;, so it’s easier for Python Developers to develop Python GUIs easily.&lt;/p&gt;

&lt;p&gt;I started by writing down the requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should be accessible in both web and Desktop version.&lt;/li&gt;
&lt;li&gt;Should be able to export clean, readable, python Code for the framework/library.&lt;/li&gt;
&lt;li&gt;Users should be able easily switch between multiple GUI libraries, such as tkinter, customtk etc.&lt;/li&gt;
&lt;li&gt;It should support 3rd party widgets, like Calendar, Clock etc.&lt;/li&gt;
&lt;li&gt;It should support layout managers and have an inbuilt code-editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These were some of my primary requirements.&lt;/p&gt;

&lt;p&gt;Since I wanted it to be accessible on both web as well as on Desktop, I decided to go with Javascript and use React library to speed things up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Months spent…
&lt;/h2&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%2Fno6mg030f6jz8cuuloye.gif" 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%2Fno6mg030f6jz8cuuloye.gif" alt="several months"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the first month, I only worked on a prototype, built the overall workspace, my first version didn’t include a code editor, Desktop app or templates. I focused primarily on just building a small working demo, and shared my project on Reddit. After a successfully sharing my project on Reddit, I gained interest of quite a number of python developers.&lt;/p&gt;

&lt;p&gt;For the second month, I focused on fixing the layout manager for tkinter. If you have worked with tkinter you’d know it’s a bit different from the rest of the frameworks/libraries, you’ve worked with, especially pack manager. This one really took me a long time to figure out. You can refer this great video on Tkinter Layout manager&lt;/p&gt;

&lt;p&gt;The next few months, I spent on fixing bugs and adding more features to the web app, until this point there was no Desktop app.&lt;/p&gt;

&lt;p&gt;On the web version you had to export code every time and run in manually to see your GUI in action, but a live preview would eliminate such requirement and help debug faster&lt;/p&gt;

&lt;h2&gt;
  
  
  The Desktop App
&lt;/h2&gt;

&lt;p&gt;Now Desktop app was necessary as you can’t really run python on the webbrowser unless you load some big library which would eventually slow down the load time.&lt;/p&gt;

&lt;p&gt;So, my obvious choice was to go with Electronjs as it has a large community around it and I didn’t have to rewrite the entire thing from scratch. I added a live preview feature, so users can easily preview it without having to manually export code and test it.&lt;/p&gt;

&lt;p&gt;Building and compiling for different OS&lt;br&gt;
Now, I work on a linux laptop, so I don’t have windows or MacOs for that matter. To make it work for different OS, you generally have to compile it on that specific OS. Suppose you intend to release for Mac, you need to complie on a Mac machine.&lt;/p&gt;
&lt;h2&gt;
  
  
  Github Actions
&lt;/h2&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%2Fod732wkardd5xpnr269i.gif" 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%2Fod732wkardd5xpnr269i.gif" alt="actions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now since I didn’t have windows or a Mac machine, I came across Github Actions. Now this is a life saver especially if you want to release production builds.&lt;/p&gt;

&lt;p&gt;All I had to do was to add a yml file .github/workflows folder and Github would use cloud machines to complie the build files for different OS based on specifications on your .yml file.&lt;/p&gt;

&lt;p&gt;My Yml file looks something like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build Electron App&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*'&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
            &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;linux&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;windows-latest&lt;/span&gt;
            &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;win&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;macos-13&lt;/span&gt;
            &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mac&lt;/span&gt;
            &lt;span class="na"&gt;arch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;x64&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;macos-latest&lt;/span&gt;
            &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mac&lt;/span&gt;
            &lt;span class="na"&gt;arch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arm64&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.os }}&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repo&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup Node&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
          &lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;npm'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create .env-cmdrc.json&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo '{&lt;/span&gt;
            &lt;span class="s"&gt;"production": {&lt;/span&gt;
              &lt;span class="s"&gt;"PUBLIC_URL": "./",&lt;/span&gt;
              &lt;span class="s"&gt;"REACT_APP_ANALYTICS_SCRIPT_ID": "${{ secrets.REACT_APP_ANALYTICS_SCRIPT_ID }}",&lt;/span&gt;
              &lt;span class="s"&gt;"API_ENDPOINT": "${{ secrets.API_ENDPOINT }}",&lt;/span&gt;
              &lt;span class="s"&gt;"GOOGLE_CLIENT_ID": "${{ secrets.GOOGLE_CLIENT_ID }}",&lt;/span&gt;
              &lt;span class="s"&gt;"GOOGLE_ELECTRON_CLIENT_ID": "${{ secrets.GOOGLE_ELECTRON_CLIENT_ID }}",&lt;/span&gt;
              &lt;span class="s"&gt;"GOOGLE_ELECTRON_CLIENT_SECRET": "${{ secrets.GOOGLE_ELECTRON_CLIENT_SECRET }}"&lt;/span&gt;
            &lt;span class="s"&gt;}&lt;/span&gt;
          &lt;span class="s"&gt;}' &amp;gt; .env-cmdrc.json&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Package Electron app&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm run build:electron-combine&lt;/span&gt;
          &lt;span class="s"&gt;npx electron-builder build --publish=never --${{ matrix.platform }} --${{ matrix.arch || 'x64' }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload dist artifacts&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.os }}-${{ matrix.arch || 'x64' }}-artifacts&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dist/&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish release&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;startsWith(github.ref, 'refs/tags/')&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;softprops/action-gh-release@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dist/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ofc, you, might have to change the above code a bit depending on your needs.&lt;/p&gt;

&lt;p&gt;And voila! I was able to complie for all 3 OS without having to spend on an expensive machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Signing hassle
&lt;/h2&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%2F77wzej88bk6gffwb9er6.gif" 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%2F77wzej88bk6gffwb9er6.gif" alt="Code signing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now every desktop app has to be code signed, especially for Mac OS and Windows, otherwise you’d be hit with a firewall popup saying “unverified publisher, move to bin”.&lt;/p&gt;

&lt;p&gt;The problem with code signing is that it’s pretty expensive especially if you are a solo developer. There isn’t really cheap option when it comes to code signing.&lt;/p&gt;

&lt;p&gt;While people can still ignore the warning and continue to use your app, many people would just stay away from downloading it, because of the popup.&lt;/p&gt;

&lt;p&gt;So, since I couldn’t afford to code sign my app, I made it clear to the users saying that my desktop app are not code signed, so people are aware and can trust my app&lt;/p&gt;

&lt;p&gt;This might be a small thing to add to a website, but goes a long way in gaining the trust of the users.&lt;/p&gt;

&lt;p&gt;Here’s a video demo of the entire app&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9dYv3VnchDA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This was my first Desktop I released to public, there’s still a long way to go and more work to do, but I am so happy I got my first app out in public.&lt;/p&gt;

&lt;p&gt;Would love to hear what you guys think :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Github:&lt;/strong&gt; &lt;a href="https://github.com/PaulleDemon/PyUIBuilder" rel="noopener noreferrer"&gt;https://github.com/PaulleDemon/PyUIBuilder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About:&lt;/strong&gt; &lt;a href="https://about.pyuibuilder.com" rel="noopener noreferrer"&gt;https://about.pyuibuilder.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web version:&lt;/strong&gt; &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;https://pyuibuilder.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python GUI full course — Learn GUI development in 15 mins</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Sat, 10 May 2025 09:33:10 +0000</pubDate>
      <link>https://forem.com/paul_freeman/python-gui-full-course-learn-gui-development-in-15-mins-1aop</link>
      <guid>https://forem.com/paul_freeman/python-gui-full-course-learn-gui-development-in-15-mins-1aop</guid>
      <description>&lt;p&gt;So, you want to start learning GUI development in Python so you can actually start seeing your applications come to life — not just lines of code in a terminal, but real windows, buttons, inputs, and interactions.&lt;/p&gt;

&lt;p&gt;Whether you’re building a desktop tool, a dashboard, or just exploring for fun, GUI development opens up a world of visual, interactive programming.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll teach you everything you need to know to build Python GUI, in addition, I’ll be introducing you to a tool called &lt;strong&gt;&lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUibuilder&lt;/a&gt;&lt;/strong&gt; that would make 10x easier for you to build python GUIs&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%2Fp7ji0ewwyenk69jxuq03.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%2Fp7ji0ewwyenk69jxuq03.png" alt="PyUi" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing a GUI library
&lt;/h2&gt;

&lt;p&gt;There are quite a number of GUI libraries out there, some of the common once among them includes, Tkinter, Kivy, PySide.&lt;/p&gt;

&lt;p&gt;If you are just getting started with python GUI development its highly recommended you start with Tkinter as its much more beginner friendly.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll be using Tkinter to explain the GUI development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything about widgets in python GUI
&lt;/h2&gt;

&lt;p&gt;In GUI (Graphical User Interface) development, widgets are the building blocks of your application’s user interface. A widget can be anything that the user sees or interacts with on the screen — like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buttons&lt;/li&gt;
&lt;li&gt;Labels&lt;/li&gt;
&lt;li&gt;Text inputs&lt;/li&gt;
&lt;li&gt;Checkboxes&lt;/li&gt;
&lt;li&gt;Dropdowns&lt;/li&gt;
&lt;li&gt;Sliders
and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of them like LEGO bricks. You put them together to build a functional interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layout’s in python GUI
&lt;/h2&gt;

&lt;p&gt;In GUI development, layouts control where and how your widgets appear on the screen. In Python’s most popular GUI toolkit, Tkinter, layouts are handled using geometry managers — special methods that place and organize widgets inside windows.&lt;/p&gt;

&lt;p&gt;In Tkinter there are 3 layout managers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;pack()&lt;/code&gt; — Stacks widgets vertically or horizontally&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grid()&lt;/code&gt; — Arranges widgets in a table-like grid (rows/columns)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;place()&lt;/code&gt; — Places widgets at exact x, y coordinates (manual layout)
If you want your app to be responsive, (adjust widget sizes according to window size), you’ll either go with pack or grid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Root Widget in Tkinter
&lt;/h2&gt;

&lt;p&gt;If you’re starting to learn how to make apps with Tkinter, the most popular GUI (Graphical User Interface) library in Python, you’ll always come across two things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root = Tk()
root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But what do these actually mean? Let’s break it down in plain English.&lt;/p&gt;

&lt;p&gt;When you make a GUI app, you need a window to hold all the buttons, text boxes, and labels. That’s what the root window is.&lt;/p&gt;

&lt;p&gt;In Tkinter, you create this main window by writing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from tkinter import *

root = Tk()
root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There can only be one root window, if you want more window’s you’ll be using something called Toplevel we’ll come to this at a later time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mainloop in tkinter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;mainloop()&lt;/strong&gt; — also known as the event loop — is the part of a Tkinter program that keeps the app running.&lt;/p&gt;

&lt;p&gt;Once you’ve set up your window and added all your widgets (like buttons, labels, etc.), you call mainloop() at the end of your script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Python to keep the window open and to listen for user actions — like clicking a button, typing in a box, or closing the window. Without mainloop(), your window would appear and close immediately.&lt;/p&gt;

&lt;p&gt;Essentialy its an infinite while loop, with something like this under the hood.&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;window_open&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;window_open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="nf"&gt;event_queue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nf"&gt;render_window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In short, &lt;code&gt;mainloop()&lt;/code&gt; is what makes your GUI app interactive and alive.&lt;/p&gt;

&lt;p&gt;Now that you understood the basics of Tkinter, we’ll go into more detail in the next chapter&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started with tkinter
&lt;/h2&gt;

&lt;p&gt;Let’s start with a small app. And as said before you’ll need a root window and main loop&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import tkinter as tk

root = tk.Tk()
root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now write the rest of the code between these two lines. Anything after Mainloop will not be visible on the screen.&lt;/p&gt;

&lt;p&gt;Let start by adding labels using place.&lt;/p&gt;

&lt;p&gt;To add a label we’ll call the Label class that takes the parent as the parameter, in our case the parent is the root. The parents can be anything such as Frames, Tk(), Toplevel() etc, on which your items should be placed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import tkinter as tk

root = tk.Tk()

# Create a label with text
label = tk.Label(root, text="Hello, Tkinter!")
label.place(x=20, y=20)

root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this will place the label at 20, 20 position relative to the root window from the top left corner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Pack Layout manager in tkinter
&lt;/h2&gt;

&lt;p&gt;The pack() method arranges widgets relative to each other in the parent window. It places widgets in a block-like fashion — either top-to-bottom (default) or side-by-side, depending on the options you provide.&lt;/p&gt;

&lt;p&gt;Lets see an example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root = tk.Tk()

label1 = tk.Label(root, text="Top Label", bg="lightblue")
label1.pack()

label2 = tk.Label(root, text="Bottom Label", bg="lightgreen")
label2.pack()

root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, label1 appears on top of label2. This is the default behavior — vertical stacking from the top.&lt;/p&gt;

&lt;p&gt;Key Options&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;side&lt;/code&gt; – Controls the side to pack against: TOP (default), BOTTOM, LEFT, or RIGHT.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fill&lt;/code&gt; – Determines how the widget expands: X, Y, or BOTH.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;expand&lt;/code&gt; – When True, lets the widget expand to fill extra space.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;padx&lt;/code&gt; and &lt;code&gt;pady&lt;/code&gt; – Adds horizontal and vertical padding around the widget.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using Pack layout with &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUiBuilder&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Step 1: Click on the main window and change the layout to Flex as shown below&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%2Fiqhzb9jcfm5slt8bpb19.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%2Fiqhzb9jcfm5slt8bpb19.png" alt="Main window" width="720" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Add two labels from the left widgets tab&lt;/p&gt;

&lt;p&gt;Step 3: Click on the label and open the Pack Manager and explore the options.&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%2F9alej84c26g9pjdi9xs4.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%2F9alej84c26g9pjdi9xs4.png" alt="Label" width="720" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yep that’s it! its just as simple as clicking few buttons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Grid Layout manager in Tkinter
&lt;/h2&gt;

&lt;p&gt;When your GUI layout needs more structure, especially in rows and columns, Tkinter’s grid layout manager is your best friend. Unlike the simpler pack() method, grid() gives you precise control over widget placement.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the Grid Manager?
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;grid()&lt;/code&gt; method arranges widgets in a table-like structure using rows and columns. You specify where each widget should go using the row and column options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import tkinter as tk

root = tk.Tk()

tk.Label(root, text="Username:").grid(row=0, column=0)
tk.Entry(root).grid(row=0, column=1)

tk.Label(root, text="Password:").grid(row=1, column=0)
tk.Entry(root, show="*").grid(row=1, column=1)

tk.Button(root, text="Login").grid(row=2, column=0, columnspan=2)

root.mainloop()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When to Use Grid&lt;br&gt;
Ideal for form layouts, data entry screens, and any structured design.&lt;/p&gt;

&lt;p&gt;Allows fine-tuned positioning and spacing.&lt;br&gt;
Cannot be mixed with pack() in the same parent widget.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using Grid layout with PyUiBuilder
&lt;/h2&gt;

&lt;p&gt;Step 1: Click on the main window and change the layout to Grid as shown below.&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%2Fxkih32s4ip7wj5hj6y5u.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%2Fxkih32s4ip7wj5hj6y5u.png" alt="Grid" width="720" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Decide on the number of rows and columns from the grid configure&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%2Fhcgg3t29njpggmocdm7i.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%2Fhcgg3t29njpggmocdm7i.png" alt="rows cols" width="720" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Add label and entry widget by dragging and dropping&lt;/p&gt;

&lt;p&gt;Step 4: Adjust rows and column by clicking on the widget and adjusting from grid manager&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%2F04jtg57l622upnuj9rpl.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%2F04jtg57l622upnuj9rpl.png" alt="adjust pyuibuilder" width="720" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oh! and don’t forget to export your code from top right corner.&lt;/p&gt;

&lt;p&gt;That was it, now you can try out other widgets on &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUiBuilder&lt;/a&gt; and familiarize yourself with Tkinter.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/u5OnXaLmtyQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.gg/dHXjrrCA7G" rel="noopener noreferrer"&gt;Join discord server&lt;/a&gt;, for help with tkinter or python GUI development&lt;/p&gt;

</description>
      <category>python</category>
      <category>tkinter</category>
      <category>gui</category>
      <category>pyuibuilder</category>
    </item>
    <item>
      <title>Here's how to build a Canva like UI using Reactjs</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Tue, 22 Apr 2025 08:30:00 +0000</pubDate>
      <link>https://forem.com/paul_freeman/heres-how-to-build-a-canva-like-ui-using-reactjs-20bo</link>
      <guid>https://forem.com/paul_freeman/heres-how-to-build-a-canva-like-ui-using-reactjs-20bo</guid>
      <description>&lt;p&gt;Chances are, you’ve used &lt;a href="https://canva.com" rel="noopener noreferrer"&gt;Canva&lt;/a&gt; — maybe to whip up a poster, design an Instagram story, or create something that just looks good without breaking being a professional designer.&lt;/p&gt;

&lt;p&gt;But have you ever paused and thought: How did they build something like this?&lt;/p&gt;

&lt;p&gt;A design tool that runs in the browser, feels effortless to use, and somehow makes everyone feel like a designer?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a long read, so make sure to bookmark&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While I can't really talk on how Canva was built, because I am not an engineer at Canva. But, inspired by Canva I have built something similar though for a very different use case.&lt;/p&gt;

&lt;p&gt;I am going to be talking about &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUiBuilder&lt;/a&gt;, a convenient drag and drop tool like Canva I am working on to help Python developers develop Python GUI's easily.&lt;/p&gt;

&lt;p&gt;Before we start, feel free to check out the &lt;a href="https://github.com/PaulleDemon/PyUIBuilder" rel="noopener noreferrer"&gt;source code&lt;/a&gt; for PyUIBuilder, and make sure to star ⭐️ it so you can come back to it at a later point.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;, by the end of this blog you may have a high level overview of the thinking process and how things work, this is in no way a course on how to build Canva.&lt;/p&gt;
&lt;/blockquote&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%2Fwsdl4ggu3jx1qmc4d4m1.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%2Fwsdl4ggu3jx1qmc4d4m1.png" alt="PyUI Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning ahead
&lt;/h2&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%2Fpme7bylu29fdslwsjvef.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%2Fpme7bylu29fdslwsjvef.png" alt="Planning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, before you start to write you first line of code. It's always better to plan things such as how your UI's supposed to look, what library/framework you plan to use, what features you would want to have and make a rough sketch in your mind on how different components/elements are supposed to come together.&lt;/p&gt;

&lt;p&gt;It's generally recommended to go with the framework/library you are comfortable with. Which, in my case it was Reactjs. Though I used JS for this project, for a big project like this one, I would highly recommend you start with TypeScript. &lt;/p&gt;

&lt;p&gt;Project's like this will have a lot of nested data structures and it would be so much easier to maintain and debug if you start with TS instead of JS. I believe I could have avoided many hours of headache if I had just started the entire project with TS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structuring your project
&lt;/h2&gt;

&lt;p&gt;Once you have chosen you library/framework, it's time to build the basic structure of the project. Structuring your project is a no brainer. Group things that go together and give each folder meaningful names.&lt;/p&gt;

&lt;p&gt;Yep, that's how I do it, if it's a commonly used functions such as a sum function or a math related functions, create a folder called utilities and create file for each related functions and add them in respectively.&lt;/p&gt;

&lt;p&gt;For example images goes inside, &lt;code&gt;assets/images&lt;/code&gt;, now you can make this path more detailed as well like &lt;code&gt;assets/images/home/&lt;/code&gt;, depending on your needs. &lt;/p&gt;

&lt;p&gt;Now if these images are related to a component that has a lot is depended on other related smaller component, you could just move these assets inside the components folder and keep main assets in the root directory&lt;/p&gt;

&lt;p&gt;Here's a small part of how I have structured mine&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
|--- contexts
|   |--- fileUploadContext.js
|   |--- resizeContext.js
|--- constants
|   |--- frameworks.js
|--- index.js
|--- sidebar
|   |--- sidebar.js
|   |--- widgetsContainer.js
|   |--- utils
|   |   |--- premium.js
|   |   |--- share.js
|   |--- templatesContainer.js
|   |--- uploadsContainer.js
|   |--- pluginsContainer.js
|   |--- treeviewContainer.js
|--- dnd
|--- utils
|   |--- hooks.js
|   |--- common.js
|   |--- errors.js
|   |--- filter.js
|--- assets
|   |--- images
|   |   |--- doggy.png
|   |--- logo
|   |   |--- ko-fi.png
|   |   |--- bmc.svg
|   |   |--- logo.svg
|   |--- widgets
|   |   |--- button.png
|   |--- background
|   |   |--- dots.svg
|--- frameworks
|   |--- customtk
|   |   |--- constants
|   |   |   |--- fontFamily.js
|   |   |   |--- cursor.js

|   |--- utils
|   |   |--- pythonFilePath.js
|   |--- tkinter
|   |   |--- constants
|   |   |   |--- fontFamily.js
|   |   |   |--- cursor.js
|   |   |   |--- styling.js
|   |   |--- pythonWidgets
|   |   |   |--- imageLabel.py
|   |   |   |--- readme.md
|   |   |--- plugins
|   |   |   |   |--- entry.py
|   |   |   |--- code.js
.
.
.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding PyUIBuilder
&lt;/h2&gt;

&lt;p&gt;Before we begin, it's important for you to understand a bit more about PYUiBuilder and the requirements/features. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://pyuibuilder.com/" rel="noopener noreferrer"&gt;PyUiBuilder&lt;/a&gt; is a Drag and drop GUI builder for python and it can output clean Python Code&lt;/p&gt;

&lt;p&gt;let's start with the requirements/features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The users must be able to drag and drop widgets to canvas.&lt;/li&gt;
&lt;li&gt;The canvas should be zoomable and pannable&lt;/li&gt;
&lt;li&gt;The widgets can contain child widgets inside them.&lt;/li&gt;
&lt;li&gt;The code must be extendable and reusable&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Functional component vs Class based component for large apps
&lt;/h2&gt;

&lt;p&gt;Now if you have read the React docs, you would know that Class based components are no longer recommended in favour of Function based components.&lt;/p&gt;

&lt;p&gt;So, your natural choice might be to go with function components. However, something that function components lack is the inheritance and extensibility that class-based components provide. The abstraction layers you can create with class-based components are often harder to replicate with function components alone. Also, as function components grow larger, especially with lots of hooks, they can become messy and harder to manage.&lt;/p&gt;

&lt;p&gt;That's why I chose to use class-based components for parts of my app that required extensibility, and stuck with function components for everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Canvas for PyUiBuilder
&lt;/h2&gt;

&lt;p&gt;The main part of Canva or PyUIBuilder is of course the canvas. Thats where all the drag and drop elements go. &lt;/p&gt;

&lt;p&gt;Now you might be tempted to use the regular Canvas element provided in the html. But a major problem with using that canvas is that it's hard to debug when you add elements inside it.&lt;/p&gt;

&lt;p&gt;So, a better approach would be to treat a div as Canvas and use it.&lt;/p&gt;

&lt;p&gt;here's an example code (use +/- keys to zoom in and out)&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/Paul-art/embed/KKOzzpa?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This is similar approach used by both Canva and PyUiBUilder (you can check this by opening the developer's tool)&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%2Fd3jwc26qcvuy3op7e34w.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%2Fd3jwc26qcvuy3op7e34w.png" alt="Canva's canvas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data structure and single source of truth
&lt;/h2&gt;

&lt;p&gt;One of the major parts of building a PyUibuilder like app is the datastructure, especially deciding on how you are going to create a nested structure.&lt;/p&gt;

&lt;p&gt;It can become easy to lose track of all the variables and changes. So, I can't have multiple variables keeping track of the same piece of information. So, it's better to avoid passing it as a props down the components or prop drilling&lt;/p&gt;

&lt;p&gt;So I'd use React context or state management library like redux&lt;/p&gt;

&lt;p&gt;I chose to have all the information about the widgets in a react context after experimenting different approaches.&lt;/p&gt;

&lt;p&gt;The data structure looks something like 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="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// id of the widget&lt;/span&gt;
    &lt;span class="na"&gt;widgetType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;WidgetClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// base widget&lt;/span&gt;
    &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="c1"&gt;// children will also have the same datastructure as the parent&lt;/span&gt;
    &lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// id of the parent of the current widget&lt;/span&gt;
    &lt;span class="na"&gt;initialData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;// information about the widget's data that's about to be rendered eg: backgroundColor, foregroundColor etc.&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;p&gt;It's based on this data structure the components are rendered&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the drag and drop
&lt;/h2&gt;

&lt;p&gt;When starting out I had researched on a couple of libraries such as React-beautiful-Dnd, React Dnd-kit and React Swappy.&lt;/p&gt;

&lt;p&gt;After researching I saw that react-beautiful-dnd was no longer maintained and started with React dnd-kit. As a started building, I found the dnd-kit's documentation quite limited for what I was building, Plus, a new release with major changes to library was coming out soon, so I decided to drop react-dnd-kit until the major release.&lt;/p&gt;

&lt;p&gt;I rewrote the parts of where I used DND-kit with HTML's Drag and Drop API. Only limitation with the native Drag and drop API was that it's still not supported by some touch devices, which didn't matter to me because I was building for non-touch devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  React Context managers
&lt;/h2&gt;

&lt;p&gt;My app allowed asset upload, now these assets where to be used by the widgets/elements in the canvas. So how would you pass the assets to the widgets? &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%2Fobuyw25wr8vrp6c6md3f.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%2Fobuyw25wr8vrp6c6md3f.png" alt="Asset upload"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I wanted the assets uploaded in the sidebar accessible by toolbar of the widgets. But every time I switch the sidetabs, the re-render caused the uploaded assets to disappear.&lt;/p&gt;

&lt;p&gt;Now you might think of using Redux, but One of the biggest limitations with Redux is that you can only store serializable data. Non-serializable data such as image, video, other assets cannot be stored on redux. This would make it harder to pass data around different component.&lt;/p&gt;

&lt;p&gt;One way to overcome this is to use React Context. In brief, React Context provides a way to pass data through the component tree without having to pass props down manually at every level.&lt;/p&gt;

&lt;p&gt;All I would have to do to have the data in different components was to wrap it around a React context provider.&lt;/p&gt;

&lt;p&gt;I Created my own context providers for couple of things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drag and drop - Enabling dragging and dropping from sidebar + dragging and dropping withing child elements.&lt;/li&gt;
&lt;li&gt;File upload - To make the uploaded files accessible on the toolbar for each widget.&lt;/li&gt;
&lt;li&gt;Storing widgets - To make it accessible to both Tree view and the canvas &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is a simple example of how I used React context for Drag and drop.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DragWidgetContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useDragWidgetContext&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;gt;&lt;/span&gt; &lt;span class="nf"&gt;useContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;DragWidgetContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Provider component to wrap around parts that need drag-and-drop functionality&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DragWidgetProvider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;draggedElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setDraggedElement&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onDragStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&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;setDraggedElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onDragEnd&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;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setDraggedElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DragWidgetContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;draggedElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDragStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onDragEnd&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="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DragWidgetContext.Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;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;p&gt;Yes! that's it. All I had to do now was to wrap it around the component where I needed the context, which in my case was over Canvas and sidebar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final notes
&lt;/h2&gt;

&lt;p&gt;Thank you for reading the entire thing. Hope you have learnt a thing or two on how to build a complex app like Canva/PyUiBuilder. &lt;/p&gt;

&lt;p&gt;If you want to study the source code you can do so here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PaulleDemon/PyUIBuilder" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Github repo ⭐️&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>python</category>
      <category>javascript</category>
    </item>
    <item>
      <title>10 Useful Tools and Libraries for Python Developers</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Sat, 29 Mar 2025 09:54:29 +0000</pubDate>
      <link>https://forem.com/paul_freeman/10-useful-tools-and-libraries-for-python-developers-2pi5</link>
      <guid>https://forem.com/paul_freeman/10-useful-tools-and-libraries-for-python-developers-2pi5</guid>
      <description>&lt;p&gt;Python is an incredibly versatile language, and the right tools can make coding easier, faster, and more enjoyable. Whether you're building websites, working with AI, or automating tasks, these libraries can help you get things done more efficiently. Here are 10 essential tools every Python developer should know about.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUIBuilder&lt;/a&gt; - A GUI Builder for Python
&lt;/h2&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%2F2bqeeyuxows18khqx7mm.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%2F2bqeeyuxows18khqx7mm.png" alt="PyUiBuilder" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re building desktop applications, &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;&lt;strong&gt;PyUIBuilder&lt;/strong&gt;&lt;/a&gt; is a lifesaver. Instead of writing tedious UI code by hand, PyUIBuilder gives you a drag-and-drop interface for designing GUI applications. It outputs clean python code so you can edit later on. Currently it supports tkinter and customtk&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://github.com/python-poetry/poetry" rel="noopener noreferrer"&gt;Poetry&lt;/a&gt; - Dependency Management
&lt;/h2&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%2F1sj0j4sq9agh06jb6lja.gif" 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%2F1sj0j4sq9agh06jb6lja.gif" alt="poetry" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tired of dealing with dependency conflicts? &lt;strong&gt;Poetry&lt;/strong&gt; makes package management and virtual environments a breeze. It handles everything from installing dependencies to publishing your package, all with a clean and simple workflow using the &lt;code&gt;pyproject.toml&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="https://github.com/fastapi/fastapi" rel="noopener noreferrer"&gt;FastAPI&lt;/a&gt; - Web framework for building APIS
&lt;/h2&gt;

&lt;p&gt;If you need to build APIs fast, FastAPI is the way to go. It’s lightweight, async-friendly, and handles validation automatically. Plus, it generates documentation for you, making development smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. &lt;a href="https://github.com/pytorch/pytorch" rel="noopener noreferrer"&gt;PyTorch&lt;/a&gt; - A Deep Learning Powerhouse
&lt;/h2&gt;

&lt;p&gt;If you're getting into AI, PyTorch is a powerful and easy-to-use deep learning framework. Its flexible computation graph and GPU acceleration make it great for both research and production. Whether you're building neural networks or fine-tuning models, PyTorch makes the process smoother.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. &lt;a href="https://github.com/pytest-dev/pytest" rel="noopener noreferrer"&gt;Pytest&lt;/a&gt; - Simple Yet Powerful Testing
&lt;/h2&gt;

&lt;p&gt;Testing doesn’t have to be painful. &lt;strong&gt;Pytest&lt;/strong&gt; makes writing tests easy with fixtures, parameterized testing, and powerful assertion debugging. Just write your test functions, and Pytest will handle the rest—no complex setup required.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. &lt;a href="https://github.com/sqlalchemy/sqlalchemy" rel="noopener noreferrer"&gt;SQLAlchemy&lt;/a&gt; - Database Interaction using ORM
&lt;/h2&gt;

&lt;p&gt;If raw SQL queries aren’t your thing, &lt;strong&gt;SQLAlchemy&lt;/strong&gt; provides a cleaner, more Pythonic way to work with databases. Its ORM (Object-Relational Mapper) allows you to interact with databases using Python classes instead of SQL, making database management much more intuitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. &lt;a href="https://github.com/scikit-learn/scikit-learn" rel="noopener noreferrer"&gt;Scikit-learn&lt;/a&gt; - Machine Learning
&lt;/h2&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%2Fregicjg8dte6ehxugd7t.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%2Fregicjg8dte6ehxugd7t.png" alt="Scikit learn" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scikit-learn&lt;/strong&gt; is the go-to library for classical machine learning. Need to build a classifier, a regression model, or perform clustering? Scikit-learn has all the essential algorithms packed into a simple, easy-to-use interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. &lt;a href="https://jupyter.org/try" rel="noopener noreferrer"&gt;Jupyter Notebook&lt;/a&gt; - Interactive Coding Playground
&lt;/h2&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%2F5xhkhciiv5wl3h9zij9p.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%2F5xhkhciiv5wl3h9zij9p.png" alt="Jupyter notebook" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For data scientists and researchers, &lt;strong&gt;Jupyter Notebook&lt;/strong&gt; is an essential tool. It lets you write and run Python code interactively, visualize data, and document workflows—all in one place. Perfect for experimentation and collaboration.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. &lt;a href="https://github.com/celery/celery" rel="noopener noreferrer"&gt;Celery&lt;/a&gt; - Handle and run background tasks
&lt;/h2&gt;

&lt;p&gt;Need to run time-consuming tasks in the background? &lt;strong&gt;Celery&lt;/strong&gt; helps you offload tasks like sending emails, processing large data sets, or handling scheduled jobs asynchronously. It’s widely used in web applications to improve performance and responsiveness.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. &lt;a href="https://huggingface.co/docs/transformers/index" rel="noopener noreferrer"&gt;Hugging Face Transformers&lt;/a&gt; - pretrained models for inference and training
&lt;/h2&gt;

&lt;p&gt;Want to use  AI models without reinventing the wheel? &lt;strong&gt;Hugging Face Transformers&lt;/strong&gt; provides pre-trained models for NLP, vision, and more. Whether you need a chatbot, text summarization, or sentiment analysis, this library makes AI integration effortless.&lt;/p&gt;




&lt;p&gt;Since you have read till here, here's two more as a bonus&lt;/p&gt;

&lt;h2&gt;
  
  
  11. &lt;a href="https://github.com/Textualize/rich" rel="noopener noreferrer"&gt;Rich&lt;/a&gt; - Beautiful CLI Output Made Easy
&lt;/h2&gt;

&lt;p&gt;Rich is a Python library that makes command-line applications more visually appealing. It supports colorful text, tables, syntax highlighting, progress bars, and improved logging—perfect for making your CLI tools more user-friendly. With just a few lines of code, you can transform plain terminal output into something much more engaging.&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%2Fuuucswlyqbktw6pfi7zp.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%2Fuuucswlyqbktw6pfi7zp.png" alt="Rich" width="800" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  12. &lt;a href="https://docs.pydantic.dev/latest/" rel="noopener noreferrer"&gt;Pydantic&lt;/a&gt; - Data Validation Without the Headache
&lt;/h2&gt;

&lt;p&gt;Dealing with messy data? &lt;strong&gt;Pydantic&lt;/strong&gt; makes it easy to validate and parse structured data using Python type hints. It’s especially useful when working with APIs, ensuring that your data is always clean and well-structured.&lt;/p&gt;

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

&lt;p&gt;The right tools can speed up your Python development experience. Whether you’re streamlining dependency management with Poetry, diving into machine learning with PyTorch, or automating workflows with Invoke, these tools will save you time and effort. &lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>pythonlibraries</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Create Tkinter GUI’s using Tkinter GUI Builder — PyUiBuilder</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Thu, 27 Mar 2025 10:01:54 +0000</pubDate>
      <link>https://forem.com/paul_freeman/create-tkinter-guis-using-tkinter-gui-builder-pyuibuilder-14cp</link>
      <guid>https://forem.com/paul_freeman/create-tkinter-guis-using-tkinter-gui-builder-pyuibuilder-14cp</guid>
      <description>&lt;p&gt;If your starting out with tkinter, it can be overwhelming without prior understanding of GUIs. Whether you are trying to make a simple school project or are trying to create an internal application for your company, &lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;Tkinter GUI Builder&lt;/a&gt; will make this entire process easier.&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%2Flnm36vt0ahaj9li9espr.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%2Flnm36vt0ahaj9li9espr.png" alt="PyUI Builder demo" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PyUiBuilder — An Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pyuibuilder.com" rel="noopener noreferrer"&gt;PyUiBuilder&lt;/a&gt; is a framework agnostic GUI builder tool. Meaning you can use the same GUI builder tool to make GUI’s in tkinter, customtk and others. The best part is that it can generate editable Python code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basics of GUI
&lt;/h2&gt;

&lt;p&gt;Before we jump right into the GUI builder it is vital for you to understand some basics of GUI, especially if you have never created a GUI before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Widgets&lt;/strong&gt; — widgets are individual components such as labels, buttons, frames etc, that help you build your interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layouts&lt;/strong&gt; — Layouts define how widgets are arranged within a window or container. They help structure your interface by positioning widgets in a logical and visually appealing way. In Tkinter, you can manage layouts using different geometry managers like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;pack()&lt;/strong&gt; — Stacks widgets vertically or horizontally. Watch this video to understand how tkinter &lt;a href="https://www.youtube.com/playlist?list=PL0VamwghCfX-KXtGKGLak-C_-Jcx_eOiK" rel="noopener noreferrer"&gt;pack geometry&lt;/a&gt; works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;grid()&lt;/strong&gt; — Arranges widgets in a table-like structure using rows and columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;place()&lt;/strong&gt; — Positions widgets at exact coordinates.
Choosing the right layout method ensures your interface adapts well to different window sizes and screen resolutions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a video to follow along&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/4w3Oy17FE8U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Building with PyUiBuilder
&lt;/h2&gt;

&lt;p&gt;Lets start by trying to replicate the Signup form you see above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 1:&lt;/strong&gt; From the sidebar open the widgets tab and drag and drop a frame into the main window.&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%2Frgfccamm9iar92rb9nmt.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%2Frgfccamm9iar92rb9nmt.png" alt="dnd frame" width="720" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 2:&lt;/strong&gt; By default all the widgets use place layout, meaning they will be added where you drop them, but this won’t be responsive, so we’ll change the flex/pack, by clicking on the main window and from the righ toolbar layout dropdown&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%2Fcnrytbqg43gx3yy4nbpz.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%2Fcnrytbqg43gx3yy4nbpz.png" alt="responsive" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 3:&lt;/strong&gt; While this is great, the frame is not at the top, but we need to center it. To center it click back on the frame and from the toolbar go down to Pack Manager and click on expand and set anchor to center.&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%2Fissvnihcb12ojaav36hn.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%2Fissvnihcb12ojaav36hn.png" alt="center the frame" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 4:&lt;/strong&gt; Now lets set the frame layout (from layouts dropdown) to be flex and add a label widget.&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%2Ffzzoyb2et406v3ygm6s0.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%2Ffzzoyb2et406v3ygm6s0.png" alt="add label" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 5:&lt;/strong&gt; Now select the label widget and change the label to signup. We can also center this text by going under the styling accordion and changing Text align to center&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%2Fv9xn5lasyct9evrg52d5.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%2Fv9xn5lasyct9evrg52d5.png" alt="center the text" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 6:&lt;/strong&gt; Lets change the background color of the base Frame so there is much more contrast.&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%2Fgl27edekbdwmq5b6p5hv.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%2Fgl27edekbdwmq5b6p5hv.png" alt="Change color" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 7:&lt;/strong&gt; Now let us add another frame inside that base frame and set its layout to 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky0j3z24yavrrm47cchx.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%2Fky0j3z24yavrrm47cchx.png" alt="Add Base frame" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 8:&lt;/strong&gt; Let’s give it a margin in the y direction so there’s a space between Frame and Signup label.&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%2Fkr571lt82n3rym6dp9f3.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%2Fkr571lt82n3rym6dp9f3.png" alt="margin" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 9:&lt;/strong&gt; Let’s no configure the Frame’s grid to be 2 rows and 2 cols.&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%2Fc67uph6aotlj9nnfqxx9.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%2Fc67uph6aotlj9nnfqxx9.png" alt="Frame" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 10:&lt;/strong&gt; Add a 2 labels and 2 Entry widget in the order label -&amp;gt; Entry -&amp;gt; Label -&amp;gt; Entry and you’ll have the following.&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%2Fatsmw5j91j1nf4511m9i.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%2Fatsmw5j91j1nf4511m9i.png" alt="Entry" width="720" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;step 11:&lt;/strong&gt; To finish it off add a button in the main Frame and vola you have a sign up form. Now all you have to do is click on Export code button on top right corner and execute the code and you’ll have something like below.&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%2F7qmrzcgsiq3he246v6wi.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%2F7qmrzcgsiq3he246v6wi.png" alt="Button" width="692" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;strong&gt;Note:&lt;/strong&gt; tkinter is OS dependent, so if you are on Mac, or windows you’ll see something a bit more different than if you are on a Linux.)&lt;/p&gt;

&lt;p&gt;That’s all for now. More tutorial on PyUiBuilder will soon be added. Until then feel free to experiment and try building the UIs&lt;/p&gt;




&lt;p&gt;If you have questions or need help her’s an invite to join the &lt;a href="https://discord.gg/dHXjrrCA7G" rel="noopener noreferrer"&gt;Discord server for PyUiBuilder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tkinter</category>
      <category>frontend</category>
      <category>pyuibuilder</category>
    </item>
    <item>
      <title>My Python GUI Builder just crossed 300 stars on GitHub 🤯</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Wed, 12 Mar 2025 12:00:02 +0000</pubDate>
      <link>https://forem.com/paul_freeman/my-python-gui-builder-just-crossed-300-stars-on-github-545h</link>
      <guid>https://forem.com/paul_freeman/my-python-gui-builder-just-crossed-300-stars-on-github-545h</guid>
      <description>&lt;p&gt;&lt;a href="https://pyuibuilder.pages.dev/" rel="noopener noreferrer"&gt;PyUIBuilder&lt;/a&gt; is a Python a cross-framework GUI builder I am working on and it just crossed 300 stars mark, making this my second most stared Github repository&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%2Fase8xo0d1h9s7n6yf48s.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%2Fase8xo0d1h9s7n6yf48s.png" alt="Star history" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have ever had to work with Python you would have atleast once had to make a GUI using tkinter/kivy/PySide. &lt;/p&gt;

&lt;p&gt;Now, building a GUI as a python developers can be very challenging, from understanding main loop, event loops, handling events to knowing what's available to you in each library/framework.&lt;/p&gt;

&lt;p&gt;So, I took on this challenging project to make it easier for you to develop cross-framework GUIs in Python.&lt;/p&gt;

&lt;p&gt;Here's a demo&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/CjwkUoGDX2g"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pyuibuilder.pages.dev/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Try PyUiBuilder →&lt;/a&gt;
 &lt;a href="https://github.com/PaulleDemon/PyUIBuilder" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star PyUiBuilder ⭐️&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Python GUI Builder?
&lt;/h2&gt;

&lt;p&gt;A python GUI builder or PyUIBuilder is web based a Graphical User interface (GUI) builder for Python&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what does Cross framework mean here?
&lt;/h2&gt;

&lt;p&gt;Cross framework here means you would be able to select between different frameworks and build your GUIs in a simple interface. You would be able to choose between tkinter and CustomTk for now. PySide and Kivy frameworks are work in progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are some exciting features of Python GUI Builder?
&lt;/h2&gt;

&lt;p&gt;While there are many exciting features I am working on, here's to list a few&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-framework support, currently supports Tkinter and CustomTk, and will soon support Kivy and PySide.&lt;/li&gt;
&lt;li&gt;Support for 3rd party widgets such as tkvideoplayer, mapview etc.&lt;/li&gt;
&lt;li&gt;Intuitive interface&lt;/li&gt;
&lt;li&gt;Web based, no need to download anything, just type in the webadress and start building&lt;/li&gt;
&lt;li&gt;Tree view to easily view every widget on canvas at one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are some upcoming features?
&lt;/h2&gt;

&lt;p&gt;We'll there are many in fact. Right now, here's the priority.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support event handlers&lt;/li&gt;
&lt;li&gt;An inbuilt code editor to edit event handler code.&lt;/li&gt;
&lt;li&gt;Support for more widget.&lt;/li&gt;
&lt;li&gt;Add support for more 3rd party widgets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can go through the &lt;a href="https://github.com/PaulleDemon/PyUIBuilder/blob/main/roadmap.md" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; to know more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's were the challenges?
&lt;/h2&gt;

&lt;p&gt;Well there were a lot, among the hardest part was building the entire architecture, a lot of thinking went into building the data structure that would hold the elements, the other thing that I had struggled was finding good a drag and drop library.&lt;/p&gt;

&lt;p&gt;I had tried and experimented quite a number of library including dnd-kit, but most failed in my use case, so I had to write the dnd from scratch. &lt;/p&gt;

&lt;p&gt;Most of my challenges were creating the initial structure and base that can be scaled as per needs. &lt;/p&gt;

&lt;p&gt;Now that most of the hard part is complete, I'll be focusing more on bug fixes and work on the features on the roadmap.  &lt;/p&gt;

&lt;p&gt;If you want more insights, you can read my previous blog on how I started &lt;a href="https://dev.to/paul_freeman/i-made-webflow-but-for-python-ui-heres-how-i-built-it-3f7j"&gt;this&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked the project and want to support its ongoing development, make sure to star the repo :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PaulleDemon/PyUIBuilder" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star PyUiBuilder ⭐️&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>python</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>10 Awesome CSS text effects for your next project</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Mon, 17 Feb 2025 10:13:46 +0000</pubDate>
      <link>https://forem.com/paul_freeman/10-awesome-css-text-effects-for-your-next-project-39on</link>
      <guid>https://forem.com/paul_freeman/10-awesome-css-text-effects-for-your-next-project-39on</guid>
      <description>&lt;p&gt;Text is everywhere on the web, but that doesn’t mean it has to be boring. With just a little CSS, you can turn plain words into eye-catching elements that grab attention and make your design feel more alive and awesome. &lt;/p&gt;

&lt;p&gt;In this post, I’ll share 10 awesome CSS text effects for making your project stand out. &lt;/p&gt;

&lt;p&gt;You can view all the effects &lt;a href="https://font-tester.foxcraft.tech/text-effects" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.The Aurora
&lt;/h2&gt;

&lt;p&gt;The Aurora effect by Ostylowany creates a beautiful, glowing aurora-like gradient that flows across the text, giving it a dreamy and futuristic look. This effect is perfect for adding a soft, ethereal glow to headings, banners, or any text that needs a visually striking appearance.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/ostylowany/embed/vYzPVZL?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Split transition
&lt;/h2&gt;

&lt;p&gt;The split transition effect by ParkHJ11, creates a sleek hover animation where the outer text splits apart, revealing a hidden inner text beneath.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(hover on text)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/parkhj11/embed/oKpOwN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Outline offset
&lt;/h2&gt;

&lt;p&gt;The outline offset effect adds a visually distinct outline around the text, creating a layered or floating appearance. By adjusting the offset distance, you can achieve a subtle shadow-like effect or a bold, separated outline that enhances readability and style. This effect works great for titles, hover interactions, and highlighting key content.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/art-paul/embed/gbOpZEJ?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Dancing shadow
&lt;/h2&gt;

&lt;p&gt;This dancing shadow effect by Emadamerho Nefe, creates a lively animation where the text's shadow shifts dynamically in opposite diagonal directions. The shadows smoothly alternate between two colors, expanding and contracting to give the illusion of movement&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/nefejames/embed/XJrrPRj?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Folded Text
&lt;/h2&gt;

&lt;p&gt;The folded text effect by Mandy Michael makes your text look like it’s been carefully creased and folded, almost like paper. With clever shading and gradients, each letter gets a cool 3D look, adding depth and texture. It’s a great way to make headlines stand out or give your design a unique, hands-on feel.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/mandymichael/embed/BWyYYP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Reflect
&lt;/h2&gt;

&lt;p&gt;The Reflect by Chokcoco creates a sleek mirror-like reflection beneath the text, giving it a polished and futuristic look. The reflection subtly fades out, mimicking the way light interacts with a glossy surface. This effect is perfect for adding a modern, high-tech feel to titles, logos, or banners.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/art-paul/embed/mydJoXM?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Spring
&lt;/h2&gt;

&lt;p&gt;Spring effect by Piccalilli, make the letters pop out like a spring on hover, creating a fun and bouncy animation. The effect gives text a lively, interactive feel, making it great for playful headlines, buttons, or any design element that needs a bit of extra energy and movement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(hover text)&lt;/strong&gt;&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/piccalilli/embed/XWMWpzy?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Sliced
&lt;/h2&gt;

&lt;p&gt;The Sliced text effect by Shireen Taj makes it look like a ninja has swiftly sliced through the text, splitting it into two sharp-edged parts. The pieces subtly shift apart, adding a dramatic and dynamic feel, as if the cut just happened. &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/TajShireen/embed/ExLWgGb?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Hey
&lt;/h2&gt;

&lt;p&gt;The Hey text effect by Radu Bratan features a bold, animated shadow that continuously shifts, creating a dynamic popping effect. The shadow cycles through different positions, making the text appear as if it’s constantly bouncing or floating.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/RaduBratan/embed/vYLKNYO?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Fracture
&lt;/h2&gt;

&lt;p&gt;The Fracture text effect by Mandy Michael gives the illusion that the text has been cleanly sliced through the middle, with the upper half smoothly sliding to the left in a continuous loop. &lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/mandymichael/embed/pRXQZO?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Those were some of cool effect's you can try in your next project to make your project stand out.&lt;/p&gt;

&lt;p&gt;If you liked this, you can check the curated collection of text effects here &lt;/p&gt;

&lt;p&gt;&lt;a href="https://font-tester.foxcraft.tech/text-effects" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Text effects ⭐️&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Top 10 Essential chrome extensions for web design and development</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Sat, 01 Feb 2025 12:24:42 +0000</pubDate>
      <link>https://forem.com/paul_freeman/top-10-essential-chrome-extensions-for-web-design-and-development-4m1</link>
      <guid>https://forem.com/paul_freeman/top-10-essential-chrome-extensions-for-web-design-and-development-4m1</guid>
      <description>&lt;p&gt;Let’s face it, not all of us are born designers. But the good news is, you don’t need to be a design prodigy to create something amazing. With the right tools, even the most design-challenged among us can produce eye-catching visuals.&lt;/p&gt;

&lt;p&gt;So, here’s a curated list of Chrome extensions to help you improve your website design. Make sure to bookmark it!&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS Peeper
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CSS Inspector&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc78a48gv8m36snpdvqk3.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%2Fc78a48gv8m36snpdvqk3.png" alt="CSS peeper" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve ever wanted to quickly get all the metadata about a webpage, such as the fonts being used, the color palette, or even the spacing between elements, CSS Peeper is the perfect Chrome extension for you. It simplifies the process of inspecting a website’s design elements without diving into the code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/css-peeper/mbnbehikldjhnfehhnaidhjhoofhpehk" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get CSS Peeper&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What Font
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Font finder&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58s39x4m0031uzf900yf.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%2F58s39x4m0031uzf900yf.png" alt="What Font" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever wonder what fonts are used on a website? WhatFont makes it easy — just hover over text to see the font name and details like size, weight, and style. It even identifies web fonts like Google Fonts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/what-font-font-finder/opogloaldjiplhogobhmghlgnlciebin" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get What Font&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Font Tester
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Font testing tool&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1yk70y9s0urt2hosmw2a.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%2F1yk70y9s0urt2hosmw2a.png" alt="Font Tester" width="720" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it goes without a saying that texts make’s up 80% of the website and typography key role in shaping your design. If you ever want to present your customers with impactful website, try using the Font Tester tool to find which font works best for the project.&lt;/p&gt;

&lt;p&gt;Font Tester is a handy tool and comes with font identifier, custom font testing, 1000+ google fonts, live font comparison and can also generate the CSS code for the selected font. Plus, parts of Font tester are &lt;a href="https://github.com/PaulleDemon/font-tester-chrome" rel="noopener noreferrer"&gt;open-sourced&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/font-tester-preview-1000+/deachoodakeofjlfikfkohihnpcgiaim" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Font Tester&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen ruler
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Layout measurement&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47e8734jv6hdspiz9kon.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%2F47e8734jv6hdspiz9kon.png" alt="Screen ruler" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trying to measure something on your screen? Screen Ruler makes it easy. Drag it across your screen to check dimensions, spacing, or alignment in just a few clicks. It’s quick, simple, and super handy for designers and developers!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/screen-ruler-measure-the/jfbbgijjljfbolelfkopkhbfjajjampm" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Screen ruler&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile Simulator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Responsive checker&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiq72ta8dt3vnacoivz09.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%2Fiq72ta8dt3vnacoivz09.png" alt="Mobile Simulator" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This extension is must have for web developers who need to test their website’s responsiveness across various devices. They offer a wide range of Android and iPhone device frames, it allows you to preview your site exactly as it would appear on different screens.&lt;/p&gt;

&lt;p&gt;In addition to that you can take screenshots of the website along with the device frame in case you need to display the demo of your product&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/mobile-simulator-responsi/ckejmhbmlajgoklhgbapkiccekfoccmk" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Mobile simulator&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Color Zilla
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Color picker&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62uixpjra5f7q7bmzes1.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%2F62uixpjra5f7q7bmzes1.png" alt="Color Zilla" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever see a color online and wish you could grab it? ColorZilla makes it easy. Use the eyedropper to pick any color on your screen, copy its HEX or RGB code, and even check gradients. It’s a must-have for designers and anyone who loves playing with colors!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Color zilla&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Page Ruler
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Layout measurement&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9tm1388gdkme2c3auec.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%2Fn9tm1388gdkme2c3auec.png" alt="Page ruler" width="720" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Page Ruler is a handy extension for measuring pixel distances on a webpage. It creates a rectangular ruler as you move your mouse, displaying the width, height, start, and end points, all labeled in pixels. The rectangle resizes dynamically as you move, with all measurements updating in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/page-ruler/jcbmcnpepaddcedmjdcmhbekjhbfnlff" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Page ruler&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Perfect Pixel
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design Overlay&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmg9i6hr76jor1m6e78b.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%2Fpmg9i6hr76jor1m6e78b.png" alt="Perfect Pixel" width="720" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PerfectPixel helps designers achieve pixel-perfect accuracy by overlaying a semi-transparent image on a webpage. You can compare your design mockup with the live site, adjust opacity, and ensure every detail aligns perfectly. It’s a must-have for pixel perfectionists!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Perfect pixel&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Color Contrast Checker
&lt;/h2&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%2Fk27gf13w6oivgrtbt26m.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%2Fk27gf13w6oivgrtbt26m.png" alt="Color contrast" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Color Contrast Checker helps you ensure your text is readable by checking the contrast between foreground and background colors. It provides instant feedback on whether the color combination meets accessibility standards, making it essential for designers focused on inclusive design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/colour-contrast-checker/nmmjeclfkgjdomacpcflgdkgpphpmnfe" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Color contrast checker&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Muzli
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Design inspiration&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpfwz11uxhj8lq3qbvnn.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%2Fnpfwz11uxhj8lq3qbvnn.png" alt="Muzli" width="720" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muzli curates design inspiration from around the web, offering fresh ideas for UI, UX, and visual design. It’s perfect for kickstarting your creativity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/muzli-design-inspiration/glcipcfhmopcgidicgdociohdoicpdfc" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Muzli&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Those were top 10 chrome extensions for designers and frontend developers. Did I miss something? feel free to comment it :)&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Previewing and comparing fonts side-by-side directly on your website?</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Thu, 02 Jan 2025 14:51:23 +0000</pubDate>
      <link>https://forem.com/paul_freeman/previewing-and-comparing-fonts-directly-on-your-website-3c5e</link>
      <guid>https://forem.com/paul_freeman/previewing-and-comparing-fonts-directly-on-your-website-3c5e</guid>
      <description>&lt;p&gt;Hey all, &lt;/p&gt;

&lt;p&gt;Happy new year!&lt;/p&gt;

&lt;p&gt;If you have been following me, you'd know that I have been working on a typography extension that allows you to preview your fonts live for sometime now. &lt;/p&gt;

&lt;p&gt;Considering 80% of the website is just text, how you present your texts matters quite a lot. &lt;/p&gt;

&lt;p&gt;Recently I decided to add and test a new feature called "multi-font compare" that allows you to see your website in multiple different fonts and compare them side by side, allowing you to copy the code for the one you like easily.&lt;/p&gt;

&lt;p&gt;here's a demo on youtube (start at 0:19):&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/kQ9Ih4cIlmU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can try it out yourself &lt;a href="https://font-tester-demo.pages.dev/" rel="noopener noreferrer"&gt;here&lt;/a&gt; (PS: use desktop version to view this pls)&lt;/p&gt;

&lt;p&gt;The link to &lt;a href="https://font-tester.foxcraft.tech/" rel="noopener noreferrer"&gt;extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;let me know what you guys think of this new feature :)&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>frontend</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Hmmm. Just checking out the Twitter for devs</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Wed, 13 Nov 2024 09:23:35 +0000</pubDate>
      <link>https://forem.com/paul_freeman/hmmm-just-checking-out-the-twitter-for-devs-l5k</link>
      <guid>https://forem.com/paul_freeman/hmmm-just-checking-out-the-twitter-for-devs-l5k</guid>
      <description></description>
    </item>
    <item>
      <title>15 Essential tools and resources for Frontend developers ⚡️</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Thu, 07 Nov 2024 09:11:31 +0000</pubDate>
      <link>https://forem.com/paul_freeman/15-essential-tools-and-resources-for-frontend-developers-4jn4</link>
      <guid>https://forem.com/paul_freeman/15-essential-tools-and-resources-for-frontend-developers-4jn4</guid>
      <description>&lt;p&gt;So, you want to boost your productivity as a frontend developer.&lt;/p&gt;

&lt;p&gt;Whether you're looking for learning resources, productivity boosters, or curated directories, these picks are here to help you work smarter and level up your frontend skills. So, don't forget to save this list and share it with others who might find it helpful :)&lt;/p&gt;

&lt;p&gt;So, let's begin&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%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYW9zbmtobTU2bnAyZWdkc204djg1dGlhZmZzdW8zeDhjeTM4cnVkNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FxT8qBwa8pQjNXG7cJy%2Fgiphy.webp" 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%2Fmedia4.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYW9zbmtobTU2bnAyZWdkc204djg1dGlhZmZzdW8zeDhjeTM4cnVkNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FxT8qBwa8pQjNXG7cJy%2Fgiphy.webp" alt="Let us start" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. PureRef
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The inspiration management board&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F85a74r5ox7028r3yw44r.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%2F85a74r5ox7028r3yw44r.png" alt="Pureref" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PureRef is a reference management tool that lets you gather and organize all your visual inspiration in one place. With an infinite canvas, you can drag and drop images directly from the web or your files, arranging them freely to create a personal mood board or design reference. &lt;/p&gt;

&lt;p&gt;It's a must have for both designer's and developers. Its available for Mac, Linux and Windows&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.pureref.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Get Pure Ref&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  2. GSAP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Popular web Animation library&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqt74gcbeqrruw9egfaa.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%2Foqt74gcbeqrruw9egfaa.png" alt="GSAP" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GSAP is a popular JavaScript library that makes it easy to create smooth, high-performance animations on the web. It has a very intuitive API for developers, you can make use of this library to create simple to very complex animations easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gsap.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Get GSAP&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Font Tester
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Typography extension for webdevelopers&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3stkzgk5cd12710ut6kt.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%2F3stkzgk5cd12710ut6kt.png" alt="Font tester" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Font Tester is a powerful chrome extension that help you pick fonts for your website. It can help you test and preview 1000+ fonts on any website, helping you create a powerful perception about your brand via better typography. &lt;/p&gt;

&lt;p&gt;So, if you suck at picking good fonts for your website, make sure to check this out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://font-tester.foxcraft.tech/?ref=dev_blog" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Get Font Tester&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4. SVG Repo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Place to find SVG Vector and icons&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftnimxefprl0uql26lsrr.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%2Ftnimxefprl0uql26lsrr.png" alt="SVG repo" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SVG repo is a popular free site for finding and using SVG vectors, they have a collection of over 500,000 icons and vectors for you to choose from. All the icons are available for free for both personal and commercial projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.svgrepo.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit SVG Repo&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Color Hunt
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Curated color palette&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7inllccg6jc68ijik6f6.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%2F7inllccg6jc68ijik6f6.png" alt="Color hunt" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Color Hunt provides a curated collection of color palettes, ideal for web designers seeking fresh color combinations. Each palette is carefully crafted and community-approved, helping you find color schemes that fit your aesthetic without the guesswork.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://colorhunt.co/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit Color Hunt&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  6. CSS Gradient
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gradient generator&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsalgtdvrjcioxtlpr9f.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%2Fqsalgtdvrjcioxtlpr9f.png" alt="CSS gradient" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CSS Gradient is a simple yet powerful website for creating custom gradients with CSS. It offers an intuitive interface for selecting colors, setting angles, and adjusting stops, then generates the CSS code, ready to integrate into your project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cssgradient.io/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit CSS Gradients&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Awwwards
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Inspiration and top-rated designs&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fect4n053jka2ykjc54vn.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%2Fect4n053jka2ykjc54vn.png" alt="Awwwards" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awwwards is a website showcase platform for top-rated websites, highlighting excellence in design, creativity, and usability. It’s an excellent resource for web developers and designers to explore new trends, find inspiration and see how the best websites are crafted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.awwwards.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit Awwwards&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  8. LandBook
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Inspiration and top-rated designs&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgktbjfezg5gug04hjwh.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%2Fcgktbjfezg5gug04hjwh.png" alt="Land book" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LandBook is a curated gallery of beautiful, effective landing pages. It's a great source of inspiration for developers and designers, showcasing real-world examples of landing page design across different industries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://land-book.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit Landbook&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Screenity
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Screen recording and product recording&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr18dyn2anflrf7owen8.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%2Frr18dyn2anflrf7owen8.png" alt="Screenity" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenity is a powerful screen recording Chrome extension, offering features like annotating during recording, capturing camera and microphone input, and exporting recordings in different formats. It’s perfect for creating tutorials, bug reports, or walkthroughs, making it a great productivity tool for developers, educators, and remote teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://screenity.io/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Get Screenity&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  10. HTML REV
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Learning resource and templates&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faecjtnqak8l52ze2rxet.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%2Faecjtnqak8l52ze2rxet.png" alt="HTML Rev" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTML Rev is an extensive collection of over 1,500 free templates, including HTML, Bootstrap, Tailwind, React, Vue, Laravel, and more. It serves as both a valuable learning resource and a library of ready-made templates, so you don’t have to start from scratch every time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://htmlrev.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit HTML Rev&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Excalidraw
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Brainstorming&lt;/strong&gt;&lt;br&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%2F9pp6nasykgvy2jk4361y.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%2F9pp6nasykgvy2jk4361y.png" alt="Excalidraw" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excalidraw is an open-source, online whiteboard for sketching diagrams and layouts. Its hand-drawn style and intuitive tools make it perfect for brainstorming, flowcharting, or quickly mapping out ideas for web projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://excalidraw.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit Excalidraw&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Codepen
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Online editor&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmpj6ff7hyj9ldqs4qji.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%2Flmpj6ff7hyj9ldqs4qji.png" alt="Code pen" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CodePen is an online code editor for HTML, CSS, and JavaScript, allowing developers to create, share, and explore front-end projects. It offers real-time previews and a strong community for feedback and inspiration. Ideal for prototyping and learning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit CodePen&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  13. BrowserStack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cross browser testing tool&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fndd6c42ccushie0uxh7r.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%2Fndd6c42ccushie0uxh7r.png" alt="Browser Stack" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BrowserStack is a popular browser testing tool, it provides cross-browser testing on real devices, helping developers test website compatibility across various browsers and operating systems without the need for a physical lab. It’s a go-to for ensuring consistent user experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.browserstack.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit BrowserStack&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  14. CSS-Tricks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Learning resource&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvjg4n2e0vhqqq3dcwc6.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%2Fbvjg4n2e0vhqqq3dcwc6.png" alt="Css tricks" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CSS-Tricks is a blog and reference site filled with tutorials, articles, and snippets on CSS and front-end development. It’s a valuable resource for staying up-to-date with new techniques and finding quick solutions for CSS challenges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://css-tricks.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit CSS-Tricks&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Smashing Magazine
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Learning resource and blog&lt;/strong&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6n8hkkj4fizf4j4r3cm.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%2Fz6n8hkkj4fizf4j4r3cm.png" alt="Smashing Magazine" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smashing Magazine is a popular online publication for web designers and developers, offering articles, tutorials, and resources on design, development, and UX. It’s known for high-quality, in-depth content that appeals to industry professionals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.smashingmagazine.com/" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;⭐️ Visit Smashing Magazine&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;So, those where some 15 most useful tools and resources I have used as a developer. Go ahead and comment your favourite.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Change the way you design. Learn Typography</title>
      <dc:creator>Paul</dc:creator>
      <pubDate>Wed, 06 Nov 2024 12:49:28 +0000</pubDate>
      <link>https://forem.com/paul_freeman/learn-typography-and-change-the-way-you-design-3714</link>
      <guid>https://forem.com/paul_freeman/learn-typography-and-change-the-way-you-design-3714</guid>
      <description>&lt;p&gt;If you want to change the way your website and brand is perceived, it's not too hard.&lt;/p&gt;

&lt;p&gt;A website isn't just about colors and color pallets, it's also how you present the information to your visitors, Typefaces and fonts can change the way your brand is perceived. It can tell a lot about you and your brand. However, with an overwhelming variety of typefaces available, it’s easy to feel lost.&lt;/p&gt;

&lt;p&gt;By the end of the blog, you’ll learn the difference between Typography, Typeface, Fonts and learn when to use which fonts. &lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Plus, if you stay till the end, I’ll share a secret tool that can simplify selecting your web fonts.&lt;/p&gt;

&lt;p&gt;So, make sure to bookmark it and like it so it can reach others :)&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%2Fbhdp42twlqtzahkkjhne.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%2Fbhdp42twlqtzahkkjhne.png" alt="Typography facts" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  So, what is Typography?
&lt;/h2&gt;

&lt;p&gt;Typography is simply arranging text in a visually effective way, which includes selecting fonts but also involves adjusting spacing, alignment, hierarchy, and other elements to enhance readability and aesthetics.&lt;/p&gt;
&lt;h2&gt;
  
  
  Typography Vs Typefaces Vs Fonts, what’s the difference?
&lt;/h2&gt;

&lt;p&gt;First thing to keep in mind is that Typography is not Fonts.&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%2Fmtnk7s7yksro10s0ysa0.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%2Fmtnk7s7yksro10s0ysa0.png" alt="Typography vs typeface" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typography is a broader art encompassing typefaces and fonts, focusing on elements like line spacing, letter spacing, alignment, and layout to create visually appealing and readable text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typeface:&lt;/strong&gt; Typeface is the overall design or the style of the character, for example, Times New Roman is a Typeface, Helvetica is a different Typeface&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonts:&lt;/strong&gt; Fonts are a subset of fonts, e.g. Times New Roman, Bold, 12px is a typeface&lt;/p&gt;
&lt;h2&gt;
  
  
  Typefaces
&lt;/h2&gt;

&lt;p&gt;Typefaces are broadly classified into two categories, Serif and Sans-Serif (aka without serif). Serif fonts have something called foot or lines as shown in the below 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ep1kq3dij03i10fpn25.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%2F7ep1kq3dij03i10fpn25.png" alt="Type faces" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Quick Exercise
&lt;/h3&gt;

&lt;p&gt;Now that you have learnt the difference, take a moment and tell us which typeface the Dev.to logo is using. Is it Serif or Sans-Serif? let me know in the comments.&lt;/p&gt;
&lt;h2&gt;
  
  
  Everything about Serif
&lt;/h2&gt;

&lt;p&gt;This section we’ll see when to use serif fonts and brands using the serif fonts&lt;/p&gt;
&lt;h3&gt;
  
  
  So, when should I use Serif fonts?
&lt;/h3&gt;

&lt;p&gt;Serif fonts are ideal for print media, Headings, Luxury items.&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%2Fyve8nezkm1ju0w4w9jgh.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%2Fyve8nezkm1ju0w4w9jgh.png" alt="Serif fonts" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ✨ Brands using Serif
&lt;/h3&gt;

&lt;p&gt;Here are some popular brands using Serif fonts in their logo.&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%2Ftfetcja1zpga66c2cy3w.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%2Ftfetcja1zpga66c2cy3w.png" alt="Brands using Serif" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Everything about Sans-Serif
&lt;/h2&gt;

&lt;p&gt;Now let’s talk about Sans-serif, also referred as without Serif.&lt;/p&gt;
&lt;h3&gt;
  
  
  When should I use Sans-Serif?
&lt;/h3&gt;

&lt;p&gt;Sans-serif are said to be more readable in digital devices such as computers, smart phones and more. So, if you want something more minimalistic, modern go with Sans-serif fonts.&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%2F1w3w04f3bh4jzxs0jprg.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%2F1w3w04f3bh4jzxs0jprg.png" alt="when to use Sans serif" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ✨ Brands using Sans-Serif
&lt;/h3&gt;

&lt;p&gt;You’ll see Sans-serif more popular among Tech companies. It’s used to give a modern and minimalistic perception.&lt;/p&gt;

&lt;p&gt;Some popular brands using Sans-serif logo include Apple, Spotify.&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%2F9scejcqeqt842tfhpi4c.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%2F9scejcqeqt842tfhpi4c.png" alt="Brands using sans-serif" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Here's a fun fact
&lt;/h2&gt;

&lt;p&gt;Popular Tech companies such as Google, Spotify and Yahoo changed their logo from Serif to Sans-Serif&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%2Fvsl3e6cttxrmyfbmstc7.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%2Fvsl3e6cttxrmyfbmstc7.png" alt="Google tech" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google logo using serif and then switching to sans-serif&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%2Fqegv2aahj8fhtgtfg0ks.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%2Fqegv2aahj8fhtgtfg0ks.png" alt="Yahoo using sans-serif" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same in the case of Yahoo&lt;/p&gt;
&lt;h2&gt;
  
  
  The secret Extension
&lt;/h2&gt;

&lt;p&gt;So, now that you have read till here, you have obviously understood the importance of Typefaces and Fonts and the impact it can have on your brand.&lt;/p&gt;

&lt;p&gt;You definitely want a tool that can make it easier for you to pick and test fonts on any website.&lt;/p&gt;

&lt;p&gt;So let me introduce you to &lt;a href="https://font-tester.foxcraft.tech" rel="noopener noreferrer"&gt;Font Tester&lt;/a&gt;, a very powerful chrome extension that can help you test, preview and find fonts on any webpage. It comes with 1000+ pre-installed Google fonts, plus, you can upload and test your local fonts and copy the code for the fonts directly from the modal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://font-tester.foxcraft.tech" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Get Font Tester 🔥&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfiiadid01524cl4i81e.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%2Fgfiiadid01524cl4i81e.png" alt="Font tester" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thank you for reading. If you liked it make sure to share it. Oh! and don’t forget to tell us about your favourite font in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>frontend</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
