<?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: Eidon Ze</title>
    <description>The latest articles on DEV Community by Eidon Ze (@eidon_ze_598ff4e987ed54d2).</description>
    <link>https://dev.to/eidon_ze_598ff4e987ed54d2</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%2F4057898%2F5ab22102-d2b1-4a61-8340-96932aea426d.jpg</url>
      <title>DEV Community: Eidon Ze</title>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eidon_ze_598ff4e987ed54d2"/>
    <language>en</language>
    <item>
      <title>How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 08 Aug 2026 07:40:19 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/how-to-convert-tailwind-html-to-structured-semantic-css-without-a-full-rewrite-15m1</guid>
      <description>&lt;p&gt;How to Convert Tailwind HTML to Structured, Semantic CSS (Without a Full Rewrite)&lt;br&gt;
I've been using Tailwind for about two years across a handful of projects. It's fast, it's predictable, and once the muscle memory kicks in you can style things without switching files.&lt;br&gt;
But here's what I kept running into:&lt;br&gt;
That component you built six months ago? The one with ⁠flex items-center justify-between p-4 bg-white rounded-lg shadow-md⁠ on the outer div, plus another half-dozen classes on each child element? When you come back to refactor it, you're reading styling before you're reading structure. And if you want to move that component into a project that doesn't use Tailwind — or hand it off to someone who doesn't know the utility vocabulary — you're stuck.&lt;br&gt;
The tooling gap&lt;br&gt;
I went looking for something that could take a chunk of Tailwind-styled HTML and give me back clean, semantic CSS. Not one-to-one class translation (there are a dozen tools that do ⁠px-4 → padding: 1rem⁠). I wanted something that understood the component structure — that a button inside a card should become ⁠.card-button⁠, not ⁠.element-4⁠.&lt;br&gt;
What I found:&lt;br&gt;
 One-to-one converters — great if you just need to know what ⁠gap-4⁠ compiles to, but they output ⁠.element {}⁠ ⁠.div {}⁠ flat rules with no hierarchy&lt;br&gt;
 StyleLens (VSCode) — finds duplicate utility patterns and suggests refactoring into ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠, but it's an editor workflow, not an export tool&lt;br&gt;
 Tailwind's own ⁠&lt;a class="mentioned-user" href="https://dev.to/apply"&gt;@apply&lt;/a&gt;⁠ — moves the problem from the HTML to the CSS file but doesn't change the naming problem&lt;br&gt;
None of them did what I actually wanted: paste some HTML, get back component-level CSS with meaningful class names.&lt;br&gt;
What I ended up building&lt;br&gt;
Since I couldn't find it, I put together a minimal tool that does exactly that. The idea is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse the HTML tree&lt;/li&gt;
&lt;li&gt;Translate every Tailwind class to its CSS equivalent&lt;/li&gt;
&lt;li&gt;Group declarations by component (the tree structure tells you what belongs where)&lt;/li&gt;
&lt;li&gt;Name things based on what they are — semantic tags like ⁠h2⁠ become ⁠.card-title⁠, buttons become ⁠.card-button⁠, etc.
Here's what it looks like in practice.
Input:

&amp;lt; img class="w-full h-48 object-cover" src="img.jpg" /&amp;gt;

&lt;h2&gt;Card Title&lt;/h2&gt;
&lt;p&gt;Description goes here.&lt;/p&gt;

  Get Started



Output:
.card {
max-width: 24rem;
margin-left: auto;
margin-right: auto;
background-color: #ffffff;
border-radius: 0.75rem;
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);
overflow: hidden;
}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;.card-image {&lt;br&gt;
  width: 100%;&lt;br&gt;
  height: 12rem;&lt;br&gt;
  object-fit: cover;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-body {&lt;br&gt;
  padding: 1.5rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-title {&lt;br&gt;
  font-size: 1.25rem;&lt;br&gt;
  font-weight: 700;&lt;br&gt;
  color: #111827;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-description {&lt;br&gt;
  margin-top: 0.5rem;&lt;br&gt;
  color: #4b5563;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button {&lt;br&gt;
  margin-top: 1rem;&lt;br&gt;
  padding-left: 1rem;&lt;br&gt;
  padding-right: 1rem;&lt;br&gt;
  padding-top: 0.5rem;&lt;br&gt;
  padding-bottom: 0.5rem;&lt;br&gt;
  background-color: #2563eb;&lt;br&gt;
  color: #ffffff;&lt;br&gt;
  border-radius: 0.25rem;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;.card-button:hover {&lt;br&gt;
  background-color: #1d4ed8;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydxguqyxxusveb4kp5d7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fydxguqyxxusveb4kp5d7.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What happens when 4 competing products all stumble at the same time</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sun, 02 Aug 2026 04:47:49 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/what-happens-when-4-competing-products-all-stumble-at-the-same-time-pja</guid>
      <description>&lt;p&gt;I've been researching the freelancer client portal space for a side project, and I stumbled into something I didn't expect.&lt;/p&gt;

&lt;p&gt;In the last 12 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HoneyBook raised prices and got flooded with 1-star reviews for crashing&lt;/li&gt;
&lt;li&gt;Fiverr shut down AND.CO entirely — tens of thousands of users had to leave&lt;/li&gt;
&lt;li&gt;Dubsado's setup process is so complex people hire $500+ consultants&lt;/li&gt;
&lt;li&gt;Bonsai got acquired and went radio silent on product updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four products, four different problems, all happening at once.&lt;/p&gt;

&lt;p&gt;It got me thinking — if you were going to build a client portal today, what would you actually include? I've been talking to freelancers and the answer keeps coming back to like four features: project status, file sharing, invoices, messages. That's it. No CRM pipelines, no workflow automations, no "enterprise plan."&lt;/p&gt;

&lt;p&gt;So I threw up a landing page to see if anyone cares. It's called ClientDash — one link per client, $49 one-time, no subscription.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://peppy-pegasus-d7ec4a.netlify.app/" rel="noopener noreferrer"&gt;https://peppy-pegasus-d7ec4a.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm not sure if this is a real window or just a coincidence I'm reading too much into. Curious what people here think — is the client portal space actually underserved, or are freelancers just fine with Google Docs + email?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>freelance</category>
    </item>
    <item>
      <title>ReceiptRadar — Auto-extract every receipt from your Gmail inbox</title>
      <dc:creator>Eidon Ze</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:38:46 +0000</pubDate>
      <link>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</link>
      <guid>https://dev.to/eidon_ze_598ff4e987ed54d2/receiptradar-auto-extract-every-receipt-from-your-gmail-inbox-510h</guid>
      <description></description>
      <category>ai</category>
    </item>
  </channel>
</rss>
