<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bilal Malik</title>
    <description>The latest articles on DEV Community by Bilal Malik (@bilalmlkdev).</description>
    <link>https://dev.to/bilalmlkdev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3960897%2F905216a6-54fb-4549-877f-cfd4ea7792c0.png</url>
      <title>DEV Community: Bilal Malik</title>
      <link>https://dev.to/bilalmlkdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bilalmlkdev"/>
    <language>en</language>
    <item>
      <title>Gridzzly: The Interactive React App That Writes CSS Grid for You</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Sun, 14 Jun 2026 17:36:29 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/gridzzly-the-interactive-react-app-that-writes-css-grid-for-you-1omk</link>
      <guid>https://dev.to/bilalmlkdev/gridzzly-the-interactive-react-app-that-writes-css-grid-for-you-1omk</guid>
      <description>&lt;p&gt;CSS Grid is one of the most powerful layout systems ever created. But let's be honest - remembering &lt;code&gt;grid-template-columns&lt;/code&gt;, &lt;code&gt;grid-area&lt;/code&gt;, and all those line numbers can be a headache, especially when you're just trying to prototype an idea.&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Gridzzly&lt;/strong&gt; - a visual playground where you &lt;strong&gt;click and drag&lt;/strong&gt; to create grid items, edit track sizes in real time, and export production‑ready HTML/CSS with one click.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gridzzly.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/byllzz/gridzzly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (open source)&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%2Fi91kp1hf8vq5tpatcx04.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%2Fi91kp1hf8vq5tpatcx04.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What Makes Gridzzly Different?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visual Drawing - Click and drag across the grid. Release to create a new grid item. No writing &lt;code&gt;grid-row&lt;/code&gt; or &lt;code&gt;grid-column&lt;/code&gt; manually.&lt;/li&gt;
&lt;li&gt;Live Track Editing - Edit column/row sizes directly in inputs above the grid. Use &lt;code&gt;1fr&lt;/code&gt;, &lt;code&gt;auto&lt;/code&gt;, &lt;code&gt;200px&lt;/code&gt;, &lt;code&gt;minmax()&lt;/code&gt; - anything CSS Grid supports.&lt;/li&gt;
&lt;li&gt;Instant Code Export - Switch between CSS and HTML tabs, copy the code, and paste it into your project.&lt;/li&gt;
&lt;li&gt;Built‑in Templates &amp;amp; Random Generator - Stuck? Load a preset or hit "Random Pattern" for instant inspiration.&lt;/li&gt;
&lt;li&gt;Overlapping Items - Place items on top of each other (great for magazine‑style layouts).&lt;/li&gt;
&lt;li&gt;Dark Theme - Easy on the eyes for long coding sessions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How It Works (Under the Hood)
&lt;/h2&gt;

&lt;p&gt;The entire app is built with &lt;strong&gt;React&lt;/strong&gt; and &lt;strong&gt;Tailwind CSS&lt;/strong&gt;. The core logic lives inside a custom hook: &lt;code&gt;useGridGenerator.js&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Grid State
&lt;/h3&gt;

&lt;p&gt;We store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Number of columns/rows&lt;/li&gt;
&lt;li&gt;Gap values (in pixels)&lt;/li&gt;
&lt;li&gt;Column/row size strings (e.g., &lt;code&gt;['1fr', '2fr', '1fr']&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Placed items: each item is an object &lt;code&gt;{ id, rStart, cStart, rEnd, cEnd }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Drawing Mechanism
&lt;/h3&gt;

&lt;p&gt;When the user mouses down on a cell, we start tracking the starting row/column. On mouse move, we calculate the &lt;strong&gt;rectangle&lt;/strong&gt; between the start and current cell, highlight all cells, and show a live badge (&lt;code&gt;3 cols × 2 rows&lt;/code&gt;). On mouse up, we create a new item and reset the selection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified from useGridGenerator.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startDrawing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&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;setIsDrawing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;setStartCell&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;setHighlightedCells&lt;/span&gt;&lt;span class="p"&gt;([{&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&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;updateDrawing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isDrawing&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;startCell&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;row&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;rMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;row&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;cMin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&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;cMax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;startCell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;col&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// highlight all cells from rMin..rMax, cMin..cMax&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Code Generation
&lt;/h3&gt;

&lt;p&gt;Every time the grid or items change, we generate fresh CSS + HTML. We even compress consecutive identical track sizes into repeat():&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;css&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Instead of: */&lt;/span&gt;
&lt;span class="nt"&gt;grid-template-columns&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;fr&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;fr&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;fr&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c"&gt;/* We output: */&lt;/span&gt;
&lt;span class="nt"&gt;grid-template-columns&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;repeat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The generated HTML uses simple div elements with classes like .div1, .div2, and a .parent container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Usage Guide
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a grid item: Click and drag across empty cells → release&lt;/li&gt;
&lt;li&gt;Delete an item: Hover the item → click the × Resize a track: Click&lt;/li&gt;
&lt;li&gt;the input above the grid (e.g., 1fr) → type a new value Change grid&lt;/li&gt;
&lt;li&gt;Scroll through "Grid Patterns" → click any preview Random layout:&lt;/li&gt;
&lt;li&gt;Click Random Grid Pattern Export code: Click Please May I have Some&lt;/li&gt;
&lt;li&gt;Code → copy CSS or HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I've taught CSS Grid to many developers, and the hardest part is always the mental model of grid lines and spanning. I wanted a tool that gives immediate visual feedback while generating real, copy‑pastable code – no vendor lock‑in, no weird abstractions. Just vanilla CSS Grid.&lt;/p&gt;

&lt;p&gt;Whether you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning CSS Grid for the first time, &lt;/li&gt;
&lt;li&gt;Prototyping a dashboard layout,&lt;/li&gt;
&lt;li&gt;Or building a complex magazine‑style design,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gridzzly helps you see what you're building and export it instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributions Welcome
&lt;/h2&gt;

&lt;p&gt;Found a bug? Have an idea for a feature? Open an issue or a pull request. The project is MIT licensed, so feel free to fork and build your own version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Connect
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/byllzz/gridzzly" rel="noopener noreferrer"&gt;@byllzz&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/bilalmlkdev" rel="noopener noreferrer"&gt;@bilalmlkdev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you found this useful, please ❤️ the post and share it with your network.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Happy Gridding! 🎉&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>product</category>
      <category>tooling</category>
    </item>
    <item>
      <title>AI is writing our JS now. Are we becoming prompt engineers or losing real engineering skills?</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Fri, 12 Jun 2026 04:26:48 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/ai-is-writing-our-js-now-are-we-becoming-prompt-engineers-or-losing-real-engineering-skills-5cd9</link>
      <guid>https://dev.to/bilalmlkdev/ai-is-writing-our-js-now-are-we-becoming-prompt-engineers-or-losing-real-engineering-skills-5cd9</guid>
      <description>&lt;p&gt;I’ll be honest: I’ve been a frontend dev for years. I used to pride myself on knowing the weird corners of JavaScript - closures, prototypal inheritance, event loop nuances.&lt;/p&gt;

&lt;p&gt;Then Copilot entered my editor.&lt;/p&gt;

&lt;p&gt;Today, I barely write &lt;code&gt;Array.reduce&lt;/code&gt; from memory. I type a comment like &lt;code&gt;// group users by age&lt;/code&gt; and the AI does it. Perfectly. In seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The moment I felt stupid&lt;/strong&gt;&lt;br&gt;
I pasted an AI-generated function that fetched data with retry logic. It worked. Tests passed. I deployed.&lt;/p&gt;

&lt;p&gt;Two days later, a bug appeared: retries happened even on 4xx errors (which should fail immediately). A junior dev on my team spotted it. I hadn’t even read the retry condition carefully.&lt;/p&gt;

&lt;p&gt;I realised: I’m not debugging my code anymore. I’m debugging AI-generated code that I don’t fully understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So let’s stop pretending&lt;/strong&gt;&lt;br&gt;
We all use AI now. But are we growing or just getting faster at shipping bugs?&lt;/p&gt;

&lt;p&gt;Here’s what I genuinely want to know from this community:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Three real questions (please pick one to answer):&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;1. What’s the last non-trivial JS concept you had to actually learn (not just prompt) because AI failed you?&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
For me: &lt;code&gt;AbortController&lt;/code&gt; with complex race conditions. AI kept giving me broken examples.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;2. If I take away your AI autocomplete for a week, do you think your raw JS skill would feel the same, weaker, or… stronger?&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Be honest - no one’s judging (yet).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;3. Have you ever caught AI writing code that was confidently wrong in a way a human junior wouldn’t be?&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Example: AI using &lt;code&gt;==&lt;/code&gt; when &lt;code&gt;===&lt;/code&gt; was critical, or mutating props directly in React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The “big” claim I’ll defend in comments:&lt;/strong&gt;&lt;br&gt;
“By 2027, the biggest differentiator between senior and mid-level JS devs won’t be framework knowledge - it’ll be the ability to debug, refactor, and secure AI-generated code without introducing new bugs.”&lt;/p&gt;

&lt;p&gt;Do you agree? Disagree? Think I’m overreacting?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let’s make this useful&lt;/strong&gt;&lt;br&gt;
Upvote if you’ve ever merged AI code that you didn’t 100% understand.&lt;br&gt;
Downvote if you review every AI suggestion line-by-line like it’s a code review from hell.&lt;/p&gt;

&lt;p&gt;Then drop a comment with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your most recent “AI saved my day” story&lt;/li&gt;
&lt;li&gt;Or your most recent “AI almost burned production” story&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No middle ground. Let’s get loud.&lt;/p&gt;

&lt;p&gt;It feels amazing. But last week, something scared me&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Glyphic: A Browser-Based Typography Design Tool</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Thu, 11 Jun 2026 06:07:27 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/glyphic-a-browser-based-typography-design-tool-1m25</link>
      <guid>https://dev.to/bilalmlkdev/glyphic-a-browser-based-typography-design-tool-1m25</guid>
      <description>&lt;p&gt;Typography tools have always asked too much. An account here, a subscription there, a desktop app that takes 3 minutes to open. All you wanted was to write something and make it look good.Glyphic is a typography-first design workspace that runs entirely in your browser. Write content, style selected text, apply curated themes, adjust spacing, and export high-resolution images - no accounts, no uploads, no setup required. Everything stays on your device.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://useglyphic.vercel.app" rel="noopener noreferrer"&gt;Try it live →&lt;/a&gt; | &lt;a href="https://github.com/byllzz/Glyphic" rel="noopener noreferrer"&gt;View on GitHub →&lt;/a&gt; (MIT licensed, open source)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Editing&lt;/strong&gt;&lt;br&gt;
Glyphic uses a live canvas preview that updates in real time as you type and format. The rich text toolbar applies formatting only to selected text, giving you precise control over individual words, lines, or paragraphs.&lt;/p&gt;

&lt;p&gt;Supported formatting actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bold, Italic, Underline, Strikethrough&lt;/li&gt;
&lt;li&gt;Headings&lt;/li&gt;
&lt;li&gt;Ordered and unordered lists&lt;/li&gt;
&lt;li&gt;Case transforms - uppercase, lowercase, title case&lt;/li&gt;
&lt;li&gt;Per-selection font sizing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Typography Controls&lt;/strong&gt;&lt;br&gt;
Fine-tune how your text sits on the canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20+ Google Fonts spanning serif, sans-serif, monospace, and handwriting&lt;/li&gt;
&lt;li&gt;Line height, letter spacing, word spacing&lt;/li&gt;
&lt;li&gt;Internal padding&lt;/li&gt;
&lt;li&gt;Drop caps - Standard, Large, and Huge variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Theme System&lt;/strong&gt;&lt;br&gt;
Glyphic ships with 25+ curated themes across a range of styles: serif editorial, sans-serif minimal, monospace terminal, vintage, code block, and more.&lt;/p&gt;

&lt;p&gt;Every theme supports full color overrides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Background color&lt;/li&gt;
&lt;li&gt;Text color&lt;/li&gt;
&lt;li&gt;Texture intensity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Creative Tools&lt;/strong&gt;&lt;br&gt;
Kaomoji Library - Insert expressive text emoticons at cursor position. (｡◕‿◕｡)&lt;br&gt;
Decorative Elements - Add inline decorative characters: dividers, bullets, stars, hearts, arrows, notes.&lt;br&gt;
Paper Texture - A slider from 0% (clean) to 100% (heavy grain and noise) adds a physical feel to the canvas without affecting export quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Viewports&lt;/strong&gt;&lt;br&gt;
Switch between preset canvas dimensions to design for different contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social media&lt;/li&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;li&gt;Mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Themes are applied, previewed, and overridden non-destructively. Export-time overrides are independent from the editor canvas - what you see while editing and what you export can be two completely different things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Export&lt;/strong&gt;&lt;br&gt;
Glyphic supports PNG and SVG export directly from the browser. Export-time color overrides allow you to customize output independently from the editor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PNG Export scales up to 4320 × 4320 - available at 2×, 3×, and 4× depending on the resolution you need.&lt;/li&gt;
&lt;li&gt;SVG Export produces vector output that is print-ready and editable in Figma, Illustrator, Inkscape, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Keyboard Shortcuts&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Ctrl + B&lt;/code&gt; for Bold, &lt;code&gt;Ctrl + I&lt;/code&gt; for Italic, &lt;code&gt;Ctrl + U&lt;/code&gt;for Underline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;br&gt;
Glyphic is structured around three primary layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input → Text Toolbar → Formatting Engine
    → Canvas Renderer → Theme System
        → Export Module → PNG / SVG Output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Canvas Layer - Handles rendering, typography, textures, themes, and viewport dimensions.&lt;/li&gt;
&lt;li&gt;Theme Layer - Manages theme presets, color overrides, random theme generation, and color state.&lt;/li&gt;
&lt;li&gt;Export Layer - Powered by html-to-image. Handles PNG scaling, SVG generation, and export-time color overrides.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Component Reference&lt;/strong&gt;&lt;br&gt;
Canvas renders typography. TextToolbar handles formatting actions. Themes manages the theme gallery. ThemeColors powers the custom color picker. ViewPorts controls canvas dimensions. FontSelector and FontSize handle font selection and sizing. LineHeight and Padding manage spacing. DropCap applies editorial drop cap styling. KaomojiSelector handles kaomoji insertion. Decorations manages decorative elements. ExportOptions runs the export pipeline. Navbar handles global actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
Prerequisites: Node.js v18+ and npm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/glyphic.git
cd glyphic
npm install
npm run dev        # Start dev server
npm run build      # Production build
npm run preview    # Preview production build locally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API keys. No environment variables. Everything runs locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy&lt;/strong&gt;&lt;br&gt;
Glyphic is fully local-first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No accounts required&lt;/li&gt;
&lt;li&gt;No tracking or analytics&lt;/li&gt;
&lt;li&gt;No content uploads&lt;/li&gt;
&lt;li&gt;Exports generated entirely in your browser&lt;/li&gt;
&lt;li&gt;Nothing leaves your device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contributing&lt;/strong&gt;&lt;br&gt;
Contributions are welcome. The most useful areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Themes - Add or modify theme presets in src/data/themes.js&lt;/li&gt;
&lt;li&gt;Fonts - Add or modify available fonts in src/data/fonts.js&lt;/li&gt;
&lt;li&gt;Other areas - Accessibility, export (PDF support, batch exports), mobile touch refinements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Workflow: Fork → feature branch → develop → commit with Conventional Commits → open a PR with screenshots for any UI changes.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If Glyphic saved you from opening Canva or firing up Figma for something simple, a ⭐ on &lt;a href="https://github.com/byllzz/Glyphic" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2Fp54ndu8uuufaxh7tv717.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%2Fp54ndu8uuufaxh7tv717.png" alt="glyphic preview" width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
What feature would you want to see in Glyphic next? Drop it in the comments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Moviio: The Cinematic Movie Carousel</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:52:52 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/moviio-the-cinematic-movie-carousel-14i</link>
      <guid>https://dev.to/bilalmlkdev/moviio-the-cinematic-movie-carousel-14i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Moviio: Movie Discovery That Feels Like Theater&lt;/strong&gt;&lt;br&gt;
Scrolling through Netflix lists feels like drowning in options. You want discovery, not a catalog. You want motion, not static tiles. You want to watch a trailer right now, not hunt for the YouTube link.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moviio&lt;/strong&gt; is a movie discovery app powered by TMDB. Browse popular, top-rated, and upcoming movies in a smooth 3D cinematic carousel. Drag, swipe, or use arrow keys to move through seven cards at a time. Search instantly with debounce - no page reloads, just fluid filtering. Tap a movie and watch the official trailer in fullscreen with YouTube's no-cookie embed.&lt;/p&gt;

&lt;p&gt;The carousel is custom-built with GPU-optimized transforms, no heavy carousel library. Preloads the next batch of movies so scrolling feels instant. Infinite pagination means you never hit a wall. All interactions happen client-side. TMDB API calls go through a serverless proxy for speed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://moviio.vercel.app" rel="noopener noreferrer"&gt;Try it live →&lt;/a&gt; &lt;br&gt;
&lt;a href="https://github.com/byllzz/moviio" rel="noopener noreferrer"&gt;View on GitHub →&lt;/a&gt; (MIT licensed, open source)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Design Problem Solved&lt;/strong&gt;&lt;br&gt;
Most movie apps are grids. Grids are fast to load and cheap to build. They're also boring. Moviio flips the model - seven cards visible at once, cinematic layout, smooth drag-and-drop navigation that feels responsive because it uses translate3d transforms rendered on the GPU, not the main thread.&lt;/p&gt;

&lt;p&gt;Trailers load dynamically and play in a fullscreen overlay that feels like a theater experience. Auto-quality playback scales from HD to 4K. Search results cache client-side so repeat searches are instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Get&lt;/strong&gt;&lt;br&gt;
Filter tabs for Popular, Top-Rated, and Upcoming with an animated indicator that moves smoothly between them. Drag on desktop, swipe on mobile, keyboard arrows for accessibility - every input method works perfectly. Movie metadata displays rating, release year, language, and type. No accounts. No tracking. No backend UI complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/moviio.git
&lt;span class="nb"&gt;cd &lt;/span&gt;moviio
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add your TMDB API key to .env:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;VITE_TMDB_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your_key_here&lt;/span&gt;
&lt;span class="err"&gt;bashnpm&lt;/span&gt; &lt;span class="err"&gt;run&lt;/span&gt; &lt;span class="err"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. The serverless API proxy handles TMDB calls securely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;br&gt;
React for components. Custom carousel engine with zero carousel libraries. TMDB API for movie data. YouTube IFrame API for trailers. Tailwind CSS for styling. GPU-optimized transforms for motion. Vercel for deployment.&lt;/p&gt;

&lt;p&gt;If Moviio helped you discover your next favorite film, a ⭐ on &lt;a href="https://github.com/byllzz/moviio" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2F827k77hwuqxx8zwhjce1.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%2F827k77hwuqxx8zwhjce1.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
What's the coolest movie you discovered on Moviio? Drop it in the comments ..&lt;/p&gt;

</description>
      <category>movies</category>
      <category>javascript</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Asciiara: Transform Text Into 35+ Hand-Crafted ASCII Fonts</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:44:04 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/asciiara-transform-text-into-35-hand-crafted-ascii-fonts-3k1l</link>
      <guid>https://dev.to/bilalmlkdev/asciiara-transform-text-into-35-hand-crafted-ascii-fonts-3k1l</guid>
      <description>&lt;p&gt;&lt;strong&gt;Asciiara: Transform Text Into 35+ Hand-Crafted ASCII Fonts&lt;/strong&gt;&lt;br&gt;
Ever wanted your terminal to scream? To look like 1980s arcade art or a glitched-out matrix dream? ASCII art died around 2005 but somehow it never stayed dead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asciiara&lt;/strong&gt; transforms plain text into stunning hand-crafted ASCII and Unicode fonts. 35+ custom fonts across five style groups - Artistic (Epic, Graffiti, Isometric, Glitch, Matrix), Classic ASCII (Big, Blocky, Shadow, Wave), Stylized (Script, Gothic, Braille), Structured (Circuit, Neon, Typewriter), and Text Styles for tweaking case and formatting.&lt;/p&gt;

&lt;p&gt;Apply 28+ creative filters on top. Chromatic aberration, rainbow gradients, flip vertically or horizontally, strikethrough, underline, or wrap in code comment syntax for bash, Python, SQL, JSON, you name it. Test every font in a gallery view. Export as high-quality PNG. All in the browser, no backend, no accounts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciiara.vercel.app" rel="noopener noreferrer"&gt;Try it live →&lt;/a&gt; | &lt;a href="https://github.com/byllzz/asciiara" rel="noopener noreferrer"&gt;View on GitHub →&lt;/a&gt; (MIT licensed, open source)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;br&gt;
Every font is hand-authored - no stealing from figlet or external ASCII libraries. Multi-line character grids, box-drawing matrices, Unicode glyph maps, all written by hand. The engine uses O(1) lookups so text transforms instantly, no lag, no heavy library overhead.&lt;/p&gt;

&lt;p&gt;The filter system is modular. Stacking a rainbow gradient, flip horizontally, and bash comment syntax happens in real-time. State persists to localStorage so your drafts survive page refreshes. Image generation injects theme-aware backgrounds and captures the DOM for perfect PNG exports.&lt;/p&gt;

&lt;p&gt;100% client-side. Zero network latency. Zero tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responsive Everywhere&lt;/strong&gt;&lt;br&gt;
Keyboard, mouse, or touch - the interface adapts. Light and dark themes with seamless transitions. 1-click copy to clipboard. Native browser sharing. The carousel of fonts scrolls smoothly, previewing every style instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/asciiara.git
&lt;span class="nb"&gt;cd &lt;/span&gt;asciiara
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. No API keys. No environment variables. Everything runs locally.&lt;/p&gt;

&lt;p&gt;If Asciiara turned your boring text into glitched-out art, a ⭐ on &lt;a href="https://github.com/byllzz/asciiara" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2Fpmbuwl64edflv4kwngkv.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%2Fpmbuwl64edflv4kwngkv.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
What's your favorite ASCII font? Drop it in the comments &lt;/p&gt;

</description>
      <category>textart</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>webtools</category>
    </item>
    <item>
      <title>PaletteSnap: Digitizing a 1930s Japanese Color Masterpiece with 162 Traditional Pigments.</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:38:51 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/palettesnap-digitizing-a-1930s-japanese-color-masterpiece-with-162-traditional-pigments-357a</link>
      <guid>https://dev.to/bilalmlkdev/palettesnap-digitizing-a-1930s-japanese-color-masterpiece-with-162-traditional-pigments-357a</guid>
      <description>&lt;p&gt;&lt;strong&gt;PaletteSnap: Wada Sanzō's 1930s Color Archive, Digitized&lt;/strong&gt;&lt;br&gt;
Color theory died in the 1930s in Japan and nobody told the web it was supposed to stay dead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PaletteSnap&lt;/strong&gt; is a digital archive of Wada Sanzō's seminal Dictionary of Color Combinations — a masterpiece of early 20th-century color study. 162 traditional Japanese pigments, historical color harmonies mapped across 2-color, 3-color, and 4-color plates, and the exact proportional weights from the original print. Brought to the browser with archival precision and monumental typography.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://palettesnap.vercel.app" rel="noopener noreferrer"&gt;Explore it live →&lt;/a&gt; | &lt;a href="https://github.com/byllzz/palettesnap" rel="noopener noreferrer"&gt;View on GitHub →&lt;/a&gt; (MIT licensed, open source)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You're Exploring&lt;/strong&gt;&lt;br&gt;
Immerse yourself in 162 individual pigments — each one a piece of Japanese color history. Every pigment shows its hex value, auto-converts to RGB and CMYK, and displays proportional weight bars so you understand the exact balance intended in the original 1930s designs.&lt;/p&gt;

&lt;p&gt;Then there are the Plates — historical color harmonies mapped directly from Wada's originals. Two-color combinations for restraint. Three-color for complexity. Four-color for boldness. Real color theory from nearly a century ago, still relevant because math doesn't age.&lt;/p&gt;

&lt;p&gt;Search by pigment name, hex code, or color family. Real-time filtering. Smart UI that never gets buried — mix-blend-mode ensures navigation stays visible no matter what color intensity you're viewing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Design Problem Solved&lt;/strong&gt;&lt;br&gt;
Most color tools are bright white interfaces with a small color swatch. PaletteSnap flips it. The entire background becomes the pigment itself. Navigation uses mix-blend-difference to maintain legibility across any color intensity automatically. You're immersed in color, not staring at it through a window.&lt;/p&gt;

&lt;p&gt;Typography is editorial — Playfair Display in serif italics, using CSS clamp for fluid scaling. It feels like holding a premium art book, not clicking buttons on a generic web app. The aesthetic matters when you're preserving history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responsive Everywhere&lt;/strong&gt;&lt;br&gt;
Fluid grid layout optimizes for mobile and desktop without compromise. Full-screen color immersion on any device. Custom ghost scrollbar blends seamlessly with whatever pigment you're viewing. The UI dissolves into the experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture&lt;/strong&gt;&lt;br&gt;
React 19 with TypeScript handles the component layer. React Router manages navigation between pigments and plates. Tailwind CSS v4 provides utility styling, with inline styles for the monumental color backgrounds - Tailwind's JIT can't handle real-time color injection, so the engine bypasses it entirely by injecting variables directly into the DOM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framer Motion&lt;/strong&gt; smooths transitions. The harmony engine analyzes color plates to display precise weight distribution from the originals — not guessed proportions, but historically accurate balances.&lt;/p&gt;

&lt;p&gt;All color data lives in a structured JSON database mapping Wada Sanzō's exact hex values and nomenclature from the Dictionary of Color Combinations. Archival fidelity built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/palettesnap.git
&lt;span class="nb"&gt;cd &lt;/span&gt;palettesnap
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. No environment variables needed.&lt;/p&gt;

&lt;p&gt;For production:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashnpm run build
npm run preview
Type checking and linting:
bashnpm run type-check
npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;br&gt;
React 19 for components. React Router v7 for navigation. TypeScript for type safety (currently being migrated across components). Tailwind CSS v4 for utilities. Framer Motion for animations. Vite for fast builds. Vercel for deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contribute&lt;/strong&gt;&lt;br&gt;
The TypeScript migration is in progress - components are being converted from JSX to TSX with proper type interfaces. Check src/types/index.ts for existing interfaces. Add new components as .tsx files with proper prop typing.&lt;/p&gt;

&lt;p&gt;Other good contributions: expand the pigment database, add new historical plates, improve accessibility with keyboard navigation and screen reader support, optimize the mix-blend-mode contrast logic, or enhance the search algorithm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/your-amazing-feature
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: your description"&lt;/span&gt;
git push origin feature/your-amazing-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Exists&lt;/strong&gt;&lt;br&gt;
Wada Sanzō's Dictionary of Color Combinations is one of the most important color theory texts ever published. It deserved to be lost to history in a library basement. Instead, PaletteSnap preserves it digitally with archival precision and modern web design.&lt;/p&gt;

&lt;p&gt;If PaletteSnap inspired your next color palette, a ⭐ on &lt;a href="https://github.com/byllzz/palettesnap" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2Fxkbf60cbxkzp9tsfxixt.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%2Fxkbf60cbxkzp9tsfxixt.png" alt=" " width="800" height="366"&gt;&lt;/a&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%2Fs4apq9ycwjabu888cei1.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%2Fs4apq9ycwjabu888cei1.png" alt=" " width="799" height="362"&gt;&lt;/a&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%2Fg4kjc935scv7jjdvbp1w.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%2Fg4kjc935scv7jjdvbp1w.png" alt=" " width="800" height="358"&gt;&lt;/a&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%2Frkvfyyenenq1p6jx7iwm.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%2Frkvfyyenenq1p6jx7iwm.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;br&gt;
What's your favorite pigment you discovered? Drop it in the comments 👇&lt;/p&gt;

</description>
      <category>webdesign</category>
      <category>react</category>
      <category>tailwindcss</category>
      <category>typescript</category>
    </item>
    <item>
      <title>An open-source CSS animation library with a live preview grid, creator suite, and community submissions</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:28:10 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/an-open-source-css-animation-library-with-a-live-preview-grid-creator-suite-and-community-2hpm</link>
      <guid>https://dev.to/bilalmlkdev/an-open-source-css-animation-library-with-a-live-preview-grid-creator-suite-and-community-2hpm</guid>
      <description>&lt;p&gt;&lt;strong&gt;CSSFrames: GPU-Accelerated Motion Without the Runtime Weight:&lt;/strong&gt;&lt;br&gt;
JavaScript animation libraries like GSAP, Framer Motion, and anime.js are powerful tools - but they come with a cost. Bundle weight, parsing overhead, potential layout thrashing, and the complexity of managing animations at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if there was a better way?&lt;/strong&gt;&lt;br&gt;
CSSFrames is a curated library of production-ready motion presets built entirely on pure CSS keyframes. Browse, preview, customize, and export — all without touching JavaScript. No runtime overhead. No layout shifts. No dropped frames.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cssframes.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/byllzz/cssframes.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem With JavaScript Animations&lt;/strong&gt;&lt;br&gt;
Every animation library comes with a runtime cost. The browser must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse and execute JavaScript&lt;/li&gt;
&lt;li&gt;Calculate animated values in real-time&lt;/li&gt;
&lt;li&gt;Trigger layout recalculations (reflow)&lt;/li&gt;
&lt;li&gt;Repaint affected DOM nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For simple, repeatable animations, this is overkill. CSS keyframes, by contrast, are declarative, precomputed, and offloaded directly to the GPU.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: Pure CSS, Pure Performance&lt;/strong&gt;&lt;br&gt;
CSSFrames runs every animation on just two GPU-composited properties: transform and opacity. This means:&lt;/p&gt;

&lt;p&gt;✓ Zero layout shifts - no reflow or repaint&lt;br&gt;
✓ GPU acceleration - animations render on the compositor thread&lt;br&gt;
✓ Drop-in ready - one class, instant animation&lt;br&gt;
✓ Framework agnostic - works in React, Vue, plain HTML, anywhere&lt;/p&gt;

&lt;p&gt;Just add a class. The animation handles the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What CSSFrames Includes:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Live Preview Grid&lt;/strong&gt;&lt;br&gt;
Every preset previews in real-time on authentic UI elements: buttons, cards, loaders, icons, and text. Switch to Theater Mode to focus on a single animation full-screen. Understand what each preset does before you export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Creator Suite&lt;/strong&gt;&lt;br&gt;
Built on Monaco Editor, the Creator Suite lets you author custom keyframes without leaving the browser. Set duration, tweak easing curves, preview live, and export instantly. Perfect for building brand-specific motion systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. One-Click Export&lt;/strong&gt;&lt;br&gt;
Every animation exports in multiple formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raw CSS — @keyframes definition + class&lt;/li&gt;
&lt;li&gt;Tailwind Config — Ready-to-paste keyframes and animation blocks&lt;/li&gt;
&lt;li&gt;Metadata — Duration and easing values for documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Community Grid&lt;/strong&gt;&lt;br&gt;
Developers can submit custom presets that persist via a REST API (powered by Railway). Browse and use animations created by the community. Every submission is live for all users — no build step required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Included&lt;/strong&gt;&lt;br&gt;
Seven animation categories:&lt;br&gt;
Buttons · Loaders · Entrances · Text · Cards · Icons · Shapes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preset types:&lt;/strong&gt;&lt;br&gt;
Shimmer sweeps, typewriter effects, morphing blobs, staggered reveals, glitch systems, pulse rings, stroke-draw animations — all GPU-composited, all pure CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: React + Vite&lt;/li&gt;
&lt;li&gt;Styling: Tailwind CSS&lt;/li&gt;
&lt;li&gt;Code Editor: Monaco Editor&lt;/li&gt;
&lt;li&gt;Syntax Highlighting: Prism.js&lt;/li&gt;
&lt;li&gt;Backend API: Express.js&lt;/li&gt;
&lt;li&gt;Hosting: Vercel (frontend) · Railway (API)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Get Started&lt;/strong&gt;&lt;br&gt;
Clone the repository and run locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/cssframes.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cssframes
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run the community API server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashcd server
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
Then add this to your .env:
&lt;span class="nv"&gt;VITE_API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:3001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;CSSFrames&lt;/strong&gt; solves a real problem: developers often reach for heavy animation libraries when CSS alone can deliver the same results - faster, lighter, and more reliably.&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;CSSFrames&lt;/strong&gt; helped you build smoother, more performant UI without bloating your bundle, a ⭐ on &lt;a href="https://github.com/byllzz/cssframes.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; would mean a lot.&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%2Fdai86gdqjc5abkz7yro9.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%2Fdai86gdqjc5abkz7yro9.png" alt="Cssframes Preview" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6tk5mwcr1464hnwzra59.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%2F6tk5mwcr1464hnwzra59.png" alt="Cssframes Preview" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's your favorite preset? Drop it in the comments below 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Created a developer excuse generator with 6 situations, 4 tones, and custom excuses</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:23:20 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/created-a-developer-excuse-generator-with-6-situations-4-tones-and-custom-excuses-3og7</link>
      <guid>https://dev.to/bilalmlkdev/created-a-developer-excuse-generator-with-6-situations-4-tones-and-custom-excuses-3og7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Excusify: A Excuse Generator for Engineering Teams:&lt;/strong&gt;&lt;br&gt;
We've all been there. The standup starts in three minutes. The bug is still unfixed. The deploy failed. Your PR has been waiting for review for two days. And somehow, "I don't know" doesn't cut it in a professional setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excusify&lt;/strong&gt; is a tongue-in-cheek solution to a real problem: how to communicate setbacks with confidence, context, and just the right tone. Pick your situation, select your audience, and get a believable, shareable excuse in seconds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://excusify.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/byllzz/excusify.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed, open source)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Premise&lt;/strong&gt;&lt;br&gt;
Engineering moves fast. Things break. Deadlines slip. Deployments fail. Sometimes you need to communicate what happened — and how you say it matters.&lt;/p&gt;

&lt;p&gt;Excusify curates 72 hand-written excuses across six common engineering situations and four distinct tones.Every excuse gets its own shareable URL, and there's a seed-based Excuse of the Day that the entire community sees together.&lt;/p&gt;

&lt;p&gt;It's lighthearted. It's useful. And it works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Six Situations&lt;/strong&gt;&lt;br&gt;
Every engineer recognizes these:&lt;br&gt;
SituationThe RealityBug Still ExistsIt worked on your machine, didn't it?Missed DeadlineScope creep is real, but you can't say that.Production Went DownYou inherited someone else's mess.PR Not ReviewedFour pings and counting.Deploy FailedThe CI/CD pipeline had other plans.Missed StandupYou were "in deep focus work."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Four Tones for Every Audience&lt;/strong&gt;&lt;br&gt;
The same situation plays differently depending on who you're talking to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Professional&lt;/strong&gt; - Measured, forward-looking. For your PM and stakeholders.&lt;br&gt;
&lt;strong&gt;2. Chaotic&lt;/strong&gt; - Honest frustration with a laugh. For your tech lead and peers.&lt;br&gt;
&lt;strong&gt;3. Desperate&lt;/strong&gt; - Raw vulnerability. For your immediate team.&lt;br&gt;
&lt;strong&gt;4. Corporate BS&lt;/strong&gt; - Buzzword-heavy, non-committal. For management and executives.&lt;/p&gt;

&lt;p&gt;Each situation × tone combination has a hand-crafted excuse. No filler. All believable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing Built In&lt;/strong&gt;&lt;br&gt;
Generated excuses are meant to be shared. Excusify includes multiple export options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Download as PNG&lt;/strong&gt; - Tweet-ready excuse card via html2canvas&lt;br&gt;
&lt;strong&gt;2. Native Share&lt;/strong&gt; - One-click compose for Twitter, LinkedIn, Slack, and WhatsApp&lt;br&gt;
&lt;strong&gt;3. Copy to Clipboard&lt;/strong&gt; - Pre-formatted for Slack's bold and quote syntax&lt;br&gt;
&lt;strong&gt;4. Shareable URL&lt;/strong&gt; - Every excuse gets a unique link, encoded in the URL parameters&lt;br&gt;
&lt;strong&gt;5. Deep Links&lt;/strong&gt; - Direct sharing to messaging apps&lt;/p&gt;

&lt;p&gt;Share it. Send it. Own the situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Little Details That Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Favorites &amp;amp; History&lt;/strong&gt;&lt;br&gt;
Star your best excuses - they persist to localStorage. Your last 10 excuses live in history with a "show all" toggle. Capped storage prevents bloat while keeping your go-to excuses within reach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full Keyboard Navigation&lt;/strong&gt;&lt;br&gt;
Speed matters. Hit Space to generate, C to copy, F to favorite, S/T to switch situation and tone pickers, and ? to reveal the shortcuts overlay. Power users never need to touch the mouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synthesized Sound Feedback&lt;/strong&gt;&lt;br&gt;
Every generated excuse comes with subtle, synthesized audio feedback. No external sound files — everything is generated in-browser via the Web Audio API. A small UX detail that makes interaction feel snappy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excuse of the Day (Seed-Based)&lt;/strong&gt;&lt;br&gt;
Using a date-based seed, the same excuse generates for every user on the same day. It creates a shared experience: "Did you see today's excuse?" Community inside a joke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generational Counter&lt;/strong&gt;&lt;br&gt;
An all-time counter tracks total excuses generated across all user sessions. It's a completely useless metric — but it somehow feels important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
Clone and start developing in seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/excusify.git
&lt;span class="nb"&gt;cd &lt;/span&gt;excusify
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to Contribute&lt;/strong&gt;&lt;br&gt;
Found a situation we missed? Thought of a better tone? Want to add translations or improve accessibility?&lt;br&gt;
&lt;strong&gt;Good first contributions:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add new situations to situations.js and excuses.js &lt;/li&gt;
&lt;li&gt;Create new tones following the pattern in tones.js &lt;/li&gt;
&lt;li&gt;Refine the custom AI excuse templates &lt;/li&gt;
&lt;li&gt;Translate excuses to a new language (locale file) &lt;/li&gt;
&lt;li&gt;Improve accessibility — ARIA labels, focus management, keyboard shortcuts &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contribution workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feat/your-feature 
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: your short description"&lt;/span&gt; 
git push origin feat/your-feature 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep PRs focused - one feature or fix per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing&lt;/strong&gt;&lt;br&gt;
Excusify is tongue-in-cheek, but it solves a real communication problem: how to own your mistakes with confidence and the right tone for the audience.&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%2Fz3tl1pxvay7kdkdbxxld.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%2Fz3tl1pxvay7kdkdbxxld.png" alt="Excusify Preview" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If Excusify helped you survive a standup, a ⭐ on GitHub means a lot.&lt;/p&gt;

&lt;p&gt;What's your favorite generated excuse? Drop it in the comments below 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>jokes</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Built a minimalist typing speed tester with real-time WPM, CPS, and post-session analytics</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:20:46 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/i-built-a-minimalist-typing-speed-tester-with-real-time-wpm-cps-and-post-session-analytics-5g82</link>
      <guid>https://dev.to/bilalmlkdev/i-built-a-minimalist-typing-speed-tester-with-real-time-wpm-cps-and-post-session-analytics-5g82</guid>
      <description>&lt;p&gt;&lt;strong&gt;BitType: The Minimalist Typing Test Built for Focus&lt;/strong&gt;&lt;br&gt;
The typing test ecosystem is broken. The good ones are drowning in ads, account requirements, leaderboards, and social features you never asked for. The clean ones are so bare-bones they give you a single WPM number and nothing else.&lt;/p&gt;

&lt;p&gt;There's no middle ground - until now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BitType&lt;/strong&gt; is a distraction-free typing environment designed for speed runners and learners alike. Real-time WPM and accuracy tracking, instant keystroke feedback, and a comprehensive post-session analytics dashboard. No signup. No ads. No clutter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bittype.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/byllzz/bittype.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed
)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problem With Typing Tests&lt;/strong&gt;&lt;br&gt;
Typing test tools tend to fall into two extremes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Bloated:&lt;/strong&gt; Wrapped in ads, account systems, leaderboards, and social sharing. Metrics refresh too fast to read. The interface competes for your attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Too minimal:&lt;/strong&gt; A single WPM number with no breakdown. No feedback on where you're losing accuracy. No insight into what went wrong.&lt;/p&gt;

&lt;p&gt;BitType rejects both extremes. It's a clean, focused interface backed by real analytics - enough depth to diagnose your performance, enough simplicity to keep you focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Get:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1. Real-Time Keystroke Telemetry&lt;/strong&gt;&lt;br&gt;
Forget waiting until the end of the word for feedback. WPM and accuracy update with every single character you type. The timer starts automatically on your first keystroke for precision tracking. You see the signal as it happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Instant Visual Feedback&lt;/strong&gt;&lt;br&gt;
Correct keystrokes style subtly. Mistakes appear immediately in red. Real-time feedback reinforces muscle memory - you know the instant something is wrong, not five words later when you've already committed the error to memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Adaptive Word Generation&lt;/strong&gt;&lt;br&gt;
Every session generates a fresh randomized paragraph. No memorizing the same sentence to artificially inflate your score. The test stays hard. Your improvements stay real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Session Flow:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Start:&lt;/strong&gt;&lt;br&gt;
 Text appears on screen. Type immediately - the timer triggers on your first keystroke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mid-session:&lt;/strong&gt;&lt;br&gt;
 Every character updates WPM and accuracy live. Correct keystrokes style subtly. Errors flash red. You're always getting feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End:&lt;/strong&gt;&lt;br&gt;
 Type the final character. State flushes automatically and the analytics dashboard loads instantly.&lt;/p&gt;

&lt;p&gt;Next round: Hit "Back to Training" for a new randomized paragraph and run again.&lt;br&gt;
It's frictionless. No animations. No distractions. Just you and the text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Small Details That Matter:&lt;/strong&gt;&lt;br&gt;
Performance Titles&lt;br&gt;
After each session, the engine evaluates your speed and precision and awards a title:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed Demon - High velocity paired with strong accuracy&lt;/li&gt;
&lt;li&gt;Perfect Typist 🏆 - Earned through 100% precision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a small detail, but hitting a personal best feels hollow if the only reward is a number. Titles make milestones meaningful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precision Timing&lt;/strong&gt;&lt;br&gt;
Keystroke tracking uses the high-resolution timing API for zero-lag measurement. No artificial delays. No jank. Every millisecond counts when you're measuring performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
Clone the repository and start typing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/bittype.git
&lt;span class="nb"&gt;cd &lt;/span&gt;bittype
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open index.html directly in your browser. No dependencies. No installation. No friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Typing speed tools don't need to be complicated. They don't need to monetize you or distract you. They need to be fast, honest, and useful — and BitType delivers exactly that.&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;BitType&lt;/strong&gt; helped you hit a new personal best, a ⭐ on &lt;a href="https://github.com/byllzz/bittype.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2Fjpzb3ksy4sp35qy9sw8h.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%2Fjpzb3ksy4sp35qy9sw8h.png" alt="Bittype Preview" width="799" height="381"&gt;&lt;/a&gt;&lt;br&gt;
What's your personal best WPM? Drop your score in the comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Favicon generator with Lanczos3 rendering that exports a full PWA bundle - no upload limits, no watermarks</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:18:02 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/i-built-a-favicon-generator-with-lanczos3-rendering-that-exports-a-full-pwa-bundle-no-upload-1hk5</link>
      <guid>https://dev.to/bilalmlkdev/i-built-a-favicon-generator-with-lanczos3-rendering-that-exports-a-full-pwa-bundle-no-upload-1hk5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Favicraft: Production-Grade Favicon Generation in One Click&lt;/strong&gt;&lt;br&gt;
Every web project needs a favicon. And every time, it's the same exhausting dance: find a random online tool, upload your logo, download a blurry 16x16 PNG that looks like it was downscaled with a potato, spend 20 minutes hunting for a site.webmanifest generator, then manually craft browserconfig.xml for Windows tiles.&lt;/p&gt;

&lt;p&gt;There has to be a better way.&lt;br&gt;
**Favicraft **is a high-fidelity favicon generator that handles the entire pipeline — from your raw image to a complete, production-ready PWA bundle. Upload once. Download a ZIP. Paste into your project. Done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://favicraft.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/byllzz/favicraft.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problem With Favicon Tools&lt;/strong&gt;&lt;br&gt;
Most favicon generators solve about 30% of the problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Blurry downscaling&lt;/strong&gt; - Bilinear resizing destroys edge clarity at small sizes&lt;br&gt;
&lt;strong&gt;- Incomplete exports&lt;/strong&gt; - No Apple Touch icons, no Android PWA sizes, no Windows tiles&lt;br&gt;
&lt;strong&gt;- Manual configuration&lt;/strong&gt; - You write site.webmanifest yourself, or it doesn't get generated at all&lt;br&gt;
&lt;strong&gt;- Paywalls&lt;/strong&gt; - Premium tiers unlock features that should be free&lt;br&gt;
&lt;strong&gt;- Watermarks&lt;/strong&gt; - Your favicon gets branded with someone else's logo&lt;/p&gt;

&lt;p&gt;Favicraft eliminates every friction point. It's a complete favicon solution from raw image to production deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Get&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lossless Downsampling via Lanczos3&lt;/strong&gt;&lt;br&gt;
The difference between a sharp favicon and a blurry one comes down to the resizing algorithm. Most tools use bilinear interpolation — fast but visually destructive. Favicraft uses Lanczos3, a kernel-based resampling method that preserves edge definition and color accuracy across every size from 16px to 512px.&lt;/p&gt;

&lt;p&gt;The result: favicons that stay crisp at any resolution, across any device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every Size, Every Format&lt;/strong&gt;&lt;br&gt;
A modern web project needs more than just the classic 16x16 ICO. Favicraft generates the complete set automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;favicon.ico - Multi-size ICO for browser tabs&lt;/li&gt;
&lt;li&gt;favicon-16x16.png &amp;amp; favicon-32x32.png - Standard and retina browser tabs&lt;/li&gt;
&lt;li&gt;apple-touch-icon.png - iOS home screen (180x180)&lt;/li&gt;
&lt;li&gt;android-chrome-192x192.png &amp;amp; android-chrome-512x512.png - Android PWA splash screens&lt;/li&gt;
&lt;li&gt;site.webmanifest - PWA manifest with auto-generated metadata&lt;/li&gt;
&lt;li&gt;browserconfig.xml - Windows tile configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One upload. All formats. No hunting through documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic Manifest &amp;amp; Header Generation&lt;/strong&gt;&lt;br&gt;
The painful part of favicon setup isn't the images — it's the configuration files. Most tools dump a ZIP and leave you to figure out site.webmanifest yourself.&lt;/p&gt;

&lt;p&gt;**Favicraft **generates both site.webmanifest and browserconfig.xml automatically, with correct metadata fields pre-populated. Better yet, it outputs the exact  and  tags you need to paste into your HTML &lt;/p&gt;. No guessing. No documentation hunting. Copy, paste, done.

&lt;p&gt;&lt;strong&gt;Live Asset Preview &amp;amp; Testing&lt;/strong&gt;&lt;br&gt;
Before you download, inspect your generated favicons in real-time. Test them against light, dark, and glass UI themes to ensure they render correctly across different browser contexts. Color space analysis and metadata inspection help you catch issues before they ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-Compromise Compression&lt;/strong&gt;&lt;br&gt;
All assets are packed using DEFLATE L9 compression into a single ZIP bundle. Optimized file sizes without sacrificing quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete Privacy&lt;/strong&gt;&lt;br&gt;
All processing runs client-side. No image uploads to a server. No logging. No tracking. Your favicon stays yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Upload:&lt;/strong&gt; Your image is ingested and analyzed for color space and dimensions.&lt;br&gt;
&lt;strong&gt;Resize:&lt;/strong&gt; Each required size (16px through 512px) is recalculated using Lanczos3 filtering, preserving edge clarity and color fidelity.&lt;br&gt;
&lt;strong&gt;Generate:&lt;/strong&gt; Manifest files are created automatically with correct PWA metadata and Windows tile configuration.&lt;br&gt;
&lt;strong&gt;Deliver:&lt;/strong&gt; All assets are compressed with DEFLATE L9 and bundled into a production-ready ZIP file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Lanczos3 Matters&lt;/strong&gt;&lt;br&gt;
Most tools downscale using bilinear interpolation — it's fast, but it blurs edges and loses detail. Lanczos3 uses a more sophisticated kernel to preserve micro-scale clarity, keeping your favicon crisp at any resolution. The difference is subtle at 32px, but at 16px — the size that matters most in browser tabs — it's the difference between professional and blurry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Inside the ZIP&lt;/strong&gt;&lt;br&gt;
FilePurposefavicon.icoClassic multi-size ICO for broad browser supportfavicon-16x16.pngBrowser tab standard sizefavicon-32x32.pngBrowser tab retina (high-DPI displays)apple-touch-icon.pngiOS home screen (180×180)android-chrome-192x192.pngAndroid PWA home screenandroid-chrome-512x512.pngAndroid PWA splash screensite.webmanifestPWA manifest (auto-generated)browserconfig.xmlWindows tile configuration (auto-generated)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Details That Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-Generated Configuration Files&lt;/strong&gt;&lt;br&gt;
Here's what sets Favicraft apart: most tools give you the images and make you figure out the configuration. Favicraft generates site.webmanifest with the correct name, icons, theme_color, and display fields automatically. It even outputs the exact  and  tags you need in your HTML. Zero manual configuration. Copy. Paste. Done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimized for Modern Web Standards&lt;/strong&gt;&lt;br&gt;
Favicons aren't just a visual detail — they're part of the PWA specification. Favicraft bundles everything a modern web app needs: proper manifest structure, cross-platform icon sizes, Windows tile support, and Apple Touch icon sizing. Your favicon works everywhere, on every device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js - Framework and serverless API routes&lt;/li&gt;
&lt;li&gt;Sharp - Professional-grade Lanczos3 image processing&lt;/li&gt;
&lt;li&gt;DEFLATE L9 - Maximum compression for bundle export&lt;/li&gt;
&lt;li&gt;Vercel - Global deployment with instant cold starts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple, purposeful, and battle-tested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
Clone the repository and start generating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/favicraft.git
&lt;span class="nb"&gt;cd &lt;/span&gt;favicraft
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requires Node.js v18+. No environment variables needed. Open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; and start uploading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Favicon generation shouldn't be a chore. It shouldn't require multiple tools, manual configuration, or compromise on quality. Favicraft proves that one well-built tool can handle the entire workflow - fast, private, and professional.&lt;/p&gt;

&lt;p&gt;If Favicraft saved you from a blurry favicon and an hour spent hunting for configuration files, a ⭐ on &lt;a href="https://github.com/byllzz/favicraft.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2F5vlswk0aa7ssxltu1s4g.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%2F5vlswk0aa7ssxltu1s4g.png" alt="Favicraft Preview"&gt;&lt;/a&gt;&lt;br&gt;
What's your favorite favicon you've created? Drop it in the comments below 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Code snippet that exports PNG &amp; SVG. No sign-up, fully in the browser</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:14:04 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/i-built-a-code-snippet-beautifier-that-exports-png-svg-no-sign-up-no-paywall-fully-in-the-436j</link>
      <guid>https://dev.to/bilalmlkdev/i-built-a-code-snippet-beautifier-that-exports-png-svg-no-sign-up-no-paywall-fully-in-the-436j</guid>
      <description>&lt;p&gt;&lt;strong&gt;SnippitKit: Code Snippets That Actually Look Good&lt;/strong&gt;&lt;br&gt;
Every developer has faced this moment: you've written something worth sharing - a clever pattern, a tricky fix, a tutorial worth documenting - and you want to share it beautifully. But a plain code block on Twitter looks generic. A screenshot of your editor looks amateurish. The popular snippet tools are bloated, require accounts, or lock you into their aesthetic.&lt;/p&gt;

&lt;p&gt;There's friction where there shouldn't be.&lt;/p&gt;

&lt;p&gt;**SnippitKit **removes it. Paste your code, pick a theme and font, adjust the layout, and export a polished PNG or SVG in seconds. No accounts. No bloat. No compromise on customization.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://snippitkit.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/byllzz/snippitkit.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problem With Code Snippet Sharing&lt;/strong&gt;&lt;br&gt;
Plain code blocks are functional for documentation. But for blog covers, social media, tutorials, and technical articles, they're invisible. The tools that solve this fall into predictable traps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bloated:&lt;/strong&gt; Overloaded with features you don't need, animation you didn't ask for, and metrics dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paywalled:&lt;/strong&gt; Free tier is crippled. Export sizes are limited. Watermarks are mandatory until you pay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aesthetic lock-in:&lt;/strong&gt; You get their themes, their fonts, their style. No way to customize beyond swapping colors.&lt;/p&gt;

&lt;p&gt;SnippitKit rejects all three. It's minimal, fully customizable, and completely free. One tool. No accounts. Export whatever you want.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Get:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Syntax Highlighting That Works Instantly&lt;/strong&gt;&lt;br&gt;
Powered by Prism.js with intelligent language autoloading, every code snippet highlights correctly the moment you paste it. Select a language from the dropdown — highlighting applies instantly. No manual setup. No broken syntax. Prism handles all the heavy lifting behind the scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Themes &amp;amp; Gradient Backgrounds&lt;/strong&gt;&lt;br&gt;
Choose from a curated set of preset themes, each with carefully chosen gradient backgrounds. Toggle between dark and light modes to suit your use case - dark for blogs, light for presentations. All theme data is stored in JSON, making it trivial to add your own custom themes without touching the component logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dynamic Font Selection&lt;/strong&gt;&lt;br&gt;
Browse and load Google Fonts directly from the interface. Pick a typeface, and only that font downloads - no bloated font bundles. Clean typography matters when you're sharing code. Monospace fonts like JetBrains Mono, Fira Code, and Cascadia Code render with proper ligatures. The font picker loads instantly and supports searching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Complete Layout Control&lt;/strong&gt;&lt;br&gt;
Every visual detail is adjustable. Set padding, border radius, and font size with numeric inputs. Live preview updates in real-time as you tweak — no guessing. No export-then-regret cycle. See exactly what you'll ship before you click export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Accessible, Keyboard-First UI&lt;/strong&gt;&lt;br&gt;
Custom select menus with full keyboard navigation — arrow keys move between options, Enter selects, Escape closes. ARIA labels throughout. No mouse required if you prefer the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture You'll Appreciate!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON-Driven Configuration&lt;/strong&gt;&lt;br&gt;
Here's what makes SnippitKit maintainable: themes, fonts, and languages are all data-driven. Every theme is a JSON object. Every language is an entry in a language JSON file. Want to add a new gradient theme? Add one line to the themes JSON. Want to support a new language? One entry in the language file. No digging through React components. No refactoring. The UI and the data are cleanly separated.&lt;/p&gt;

&lt;p&gt;This design makes it trivial to extend without breaking anything. Community contributions are easy because contributors only need to understand JSON, not component architecture.&lt;/p&gt;

&lt;p&gt;The Tech Stack&lt;br&gt;
Simple, purposeful tools with no unnecessary dependencies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML5 + CSS3 + JavaScript (ES6+) - Core logic and styling&lt;/li&gt;
&lt;li&gt;Prism.js - Syntax highlighting with intelligent language autoloading&lt;/li&gt;
&lt;li&gt;dom-to-image-more - High-quality PNG and SVG export from the DOM&lt;/li&gt;
&lt;li&gt;Google Fonts API - Dynamic font loading on demand&lt;/li&gt;
&lt;li&gt;Devicons (jsDelivr) - Language and technology icons&lt;/li&gt;
&lt;li&gt;Vite - Fast dev server and optimized bundling&lt;/li&gt;
&lt;li&gt;Vercel - Instant global deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No bloated frameworks. No unnecessary dependencies. Fast startup. Small bundle. Ships instantly.&lt;/p&gt;

&lt;p&gt;Run It Locally&lt;br&gt;
Clone and start creating:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/snippitkit.git
&lt;span class="nb"&gt;cd &lt;/span&gt;snippitkit
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. No environment variables needed. The entire app runs instantly.&lt;/p&gt;

&lt;p&gt;How to Contribute&lt;br&gt;
Contributions improve SnippitKit for everyone. Good first issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add new theme presets to the themes JSON file&lt;/li&gt;
&lt;li&gt;Expand the language definitions with additional languages&lt;/li&gt;
&lt;li&gt;Improve SVG export fidelity and scaling&lt;/li&gt;
&lt;li&gt;Suggest new font size or padding presets&lt;/li&gt;
&lt;li&gt;Enhance accessibility — focus management, screen reader testing, keyboard navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contribution workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feat/your-feature
&lt;span class="c"&gt;# make your changes&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: your short description"&lt;/span&gt;
git push origin feat/your-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep PRs focused - one feature or fix per request.&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%2F9yy9qkp213nv78yugk3u.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%2F9yy9qkp213nv78yugk3u.png" alt=" " width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
If SnippitKit helped you share code that actually looks polished, a ⭐ on &lt;a href="https://github.com/byllzz/snippitkit.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Type scale generator that exports CSS, Tailwind v3/v4 &amp; Style Dictionary tokens - all in the browser</title>
      <dc:creator>Bilal Malik</dc:creator>
      <pubDate>Wed, 03 Jun 2026 04:01:54 +0000</pubDate>
      <link>https://dev.to/bilalmlkdev/i-built-a-type-scale-generator-that-exports-css-tailwind-v3v4-style-dictionary-tokens-all-in-2geb</link>
      <guid>https://dev.to/bilalmlkdev/i-built-a-type-scale-generator-that-exports-css-tailwind-v3v4-style-dictionary-tokens-all-in-2geb</guid>
      <description>&lt;p&gt;&lt;strong&gt;TypoScale: Modular Typography Without the Math&lt;/strong&gt;&lt;br&gt;
Every time you start a new design system, the same ritual repeats. Open a calculator. Pick a base font size. Choose a modular ratio. Hand-compute every single step in the scale. Paste values into CSS variables. Then, inevitably, the designer asks: "What if we changed the base from 16px to 17px?"&lt;/p&gt;

&lt;p&gt;You start over.&lt;/p&gt;

&lt;p&gt;Existing type scale tools help, but they're incomplete. They calculate the scale, sure. But they don't export to Tailwind v4's theme syntax. They don't generate Style Dictionary JSON for design tokens. They don't let you preview your actual Google Font pairing before you commit. And they definitely don't let you share your exact scale with teammates without an account.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;TypoScale *&lt;/em&gt; fixes all of that in one place. Generate modular scales, preview them in real fonts, export to multiple formats, and share instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://typoscale.vercel.app" rel="noopener noreferrer"&gt;Try it live&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/byllzz/typoscale.git" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt; (MIT licensed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Problem With Typography Scales&lt;/strong&gt;&lt;br&gt;
Type scales follow simple math — multiply a base size by a ratio, repeat. But the implementation is scattered across tools that don't talk to each other:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The calculator approach:&lt;/strong&gt; You find a type scale generator, plug in numbers, copy values into a spreadsheet. Change the base size? Start again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The preview problem:&lt;/strong&gt; You generate tokens but have no idea how they'll actually look in your chosen fonts. You apply them to your design, realize they don't work, and repeat the entire process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The format fragmentation:&lt;/strong&gt; You need Tailwind v4's theme syntax, but the tool only exports v3 config. Or it exports CSS, but you need Style Dictionary. You end up using three different tools and manually converting between formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The collaboration gap:&lt;/strong&gt; You tune a perfect scale on your machine, send a screenshot to your designer, and they can't reproduce it. No shareable configuration. No way to iterate together.&lt;br&gt;
TypoScale eliminates every friction point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Get:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Intelligent Modular Scale Generation&lt;/strong&gt;&lt;br&gt;
Pick from nine built-in ratios — Minor Second (1.067), Major Second (1.125), Perfect Fourth (1.333), Golden Ratio (1.618), and more. Each ratio has a mathematical relationship that produces harmonious, proportional sizes. Or enter any custom ratio you want.&lt;/p&gt;

&lt;p&gt;Set your base font size (typically 16px, but whatever your design system uses). Add steps above and below independently — some scales need five sizes, others need ten. TypoScale generates the entire scale instantly, preserving mathematical precision at every step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Google Fonts Pairing &amp;amp; Live Preview&lt;/strong&gt;&lt;br&gt;
Search 1000+ Google Fonts directly in the tool. Separate pickers for display, body, and monospace typefaces — because a scale that looks great in Playfair Display won't work in your body copy unless you test it together.&lt;/p&gt;

&lt;p&gt;Fonts load on demand, no bloat. Once selected, an editorial layout renders showing every scale step in your actual chosen fonts. Drag to resize and watch the hierarchy respond. This is the moment you discover whether your scale works in reality, not just in theory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. WCAG Contrast Verification Built In&lt;/strong&gt;&lt;br&gt;
Every scale step displays a WCAG AA/AAA pass/fail badge calculated against your chosen background color. Tiny type that barely clears accessibility standards gets flagged inline. No opening a separate contrast checker tab. No external tools. The safety check lives right where you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Four Export Formats, One Click&lt;/strong&gt;&lt;br&gt;
Once your scale is perfect, export in the format your project needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSS Custom Properties&lt;/strong&gt; - Variables for vanilla CSS projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;css&lt;/span&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--font-display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Playfair Display'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Georgia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Source Sans 3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c"&gt;/* 16px  */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="m"&gt;1.333rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 21px  */&lt;/span&gt;
  &lt;span class="py"&gt;--font-size-xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="m"&gt;1.777rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;/* 28px  */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tailwind v4 theme Syntax&lt;/strong&gt; - Modern Tailwind projects:&lt;br&gt;
css@import "tailwindcss";&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;theme {
  --font-family-display: 'Playfair Display', Georgia, serif;
  --font-size-base: 1rem;
  --font-size-lg:   1.333rem;
  --font-size-xl:   1.777rem;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Tailwind v3 Config *&lt;/em&gt; - Existing Tailwind projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;jsmodule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.333rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="na"&gt;xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.777rem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="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;&lt;strong&gt;Style Dictionary JSON&lt;/strong&gt; - Design token systems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;json&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typography"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1rem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fontSizes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.333rem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fontSizes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"xl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.777rem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fontSizes"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Collaboration Game-Changer: Shareable URLs&lt;/strong&gt;&lt;br&gt;
Here's where TypoScale separates from every other type scale tool.&lt;br&gt;
Your entire configuration — base size, ratio, font selections, step count, even background color — is encoded into the URL using Zustand's URL persistence. No database. No backend. No accounts.&lt;/p&gt;

&lt;p&gt;Tune a scale. Copy the URL. Send it to your designer.&lt;/p&gt;

&lt;p&gt;They open it and see exactly what you built. They can tweak the ratio, change the base size, try different fonts — all in real-time. Changes reflect in the URL. They send you the updated link. You load it, see their suggestions, iterate together.&lt;/p&gt;

&lt;p&gt;This transforms type scale design from a one-way handoff into actual collaboration. It's a small technical detail that completely changes the workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture&lt;/strong&gt;&lt;br&gt;
The scale math lives in pure utility functions (scaleAlgorithms.ts) with zero framework coupling - easy to unit test and reuse elsewhere. Token generation is isolated in tokenGenerators.ts. Both are excellent targets for contributions and modifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + Vite - Fast development and optimized bundling&lt;/li&gt;
&lt;li&gt;TypeScript (strict mode) - Type safety throughout the codebase&lt;/li&gt;
&lt;li&gt;Tailwind CSS - Utility-first styling&lt;/li&gt;
&lt;li&gt;Zustand - Lightweight state management with built-in URL persistence&lt;/li&gt;
&lt;li&gt;Lucide React - Clean, consistent icon set&lt;/li&gt;
&lt;li&gt;Vercel - Instant global deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minimal dependencies. Maximum clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run It Locally&lt;/strong&gt;&lt;br&gt;
Clone and start designing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit clone https://github.com/byllzz/typoscale.git
&lt;span class="nb"&gt;cd &lt;/span&gt;typoscale
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt;. The tool works immediately with a curated fallback list of 28 popular Google Fonts.&lt;/p&gt;

&lt;p&gt;To unlock the full 1000+ Google Fonts library, add a Google Fonts API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashcp .env.local.example .env.local
&lt;span class="c"&gt;# Edit and add: VITE_GOOGLE_FONTS_KEY=your_key_here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to Contribute&lt;/strong&gt;&lt;br&gt;
TypoScale improves with community contributions. Good first issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add new scale ratio presets with documentation&lt;/li&gt;
&lt;li&gt;Write unit tests for scaleAlgorithms.ts and tokenGenerators.ts&lt;/li&gt;
&lt;li&gt;Build a fluid type scale preview mode&lt;/li&gt;
&lt;li&gt;Enhance accessibility - ARIA labels, keyboard navigation, screen reader testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contribution workflow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bashgit checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feat/your-feature
&lt;span class="c"&gt;# make your changes&lt;/span&gt;
npm run type-check
npm run lint
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: your short description"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep PRs focused — one feature or fix per request.&lt;/p&gt;

&lt;p&gt;TypoScale proves that one well-designed tool can handle modular typography, from generation to collaboration to deployment.&lt;/p&gt;

&lt;p&gt;If TypoScale saved you from hand-calculating 1.333rem for the hundredth time, a ⭐ on &lt;a href="https://github.com/byllzz/typoscale.git" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; means a lot.&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%2Ff6kb09eipbctsfwrschz.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%2Ff6kb09eipbctsfwrschz.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;br&gt;
What's your favorite type scale ratio? Drop it in the comments below 👇&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>opensource</category>
      <category>tailwindcss</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
