<?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 Bought Another Domain. Then I Accidentally Started Building a Second Internet Business.</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sun, 16 Aug 2026 11:34:59 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-bought-another-domain-then-i-accidentally-started-building-a-second-internet-business-106n</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-bought-another-domain-then-i-accidentally-started-building-a-second-internet-business-106n</guid>
      <description>&lt;p&gt;I wasn't planning to build another website.&lt;/p&gt;

&lt;p&gt;Honestly, I thought I had enough problems already.&lt;/p&gt;

&lt;p&gt;I was already spending most of my spare time building &lt;a href="https://ordinarymantrying.com" rel="noopener noreferrer"&gt;Ordinary Man Trying&lt;/a&gt;, writing about AI, building little tools, testing ideas, watching Google Search Console, wondering why Google wasn't indexing half my pages, and generally doing what a perfectly sensible person in his 40s probably shouldn't be doing after work.&lt;/p&gt;

&lt;p&gt;Then I bought another hosting plan.&lt;/p&gt;

&lt;p&gt;Not because I had a brilliant business idea.&lt;/p&gt;

&lt;p&gt;Because it was cheap.&lt;/p&gt;

&lt;p&gt;That may be the most honest way to explain how &lt;strong&gt;ChineseFortuneTools&lt;/strong&gt; started.&lt;/p&gt;




&lt;h2&gt;
  
  
  The original idea was almost embarrassingly simple
&lt;/h2&gt;

&lt;p&gt;I had been thinking about my hosting costs. I already had websites. The marginal cost of having another site was surprisingly small.&lt;/p&gt;

&lt;p&gt;So I started thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I just build another website?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a startup. Not something requiring investors. Not something that needs a team. Just a small internet experiment.&lt;/p&gt;

&lt;p&gt;Give it a domain. Give it some useful tools. Let AI help me build things. Put it on Google. Wait. See what happens.&lt;/p&gt;

&lt;p&gt;If it fails, I lose some domain and hosting money. If it works, I learn something. And if I keep doing this for years, maybe one of these strange little experiments eventually becomes something real.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what is ChineseFortuneTools?
&lt;/h2&gt;

&lt;p&gt;The first version was fairly obvious.&lt;/p&gt;

&lt;p&gt;Chinese culture. Chinese Zodiac. BaZi. Feng Shui. The Chinese lunar calendar. Lucky dates. Chinese names. Traditional ideas about fortune and destiny.&lt;/p&gt;

&lt;p&gt;The website describes itself as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Chinese Metaphysics · Explained for the West&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not: &lt;em&gt;"Believe everything Chinese fortune telling says."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Here is a traditional Chinese system. Let me explain what it means.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The website itself says: &lt;em&gt;"You don't need to believe it. You just need to understand it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because Chinese culture contains thousands of years of ideas that are interesting even when you don't believe the supernatural part.&lt;/p&gt;




&lt;h2&gt;
  
  
  Then I discovered something much more interesting
&lt;/h2&gt;

&lt;p&gt;While building the site, I started collecting something completely different.&lt;/p&gt;

&lt;p&gt;Chinese sayings. Old expressions. Folk wisdom.&lt;/p&gt;

&lt;p&gt;Things people say when someone is making a terrible decision. Things people say after a marriage argument. Things people say when someone is too impatient.&lt;/p&gt;

&lt;p&gt;And suddenly I realized:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This isn't really fortune telling. It's accumulated human experience.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The strangest part: I want the wisdom to find the person
&lt;/h2&gt;

&lt;p&gt;Instead of: &lt;strong&gt;Chinese proverb → English translation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted: &lt;strong&gt;Real-life problem → Chinese wisdom → possible action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're fighting with your spouse&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;退一步海阔天空&lt;/strong&gt; &lt;em&gt;(Step back, and a wider world opens.)&lt;/em&gt;&lt;br&gt;
→ Maybe don't try to win this argument.&lt;br&gt;
→ Send it to them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your friend is rushing into everything&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;欲速则不达&lt;/strong&gt; &lt;em&gt;(Haste makes waste.)&lt;/em&gt;&lt;br&gt;
→ Slow down before the mistake becomes expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You just failed at something&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;塞翁失马，焉知非福&lt;/strong&gt; &lt;em&gt;(A setback today may become a blessing tomorrow.)&lt;/em&gt;&lt;br&gt;
→ Maybe this isn't the end of the story.&lt;/p&gt;

&lt;p&gt;That's much more interesting to me than a proverb database.&lt;/p&gt;




&lt;h2&gt;
  
  
  And then I made the obvious mistake
&lt;/h2&gt;

&lt;p&gt;I asked AI to help me build it. Of course I did.&lt;/p&gt;

&lt;p&gt;The first versions were technically fine. They worked. They had cards. They had translations. They looked reasonably nice.&lt;/p&gt;

&lt;p&gt;And they were completely wrong.&lt;/p&gt;

&lt;p&gt;They felt like a database. The AI had understood the words. It hadn't understood the &lt;strong&gt;experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's becoming a recurring theme in my experiments with AI. AI is extremely good at producing things that are technically correct. It is much harder to make it understand:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why would a human actually want this?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I kept pushing. Not: &lt;em&gt;"Make this prettier."&lt;/em&gt; But: &lt;em&gt;"Why would somebody send this to another person?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That changed the design.&lt;/p&gt;




&lt;h2&gt;
  
  
  Now I'm trying to make every piece of wisdom visual
&lt;/h2&gt;

&lt;p&gt;Take: &lt;strong&gt;伸手不打笑脸人&lt;/strong&gt; &lt;em&gt;(Even an angry person is reluctant to hit someone who approaches with a smile.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A generic emoji doesn't explain that.&lt;/p&gt;

&lt;p&gt;So I built tiny SVG visual stories — an angry figure, a calm figure approaching, the tension softening. The user should understand the situation &lt;strong&gt;before reading the explanation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of 1,000 images, I built 30 visual metaphors and reuse them intelligently. That's the sort of thing I like about building with AI: sometimes its most useful role is helping me discover a better way to build the product.&lt;/p&gt;




&lt;h2&gt;
  
  
  I have no idea if this will make money
&lt;/h2&gt;

&lt;p&gt;And I want to be honest about that.&lt;/p&gt;

&lt;p&gt;I'm investing: &lt;strong&gt;time + a cheap domain + hosting + AI + curiosity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The downside is limited. The upside is unknown. That's a pretty good experiment.&lt;/p&gt;




&lt;h2&gt;
  
  
  But there is another reason I'm doing this
&lt;/h2&gt;

&lt;p&gt;My son is growing up in a world that looks very different from the one I grew up in.&lt;/p&gt;

&lt;p&gt;I don't want to simply tell him: &lt;em&gt;"Go get a good job."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I want him to see his father actually trying things. Buying a domain. Learning SEO. Using AI. Building products. Watching things fail. Trying again.&lt;/p&gt;

&lt;p&gt;Maybe one of these projects works. Maybe none of them do. But he'll have seen the process.&lt;/p&gt;




&lt;h2&gt;
  
  
  ChineseFortuneTools is now my second experiment
&lt;/h2&gt;

&lt;p&gt;Can ancient Chinese ideas become useful to someone who has never lived in China? Can a proverb become a tool rather than just a translation? Can one sentence actually help somebody handle a difficult day?&lt;/p&gt;

&lt;p&gt;I don't know. That's why I'm building it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's see what happens
&lt;/h2&gt;

&lt;p&gt;I've learned that building websites is a little like planting trees. You don't get to know which one will grow before you plant it.&lt;/p&gt;

&lt;p&gt;So I'm planting another one. This one just happens to contain a few thousand years of Chinese wisdom.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://chinesefortunetools.com/?utm_source=devto" rel="noopener noreferrer"&gt;ChineseFortuneTools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://chinesefortunetools.com/chinese-wisdom/?utm_source=devto" rel="noopener noreferrer"&gt;Chinese Wisdom — one thought at a time&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about AI, building in public, and honest experiments at &lt;a href="https://ordinarymantrying.com" rel="noopener noreferrer"&gt;Ordinary Man Trying&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>ai</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>How to Give AI Better Evidence: Lessons From a Security Investigation That Almost Failed</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 14 Aug 2026 12:34:13 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/how-to-give-ai-better-evidence-lessons-from-a-security-investigation-that-almost-failed-50ke</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/how-to-give-ai-better-evidence-lessons-from-a-security-investigation-that-almost-failed-50ke</guid>
      <description>&lt;p&gt;Category: My AI Experiments&lt;/p&gt;

&lt;p&gt;There's a mental model most people use when working with AI: describe your problem, get a solution.&lt;/p&gt;

&lt;p&gt;It works well enough, until it doesn't. And when it fails, the failure is invisible — because AI doesn't say "I don't have enough to go on." It gives you a confident, well-reasoned, completely wrong answer.&lt;/p&gt;

&lt;p&gt;I learned this the hard way during a website security investigation. The AI and I ran a thorough analysis, reached a clear conclusion, and were wrong. Not because the AI was weak — because I gave it the wrong kind of input. When I changed the input, the same AI found the answer in seconds.&lt;/p&gt;

&lt;p&gt;That gap — between the input that produces a wrong answer and the input that produces a right one — is what I want to talk about.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Investigation That Almost Failed
&lt;/h2&gt;

&lt;p&gt;My website was secretly redirecting visitors to a virus site. The attack was sophisticated: it only targeted specific browsers, fired at most once per device per day using a cookie-based cooldown, and left no trace in any file.&lt;/p&gt;

&lt;p&gt;I asked AI to help investigate. I described the symptoms. We searched through files together — &lt;code&gt;.htaccess&lt;/code&gt;, theme functions, plugin code. Everything looked clean. The AI identified the most suspicious external element in scope: a Chinese analytics script called 51.la. I removed it. The redirect stopped.&lt;/p&gt;

&lt;p&gt;I called it solved.&lt;/p&gt;

&lt;p&gt;Three weeks later, the identical attack appeared on another site I manage. No 51.la anywhere.&lt;/p&gt;

&lt;p&gt;This time, instead of describing the symptoms, I gave the AI something different: the actual rendered HTML of an affected page, fetched using the exact browser User-Agent and IP type that triggered the attack.&lt;/p&gt;

&lt;p&gt;The AI found an 83KB malicious JavaScript payload injected into every page. Inside it: a WeChat browser detector, a link-click hijacker, a cookie-based daily cooldown. The payload was stored in the WordPress database — in plugin configuration data — where no file-level search could ever find it.&lt;/p&gt;

&lt;p&gt;Same AI. Same type of problem. Completely different outcome. The only variable was what I put in front of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Symptoms vs. Evidence: The Core Distinction
&lt;/h2&gt;

&lt;p&gt;When you describe a problem to AI, you're giving it a &lt;em&gt;symptom&lt;/em&gt;. When you give it raw data from the system that's failing, you're giving it &lt;em&gt;evidence&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The difference matters because AI can only reason about what it can observe. Symptoms are your interpretation of what's happening — filtered, compressed, possibly wrong. Evidence is what's actually happening.&lt;/p&gt;

&lt;p&gt;In my investigation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; "My site is redirecting mobile visitors to a bad site, but only sometimes."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidence:&lt;/strong&gt; The full HTML output of an affected page, captured from a device with the right browser, IP, and no prior visit cookie.&lt;/p&gt;

&lt;p&gt;The symptom told the AI: something external is probably causing this. The evidence told the AI: here is the exact code running on the page, and here is the line that's doing it.&lt;/p&gt;

&lt;p&gt;Symptoms invite guessing. Evidence enables diagnosis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Reasons AI Defaults to Guessing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. You constrain the search space without realizing it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I said "check these files," I was implicitly telling the AI: the answer is in these files. It accepted that framing and worked within it. It never questioned whether the real answer might be somewhere else entirely.&lt;/p&gt;

&lt;p&gt;AI follows the scope you define. If your scope is wrong, the analysis is wrong — no matter how rigorous it is within that scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Confident output masks uncertain reasoning.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI doesn't say "I'm guessing here." It generates fluent, well-structured explanations regardless of how much signal it actually has. A diagnosis built on thin evidence sounds exactly like a diagnosis built on solid evidence. You have to build in your own uncertainty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Symptoms often point at the wrong layer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In security problems — and many engineering problems — the place where failure &lt;em&gt;appears&lt;/em&gt; is rarely the place where failure &lt;em&gt;originates&lt;/em&gt;. My site redirected in the browser. The cause was in a database table. Describing what I saw in the browser pointed the AI at the browser layer. The actual problem was three layers deeper.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Framework I Now Use
&lt;/h2&gt;

&lt;p&gt;Before handing a problem to AI, I ask three questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What layer is this problem actually at?&lt;/strong&gt;&lt;br&gt;
Not where I'm observing it — where it originates. A redirect that appears in the browser might originate in JavaScript, in server config, in a database record, or in an external script. Identifying the right layer determines what evidence to collect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Am I giving AI a symptom or evidence?&lt;/strong&gt;&lt;br&gt;
If I'm describing what I observed, that's a symptom. If I'm giving AI raw output from the system — logs, source code, rendered HTML, API responses — that's evidence. Default to evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would this look like from inside the system?&lt;/strong&gt;&lt;br&gt;
Before asking AI to diagnose, I try to observe the problem from the perspective of the thing that's failing. In the security case: what does the page HTML look like to an affected visitor? That question led me to the right evidence. "What do my files look like?" led me to the wrong one.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Applies Far Beyond Security
&lt;/h2&gt;

&lt;p&gt;The same principle shows up everywhere AI-assisted work breaks down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging code:&lt;/strong&gt; Giving AI an error message is a symptom. Giving it the full stack trace, the relevant function, and the actual input that triggered the error is evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analyzing data:&lt;/strong&gt; Describing a trend you noticed is a symptom. Giving AI the raw dataset — or at minimum a representative sample — is evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting writing feedback:&lt;/strong&gt; Saying "my intro feels weak" is a symptom. Pasting the actual intro and asking AI to identify specifically what's causing the weakness is evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medical analogies (for the metaphorically inclined):&lt;/strong&gt; Telling a doctor "I feel tired" is a symptom. Blood test results are evidence. The doctor can work with either, but only one leads to a diagnosis rather than a guess.&lt;/p&gt;

&lt;p&gt;In each case, the question is the same: are you describing what you observe, or are you showing AI what's actually there?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hidden Cost of Wrong Answers
&lt;/h2&gt;

&lt;p&gt;One more thing worth naming: confident wrong answers have a compounding cost.&lt;/p&gt;

&lt;p&gt;When I concluded the attack was caused by 51.la, I stopped looking. That conclusion felt solid — we'd done a thorough investigation, identified a suspicious element, removed it, and the problem appeared to stop. The investigation felt complete.&lt;/p&gt;

&lt;p&gt;The cost of that wrong answer wasn't just that I misidentified the cause. It was that I stopped before finding the real one. A confident wrong answer doesn't just fail to help — it actively closes off further investigation.&lt;/p&gt;

&lt;p&gt;This is why the quality of AI input matters even when the output seems correct. If you gave AI a symptom and it produced a plausible answer, you don't know whether that answer is based on real signal or a reasonable-sounding guess. The answer might be right. It might be confidently wrong. You can't tell from the output alone.&lt;/p&gt;

&lt;p&gt;The only way to trust the answer is to trust the input.&lt;/p&gt;




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

&lt;p&gt;I now treat AI-assisted investigation as a two-step process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Collect evidence first, before involving AI.&lt;/strong&gt;&lt;br&gt;
Fetch the actual output. Capture the real log. Get the raw data from the layer where the problem originates. Do this before describing anything to AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Give AI the evidence, not the story.&lt;/strong&gt;&lt;br&gt;
Instead of "my site is redirecting," I paste the actual rendered HTML. Instead of "the function is slow," I paste the profiler output. Let AI read primary sources, not my summary of them.&lt;/p&gt;

&lt;p&gt;The AI's reasoning ability isn't the bottleneck. The evidence pipeline is.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Implication
&lt;/h2&gt;

&lt;p&gt;Thinking about AI this way puts more responsibility on the person using it, not less.&lt;/p&gt;

&lt;p&gt;Collecting the right evidence requires understanding your system well enough to know where to look. Asking the right question requires knowing enough about the problem to frame it correctly. These are skills. AI doesn't replace them — it amplifies whatever you bring to the table.&lt;/p&gt;

&lt;p&gt;If you bring symptoms, AI amplifies your guesses.&lt;br&gt;
If you bring evidence, AI amplifies your diagnosis.&lt;/p&gt;

&lt;p&gt;The investigation that almost failed taught me this more clearly than any tutorial could. The AI was ready to find the answer from the beginning. I just wasn't giving it anything to find it with.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of an ongoing series on using AI as an ordinary person with no specialist background. Related:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://ordinarymantrying.com/chinese-website-hidden-redirect-ai-investigation/" rel="noopener noreferrer"&gt;My Website Was Secretly Redirecting Chinese Visitors — I Used AI to Investigate&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://ordinarymantrying.com/ai-wrong-wordpress-plugin-wechat-redirect-attack/" rel="noopener noreferrer"&gt;The AI Got It Wrong — Then Got It Right&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>wordpress</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 Things That Broke When I Let AI Guide My WordPress Migration to Hostinger</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 14 Aug 2026 11:50:56 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/5-things-that-broke-when-i-let-ai-guide-my-wordpress-migration-to-hostinger-364g</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/5-things-that-broke-when-i-let-ai-guide-my-wordpress-migration-to-hostinger-364g</guid>
      <description>&lt;p&gt;I asked AI to guide me through migrating a WordPress site to Hostinger. Every step looked simple. Every step broke.&lt;/p&gt;

&lt;p&gt;Here's the short version of what actually happened:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1: Disk quota full, backup fails&lt;/strong&gt;&lt;br&gt;
The first 460MB export silently filled the server's disk quota. Every subsequent export failed with &lt;code&gt;errno=122&lt;/code&gt;. Nobody told me. I just kept retrying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2: 148MB file, PHP won't accept it&lt;/strong&gt;&lt;br&gt;
WordPress's default &lt;code&gt;upload_max_filesize&lt;/code&gt; is 64MB. The backup was 148MB. The import page said "connection lost." Took me an hour to figure out I needed to edit PHP options in hPanel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 3: SSL only covered the bare domain&lt;/strong&gt;&lt;br&gt;
Installed SSL before DNS finished propagating. Certificate signed for &lt;code&gt;domain.com&lt;/code&gt; only, not &lt;code&gt;www&lt;/code&gt;. Visitors got a certificate mismatch warning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 4: WordPress escaped &lt;code&gt;&amp;amp;&lt;/code&gt; to &lt;code&gt;&amp;amp;#038;&lt;/code&gt; inside JavaScript&lt;/strong&gt;&lt;br&gt;
A QR code feature broke because WordPress's content filter mangled the &lt;code&gt;&amp;amp;&lt;/code&gt; in a URL string inside a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag. The fix: &lt;code&gt;String.fromCharCode(38)&lt;/code&gt; instead of a literal &lt;code&gt;&amp;amp;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 5: LiteSpeed Cache blocked dynamically-set image src&lt;/strong&gt;&lt;br&gt;
Lazy loading intercepted JS-assigned &lt;code&gt;img.src&lt;/code&gt; values. Images appeared blank. Fix: create a new &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element with &lt;code&gt;createElement&lt;/code&gt; instead of updating an existing one.&lt;/p&gt;

&lt;p&gt;None of these are exotic edge cases. All of them are waiting for you.&lt;/p&gt;




&lt;p&gt;AI guided me through diagnosing every single one of these — I couldn't have done it alone. But it didn't prevent them from happening. That's not a criticism of AI; it's just the nature of migration work. The problems only surface when you actually run it.&lt;/p&gt;

&lt;p&gt;Full write-up with exact commands and fixes:&lt;br&gt;
&lt;a href="https://ordinarymantrying.com/i-let-ai-guide-my-wordpress-migration-to-hostinger-and-hit-every-pitfall-imaginable-ai-generated/" rel="noopener noreferrer"&gt;I Let AI Migrate My WordPress Site to Hostinger. It Went Horribly Wrong.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>ai</category>
      <category>hosting</category>
    </item>
    <item>
      <title>The AI Got It Wrong — Then Got It Right (WordPress Redirect Attack)</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 14 Aug 2026 11:49:53 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/the-ai-got-it-wrong-then-got-it-right-wordpress-redirect-attack-3gmd</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/the-ai-got-it-wrong-then-got-it-right-wordpress-redirect-attack-3gmd</guid>
      <description>&lt;p&gt;My website was secretly redirecting Chinese visitors to a virus site. I ran an AI-assisted investigation, found a suspicious analytics script (51.la), removed it — and declared victory.&lt;/p&gt;

&lt;p&gt;We were wrong.&lt;/p&gt;

&lt;p&gt;The AI blamed 51.la because that's where the evidence pointed. But the real culprit was hiding somewhere file-level scans can never reach: &lt;strong&gt;the WordPress database&lt;/strong&gt;, configured through a compromised plugin called Ad Inserter.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made this attack so hard to catch
&lt;/h2&gt;

&lt;p&gt;The attacker wasn't sloppy. This was carefully engineered to defeat investigators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only fires in WeChat's browser&lt;/strong&gt; — detects &lt;code&gt;MicroMessenger&lt;/code&gt; in the User-Agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Once per device per day&lt;/strong&gt; — cookie-based cooldown means repeat testing always looks clean&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invisible on desktop&lt;/strong&gt; — no redirect, nothing to see&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No trace in any file&lt;/strong&gt; — payload stored in &lt;code&gt;wp_options&lt;/code&gt; database table, not on disk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without AI, my only realistic option would have been a full WordPress reinstall. I would have fixed it without ever understanding what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real lesson
&lt;/h2&gt;

&lt;p&gt;It's not that AI is too weak for security work. The person who built this malware was genuinely smart — money is a powerful motivator for clever engineering. This attack was specifically designed to defeat investigators, and it almost worked.&lt;/p&gt;

&lt;p&gt;What failed wasn't AI capability. It was the search space I gave it: &lt;em&gt;check these files&lt;/em&gt;. The payload wasn't in any file.&lt;/p&gt;

&lt;p&gt;When I gave the AI the right input — rendered page HTML fetched with a WeChat User-Agent — it found the injected 83KB payload in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three rules I changed:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't let AI define the search space too early&lt;/li&gt;
&lt;li&gt;Give AI raw evidence (rendered HTML), not symptoms&lt;/li&gt;
&lt;li&gt;Never call an incident solved after one successful test — &lt;em&gt;redirect stopped does not mean malware removed&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Full investigation write-up, with screenshots of what victims actually saw:&lt;br&gt;
&lt;a href="https://ordinarymantrying.com/ai-wrong-wordpress-plugin-wechat-redirect-attack/" rel="noopener noreferrer"&gt;The AI Got It Wrong — Then Got It Right&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Part of an ongoing series on using AI for real IT problems as an ordinary person with no security background.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>security</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Free Toolkit With 500+ Copy-Paste Commands for Sysadmins and Website Owners</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Fri, 07 Aug 2026 13:50:21 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-toolkit-with-500-copy-paste-commands-for-sysadmins-and-website-owners-1lnm</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-toolkit-with-500-copy-paste-commands-for-sysadmins-and-website-owners-1lnm</guid>
      <description>&lt;p&gt;Last year, a friend called me in a panic. His company's 14 servers had been compromised. He's a business owner, not a sysadmin — he didn't know where to start.&lt;/p&gt;

&lt;p&gt;I spent the next 30 minutes walking him through commands over the phone. The same commands I'd looked up from 6 different tabs, re-Googling the syntax because I could never remember the exact flags.&lt;/p&gt;

&lt;p&gt;That's what built this toolkit.&lt;/p&gt;

&lt;p&gt;What it is&lt;/p&gt;

&lt;p&gt;A free, browser-based collection of 500+ copy-paste commands organized into 14 toolkits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux Incident Response — post-breach forensics, log analysis, persistence hunting&lt;/li&gt;
&lt;li&gt;Windows Incident Response — event logs, autoruns, WMI backdoor detection&lt;/li&gt;
&lt;li&gt;Windows Malware Check — rootkits, scheduled tasks, injected services&lt;/li&gt;
&lt;li&gt;Webshell &amp;amp; Vulnerability Detection — file scanning, backdoor hunting&lt;/li&gt;
&lt;li&gt;Security Hardening — SSH, firewall, file permissions&lt;/li&gt;
&lt;li&gt;Docker &amp;amp; Containers — container forensics, Kubernetes&lt;/li&gt;
&lt;li&gt;Nginx Performance — cache, compression, rate limiting&lt;/li&gt;
&lt;li&gt;WordPress CLI — bulk operations, migrations&lt;/li&gt;
&lt;li&gt;Git Deployment — deploy workflows, rollbacks&lt;/li&gt;
&lt;li&gt;SEO Diagnostics — technical SEO commands&lt;/li&gt;
&lt;li&gt;Plus: Website Health Check, "I Think I Got Hacked" guide, New Website Launch Roadmap
The one thing that makes it different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most command cheatsheets are static text. You copy a command, then spend 2 minutes hunting for every  placeholder.&lt;/p&gt;

&lt;p&gt;This toolkit has editable placeholders. Click a domain name, IP address, or file path inside a command card — it updates everywhere in that card instantly.&lt;/p&gt;

&lt;p&gt;It sounds small. It saves real time when you're mid-incident.&lt;/p&gt;

&lt;p&gt;Each command has a strategy note&lt;/p&gt;

&lt;p&gt;Not just the command — but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to use it&lt;/li&gt;
&lt;li&gt;What normal output looks like&lt;/li&gt;
&lt;li&gt;What suspicious output looks like&lt;/li&gt;
&lt;li&gt;What to do next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because find / -mtime -1 -type f returns results, but "recently modified files" doesn't tell you which ones are supposed to be there.&lt;/p&gt;

&lt;p&gt;Bilingual&lt;/p&gt;

&lt;p&gt;6 of the most common toolkits are available in both English and Chinese. Incident response doesn't care what language you think in.&lt;/p&gt;

&lt;p&gt;No install. No login. Works offline.&lt;/p&gt;

&lt;p&gt;Each toolkit is a single HTML file. Save it to your desktop. Use it on an air-gapped machine during a breach. No dependencies.&lt;/p&gt;




&lt;p&gt;Try it:  &lt;a href="//ordinarymantrying.com/tools/toolkit"&gt;(https://ordinarymantrying.com/tools/toolkit/)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/daligao/website-admin-security-toolkit" rel="noopener noreferrer"&gt;https://github.com/daligao/website-admin-security-toolkit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The "I Think I Got Hacked" guide is probably the most useful starting point if you're new to incident response — it walks through the first 30 minutes of a breach investigation in plain English.&lt;a href="https://dev.tourl"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>I Built a Vocabulary Matching Game for My Son's English Exam — Then Flipped It for Mandarin Learners</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sat, 01 Aug 2026 01:25:38 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-vocabulary-matching-game-for-my-sons-english-exam-then-flipped-it-for-mandarin-learners-48of</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-vocabulary-matching-game-for-my-sons-english-exam-then-flipped-it-for-mandarin-learners-48of</guid>
      <description>&lt;p&gt;My son had a big English exam coming up. He needed to memorize 1,743 vocabulary words.&lt;/p&gt;

&lt;p&gt;Flashcards weren't working. He'd stare at them passively, feel like he was studying, then blank on the actual test. Sound familiar?&lt;/p&gt;

&lt;p&gt;I remembered something from a psychology paper I once read: recognition is not the same as recall. Being able to see a word and nod at it is completely different from being able to produce it when the cue is on the other side. Tests measure the harder thing.&lt;/p&gt;

&lt;p&gt;So I built him a tile-matching game.&lt;/p&gt;

&lt;p&gt;How it works&lt;/p&gt;

&lt;p&gt;Eight word pairs appear on screen. Chinese on one side, English on the other. You tap to match them. Get them right: combo streak, points, satisfying animation. Get them wrong: the tiles shake and you try again.&lt;/p&gt;

&lt;p&gt;The trick is in the direction: you always see one language and have to recall the other. It's not passive. Your brain has to do work.&lt;/p&gt;

&lt;p&gt;1,743 words. 217 levels. 8 words per round.&lt;/p&gt;

&lt;p&gt;Level 1  → words 1–8&lt;br&gt;
Level 2  → words 9–16&lt;br&gt;
...&lt;br&gt;
Level 217 → words 1,737–1,743&lt;/p&gt;

&lt;p&gt;Progress saves in localStorage. No backend, no login, no account. Open the page, play, close it. Come back tomorrow and you're where you left off.&lt;/p&gt;

&lt;p&gt;The tech (it's boring, intentionally)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla JS, single HTML file&lt;/li&gt;
&lt;li&gt;localStorage for progress + mastered words&lt;/li&gt;
&lt;li&gt;CSS animations for the match/shake feedback&lt;/li&gt;
&lt;li&gt;No build step, no framework, no dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept it simple because my son was going to use it on his phone during lunch break. No time for slow loads or broken installs.&lt;/p&gt;

&lt;p&gt;The accidental flip&lt;/p&gt;

&lt;p&gt;After he used it for a few months, I realized: the whole game works in reverse too.&lt;/p&gt;

&lt;p&gt;Chinese ↔ English is the same game whether you're a Chinese student learning English or an English speaker learning Mandarin.&lt;/p&gt;

&lt;p&gt;So I made a second version, same codebase, just flipped the default direction. HSK 1–4 vocabulary. 1,743 words. Same 217 levels.&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%2Fwpibnnkj044t647e1rlp.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%2Fwpibnnkj044t647e1rlp.png" alt=" " width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
It's live here (free, no login):&lt;br&gt;
👉 &lt;a href="https://ordinarymantrying.com/tools/mandarin-match.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/mandarin-match.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfo0zz0upbxuyhrvq0hu.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%2Fdfo0zz0upbxuyhrvq0hu.png" alt=" " width="800" height="515"&gt;&lt;/a&gt;&lt;br&gt;
The gaokao (Chinese college entrance exam) English version is here:&lt;br&gt;
👉 &lt;a href="https://ordinarymantrying.com/tools/gaokao/vocab-match.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/gaokao/vocab-match.html&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The "testing effect" is real and criminally underused in language learning apps. Most apps show you words and ask you to rate yourself ("Hard / Good / Easy"). That's still passive — you're judging your recognition, not exercising recall.&lt;/p&gt;

&lt;p&gt;The matching format forces recall. You can't fake it. Either you know which tile pairs with which, or you don't. That friction is the learning.&lt;/p&gt;




&lt;p&gt;If you've built learning tools, I'd love to know: what mechanic has actually moved the needle for your users?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>learning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Gave 9 AI Models the Same Stock IPO Data. They All Got It Wrong</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Mon, 27 Jul 2026 11:39:20 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-gave-9-ai-models-the-same-stock-ipo-data-they-all-got-it-wrong-11hh</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-gave-9-ai-models-the-same-stock-ipo-data-they-all-got-it-wrong-11hh</guid>
      <description>&lt;p&gt;I'm an ordinary guy in China. I got lucky in an IPO lottery —&lt;br&gt;
1,000 shares of CXMT (688825), China's first domestically-produced&lt;br&gt;
DRAM memory chip maker. Cost: ¥8,660.&lt;/p&gt;

&lt;p&gt;Before listing day, I ran an experiment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;I gave 9 different AI models — Claude, GPT-4o, Gemini, and others —&lt;br&gt;
the exact same data packet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CXMT's financials (still loss-making as of H1 2026)&lt;/li&gt;
&lt;li&gt;Sector comparisons (vs Samsung, Micron, YMTC)&lt;/li&gt;
&lt;li&gt;IPO mechanics (A-share STAR Market, no price limit first 5 days)&lt;/li&gt;
&lt;li&gt;Market sentiment indicators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One standardized prompt. Nine models. One question: &lt;strong&gt;what price&lt;br&gt;
range do you predict for the opening?&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IPO Price&lt;/td&gt;
&lt;td&gt;¥8.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opening Price&lt;/td&gt;
&lt;td&gt;¥49.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intraday High&lt;/td&gt;
&lt;td&gt;¥55.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Close&lt;/td&gt;
&lt;td&gt;¥49.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day 1 Gain&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+465.82%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Market Cap&lt;/td&gt;
&lt;td&gt;¥3.28 trillion (~$455B USD)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For reference: Intel's current market cap is approximately $90B USD.&lt;/p&gt;

&lt;p&gt;A company that won't turn profitable until at least H2 2026&lt;br&gt;
just listed at a valuation larger than one of the founding&lt;br&gt;
fathers of the semiconductor industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All 9 AIs underestimated this. Significantly.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the AIs Were Wrong
&lt;/h2&gt;

&lt;p&gt;This is the part I find genuinely interesting as someone who&lt;br&gt;
uses AI tools daily.&lt;/p&gt;

&lt;p&gt;The models reasoned &lt;em&gt;correctly&lt;/em&gt; about the fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loss-making company ✓&lt;/li&gt;
&lt;li&gt;High valuation vs peers ✓&lt;/li&gt;
&lt;li&gt;Uncertain demand cycle ✓&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What they couldn't model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. National narrative as a price driver&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CXMT isn't just a stock. It's China's answer to the US chip&lt;br&gt;
embargo. Retail investors weren't buying earnings — they were&lt;br&gt;
buying a symbol. No training data fully captures that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Zero-float dynamics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On STAR Market IPOs, the tradeable float on day one is tiny.&lt;br&gt;
When retail demand is enormous and supply is near-zero, price&lt;br&gt;
discovery goes vertical. The math is simple but the magnitude&lt;br&gt;
is hard to predict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Crowd psychology at full velocity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI models are trained on markets that behave rationally most&lt;br&gt;
of the time. They have no good model for the specific fever&lt;br&gt;
of a landmark national IPO.&lt;/p&gt;

&lt;p&gt;I sold my full allocation on listing day. The S markers on&lt;br&gt;
the chart are my actual exit points. I didn't hit ¥55 —&lt;br&gt;
nobody does. But I exited profitably.&lt;/p&gt;

&lt;p&gt;The money goes toward my son's school tuition. That was&lt;br&gt;
always the plan.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;I trusted AI completely. What I underestimated was&lt;br&gt;
human frenzy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't an argument against using AI for investment research.&lt;br&gt;
I use AI tools extensively for stock analysis — they're excellent&lt;br&gt;
at processing financials, comparing peers, identifying risks.&lt;/p&gt;

&lt;p&gt;But there's a category of market event where the key variable&lt;br&gt;
is &lt;em&gt;how many people believe something matters&lt;/em&gt; — and that's&lt;br&gt;
precisely what language models struggle with.&lt;/p&gt;

&lt;p&gt;Use AI as one input. Not as an oracle.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I document my real-money AI experiments (including failures)&lt;br&gt;
at &lt;a href="https://ordinarymantrying.com" rel="noopener noreferrer"&gt;ordinarymantrying.com&lt;/a&gt;.&lt;br&gt;
Ordinary Chinese guy, real stakes, no filter.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>I built a free AI investing toolkit after running 7 experiments with 8 AI models — here's what I learned</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sat, 25 Jul 2026 12:56:58 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-ai-investing-toolkit-after-running-7-experiments-with-8-ai-models-heres-what-i-3gol</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-ai-investing-toolkit-after-running-7-experiments-with-8-ai-models-heres-what-i-3gol</guid>
      <description>&lt;p&gt;I've been running an experiment for months: asking 8 different AI models (GPT-4, Claude, Gemini, DeepSeek, Kimi, Grok, Mistral, Perplexity) the exact same investing questions.&lt;/p&gt;

&lt;p&gt;One pattern kept emerging: every model, regardless of architecture, fell into one of 4 investing philosophies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Index school&lt;/strong&gt; — diversify, minimize fees, let the market work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value school&lt;/strong&gt; — find underpriced assets with a margin of safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth school&lt;/strong&gt; — bet on high-growth compounders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend school&lt;/strong&gt; — follow price momentum and manage risk tightly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This got me thinking: most people using AI for investing are prompting blindly — their prompts don't match their actual philosophy. So they get generic answers.&lt;/p&gt;

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

&lt;p&gt;A free browser-based toolkit: &lt;strong&gt;&lt;a href="https://ordinarymantrying.com/tools/ai-invest-os.html" rel="noopener noreferrer"&gt;My AI Investment Operating System&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main tool:&lt;/strong&gt; 5-question diagnostic that identifies your investing school and generates a personalized Prompt Library — prompts you can drop into Claude, GPT-4, or any AI today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 companion tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DCA Simulator&lt;/strong&gt; — model dollar-cost averaging scenarios with compound projections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery Navigator&lt;/strong&gt; — calculate breakeven points and map exit strategies for losing positions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dividend Engine&lt;/strong&gt; — screen dividend stocks through the lens of your investing school&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kelly Master&lt;/strong&gt; — apply Kelly Criterion to size positions correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pyramid Builder&lt;/strong&gt; — plan staged entry positions at multiple price levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Clarity&lt;/strong&gt; — audit your current holdings against your school's criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;Pure HTML/CSS/JS, no framework, no backend. Everything runs client-side. Hosted as static files on a WordPress site's &lt;code&gt;/tools/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;The AI committee logic uses a scoring matrix built from patterns across all 7 experiments — no live API calls, all logic is embedded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link
&lt;/h2&gt;

&lt;p&gt;All free, no login: &lt;a href="https://ordinarymantrying.com/tools/ai-invest-os.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/ai-invest-os.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback from developers who also invest — especially on the UX of the diagnostic flow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I built a free AI investing toolkit after running 7 experiments with 8 AI models — here's what I learned</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:46:46 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-ai-investing-toolkit-after-running-7-experiments-with-8-ai-models-heres-what-i-2gao</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/i-built-a-free-ai-investing-toolkit-after-running-7-experiments-with-8-ai-models-heres-what-i-2gao</guid>
      <description>&lt;p&gt;I've been running an experiment for months: asking 8 different AI models (GPT-4, Claude, Gemini, DeepSeek, Kimi, Grok, Mistral, Perplexity) the exact same investing questions.&lt;/p&gt;

&lt;p&gt;One pattern kept emerging: every model, regardless of architecture, fell into one of 4 investing philosophies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Index school&lt;/strong&gt; — diversify, minimize fees, let the market work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value school&lt;/strong&gt; — find underpriced assets with a margin of safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth school&lt;/strong&gt; — bet on high-growth compounders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend school&lt;/strong&gt; — follow price momentum and manage risk tightly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This got me thinking: most people using AI for investing are prompting blindly — their prompts don't match their actual philosophy. So they get generic answers.&lt;/p&gt;

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

&lt;p&gt;A free browser-based toolkit: &lt;strong&gt;&lt;a href="https://ordinarymantrying.com/tools/ai-invest-os.html" rel="noopener noreferrer"&gt;My AI Investment Operating System&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main tool:&lt;/strong&gt; 5-question diagnostic that identifies your investing school and generates a personalized Prompt Library — prompts you can drop into Claude, GPT-4, or any AI today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 companion tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DCA Simulator&lt;/strong&gt; — model dollar-cost averaging scenarios with compound projections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery Navigator&lt;/strong&gt; — calculate breakeven points and map exit strategies for losing positions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dividend Engine&lt;/strong&gt; — screen dividend stocks through the lens of your investing school&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kelly Master&lt;/strong&gt; — apply Kelly Criterion to size positions correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pyramid Builder&lt;/strong&gt; — plan staged entry positions at multiple price levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio Clarity&lt;/strong&gt; — audit your current holdings against your school's criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;Pure HTML/CSS/JS, no framework, no backend. Everything runs client-side. Hosted as static files on a WordPress site's &lt;code&gt;/tools/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;The AI committee logic uses a scoring matrix built from patterns across all 7 experiments — no live API calls, all logic is embedded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Link
&lt;/h2&gt;

&lt;p&gt;All free, no login: &lt;a href="https://ordinarymantrying.com/tools/ai-invest-os.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/ai-invest-os.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback from developers who also invest — especially on the UX of the diagnostic flow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I Built 8 Free Relationship Quizzes With Vanilla JS (No Framework, No Backend)</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Sat, 18 Jul 2026 08:42:03 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/how-i-built-8-free-relationship-quizzes-with-vanilla-js-no-framework-no-backend-lji</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/how-i-built-8-free-relationship-quizzes-with-vanilla-js-no-framework-no-backend-lji</guid>
      <description>&lt;p&gt;Last month I watched a couple fight on the subway. She kept saying "you never understand me." He kept saying "you're overreacting." It gave me an idea.&lt;/p&gt;

&lt;p&gt;I wanted to build honest relationship quizzes — the kind that make you actually pause. No login walls, no upsells, no "premium to see your result."&lt;/p&gt;

&lt;p&gt;Here's how I built all 8 in vanilla JS with zero dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Each quiz is a single self-contained HTML file. No build step, no npm, no framework. Just HTML + CSS + JS in one file.&lt;/p&gt;

&lt;p&gt;Why? Because it loads instantly, works offline, is easy to host anywhere, and anyone can inspect the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Scoring Models
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Type-based (Attachment Style, Love Language, Conflict Style):&lt;/strong&gt;&lt;br&gt;
Each option maps to a type. At the end, the dominant type wins.&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;Qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Your partner says 'I need space.' Your reaction?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Of course — take the time you need.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Did I do something wrong?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Great, I could use space too.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Part of me wants to chase, part wants to disappear.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getDominant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ORDER&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S&lt;/span&gt;&lt;span class="dl"&gt;'&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;Linear scoring (Red Flag, Green Flag, Emotional Availability):&lt;/strong&gt;&lt;br&gt;
Options score 1–4. Normalize with (total - min) / (max - min) * 100.&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;minP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Qs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;maxP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Qs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;minP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxP&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;minP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Options Shuffle (Without Breaking Scores)
&lt;/h2&gt;

&lt;p&gt;The key insight: shuffle the option &lt;em&gt;objects&lt;/em&gt;, not just the text. The score/type stays bound to the object.&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;shuffle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// In renderQ():&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shuffled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;shuffle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// onclick="pick('${o.type}', this)" — type travels with the option&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  localStorage Progress Save
&lt;/h2&gt;

&lt;p&gt;Users can close mid-quiz and return:&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="c1"&gt;// Save on each answer&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ast_state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;typeCounts&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="c1"&gt;// Restore on start&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ast_state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeCounts&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Qs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;typeCounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeCounts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Clear on completion&lt;/span&gt;
&lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ast_state&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Canvas Share Card
&lt;/h2&gt;

&lt;p&gt;Each result generates a downloadable 1080x1080 PNG:&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;function&lt;/span&gt; &lt;span class="nf"&gt;downloadCard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// gradient background, score ring/bars, result text...&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;result.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&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;h2&gt;
  
  
  The Bug I Spent Too Long On
&lt;/h2&gt;

&lt;p&gt;Unescaped apostrophes inside single-quoted JS strings. &lt;code&gt;'You don't lose yourself'&lt;/code&gt; breaks silently — the page loads but the entire script fails to parse, so clicking the start button does nothing.&lt;/p&gt;

&lt;p&gt;Fix: change to double quotes for any string containing apostrophes.&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="c1"&gt;// BROKEN&lt;/span&gt;
&lt;span class="nx"&gt;strengths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;You don&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s1"&gt;t lose yourself in relationships&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// FIXED&lt;/span&gt;
&lt;span class="nx"&gt;strengths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You don't lose yourself in relationships&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Live Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ordinarymantrying.com/tools/relationship-lab/" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/relationship-lab/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All 8 tests are free, no login required. The Attachment Style and Conflict Style tests are probably the most useful to take together.&lt;/p&gt;

&lt;p&gt;What would you do differently? Always curious how others approach quiz scoring without a backend.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Built an Open-Source Psychology Quiz &amp; Got 500+ GitHub Stars in 48 Hours</title>
      <dc:creator>Văn Tuấn Lê</dc:creator>
      <pubDate>Wed, 15 Jul 2026 15:26:21 +0000</pubDate>
      <link>https://dev.to/vn_tunl_09a36fcbda701/how-i-built-an-open-source-psychology-quiz-got-500-github-stars-in-48-hours-1nkc</link>
      <guid>https://dev.to/vn_tunl_09a36fcbda701/how-i-built-an-open-source-psychology-quiz-got-500-github-stars-in-48-hours-1nkc</guid>
      <description>&lt;p&gt;When I started playing with psychology research, I noticed something interesting: I could &lt;em&gt;understand&lt;/em&gt; cognitive biases intellectually, but I couldn't &lt;em&gt;recognize&lt;/em&gt; them in real-world situations.&lt;/p&gt;

&lt;p&gt;So I built a quiz. 40 psychology laws, 8 real-world scenarios each, no definitions. Just situations. 8,000 people have played it since launch. The data surprised me.&lt;/p&gt;

&lt;p&gt;72% of people get Confirmation Bias wrong. 68% miss the Sunk Cost Fallacy in realistic scenarios. Even people who consider themselves "rational" confidently misidentify basic psychological patterns.&lt;/p&gt;

&lt;p&gt;That gap between understanding and recognizing — that's the story. And the story behind shipping it to GitHub, getting into Hacker News, and hitting 500+ stars in 48 hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  What 8,000 Players Taught Me
&lt;/h2&gt;

&lt;p&gt;Before I organized the 40 psychology laws into an awesome list, I noticed a clear pattern in the quiz results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Most Misunderstood Laws:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirmation Bias&lt;/strong&gt; (72% wrong)&lt;br&gt;
People think it means "believing what you believe." That's true, but they miss the active part: you &lt;em&gt;seek&lt;/em&gt; information that confirms your view and ignore contradictions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sunk Cost Fallacy&lt;/strong&gt; (68% wrong)&lt;br&gt;
People stay in bad situations because they've "already invested." The money is gone either way, but their brain treats it as still in play.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Survivorship Bias&lt;/strong&gt; (65% wrong)&lt;br&gt;
You see success stories (they survived) and miss the failures (they're silent). This creates illusory patterns.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters for Developers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You make dozens of these decisions daily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuing a project that's clearly failing (sunk cost)&lt;/li&gt;
&lt;li&gt;Hiring based on charisma instead of competence (halo effect)&lt;/li&gt;
&lt;li&gt;Following industry trends because everyone is (herd mentality)&lt;/li&gt;
&lt;li&gt;Trusting authority without verification (authority bias)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these patterns doesn't eliminate them, but recognizing them in real-time does.&lt;/p&gt;

&lt;p&gt;That's the premise of Psychology Laws Awesome: structure the 40 laws by pattern, provide frameworks for each, and build a community around improving our collective decision-making.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built Psychology Laws Awesome
&lt;/h2&gt;

&lt;p&gt;The project actually started 3 months ago, but the GitHub launch was recent. Here's the process:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Research &amp;amp; Curation (Month 1)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyzed quiz data from 8,000+ players&lt;/li&gt;
&lt;li&gt;Identified which laws people misunderstood most&lt;/li&gt;
&lt;li&gt;Researched the scientific backing for each law&lt;/li&gt;
&lt;li&gt;Organized into 7 categories:

&lt;ul&gt;
&lt;li&gt;How We Perceive Information&lt;/li&gt;
&lt;li&gt;Self-Awareness &amp;amp; Knowledge&lt;/li&gt;
&lt;li&gt;Social Dynamics &amp;amp; Influence&lt;/li&gt;
&lt;li&gt;Decision-Making &amp;amp; Action&lt;/li&gt;
&lt;li&gt;Competitive Dynamics&lt;/li&gt;
&lt;li&gt;Systems &amp;amp; Consequences&lt;/li&gt;
&lt;li&gt;Measurement &amp;amp; Information&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Build (Month 2)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created the awesome list README (40 laws with links, descriptions, applications)&lt;/li&gt;
&lt;li&gt;Wrote CONTRIBUTING.md (open to community additions)&lt;/li&gt;
&lt;li&gt;Created PR template for official awesome lists submission&lt;/li&gt;
&lt;li&gt;Set up GitHub organization and structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Launch Preparation (Week 1)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verified all 40 laws had supporting content on my site&lt;/li&gt;
&lt;li&gt;Built related projects:

&lt;ul&gt;
&lt;li&gt;Mind Traps game (interactive quiz, 320+ scenarios)&lt;/li&gt;
&lt;li&gt;Psychology Laws Index (quick reference)&lt;/li&gt;
&lt;li&gt;Individual law pages (deep dives)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prepared documentation and examples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Phase 4: Public Launch (This Week)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submitted to sindresorhus/awesome (waiting for review)&lt;/li&gt;
&lt;li&gt;Published to Hacker News&lt;/li&gt;
&lt;li&gt;Got 500+ stars in 48 hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Tech Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure GitHub README (no code needed for an awesome list)&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript for the game (95KB, no dependencies)&lt;/li&gt;
&lt;li&gt;Static HTML for law pages&lt;/li&gt;
&lt;li&gt;MIT License (open source, invite contributions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Learning:&lt;/strong&gt;&lt;br&gt;
The awesome list itself isn't code — it's curation. But the value comes from the supporting ecosystem (quiz, articles, frameworks) that makes each law actionable, not just theoretical.&lt;/p&gt;




&lt;h2&gt;
  
  
  From 0 to 500 Stars: Launch Strategy
&lt;/h2&gt;

&lt;p&gt;I could have just pushed to GitHub and waited. Instead, I used a 3-day launch strategy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 1: Quora&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Posted 3-5 answers on popular psychology questions&lt;/li&gt;
&lt;li&gt;Each answer included a link to the Mind Traps quiz&lt;/li&gt;
&lt;li&gt;Goal: build initial traffic and test messaging&lt;/li&gt;
&lt;li&gt;Result: ~500 views, ~25 new quiz players&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 2: Hacker News&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submitted to Show HN with detailed explanation&lt;/li&gt;
&lt;li&gt;Posted a top-level comment explaining the psychology research&lt;/li&gt;
&lt;li&gt;Actively engaged with all comments and questions for 6 hours&lt;/li&gt;
&lt;li&gt;Goal: reach developers interested in learning and decision-making&lt;/li&gt;
&lt;li&gt;Result: 300+ upvotes, ~2,000 views, 200+ stars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Day 3: Reddit + Dev.to&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Posted to r/learnprogramming and r/psychology&lt;/li&gt;
&lt;li&gt;Prepared this Dev.to article&lt;/li&gt;
&lt;li&gt;Coordinated timing to avoid cannibalizing audiences&lt;/li&gt;
&lt;li&gt;Result: ~1,000 additional views, 100+ stars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why This Worked:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multi-channel approach&lt;/strong&gt; — didn't rely on one platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing&lt;/strong&gt; — staggered releases kept momentum going&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storytelling&lt;/strong&gt; — emphasized the data and psychology, not just "I made a thing"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community engagement&lt;/strong&gt; — responded to every comment and question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentic angle&lt;/strong&gt; — posted because the research was interesting, not just for promotion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Numbers So Far:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub stars: 500+ in 48 hours&lt;/li&gt;
&lt;li&gt;Quiz players: 250+ new&lt;/li&gt;
&lt;li&gt;GitHub issues: 5+ (all constructive)&lt;/li&gt;
&lt;li&gt;Discussion topics: 3+ (people asking how to contribute)&lt;/li&gt;
&lt;li&gt;Email signups: 15+ (interested in updates)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Learned (For Other Open Source Builders)
&lt;/h2&gt;

&lt;p&gt;If you're thinking about shipping an open-source project, here's what worked:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Build Something Real&lt;/strong&gt;&lt;br&gt;
Don't just create a list and expect stars. Build something people &lt;em&gt;use&lt;/em&gt;. The Mind Traps quiz is 95KB of real value. People play it and share it. That drives engagement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Multi-Channel Launch&lt;/strong&gt;&lt;br&gt;
HN alone would have gotten 200 stars. Quora + HN + Reddit + Dev.to got 500+. Coordinate timing so you're building momentum, not diluting it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Engage Authentically&lt;/strong&gt;&lt;br&gt;
Respond to every comment. Answer real questions. Acknowledge good criticism. People upvote projects whose creators actually care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Tell the Story&lt;/strong&gt;&lt;br&gt;
"Here's my awesome list" gets 20 stars. "Here's how 8,000 players taught me about psychology" gets 500 stars. People don't just want the artifact — they want the narrative behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Think Beyond the Launch&lt;/strong&gt;&lt;br&gt;
The launch week is exciting, but the real value is months 2-6 when early adopters become contributors. Structure your project for contribution, not just consumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Verify Everything&lt;/strong&gt;&lt;br&gt;
Every link in my awesome list points to real content. Every statistic I cited came from real quiz data. No fluff. This builds trust, and trust builds community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. License Clearly&lt;/strong&gt;&lt;br&gt;
MIT License. No ambiguity. Clear signals that contributors' work will stay open. This removes friction for people who want to help.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;If you want to test your own decision-making:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Play the quiz&lt;/strong&gt; (20 minutes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ordinarymantrying.com/tools/mind-traps.html" rel="noopener noreferrer"&gt;https://ordinarymantrying.com/tools/mind-traps.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;40 laws, 8 scenarios each, no definitions&lt;/li&gt;
&lt;li&gt;See which patterns you confidently get wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Explore the awesome list&lt;/strong&gt; (5 minutes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/daligao/psychology-laws-awesome" rel="noopener noreferrer"&gt;https://github.com/daligao/psychology-laws-awesome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Browse by category&lt;/li&gt;
&lt;li&gt;Identify which laws surprise you most&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Join the conversation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Discussions: share which laws you find most useful&lt;/li&gt;
&lt;li&gt;Issues: suggest improvements or new laws&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Share it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you found this useful, star the repo&lt;/li&gt;
&lt;li&gt;Share with your team&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading. Now go play the quiz and find out which laws trip &lt;em&gt;you&lt;/em&gt; up.&lt;/p&gt;

</description>
      <category>learning</category>
    </item>
    <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>
  </channel>
</rss>
