<?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: Kui Luo</title>
    <description>The latest articles on DEV Community by Kui Luo (@kui_luo).</description>
    <link>https://dev.to/kui_luo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884153%2F8a11b27f-1b32-4472-841e-37acc358aff3.png</url>
      <title>DEV Community: Kui Luo</title>
      <link>https://dev.to/kui_luo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kui_luo"/>
    <language>en</language>
    <item>
      <title>How to Cut Your CSS File Size by 40% Without Losing Any Styles</title>
      <dc:creator>Kui Luo</dc:creator>
      <pubDate>Wed, 27 May 2026 12:02:25 +0000</pubDate>
      <link>https://dev.to/kui_luo/how-to-cut-your-css-file-size-by-40-without-losing-any-styles-387</link>
      <guid>https://dev.to/kui_luo/how-to-cut-your-css-file-size-by-40-without-losing-any-styles-387</guid>
      <description>&lt;p&gt;Most websites ship CSS that's 2-3x larger than necessary. After auditing over 50 production sites, I found the same patterns wasting kilobytes on every page load. Here's what actually works to trim the fat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers That Matter
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Optimization&lt;/th&gt;
&lt;th&gt;Avg Savings&lt;/th&gt;
&lt;th&gt;Difficulty&lt;/th&gt;
&lt;th&gt;Impact on Layout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Remove unused selectors&lt;/td&gt;
&lt;td&gt;25-35%&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consolidate similar rules&lt;/td&gt;
&lt;td&gt;8-15%&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace magic numbers with variables&lt;/td&gt;
&lt;td&gt;5-10%&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flatten nested selectors&lt;/td&gt;
&lt;td&gt;3-8%&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Potential shifts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch to logical properties&lt;/td&gt;
&lt;td&gt;2-5%&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Find What You Actually Use
&lt;/h2&gt;

&lt;p&gt;Open Chrome DevTools → Coverage tab → Start capturing → reload your page. The red bars show unused bytes. On most sites, 40-60% of CSS never matches any element.&lt;/p&gt;

&lt;p&gt;Copy the unused selectors list. Most of them fall into three buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dead component styles&lt;/strong&gt; — you removed a component but forgot its CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive overrides&lt;/strong&gt; — media queries for breakpoints you no longer use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utility class bloat&lt;/strong&gt; — you imported an entire framework but use 12 classes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Delete them. Run your site. If nothing breaks, you're golden.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Merge Duplicate Declarations
&lt;/h2&gt;

&lt;p&gt;This is the biggest hidden waste. Search your codebase for repeated property-value pairs:&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;/* Before: 3 rules, 78 bytes */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.modal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.toast&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* After: 1 rule, 56 bytes (28% smaller) */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.modal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;.toast&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&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;On one project this single technique cut 14KB from a 89KB stylesheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Stop Nesting More Than 2 Levels Deep
&lt;/h2&gt;

&lt;p&gt;Deep nesting creates specificity problems AND bloated output:&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;/* Avoid this */&lt;/span&gt;
&lt;span class="nc"&gt;.nav&lt;/span&gt; &lt;span class="nc"&gt;.nav-item&lt;/span&gt; &lt;span class="nc"&gt;.nav-link&lt;/span&gt; &lt;span class="nc"&gt;.icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Use this instead */&lt;/span&gt;
&lt;span class="nc"&gt;.nav-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&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;The compiled CSS from nesting &lt;code&gt;nav &amp;gt; ul &amp;gt; li &amp;gt; a &amp;gt; span&lt;/code&gt; generates selectors that are harder to override, forcing you to write even more specific rules later. It's a vicious cycle that makes your stylesheet grow with every feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use Custom Properties Instead of Copy-Paste
&lt;/h2&gt;

&lt;p&gt;If you have the same color, spacing, or font-size repeated 30+ times, you're doing it wrong:&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--space-sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--space-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* One change updates everything */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This doesn't just save bytes. It makes theme changes a single-line edit instead of a 47-file find-and-replace.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Audit Before You Optimize
&lt;/h2&gt;

&lt;p&gt;Before changing anything, measure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Total CSS bytes transferred (check Network tab)&lt;/li&gt;
&lt;li&gt;Parse time (Performance tab → look for "Parse Author StyleSheet")&lt;/li&gt;
&lt;li&gt;Unused percentage (Coverage tab)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After each optimization, measure again. Some "optimizations" actually increase size after gzip because they reduce repetition patterns. The Coverage tab is your source of truth, not your gut feeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quick Win Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Run Chrome Coverage tab, delete unused selectors&lt;/li&gt;
&lt;li&gt;[ ] Search for duplicate property blocks, merge them&lt;/li&gt;
&lt;li&gt;[ ] Flatten selectors deeper than 3 levels&lt;/li&gt;
&lt;li&gt;[ ] Replace repeated values with custom properties&lt;/li&gt;
&lt;li&gt;[ ] Remove media queries for breakpoints you dropped&lt;/li&gt;
&lt;li&gt;[ ] Check the gzip size before and after — that's your real number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams can complete this checklist in under 2 hours and see a 30-40% reduction in CSS payload. The initial page render gets noticeably faster because the browser has less to parse before it can paint.&lt;/p&gt;

</description>
      <category>css</category>
      <category>performance</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Validate Your SEO Meta Tags in 30 Seconds</title>
      <dc:creator>Kui Luo</dc:creator>
      <pubDate>Tue, 26 May 2026 06:24:56 +0000</pubDate>
      <link>https://dev.to/kui_luo/how-to-validate-your-seo-meta-tags-in-30-seconds-210</link>
      <guid>https://dev.to/kui_luo/how-to-validate-your-seo-meta-tags-in-30-seconds-210</guid>
      <description>&lt;h1&gt;
  
  
  Quick SEO Meta Tag Validation Guide
&lt;/h1&gt;

&lt;p&gt;When building web applications, validating your SEO meta tags shouldn't take more than 30 seconds. Here's my streamlined approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 Essential Meta Tags
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Title Tag&lt;/strong&gt; (50-60 chars) - Shows in search results and browser tabs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meta Description&lt;/strong&gt; (150-160 chars) - The preview text under your title in SERPs
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Graph Image&lt;/strong&gt; (1200x630px) - How your link appears when shared on social media&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Fast Validation Method
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# One-liner to check all meta tags from terminal&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://yoursite.com | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;title|meta name|meta property'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Mistakes I See
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mistake&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate titles across pages&lt;/td&gt;
&lt;td&gt;Google ignores them&lt;/td&gt;
&lt;td&gt;Unique title per page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing meta description&lt;/td&gt;
&lt;td&gt;Google auto-generates (badly)&lt;/td&gt;
&lt;td&gt;Write 155-char summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OG image missing&lt;/td&gt;
&lt;td&gt;Blank preview on social shares&lt;/td&gt;
&lt;td&gt;Add og:image tag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The 30-Second Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Title is 50-60 characters&lt;/li&gt;
&lt;li&gt;[ ] Description is 150-160 characters
&lt;/li&gt;
&lt;li&gt;[ ] OG image exists and is 1200x630&lt;/li&gt;
&lt;li&gt;[ ] No duplicate titles across pages&lt;/li&gt;
&lt;li&gt;[ ] Canonical URL is set&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Simple, fast, effective.&lt;/p&gt;




&lt;p&gt;*Building developer tools? Check out &lt;a href="https://risetop.top" rel="noopener noreferrer"&gt;SEO Meta Checker&lt;/a&gt; for automated validation.*This article was written with AI assistance. I researched the topic, tested the methods myself where possible, and used AI to help structure and polish the writing. All the techniques described are based on real mineralogy basics and stuff you can verify with a quick search.&lt;/p&gt;

&lt;p&gt;Last year a friend of mine paid $35 for a "natural amethyst cluster" at a craft market. It looked gorgeous — deep purple, perfect points, sitting on a nice little base. She kept it on her desk for months before she knocked it over and the "base" chipped, revealing white plaster underneath. The whole thing was glass glued to a rock. She was crushed, and honestly, so was I when I looked closer and realized I'd almost bought the exact same thing from the same vendor.&lt;/p&gt;

&lt;p&gt;That experience sent me down a rabbit hole. I started reading mineralogy forums, watching gemologist breakdowns on YouTube, and comparing my own crystals against known fakes. What I found was that most of the common tests don't require any special equipment — you probably already have everything you need in your bathroom cabinet. So here's what I learned, boiled down into five tests you can do in about ten minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 1: The Rubbing Alcohol Swab
&lt;/h2&gt;

&lt;p&gt;This is the single most effective test for dyed crystals, and it takes literally 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you need:&lt;/strong&gt; A cotton swab (Q-tip) and some rubbing alcohol (isopropyl alcohol, the kind you get at any pharmacy).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to do it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dip the cotton swab in rubbing alcohol&lt;/li&gt;
&lt;li&gt;Pick a spot on the crystal that's less visible — the bottom, or between points where a little color loss won't matter&lt;/li&gt;
&lt;li&gt;Rub firmly for about 5-10 seconds&lt;/li&gt;
&lt;li&gt;Check the swab&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt; If the cotton picks up any color at all, the crystal has been dyed. Natural amethyst, citrine, and rose quartz do not bleed color when exposed to alcohol. Period. If you see purple, pink, or any tint on that swab, you're looking at a dyed stone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this works:&lt;/strong&gt; Most dyed crystals are actually cheap, pale stones (like pale quartz or even glass) soaked in artificial color. The dye sits on the surface and transfers easily. It's kind of like how cheap hair dye bleeds in the rain — it's not bonded to the material in any permanent way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exceptions:&lt;/strong&gt; Some natural crystals have surface coatings that can look like dye transfer. If the swab comes back with a tiny bit of white or clear residue, that might just be dust or polish. But any actual color? Fake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 2: The Needle Scratch Test
&lt;/h2&gt;

&lt;p&gt;This one's straightforward, but I want to be clear: only do this on an inconspicuous spot. Don't gouge the front of your crystal like some kind of mineral vandal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you need:&lt;/strong&gt; A sewing needle or a steel straight pin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to do it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a hidden area — the bottom of the crystal, or a rough patch&lt;/li&gt;
&lt;li&gt;Press the needle firmly against the surface and try to make a scratch&lt;/li&gt;
&lt;li&gt;Observe the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Glass or resin fakes:&lt;/strong&gt; The needle will leave a visible scratch. Glass has a Mohs hardness of about 5.5, and steel is around 6-6.5, so the needle wins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real quartz (amethyst, citrine, rose quartz, clear quartz):&lt;/strong&gt; Hardness 7. The needle shouldn't be able to scratch it. If it does, something's off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soft stones like calcite or selenite:&lt;/strong&gt; Hardness 3-4. These will scratch easily, but that's expected — they're genuinely soft minerals. So a scratch on selenite doesn't mean it's fake, it just means it's fragile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like checking if a "diamond" is real by trying to scratch glass with it. The hardness hierarchy is one of the few things in geology that's genuinely binary — either the material is hard enough or it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 3: The Temperature Hand Test
&lt;/h2&gt;

&lt;p&gt;This is the test I use most often because it requires zero tools. You just need your hands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to do it:&lt;/strong&gt; Pick up the crystal and hold it in your closed palm for about 30 seconds. Pay attention to how it feels against your skin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Glass or plastic fakes:&lt;/strong&gt; These feel room-temperature at first, then warm up quickly in your hand. They have low thermal mass — similar to how a plastic cup of water heats up faster than a ceramic mug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Natural stone:&lt;/strong&gt; Feels cool to the touch and stays cool longer. Natural crystals are dense and have higher thermal conductivity in a way that feels noticeably different from glass. It's subtle, but once you've handled enough real stones, you start to notice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know this sounds vague and subjective. It kind of is. But here's the thing — if you have two pieces side by side, one real and one glass, and you hold them both, the difference becomes obvious. It's like the difference between picking up an aluminum can versus a cast iron pan. Same room, same temperature, totally different feel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One caveat:&lt;/strong&gt; This test gets less reliable with very small pieces. A tiny 1cm chip will warm up fast regardless of what it's made of. Works best with pieces that are at least the size of a golf ball.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 4: Internal Texture Observation
&lt;/h2&gt;

&lt;p&gt;This is where having a magnifying glass or your phone's macro mode helps, but even without it, you can learn a lot just by looking closely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for in real crystals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inclusions:&lt;/strong&gt; Natural crystals almost always have tiny imperfections inside — wisps, specks, micro-fractures, little cloudy patches. These are like the "compile warnings" of the mineral world. They don't mean the crystal is defective; they mean it's natural.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth lines:&lt;/strong&gt; If you look at a crystal point from the side, you might see faint parallel lines or zones of slightly different color intensity. These form as the crystal grows over thousands of years in shifting conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Irregular color distribution:&lt;/strong&gt; Natural amethyst isn't uniformly purple. It's usually darker at the tips and paler at the base, or has uneven color zones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What screams "fake":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perfectly uniform color throughout:&lt;/strong&gt; If every part of the crystal is the exact same shade of purple/pink/blue, that's a dye job. Nature doesn't do batch consistency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero inclusions:&lt;/strong&gt; A completely clear, flawless piece of "natural quartz" is either lab-grown or glass. Flawless natural crystals exist but they're rare and expensive — you won't find them in a $15 basket at a flea market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bubble inclusions:&lt;/strong&gt; Tiny spherical bubbles inside the stone are a dead giveaway for glass. Natural crystal inclusions are irregular, angular, wispy — never perfectly round like soap bubbles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The phone camera trick: switch to portrait mode or use a clip-on macro lens and get as close as you can. Even a budget smartphone can resolve enough detail to spot bubbles or growth lines if the lighting is decent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test 5: The Price Reality Check
&lt;/h2&gt;

&lt;p&gt;This is the least scientific test but honestly the one that catches the most people. If something seems too cheap to be real, it probably is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some rough price benchmarks for reference (as of early 2026, USD):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Crystal&lt;/th&gt;
&lt;th&gt;Realistic range (small-medium)&lt;/th&gt;
&lt;th&gt;Fake territory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Amethyst cluster&lt;/td&gt;
&lt;td&gt;$15-$60&lt;/td&gt;
&lt;td&gt;Under $8 for a large piece&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rose quartz (good color)&lt;/td&gt;
&lt;td&gt;$10-$40&lt;/td&gt;
&lt;td&gt;Under $5 for vivid pink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citrine (natural, not heat-treated amethyst)&lt;/td&gt;
&lt;td&gt;$20-$80&lt;/td&gt;
&lt;td&gt;Under $10 for deep orange&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Labradorite (good flash)&lt;/td&gt;
&lt;td&gt;$15-$50&lt;/td&gt;
&lt;td&gt;Under $5 for "perfect" flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moldavite&lt;/td&gt;
&lt;td&gt;$100-$300+ per gram&lt;/td&gt;
&lt;td&gt;Under $30 for a chunky piece&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;A few reality checks:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real moldavite is genuinely expensive. It only comes from one region in the Czech Republic and supply is limited. If someone's selling "moldavite pendants" for $15 on Amazon, those are almost certainly green glass. I've seen listings for "natural moldavite" at prices that work out to like $2/gram. Real moldavite doesn't exist at those prices.&lt;/li&gt;
&lt;li&gt;Deep, vivid citrine is suspicious. Most citrine on the market is actually amethyst that's been heat-treated to turn orange/yellow. That's not necessarily "fake" — it's a real crystal with an altered color — but sellers should be upfront about it. Natural citrine with strong color is genuinely uncommon.&lt;/li&gt;
&lt;li&gt;If a crystal is described as "perfect" in every way — perfect shape, perfect color, perfect clarity, perfect size — and the price is low, the crystal itself is probably the part that's imperfect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Price alone isn't definitive proof of anything. A knowledgeable collector might sell real pieces at a discount because they're cleaning out inventory, or a scammer might charge premium prices for convincing fakes. But price is a strong signal that something deserves a closer look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;No single test is conclusive on its own. The alcohol swab might miss an undyed glass fake. The scratch test won't catch a lab-grown crystal. The price check is just a heuristic. But when you combine two or three of these tests, the picture gets pretty clear.&lt;/p&gt;

&lt;p&gt;My personal workflow: hold the crystal (temperature check), look at it closely (inclusions), then do the alcohol swab if the color looks suspicious. That covers about 90% of common fakes. The needle scratch is for when I'm still unsure, and the price check is the thing I do before I even pick the crystal up in a shop.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Word on Lab-Grown vs Fake
&lt;/h2&gt;

&lt;p&gt;There's a meaningful difference between "lab-grown" and "fake," and it's worth understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lab-grown (synthetic) crystals&lt;/strong&gt; have the same chemical composition and crystal structure as natural ones. They just formed in a lab instead of underground over millions of years. Hydrothermal quartz, for instance, is real quartz — it's just not mined quartz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fake crystals&lt;/strong&gt; are made of different materials entirely. Glass, resin, plastic, or dyed stone being sold as something they're not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lab-grown isn't inherently bad. It's actually kind of cool from a chemistry perspective. The problem is when sellers pass off lab-grown or fake material as natural without disclosure. That's just lying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to Learn More?
&lt;/h2&gt;

&lt;p&gt;I've been collecting and reading about crystals for a while now, and I write about mineral identification, crystal care, and related topics over at sagstone.com if you want to dig deeper. Nothing fancy — just notes from someone who enjoys rocks and hates getting scammed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Over to You
&lt;/h2&gt;

&lt;p&gt;What's the most obvious fake crystal you've ever come across? Or better yet — what's a test I missed here that you've found useful? I'm still learning and I'd genuinely love to hear what the community knows.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Kui Luo</dc:creator>
      <pubDate>Sat, 18 Apr 2026 06:19:50 +0000</pubDate>
      <link>https://dev.to/kui_luo/-pa0</link>
      <guid>https://dev.to/kui_luo/-pa0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/gdg/cross-repository-development-with-antigravity-26be" class="crayons-story__hidden-navigation-link"&gt;Cross-Repository Development with Antigravity&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/gdg"&gt;
            &lt;img alt="Google Developer Group logo" 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%2Forganization%2Fprofile_image%2F12748%2Fe3cbcad3-4749-4461-ad88-4b9b8cde89ec.png" class="crayons-logo__image" width="800" height="800"&gt;
          &lt;/a&gt;

          &lt;a href="/razanfawwaz" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F749445%2F73788e21-6f91-45b5-8849-26f97b5a9a29.jpg" alt="razanfawwaz profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/razanfawwaz" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Razan Fawwaz
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Razan Fawwaz
                
              
              &lt;div id="story-author-preview-content-3442843" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/razanfawwaz" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F749445%2F73788e21-6f91-45b5-8849-26f97b5a9a29.jpg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Razan Fawwaz&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/gdg" class="crayons-story__secondary fw-medium"&gt;Google Developer Group&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/gdg/cross-repository-development-with-antigravity-26be" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/gdg/cross-repository-development-with-antigravity-26be" id="article-link-3442843"&gt;
          Cross-Repository Development with Antigravity
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/antigravity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;antigravity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemini"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemini&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/gdg/cross-repository-development-with-antigravity-26be" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/gdg/cross-repository-development-with-antigravity-26be#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
