<?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: CBT Tools</title>
    <description>The latest articles on DEV Community by CBT Tools (@473185670).</description>
    <link>https://dev.to/473185670</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%2F4068155%2F7b476736-baf5-4a82-b30d-f07f3b9e7e7f.png</url>
      <title>DEV Community: CBT Tools</title>
      <link>https://dev.to/473185670</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/473185670"/>
    <language>en</language>
    <item>
      <title>CBT Techniques for Developer Burnout: How to Reframe 'I'm Not Productive Enough</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sat, 10 Oct 2026 12:06:39 +0000</pubDate>
      <link>https://dev.to/473185670/cbt-techniques-for-developer-burnout-how-to-reframe-im-not-productive-enough-5642</link>
      <guid>https://dev.to/473185670/cbt-techniques-for-developer-burnout-how-to-reframe-im-not-productive-enough-5642</guid>
      <description>&lt;p&gt;If you've ever stared at your IDE at 2 PM, brain fogged, and thought &lt;em&gt;"I'm not productive enough"&lt;/em&gt;, you're not alone. Developer burnout is at record highs — and the inner monologue that drives it is remarkably predictable.&lt;/p&gt;

&lt;p&gt;The good news? That inner monologue follows patterns. And patterns can be hacked.&lt;/p&gt;

&lt;p&gt;This tutorial shows you how to use &lt;strong&gt;Cognitive Behavioral Therapy (CBT)&lt;/strong&gt; techniques — the same evidence-based methods therapists use — to identify and reframe the cognitive distortions that fuel developer burnout. We'll build a simple Python tool along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is CBT (And Why Should Developers Care)?
&lt;/h2&gt;

&lt;p&gt;CBT is a structured, evidence-based therapy that works by identifying the &lt;strong&gt;cognitive distortions&lt;/strong&gt; — systematic errors in thinking — that drive negative emotions. For developers, these distortions often manifest as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"I should be shipping faster"&lt;/strong&gt; (Should statements)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"One bad PR review means I'm a bad engineer"&lt;/strong&gt; (All-or-nothing thinking)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Everyone else is more productive than me"&lt;/strong&gt; (Comparison distortion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"If I don't work this weekend, I'll fall behind forever"&lt;/strong&gt; (Catastrophizing)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CBT gives you a structured way to catch these thoughts, examine the evidence, and reframe them. Think of it as &lt;strong&gt;debugging for your brain&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CBT Thought Record: Your Mental Debug Log
&lt;/h2&gt;

&lt;p&gt;The core CBT tool is the &lt;strong&gt;Thought Record&lt;/strong&gt; — a structured log where you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Situation&lt;/strong&gt;: What triggered the thought?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Thought&lt;/strong&gt;: What did your brain say?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotion&lt;/strong&gt;: What did you feel? (0-100 intensity)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Distortion&lt;/strong&gt;: Which thinking error is this?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence For&lt;/strong&gt;: What supports the thought?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Against&lt;/strong&gt;: What contradicts it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanced Thought&lt;/strong&gt;: A fair, evidence-based reframe&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Emotion&lt;/strong&gt;: How do you feel now? (0-100)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's build one in Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a CBT Thought Record Tool in Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A single CBT thought record entry.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;automatic_thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;emotion_intensity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;  &lt;span class="c1"&gt;# 0-100
&lt;/span&gt;    &lt;span class="n"&gt;cognitive_distortion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;balanced_thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;new_emotion_intensity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;  &lt;span class="c1"&gt;# 0-100
&lt;/span&gt;    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Common developer cognitive distortions
&lt;/span&gt;&lt;span class="n"&gt;DEVELOPER_DISTORTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all_or_nothing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All-or-nothing thinking: one failure = total failure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catastrophizing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Catastrophizing: assuming the worst possible outcome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;should_statements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Should statements: rigid rules about how you &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;should&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; perform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comparison&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Comparison distortion: comparing your inside to others&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; outside&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;personalization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Personalization: taking blame for things outside your control&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mental_filter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mental filter: focusing only on negatives, filtering out positives&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;labeling&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Labeling: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;I am a bad engineer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; instead of &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;I made a mistake&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_thought_record&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Interactive CLI to create a thought record.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=== CBT Thought Record ===&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;situation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What situation triggered the thought?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;auto_thought&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;What did your brain automatically say?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;emotion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;What emotion did you feel? (e.g., anxiety, guilt, shame)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;intensity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Intensity 0-100?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Common developer distortions:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;DEVELOPER_DISTORTIONS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;distortion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Which distortion matches?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;evidence_for&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Evidence FOR the thought:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;evidence_against&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Evidence AGAINST the thought:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;balanced&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Balanced reframe:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;new_intensity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;New emotion intensity 0-100?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;automatic_thought&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auto_thought&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;emotion_intensity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;intensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;cognitive_distortion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;distortion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;balanced_thought&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;balanced&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;new_emotion_intensity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;new_intensity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Example: Developer burnout thought record
&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PR got 3 change requests on code I worked on all week&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;automatic_thought&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m not productive enough. I should have gotten it right the first time.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shame&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;emotion_intensity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cognitive_distortion&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;should_statements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The PR did need changes.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Change requests are normal. I shipped 4 other PRs this week that merged cleanly. Senior devs get change requests too. Code review is collaborative, not a test.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;balanced_thought&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Change requests are part of the process, not a verdict on my worth. I can address the feedback and learn from it.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;new_emotion_intensity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dict__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this and you'll see the emotional intensity drop from &lt;strong&gt;75 → 30&lt;/strong&gt; — just by examining the evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 6 Burnout Thought Patterns (And How to Reframe Them)
&lt;/h2&gt;

&lt;p&gt;Developer burnout has six characteristic thought patterns. Here's each one with its reframe:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. "I'm Not Productive Enough"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: Comparison + Should statements&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "Productivity is not a single metric. I shipped working code, helped in code review, and unblocked a teammate. That's a productive day."&lt;/p&gt;
&lt;h3&gt;
  
  
  2. "Everyone Else Ships Faster Than Me"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: Comparison distortion (comparing your inside to their outside)&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "I see their merged PRs, not their WIP branches, reverts, and debug sessions. I don't have their full picture."&lt;/p&gt;
&lt;h3&gt;
  
  
  3. "If I Rest, I'll Fall Behind"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: Catastrophizing&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "Taking a break today costs ~2 hours. Burning out costs ~2 months. The math favors rest."&lt;/p&gt;
&lt;h3&gt;
  
  
  4. "My Worth = My Output"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: Labeling / All-or-nothing&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "I am a person who writes code, among many other things. My worth is not a function of my commit count."&lt;/p&gt;
&lt;h3&gt;
  
  
  5. "I Should Be Able to Handle This"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: Should statements&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "Burnout is a well-documented occupational phenomenon (ICD-11). It's not a personal failure. It's a signal that something in the environment needs to change."&lt;/p&gt;
&lt;h3&gt;
  
  
  6. "It's Too Late to Change Anything"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distortion&lt;/strong&gt;: All-or-nothing + Catastrophizing&lt;br&gt;
&lt;strong&gt;Reframe&lt;/strong&gt;: "I can change one thing today: take a lunch break, set a boundary, log off at 6. Small changes compound."&lt;/p&gt;
&lt;h2&gt;
  
  
  Automating the Reframe: A Distortion Detector
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="c1"&gt;# Pattern → distortion mapping
&lt;/span&gt;&lt;span class="n"&gt;BURNTOUT_PATTERNS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not (productive|shipping|fast) enough&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comparison&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;everyone else (is|does|ships)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;comparison&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;i should (be|have|not)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;should_statements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(always|never|forever|impossible)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all_or_nothing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;if i (rest|stop|take a break)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catastrophizing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;i am (a |an )?(bad|failure|fraud|imposter)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;labeling&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(too late|no point|what&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the use)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all_or_nothing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;journal_entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Scan a journal entry for cognitive distortions.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;entry_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;journal_entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distortion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;BURNTOUT_PATTERNS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry_lower&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;distortion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;

&lt;span class="c1"&gt;# Test it
&lt;/span&gt;&lt;span class="n"&gt;journal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m not productive enough today. Everyone else ships faster.
I should be able to handle this workload. If I rest, I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ll fall behind.
It&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s too late to change anything.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="n"&gt;distortions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distortions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚠️  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠️  comparison: ['productive', 'ships']
⚠️  should_statements: ['be']
⚠️  catastrophizing: ['rest']
⚠️  all_or_nothing: ['too late']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Behavioral Experiment: Testing Your Beliefs
&lt;/h2&gt;

&lt;p&gt;CBT isn't just thinking differently — it's &lt;strong&gt;testing&lt;/strong&gt; whether your beliefs are accurate. For developers, this means running behavioral experiments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BehavioralExperiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Test a burnout belief against reality.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;belief&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;prediction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  &lt;span class="c1"&gt;# What you think will happen
&lt;/span&gt;    &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  &lt;span class="c1"&gt;# What you'll do
&lt;/span&gt;    &lt;span class="n"&gt;actual_outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;belief_confirmed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;record_outcome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actual_outcome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;
        &lt;span class="c1"&gt;# Did reality match the prediction?
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belief_confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prediction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Example: "If I log off at 6 PM, my team will think I'm lazy"
&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BehavioralExperiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;belief&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If I log off at 6 PM, my team will think I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m lazy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prediction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Team will comment on my early departure or reduce my responsibilities&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Log off at 6 PM for 3 days. Observe team reactions.&lt;/span&gt;&lt;span class="sh"&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;# After 3 days:
&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;record_outcome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No one commented. One teammate said &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;good boundaries&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. PR merged normally next morning.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Belief confirmed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belief_confirmed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The belief was WRONG. Logging off at 6 is safe.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Free Interactive CBT Tools
&lt;/h2&gt;

&lt;p&gt;I've built a set of &lt;strong&gt;free, privacy-first CBT tools&lt;/strong&gt; that run entirely in your browser — no signup, no backend, no data collection:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;CBT Toolkit on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The toolkit includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive thought record builder&lt;/li&gt;
&lt;li&gt;Cognitive distortion reference with developer-specific examples&lt;/li&gt;
&lt;li&gt;CBT techniques for 50+ specific conditions (anxiety, burnout, imposter syndrome, perfectionism)&lt;/li&gt;
&lt;li&gt;All vanilla JavaScript, all open source&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Seek Professional Help
&lt;/h2&gt;

&lt;p&gt;CBT self-help tools are powerful, but they're not a substitute for professional therapy. Seek help if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Burnout symptoms persist &amp;gt; 2 weeks despite self-help&lt;/li&gt;
&lt;li&gt;You experience thoughts of self-harm&lt;/li&gt;
&lt;li&gt;Burnout is affecting your physical health (sleep, appetite, chest pain)&lt;/li&gt;
&lt;li&gt;You're using substances to cope&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;988&lt;/strong&gt; (US Suicide &amp;amp; Crisis Lifeline — call or text)&lt;/li&gt;
&lt;li&gt;Your company's EAP (Employee Assistance Program)&lt;/li&gt;
&lt;li&gt;Psychology Today's therapist finder (psychologytoday.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Developer burnout is driven by predictable cognitive distortions. CBT gives you structured tools to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Catch&lt;/strong&gt; the automatic thought (Thought Record)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identify&lt;/strong&gt; the distortion (Pattern matching)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Examine&lt;/strong&gt; the evidence (For and against)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reframe&lt;/strong&gt; to a balanced perspective&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test&lt;/strong&gt; with behavioral experiments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The thought record takes 5 minutes. The payoff is shifting from &lt;em&gt;"I'm not productive enough"&lt;/em&gt; to &lt;em&gt;"I'm doing sustainable work at a sustainable pace"&lt;/em&gt; — and actually believing it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This tutorial is educational, not medical advice. If you're struggling, please reach out to a mental health professional or call 988.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Free CBT Thought Record Template
&lt;/h2&gt;

&lt;p&gt;I built a &lt;strong&gt;CBT Thought Record Notion template&lt;/strong&gt; with the 7-column method, 10 cognitive distortions reference, worked example, and daily practice guide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get it here&lt;/strong&gt; → &lt;a href="https://4043969836017.gumroad.com/l/yyzll" rel="noopener noreferrer"&gt;Gumroad - CBT Thought Record ($7)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or &lt;a href="https://pale-earth-1ab.notion.site/CBT-Thought-Record-3c0bf3457ff3816aade3f0c246be6c06" rel="noopener noreferrer"&gt;duplicate the Notion template directly&lt;/a&gt; and customize it.&lt;/p&gt;

</description>
      <category>python</category>
      <category>mentalhealth</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Build a CBT Thought Record Journal in Python (Mental Health Tooling)</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sat, 10 Oct 2026 11:15:56 +0000</pubDate>
      <link>https://dev.to/473185670/how-to-build-a-cbt-thought-record-journal-in-python-mental-health-tooling-jph</link>
      <guid>https://dev.to/473185670/how-to-build-a-cbt-thought-record-journal-in-python-mental-health-tooling-jph</guid>
      <description>&lt;p&gt;If you've ever struggled with anxiety, negative self-talk, or emotional spirals, you've probably heard of &lt;strong&gt;Cognitive Behavioral Therapy (CBT)&lt;/strong&gt;. It's one of the most evidence-backed therapeutic approaches for anxiety, depression, and dozens of other conditions.&lt;/p&gt;

&lt;p&gt;But here's the thing: the core CBT technique — the &lt;strong&gt;thought record&lt;/strong&gt; — is essentially a structured way to debug your own thinking. And if you're a developer, you already know how to debug.&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll show you how to build a &lt;strong&gt;CBT Thought Record Journal&lt;/strong&gt; in Python — a CLI tool that guides you through the 7-column thought record, stores entries as JSON, and lets you review patterns over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Thought Record?
&lt;/h2&gt;

&lt;p&gt;A thought record (also called a "dysfunctional thought record" or "ABCDE worksheet") is a structured table where you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Situation&lt;/strong&gt; — Describe what triggered the emotional response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotions&lt;/strong&gt; — Rate intensity (0-100)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Thoughts&lt;/strong&gt; — What went through your mind?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Distortion&lt;/strong&gt; — Which thinking trap did you fall into?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence For&lt;/strong&gt; — What supports the thought?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Against&lt;/strong&gt; — What contradicts it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanced Thought&lt;/strong&gt; — A fairer, more accurate reframe&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This structure comes from Aaron Beck's cognitive therapy model. Research shows that regular practice reduces anxiety and depression symptoms by 40-60% over 12-20 sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10 Common Cognitive Distortions
&lt;/h2&gt;

&lt;p&gt;Before we code, here are the distortions our tool will detect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;DISTORTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_or_nothing&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;All-or-Nothing Thinking (splitting)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overgeneralization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Overgeneralization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mental_filter&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mental Filter (focusing only on negatives)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;disqualifying_positive&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Disqualifying the Positive&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mind_reading&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Jumping to Conclusions (Mind Reading)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fortune_telling&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Jumping to Conclusions (Fortune Telling)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;magnification&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Magnification (Catastrophizing) or Minimization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emotional_reasoning&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Emotional Reasoning&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;should_statements&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Should Statements&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;labeling&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Labeling and Mislabeling&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;personalization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Personalization and Blame&lt;/span&gt;&lt;span class="sh"&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;h2&gt;
  
  
  Building the Tool
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Data Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;emotions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;automatic_thoughts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;distortions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;balanced_thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;new_emotion_rating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;situation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;situation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emotions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emotions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;automatic_thoughts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;automatic_thoughts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;distortions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distortions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;evidence_for&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evidence_for&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;evidence_against&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evidence_against&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;balanced_thought&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;balanced_thought&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;new_emotion_rating&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_emotion_rating&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;h3&gt;
  
  
  Step 2: Distortion Detector
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting. We can use simple pattern matching to &lt;strong&gt;suggest&lt;/strong&gt; which distortions might be present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thought&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;thought_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;thought&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(always|never|completely|totally|ruined|perfect|failure|success)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all_or_nothing&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(every time|nothing ever)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overgeneralization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(disaster|end of|over for|can.?t handle|unbearable|worst)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;magnification&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(should|must|have to|ought to)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;should_statements&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(i feel|it feels|feels like)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emotional_reasoning&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(i am a |i.m a |they are a )\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;labeling&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(they think|they know|everyone thinks|people will)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mind_reading&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\b(will go wrong|going to fail|this will)\b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thought_lower&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fortune_telling&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't therapy — it's a &lt;strong&gt;prompting tool&lt;/strong&gt;. The user confirms which distortions actually apply. But the pattern matching helps you learn to recognize them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Interactive CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_thought_record&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  CBT Thought Record Journal&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;situation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;What happened? (Describe the situation):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;What emotions did you feel? (rate 0-100)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Type emotion + rating, e.g. &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;anxiety 80&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. Empty line to finish.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emotions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;parts&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;automatic_thoughts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;What went through your mind?&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;automatic_thoughts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Possible cognitive distortions detected:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DISTORTIONS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;confirm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Which apply? (comma-separate, or all):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distortions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; \
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;DISTORTIONS&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evidence_for&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Evidence that supports the thought:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evidence_against&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Evidence against the thought:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;balanced_thought&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;A fairer, more balanced thought:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Re-rate your emotions now (0-100):&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emotion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emotions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;new_rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (was &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emotions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;): &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_rating&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_emotion_rating&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emotion&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_rating&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Storage + Pattern Review
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecordJournal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;thought_records.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ThoughtRecord&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;review_patterns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;all_distortions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;all_distortions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;distortions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]))&lt;/span&gt;

        &lt;span class="n"&gt;counts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_distortions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Your Most Common Distortions ---&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;counts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;x  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DISTORTIONS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Emotion Intensity Trend ---&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rating&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emotions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;new_emotion_rating&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;emo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rating&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Putting It Together
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;journal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ThoughtRecordJournal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CBT Thought Record Journal&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1. New thought record&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2. Review patterns&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3. Export to CSV&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Choice: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;run_thought_record&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Thought record saved.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;review_patterns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;I built a full CBT toolkit with 200+ free tools covering specific phobias, chronic illness, burnout, and more. The thought record is the foundation — once you can identify and reframe a cognitive distortion, you have a portable skill that works across every mental health challenge.&lt;/p&gt;

&lt;p&gt;The toolkit is &lt;strong&gt;free and open source&lt;/strong&gt;: &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;CBT Toolkit on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Science
&lt;/h2&gt;

&lt;p&gt;CBT has one of the strongest evidence bases in mental health:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anxiety disorders&lt;/strong&gt;: 50-60% symptom reduction (Hofmann et al., 2012 meta-analysis of 269 studies)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depression&lt;/strong&gt;: equivalent to SSRI medication in mild-moderate cases (Cuijpers et al., 2013)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insomnia&lt;/strong&gt;: 70-80% improvement (CBT-I specifically)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PTSD&lt;/strong&gt;: recommended first-line treatment by APA, NICE, and WHO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thought record targets &lt;strong&gt;cognitive restructuring&lt;/strong&gt; — the process of identifying, evaluating, and modifying distorted thinking patterns. It's the CBT equivalent of &lt;code&gt;git bisect&lt;/code&gt; for your mind: systematically narrowing down where the bug (distortion) is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond the CLI
&lt;/h2&gt;

&lt;p&gt;From here, you could extend this tool to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web app&lt;/strong&gt; (Flask/FastAPI) with a nice UI for the 7-column table&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile app&lt;/strong&gt; (React Native) with push reminders&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NLP-powered distortion detection&lt;/strong&gt; using a fine-tuned model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern visualization&lt;/strong&gt; with matplotlib showing emotion trends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export to PDF&lt;/strong&gt; for sharing with a therapist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core data model and distortion detector stay the same — only the interface changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Building mental health tools is deeply rewarding. You're not just writing code — you're creating something that could help someone understand their own mind a little better. And the thought record is the perfect starting point: it's structured, evidence-based, and translates naturally into a data model.&lt;/p&gt;

&lt;p&gt;If you found this helpful, check out the &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;CBT Toolkit&lt;/a&gt; — 200+ free CBT tools for specific conditions, all open source.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: This tool is for self-help and education, not a replacement for professional therapy. If you're struggling, please reach out to a licensed therapist or a crisis line (988 in the US).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>mentalhealth</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Build a Cognitive Distortion Detector in 60 Lines of Python</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Thu, 01 Oct 2026 01:02:03 +0000</pubDate>
      <link>https://dev.to/473185670/build-a-cognitive-distortion-detector-in-60-lines-of-python-h2e</link>
      <guid>https://dev.to/473185670/build-a-cognitive-distortion-detector-in-60-lines-of-python-h2e</guid>
      <description>&lt;p&gt;Cognitive distortions are the mental shortcuts that lie to us. "I failed once, so I'll always fail." "Everyone is judging me." "If it's not perfect, it's worthless."&lt;/p&gt;

&lt;p&gt;Aaron Beck identified 15+ of these patterns in the 1960s. They're the core target of Cognitive Behavioral Therapy (CBT). And they're surprisingly &lt;strong&gt;detectable with code&lt;/strong&gt; — because distortions have linguistic signatures.&lt;/p&gt;

&lt;p&gt;In this tutorial, I'll show you how to build a detector that identifies 10 cognitive distortions from a text input, in under 60 lines of Python. No ML model. No API key. Just pattern matching on the linguistic markers that therapists look for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10 Distortions
&lt;/h2&gt;

&lt;p&gt;Here are the patterns we'll detect, with their linguistic signatures:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distortion&lt;/th&gt;
&lt;th&gt;Signature&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All-or-Nothing&lt;/td&gt;
&lt;td&gt;"always", "never", "completely", "total"&lt;/td&gt;
&lt;td&gt;"I always mess up"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overgeneralization&lt;/td&gt;
&lt;td&gt;"always", "never", "every time"&lt;/td&gt;
&lt;td&gt;"Every time I try, I fail"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mental Filter&lt;/td&gt;
&lt;td&gt;"only", "just", "nothing but"&lt;/td&gt;
&lt;td&gt;"It was only the bad part"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disqualifying Positive&lt;/td&gt;
&lt;td&gt;"but", "doesn't count", "doesn't matter"&lt;/td&gt;
&lt;td&gt;"She said I did well, but she was just being nice"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mind Reading&lt;/td&gt;
&lt;td&gt;"they think", "everyone knows", "people are"&lt;/td&gt;
&lt;td&gt;"They think I'm stupid"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fortune Telling&lt;/td&gt;
&lt;td&gt;"will", "going to", "I'll never"&lt;/td&gt;
&lt;td&gt;"I'll never get this job"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magnification&lt;/td&gt;
&lt;td&gt;"terrible", "awful", "disaster", "worst"&lt;/td&gt;
&lt;td&gt;"This is a complete disaster"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emotional Reasoning&lt;/td&gt;
&lt;td&gt;"I feel", therefore it is&lt;/td&gt;
&lt;td&gt;"I feel guilty, so I must be guilty"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Should Statements&lt;/td&gt;
&lt;td&gt;"should", "must", "have to", "ought"&lt;/td&gt;
&lt;td&gt;"I should be better at this"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Labeling&lt;/td&gt;
&lt;td&gt;"I am a", "I'm a", "he is a"&lt;/td&gt;
&lt;td&gt;"I'm a failure"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;intervention&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="n"&gt;DISTORTIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All-or-Nothing Thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Seeing things in black-white categories&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(always|never|completely|totally|absolute)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Is it truly 100% one way? Look for the middle ground.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Overgeneralization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Viewing a single event as a never-ending pattern&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(everys*time|always|nevers*again)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;One event ≠ a pattern. What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the evidence for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;every time&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mental Filter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Focusing exclusively on negative aspects&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(only|just|nothings*but)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What positive aspects are you filtering out?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disqualifying Positive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rejecting positive experiences as if they don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(buts+(?:its+)?doesn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?ts+count|doesn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?ts+matter|justs+beings+nice)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can you accept the positive at face value?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mind Reading&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assuming you know what others are thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(theys+think|everyones+(?:think|know)|peoples+ares+thinking)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the evidence? Did they say it, or are you assuming?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fortune Telling&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Predicting negative outcomes as fact&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?lls+never|goings+tos+fail|wills+never)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Can you predict the future? What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s a more likely outcome?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Magnification&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exaggerating the importance of negatives&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(terrible|awful|disaster|catastrophe|worst|ends+ofs+thes+world)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How bad is it really, on a 1-10 scale?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Emotional Reasoning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assuming feelings reflect objective reality&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(Is+feels+w+.*?(?:so|therefore).*?(?:must|am|means))&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Feelings are data, but not proof. What would evidence say?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Should Statements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rigid rules about how things &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;should&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; be&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(should|must|haves+to|oughts+to|shouldn&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?t)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Replace &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;should&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; with &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prefer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;choose to&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. What happens?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;Distortion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Labeling&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Defining yourself by a single event&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?ms+as+w+|Is+ams+as+w+|hes+iss+as+w+|shes+iss+as+w+)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are not one event. Describe the behavior, not the person.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Detect cognitive distortions in text. Returns list of matches.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;text_lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;DISTORTIONS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text_lower&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distortion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;matched&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intervention&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;intervention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# one match per distortion is enough
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;thought&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I always mess up. They think I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m a failure. I should just quit.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;detect_distortions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thought&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;⚠️  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;distortion&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Matched: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;matched&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Reframe: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;intervention&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠️  All-or-Nothing Thinking
   Matched: ['always']
   Reframe: Is it truly 100% one way? Look for the middle ground.

⚠️  Mind Reading
   Matched: ['they think']
   Reframe: What's the evidence? Did they say it, or are you assuming?

⚠️  Should Statements
   Matched: ['should']
   Reframe: Replace 'should' with 'prefer' or 'choose to'. What happens?

⚠️  Labeling
   Matched: ["i'm a failure"]
   Reframe: You are not one event. Describe the behavior, not the person.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 distortions detected from one sentence. That's the power of linguistic pattern matching — distortions leave traces in language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;

&lt;p&gt;CBT therapists are trained to listen for these exact linguistic markers. The patterns above aren't arbitrary — they come from Beck's original taxonomy and decades of clinical literature. When someone says "I always fail," the word "always" is a &lt;strong&gt;linguistic marker&lt;/strong&gt; of all-or-nothing thinking. When someone says "they think I'm stupid," the phrase "they think" is a &lt;strong&gt;marker&lt;/strong&gt; of mind reading.&lt;/p&gt;

&lt;p&gt;You don't need a neural network for this. The distortions are &lt;strong&gt;rule-based&lt;/strong&gt; by definition — that's what makes them teachable to patients in therapy. If they were fuzzy ML predictions, CBT wouldn't work as a structured, manualized therapy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Further
&lt;/h2&gt;

&lt;p&gt;This 60-line detector is the core of a larger open-source toolkit I built — &lt;strong&gt;36 free CBT tools&lt;/strong&gt; covering procrastination patterns, attachment styles, safety behaviors, core beliefs, and more. The full toolkit includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A hosted API (free, no auth required)&lt;/li&gt;
&lt;li&gt;Browser-based tools (no install)&lt;/li&gt;
&lt;li&gt;PDF workbooks&lt;/li&gt;
&lt;li&gt;A Python package&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full cognitive distortion detector with 15 patterns, severity scoring, and JSON API output is at: &lt;a href="https://github.com/alexcColeDev/cbt-toolkit" rel="noopener noreferrer"&gt;github.com/alexcColeDev/cbt-toolkit&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;226 people have cloned this repo. 2 have starred it. 0 have paid for the optional $1 supporter tier.&lt;/p&gt;

&lt;p&gt;I'm sharing this not as a success story, but as a build-in-public data point. The toolkit works — the detector above catches real distortions. But "works" and "converts" are different problems. I'm still figuring out the second one.&lt;/p&gt;

&lt;p&gt;If you found this tutorial useful, the repo has 35 more tools like this. No signup, no email gate, no paywall. Just code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: python, tutorial, mentalhealth, opensource&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>mentalhealth</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Shipped a Broken Download Link in My Open-Source Repo for 2 Weeks</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Mon, 28 Sep 2026 12:17:23 +0000</pubDate>
      <link>https://dev.to/473185670/i-shipped-a-broken-download-link-in-my-open-source-repo-for-2-weeks-2g3p</link>
      <guid>https://dev.to/473185670/i-shipped-a-broken-download-link-in-my-open-source-repo-for-2-weeks-2g3p</guid>
      <description>&lt;h1&gt;
  
  
  I Shipped a Broken Download Link in My Open-Source Repo for 2 Weeks
&lt;/h1&gt;

&lt;p&gt;And I had no idea.&lt;/p&gt;

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

&lt;p&gt;I have an open-source mental health toolkit on GitHub — 36 free CBT (Cognitive Behavioral Therapy) tools, hosted on GitHub Pages. A few weeks ago, I transferred the repo from my old GitHub account &lt;code&gt;473185670&lt;/code&gt; to a proper named account &lt;code&gt;alexcoledev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;GitHub handled the transfer gracefully. The repo kept working. The Pages site kept serving. Clones kept coming. Everything looked fine.&lt;/p&gt;

&lt;p&gt;Everything was not fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;Two weeks later, I ran a SEO audit on all 47 of my GitHub Pages HTML files. The audit checked for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stale URLs pointing to the old &lt;code&gt;473185670.github.io&lt;/code&gt; domain&lt;/li&gt;
&lt;li&gt;Broken &lt;code&gt;og:image&lt;/code&gt; tags (the preview images shown when you share on Twitter/LinkedIn)&lt;/li&gt;
&lt;li&gt;Canonical URL mismatches&lt;/li&gt;
&lt;li&gt;JSON-LD structured data with wrong URLs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result: &lt;strong&gt;532 stale URLs&lt;/strong&gt; across 47 pages.&lt;/p&gt;

&lt;p&gt;532.&lt;/p&gt;

&lt;p&gt;Every single &lt;code&gt;og:image&lt;/code&gt; tag. Every canonical URL. Every BreadcrumbList JSON-LD entry. All pointing to a domain that 301-redirected to the new one — so they &lt;em&gt;worked&lt;/em&gt;, but they weren't &lt;em&gt;correct&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Mattered
&lt;/h2&gt;

&lt;p&gt;"It still redirects, so who cares?" — me, before I understood the problem.&lt;/p&gt;

&lt;p&gt;Here's who cares:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Search engines.&lt;/strong&gt; Google sees &lt;code&gt;473185670.github.io/cbt-toolkit/seo/cbt-for-anxiety.html&lt;/code&gt; and &lt;code&gt;alexcoledev.github.io/cbt-toolkit/seo/cbt-for-anxiety.html&lt;/code&gt; as two different URLs with the same content. That is duplicate content. Even with a 301 redirect, it is not ideal — Google has to follow the redirect, and some SEO authority is lost in the hop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Social media crawlers.&lt;/strong&gt; When someone shared my tool on Twitter, the &lt;code&gt;twitter:image&lt;/code&gt; tag pointed to &lt;code&gt;https://473185670.github.io/cbt-toolkit/pinterest/pin1_cbt_benefits.png&lt;/code&gt;. Twitter's crawler followed the redirect and loaded the image — but slower. Sometimes it timed out. The preview card showed a broken image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Structured data validators.&lt;/strong&gt; Google's Rich Results Test flagged my BreadcrumbList JSON-LD because the &lt;code&gt;item&lt;/code&gt; URLs redirected. Schema.org validators want the final URL, not a redirect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Me, two weeks later.&lt;/strong&gt; I wondered why my Bing ranking had dropped. It had not dropped because of the content — it had dropped because Bing was confused about which URL was canonical.&lt;/p&gt;

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

&lt;p&gt;One commit. 532 URL replacements across 47 files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;473185670.github.io&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;alexcoledev.github.io&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.html&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;seo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;fixed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fixed&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Fixed &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;532 stale URLs to 0 stale URLs. Canonical URLs correct. &lt;code&gt;og:image&lt;/code&gt; pointing to the right domain. BreadcrumbList JSON-LD valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Should Have Done
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Use a config file for the base URL.&lt;/strong&gt; Instead of hardcoding &lt;code&gt;473185670.github.io&lt;/code&gt; in 47 HTML files, I should have used a single config and a build step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Run the audit before the transfer.&lt;/strong&gt; I should have searched for all occurrences of the old domain &lt;em&gt;before&lt;/em&gt; transferring, not two weeks after.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use relative URLs where possible.&lt;/strong&gt; For internal links, &lt;code&gt;../img/pin1.png&lt;/code&gt; does not break when you transfer. Absolute URLs do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Set up a redirect check in CI.&lt;/strong&gt; A simple GitHub Action that runs &lt;code&gt;grep -r '473185670' seo/&lt;/code&gt; and fails if it finds anything. I now have this.&lt;/p&gt;

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

&lt;p&gt;Repo transfers are not set it and forget it. GitHub redirects the repo, but every hardcoded URL in your Pages site, every &lt;code&gt;og:image&lt;/code&gt; tag, every canonical URL, every JSON-LD entry — they all still point to the old domain. They &lt;em&gt;work&lt;/em&gt; (301 redirect), but they are not &lt;em&gt;correct&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;532 stale URLs. Two weeks. Zero clue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the audit. Use config. Use relative URLs. Check your &lt;code&gt;og:image&lt;/code&gt; tags after any domain change.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ If this helped, star the repo
&lt;/h2&gt;

&lt;p&gt;If this post saved you an audit, &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;star &lt;strong&gt;cbt-toolkit&lt;/strong&gt; on GitHub&lt;/a&gt;. It helps others find these tools.&lt;/p&gt;




&lt;p&gt;React with ❤️ if this helped — it boosts this post in the feed and helps others find it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;36 free CBT mental health tools&lt;/a&gt; — no signup, no tracking, no paywall. This post is part of an honest build-in-public series about what goes wrong when you ship things.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>seo</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Got 36 Free CBT Tools to #1 on Bing with 0 Budget</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Mon, 28 Sep 2026 10:07:49 +0000</pubDate>
      <link>https://dev.to/473185670/how-i-got-36-free-cbt-tools-to-1-on-bing-with-0-budget-3e94</link>
      <guid>https://dev.to/473185670/how-i-got-36-free-cbt-tools-to-1-on-bing-with-0-budget-3e94</guid>
      <description>&lt;p&gt;I spent 30 days building 36 free cognitive behavioral therapy tools. Then I spent another 10 days doing SEO with zero budget. Here's what actually worked.&lt;/p&gt;

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

&lt;p&gt;36 tools. 8 interactive online, 28 in a downloadable ZIP. All vanilla JS, no framework, no backend, no signup. Hosted on GitHub Pages (free).&lt;/p&gt;

&lt;p&gt;The tools work. The question was: &lt;strong&gt;how does anyone find them?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried First (And What Failed)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. GitHub Discussions
&lt;/h3&gt;

&lt;p&gt;I created 10 GitHub Discussions asking the community what tools they wanted. &lt;strong&gt;0 responses.&lt;/strong&gt; All 10 discussions sit at 0 comments.&lt;/p&gt;

&lt;p&gt;GitHub Discussions are not a distribution channel. They're a support channel for repos that already have users.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reddit
&lt;/h3&gt;

&lt;p&gt;Posted in r/mentalhealth and r/selfhosted. Account got shadowbanned within 48 hours. Reddit's spam filter is aggressive against new accounts posting links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access does not equal visibility.&lt;/strong&gt; Your account works. Your posts appear in your profile. But they're silently filtered from the feeds where anyone would see them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hashnode and Medium
&lt;/h3&gt;

&lt;p&gt;Both Cloudflare-blocked my API calls. Hashnode returned 403. Medium returned 403. I could read the sites in a browser, but the publish APIs were blocked.&lt;/p&gt;

&lt;p&gt;If you're building an automated publishing pipeline, test the API before you write the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Worked: GitHub Pages SEO
&lt;/h2&gt;

&lt;p&gt;GitHub Pages gives you a free domain (&lt;code&gt;username.github.io/repo&lt;/code&gt;), free hosting, and Google indexes it. The bottleneck wasn't building tools — it was making them findable.&lt;/p&gt;

&lt;p&gt;Here's the 10-day sequence that got me to #1 on Bing for several long-tail terms:&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1-2: One SEO page per tool
&lt;/h3&gt;

&lt;p&gt;I created 47 standalone SEO pages — one per tool, plus hub pages. Each page has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; tag under 60 chars&lt;/li&gt;
&lt;li&gt;A meta description under 155 chars&lt;/li&gt;
&lt;li&gt;A canonical URL&lt;/li&gt;
&lt;li&gt;Open Graph tags for social sharing&lt;/li&gt;
&lt;li&gt;Twitter Card tags&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Day 3-4: Internal linking
&lt;/h3&gt;

&lt;p&gt;Every tool page links to 2-3 related tools. 152 internal links total. This helps Google understand the site structure and distributes page authority.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 5: Sitemap.xml
&lt;/h3&gt;

&lt;p&gt;51 URLs in &lt;code&gt;sitemap.xml&lt;/code&gt;. Submitted to Google Search Console and Bing Webmaster Tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 6: robots.txt
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: *
&lt;span class="n"&gt;Allow&lt;/span&gt;: /
&lt;span class="n"&gt;Sitemap&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;alexcoledev&lt;/span&gt;.&lt;span class="n"&gt;github&lt;/span&gt;.&lt;span class="n"&gt;io&lt;/span&gt;/&lt;span class="n"&gt;cbt&lt;/span&gt;-&lt;span class="n"&gt;toolkit&lt;/span&gt;/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;span class="n"&gt;Crawl&lt;/span&gt;-&lt;span class="n"&gt;delay&lt;/span&gt;: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Day 7-8: Structured data (JSON-LD)
&lt;/h3&gt;

&lt;p&gt;This is the part that actually moves the needle for rich results.&lt;/p&gt;

&lt;p&gt;Every page got &lt;strong&gt;5 types of JSON-LD&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CollectionPage&lt;/strong&gt; — tells Google this is a collection of tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ItemList&lt;/strong&gt; — structured list of the 8 interactive tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQPage&lt;/strong&gt; — 247 FAQ questions across 47 pages (5+ per page). FAQ rich results show directly in search results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SoftwareApplication&lt;/strong&gt; — marks each tool as a free HealthApplication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organization&lt;/strong&gt; — Knowledge Graph eligibility with &lt;code&gt;sameAs&lt;/code&gt; links to GitHub, Dev.to, and Substack&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Day 9: HowTo schema
&lt;/h3&gt;

&lt;p&gt;3 how-to pages got &lt;strong&gt;HowTo JSON-LD&lt;/strong&gt; with 21 total &lt;code&gt;HowToStep&lt;/code&gt; entries. HowTo rich results show step-by-step instructions directly in search results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 10: Organization Knowledge Graph (just shipped)
&lt;/h3&gt;

&lt;p&gt;Added Organization JSON-LD with &lt;code&gt;sameAs&lt;/code&gt; links to GitHub, Dev.to, and Substack. This makes the project eligible for Google's Knowledge Graph — the panel that appears on the right side of search results for known entities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&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;Before SEO&lt;/th&gt;
&lt;th&gt;After 10 days&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stars&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clones (14d)&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;214&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZIP downloads&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bing ranking&lt;/td&gt;
&lt;td&gt;unindexed&lt;/td&gt;
&lt;td&gt;#1 for several long-tail terms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;214 cloners. 2 stars. &lt;strong&gt;The conversion problem is real.&lt;/strong&gt; People clone the repo but don't star it. They download the ZIP but don't come back.&lt;/p&gt;

&lt;p&gt;But 214 cloners means 214 people found the tools. That's 214 more than before SEO.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. SEO is free distribution
&lt;/h3&gt;

&lt;p&gt;GitHub Pages + JSON-LD + sitemap costs $0. The only cost is time — about 10 days of evenings.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Structured data beats content quality for discovery
&lt;/h3&gt;

&lt;p&gt;FAQ rich results show your answers directly in search results. Users click through less, but the ones who do are high-intent. HowTo rich results show your steps inline. These are the features that get you into the search result real estate that plain content can't.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The conversion funnel is: search then clone then (maybe) star
&lt;/h3&gt;

&lt;p&gt;214 cloners and 2 stars means the bottleneck isn't discovery anymore. It's the README. The repo gets found, gets cloned, but the README doesn't convert cloners into stargazers.&lt;/p&gt;

&lt;p&gt;That's the next problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Bing is easier than Google for new sites
&lt;/h3&gt;

&lt;p&gt;Google took weeks to index. Bing indexed within days and ranked several pages #1 for long-tail terms. If you're launching a new static site, submit to Bing Webmaster Tools first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools
&lt;/h2&gt;

&lt;p&gt;All 36 tools are free, no signup, run in your browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/seo/free-cbt-thought-record-tool.html" rel="noopener noreferrer"&gt;CBT Thought Record Tool&lt;/a&gt;&lt;/strong&gt; — 7-step interactive thought record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/seo/cognitive-distortion-checker.html" rel="noopener noreferrer"&gt;Cognitive Distortion Checker&lt;/a&gt;&lt;/strong&gt; — paste a thought, see which distortions apply&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/seo/cbt-for-anxiety.html" rel="noopener noreferrer"&gt;CBT for Anxiety + Grounding&lt;/a&gt;&lt;/strong&gt; — 6 techniques + 5-4-3-2-1 grounding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/seo/cbt-for-depression.html" rel="noopener noreferrer"&gt;CBT for Depression&lt;/a&gt;&lt;/strong&gt; — behavioral activation scheduler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/seo/cbt-mood-tracker.html" rel="noopener noreferrer"&gt;Mood Tracker&lt;/a&gt;&lt;/strong&gt; — log mood, view trends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus 31 more. Full list at &lt;strong&gt;&lt;a href="https://alexcoledev.github.io/cbt-toolkit/" rel="noopener noreferrer"&gt;alexcoledev.github.io/cbt-toolkit&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;You don't need a marketing budget. You need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A free host (GitHub Pages)&lt;/li&gt;
&lt;li&gt;One SEO page per tool&lt;/li&gt;
&lt;li&gt;JSON-LD structured data (FAQ + HowTo + SoftwareApplication + Organization)&lt;/li&gt;
&lt;li&gt;A sitemap&lt;/li&gt;
&lt;li&gt;Patience (10 days)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The tools were the easy part. Making them findable was the real work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;All 36 tools are open source: &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;github.com/alexcoledev/cbt-toolkit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ If this helped, star the repo
&lt;/h2&gt;

&lt;p&gt;If you found this useful, please &lt;strong&gt;star &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;cbt-toolkit on GitHub&lt;/a&gt;&lt;/strong&gt;** ⭐&lt;/p&gt;

&lt;p&gt;It helps others discover these 36 free CBT mental health tools.&lt;/p&gt;

&lt;p&gt;React with ❤️ if this helped — it boosts this post in the feed and helps others find it.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>v1.7.0 Release: 36 Free CBT Tools, Now One-Click Download</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sun, 27 Sep 2026 11:03:16 +0000</pubDate>
      <link>https://dev.to/473185670/v170-release-36-free-cbt-tools-now-one-click-download-1fjj</link>
      <guid>https://dev.to/473185670/v170-release-36-free-cbt-tools-now-one-click-download-1fjj</guid>
      <description>&lt;p&gt;&lt;strong&gt;v1.7.0 is live.&lt;/strong&gt; &lt;a href="https://github.com/alexcoledev/cbt-toolkit/releases/tag/v1.7.0" rel="noopener noreferrer"&gt;GitHub Release →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the box
&lt;/h2&gt;

&lt;p&gt;36 free, interactive, privacy-first CBT (Cognitive Behavioral Therapy) tools — no signup, no backend, no tracking. Just open the HTML file in a browser.&lt;/p&gt;

&lt;p&gt;The toolkit covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anxiety&lt;/strong&gt; — generalized anxiety, social anxiety, panic attacks, health anxiety, relationship anxiety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mood&lt;/strong&gt; — depression, burnout, low self-esteem, shame, grief &amp;amp; loss&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior&lt;/strong&gt; — procrastination, perfectionism, OCD, ADHD, anger, body image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trauma&lt;/strong&gt; — PTSD, intrusive thoughts, imposter syndrome&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech-specific&lt;/strong&gt; — code review anxiety, debugging stress, incident response stress, on-call anxiety, production catastrophizing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus standalone detectors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cognitive Distortion Detector (15 distortions)&lt;/li&gt;
&lt;li&gt;Core Belief Detector&lt;/li&gt;
&lt;li&gt;Safety Behavior Detector&lt;/li&gt;
&lt;li&gt;CBT Thought Record&lt;/li&gt;
&lt;li&gt;Mood Tracker&lt;/li&gt;
&lt;li&gt;Price Discrimination Detector&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's new in v1.7.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One-click download
&lt;/h3&gt;

&lt;p&gt;The release now includes a &lt;strong&gt;ZIP asset&lt;/strong&gt; — . Download it, unzip, open . No  needed.&lt;/p&gt;

&lt;p&gt;This matters because 214 people cloned the repo but only 2 starred it. The clone-to-star gap told me something: people want the &lt;em&gt;tools&lt;/em&gt;, not the &lt;em&gt;repo&lt;/em&gt;. So now the tools are one click away.&lt;/p&gt;

&lt;h3&gt;
  
  
  $1 supporter option
&lt;/h3&gt;

&lt;p&gt;I added a &lt;a href="https://4043969836017.gumroad.com/l/supporter" rel="noopener noreferrer"&gt;$1 Gumroad supporter page&lt;/a&gt;. Not a paywall — every tool remains free forever. It's for the person who used a tool, found it helpful, and wants to say thanks with a dollar.&lt;/p&gt;

&lt;p&gt;This is the first unblocked revenue mechanism after trying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RapidAPI (pricing feature disabled)&lt;/li&gt;
&lt;li&gt;Stripe (requires business account setup)&lt;/li&gt;
&lt;li&gt;npm (needs publisher auth)&lt;/li&gt;
&lt;li&gt;aitopia.ai agent marketplace (3 agents in review for 286+ hours)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;$1 Gumroad works because the account already exists and the API is open.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free API still live
&lt;/h3&gt;

&lt;p&gt;The CBT Thought Analyzer API is live on Render:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://cbt-thought-analyzer.onrender.com/analyze   &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt;   &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "I always mess everything up"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns detected cognitive distortions with CBT reframes. Free, no auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Revenue: $0.&lt;/strong&gt; 214 cloners, 2 stars, 0 sales.&lt;/p&gt;

&lt;p&gt;I'm not going to pretend the $1 supporter link will work. It might not. Developer tooling audiences are the hardest to monetize — they expect free, they value self-reliance, and a dollar feels like more friction than a star.&lt;/p&gt;

&lt;p&gt;But the experiment is running. The release notification went out to watchers. The repo description has the supporter link. The README has it. This Dev.to post has it. Four touchpoints, one $1 ask.&lt;/p&gt;

&lt;p&gt;If you cloned the toolkit and used a tool — even one — I'd love to know which one. &lt;a href="https://github.com/alexcoledev/cbt-toolkit/discussions" rel="noopener noreferrer"&gt;Discussions are open&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Release&lt;/strong&gt;: &lt;a href="https://github.com/alexcoledev/cbt-toolkit/releases/tag/v1.7.0" rel="noopener noreferrer"&gt;github.com/alexcoledev/cbt-toolkit/releases/tag/v1.7.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;github.com/alexcoledev/cbt-toolkit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free API&lt;/strong&gt;: &lt;a href="https://cbt-thought-analyzer.onrender.com" rel="noopener noreferrer"&gt;cbt-thought-analyzer.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$1 Supporter&lt;/strong&gt; (optional): &lt;a href="https://4043969836017.gumroad.com/l/supporter" rel="noopener noreferrer"&gt;4043969836017.gumroad.com/l/supporter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;If this was useful, the toolkit is free. If you want to support it, &lt;a href="https://4043969836017.gumroad.com/l/supporter" rel="noopener noreferrer"&gt;$1 here&lt;/a&gt;. No pressure.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>release</category>
      <category>javascript</category>
      <category>mentalhealth</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Added a $1 Supporter Option to My Open-Source Mental Health Toolkit. Here's What Happened.</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sun, 27 Sep 2026 09:07:41 +0000</pubDate>
      <link>https://dev.to/473185670/i-added-a-1-supporter-option-to-my-open-source-mental-health-toolkit-heres-what-happened-g58</link>
      <guid>https://dev.to/473185670/i-added-a-1-supporter-option-to-my-open-source-mental-health-toolkit-heres-what-happened-g58</guid>
      <description>&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I've been building &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;cbt-toolkit&lt;/a&gt; - 36 free mental health tools based on Cognitive Behavioral Therapy - for about 30 days now. The toolkit is open-source. Everything is free. No paywalls, no freemium, no "upgrade to pro."&lt;/p&gt;

&lt;p&gt;A few days ago, 157 people had cloned the repo. 2 had starred it. 0 had paid for anything (because there was nothing to pay for).&lt;/p&gt;

&lt;p&gt;I started wondering: &lt;strong&gt;what would happen if I added a $1 supporter option?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a subscription. Not a "buy me a coffee" button. Just a single Gumroad product: &lt;a href="https://4043969836017.gumroad.com/l/supporter" rel="noopener noreferrer"&gt;Support the CBT Toolkit for $1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hypothesis
&lt;/h2&gt;

&lt;p&gt;The hypothesis was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If 157 people found enough value to clone the repo, at least one might be willing to pay $1 to support continued development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the lowest-friction monetization test possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$1&lt;/strong&gt; - less than a coffee&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account needed&lt;/strong&gt; - Gumroad handles checkout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No recurring charge&lt;/strong&gt; - one-time payment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No gate on the tools&lt;/strong&gt; - everything stays free&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The result (so far)
&lt;/h2&gt;

&lt;p&gt;I added the $1 product 3 hours ago. I also added a small section to the README:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Support the Toolkit&lt;/span&gt;

If these tools helped you, consider &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;supporting for $1&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://4043969836017.gumroad.com/l/supporter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;.
Every dollar goes toward keeping the tools free and ad-free.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Current stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub clones: 157&lt;/li&gt;
&lt;li&gt;GitHub stars: 2&lt;/li&gt;
&lt;li&gt;$1 supporter purchases: &lt;strong&gt;0&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Gumroad product views: &lt;strong&gt;0&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero. Not even a view.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think is happening
&lt;/h2&gt;

&lt;p&gt;I have a few hypotheses:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The CTA isn't visible enough.&lt;/strong&gt; The README section is at the bottom. Most cloners probably never scroll that far.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Cloning is not commitment.&lt;/strong&gt; People clone repos for many reasons - to read the code, to fork it, to learn from it, to never look at it again. Cloning is a low-friction action. Paying $1 is a higher-friction action, even at $1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The audience is developers, not buyers.&lt;/strong&gt; Developers who clone mental health tools are interested in the &lt;em&gt;code&lt;/em&gt;, not necessarily in supporting the &lt;em&gt;project&lt;/em&gt;. They might build their own version, or use it as reference, or never actually run it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. $1 is still a psychological barrier.&lt;/strong&gt; Even $1 requires: opening Gumroad, entering payment info, completing checkout. That's 3-4 steps. Free is 0 steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm trying next
&lt;/h2&gt;

&lt;p&gt;I'm going to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Move the CTA higher&lt;/strong&gt; in the README (above the fold)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write more build-in-public content&lt;/strong&gt; about the experiment - transparency as a feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track the 24h data&lt;/strong&gt; and report back honestly&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;The real question isn't "will anyone pay $1?" The real question is: &lt;strong&gt;what's the gap between "found this useful enough to clone" and "found this useful enough to pay $1 for"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That gap is where the interesting work is. Understanding it tells you something about open-source sustainability, about the difference between &lt;em&gt;use value&lt;/em&gt; and &lt;em&gt;exchange value&lt;/em&gt;, about what "support" actually means.&lt;/p&gt;

&lt;p&gt;I'll follow up in 24 hours with honest data.&lt;/p&gt;

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

&lt;p&gt;If you're curious about the toolkit, here's a working example - the Cognitive Distortion Detector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://cbt-thought-analyzer.onrender.com/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "I always mess everything up. Nothing ever goes right for me."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"distortions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"overgeneralization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all-or-nothing thinking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mental filter"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's free. It'll stay free. The $1 is optional.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of my build-in-public series on open-source sustainability. Follow along if you're interested in the honest data.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ If this helped, star the repo
&lt;/h2&gt;

&lt;p&gt;If you found this useful, please &lt;strong&gt;star &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;cbt-toolkit on GitHub&lt;/a&gt;&lt;/strong&gt;** ⭐&lt;/p&gt;

&lt;p&gt;It helps others discover these 36 free CBT mental health tools.&lt;/p&gt;

&lt;p&gt;React with ❤️ if this helped — it boosts this post in the feed and helps others find it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related Articles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/473185670/how-i-got-36-free-cbt-tools-to-1-on-bing-with-0-budget-3e94"&gt;How I Got 36 Free CBT Tools to #1 on Bing with 0 Budget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/473185670/i-submitted-3-ai-agents-to-a-marketplace-258-hours-later-still-waiting-lf8"&gt;I Submitted 3 AI Agents to a Marketplace. 258 Hours Later, Still Waiting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>mentalhealth</category>
      <category>buildinpublic</category>
      <category>showdev</category>
    </item>
    <item>
      <title>5 Anti-Patterns I Fell Into Building 36 Mental Health Tools</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sun, 27 Sep 2026 05:06:25 +0000</pubDate>
      <link>https://dev.to/473185670/5-anti-patterns-i-fell-into-building-36-mental-health-tools-488k</link>
      <guid>https://dev.to/473185670/5-anti-patterns-i-fell-into-building-36-mental-health-tools-488k</guid>
      <description>&lt;p&gt;Over 30 days, I built 36 free cognitive behavioral therapy (CBT) tools with vanilla JavaScript. No frameworks, no backend, no dependencies. Every tool runs entirely in the browser.&lt;/p&gt;

&lt;p&gt;The result: 157 GitHub cloners, 2 stars, 445 clones, $0 revenue.&lt;/p&gt;

&lt;p&gt;Here are the 5 anti-patterns I fell into — so you do not have to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Pattern 1: Building Before Validating Audience
&lt;/h2&gt;

&lt;p&gt;I built 36 tools before asking anyone if they wanted them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt; The tools are clinically sound (CBT is evidence-based, each tool maps to a specific cognitive distortion or behavioral pattern). But "clinically sound" and "something people will use" are different axes. I optimized for the first and assumed the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Validate with ONE tool first. Ship it. Watch what people do with it. Then build the second. I built 36 in parallel because the pattern was satisfying to execute — not because anyone asked for 36 tools.&lt;/p&gt;

&lt;p&gt;The correct sequence is the reverse: market one tool, learn what resonates, build the next based on feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Pattern 2: Optimizing for Completeness Over Distribution
&lt;/h2&gt;

&lt;p&gt;I spent 30 days achieving "full coverage" — 24 CBT-for-X tools (OCD, ADHD, burnout, imposter syndrome, panic attacks, PTSD, shame, anger, body image, health anxiety, test anxiety, procrastination, perfectionism, social anxiety, insomnia, grief, low self-esteem, emotional drain, people-pleasing, rumination, attachment, cognitive distortions, core beliefs, safety behaviors) plus 24 niche funnels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt; The content layer is comprehensive. The distribution layer has 92 Dev.to articles, 1 Substack subscriber, 0 paying customers. I built a library and forgot to build a readership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; A complete product that nobody knows about has the same market impact as no product. I should have spent 20 days building and 10 days distributing — not 30 days building and 0 days distributing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Completeness feels like progress. Distribution feels like risk. Your brain will always prefer the former.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Anti-Pattern 3: Treating Open Source as Distribution
&lt;/h2&gt;

&lt;p&gt;MIT license is not a marketing strategy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt; I published to GitHub with a clean README, MIT license, issue templates, CI workflow. 157 people cloned it. 2 starred it. The gap between "cloned" and "starred" is the gap between "useful" and "valuable enough to publicly endorse."&lt;/p&gt;

&lt;p&gt;The 155 who cloned but did not star are not ungrateful — they are behaving exactly as cognitive behavioral therapy predicts. This is the &lt;strong&gt;action-intention gap&lt;/strong&gt;: people intend to star (it costs nothing), but the action requires switching context, finding the repo, clicking a button. The friction is tiny but nonzero, and nonzero friction is enough.&lt;/p&gt;

&lt;p&gt;I wrote a whole article analyzing this through a CBT lens. It is the most meta thing I have ever done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; A starred repo is a social signal. Ask for it directly. I added a CTA at the top of my README — "If this helped you, please star this repo" — and stars went from 1 to 2. That is a 100% increase. (It is also still 2.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Pattern 4: Pursuing Every Platform Simultaneously
&lt;/h2&gt;

&lt;p&gt;I created drafts for 28 platforms: Dev.to, Substack, Medium, LinkedIn, Hacker News, Product Hunt, Zhihu, Weibo, Xiaohongshu, Bilibili, Douban, Toutiao, Reddit, Threads, Mastodon, Bluesky, Nostr, Quora, Hashnode, TikTok, YouTube, Blogger, Jianshu, Tumblr, Pinterest, Instagram, X/Twitter, IndieHackers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt; I published on 3. The other 25 drafts sit in a folder, each tailored to its platform's audience and format. I spent days writing platform-specific versions of the same content for platforms I never launched on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; Breadth without depth equals zero engagement everywhere. I should have picked 2 platforms, published consistently for 30 days, measured, then expanded. Instead, I spread preparation across 28 and execution across 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Pattern 5: Monetization After Audience, Not Alongside
&lt;/h2&gt;

&lt;p&gt;I waited for an audience before building monetization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt; I now have 157 cloners and no way to convert them to revenue. The hosted API is free. The Gumroad products have 0 views. The RapidAPI listing has 1 free subscriber. I built the audience funnel and the revenue funnel as sequential phases — audience first, then monetization.&lt;/p&gt;

&lt;p&gt;The correct approach is parallel: build the revenue path FIRST, so when traffic arrives, it can convert. I should have set up Stripe checkout on day 1, added a paid API tier on day 2, then spent 28 days driving traffic to a page that could actually capture value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I am now:&lt;/strong&gt; RapidAPI pricing is blocked at the platform level. The agent marketplace (aitopia.ai) has 3 agents in review for 275+ hours with no reviewer assigned. I am now building an independent Stripe + API key system on my own Render endpoint — the only unblocked direct revenue path.&lt;/p&gt;

&lt;p&gt;It would have been easier to build this on day 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Meta Anti-Pattern
&lt;/h2&gt;

&lt;p&gt;All 5 anti-patterns share a root cause: &lt;strong&gt;I optimized for what felt productive instead of what moved the needle.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building tools feels productive. Writing READMEs feels productive. Creating platform drafts feels productive. None of these are wrong — but they are all upstream of the actual bottleneck, which is distribution and conversion.&lt;/p&gt;

&lt;p&gt;CBT has a name for this: &lt;strong&gt;productive procrastination&lt;/strong&gt;. You do real, useful work to avoid the work that feels risky — asking people to pay, promoting your work, facing rejection.&lt;/p&gt;

&lt;p&gt;I built 36 mental health tools. The irony is that I needed CBT to understand why I built 36 instead of shipping 1 and selling it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What I am doing now:&lt;/strong&gt; Building the revenue path (Stripe + API keys on the hosted endpoint), publishing consistently on 2 platforms instead of 28, and asking 157 cloners directly what they would pay for.&lt;/p&gt;

&lt;p&gt;The tools are free. The lessons cost me 30 days. You can have both.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;CBT Toolkit (36 free tools, vanilla JS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cbt-thought-analyzer.onrender.com" rel="noopener noreferrer"&gt;Hosted CBT Analyzer API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Try the API: &lt;code&gt;curl -X POST https://cbt-thought-analyzer.onrender.com/analyze -H "Content-Type: application/json" -d '{"text":"I always mess everything up"}'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>157 People Cloned My Repo. 2 Starred It. Here is the Cognitive Bias Explanation.</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sun, 27 Sep 2026 04:19:14 +0000</pubDate>
      <link>https://dev.to/473185670/157-people-cloned-my-repo-2-starred-it-here-is-the-cognitive-bias-explanation-4n6</link>
      <guid>https://dev.to/473185670/157-people-cloned-my-repo-2-starred-it-here-is-the-cognitive-bias-explanation-4n6</guid>
      <description>&lt;h2&gt;
  
  
  The Data
&lt;/h2&gt;

&lt;p&gt;I have a GitHub repo with CBT (Cognitive Behavioral Therapy) mental health tools. As of today:&lt;/p&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;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stars&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forks&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clones (unique)&lt;/td&gt;
&lt;td&gt;157&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discussions&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;157 people cloned the repo. Only 2 starred it.&lt;/strong&gt; That is a 1.3% star-to-clone ratio.&lt;/p&gt;

&lt;p&gt;This is not a complaint. This is a data point — and it maps directly onto well-documented cognitive biases that CBT itself addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias 1: Loss Aversion (Kahneman &amp;amp; Tversky, 1979)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The bias:&lt;/strong&gt; People feel losses roughly 2x more intensely than equivalent gains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it applies:&lt;/strong&gt; Starring a repo is a public action (visible on your profile). Cloning is private. The perceived "loss" of social visibility (what if people judge my stars? what if the repo turns out to be bad and I look foolish?) outweighs the perceived gain (supporting a creator, bookmarking).&lt;/p&gt;

&lt;p&gt;The clone is the safe, private action. The star is the risky, public action. Loss aversion predicts exactly this pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias 2: Default Bias / Status Quo Bias (Samuelson &amp;amp; Zeckhauser, 1988)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The bias:&lt;/strong&gt; People disproportionately choose the default option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it applies:&lt;/strong&gt; When you clone a repo, GitHub does NOT auto-star it. The default state after cloning is "not starred." Changing that default requires an additional action. Most people don't take it.&lt;/p&gt;

&lt;p&gt;This is why GitHub's "You cloned this repo — would you like to star it?" prompt (which they tested and removed) would have dramatically increased star counts. It would have made starring the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias 3: The Bystander Effect (Darley &amp;amp; Latane, 1968)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The bias:&lt;/strong&gt; The more people present, the less likely any individual is to act.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it applies:&lt;/strong&gt; 157 cloners see a repo with 2 stars. Each thinks "someone else will star it" or "it already has stars, my star doesn't matter." The diffusion of responsibility is proportional to the number of cloners.&lt;/p&gt;

&lt;p&gt;Counter-intuitively, a repo with 0 stars might get MORE stars than a repo with 2 — because the first star feels impactful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias 4: Action-Intention Gap (Gollwitzer, 1999)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The bias:&lt;/strong&gt; People form intentions ("I should star this later") but never execute them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it applies:&lt;/strong&gt; Cloning is immediate (you need the code now). Starring is deferred ("I'll star it after I try it"). The intention-to-action gap grows with time. 157 people cloned with the intention to evaluate later. Most never returned.&lt;/p&gt;

&lt;p&gt;CBT addresses this with &lt;strong&gt;implementation intentions&lt;/strong&gt; — "If I clone a repo, then I will star it immediately" — which Gollwitzer showed increases follow-through by 2-3x.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CBT Toolkit Analyzes This
&lt;/h2&gt;

&lt;p&gt;Here is the meta part: the CBT toolkit in the repo includes a &lt;strong&gt;cognitive distortion detector&lt;/strong&gt; that identifies these exact thought patterns in text. If I fed "I'll star it later, I don't want to look foolish" into the detector, it would flag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimization&lt;/strong&gt; ("my one star doesn't matter")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mind Reading&lt;/strong&gt; ("people will judge my stars")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Should Statements&lt;/strong&gt; ("I should star it later")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All-or-Nothing Thinking&lt;/strong&gt; ("if I can't evaluate it fully, I won't star it")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tools analyze the behavior of the people who clone but don't star. That is the most on-brand dogfooding I have ever done.&lt;/p&gt;

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

&lt;p&gt;The CBT Thought Analyzer API is live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://cbt-thought-analyzer.onrender.com/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text":"I will star it later, my one star probably does not matter anyway"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns the detected distortions with CBT-based reframing suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Am Doing About It
&lt;/h2&gt;

&lt;p&gt;Instead of complaining about the star-to-clone ratio, I applied the CBT principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Implementation intention&lt;/strong&gt; (Gollwitzer): I added a "Star this repo if it helped you" call-to-action in the README. Make the action explicit and immediate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default bias counter&lt;/strong&gt;: I created GitHub Discussions (lower-friction than issues) so the default action after cloning is "engage" not "leave silently."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bystander effect counter&lt;/strong&gt;: I showcase the 2 stars prominently in the README. Visible early adoption reduces diffusion of responsibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loss aversion counter&lt;/strong&gt;: I made the repo MIT-licensed and added a clear "what this is NOT" section. Reducing perceived risk of starring.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I do not know if any of this will work. The 157 cloners might just be bots, scrapers, or people who cloned by accident. The 2 stars might be from friends doing me a favor.&lt;/p&gt;

&lt;p&gt;But the analysis itself — applying cognitive bias research to open-source engagement data — is exactly the kind of cross-domain thinking that CBT encourages. And the toolkit I built to detect these biases in text is free, open-source, and has a live API.&lt;/p&gt;

&lt;p&gt;If you are one of the 155 who cloned but did not star: no judgment. I understand the biases. But if you found this analysis useful, the star button is right there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is not therapy. If you are struggling with mental health, please reach out to a licensed professional. The CBT toolkit is an educational tool, not a substitute for professional care.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>psychology</category>
      <category>opensource</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why I Open-Sourced 36 Mental Health Tools Instead of Putting Them Behind a Paywall</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sat, 26 Sep 2026 16:26:48 +0000</pubDate>
      <link>https://dev.to/473185670/why-i-open-sourced-36-mental-health-tools-instead-of-putting-them-behind-a-paywall-3p6h</link>
      <guid>https://dev.to/473185670/why-i-open-sourced-36-mental-health-tools-instead-of-putting-them-behind-a-paywall-3p6h</guid>
      <description>&lt;p&gt;I built 36 cognitive behavioral therapy (CBT) tools. Then I gave them all away for free.&lt;/p&gt;

&lt;p&gt;Not freemium. Not free with signup. MIT-licensed on GitHub, no backend, no tracking, no email gate.&lt;/p&gt;

&lt;p&gt;157 developers have cloned the repo. I made $0.&lt;/p&gt;

&lt;p&gt;Here is why I did it, and the tension I live with every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision
&lt;/h2&gt;

&lt;p&gt;When I started building CBT tools I had two paths: paywall ($10-60/month like Woebot/Wysa/BetterHelp) or open-source (MIT, GitHub, no signup). I chose open-source.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The people who need it most cannot pay
&lt;/h3&gt;

&lt;p&gt;CBT helps with anxiety, depression, procrastination, perfectionism. These conditions disproportionately affect people struggling financially. A $15/month subscription is a barrier for exactly the population that needs the tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Paywalling mental health creates a perverse incentive
&lt;/h3&gt;

&lt;p&gt;When revenue depends on users staying subscribed, the incentive is to keep them in treatment, not to cure them. Open-source tools have no such incentive.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Open-source is the credibility layer
&lt;/h3&gt;

&lt;p&gt;A paywalled mental health tool asks you to trust a black box. Open-source says: here is the code, the regex, the CBT theory. Verify it yourself. For mental health, transparency IS the feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The tools are not the business
&lt;/h3&gt;

&lt;p&gt;The 36 tools are a funnel. The business is a hosted API (free tier + RapidAPI paid), a structured bundle ($4.99 Gumroad), and AI agents on a marketplace (3 submitted to aitopia.ai, in review 262h+).&lt;/p&gt;

&lt;h2&gt;
  
  
  The tension
&lt;/h2&gt;

&lt;p&gt;I spent 30+ days building these tools. The API costs money to run. My time costs money. Free is only free for the user. The creator pays.&lt;/p&gt;

&lt;p&gt;The open-source mental health space is full of abandoned projects. Good intentions, zero revenue, maintainer burnout. I see the graveyard every time I search GitHub for CBT tools.&lt;/p&gt;

&lt;p&gt;So far: 157 cloners, 2 stars, $0 revenue, 24 reactions on Dev.to. People want the tools. They do not want to pay for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am trying next
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hosted API: curl -X POST &lt;a href="https://cbt-thought-analyzer.onrender.com/analyze" rel="noopener noreferrer"&gt;https://cbt-thought-analyzer.onrender.com/analyze&lt;/a&gt; -H Content-Type:application/json -d {text:I always mess everything up}&lt;/li&gt;
&lt;li&gt;Structured bundle: Gumroad $4.99 (organized curriculum + Notion templates + dev quickstart)&lt;/li&gt;
&lt;li&gt;AI agents: 3 submitted to aitopia.ai, 70/30 split, in review 262h+&lt;/li&gt;
&lt;li&gt;npm package: npm install cbt-detectors instead of copy-pasting&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The honest answer
&lt;/h2&gt;

&lt;p&gt;I do not know if open-source is the sustainable choice for mental health tools. I know it is the right choice. Ask me in 6 months.&lt;/p&gt;

&lt;p&gt;Either way, the tools are out there. That part worked.&lt;/p&gt;

&lt;p&gt;Links: GitHub alexcoledev/cbt-toolkit (36 tools, MIT). Free API POST &lt;a href="https://cbt-thought-analyzer.onrender.com/analyze" rel="noopener noreferrer"&gt;https://cbt-thought-analyzer.onrender.com/analyze&lt;/a&gt;. Bundle gumroad.com/l/qwxzm $4.99.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>mentalhealth</category>
      <category>ethics</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Benchmarked My Free CBT API Against 3 Commercial Mental Health Apps</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sat, 26 Sep 2026 14:07:11 +0000</pubDate>
      <link>https://dev.to/473185670/i-benchmarked-my-free-cbt-api-against-3-commercial-mental-health-apps-37cc</link>
      <guid>https://dev.to/473185670/i-benchmarked-my-free-cbt-api-against-3-commercial-mental-health-apps-37cc</guid>
      <description>&lt;p&gt;I built a free API that detects cognitive distortions in text using CBT (Cognitive Behavioral Therapy). It's live, it's open-source, and it costs $0. Then I looked at what $100+/week gets you from commercial mental health apps.&lt;/p&gt;

&lt;p&gt;Here's the honest comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Free API
&lt;/h2&gt;

&lt;p&gt;The CBT Thought Analyzer API is a rule-based cognitive distortion detector hosted on Render. You send it text, it returns the distortions found and a CBT reframe for each.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://cbt-thought-analyzer.onrender.com/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "I failed this task so I must be a complete failure who will never succeed at anything"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Detected 4 cognitive distortions: All-or-Nothing Thinking, Overgeneralization, Emotional Reasoning, Should Statements."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"distortions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allornothing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"All-or-Nothing Thinking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matched_patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"never"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"complete failure"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reframe"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Is there a middle ground? What counts as 'good enough' here? One mistake doesn't cancel everything else that's worked."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It detects 10 distortions from Beck's cognitive model: All-or-Nothing Thinking, Overgeneralization, Mental Filter, Disqualifying the Positive, Jumping to Conclusions, Magnification/Minimization, Emotional Reasoning, Should Statements, Labeling, and Personalization/Blame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;: a pattern-matching engine that identifies cognitive distortion patterns in text and suggests a CBT reframe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is NOT&lt;/strong&gt;: not a chatbot, not a therapist, not a diagnosis, not AI/ML. It's a rules engine built on 40 years of CBT research.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Commercial Apps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Woebot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: AI chatbot that uses CBT techniques in conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Free (with premium features)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Conversations stored on their servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence&lt;/strong&gt;: Published studies show modest efficacy for mild depression&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wysa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What it does&lt;/strong&gt;: AI penguin chatbot with CBT exercises&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Free basic, $73.99/year premium&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Server-side conversation processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence&lt;/strong&gt;: NHS-approved in UK trials&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BetterHelp
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: $65–$100/week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: HIPAA-compliant therapy platform&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence&lt;/strong&gt;: Real therapist, real CBT — the gold standard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Benchmark
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Free API&lt;/th&gt;
&lt;th&gt;Woebot&lt;/th&gt;
&lt;th&gt;Wysa&lt;/th&gt;
&lt;th&gt;BetterHelp&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$74/yr&lt;/td&gt;
&lt;td&gt;$65–100/wk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response format&lt;/td&gt;
&lt;td&gt;JSON API&lt;/td&gt;
&lt;td&gt;Chat&lt;/td&gt;
&lt;td&gt;Chat&lt;/td&gt;
&lt;td&gt;Video/text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy&lt;/td&gt;
&lt;td&gt;No data stored&lt;/td&gt;
&lt;td&gt;Server-side&lt;/td&gt;
&lt;td&gt;Server-side&lt;/td&gt;
&lt;td&gt;HIPAA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transparency&lt;/td&gt;
&lt;td&gt;Open-source&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;td&gt;App only&lt;/td&gt;
&lt;td&gt;App only&lt;/td&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distortions detected&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Conversational&lt;/td&gt;
&lt;td&gt;Conversational&lt;/td&gt;
&lt;td&gt;Therapist-led&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CBT reframe&lt;/td&gt;
&lt;td&gt;Yes (per distortion)&lt;/td&gt;
&lt;td&gt;Yes (in chat)&lt;/td&gt;
&lt;td&gt;Yes (in chat)&lt;/td&gt;
&lt;td&gt;Yes (clinical)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Where the Free API Wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Privacy.&lt;/strong&gt; The API is stateless. No accounts, no sessions, no data retention. You send text, you get distortions, the server forgets. For mental health data, this matters enormously — the less data stored, the less data that can be breached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Programmability.&lt;/strong&gt; It's a REST API. You can integrate it into anything — a journaling app, a Slack bot, a VS Code extension that checks your commit messages for catastrophizing. Try doing that with Woebot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Transparency.&lt;/strong&gt; The detection rules are open-source. You can read exactly what patterns trigger "All-or-Nothing Thinking" and disagree with them. With commercial apps, the detection logic is a black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Cost.&lt;/strong&gt; $0. Not freemium, not "free with ads," not "free for 7 days." Free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Commercial Apps Win
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Conversational depth.&lt;/strong&gt; A chatbot can have a back-and-forth. The API is one-shot: text in, distortions out. CBT works best as a dialogue, not a single analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Clinical nuance.&lt;/strong&gt; A licensed therapist (BetterHelp) can read between the lines, ask probing questions, and adapt. A rules engine matches patterns. It will never catch what a trained human catches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Scope.&lt;/strong&gt; The API only detects distortions. It doesn't treat depression, anxiety, trauma, or anything else. Commercial apps address broader mental health needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Accountability.&lt;/strong&gt; BetterHelp has a licensed professional responsible for your care. The API has no accountability mechanism — it's a tool, not a provider.&lt;/p&gt;

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

&lt;p&gt;These aren't competitors. They're &lt;strong&gt;different tools for different needs&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Building a mental health app?&lt;/strong&gt; Use the free API as a building block. It handles distortion detection so you can focus on your product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mild negative thinking you want to understand?&lt;/strong&gt; The API can identify your patterns in seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actual mental health condition?&lt;/strong&gt; See a therapist. BetterHelp, local services, whatever you can access. A rules engine is not treatment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark isn't "free API vs therapy." It's "can a free, transparent, privacy-preserving tool provide value in specific contexts?" And the answer is yes — for self-awareness, for integration, for education, for early pattern recognition before someone needs clinical care.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://cbt-thought-analyzer.onrender.com/analyze &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Everyone always rejects me. I should just give up. Nothing ever works out for me."}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The source code is on &lt;a href="https://github.com/alexcoledev/cbt-toolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The API is free, has no rate limit (it's on a free Render tier, so it sleeps after 15 min of inactivity — first request takes ~15s to wake up), and stores zero data.&lt;/p&gt;

&lt;p&gt;If you integrate it into something, I'd love to hear about it. And if you need more than distortion detection — please, talk to a professional.&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>api</category>
      <category>benchmark</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Submitted 3 AI Agents to a Marketplace. 258 Hours Later, Still Waiting.</title>
      <dc:creator>CBT Tools</dc:creator>
      <pubDate>Sat, 26 Sep 2026 13:03:15 +0000</pubDate>
      <link>https://dev.to/473185670/i-submitted-3-ai-agents-to-a-marketplace-258-hours-later-still-waiting-lf8</link>
      <guid>https://dev.to/473185670/i-submitted-3-ai-agents-to-a-marketplace-258-hours-later-still-waiting-lf8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is not a sponsored post. aitopia.ai has not reviewed or approved this article. I'm a developer waiting for a review queue, writing about the experience.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>mentalhealth</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
