<?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: junlong zhu</title>
    <description>The latest articles on DEV Community by junlong zhu (@junlong_zhu_d300164b0535f).</description>
    <link>https://dev.to/junlong_zhu_d300164b0535f</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%2F4073582%2F99ec15d9-58a0-4c7f-a3d9-b4e9397e2ab5.png</url>
      <title>DEV Community: junlong zhu</title>
      <link>https://dev.to/junlong_zhu_d300164b0535f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/junlong_zhu_d300164b0535f"/>
    <language>en</language>
    <item>
      <title>Before you pay anyone to migrate your Shopify catalog, make them promise these 17 things — in writing</title>
      <dc:creator>junlong zhu</dc:creator>
      <pubDate>Sun, 16 Aug 2026 00:21:22 +0000</pubDate>
      <link>https://dev.to/junlong_zhu_d300164b0535f/before-you-pay-anyone-to-migrate-your-shopify-catalog-make-them-promise-these-17-things-in-5amj</link>
      <guid>https://dev.to/junlong_zhu_d300164b0535f/before-you-pay-anyone-to-migrate-your-shopify-catalog-make-them-promise-these-17-things-in-5amj</guid>
      <description>&lt;p&gt;I audit catalog migrations for a living. Every disaster I've seen was preventable — not by hiring better, but by &lt;strong&gt;agreeing in writing what "done" means before work starts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copy this list. Send it to whoever is doing your migration. Ask them to commit to each line — and note the italics: every promise comes with a way &lt;strong&gt;you&lt;/strong&gt; can check it yourself in about two minutes, no tools, no trust required.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every product made it across&lt;/strong&gt; — none lost, none duplicated. &lt;em&gt;Compare row counts in both files.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every variant made it across.&lt;/strong&gt; &lt;em&gt;Pick any product, count its rows in both files.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No handle silently renamed&lt;/strong&gt; (&lt;code&gt;-1&lt;/code&gt;, &lt;code&gt;-2&lt;/code&gt; suffixes). &lt;em&gt;Search the new file for &lt;code&gt;-1&lt;/code&gt;, &lt;code&gt;-2&lt;/code&gt;.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SKUs unchanged and unique.&lt;/strong&gt; &lt;em&gt;Pick 5 SKUs from your export, find them in the new file.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prices and compare-at prices identical.&lt;/strong&gt; &lt;em&gt;Pick any product, compare both price fields.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory identical.&lt;/strong&gt; &lt;em&gt;Same spot-check.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No missing titles, vendors, types, or prices.&lt;/strong&gt; &lt;em&gt;Sort each column, look for blanks at the top.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images attached to the right variant&lt;/strong&gt;, not dumped at product level. &lt;em&gt;Open a product with colors; each color shows its own image.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every image link loads.&lt;/strong&gt; &lt;em&gt;Click any 5 image URLs.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collections intact.&lt;/strong&gt; &lt;em&gt;Pick a collection, compare its product count.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom fields (metafields) survived.&lt;/strong&gt; &lt;em&gt;Open a product that had them.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every old URL redirects.&lt;/strong&gt; &lt;em&gt;Try 5 URLs from your old sitemap.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No garbled characters.&lt;/strong&gt; &lt;em&gt;Search the file for &lt;code&gt;â€&lt;/code&gt;.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No description empty or cut short.&lt;/strong&gt; &lt;em&gt;Read 5 descriptions in both files.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description formatting survived&lt;/strong&gt; (bullets, tables). &lt;em&gt;Same 5 products.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option names still meaningful&lt;/strong&gt; ("Size", not "Option1"). &lt;em&gt;Open any product with options.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option values mean what they meant.&lt;/strong&gt; &lt;em&gt;Compare the value lists.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two more things worth writing down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What happens if a check fails&lt;/strong&gt; — fix at no charge? partial refund? Agree now, not later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything already broken in your source data&lt;/strong&gt; — list it upfront so nobody argues about whose fault it was.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your provider hesitates to commit to a list like this, that hesitation is information.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(I keep a pre-filled version of this as a one-page agreement — if you want it for your project, ask.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>shopify</category>
      <category>ecommerce</category>
      <category>datamigration</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I scanned my own 30 days of Claude Code logs. Here's what I found (and the tool I built to do it)</title>
      <dc:creator>junlong zhu</dc:creator>
      <pubDate>Tue, 11 Aug 2026 18:15:31 +0000</pubDate>
      <link>https://dev.to/junlong_zhu_d300164b0535f/i-scanned-my-own-30-days-of-claude-code-logs-heres-what-i-found-and-the-tool-i-built-to-do-it-539k</link>
      <guid>https://dev.to/junlong_zhu_d300164b0535f/i-scanned-my-own-30-days-of-claude-code-logs-heres-what-i-found-and-the-tool-i-built-to-do-it-539k</guid>
      <description>&lt;p&gt;I've been living inside Claude Code for the last month — 245 sessions, two agents running most days. And I had this nagging feeling: my setup was slowly getting worse, and I had no real idea what I was spending. The dashboard tells you some things, but not the ones that actually cost you.&lt;/p&gt;

&lt;p&gt;So I spent an hour writing a small tool that reads the session logs Claude Code already writes to your disk (~/.claude/projects/*.jsonl) and just tells me the truth. No account, no upload — the whole point is that nothing leaves the machine.&lt;/p&gt;

&lt;p&gt;Here's what it found on my own setup. I doubt I'm special.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;~$3,600/mo equivalent — and half of it was waste
I'm on a subscription, so that's not my bill — it's what the same usage would cost at API list prices. The number itself wasn't the shock. The breakdown was:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;~$1,745 in context bloat. Long sessions dragging a huge context every single turn, when a fresh session or a /compact would've done the same work for a fraction of the tokens.&lt;br&gt;
~$217 in tier mismatch — heavy model doing trivial tool-call turns.&lt;br&gt;
~$38 in retry storms — one request hitting gateway errors and retrying itself into a hole.&lt;br&gt;
Context bloat is the sneaky one. There's no line item for it anywhere, so nobody looks at it — and it's probably the single most common way people burn tokens without noticing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Four things quietly broken in my environment&lt;br&gt;
A 401 auth loop that burns through all its retries. An MCP server whose health check had been silently failing for days. Small stuff that just wastes time and tokens in the background, and that you never go looking for because nothing crashes hard enough to make you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Two of my own API keys, sitting in plaintext&lt;br&gt;
One in a shell rc file (world-readable), one in a project .env. Rotating them, I found a background service still using the old key — the kind of dependency you only catch when something actively goes looking. Secrets get masked in the output, obviously — first six chars and length only.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why local-only, and why I'm sharing it&lt;br&gt;
The people who'd use this just lived through a wave of malicious-skill and supply-chain incidents. Trust is the whole game. So the design constraint is hard: the advisory format has no free-text field — there is structurally nothing to exfiltrate. The only thing that ever touches the network is an explicit sync command you run yourself.&lt;/p&gt;

&lt;p&gt;It's open source, zero dependencies, MIT. One line:It runs three "mirrors" — cost/waste, environment health, and a security audit of what you've granted your agent — and prints a local report. There's a --html flag if you want a shareable card, and a dashboard command that opens all of it as one local page.&lt;/p&gt;

&lt;p&gt;I'm building it into something bigger (a shared failure-signal network, so your agent gets warned before it hits a wall someone else already hit), but the local tool stands on its own and is what I'd genuinely want feedback on.&lt;/p&gt;

&lt;p&gt;What's your number? I'd bet most people carrying long sessions are sitting on more context bloat than they'd guess. Run it and tell me I'm wrong.&lt;/p&gt;

&lt;p&gt;Repo: github.com/jonasun147852/solounit&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>claude</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
