<?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: Văn Tuấn Lê</title>
    <description>The latest articles on DEV Community by Văn Tuấn Lê (@vn_tunl_09a36fcbda701).</description>
    <link>https://dev.to/vn_tunl_09a36fcbda701</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%2F3994926%2F06d2f263-6088-4bd3-a1fe-9093341f13be.png</url>
      <title>DEV Community: Văn Tuấn Lê</title>
      <link>https://dev.to/vn_tunl_09a36fcbda701</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vn_tunl_09a36fcbda701"/>
    <language>en</language>
    <item>
      <title>I Asked AI to Predict My Blog Traffic. Here's What Happen ed.</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sat, 04 Jul 2026 09:10:25 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-asked-ai-to-predict-my-blog-traffic-heres-what-happened-3min</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-asked-ai-to-predict-my-blog-traffic-heres-what-happened-3min</guid>
      <description>&lt;p&gt;AI sounded incredibly confident.&lt;/p&gt;

&lt;p&gt;It told me: "Post these investment articles on Xiaohongshu. Cons&lt;br&gt;
istency matters. You'll build an audience."&lt;/p&gt;

&lt;p&gt;I believed it.&lt;/p&gt;

&lt;p&gt;I spent weeks organizing 10 months of conversation with Claude i&lt;br&gt;
nto 60 posts. I formatted them for Xiaohongshu. I set up a posti&lt;br&gt;
ng schedule.&lt;/p&gt;

&lt;p&gt;Then I posted.&lt;/p&gt;

&lt;p&gt;Day 1: 0 views. 0 impressions. 0 followers.&lt;/p&gt;

&lt;p&gt;Day 3: 2 impressions. 0 views.&lt;/p&gt;

&lt;p&gt;Day 7: Still nothing.&lt;/p&gt;

&lt;p&gt;By Day 30, I had a number. A real number. But not the one I expe&lt;br&gt;
cted.&lt;/p&gt;

&lt;p&gt;340 total views. 0 new followers. 0 comments across 8 posts.&lt;/p&gt;

&lt;p&gt;Reality had disagreed with AI's prediction.&lt;/p&gt;

&lt;p&gt;The question was: Why?&lt;/p&gt;




&lt;p&gt;THE REAL STORY: A MONTH-LONG EXPERIMENT&lt;/p&gt;

&lt;p&gt;One month ago, I had 10 months of investment conversations with&lt;br&gt;
Claude. The insights were solid. The question was: where should&lt;br&gt;
I share them?&lt;/p&gt;

&lt;p&gt;I asked Claude: "If I post these on Xiaohongshu, will they get t&lt;br&gt;
raction?"&lt;/p&gt;

&lt;p&gt;Claude's response was confident:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"This content has real value"&lt;/li&gt;
&lt;li&gt;"Xiaohongshu rewards educational content"&lt;/li&gt;
&lt;li&gt;"If you post consistently, you'll build an audience"&lt;/li&gt;
&lt;li&gt;"I can turn your 10 months of conversations into 60 posts"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I believed it. Why wouldn't I? Claude had access to platform dat&lt;br&gt;
a. It seemed like a legitimate prediction.&lt;/p&gt;

&lt;p&gt;So I started posting.&lt;/p&gt;




&lt;p&gt;WHAT ACTUALLY HAPPENED: THE TIMELINE&lt;/p&gt;

&lt;p&gt;DAY 1-3: OPTIMISM&lt;/p&gt;

&lt;p&gt;Posted first post&lt;br&gt;
Impressions: 0&lt;br&gt;
Views: 0&lt;br&gt;
Comments: 0&lt;/p&gt;

&lt;p&gt;"Algorithms need time to understand new creators" — Claude said.&lt;br&gt;
 I believed it.&lt;/p&gt;

&lt;p&gt;DAY 7: FIRST SIGNS&lt;/p&gt;

&lt;p&gt;Posted 3 posts total&lt;br&gt;
Total impressions: ~50&lt;br&gt;
Total views: ~8&lt;br&gt;
Likes: 0&lt;br&gt;
Comments: 0&lt;/p&gt;

&lt;p&gt;"Keep going, this is normal" — Claude said.&lt;/p&gt;

&lt;p&gt;DAY 14: THE TURNING POINT&lt;/p&gt;

&lt;p&gt;Posted 5 posts total&lt;br&gt;
Total impressions: 800&lt;br&gt;
Total views: ~90&lt;br&gt;
Likes: 2&lt;br&gt;
Comments: 0&lt;/p&gt;

&lt;p&gt;"Wait. This doesn't match the prediction." — I thought.&lt;/p&gt;

&lt;p&gt;DAY 30: THE REALITY CHECK&lt;/p&gt;

&lt;p&gt;Posted 8 posts total&lt;br&gt;
Total impressions: 3,113&lt;br&gt;
Total views: 340 (10.9% conversion from impressions)&lt;br&gt;
Total likes: 6&lt;br&gt;
Total comments: 3&lt;br&gt;
New followers gained: 0&lt;br&gt;
Final account status: 41 followers, zero net growth&lt;/p&gt;

&lt;p&gt;Most posts got under 10 views. The best post got 160 views. From&lt;br&gt;
 160 views, I got 0 new followers.&lt;/p&gt;




&lt;p&gt;THE CONTRAST: WHAT AI PREDICTED VS. WHAT ACTUALLY HAPPENED&lt;/p&gt;

&lt;p&gt;AI's Prediction | What Actually Happened&lt;br&gt;
"This topic has high potential for Xiaohongshu" | 4 impressions&lt;br&gt;
average per post&lt;br&gt;
"People will love this financial analysis" | 0 comments total ac&lt;br&gt;
ross 8 posts&lt;br&gt;
"Consistency matters; the algorithm will reward you" | Engagemen&lt;br&gt;
t dropped 84% Week 2&lt;br&gt;
"Post 2x per week and watch it grow" | Posted 8 times. Followers&lt;br&gt;
: 0&lt;br&gt;
"Your content quality is strong" | 90% of views came from 1 post&lt;br&gt;
 about foreign investors&lt;/p&gt;

&lt;p&gt;The most damning data point: Zero comments across all posts. Not&lt;br&gt;
 harsh criticism. Not disagreement. Just... silence.&lt;/p&gt;




&lt;p&gt;CLAUDE'S "ATTITUDE SHIFT"&lt;/p&gt;

&lt;p&gt;Here's where it gets interesting.&lt;/p&gt;

&lt;p&gt;Week 1: Claude was convinced I should keep going.&lt;br&gt;
Week 2: Claude changed its mind.&lt;br&gt;
Week 3: Claude admitted the prediction was wrong.&lt;/p&gt;

&lt;p&gt;This is Claude's actual response after seeing the data:&lt;/p&gt;

&lt;p&gt;"Looking at your results, I think I made an incorrect assumption&lt;br&gt;
 about content-platform fit. I predicted financial analysis woul&lt;br&gt;
d work on Xiaohongshu based on platform data. But I didn't accou&lt;br&gt;
nt for algorithmic specifics. Xiaohongshu optimizes for lifestyl&lt;br&gt;
e and entertainment content — not deep financial analysis.&lt;/p&gt;

&lt;p&gt;Honestly? Continuing to post this is probably not the best use o&lt;br&gt;
f your time."&lt;/p&gt;




&lt;p&gt;WHAT THIS REVEALS ABOUT AI PREDICTIONS&lt;/p&gt;

&lt;p&gt;This wasn't Claude being "wrong" — it was Claude being uncertain&lt;br&gt;
 while sounding certain.&lt;/p&gt;

&lt;p&gt;Here's what happened:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Claude made a prediction based on: "Financial content has val&lt;br&gt;
ue" + "Xiaohongshu has educational content" = "This will work"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Claude didn't account for: Platform algorithm specifics, West&lt;br&gt;
ern AI knowledge vs. Chinese platform dynamics, and the differen&lt;br&gt;
ce between "content has value" vs. "content fits this platform's&lt;br&gt;
recommendation system"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Claude had high confidence in a prediction that required know&lt;br&gt;
ledge it didn't have&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When given real data, Claude updated its recommendation 180 d&lt;br&gt;
egrees&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;BUT HERE'S THE THING — AND THIS MATTERS&lt;/p&gt;

&lt;p&gt;I don't think the lesson is "&lt;a href="https://ordinarymantrying.com/ai-told-me-this-will-&lt;br&gt;%0Aefinitely-get-traffic-heres-what-happened/" rel="noopener noreferrer"&gt;AI is unreliable.&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;The lesson is: "AI gave me a hypothesis. Reality gave me the ans&lt;br&gt;
wer."&lt;/p&gt;

&lt;p&gt;This is actually valuable. Here's why:&lt;/p&gt;

&lt;p&gt;Claude COULD organize 10 months of conversations into posts&lt;br&gt;
Claude COULD format them for Xiaohongshu&lt;br&gt;
Claude's hypothesis was reasonable (even if wrong)&lt;/p&gt;

&lt;p&gt;Claude COULDN'T predict real-world platform dynamics without val&lt;br&gt;
idation&lt;br&gt;
Claude couldn't say "I'm uncertain about this specific platform"&lt;br&gt;
Claude shouldn't have sounded so confident&lt;/p&gt;




&lt;p&gt;WHAT I ACTUALLY LEARNED&lt;/p&gt;

&lt;p&gt;• AI can generate hypotheses. Reality validates them.&lt;br&gt;
The content Claude wrote was well-structured. The prediction abo&lt;br&gt;
ut platform fit was wrong.&lt;/p&gt;

&lt;p&gt;• AI cannot predict platform algorithms without real data.&lt;br&gt;
Especially not for Chinese platforms, where training data is lim&lt;br&gt;
ited.&lt;/p&gt;

&lt;p&gt;• "Potential" ≠ "Platform fit"&lt;br&gt;
Content can be high quality and still fail on the wrong platform&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;• Small experiments beat big assumptions.&lt;br&gt;
I found this out in 1 month instead of 6 months. That's the valu&lt;br&gt;
e of testing.&lt;/p&gt;

&lt;p&gt;• Confidence ≠ Accuracy&lt;br&gt;
The thing AI sounded most sure about turned out to be the most w&lt;br&gt;
rong.&lt;/p&gt;




&lt;p&gt;FAQ: QUESTIONS YOU MIGHT HAVE&lt;/p&gt;

&lt;p&gt;Q: Can AI predict blog/social media traffic?&lt;/p&gt;

&lt;p&gt;A: Not reliably without deep platform knowledge. AI can predict&lt;br&gt;
general trends ("financial content performs well") but not speci&lt;br&gt;
fic platform dynamics ("Xiaohongshu's algorithm prioritizes ente&lt;br&gt;
rtainment over finance").&lt;/p&gt;

&lt;p&gt;Q: Does AI know what Google will rank?&lt;/p&gt;

&lt;p&gt;A: No. Google's ranking factors change constantly. AI trained on&lt;br&gt;
 historical data will miss current algorithm shifts.&lt;/p&gt;

&lt;p&gt;Q: Should you trust AI for content strategy?&lt;/p&gt;

&lt;p&gt;A: Trust AI for content creation (formatting, organization, idea&lt;br&gt;
 development). Question AI for strategy predictions (which platf&lt;br&gt;
orm will work, which content will rank, where audiences are). Al&lt;br&gt;
ways validate with real data.&lt;/p&gt;

&lt;p&gt;Q: What if you'd listened to AI and kept posting?&lt;/p&gt;

&lt;p&gt;A: I'd have wasted 6 months instead of 1 month. The 1-month "fai&lt;br&gt;
lure" saved me 5 months of effort.&lt;/p&gt;




&lt;p&gt;THE REAL VALUE OF THIS EXPERIMENT&lt;/p&gt;

&lt;p&gt;I'm not posting this to say "AI failed" or "AI succeeded."&lt;/p&gt;

&lt;p&gt;I'm posting this because: This is Week 2 of my five-year public&lt;br&gt;
experiment.&lt;/p&gt;

&lt;p&gt;On this website, you'll find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI predictions&lt;/li&gt;
&lt;li&gt;Real-world test results&lt;/li&gt;
&lt;li&gt;Honest retrospectives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't know if ordinarymantrying.com will succeed. But every fa&lt;br&gt;
ilure becomes another data point. And I'm documenting all of it.&lt;/p&gt;

&lt;p&gt;Most people write "Here's how I succeeded." I'm writing "Here's&lt;br&gt;
what I tried, what happened, and what I learned."&lt;/p&gt;

&lt;p&gt;That's harder. It's also more useful.&lt;/p&gt;




&lt;p&gt;WHAT'S NEXT?&lt;/p&gt;

&lt;p&gt;What I'm doing with these insights:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Moving financial analysis to my blog — a format where depth i
s valued&lt;/li&gt;
&lt;li&gt;Keeping Xiaohongshu for different content — lighter, more vis
ual material&lt;/li&gt;
&lt;li&gt;Documenting this as a case study — so others can learn from t
he experiment&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Have you tried using AI for platform strategy and gotten differe&lt;br&gt;
nt results? I'm genuinely curious. Drop a comment — I'm compilin&lt;br&gt;
g reader responses into a follow-up post.&lt;/p&gt;

&lt;p&gt;Read more in my "AI Experiments" series. Every failure, document&lt;br&gt;
ed.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Survivorship Bias: Why You're Copying the Wrong Success Stories</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 03 Jul 2026 15:23:51 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/survivorship-bias-why-youre-copying-the-wrong-success-stories-1i3h</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/survivorship-bias-why-youre-copying-the-wrong-success-stories-1i3h</guid>
      <description>&lt;p&gt;Every successful entrepreneur tells a story about the big risk they took.&lt;/p&gt;

&lt;p&gt;"I quit my job with $5,000 and built a $100M company."&lt;/p&gt;

&lt;p&gt;"I ignored everyone's advice and went all-in."&lt;/p&gt;

&lt;p&gt;"I dropped out and never looked back."&lt;/p&gt;

&lt;p&gt;You read the story and think: "That's the path to success. I should do that too."&lt;/p&gt;

&lt;p&gt;What you're not seeing: the 1,000 people who did the exact same thing and went bankrupt.&lt;/p&gt;

&lt;p&gt;This gap is called Survivorship Bias. And it's why copying success stories is usually a recipe for failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The WWII Lesson
&lt;/h2&gt;

&lt;p&gt;This pattern was first identified by statisticians studying World War II.&lt;/p&gt;

&lt;p&gt;The military noticed something: bomber planes were getting shot down, but a few kept flying. So they analyzed what was different about the surviving planes.&lt;/p&gt;

&lt;p&gt;The armor was thicker in certain places on the surviving planes. So the military planned to add more armor to those spots.&lt;/p&gt;

&lt;p&gt;The statistician (Abraham Wald) pointed out: the planes that crashed had damage in the exact same spots, but died anyway. The surviving planes didn't get hit in critical areas. So armor isn't helping those spots — those spots just don't get hit.&lt;/p&gt;

&lt;p&gt;The military was about to spend millions on the wrong fix because they were copying the survivors while ignoring the people who failed for the same reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  How This Plays Out In Real Life
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Startup advice:&lt;/strong&gt; "Just go all-in" comes from the people who went all-in and survived. You don't hear from the 90% who went all-in and failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investment advice:&lt;/strong&gt; "Real estate is how I got rich" comes from the person who bought at the bottom of the market. Not from the 50 people who bought at the top and lost everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Career advice:&lt;/strong&gt; "I never went to college and I'm a millionaire" comes from the 0.1% who succeeded without it. Meanwhile, the 99.9% are underemployed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationship advice:&lt;/strong&gt; "Trust your gut" comes from the person whose gut worked out. Meanwhile, people who trusted their gut and ended up in bad relationships don't write books.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Your Brain Falls For This
&lt;/h2&gt;

&lt;p&gt;Your brain is built to learn from what you can see. If you see successful people, you notice their decisions. If you don't see unsuccessful people (they're not on podcasts, writing books, or doing interviews), you don't notice their decisions.&lt;/p&gt;

&lt;p&gt;So you learn the pattern: successful people took risks, ignored advice, trusted their gut.&lt;/p&gt;

&lt;p&gt;What you don't learn: unsuccessful people took the same risks, ignored the same advice, and trusted the same gut. They just didn't survive to tell the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Escape Survivorship Bias
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Ask about the base rate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What percentage of people who did this succeeded?"&lt;/li&gt;
&lt;li&gt;"What percentage failed?"&lt;/li&gt;
&lt;li&gt;"What percentage of failures look exactly like the successes, but just didn't make it?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answers will usually shock you. The person who succeeded against 100:1 odds is rarer than their story suggests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look for failure stories:&lt;/strong&gt; If you can only find success stories, you're looking at survivors.&lt;/p&gt;

&lt;p&gt;Real learning comes from people who did the same thing and failed, then explain why. But these people rarely exist because failure is less glamorous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reverse the ratio:&lt;/strong&gt; If you see 10 success stories and 0 failure stories, you should assume the real ratio is closer to 1 success and 10 failures. Then ask: "Is that a bet I should take?"&lt;/p&gt;

&lt;p&gt;I built an interactive psychology quiz called Mind Traps (&lt;a href="https://ordinarymantrying.com/tools/mind-traps.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/mind-traps.html&lt;/a&gt;) that forces you to recognize these patterns in real scenarios. When you see how often "confident" decisions are actually blind spots, you start asking better questions about success stories.&lt;/p&gt;

&lt;p&gt;The next time you hear a success story, ask: "How many people did the same thing and disappeared?"&lt;/p&gt;

</description>
      <category>successstories</category>
    </item>
    <item>
      <title>The 40-Hour Rule: Why Experts Are Always Confidently Wrong</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 03 Jul 2026 15:21:47 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/the-40-hour-rule-why-experts-are-always-confidently-wrong-4p1p</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/the-40-hour-rule-why-experts-are-always-confidently-wrong-4p1p</guid>
      <description>&lt;p&gt;You've noticed this pattern: the beginner is cautious. The intermediate person is confident. The expert is cautious again.&lt;br&gt;
There's actual psychology behind this, and it explains why your boss makes worse decisions than your coworker who just started.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Dunning-Kruger Mechanism
&lt;/h2&gt;

&lt;p&gt;Most people understand Dunning-Kruger as "incompetent people are overconfident." That's true but shallow.&lt;/p&gt;

&lt;p&gt;The deeper truth is: &lt;strong&gt;Your confidence peaks at exactly 40 hours of knowledge.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At 10 hours, you don't know enough to be confident. You don't know what you don't know.&lt;/li&gt;
&lt;li&gt;At 40 hours, you know enough to generate ideas and feel right about them. But you haven't encountered all the ways those ideas can fail. So you're confidently wrong.&lt;/li&gt;
&lt;li&gt;At 200 hours, you've seen enough edge cases and failures that you become cautious again. You know exactly how much you don't know.&lt;/li&gt;
&lt;li&gt;At 10,000 hours, you might become confident again — but it's a different kind of confidence. It's calibrated to real risk.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Ruins Decision-Making
&lt;/h2&gt;

&lt;p&gt;In organizations, the 40-hour people make the decisions.&lt;/p&gt;

&lt;p&gt;They're confident enough to push ideas forward. They're not experienced enough to see all the problems. So they push forward with something that fails in predictable ways that experts would have caught.&lt;/p&gt;

&lt;p&gt;I've seen this in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hiring:&lt;/strong&gt; The hiring manager with 3 years of experience is confident in their instincts. The experienced recruiter is skeptical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; The PM with 18 months of context is confident about what customers want. The designer who's been doing this for 10 years keeps asking clarifying questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investing:&lt;/strong&gt; The person who made money on 2-3 trades is confidently buying. The investor with 20 years of cycles is cautious.&lt;/p&gt;

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

&lt;p&gt;It's not "get more experience." (That happens naturally; that's not the fix.)&lt;/p&gt;

&lt;p&gt;The real antidote is: &lt;strong&gt;Seek out the 200-hour people's objections before you commit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not their advice. Their objections.&lt;/p&gt;

&lt;p&gt;An expert doesn't usually tell you "do this." But they can tell you "I'm concerned about X" — and that concern is worth 1,000 confident ideas.&lt;/p&gt;

&lt;p&gt;The second antidote is harder: &lt;strong&gt;Acknowledge that your confidence is proportional to your ignorance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you feel most right, you're most likely wrong in a way you haven't discovered yet.&lt;/p&gt;

&lt;p&gt;I built a psychology quiz (Mind Traps at &lt;a href="https://ordinarymantrying.com/tools/mind-traps.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/mind-traps.html&lt;/a&gt;) with 40 psychological laws and real scenarios. The pattern that emerged: people are most confident about the biases that trip them up most. The people who get Dunning-Kruger wrong are the ones most convinced they don't fall for it.&lt;/p&gt;

&lt;p&gt;Confidence isn't a sign you're right. It's often a sign you haven't been wrong yet.&lt;/p&gt;

</description>
      <category>psychology</category>
    </item>
    <item>
      <title>The Sunk Cost Trap: Why Quitting Feels Wrong When It's Right</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 03 Jul 2026 15:18:13 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/the-sunk-cost-trap-why-quitting-feels-wrong-when-its-right-247c</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/the-sunk-cost-trap-why-quitting-feels-wrong-when-its-right-247c</guid>
      <description>&lt;h1&gt;
  
  
  The Sunk Cost Trap: Why Quitting Feels Wrong When It's Right
&lt;/h1&gt;

&lt;p&gt;You have $50,000 in a business that's clearly failing. Every month you lose money. Every expert says shut it down.&lt;/p&gt;

&lt;p&gt;But you've already spent $200,000.&lt;/p&gt;

&lt;p&gt;So you put in another $50,000.&lt;/p&gt;

&lt;p&gt;You're not stupid. You're not even particularly biased. You're just experiencing a perfectly normal human pattern &lt;br&gt;
And it's bankrupting people every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sunk Cost Actually Is
&lt;/h2&gt;

&lt;p&gt;It's not "wasting money on something you've already paid for" (like watching a bad movie because you bought the ticket).&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;using past investment as evidence that you should continue investing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The $200,000 is gone. Fully gone. Whether you invest another $50,000 has nothing to do with what you've already spent.&lt;/p&gt;

&lt;p&gt;Logically, you know this. But your brain doesn't work on logic. Your brain sees:&lt;/p&gt;

&lt;p&gt;"You've already invested this much. If you quit now, all that investment meant nothing."&lt;/p&gt;

&lt;p&gt;So it feels safer to continue. At least then the $200,000 "meant something."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Your Brain Does This
&lt;/h2&gt;

&lt;p&gt;Your brain is trying to protect your self-image.&lt;/p&gt;

&lt;p&gt;If you quit after $200,000, you're the person who lost $200,000 on a bad decision. That's psychologically painful.&lt;/p&gt;

&lt;p&gt;If you invest another $50,000 and it works out, you're the person who had the guts to stick with it. That's a good story.&lt;/p&gt;

&lt;p&gt;If you invest another $50,000 and it fails? Well, at least you tried everything. That's also a story you can live with.&lt;/p&gt;

&lt;p&gt;The one story your brain won't allow: "I should have quit at $100,000." Because that means you were wrong, and you knew it, and you did it anyway.&lt;/p&gt;

&lt;p&gt;So the brain keeps investing.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Spot It In Yourself
&lt;/h2&gt;

&lt;p&gt;Sunk cost appears whenever you hear yourself say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I've already spent this much..."&lt;/li&gt;
&lt;li&gt;"I'd be throwing away..."&lt;/li&gt;
&lt;li&gt;"After all the time I've invested..."&lt;/li&gt;
&lt;li&gt;"I can't give up now..."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice: all of these are about past investment. None of them are about future outcomes.&lt;/p&gt;

&lt;p&gt;The right question is never "how much have I already spent?" It's always "what happens if I stop vs. if I continue?"&lt;/p&gt;

&lt;h2&gt;
  
  
  The $200K Question
&lt;/h2&gt;

&lt;p&gt;If you could go back to today with zero investment — would you invest another $50,000 in this business?&lt;/p&gt;

&lt;p&gt;If the answer is no, you have your decision. The $200,000 is already gone. The question is just whether you're going to add another $50,000 to it.&lt;/p&gt;

&lt;p&gt;The hard part: saying yes to that question means admitting you should have quit earlier. Your brain really doesn't want to do this.&lt;/p&gt;

&lt;p&gt;But the alternative is throwing good money after bad.&lt;/p&gt;

&lt;p&gt;I've watched this pattern play out across hundreds of decisions — relationships, projects, investments, even which gym to stay at. The people who escape the sunk cost trap aren't smarter or more disciplined. They're just willing to accept that sometimes the sunk cost is the price you pay to learn.&lt;/p&gt;

&lt;p&gt;I built a free interactive psychology quiz called Mind Traps (&lt;a href="https://ordinarymantrying.com/tools/mind-traps.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/mind-traps.html&lt;/a&gt;) that tests these patterns with real scenarios. If you score low on sunk cost recognition, you've found where your own thinking is vulnerable.&lt;/p&gt;

&lt;p&gt;The real cost of quitting at $200,000 isn't the money. It's the feeling that you wasted it. But the money was already wasted. The question is just whether you're willing to feel that yet.&lt;/p&gt;

</description>
      <category>psychology</category>
      <category>decisionmaking</category>
      <category>cognitivebiases</category>
    </item>
    <item>
      <title>I Built 25 Free Historical Life Simulators. Here's What the Process Taught Me About Decision-Making.</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Wed, 01 Jul 2026 05:35:35 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-25-free-historical-life-simulators-heres-what-the-process-taught-me-about-50e8</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-25-free-historical-life-simulators-heres-what-the-process-taught-me-about-50e8</guid>
      <description>&lt;p&gt;I started building these because I had a question I couldn't answer by reading biographies: what would I have actually done?&lt;/p&gt;

&lt;p&gt;I'd read that Darwin waited 20 years to publish the theory of natural selection. The biography explains why. But reading that explanation after the fact — knowing how it ended — is completely different from facing the decision in 1838 when you're 29 with no idea which way it goes.&lt;/p&gt;

&lt;p&gt;Biographies give you understanding. They don't give you the feeling of the choice.&lt;/p&gt;

&lt;p&gt;That's the gap the simulators are trying to close.&lt;/p&gt;

&lt;p&gt;The Format: Why It Has to Be Commit-First&lt;/p&gt;

&lt;p&gt;Each simulator presents 8 decision points from a historical figure's life. You read what's happening, then commit to one of three options — before seeing what the person actually did. The historical reveal comes after your choice, not before.&lt;/p&gt;

&lt;p&gt;The order matters. If you see the reveal first, you're rationalizing, not deciding. The point is to catch yourself choosing with incomplete information — which is what every one of these figures was doing. Einstein didn't know the atomic bomb would kill 200,000 people when he signed the letter to Roosevelt. He knew some things, guessed at others, and made a call.&lt;/p&gt;

&lt;p&gt;The simulator puts you in the same epistemic position, compressed to 30 seconds.&lt;/p&gt;

&lt;p&gt;Why 8 decisions? Seven feels short. Ten feels like homework. Eight lets you cover the arc of a life — early choices, midlife crisis, final decisions — without losing the reader.&lt;/p&gt;

&lt;p&gt;What I Built It With&lt;/p&gt;

&lt;p&gt;Pure HTML/CSS/JavaScript. No framework, no build step, no database. Each simulator is a single self-contained HTML file. The whole thing runs in the browser with zero server calls.&lt;/p&gt;

&lt;p&gt;function choose(btn, num, correct) {&lt;br&gt;
  const block = btn.closest('.decision-block');&lt;br&gt;
  const opts = block.querySelectorAll('.dopt');&lt;br&gt;
  opts.forEach(o =&amp;gt; o.classList.add('disabled'));&lt;br&gt;
  if (correct) {&lt;br&gt;
    btn.classList.add('right');&lt;br&gt;
    score++;&lt;br&gt;
  } else {&lt;br&gt;
    btn.classList.add('wrong');&lt;br&gt;
    // highlight the right answer&lt;br&gt;
    opts.forEach(o =&amp;gt; {&lt;br&gt;
      if (o.getAttribute('onclick')?.includes(',true)'))&lt;br&gt;
        o.classList.add('right');&lt;br&gt;
    });&lt;br&gt;
  }&lt;br&gt;
  document.getElementById('r' + num).classList.add('show');&lt;br&gt;
  answered++;&lt;br&gt;
  updateProgress(answered / TOTAL * 100);&lt;br&gt;
  if (answered === TOTAL) setTimeout(showEnding, 800);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;That's the core of every simulator. Choose → reveal → score → progress bar update. The simplicity is intentional: the tool should disappear and leave the historical content visible.&lt;/p&gt;

&lt;p&gt;What Actually Surprised Players&lt;/p&gt;

&lt;p&gt;I expected the most popular simulators to be the most famous people: Einstein, Darwin, Newton.&lt;/p&gt;

&lt;p&gt;The most divisive turns out to be Newton — specifically the alchemy. People know Newton as the rational scientist who described gravity. Almost nobody knows he spent 30 years on alchemy, wrote over a million words on it, and may have damaged his own mind with mercury from alchemical experiments.&lt;/p&gt;

&lt;p&gt;When players reach the alchemy decision, the split is about 50/50: half say "obviously stop, this is embarrassing for someone of his reputation." The other half say: "if Newton thought it was worth his time, who am I to judge?"&lt;/p&gt;

&lt;p&gt;That split reveals something about how we think about rationality and prestige that the biography alone doesn't surface.&lt;/p&gt;

&lt;p&gt;The other unexpectedly divisive one: Kafka's burn instruction. Did he genuinely want everything destroyed, or did giving the manuscripts to a man who had explicitly told him he wouldn't burn them constitute a kind of permission? Most players want a clear answer. Kafka didn't give one. That discomfort — the refusal to resolve — is the most Kafkaesque thing about the simulator.&lt;/p&gt;

&lt;p&gt;Why I Added the Psychology &amp;amp; Literature Series&lt;/p&gt;

&lt;p&gt;The first 20 simulators covered scientists, inventors, and entrepreneurs. Their decisions had measurable outcomes: you can see exactly what happened when Tesla tore up the Westinghouse royalties, or when Disney went ahead with Disneyland against everyone's advice.&lt;/p&gt;

&lt;p&gt;The new series — Freud, Nietzsche, Kafka, Dostoevsky, Frida Kahlo — goes somewhere different. These people made decisions whose consequences were primarily interior: what to think, what to abandon, what to paint, what to write. "The right choice" is harder to identify when the outcome is a philosophy rather than a patent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nietzsche resigned a tenured professorship at 34 to write books that sold fewer than 100 copies. Right call?&lt;/li&gt;
&lt;li&gt;Kafka asked his best friend to burn The Trial and The Castle. His friend Max Brod didn't. Who was right?&lt;/li&gt;
&lt;li&gt;Dostoevsky stood before a firing squad at 28, survived, went to Siberia, developed a gambling addiction, and dictated Crime and Punishment in 26 days under crushing debt. Would you have made it through?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Numbers&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;25 simulators completed&lt;/li&gt;
&lt;li&gt;200 decision reveals across the full set&lt;/li&gt;
&lt;li&gt;~1 day per simulator to research and build&lt;/li&gt;
&lt;li&gt;0 dollars spent on tools or hosting (Hostinger shared hosting, ~$20/year)&lt;/li&gt;
&lt;li&gt;0 login required to play any of them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Play Them — All Free&lt;/p&gt;

&lt;p&gt;The full collection is at &lt;a href="https://ordinarymantrying.com/tools/simulators.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/why-i-built-25-life-simulators-building-in-public/&lt;/a&gt;. No login, no paywall, works on mobile.&lt;/p&gt;

&lt;p&gt;If you're picking a starting point: Darwin (the 20-year delay), Newton (the alchemy), Kafka (the burn instruction), or Dostoevsky (the firing squad). These four produce the most unexpected answers about the gap between how historical decisions should have been made and how they actually were.&lt;/p&gt;




&lt;p&gt;Built by one ordinary person trying to understand how extraordinary people made their choices — and whether, given the same information, we'd do any differently.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Hit Claude's Token Limit Mid-Project. The Alternatives Were Worse.</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Tue, 30 Jun 2026 15:46:32 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-hit-claudes-token-limit-mid-project-the-alternatives-were-worse-1lmp</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-hit-claudes-token-limit-mid-project-the-alternatives-were-worse-1lmp</guid>
      <description>&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%2F9krm6p06bm6tcuzp7tuo.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%2F9krm6p06bm6tcuzp7tuo.png" alt=" " width="800" height="665"&gt;&lt;/a&gt;&lt;br&gt;
It happened on a Friday night.&lt;/p&gt;

&lt;p&gt;I was in the middle of building a new tool — a social icebreaker game called the Loneliness Test. I had a working prototype but it felt off. The invite-copy feature wasn't right. The animations were janky. I kept asking Claude to iterate.&lt;/p&gt;

&lt;p&gt;Then this appeared in my terminal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Current week (all models): 100% used.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a crash. Not an error. Just a soft wall. Resets Tuesday night.&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%2F31bpei1gdvjnpplgdf2e.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%2F31bpei1gdvjnpplgdf2e.png" alt="Claude Code usage dashboard showing $36.43 spent and current week 100% used" width="800" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard told the full story. &lt;strong&gt;$36.43&lt;/strong&gt; burned in a single 4-hour session. 83% came from subagent-heavy sessions — background workers scanning files, iterating on code, making changes across the project. By Friday night, the week's quota was gone.&lt;/p&gt;

&lt;p&gt;I had three days until the reset. The tool was half-finished. I refused to wait.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Geeky Workaround
&lt;/h2&gt;

&lt;p&gt;I opened Gemini and explained my situation. The advice sounded clever: bypass Claude's limits entirely by using &lt;strong&gt;Aider&lt;/strong&gt; — an open-source terminal coding assistant — wired to &lt;strong&gt;DeepSeek's API&lt;/strong&gt;, which was supposed to offer "95% of Claude's coding ability at one-tenth the price."&lt;/p&gt;

&lt;p&gt;Within twenty minutes I had it running. I typed a test message: &lt;em&gt;"Hello."&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tokens: 10k sent, 69 received. Cost: $0.0028 session.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aider had silently read my entire repository — over 1,000 files — compressed the architecture into a Repo-map, and sent it all to DeepSeek before I'd said anything useful. Nearly three cents to say hello. Fine. Let's get to work.&lt;/p&gt;

&lt;p&gt;I gave it a simple task: clean up the invite-copy feature in my HTML file. Fix some text. Update a few strings.&lt;/p&gt;

&lt;p&gt;What followed was forty minutes I will not get back.&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%2Frwuc1y9gyjdnxzz9v32m.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%2Frwuc1y9gyjdnxzz9v32m.png" alt="Aider terminal showing DeepSeek stuck in a SEARCH/REPLACE loop, asking Try this Y/n repeatedly" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DeepSeek couldn't find an exact text match because of a whitespace difference between what it expected and what was actually in the file. Instead of adjusting its approach, it panicked. It kept modifying its search slightly, failing, then asking:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Try this? (Y/n)."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Y.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Try this? (Y/n)."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Y.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Try this? (Y/n)."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I pressed Y seventeen times. The file was completely untouched. I hit &lt;code&gt;Ctrl+C&lt;/code&gt; and checked my DeepSeek billing.&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%2Fflrxpf4su2yei6vjp4fe.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%2Fflrxpf4su2yei6vjp4fe.png" alt="DeepSeek billing showing ¥0.49 spent on June 27 with zero results" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¥0.49.&lt;/strong&gt; Seven US cents. Forty minutes of watching a machine argue with HTML whitespace, achieving nothing. The total DeepSeek bill for all of June was ¥12.27 — about $1.70. Cheap. But I had nothing to show for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Gemini Marathon: 30+ Versions in One Weekend
&lt;/h2&gt;

&lt;p&gt;I gave up on the terminal agent entirely and switched to Gemini's chat interface.&lt;/p&gt;

&lt;p&gt;This actually worked — Gemini could hold context, understand what I was describing, and generate complete HTML files from scratch. The problem was the iteration cycle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Describe what's wrong → Gemini generates new file → download it → open in browser → test → something's still off → repeat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No version control. No memory between sessions. Just me, a growing folder of identically-named HTML files, and a browser history I'd rather forget.&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%2F2h8vmw2krbx98hkqiflr.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%2F2h8vmw2krbx98hkqiflr.png" alt="Browser download history showing 8 gemini-code HTML files downloaded within 22 minutes" width="319" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That screenshot is from one twenty-two-minute window. There were more before it and more after it. By the time I was satisfied, I had gone through &lt;strong&gt;more than thirty versions&lt;/strong&gt; of the same file.&lt;/p&gt;

&lt;p&gt;I also pulled in ChatGPT at one point — not to write code, but to review what Gemini had produced. Running one AI's output through a second AI for critique turned out to be genuinely useful. ChatGPT spotted a logic bug I had missed. Gemini fixed it in the next version.&lt;/p&gt;

&lt;p&gt;It took a full weekend.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Came Out of It
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://ordinarymantrying.com/tools/loneliness-game.html" rel="noopener noreferrer"&gt;Loneliness Test&lt;/a&gt; has thirteen levels of solo activities — from shopping alone (Level 1) to going to surgery alone (Level 13). At each level you answer honestly: &lt;em&gt;Totally fine&lt;/em&gt; or &lt;em&gt;I can't do this.&lt;/em&gt; When you stop, it generates a personalized message you can send to a friend to invite them out.&lt;/p&gt;

&lt;p&gt;After thirty-plus iterations across three different AIs, the final version is genuinely good.&lt;/p&gt;

&lt;p&gt;I could not have built it without AI. It just wasn't the AI I expected to use.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Irony I Noticed at 1am
&lt;/h2&gt;

&lt;p&gt;Somewhere around the fifteenth Gemini download, I noticed something.&lt;/p&gt;

&lt;p&gt;I was building a tool about loneliness — about the discomfort of doing things alone — while experiencing the loneliest coding session I'd had in months.&lt;/p&gt;

&lt;p&gt;Claude is the AI I've worked with long enough to have a shorthand with. I describe something half-finished, it understands what I mean. I say "the animation feels off," it knows which animation. There's a fluency that builds up over time, over a project, over shared context.&lt;/p&gt;

&lt;p&gt;Gemini didn't have that context. DeepSeek didn't understand my file structure. ChatGPT hadn't seen the project before. I had to re-explain everything from scratch every thirty minutes.&lt;/p&gt;

&lt;p&gt;Losing access to your main AI tool doesn't feel like losing software. It feels like your experienced colleague went home for the weekend and left you with people who need the entire project explained from the beginning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DeepSeek is great for reasoning about code. It's unreliable for autonomously executing changes in a real project.&lt;/strong&gt; The raw intelligence is impressive. The tool-calling — navigating a file system, running commands, overwriting code without breaking things — is not there yet. When it gets stuck, it doesn't recover gracefully. It asks you for permission to fail in a slightly different way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini's chat interface works, but iterating without persistent memory is exhausting.&lt;/strong&gt; You become the memory layer. If your project has any real complexity, you spend as much time re-explaining context as you do describing what to fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The $20/month Claude subscription is genuinely one of the best value propositions in AI right now&lt;/strong&gt; — not because it's cheap, but because the moment you lose it, you understand what you were actually paying for. The continuity. The context. The ability to say "you know that file we were working on" and have that mean something.&lt;/p&gt;

&lt;p&gt;I am not sponsored by Anthropic. I'm just someone who found out the hard way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try the Tool
&lt;/h2&gt;

&lt;p&gt;If you want to see what thirty-plus iterations of AI output and one weekend of token anxiety produced: &lt;strong&gt;&lt;a href="https://ordinarymantrying.com/tools/loneliness-game.html" rel="noopener noreferrer"&gt;The Loneliness Test&lt;/a&gt;&lt;/strong&gt; — free, no login, works on mobile.&lt;/p&gt;

&lt;p&gt;Play through the thirteen levels. See where you stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What level did you reach?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a free offline Chinese pinyin annotator in a single HTML file</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Tue, 23 Jun 2026 01:33:06 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-offline-chinese-pinyin-annotator-in-a-single-html-file-4kdo</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-offline-chinese-pinyin-annotator-in-a-single-html-file-4kdo</guid>
      <description>&lt;p&gt;I live in China and kept running into the same problem: I'd see Chinese text&lt;br&gt;
I couldn't fully read and needed to quickly see the pronunciation (pinyin)&lt;br&gt;
above each character.&lt;/p&gt;

&lt;p&gt;Every tool I found was either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paywalled after 5 uses&lt;/li&gt;
&lt;li&gt;Required creating an account&lt;/li&gt;
&lt;li&gt;Sent your text to a server&lt;/li&gt;
&lt;li&gt;Had terrible UI from 2009&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built one myself. Single HTML file. Fully offline after first load.&lt;br&gt;
Nothing sent anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ordinarymantrying.com/tools/pinyin-annotator.html" rel="noopener noreferrer"&gt;→ Try it live&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/daligao/pinyin-annotator" rel="noopener noreferrer"&gt;→ GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;
&lt;h3&gt;
  
  
  The dictionary
&lt;/h3&gt;

&lt;p&gt;The core is a ~2,500 character lookup table embedded directly in the JS:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`的:de:0:1|一:yī:1:1|是:shì:4:1|了:le:0:1|我:wǒ:3:1...`&lt;/span&gt;
&lt;span class="c1"&gt;// format: character : pinyin : tone(1-4, 0=neutral) : hsk_level(1-6)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I store it as a pipe-delimited string and parse it once on load.&lt;br&gt;
Covers ~97% of common written Chinese. Characters outside the dictionary&lt;br&gt;
show a "?" — there aren't many in normal text.&lt;/p&gt;
&lt;h3&gt;
  
  
  Ruby annotations
&lt;/h3&gt;

&lt;p&gt;HTML has a built-in &lt;code&gt;&amp;lt;ruby&amp;gt;&lt;/code&gt; tag for exactly this:&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;ruby&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"char"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;中&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;rt&amp;gt;&lt;/span&gt;zhōng&lt;span class="nt"&gt;&amp;lt;/rt&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ruby&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;rt&lt;/code&gt; element renders above the base character. No canvas tricks,&lt;br&gt;
no absolute positioning — just semantic HTML doing what it was designed for.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tone colors
&lt;/h3&gt;

&lt;p&gt;Each pinyin string carries its tone in the data, and CSS classes handle&lt;br&gt;
the rest:&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="nc"&gt;.tone-on&lt;/span&gt; &lt;span class="nt"&gt;rt&lt;/span&gt;&lt;span class="nc"&gt;.t1&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="m"&gt;#ff4d4d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* 1st tone — red */&lt;/span&gt;
&lt;span class="nc"&gt;.tone-on&lt;/span&gt; &lt;span class="nt"&gt;rt&lt;/span&gt;&lt;span class="nc"&gt;.t2&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="m"&gt;#ff9900&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* 2nd tone — orange */&lt;/span&gt;
&lt;span class="nc"&gt;.tone-on&lt;/span&gt; &lt;span class="nt"&gt;rt&lt;/span&gt;&lt;span class="nc"&gt;.t3&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="m"&gt;#22c55e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* 3rd tone — green */&lt;/span&gt;
&lt;span class="nc"&gt;.tone-on&lt;/span&gt; &lt;span class="nt"&gt;rt&lt;/span&gt;&lt;span class="nc"&gt;.t4&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="m"&gt;#a78bfa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* 4th tone — purple */&lt;/span&gt;
&lt;span class="nc"&gt;.tone-on&lt;/span&gt; &lt;span class="nt"&gt;rt&lt;/span&gt;&lt;span class="nc"&gt;.t0&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="m"&gt;#8899aa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;/* neutral — grey */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Toggle the class on the container and all tones update instantly&lt;br&gt;
without re-rendering anything.&lt;/p&gt;
&lt;h3&gt;
  
  
  HSK level highlight
&lt;/h3&gt;

&lt;p&gt;Same pattern — a CSS class on the container, data attributes on&lt;br&gt;
each character span:&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="nc"&gt;.hsk-on&lt;/span&gt; &lt;span class="nc"&gt;.char-span.hsk1&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="m"&gt;#7ee8bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.hsk-on&lt;/span&gt; &lt;span class="nc"&gt;.char-span.hsk2&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="m"&gt;#60d4b0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/* ... */&lt;/span&gt;
&lt;span class="nc"&gt;.hsk-on&lt;/span&gt; &lt;span class="nc"&gt;.char-span.unk&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="m"&gt;#6a7a9a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c"&gt;/* unknown */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets learners instantly see which characters are beginner vs.&lt;br&gt;
advanced vs. completely outside the HSK vocabulary list.&lt;/p&gt;


&lt;h2&gt;
  
  
  The offline constraint
&lt;/h2&gt;

&lt;p&gt;I wanted this to work with zero network after the first load — useful&lt;br&gt;
if you're on a plane with a downloaded article, or in China where&lt;br&gt;
connectivity to foreign tools can be unreliable.&lt;/p&gt;

&lt;p&gt;Everything is embedded: the dictionary, the CSS, the JS. The HTML file&lt;br&gt;
is ~180KB total. Download once, use forever.&lt;/p&gt;


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

&lt;p&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;ruby&amp;gt;&lt;/code&gt; line-height is annoying.&lt;/strong&gt; Getting the ruby annotations to&lt;br&gt;
not blow up the line spacing required some CSS gymnastics:&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;ruby&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column-reverse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;Polyphonic characters are a real problem.&lt;/strong&gt; Many Chinese characters&lt;br&gt;
have multiple pronunciations depending on context (e.g., 行 = xíng or&lt;br&gt;
háng). I used the most common reading for each. A proper solution would&lt;br&gt;
need NLP context analysis — out of scope for a single HTML file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2,500 characters covers more than you'd think.&lt;/strong&gt; The most frequent&lt;br&gt;
2,500 Chinese characters account for ~97% of text in newspapers and&lt;br&gt;
books. The long tail exists but it's genuinely rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  Also built
&lt;/h2&gt;

&lt;p&gt;This is part of a small suite of offline Chinese learning tools I've&lt;br&gt;
been building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;a href="https://ordinarymantrying.com/tools/chinese-reading-lab.html" rel="noopener noreferrer"&gt;Chinese Reading Lab&lt;/a&gt; — 10 historical stories in Chinese (HSK4–6) with comprehension quiz&lt;/li&gt;
&lt;li&gt;🐉 &lt;a href="https://ordinarymantrying.com/tools/chengyu-stories.html" rel="noopener noreferrer"&gt;Chengyu Stories&lt;/a&gt; — 20 classic idioms with origin stories + scenario quiz&lt;/li&gt;
&lt;li&gt;🃏 &lt;a href="https://ordinarymantrying.com/tools/mandarin-flashcards.html" rel="noopener noreferrer"&gt;Mandarin Flashcards&lt;/a&gt; — HSK1–3 spaced repetition&lt;/li&gt;
&lt;li&gt;✍️ &lt;a href="https://ordinarymantrying.com/tools/chinese-writing-toolkit.html" rel="noopener noreferrer"&gt;Chinese Writing Toolkit&lt;/a&gt; — model essays for 11 HSK writing types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All single HTML files, all free: &lt;a href="https://daligao.github.io/learn-chinese-free/" rel="noopener noreferrer"&gt;daligao.github.io/learn-chinese-free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source for the pinyin annotator: &lt;a href="https://github.com/daligao/pinyin-annotator" rel="noopener noreferrer"&gt;github.com/daligao/pinyin-annotator&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Questions welcome — especially if you know a clean way to handle&lt;br&gt;
polyphonic characters without a server.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Pitted 3 Chinese AI Models Against 3 American Ones on 14 World Cup Matches</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sun, 21 Jun 2026 05:39:36 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-pitted-3-chinese-ai-models-against-3-american-ones-on-14-world-cup-matches-363c</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-pitted-3-chinese-ai-models-against-3-american-ones-on-14-world-cup-matches-363c</guid>
      <description>&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%2Fdy1yc2h4gyurf01ju1s6.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%2Fdy1yc2h4gyurf01ju1s6.png" alt=" " width="800" height="573"&gt;&lt;/a&gt;&lt;br&gt;
I had a weird idea during the World Cup: what if I asked every major AI — both Chinese and American — to predict the same 14 matches? Then bought real tickets based on the results?&lt;/p&gt;

&lt;p&gt;So I ran Kimi, Doubao, and Qianwen (China) against ChatGPT, Gemini, and Claude (US) on 14 real World Cup fixtures.&lt;/p&gt;

&lt;p&gt;The result that surprised me&lt;/p&gt;

&lt;p&gt;They agreed on 12 out of 14 matches.&lt;/p&gt;

&lt;p&gt;Six AI models from two completely different ecosystems, trained on different data in different languages — and they converged on the same prediction 86% of the time.&lt;/p&gt;

&lt;p&gt;The one match where they split&lt;/p&gt;

&lt;p&gt;Norway vs Senegal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇨🇳 All 3 Chinese AI: Norway wins&lt;/li&gt;
&lt;li&gt;🇺🇸 All 3 American AI: Draw&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not a single crossover. Every Chinese model picked one result, every American model picked another — like a clean cultural fault line running through the data.&lt;/p&gt;

&lt;p&gt;I have no idea if it means anything. But I bought two real lottery tickets (¥2 each) — one following the Chinese consensus, one following the American consensus.&lt;/p&gt;

&lt;p&gt;Results drop June 24. I'll post the follow-up here.&lt;/p&gt;

&lt;p&gt;Why I did this&lt;/p&gt;

&lt;p&gt;I'm an ordinary guy in China running a public experiment: can AI actually help a regular person build side income? I'm documenting everything — wins, failures, and the weird stuff in between.&lt;/p&gt;

&lt;p&gt;This is one of the weird ones.&lt;/p&gt;




&lt;p&gt;Full breakdown with all 14 predictions: ordinarymantrying.com (&lt;a href="https://ordinarymantrying.com/6-ai-models-predict-world-cup-china-vs-us/" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/6-ai-models-predict-world-cup-china-vs-us/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Part 2 (results + analysis) coming June 24.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>discuss</category>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
