<?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: swift king</title>
    <description>The latest articles on DEV Community by swift king (@jamiepark-design).</description>
    <link>https://dev.to/jamiepark-design</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%2F3994774%2F0c4a5fa7-1bef-409e-9359-16e5e4cbdc0e.png</url>
      <title>DEV Community: swift king</title>
      <link>https://dev.to/jamiepark-design</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jamiepark-design"/>
    <language>en</language>
    <item>
      <title>I Built a Chrome Extension That Fills Job Application Forms With AI (No Templates, No Recording)</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Fri, 21 Aug 2026 13:47:51 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/i-built-a-chrome-extension-that-fills-job-application-forms-with-ai-no-templates-no-recording-2af</link>
      <guid>https://dev.to/jamiepark-design/i-built-a-chrome-extension-that-fills-job-application-forms-with-ai-no-templates-no-recording-2af</guid>
      <description>&lt;p&gt;Somewhere between the 40th job application and the 60th, I started to hate my own name.&lt;/p&gt;

&lt;p&gt;Not the name itself — the typing of it. Name. Email. Phone. Address. Current employer. LinkedIn. "How did you hear about this role?" Then the next tab: same fields, different recruiter portal, different layout, different labels ("Contact email" instead of "Email address"). Then the next one. And the next.&lt;/p&gt;

&lt;p&gt;Browser autofill covers maybe a third of it — it dies the moment a form is rendered by JavaScript. Form-filling extensions with templates break the moment a website redesigns. Recording-based tools break the moment the DOM changes. Every approach is fighting a losing battle against one fact: &lt;strong&gt;every form is different, and you can't pre-record your way out of that.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: stop matching fields, start understanding them
&lt;/h2&gt;

&lt;p&gt;What if the extension didn't try to recognize fields by selector or template at all? What if it just &lt;em&gt;read&lt;/em&gt; the form — labels, placeholders, structure — and let an LLM figure out what each field wants?&lt;/p&gt;

&lt;p&gt;That's the bet I made. Instead of "this input has name=email so fill it with email," the flow became:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt; — walk the DOM, collect every input, select, radio group, checkbox, and its context (label, placeholder, aria-label, nearby text).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send&lt;/strong&gt; — send that structure plus your profile to DeepSeek (you bring your own API key).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt; — the model returns a suggested value for each field, with a confidence score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm&lt;/strong&gt; — you review the suggestions, tweak what you want, and click "Fill Selected". Nothing is filled without your explicit approval.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: a form on a React SPA I've never seen before gets filled correctly on the first try, because the extension understands what the field &lt;em&gt;means&lt;/em&gt;, not where it lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Semantic understanding beats selector matching — until it doesn't.&lt;/strong&gt; The first version worked great on static forms and died on the edge cases: radio groups where the options are images, selects with opaque option text ("Choose One —"), hidden honeypot fields, multi-step wizards that validate field-by-field. The fix was a confidence score per field. Low-confidence suggestions get highlighted in yellow instead of silently filled — the model is allowed to say "I'm not sure" without blocking the whole form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching is what makes this affordable.&lt;/strong&gt; A raw LLM call per form is fine at ~$0.001 per form, but it's slow (2–5s) and wasteful when you fill the same form twice. So confirmed mappings are cached per form — the second fill of the same page is a millisecond local lookup, marked "⚡ cached", no API call, no latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic frameworks are actually easier than they look.&lt;/strong&gt; Because the extraction runs at fill-time (not at install-time like recorders), React/Vue/Angular forms work fine — the extension reads the live DOM after render, not a snapshot from a recording session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Fill only empty" is a safety feature, not a convenience.&lt;/strong&gt; It's on by default. If a field already has content, the extension won't touch it. Combined with confirm-before-fill, it means the extension can't destroy data — the worst case is a suggestion you ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy, the boring-but-important way
&lt;/h2&gt;

&lt;p&gt;This is a personal tool first, so the defaults are: no accounts, no tracking, no servers of mine. Your profile lives in &lt;code&gt;chrome.storage.local&lt;/code&gt; in your browser. Nothing is uploaded except the form structure plus your profile, and only when you click fill — through your own API key, on your own billing. If you uninstall, the data goes with you (there's an export).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;It's live now on the &lt;a href="https://chromewebstore.google.com/detail/gdiflceinnmfaadkofiiaegiihlkjomp" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt; — free, bring your own DeepSeek key. I'm collecting weird-form reports (government portals, vendor registration systems, the 14-page vendor onboarding forms) to harden the field-extraction. If you've got a form that defeats it, I want to hear about it — that's how this gets better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/gdiflceinnmfaadkofiiaegiihlkjomp" rel="noopener noreferrer"&gt;Smart Form Fill — AI Assistant&lt;/a&gt;: upload your profile once, AI fills the rest. No templates, no recording, nothing filled without your confirmation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built after the 60th job application. &lt;a href="https://chromewebstore.google.com/detail/gdiflceinnmfaadkofiiaegiihlkjomp" rel="noopener noreferrer"&gt;Smart Form Fill&lt;/a&gt; — free, no account, your data stays in your browser.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Privacy Policy - Smart Form Fill (Chrome Extension)</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Tue, 18 Aug 2026 11:47:54 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/privacy-policy-smart-form-fill-chrome-extension-57lc</link>
      <guid>https://dev.to/jamiepark-design/privacy-policy-smart-form-fill-chrome-extension-57lc</guid>
      <description>&lt;h1&gt;
  
  
  Privacy Policy — Smart Form Fill (Chrome Extension)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Last updated: August 18, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Smart Form Fill ("the extension") helps you fill out web forms using AI. This policy explains what data the extension handles and how.&lt;/p&gt;

&lt;h2&gt;
  
  
  What data we collect
&lt;/h2&gt;

&lt;p&gt;The extension is designed to keep your data in your hands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your profile data&lt;/strong&gt; — the name, email, phone, address, company, and custom fields you enter in the extension popup. This is stored &lt;strong&gt;only on your device&lt;/strong&gt; in your browser's local storage (&lt;code&gt;chrome.storage.local&lt;/code&gt;). It is never uploaded to our servers, because we have no servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form structure&lt;/strong&gt; — when you click the ✨ button on a page, the extension reads the fields of the form on that page (field labels and types) in order to fill them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your DeepSeek API key&lt;/strong&gt; — stored only on your device in local storage. It is used solely to call the DeepSeek API on your behalf when you click fill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What we do NOT collect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No accounts, no tracking, no analytics, no advertising identifiers.&lt;/li&gt;
&lt;li&gt;The extension never transmits your data to any server we control (we run none).&lt;/li&gt;
&lt;li&gt;We do not sell, rent, or share your data with any third party.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data sent to third parties
&lt;/h2&gt;

&lt;p&gt;When you click the fill button, the extension sends &lt;strong&gt;the form structure plus the values you selected from your profile&lt;/strong&gt; to the DeepSeek API, using your own API key, in order to generate field suggestions. This request is made by your browser directly to DeepSeek. You can review and edit every suggested value before it is filled. Bank or government forms and file uploads are intentionally not processed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data retention &amp;amp; deletion
&lt;/h2&gt;

&lt;p&gt;Your profile data, API key, and per-form fill cache remain in your browser until you remove the extension or clear the extension's data (chrome://extensions → Smart Form Fill → details → clear storage). Removing the extension deletes everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Children's privacy
&lt;/h2&gt;

&lt;p&gt;The extension is not directed at children under 13 and does not knowingly collect data from them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changes to this policy
&lt;/h2&gt;

&lt;p&gt;If this policy changes, the updated version will be published at this address with a new "last updated" date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact
&lt;/h2&gt;

&lt;p&gt;If you have questions about this policy or the extension's data practices, please reach out via the Chrome Web Store listing page for Smart Form Fill.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Chrome Bookmarks Vanish (and How to Stop It)</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sun, 16 Aug 2026 04:45:06 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/why-chrome-bookmarks-vanish-and-how-to-stop-it-5ap5</link>
      <guid>https://dev.to/jamiepark-design/why-chrome-bookmarks-vanish-and-how-to-stop-it-5ap5</guid>
      <description>&lt;p&gt;"Where did my bookmarks go?"&lt;/p&gt;

&lt;p&gt;It's one of the most-asked questions about Chrome, and the answer is rarely what people expect: your bookmarks didn't vanish into thin air — something deleted them, and Chrome quietly has no way to get them back.&lt;/p&gt;

&lt;p&gt;I've spent months reading support threads, extension reviews, and Chrome bug reports about this, and almost every case fits one of the five patterns below.&lt;/p&gt;

&lt;p&gt;Here are the five ways bookmarks actually disappear, ranked by how often I've seen them in reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Duplicate cleaner" extensions (the biggest culprit)
&lt;/h2&gt;

&lt;p&gt;The #1 pattern in reviews across bookmark-management extensions: a cleanup tool that deletes "duplicates" it shouldn't. Things that look identical but aren't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Same URL, different folder&lt;/strong&gt; — you organized them into separate folders on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identical titles, different URLs&lt;/strong&gt; — tracked links, redirects, &lt;code&gt;?utm_&lt;/code&gt; variants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separators and folder structure&lt;/strong&gt; — aggressively-cleaned tools often eat the separators that structure your whole tree.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The killer detail: most of these tools &lt;strong&gt;delete permanently, with no undo&lt;/strong&gt;, because they think of deletion as a filesystem operation. Your bookmarks aren't files — there's no OS trash to fish them out of.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Sync conflicts
&lt;/h2&gt;

&lt;p&gt;Delete a bookmark on your laptop, close the lid. Later, your phone syncs — and the deletion propagates. You didn't delete it on the phone, but it's gone from both. Chrome resolves conflicts silently, and "the loser" is usually whatever synced last, not whatever you wanted to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Profile corruption / "bookmark file disappeared"
&lt;/h2&gt;

&lt;p&gt;Chrome stores bookmarks in a single &lt;code&gt;Bookmarks&lt;/code&gt; JSON file inside your profile. A crash, a full disk, a bad extension — and that file can reset or empty itself. Symptom: you open Chrome and &lt;em&gt;all&lt;/em&gt; your bookmarks are gone at once. This is where the auto-backup (&lt;code&gt;Bookmarks.bak&lt;/code&gt;, replaced on every clean startup) becomes your only hope, and it's frequently already overwritten.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. "Cleanup" of your own making
&lt;/h2&gt;

&lt;p&gt;Full disclosure: this one is us. You ran a batch cleanup, mis-clicked, confirmed too fast. Without a recycle bin, that's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Corporate/enterprise policy resets
&lt;/h2&gt;

&lt;p&gt;Rare, but if you're on a managed device, IT policies can reset or prune profile data — and you'll never get an explanation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to stop it (practical, today)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stop trusting tools that auto-delete.&lt;/strong&gt; Any cleanup tool should only &lt;em&gt;suggest&lt;/em&gt; — you review, you confirm. If an extension "cleaned up" without you checking anything, uninstall it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get a safety net.&lt;/strong&gt; A bookmark manager with a recycle bin means nothing you delete (or a tool deletes for you) is ever permanently gone. That's the core design of the &lt;a href="https://chromewebstore.google.com/detail/mjnmilmfaekoojejiijfiedmanlkpgcm" rel="noopener noreferrer"&gt;extension I built&lt;/a&gt;: every deletion goes to a 30-day recycle bin, restore with one click, and cleanup tools only ever suggest. Full JSON backup/export before any batch operation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly JSON export.&lt;/strong&gt; One click in any decent manager, or Chrome's built-in Bookmark Manager → Export. Cheap insurance; also survives profile corruption entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beware of sync race conditions.&lt;/strong&gt; If you're about to do a big cleanup, do it on one device only, and don't touch bookmarks on other devices until it's done.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The one-line summary
&lt;/h2&gt;

&lt;p&gt;Bookmarks disappear because nothing in Chrome treats deletion as recoverable — and the tools that clean them up make it worse. The fix is a recycle bin, a monthly export, and cleanup that asks before it touches anything. &lt;a href="https://chromewebstore.google.com/detail/mjnmilmfaekoojejiijfiedmanlkpgcm" rel="noopener noreferrer"&gt;Bookmark Manager&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built this after my own bookmarks got eaten by a "duplicate cleaner". &lt;a href="https://chromewebstore.google.com/detail/mjnmilmfaekoojejiijfiedmanlkpgcm" rel="noopener noreferrer"&gt;Bookmark Manager&lt;/a&gt; — free, no account, everything runs locally.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdevtutorial</category>
    </item>
    <item>
      <title>Recover Deleted Chrome Bookmarks: A Field Guide</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sun, 16 Aug 2026 04:42:45 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/recover-deleted-chrome-bookmarks-a-field-guide-5bo1</link>
      <guid>https://dev.to/jamiepark-design/recover-deleted-chrome-bookmarks-a-field-guide-5bo1</guid>
      <description>&lt;p&gt;Bookmarks in Chrome disappear faster than people expect, and the recovery paths are scattered across settings menus, hidden files, and docs nobody reads. I've collected the methods that actually work — ranked by how likely they are to save your data.&lt;/p&gt;

&lt;p&gt;Here's what actually works, in order.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The JSON backup (your best shot)
&lt;/h2&gt;

&lt;p&gt;Chrome automatically keeps backups of your bookmarks, even if you never made one manually.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close Chrome entirely.&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;C:\Users\&amp;lt;you&amp;gt;\AppData\Local\Google\Chrome\User Data\Default\&lt;/code&gt; (Windows; on macOS it's &lt;code&gt;~/Library/Application Support/Google/Chrome/Default/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Look in the &lt;code&gt;Bookmarks.bak&lt;/code&gt; file — this is the auto-backup Chrome takes on startup.&lt;/li&gt;
&lt;li&gt;Copy it to a safe place, rename it to &lt;code&gt;Bookmarks&lt;/code&gt; (no extension), then open &lt;code&gt;chrome://bookmarks&lt;/code&gt; and import it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Caveats:&lt;/strong&gt; &lt;code&gt;Bookmarks.bak&lt;/code&gt; only survives until Chrome's next clean startup — after that, it's overwritten. It won't help if the deletion happened a while ago, or if you use multiple profiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Undo, right now
&lt;/h2&gt;

&lt;p&gt;If the deletion happened within the last few minutes: press &lt;strong&gt;Ctrl+Z&lt;/strong&gt; inside the bookmarks manager, or use the Undo option in the overflow menu (⋮) in &lt;code&gt;chrome://bookmarks&lt;/code&gt;. This works more often than people expect — but it's a one-shot, last-action-only undo. If you've done anything since, it's gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sync recovery (works within ~30 days)
&lt;/h2&gt;

&lt;p&gt;If you use Chrome sync and deleted the bookmark from one device, it may still exist on another device that hasn't synced yet. Grab it from the other device &lt;strong&gt;before&lt;/strong&gt; it syncs the deletion. Chrome keeps deleted-sync data for a limited window (typically around 30 days) — but you can't browse it; you're racing the sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. What doesn't work (so you don't waste time)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Trash on your OS&lt;/strong&gt; — bookmarks aren't files; deleting a bookmark doesn't touch your filesystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restore a previous version&lt;/strong&gt; of the profile folder (Windows File History / macOS Time Machine) — works only if you have it enabled, and it nukes newer changes along with recovering old ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo after closing Chrome&lt;/strong&gt; — gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this keeps happening (the real answer)
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable truth: &lt;strong&gt;Chrome's bookmark manager has no trash can at all.&lt;/strong&gt; One bad click during folder cleanup, one aggressive "duplicate remover" extension, one sync conflict — and data is permanently gone with zero recovery path.&lt;/p&gt;

&lt;p&gt;That's the gap I hit myself, which is why I built &lt;a href="https://chromewebstore.google.com/detail/mjnmilmfaekoojejiijfiedmanlkpgcm" rel="noopener noreferrer"&gt;Bookmark Manager&lt;/a&gt;, an extension with a recycle bin as its core feature. Deletions (including anything a cleanup tool removes) sit in a recycle bin for 30 days — restore any of them, anytime, one click. Nothing is ever permanently deleted without you seeing it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical tips to stop losing bookmarks permanently:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export a JSON backup monthly — Bookmark Manager does this in one click, or use Chrome's built-in Bookmark Manager → Export.&lt;/li&gt;
&lt;li&gt;Use cleanup tools that &lt;strong&gt;only suggest, never auto-delete&lt;/strong&gt; — and even then, keep them away from your separators.&lt;/li&gt;
&lt;li&gt;If you're on sync, treat "delete on one device" as "delete everywhere" within minutes.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;Want the safety net without changing how you use bookmarks? &lt;a href="https://chromewebstore.google.com/detail/mjnmilmfaekoojejiijfiedmanlkpgcm" rel="noopener noreferrer"&gt;Bookmark Manager&lt;/a&gt; — free, no account, bookmarks never leave your browser.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivitytwebdevutorial</category>
    </item>
    <item>
      <title>From 8.2s to 2.1s: How Image Compression Changed a Store's Conversion Rate</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:13:31 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/from-82s-to-21s-how-image-compression-changed-a-stores-conversion-rate-3117</link>
      <guid>https://dev.to/jamiepark-design/from-82s-to-21s-how-image-compression-changed-a-stores-conversion-rate-3117</guid>
      <description>&lt;p&gt;I audited a Shopify store last month. The homepage was 22MB. Product images averaged 4MB each. Page load: 8.2 seconds.&lt;/p&gt;

&lt;p&gt;The conversion rate was 1.1%.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Found
&lt;/h2&gt;

&lt;p&gt;The product photos were straight out of a DSLR — 6000x4000 pixels displayed in 300x200 containers. The browser was downloading and resizing every single image in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Lossless compression on every product image. Same visual quality. Average file size went from 4MB to 400KB. Page load: 2.1 seconds.&lt;/p&gt;

&lt;p&gt;Two weeks later, the conversion rate was 1.3% — an 18% increase. Lighthouse went from 35 to 92.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Use
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://compress2png.com/" rel="noopener noreferrer"&gt;compress2png.com&lt;/a&gt; handles lossless PNG compression in the browser. No upload, no server processing, no privacy concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick win:&lt;/strong&gt; Run Lighthouse before and after compressing your images. The performance score jump alone is worth showing clients.&lt;/p&gt;

&lt;p&gt;What page weight horrors have you found during audits?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>images</category>
    </item>
    <item>
      <title>Trailing Comma Took Down Production at 11 PM — A JSON Debugging Story</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:12:51 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/trailing-comma-took-down-production-at-11-pm-a-json-debugging-story-5102</link>
      <guid>https://dev.to/jamiepark-design/trailing-comma-took-down-production-at-11-pm-a-json-debugging-story-5102</guid>
      <description>&lt;p&gt;The deploy failed at 11 PM with a cryptic error: "Unexpected token } in JSON at position 5824."&lt;/p&gt;

&lt;p&gt;Two developers stared at the minified config file for ten minutes. Line 247. A trailing comma in a 200KB JSON object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Minified JSON Is a Trap
&lt;/h2&gt;

&lt;p&gt;Minified JSON saves bandwidth but costs debugging time. When everything is on one line, a syntax error is invisible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I do now:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Beautify JSON before any code review&lt;/li&gt;
&lt;li&gt;Validate syntax before every deploy&lt;/li&gt;
&lt;li&gt;Never debug minified output directly&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Tool That Saves Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formlyapp.org/" rel="noopener noreferrer"&gt;formlyapp.org&lt;/a&gt; does all three in the browser. It formats, validates, and highlights errors instantly. No data leaves your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My pre-deploy checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;json.loads()&lt;/code&gt; the config file&lt;/li&gt;
&lt;li&gt;Run it through a formatter&lt;/li&gt;
&lt;li&gt;Only minify as the final build step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is your worst production JSON debugging story?&lt;/p&gt;

</description>
      <category>json</category>
      <category>webdev</category>
      <category>debugging</category>
    </item>
    <item>
      <title>The Missing 180px Icon That Cost a Brand 6 Months of iPhone Impressions</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:12:13 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/the-missing-180px-icon-that-cost-a-brand-6-months-of-iphone-impressions-310a</link>
      <guid>https://dev.to/jamiepark-design/the-missing-180px-icon-that-cost-a-brand-6-months-of-iphone-impressions-310a</guid>
      <description>&lt;p&gt;I audited a client site that had been live for six months. On a hunch, I added their site to my iPhone home screen.&lt;/p&gt;

&lt;p&gt;A gray letter placeholder. Six months of visitors bookmarking the site and seeing a generic icon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Files Every Site Needs
&lt;/h2&gt;

&lt;p&gt;Most developers stop at favicon.ico. That covers browser tabs. But it does nothing for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iPhone/iPad home screen bookmarks&lt;/li&gt;
&lt;li&gt;Android home screen shortcuts&lt;/li&gt;
&lt;li&gt;PWA install prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The minimum set is three files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"32x32"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/favicon-32x32.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"apple-touch-icon"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"180x180"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/apple-touch-icon.png"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"manifest"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/site.webmanifest"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  One-Click Generation
&lt;/h2&gt;

&lt;p&gt;I use &lt;a href="https://genfavicon.org/" rel="noopener noreferrer"&gt;genfavicon.org&lt;/a&gt; to generate the complete package. It outputs all sizes plus the manifest in one download.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick audit:&lt;/strong&gt; Add your site to your iPhone home screen right now. If it is a gray letter, you are missing the apple-touch-icon.&lt;/p&gt;

&lt;p&gt;How long has your site been showing a placeholder?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>favicon</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Barcode Quiet Zones: Why 5 Pallets Per Shift Got Sidelined</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:11:34 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/barcode-quiet-zones-why-5-pallets-per-shift-got-sidelined-g23</link>
      <guid>https://dev.to/jamiepark-design/barcode-quiet-zones-why-5-pallets-per-shift-got-sidelined-g23</guid>
      <description>&lt;p&gt;Three years in an Amazon warehouse taught me one lesson about barcodes: the quiet zone matters more than print quality.&lt;/p&gt;

&lt;p&gt;Every shift, at least 5 pallets got flagged at inbound receiving. The labels looked fine to the human eye. But the laser scanner could not read them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Issue
&lt;/h2&gt;

&lt;p&gt;It was never about print resolution or contrast. The quiet zone — the blank space around the barcode — was too narrow. Most online generators do not add proper quiet zones by default.&lt;/p&gt;

&lt;p&gt;The rule from GS1: leave at least 10 times the narrow bar width on each side.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Works
&lt;/h2&gt;

&lt;p&gt;I started using &lt;a href="https://genbarcode.org/" rel="noopener noreferrer"&gt;genbarcode.org&lt;/a&gt; which generates GS1-compliant barcodes with proper quiet zones built in. The site supports Code 128, EAN-13, UPC-A, ITF-14 — all the formats we used daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Barcode checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GS1-registered prefix (not a reseller code)&lt;/li&gt;
&lt;li&gt;Proper quiet zone on all four sides&lt;/li&gt;
&lt;li&gt;Test scan with actual reader hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero sidelined pallets after switching tools. Anyone else deal with barcode scanner rejections?&lt;/p&gt;

</description>
      <category>barcode</category>
      <category>logistics</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>SVG to PNG: The DPI Setting That Kept Getting My Work Rejected</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:10:55 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/svg-to-png-the-dpi-setting-that-kept-getting-my-work-rejected-39hb</link>
      <guid>https://dev.to/jamiepark-design/svg-to-png-the-dpi-setting-that-kept-getting-my-work-rejected-39hb</guid>
      <description>&lt;p&gt;A print shop rejected my client banner artwork three times. The reason? "72 DPI — unacceptable for print."&lt;/p&gt;

&lt;p&gt;The source file was a perfectly crisp vector SVG. Every export came out at web resolution because I never checked the DPI setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix That Changed Everything
&lt;/h2&gt;

&lt;p&gt;Most SVG-to-PNG converters default to 72 DPI because they target screen display. If you are exporting for print, you need 300 DPI minimum.&lt;/p&gt;

&lt;p&gt;I switched to specifying 300 DPI on every export. The same banner was accepted on the first re-submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Do It Now
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://svg2png.org/" rel="noopener noreferrer"&gt;svg2png.org&lt;/a&gt; lets you specify export resolution. One SVG source, any DPI output — 1x for web, 3x for retina, 300 DPI for print.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checklist before exporting SVG to PNG:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who is the audience? Screen or print?&lt;/li&gt;
&lt;li&gt;What DPI does the destination require?&lt;/li&gt;
&lt;li&gt;Does the converter preserve transparency?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This one setting has saved me hours of rework. Anyone else had print shops reject web-resolution files?&lt;/p&gt;

</description>
      <category>svg</category>
      <category>webdev</category>
      <category>design</category>
    </item>
    <item>
      <title>WebP to PNG: How I Saved Our Email Campaign in 10 Minutes</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Sat, 15 Aug 2026 12:10:17 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/webp-to-png-how-i-saved-our-email-campaign-in-10-minutes-28bl</link>
      <guid>https://dev.to/jamiepark-design/webp-to-png-how-i-saved-our-email-campaign-in-10-minutes-28bl</guid>
      <description>&lt;p&gt;I spent weeks optimizing our landing page images as WebP. Page load dropped 40%. Lighthouse score hit 95.&lt;/p&gt;

&lt;p&gt;Then marketing sent the weekly newsletter. Every product image was broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Email clients do not render WebP. Gmail, Outlook, Mailchimp — none of them support it. All that optimization meant nothing when our customers saw broken image placeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Emergency Fix
&lt;/h2&gt;

&lt;p&gt;I batch-converted 200 product photos back to PNG in one go. The tool preserved alpha channels on transparent product shots, which was critical — our previous converter flattened them to white backgrounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Use Now
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webp2png.io/" rel="noopener noreferrer"&gt;webp2png.io&lt;/a&gt; handles batch WebP-to-PNG conversion including transparency. No upload, runs in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My rule:&lt;/strong&gt; WebP for the web, PNG for everything else.&lt;/p&gt;

&lt;p&gt;What format headaches have you dealt with?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>From 8.2s to 2.1s: How Image Compression Changed a Store's Conversion Rate</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Fri, 14 Aug 2026 10:37:55 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/from-82s-to-21s-how-image-compression-changed-a-stores-conversion-rate-3i0g</link>
      <guid>https://dev.to/jamiepark-design/from-82s-to-21s-how-image-compression-changed-a-stores-conversion-rate-3i0g</guid>
      <description>&lt;p&gt;I audited a Shopify store last month. The homepage was 22MB. Product images averaged 4MB each. Page load: 8.2 seconds.&lt;/p&gt;

&lt;p&gt;The conversion rate was 1.1%.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Found
&lt;/h2&gt;

&lt;p&gt;The product photos were straight out of a DSLR — 6000x4000 pixels displayed in 300x200 containers. The browser was downloading and resizing every single image in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Lossless compression on every product image. Same visual quality. Average file size went from 4MB to 400KB. Page load: 2.1 seconds.&lt;/p&gt;

&lt;p&gt;Two weeks later, the conversion rate was 1.3% — an 18% increase. Lighthouse went from 35 to 92.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Use
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://compress2png.com/" rel="noopener noreferrer"&gt;compress2png.com&lt;/a&gt; handles lossless PNG compression in the browser. No upload, no server processing, no privacy concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick win:&lt;/strong&gt; Run Lighthouse before and after compressing your images. The performance score jump alone is worth showing clients.&lt;/p&gt;

&lt;p&gt;What page weight horrors have you found during audits?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>images</category>
    </item>
    <item>
      <title>Trailing Comma Took Down Production at 11 PM — A JSON Debugging Story</title>
      <dc:creator>swift king</dc:creator>
      <pubDate>Fri, 14 Aug 2026 10:37:18 +0000</pubDate>
      <link>https://dev.to/jamiepark-design/trailing-comma-took-down-production-at-11-pm-a-json-debugging-story-2jil</link>
      <guid>https://dev.to/jamiepark-design/trailing-comma-took-down-production-at-11-pm-a-json-debugging-story-2jil</guid>
      <description>&lt;p&gt;The deploy failed at 11 PM with a cryptic error: "Unexpected token } in JSON at position 5824."&lt;/p&gt;

&lt;p&gt;Two developers stared at the minified config file for ten minutes. Line 247. A trailing comma in a 200KB JSON object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Minified JSON Is a Trap
&lt;/h2&gt;

&lt;p&gt;Minified JSON saves bandwidth but costs debugging time. When everything is on one line, a syntax error is invisible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I do now:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Beautify JSON before any code review&lt;/li&gt;
&lt;li&gt;Validate syntax before every deploy&lt;/li&gt;
&lt;li&gt;Never debug minified output directly&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Tool That Saves Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formlyapp.org/" rel="noopener noreferrer"&gt;formlyapp.org&lt;/a&gt; does all three in the browser. It formats, validates, and highlights errors instantly. No data leaves your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My pre-deploy checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;json.loads()&lt;/code&gt; the config file&lt;/li&gt;
&lt;li&gt;Run it through a formatter&lt;/li&gt;
&lt;li&gt;Only minify as the final build step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is your worst production JSON debugging story?&lt;/p&gt;

</description>
      <category>json</category>
      <category>webdev</category>
      <category>debugging</category>
    </item>
  </channel>
</rss>
