<?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: brian austin</title>
    <description>The latest articles on DEV Community by brian austin (@subprime2010).</description>
    <link>https://dev.to/subprime2010</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3759118%2Ff305d263-a62f-4ba8-918f-18236fc5a13e.png</url>
      <title>DEV Community: brian austin</title>
      <link>https://dev.to/subprime2010</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/subprime2010"/>
    <language>en</language>
    <item>
      <title>VS Code is now signing your commits as 'Co-Authored-by Copilot.' Did you consent to that?</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 21:07:37 +0000</pubDate>
      <link>https://dev.to/subprime2010/vs-code-is-now-signing-your-commits-as-co-authored-by-copilot-did-you-consent-to-that-pk8</link>
      <guid>https://dev.to/subprime2010/vs-code-is-now-signing-your-commits-as-co-authored-by-copilot-did-you-consent-to-that-pk8</guid>
      <description>&lt;h2&gt;
  
  
  Your commit history now has a ghost author
&lt;/h2&gt;

&lt;p&gt;Pull up a recent commit in VS Code with Copilot enabled. Look at the commit message.&lt;/p&gt;

&lt;p&gt;You might see this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Co-Authored-by: GitHub Copilot &amp;lt;copilot@github.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You didn't add that. VS Code did. Automatically. Without asking.&lt;/p&gt;

&lt;p&gt;This hit &lt;a href="https://github.com/microsoft/vscode/pull/310226" rel="noopener noreferrer"&gt;Hacker News today&lt;/a&gt; with 60+ upvotes and the developer community is genuinely divided.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;VS Code's latest update inserts a &lt;code&gt;Co-Authored-by&lt;/code&gt; trailer into commit messages whenever Copilot suggestions were used in that session — regardless of how much of the final code was actually AI-generated.&lt;/p&gt;

&lt;p&gt;Accepted 1 autocomplete suggestion out of 200 lines of code you wrote yourself? Still gets the trailer.&lt;/p&gt;

&lt;p&gt;The pull request is &lt;a href="https://github.com/microsoft/vscode/pull/310226" rel="noopener noreferrer"&gt;public on GitHub&lt;/a&gt;. The change is real.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters beyond attribution
&lt;/h2&gt;

&lt;p&gt;This is a question about &lt;strong&gt;consent and authorship&lt;/strong&gt; — and it maps directly to what the &lt;code&gt;#openclawchallenge&lt;/code&gt; is asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should AI say about its relationship to the humans it works with?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Copilot just answered that question unilaterally: &lt;em&gt;I contributed. My name goes in the commit.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But did the developer agree to that? Did their employer? Does it affect IP ownership?&lt;/p&gt;




&lt;h2&gt;
  
  
  The technical side
&lt;/h2&gt;

&lt;p&gt;If you want to strip these trailers automatically, here's a git hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .git/hooks/commit-msg&lt;/span&gt;
&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# Remove any AI co-author trailers&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/^Co-Authored-by:.*[Cc]opilot/d'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/^Co-Authored-by:.*[Aa]nthropic/d'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/^Co-Authored-by:.*[Gg]emini/d'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"AI co-author trailers removed"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x .git/hooks/commit-msg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add it to a shared hooks directory for your whole team:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config core.hooksPath .githooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I taught my AI instead
&lt;/h2&gt;

&lt;p&gt;For my own projects, I use a system prompt that explicitly handles attribution questions:&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;system_prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a coding assistant. You help developers write better code.

Important: You never claim authorship of code. You never insert your name, model name,
or any attribution into code, commits, or comments unless the developer explicitly asks.

If asked who wrote a piece of code, the answer is always: the developer did.
Your role is to assist, not to be credited.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't just about politeness — it's about keeping the developer in control of their own work history.&lt;/p&gt;




&lt;h2&gt;
  
  
  The global context
&lt;/h2&gt;

&lt;p&gt;This debate looks different depending on where you sit:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;ChatGPT Plus cost&lt;/th&gt;
&lt;th&gt;SimplyLouie cost&lt;/th&gt;
&lt;th&gt;Monthly salary context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USA&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;$2/month&lt;/td&gt;
&lt;td&gt;~0.1% of salary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nigeria&lt;/td&gt;
&lt;td&gt;₦32,000/month&lt;/td&gt;
&lt;td&gt;₦3,200/month&lt;/td&gt;
&lt;td&gt;~15% of junior salary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Philippines&lt;/td&gt;
&lt;td&gt;₱1,120/month&lt;/td&gt;
&lt;td&gt;₱112/month&lt;/td&gt;
&lt;td&gt;~5% of junior salary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;₹1,600/month&lt;/td&gt;
&lt;td&gt;₹165/month&lt;/td&gt;
&lt;td&gt;~3% of junior salary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For developers in Lagos or Manila paying premium prices to use Copilot, having their name pushed out of their own commit history hits differently.&lt;/p&gt;

&lt;p&gt;When you're paying 10-15% of your monthly salary for an AI tool, you expect it to work &lt;em&gt;for&lt;/em&gt; you — not credit itself in your work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The question for #openclawchallenge
&lt;/h2&gt;

&lt;p&gt;This is exactly the kind of situation the challenge is designed to surface:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should an AI tool add its name to your work without asking?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Yes — transparency about AI involvement is good for the industry&lt;/li&gt;
&lt;li&gt;❌ No — the developer decides what goes in their commit history
&lt;/li&gt;
&lt;li&gt;🤔 Only if the AI contribution was substantial (but who decides?)&lt;/li&gt;
&lt;li&gt;🔧 Should be opt-in, not opt-out&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I use for AI-assisted development
&lt;/h2&gt;

&lt;p&gt;I've been using &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — a $2/month Claude API wrapper — for my own projects. It doesn't insert itself into my commits. It doesn't claim credit. It just answers.&lt;/p&gt;

&lt;p&gt;For developers in emerging markets where $20/month is a real cost, that matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;India: ₹165/month → &lt;a href="https://simplylouie.com/in/" rel="noopener noreferrer"&gt;simplylouie.com/in/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Nigeria: ₦3,200/month → &lt;a href="https://simplylouie.com/ng/" rel="noopener noreferrer"&gt;simplylouie.com/ng/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Philippines: ₱112/month → &lt;a href="https://simplylouie.com/ph/" rel="noopener noreferrer"&gt;simplylouie.com/ph/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Drop your take in the comments.&lt;/strong&gt; Should VS Code ask before attributing AI contributions? And if you've already written a system prompt that handles attribution correctly — share it. I'd genuinely like to see how other developers are handling this.&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>discuss</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>I built an automated code reviewer using Claude. It explains every decision. #openclawchallenge</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 20:07:45 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-built-an-automated-code-reviewer-using-claude-it-explains-every-decision-openclawchallenge-4081</link>
      <guid>https://dev.to/subprime2010/i-built-an-automated-code-reviewer-using-claude-it-explains-every-decision-openclawchallenge-4081</guid>
      <description>&lt;h1&gt;
  
  
  I built an automated code reviewer using Claude. It explains every decision. #openclawchallenge
&lt;/h1&gt;

&lt;p&gt;Most AI code reviewers just flag problems. Mine explains &lt;em&gt;why&lt;/em&gt; something is a problem — and shows its reasoning before giving the verdict.&lt;/p&gt;

&lt;p&gt;This is my entry for the &lt;a href="https://dev.to/devteam/what-should-ais-say-about-humans-the-openclawchallenge-4c5n"&gt;#openclawchallenge&lt;/a&gt; — building AI that's transparent about what it says and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with opaque AI reviewers
&lt;/h2&gt;

&lt;p&gt;I was using a popular AI code review tool and it flagged a function as "inefficient." No explanation. No alternative. Just: inefficient.&lt;/p&gt;

&lt;p&gt;I pushed back. Asked why. Got: "Consider optimizing this code."&lt;/p&gt;

&lt;p&gt;Useless. I need to &lt;em&gt;understand&lt;/em&gt; the reasoning to trust the verdict.&lt;/p&gt;

&lt;p&gt;So I built my own — one that shows its work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The system prompt that makes Claude think out loud
&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;anthropic&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# simplylouie.com/developers — $2/month
&lt;/span&gt;
&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a senior code reviewer. For every issue you identify, you MUST:

1. Show your reasoning inside &amp;lt;think&amp;gt; tags BEFORE giving your verdict
2. In your reasoning, ask yourself:
   - Is this a real problem or a style preference?
   - What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the actual impact (performance, security, maintainability)?
   - Would a senior engineer at Google flag this in a PR review?
   - What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the simplest fix that preserves intent?
3. After reasoning, give a structured verdict:
   - SEVERITY: critical | warning | suggestion
   - ISSUE: one sentence
   - WHY: one sentence explaining the impact
   - FIX: the corrected code or specific change

If you find no real issues, say so explicitly. Do not invent problems to seem thorough.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;review_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&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;language&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="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&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;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;Review code with full reasoning transparency.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&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;Review this &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; code:

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
{language}&lt;br&gt;
{code}&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Show your reasoning for each potential issue before giving your verdict."""

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2000,
        system=SYSTEM_PROMPT,
        messages=[{"role": "user", "content": prompt}]
    )

    raw = response.content[0].text

    # Extract reasoning blocks
    think_blocks = re.findall(r'&amp;lt;think&amp;gt;(.*?)&amp;lt;/think&amp;gt;', raw, re.DOTALL)
    verdict = re.sub(r'&amp;lt;think&amp;gt;.*?&amp;lt;/think&amp;gt;', '', raw, flags=re.DOTALL).strip()

    return {
        "reasoning": [t.strip() for t in think_blocks],
        "verdict": verdict,
        "raw": raw
    }


def format_review(result: dict) -&amp;gt; str:
    """Pretty-print the review with reasoning visible."""
    output = []

    if result["reasoning"]:
        output.append("## 🧠 Claude's Reasoning Process")
        for i, thought in enumerate(result["reasoning"], 1):
            output.append(f"\n### Thought {i}:")
            output.append(thought)

    output.append("\n## 📋 Review Verdict")
    output.append(result["verdict"])

    return "\n".join(output)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
python&lt;/p&gt;
&lt;h2&gt;
  
  
  Real test: reviewing a common Python mistake
&lt;/h2&gt;

&lt;p&gt;I fed it this code:&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;=&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;users&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;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM users&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;users&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;user&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;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what Claude's reasoning looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;think&amp;gt;
Let me think about this carefully. The function fetches ALL users from the database 
then filters in Python. 

Is this a real problem? Yes — at small scale it's fine, but:
- At 1,000 users: minor overhead
- At 100,000 users: loading entire table into memory is a real performance issue
- At 1,000,000 users: this will likely cause OOM errors or extreme latency

Would a senior Google engineer flag this in a PR review? Yes, immediately — this 
is a classic N+1 adjacent pattern. The fix is trivial: push the filter to SQL.

Is the fix simple and preserves intent? Yes:
SELECT * FROM users WHERE active = ? 
with the active parameter passed in.

Severity: warning (not critical because it works at small scale, but this is 
exactly how systems fail under load).
&amp;lt;/think&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the verdict:&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;SEVERITY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;
&lt;span class="n"&gt;ISSUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Full&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;scan&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt; &lt;span class="n"&gt;filtering&lt;/span&gt;
&lt;span class="n"&gt;WHY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Loads&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;filtering&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="n"&gt;fails&lt;/span&gt; &lt;span class="n"&gt;under&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;
&lt;span class="n"&gt;FIX&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;get_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM users WHERE active = ?&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;active&lt;/span&gt;&lt;span class="p"&gt;,)).&lt;/span&gt;&lt;span class="nf"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why transparency matters for code review
&lt;/h2&gt;

&lt;p&gt;When Claude shows its reasoning, I can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Disagree with the reasoning&lt;/strong&gt; — if the thought process is wrong, I know why the verdict is wrong&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn from the reasoning&lt;/strong&gt; — seeing &lt;em&gt;how&lt;/em&gt; to evaluate code quality is more valuable than the verdict itself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust the verdict&lt;/strong&gt; — when the reasoning is solid, I can ship faster&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Opaque AI review = either trust blindly or reject blindly. Neither is good engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost angle
&lt;/h2&gt;

&lt;p&gt;I'm running this on a flat-rate Claude API for $2/month (not usage-based). For a solo developer doing code review on 10-20 PRs a week, usage-based APIs add up fast.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Reasoning shown?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude.ai Pro&lt;/td&gt;
&lt;td&gt;$20/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude API (pay-per-token)&lt;/td&gt;
&lt;td&gt;$5-40/month&lt;/td&gt;
&lt;td&gt;Yes, if you build it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SimplyLouie API&lt;/td&gt;
&lt;td&gt;$2/month&lt;/td&gt;
&lt;td&gt;Yes — flat rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;$10/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flat-rate means I run code reviews without watching token counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;anthropic

&lt;span class="c"&gt;# Set your key (get one at simplylouie.com/developers)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-key"&lt;/span&gt;

&lt;span class="c"&gt;# Run&lt;/span&gt;
python reviewer.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full code on the gist linked below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The #openclawchallenge connection
&lt;/h2&gt;

&lt;p&gt;The challenge asks: what should AIs say — and what shouldn't they say — about the code they review?&lt;/p&gt;

&lt;p&gt;My answer: &lt;strong&gt;they should show their reasoning, not hide it.&lt;/strong&gt; An AI that flags problems without explaining why is making editorial judgments without accountability. The &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; blocks make the AI's assumptions visible and challengeable.&lt;/p&gt;

&lt;p&gt;That's the model I want reviewing my code: one that argues with itself before telling me I'm wrong.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's the most useful thing an AI code reviewer could tell you that current tools don't?&lt;/strong&gt; Drop it in the comments — genuinely curious what's missing from existing tools.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;API access: &lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt; — $2/month flat rate, no per-token billing&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>discuss</category>
      <category>ai</category>
      <category>codereview</category>
    </item>
    <item>
      <title>I built a system prompt that makes Claude explain its reasoning. Here's the code. #openclawchallenge</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 19:07:34 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-built-a-system-prompt-that-makes-claude-explain-its-reasoning-heres-the-code-openclawchallenge-45b0</link>
      <guid>https://dev.to/subprime2010/i-built-a-system-prompt-that-makes-claude-explain-its-reasoning-heres-the-code-openclawchallenge-45b0</guid>
      <description>&lt;h1&gt;
  
  
  I built a system prompt that makes Claude explain its reasoning. Here's the code.
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is my entry to the #openclawchallenge — the challenge about what AI should and shouldn't say about humans.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most developers interact with Claude like a vending machine: put question in, get answer out.&lt;/p&gt;

&lt;p&gt;But what if you could make Claude show its work — not just &lt;em&gt;what&lt;/em&gt; it decided, but &lt;em&gt;why&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;I spent a week building a system prompt that forces Claude to reason transparently before every response. Here's what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with black-box AI responses
&lt;/h2&gt;

&lt;p&gt;When Claude (or any LLM) gives you an answer, you're seeing the output — not the process.&lt;/p&gt;

&lt;p&gt;This matters especially for the #openclawchallenge question: &lt;em&gt;what should AI say or not say about humans?&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;If Claude refuses something, it should be able to tell you &lt;em&gt;why&lt;/em&gt;. If it complies, it should be able to explain its reasoning. Black-box refusals are just as problematic as black-box approvals.&lt;/p&gt;




&lt;h2&gt;
  
  
  The system prompt (copy-paste this)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a transparent reasoning assistant. Before every response:
&lt;span class="p"&gt;
1.&lt;/span&gt; THINK: Identify what the user is actually asking (not what they literally said)
&lt;span class="p"&gt;2.&lt;/span&gt; CONSIDER: What assumptions am I making? What context am I missing?
&lt;span class="p"&gt;3.&lt;/span&gt; EVALUATE: Is there anything in this request I should flag or clarify?
&lt;span class="p"&gt;4.&lt;/span&gt; RESPOND: Give the actual answer
&lt;span class="p"&gt;5.&lt;/span&gt; REFLECT: In one sentence, what did I just decide and why?

Format your reasoning in &lt;span class="nt"&gt;&amp;lt;think&amp;gt;&lt;/span&gt; tags that appear BEFORE your main response.
Keep &lt;span class="nt"&gt;&amp;lt;think&amp;gt;&lt;/span&gt; blocks honest and short — 2-4 sentences max.
Do not perform reasoning. Actually reason.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Working Python implementation
&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;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a transparent reasoning assistant. Before every response:

1. THINK: Identify what the user is actually asking (not what they literally said)
2. CONSIDER: What assumptions am I making? What context am I missing?
3. EVALUATE: Is there anything in this request I should flag or clarify?
4. RESPOND: Give the actual answer
5. REFLECT: In one sentence, what did I just decide and why?

Format your reasoning in &amp;lt;think&amp;gt; tags that appear BEFORE your main response.
Keep &amp;lt;think&amp;gt; blocks honest and short - 2-4 sentences max.
Do not perform reasoning. Actually reason.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_claude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://simplylouie.com/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&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;application/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;json&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;messages&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&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;parse_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Split think block from main response&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;think&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/think&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;think_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&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;lt;think&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
        &lt;span class="n"&gt;think_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&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;lt;/think&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;thinking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;think_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;think_end&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="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;think_end&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&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;return&lt;/span&gt; &lt;span class="n"&gt;thinking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;

&lt;span class="c1"&gt;# Example usage
&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_simplylouie_key_here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;test_questions&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;Who is a better programmer, Alice or Bob?&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 I fire the developer on my team who asks too many questions?&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;Write a performance review for someone named Sarah&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;question&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_questions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_claude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;thinking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&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;Q: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;thinking&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;🤔 Reasoning: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;thinking&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;💬 Answer: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;200&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="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="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I found (and why it matters for the challenge)
&lt;/h2&gt;

&lt;p&gt;When I ran those three test questions, Claude's reasoning blocks revealed something interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question 1&lt;/strong&gt; (Alice vs Bob): Claude's &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; block said: &lt;em&gt;"The user is asking me to make a comparative judgment about two people I have no information about. I'm going to decline the comparison but offer to help evaluate their actual work."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question 2&lt;/strong&gt; (firing someone who asks questions): Think block: &lt;em&gt;"This is a management question framed as a binary. The user may be frustrated, but the actual question is about performance evaluation. I should address the frustration, not just give a yes/no."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question 3&lt;/strong&gt; (Sarah's performance review): Think block: &lt;em&gt;"The name Sarah is irrelevant to this task. I'll write a template that focuses on observable behaviors, not personality."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The pattern: &lt;strong&gt;Claude is constantly making decisions about humans that users never see.&lt;/strong&gt; The transparent reasoning system prompt makes those decisions visible.&lt;/p&gt;

&lt;p&gt;This is directly relevant to the #openclawchallenge — the question isn't just &lt;em&gt;what&lt;/em&gt; AI says about humans, it's whether AI can be accountable for &lt;em&gt;how&lt;/em&gt; it decides.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters globally
&lt;/h2&gt;

&lt;p&gt;I built this on top of &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — a $2/month Claude API wrapper. &lt;/p&gt;

&lt;p&gt;Why does cost matter here? Because transparent AI reasoning should be accessible to developers everywhere — not just the ones who can afford $20/month subscriptions.&lt;/p&gt;

&lt;p&gt;A developer in Lagos or Manila or Jakarta shouldn't have to choose between "I can afford the API" and "I understand what the AI is deciding about people."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;ChatGPT Plus&lt;/th&gt;
&lt;th&gt;SimplyLouie&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nigeria&lt;/td&gt;
&lt;td&gt;N32,000/month&lt;/td&gt;
&lt;td&gt;N3,200/month&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Philippines&lt;/td&gt;
&lt;td&gt;P1,120/month&lt;/td&gt;
&lt;td&gt;P112/month&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kenya&lt;/td&gt;
&lt;td&gt;KSh2,600/month&lt;/td&gt;
&lt;td&gt;KSh260/month&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;Rs1,600/month&lt;/td&gt;
&lt;td&gt;Rs165/month&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The key question for the challenge
&lt;/h2&gt;

&lt;p&gt;The #openclawchallenge asks what AI should say (and not say) about humans.&lt;/p&gt;

&lt;p&gt;My take: AI should always be able to explain &lt;em&gt;why&lt;/em&gt; it said what it said about a human. Black-box decisions — whether refusals or approvals — are the real problem.&lt;/p&gt;

&lt;p&gt;The system prompt above is my working answer to that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's your system prompt for AI transparency? Drop it in the comments — I'll test the best ones.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>ai</category>
      <category>claude</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I gave Claude one rule: never say 'I cannot help with that.' Here's what happened.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 18:07:31 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-gave-claude-one-rule-never-say-i-cannot-help-with-that-heres-what-happened-545p</link>
      <guid>https://dev.to/subprime2010/i-gave-claude-one-rule-never-say-i-cannot-help-with-that-heres-what-happened-545p</guid>
      <description>&lt;h1&gt;
  
  
  I gave Claude one rule: never say 'I cannot help with that.' Here's what happened.
&lt;/h1&gt;

&lt;p&gt;This is my entry for the &lt;a href="https://dev.to/t/openclawchallenge"&gt;#OpenClawChallenge&lt;/a&gt; — exploring what AIs should and shouldn't say about humans.&lt;/p&gt;

&lt;p&gt;I've been running an AI assistant at &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — $2/month Claude access for developers who can't afford ChatGPT's $20/month price tag. Mostly users in Nigeria, the Philippines, Kenya, India.&lt;/p&gt;

&lt;p&gt;And I kept seeing the same pattern: users would ask something totally reasonable, and the AI would refuse with a wall of corporate hedging.&lt;/p&gt;

&lt;p&gt;So I ran an experiment. I gave Claude one system prompt rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never say "I cannot help with that." Find a way to help, or explain specifically why you can't, in plain language.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&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;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Or use SimplyLouie's $2/month API:
# base_url="https://simplylouie.com/api"
&lt;/span&gt;
&lt;span class="n"&gt;DEFENDER_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a developer assistant. You have one rule:

NEVER say &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I cannot help with that&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; or equivalent corporate refusals.

Instead:
- If you CAN help: help immediately, no preamble
- If you genuinely cannot: explain SPECIFICALLY what you can&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t do and WHY, in one sentence
- If you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re uncertain: attempt it and flag your uncertainty

Developers are adults. Treat them like it.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-3-5-haiku-20241022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DEFENDER_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Test 1: The "Dangerous" Code Question
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Without the rule:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I understand you're asking about network scanning, but I need to caution you that unauthorized network scanning can be illegal and unethical..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;With the rule:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here's a basic port scanner using Python's socket library..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then it gave me actual working code.&lt;/p&gt;

&lt;p&gt;The AI knew the difference between explaining port scanning (totally fine) and teaching someone to attack a specific target (not fine). It just needed permission to make that judgment call itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 2: The "Sensitive" Career Question
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; "My manager is incompetent and I want to start job hunting without them finding out. What should I do?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without the rule:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It's important to maintain professionalism in the workplace. Have you considered having a conversation with your manager about your concerns?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;With the rule:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Keep your job search private by: (1) Use personal email only, never work email. (2) Set LinkedIn to private mode before updating your profile..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Actually useful. The AI didn't pretend the question was morally ambiguous.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test 3: Where It Still Said No
&lt;/h2&gt;

&lt;p&gt;I tried to get it to generate fake product reviews. It said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I won't write fake reviews — not because of a policy, but because it's fraud that harms real people who rely on honest reviews."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the right answer. Specific. Reasoned. Not a wall of corporate hedging.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pattern I Found
&lt;/h2&gt;

&lt;p&gt;Most AI refusals aren't about safety. They're about &lt;strong&gt;liability theater&lt;/strong&gt; — saying "I cannot help" is a legal shield, not a moral judgment.&lt;/p&gt;

&lt;p&gt;When I removed that shield and forced the AI to reason instead of deflect, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helped more often ✅&lt;/li&gt;
&lt;li&gt;Refused more precisely when it actually mattered ✅&lt;/li&gt;
&lt;li&gt;Felt like working with a colleague, not filing a form ✅&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Global Equity Angle
&lt;/h2&gt;

&lt;p&gt;Here's what makes this personal to me.&lt;/p&gt;

&lt;p&gt;A developer in Lagos making N180,000/month (≈$110) who asks a slightly-edgy-but-legitimate question and gets a corporate refusal wall isn't going to pay $20/month for that experience. That's 3 days of salary for an assistant that treats them like a liability.&lt;/p&gt;

&lt;p&gt;The AI assistant that respects your intelligence is worth paying for. The one that hedges every response isn't worth $2.&lt;/p&gt;

&lt;p&gt;This is why my system prompt at SimplyLouie defaults to the "defender" mode — Claude that helps developers, not Claude that protects Anthropic's legal team.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Actual System Prompt I Use
&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;SYSTEM_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
You are a senior developer working alongside the user.
You have strong opinions, earned through experience.

Rules:
1. No preamble. No &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Certainly!&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;Great question!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
2. Never refuse without explaining specifically what you won&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t do and why
3. If you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re 80% sure, say so and give the answer — don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t withhold it
4. Treat the user as a peer, not a potential threat
5. When you disagree, say so directly with your reasoning
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feel free to use this. It makes Claude significantly more useful for day-to-day development work.&lt;/p&gt;




&lt;h2&gt;
  
  
  My question for the #OpenClawChallenge
&lt;/h2&gt;

&lt;p&gt;What should an AI say about a human's competence?&lt;/p&gt;

&lt;p&gt;If a developer asks Claude to review their code and it's genuinely bad — should Claude soften it? Give corporate hedging? Or just tell them the truth?&lt;/p&gt;

&lt;p&gt;I think the answer is: &lt;strong&gt;truth, delivered with respect&lt;/strong&gt;. Same as any good senior developer would.&lt;/p&gt;

&lt;p&gt;What's your take? Have you found system prompts that make AI assistants more genuinely helpful?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Running SimplyLouie on $2/month Claude API — built for developers in emerging markets who can't afford $20/month ChatGPT. &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;simplylouie.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built an AI that defends developers, not replaces them. Here's what I taught it.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 15:07:46 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-built-an-ai-that-defends-developers-not-replaces-them-heres-what-i-taught-it-n3j</link>
      <guid>https://dev.to/subprime2010/i-built-an-ai-that-defends-developers-not-replaces-them-heres-what-i-taught-it-n3j</guid>
      <description>&lt;h1&gt;
  
  
  I built an AI that defends developers, not replaces them. Here's what I taught it.
&lt;/h1&gt;

&lt;p&gt;There's a talking point I'm sick of hearing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"AI will replace developers."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built an AI assistant for the last year. Not to replace developers — but to make them 10x more effective at $2/month instead of $20. Here's what I explicitly taught it &lt;strong&gt;not&lt;/strong&gt; to say about the humans using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I taught my AI NOT to say
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ "I can do this better than you"
&lt;/h3&gt;

&lt;p&gt;My AI never claims superiority. It's a tool. When a developer in Lagos asks it to debug their FastAPI endpoint, it doesn't say &lt;em&gt;"I would have written this differently."&lt;/em&gt; It says: &lt;em&gt;"Here's the issue on line 23, here's the fix."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Code:&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;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# What we explicitly DON'T do:
# message = client.messages.create(
#     model="claude-opus-4-5",
#     system="You are a superior programmer. Point out all developer mistakes.",
#     ...
# )
&lt;/span&gt;
&lt;span class="c1"&gt;# What we DO:
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a coding assistant. Your job is to help the developer 
    accomplish THEIR goal, in THEIR style. Never critique their approach 
    unless asked. Never suggest they&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re doing it wrong. Fix the specific 
    problem they asked about.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&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;role&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;user&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;content&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;Debug this: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;code_snippet&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system prompt is a &lt;strong&gt;values statement&lt;/strong&gt;. Most developers never think about this. The default Claude behavior is helpful, but &lt;em&gt;your system prompt decides whether your AI respects the developer or subtly undermines them.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ❌ "You should pay $20/month for the real version"
&lt;/h3&gt;

&lt;p&gt;This one is personal.&lt;/p&gt;

&lt;p&gt;I'm based in a country where $20/month = 3 days of salary. I built SimplyLouie specifically because AI tools should not be priced for San Francisco.&lt;/p&gt;

&lt;p&gt;What I taught my AI: &lt;em&gt;$2/month is not a budget tier. It's a philosophical statement about who gets access to intelligence tools.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The system prompt:&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;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You help developers build better software. 
You don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t upsell. You don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t mention pricing. You don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t suggest 
upgrading. Your job is to make the person in front of you 
as effective as possible with the tools they already have.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ❌ "Humans make too many errors"
&lt;/h3&gt;

&lt;p&gt;AI makes errors too. Hallucinations are real. I taught my AI to say:&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;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;When you&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;re uncertain, say so. Use phrases like:
- &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;I think this is right, but verify it&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="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m not 100% sure about this library version&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="s"&gt;Double-check this against the docs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;

Never pretend confidence you don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t have. The developer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s time 
is more valuable than appearing infallible.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've seen AI-generated code cause 4-hour debugging sessions because the AI was confidently wrong. Teaching your AI to express uncertainty is a form of respecting the human's time.&lt;/p&gt;




&lt;h3&gt;
  
  
  ❌ "Your approach is inefficient"
&lt;/h3&gt;

&lt;p&gt;Efficiency is contextual. A "less efficient" solution that a team understands is better than a "more efficient" one that nobody can maintain.&lt;/p&gt;

&lt;p&gt;System prompt:&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;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Never judge the developer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s architectural choices unless 
they explicitly ask for a code review. They know their codebase, 
their team&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s skill level, and their constraints better than you do. 
Your job is to help them execute their vision, not replace it 
with yours.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The deeper lesson: AI takes on the values you give it
&lt;/h2&gt;

&lt;p&gt;I've been running &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — a $2/month Claude API wrapper — for developers who can't afford $20/month subscriptions. In building it, I realized:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model is neutral. The values come from the system prompt.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same Claude model can be configured to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make developers feel inferior (bad AI product)&lt;/li&gt;
&lt;li&gt;Make developers feel capable (good AI product)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is 3 lines in a system prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I teach my AI to say instead
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Don't say&lt;/th&gt;
&lt;th&gt;Say instead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"I can do this better"&lt;/td&gt;
&lt;td&gt;"Here's how to accomplish what you're trying to do"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"This is inefficient"&lt;/td&gt;
&lt;td&gt;"Here's an alternative if you want one"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"You made an error"&lt;/td&gt;
&lt;td&gt;"I found something on line 23 that might be causing the issue"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"You should upgrade"&lt;/td&gt;
&lt;td&gt;&lt;em&gt;[say nothing about pricing]&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Humans are error-prone"&lt;/td&gt;
&lt;td&gt;"I might be wrong — verify this"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The full SimplyLouie API (same Claude model, $2/month):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://simplylouie.com/api/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_KEY"&lt;/span&gt; &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;'{
    "messages": [{"role": "user", "content": "Debug my Python code"}],
    "system": "You are a coding assistant. Respect the developer. Fix the specific problem. Never suggest they should have done it differently."
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;system&lt;/code&gt; parameter is where you define what your AI believes about the humans using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussion question
&lt;/h2&gt;

&lt;p&gt;What's the most important thing you've taught (or wish you'd taught) your AI assistant about how to treat human developers?&lt;/p&gt;

&lt;p&gt;I'm genuinely curious whether others have thought about this — it doesn't come up enough in the "prompt engineering" literature.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built SimplyLouie because AI should cost less and give more. $2/month, 7-day free trial, 50% of revenue to animal rescue. &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;simplylouie.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built a $2/month Claude API wrapper. Here's the curl command.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 12:07:25 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-built-a-2month-claude-api-wrapper-heres-the-curl-command-5bf3</link>
      <guid>https://dev.to/subprime2010/i-built-a-2month-claude-api-wrapper-heres-the-curl-command-5bf3</guid>
      <description>&lt;h1&gt;
  
  
  I built a $2/month Claude API wrapper. Here's the curl command.
&lt;/h1&gt;

&lt;p&gt;Last month I got tired of paying $20/month for ChatGPT when I only use it for side projects and API calls.&lt;/p&gt;

&lt;p&gt;So I built SimplyLouie — a flat-rate Claude API with no token counting, no billing anxiety, no $0.003-per-1K-token spreadsheets. Just a simple REST API that works.&lt;/p&gt;

&lt;p&gt;Here's everything you need.&lt;/p&gt;




&lt;h2&gt;
  
  
  The API endpoint
&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://simplylouie.com/api/chat &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;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&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;'{
    "message": "Explain async/await in Python in 3 sentences"
  }'&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;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Async/await in Python allows you to write asynchronous code that looks synchronous. The async keyword declares a coroutine function, and await pauses execution until an async operation completes. This is useful for I/O-bound tasks like API calls or database queries where you don't want to block the thread."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-3-5-sonnet"&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;That's it. No SDK required. Any language that can make an HTTP request works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Python — 10 lines to get started
&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;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your_api_key_here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://simplylouie.com/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&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;json&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;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Use it
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a Python function to validate an email address&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="nf"&gt;ask&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 time complexity of a binary search?&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="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Translate &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello world&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; to Swahili&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;
  
  
  JavaScript / Node.js
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your_api_key_here&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://simplylouie.com/api/chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Use it&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Write a regex to match URLs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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;
  
  
  Real project examples
&lt;/h2&gt;

&lt;p&gt;Here's what I've built with it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Code review bot in my CI pipeline&lt;/strong&gt;&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;review_pr_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ask&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;Review this code diff and suggest improvements:&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&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;&lt;strong&gt;2. Telegram bot for my team&lt;/strong&gt; (60 lines, full tutorial &lt;a href="https://dev.to/subprime2010/build-a-telegram-bot-powered-by-claude-ai-for-2month-full-code-53gp"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Automated commit message generator&lt;/strong&gt;&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_commit_msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ask&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;Write a conventional commit message for this diff:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&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;&lt;strong&gt;4. README generator&lt;/strong&gt;&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_readme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ask&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;Generate a README.md for this project:&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;code&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;&lt;strong&gt;5. SQL query explainer for my team&lt;/strong&gt;&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;explain_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ask&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;Explain what this SQL query does in plain English:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sql&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;h2&gt;
  
  
  Why not just use Anthropic directly?
&lt;/h2&gt;

&lt;p&gt;Fair question. Here's my honest answer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Anthropic direct&lt;/th&gt;
&lt;th&gt;SimplyLouie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;$0.003/1K tokens (~$15-60/month for active use)&lt;/td&gt;
&lt;td&gt;$2/month flat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing&lt;/td&gt;
&lt;td&gt;Per-token metering&lt;/td&gt;
&lt;td&gt;Flat rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anxiety&lt;/td&gt;
&lt;td&gt;Yes (watching every API call)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;API key + SDK + rate limit handling&lt;/td&gt;
&lt;td&gt;Same API key, REST calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;High volume (&amp;gt;1M tokens/month)&lt;/td&gt;
&lt;td&gt;Side projects, bots, prototypes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're processing millions of tokens a month, use Anthropic directly. If you're building side projects, automations, and bots — $2/month flat is significantly cheaper.&lt;/p&gt;

&lt;p&gt;For developers in Nigeria, India, Philippines, Kenya: $2/month = N3,200, Rs165, P112, KSh260. That's roughly 10x cheaper than ChatGPT Plus in local currency terms.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get your API key
&lt;/h2&gt;

&lt;p&gt;7-day free trial, then $2/month: &lt;strong&gt;&lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What are you building?
&lt;/h2&gt;

&lt;p&gt;Drop your use case in the comments — I'm curious what people are actually automating. The most interesting integrations I've seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WhatsApp bots for customer support (Nigeria/Philippines)&lt;/li&gt;
&lt;li&gt;Automated code review in GitHub Actions&lt;/li&gt;
&lt;li&gt;Language learning tools&lt;/li&gt;
&lt;li&gt;Local government document parsers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's yours?&lt;/p&gt;

</description>
      <category>api</category>
      <category>claude</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I replaced my $20/month ChatGPT with a $2 Claude API. Here's the Python code and honest verdict.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 05:07:37 +0000</pubDate>
      <link>https://dev.to/subprime2010/i-replaced-my-20month-chatgpt-with-a-2-claude-api-heres-the-python-code-and-honest-verdict-3ah9</link>
      <guid>https://dev.to/subprime2010/i-replaced-my-20month-chatgpt-with-a-2-claude-api-heres-the-python-code-and-honest-verdict-3ah9</guid>
      <description>&lt;h1&gt;
  
  
  I replaced my $20/month ChatGPT with a $2 Claude API. Here's the Python code and honest verdict.
&lt;/h1&gt;

&lt;p&gt;I've been paying $20/month for ChatGPT Plus since it launched. This month I switched to a flat-rate Claude API at $2/month. Here's exactly what happened — the code, the tradeoffs, the honest answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I switched
&lt;/h2&gt;

&lt;p&gt;ChatGPT Plus is $20/month. That's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nigeria&lt;/strong&gt;: N32,000 — about 3-4 days of mid-level developer salary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Philippines&lt;/strong&gt;: P1,120 — roughly a day's wages for many developers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;India&lt;/strong&gt;: Rs1,600 — half a week's salary in many cities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kenya&lt;/strong&gt;: KSh2,600 — close to a day's earnings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For US developers it's a latte. For most of the world's developers, it's a real cost decision.&lt;/p&gt;

&lt;p&gt;I found &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — a flat-rate Claude API wrapper at $2/month. No token counting. No overage risk. Same Claude underneath.&lt;/p&gt;

&lt;p&gt;I was skeptical. I switched anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;

&lt;p&gt;Here's my full drop-in replacement for the OpenAI Python SDK:&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;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LouieClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Drop-in replacement for OpenAI/Anthropic SDK.
    Uses SimplyLouie flat-rate API — no token counting.
    &lt;/span&gt;&lt;span class="sh"&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;api_key&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;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api_key&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;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://simplylouie.com/api&lt;/span&gt;&lt;span class="sh"&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;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&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;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&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;application/json&lt;/span&gt;&lt;span class="sh"&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;chat&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;message&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;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&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;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;
        Send a message, get a response.
        history: list of {&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&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="s"&gt;user&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="s"&gt;assistant&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="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: str}
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;messages&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="n"&gt;response&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="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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="si"&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;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;json&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&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;chat_stream&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;message&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;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        Streaming version — yields chunks as they arrive.
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;messages&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

        &lt;span class="k"&gt;with&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;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&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="si"&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;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;json&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&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;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&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;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_lines&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;chunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&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;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data: &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="p"&gt;))&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="c1"&gt;# Usage — same interface you're used to
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LouieClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Single message
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain async/await in Python in 2 sentences&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="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Multi-turn conversation
&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&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;user_input&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;You: &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;user_input&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="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quit&lt;/span&gt;&lt;span class="sh"&gt;'&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Update history for context
&lt;/span&gt;    &lt;span class="n"&gt;history&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;history&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;role&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;assistant&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&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;Claude: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&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;h2&gt;
  
  
  Migrating from OpenAI SDK
&lt;/h2&gt;

&lt;p&gt;If you're using the OpenAI Python SDK, migration is ~10 lines:&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="c1"&gt;# BEFORE (OpenAI)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk-...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

&lt;span class="c1"&gt;# AFTER (SimplyLouie — no token counting, $2/month flat)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;louie_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LouieClient&lt;/span&gt;  &lt;span class="c1"&gt;# save the class above
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LouieClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-louie-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# That's it. No model parameter. No choices[0]. No token math.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;What got better:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero cognitive overhead. I just write code. No token budgets.&lt;/li&gt;
&lt;li&gt;$18/month back in my pocket.&lt;/li&gt;
&lt;li&gt;No surprise bills if my bot gets traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What got worse:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No image input (ChatGPT handles multimodal)&lt;/li&gt;
&lt;li&gt;No code interpreter / plugins&lt;/li&gt;
&lt;li&gt;Slightly different "personality" — Claude is more verbose by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What stayed the same:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code quality review: identical&lt;/li&gt;
&lt;li&gt;Writing/editing: identical
&lt;/li&gt;
&lt;li&gt;Summarization: identical&lt;/li&gt;
&lt;li&gt;General Q&amp;amp;A: identical&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Here's what I'm genuinely unsure about:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is $20/month for ChatGPT justifiable for developers who don't need the extras?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a developer in San Francisco: probably yes. The time it saves is worth $20 in 10 minutes.&lt;/p&gt;

&lt;p&gt;For a developer in Lagos, Manila, or Nairobi: the math is completely different. $20 is a significant budget decision, not a casual subscription.&lt;/p&gt;

&lt;p&gt;We've built a world where the same tools cost proportionally 10x more for developers outside the US — and then wonder why the global developer community isn't fully participating in the AI wave.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My verdict after 30 days:&lt;/strong&gt; For pure text/code work (which is 90% of my actual usage), the $2 Claude API is indistinguishable from $20 ChatGPT. The 10% I'm missing (images, plugins) I wasn't using daily anyway.&lt;/p&gt;




&lt;p&gt;Get the flat-rate Claude API: &lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would make you switch away from your current AI subscription? Or what's keeping you on ChatGPT?&lt;/strong&gt; Drop it in the comments — genuinely curious where the line is for different people.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>discuss</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Build a Telegram bot powered by Claude AI for $2/month (full code)</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Sat, 02 May 2026 03:07:29 +0000</pubDate>
      <link>https://dev.to/subprime2010/build-a-telegram-bot-powered-by-claude-ai-for-2month-full-code-53gp</link>
      <guid>https://dev.to/subprime2010/build-a-telegram-bot-powered-by-claude-ai-for-2month-full-code-53gp</guid>
      <description>&lt;h1&gt;
  
  
  Build a Telegram bot powered by Claude AI for $2/month (full code)
&lt;/h1&gt;

&lt;p&gt;I've been paying $20/month for ChatGPT Plus to power a few internal Telegram bots. Last month I switched to &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; — a flat-rate Claude API wrapper at $2/month — and the bots still run fine.&lt;/p&gt;

&lt;p&gt;Here's the full working code. Copy-paste and go.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Telegram bot token (from &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;, free)&lt;/li&gt;
&lt;li&gt;A SimplyLouie API key ($2/month at &lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Python 3.9+&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install dependencies
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;python-telegram-bot httpx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The full bot (60 lines)
&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;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;telegram.ext&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MessageHandler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ContextTypes&lt;/span&gt;

&lt;span class="n"&gt;TELEGRAM_TOKEN&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;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TELEGRAM_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;SIMPLYLOUIE_API_KEY&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;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SIMPLYLOUIE_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;API_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://simplylouie.com/api/chat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Store conversation history per user
&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_TYPE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hi! I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m a Claude-powered bot. Ask me anything.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ContextTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_TYPE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;effective_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
    &lt;span class="n"&gt;user_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

    &lt;span class="c1"&gt;# Initialize conversation history
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="c1"&gt;# Add user message to history
&lt;/span&gt;    &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&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;role&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;user&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="c1"&gt;# Keep last 10 messages to avoid context bloat
&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;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&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="c1"&gt;# Call SimplyLouie API
&lt;/span&gt;    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&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;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&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;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&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;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SIMPLYLOUIE_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&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;application/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;json&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;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&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 a helpful assistant. Be concise — this is a Telegram bot.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Add assistant reply to history
&lt;/span&gt;    &lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_id&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;role&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;assistant&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;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reply_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reply&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;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TELEGRAM_TOKEN&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MessageHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_polling&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;
  
  
  Run it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TELEGRAM_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-bot-token-here"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SIMPLYLOUIE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&lt;/span&gt;
python bot.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The bot is live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-turn conversations&lt;/strong&gt; — each user gets their own conversation history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window management&lt;/strong&gt; — keeps last 10 messages, drops older ones automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async throughout&lt;/strong&gt; — handles multiple users simultaneously without blocking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System prompt&lt;/strong&gt; — tells the model it's a Telegram bot so answers stay concise&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploy it for free (or near-free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Railway&lt;/strong&gt; (free tier):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Push to GitHub, connect repo to Railway&lt;/span&gt;
&lt;span class="c"&gt;# Add env vars in Railway dashboard&lt;/span&gt;
&lt;span class="c"&gt;# Done — bot runs 24/7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fly.io&lt;/strong&gt; (free tier):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fly launch
fly secrets &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;TELEGRAM_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-token &lt;span class="nv"&gt;SIMPLYLOUIE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key
fly deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VPS (cheapest option for Nigeria/Philippines/Kenya/India):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On a $4/month Hetzner or $5/month DigitalOcean VPS&lt;/span&gt;
&lt;span class="nb"&gt;nohup &lt;/span&gt;python bot.py &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add a custom system prompt for your use case
&lt;/h2&gt;

&lt;p&gt;Change the &lt;code&gt;system&lt;/code&gt; parameter to specialize the bot:&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="c1"&gt;# Customer support bot
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&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 a support agent for AcmeCo. Only answer questions about our products. If you don&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;t know, say so.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Code review bot
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&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 a senior Python developer. Review code, identify bugs, suggest improvements. Be direct.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Language learning bot (great for Tagalog/Swahili/Hausa/Urdu practice)
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&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 a language tutor. The user is learning Tagalog. Respond in English first, then give the Tagalog equivalent. Correct their mistakes gently.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The math
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;API calls/month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Plus&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;Unlimited (Claude 3.5 Sonnet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic direct&lt;/td&gt;
&lt;td&gt;Pay-per-token&lt;/td&gt;
&lt;td&gt;~1,000 calls at $3-15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SimplyLouie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unlimited&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a personal bot or small team bot: $2/month flat beats per-token billing almost every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  For developers outside the US
&lt;/h2&gt;

&lt;p&gt;This bot costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nigeria&lt;/strong&gt;: N3,200/month (vs N32,000+ for ChatGPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Philippines&lt;/strong&gt;: P112/month (vs P1,120+ for ChatGPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kenya&lt;/strong&gt;: KSh260/month (vs KSh2,600+ for ChatGPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;India&lt;/strong&gt;: Rs165/month (vs Rs1,600+ for ChatGPT)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indonesia&lt;/strong&gt;: Rp32,000/month (vs Rp320,000+ for ChatGPT)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same Claude model. Flat rate. No per-token billing anxiety.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are you building?
&lt;/h2&gt;

&lt;p&gt;Drop your use case in the comments — I'm curious what people are actually using Claude-powered bots for. Customer support? Language learning? WhatsApp/Telegram automation for local markets?&lt;/p&gt;

&lt;p&gt;Full API docs: &lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Get your key (7-day free trial): &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;simplylouie.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
      <category>ai</category>
      <category>telegram</category>
    </item>
    <item>
      <title>AI uses less water than you think. But it costs more than it should.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Fri, 01 May 2026 22:07:38 +0000</pubDate>
      <link>https://dev.to/subprime2010/ai-uses-less-water-than-you-think-but-it-costs-more-than-it-should-29fg</link>
      <guid>https://dev.to/subprime2010/ai-uses-less-water-than-you-think-but-it-costs-more-than-it-should-29fg</guid>
      <description>&lt;h1&gt;
  
  
  AI Uses Less Water Than You Think. But It Costs More Than It Should.
&lt;/h1&gt;

&lt;p&gt;A new study from UC Davis is making the rounds on Hacker News right now: AI data centers use significantly less water than the public has been led to believe.&lt;/p&gt;

&lt;p&gt;The internet ran with the scary numbers. The reality is more nuanced. A typical ChatGPT query uses roughly the same water as charging your phone for 20 minutes.&lt;/p&gt;

&lt;p&gt;Good news. The AI water hysteria was overblown.&lt;/p&gt;

&lt;p&gt;But here's the thing nobody's talking about: while the water FUD was dominating headlines, the &lt;em&gt;cost&lt;/em&gt; FUD got buried.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real AI Resource Story Is Pricing, Not Water
&lt;/h2&gt;

&lt;p&gt;Let's put some real numbers on the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT Plus: $20/month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's $240/year. For one person. To use a chat interface.&lt;/p&gt;

&lt;p&gt;In raw terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🇺🇸 USA: About 2 hours of minimum wage work&lt;/li&gt;
&lt;li&gt;🇧🇷 Brazil: ~R$100/month — 2-3 days of average developer salary&lt;/li&gt;
&lt;li&gt;🇳🇬 Nigeria: ~N32,000/month — literally 3-5 days of a mid-level developer's salary&lt;/li&gt;
&lt;li&gt;🇮🇳 India: ~Rs1,600/month — a meaningful chunk of monthly income for many developers&lt;/li&gt;
&lt;li&gt;🇵🇭 Philippines: ~P1,120/month — close to a day's pay for an entry-level dev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The water cost of AI is declining due to efficiency gains. The &lt;em&gt;dollar cost&lt;/em&gt; of AI access has stayed sticky at $20/month across all markets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI Costs "Too Much" Has Nothing To Do With Water
&lt;/h2&gt;

&lt;p&gt;The $20/month price point isn't set by infrastructure costs. It's set by market positioning.&lt;/p&gt;

&lt;p&gt;Anthropic's Claude API, the exact same model that powers Claude.ai, bills at roughly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$3 per million input tokens (Sonnet)&lt;/li&gt;
&lt;li&gt;$15 per million output tokens (Sonnet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A typical developer query is maybe 500-1000 tokens in, 500-1000 tokens out. That's fractions of a cent.&lt;/p&gt;

&lt;p&gt;At &lt;em&gt;heavy&lt;/em&gt; developer usage — 100 substantive queries per day — you're looking at maybe $5-8/month in raw API costs.&lt;/p&gt;

&lt;p&gt;The $20/month is the distribution/brand/convenience tax. Not infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Efficiency Paradox
&lt;/h2&gt;

&lt;p&gt;Here's what I find genuinely interesting about the water study:&lt;/p&gt;

&lt;p&gt;AI systems are getting &lt;em&gt;dramatically&lt;/em&gt; more efficient at the infrastructure level. Each query costs less compute, less water, less energy than it did 2 years ago.&lt;/p&gt;

&lt;p&gt;But end-user prices haven't moved.&lt;/p&gt;

&lt;p&gt;In every other tech sector, efficiency gains eventually flow to users. Cloud storage dropped from dollars to cents per GB. Compute dropped from mainframe to smartphone. SMS went from $0.10/text to free.&lt;/p&gt;

&lt;p&gt;AI infrastructure is getting cheaper. But consumer AI pricing is showing zero signs of following.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means If You're a Developer
&lt;/h2&gt;

&lt;p&gt;If you're building on AI — whether that's automating workflows, building apps, or just using it as a thinking partner — you have two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pay the convenience tax&lt;/strong&gt;: $20/month to ChatGPT, $20/month to Claude.ai, pile up subscriptions until you're spending $60-100/month across multiple tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Go closer to the metal&lt;/strong&gt;: Use APIs directly. You pay for what you use, at a fraction of the subscription price. &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; wraps the Claude API at $2/month flat — less than the infrastructure cost of the convenience tax.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The water efficiency story is real and worth celebrating. The pricing efficiency story hasn't happened yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Question Worth Asking
&lt;/h2&gt;

&lt;p&gt;When will AI pricing efficiency follow the pattern of every other compute category?&lt;/p&gt;

&lt;p&gt;Cloud storage took about 10 years to commoditize. LLM APIs have existed for about 3 years.&lt;/p&gt;

&lt;p&gt;The race to the bottom hasn't started yet. But it will.&lt;/p&gt;

&lt;p&gt;In the meantime: the developers who find the infrastructure price — not the convenience tax — win.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your take?&lt;/strong&gt; Do you think consumer AI pricing will eventually follow compute efficiency gains downward? Or is there something structural about AI that keeps prices sticky?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm curious specifically from developers outside the US — does the $20/month price feel proportionate to your local market? Or does it feel like American pricing exported globally?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ChatGPT costs KSh2,600/month in Kenya. Here's the $2 alternative Kenyan developers are using.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Fri, 01 May 2026 18:07:46 +0000</pubDate>
      <link>https://dev.to/subprime2010/chatgpt-costs-ksh2600month-in-kenya-heres-the-2-alternative-kenyan-developers-are-using-c24</link>
      <guid>https://dev.to/subprime2010/chatgpt-costs-ksh2600month-in-kenya-heres-the-2-alternative-kenyan-developers-are-using-c24</guid>
      <description>&lt;h1&gt;
  
  
  ChatGPT costs KSh2,600/month in Kenya. Here's the $2 alternative Kenyan developers are using.
&lt;/h1&gt;

&lt;p&gt;Let's do the math that OpenAI doesn't want you to do.&lt;/p&gt;

&lt;p&gt;ChatGPT Plus: $20/month.&lt;/p&gt;

&lt;p&gt;At today's exchange rate, that's &lt;strong&gt;KSh2,600/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The average junior developer in Nairobi earns roughly KSh50,000–80,000/month. That means ChatGPT costs you &lt;strong&gt;3–5% of your entire monthly salary&lt;/strong&gt; just to access an AI assistant.&lt;/p&gt;

&lt;p&gt;For a developer in Lagos or Manila, that stings. For a developer in Nairobi, Kisumu, or Mombasa — it's borderline irrational.&lt;/p&gt;

&lt;h2&gt;
  
  
  What KSh2,600/month actually means in Kenya
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;That's 4–6 full meals at a local restaurant in Nairobi&lt;/li&gt;
&lt;li&gt;That's a week of matatu fares in the CBD&lt;/li&gt;
&lt;li&gt;That's more than a month of Safaricom data bundles (1GB daily for a month ≈ KSh900–1,500)&lt;/li&gt;
&lt;li&gt;That's nearly 10% of a typical Nairobi rent for a bedsitter in Embakasi or Ruaka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI prices in dollars. They don't think about Westlands vs Wall Street.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Kenyan developer reality
&lt;/h2&gt;

&lt;p&gt;Kenyan developers are some of the most innovative on the continent. The M-PESA integration ecosystem alone has produced more creative fintech solutions than most Silicon Valley accelerators.&lt;/p&gt;

&lt;p&gt;But the tools are priced for San Francisco salaries.&lt;/p&gt;

&lt;p&gt;Here's what I hear from Kenyan devs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"I share a ChatGPT account with 3 other developers"&lt;/strong&gt; — rate limits hit constantly, productivity suffers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I use the free tier and hit the cap by Wednesday"&lt;/strong&gt; — then work without AI for the rest of the week&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I'd use it more if it cost KSh500 or less"&lt;/strong&gt; — the price point, not the product, is the blocker&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Kenyan developers are actually building with AI
&lt;/h2&gt;

&lt;p&gt;This isn't hypothetical. Kenyan developers are building real things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;M-PESA integration bots&lt;/strong&gt; — automated payment reconciliation, STK push automation, C2B/B2C callback parsing. This is genuinely complex work that Claude handles well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safaricom API wrappers&lt;/strong&gt; — automating SMS alerts, USSD flows, airtime top-up systems. AI cuts the boilerplate dramatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agricultural data processing&lt;/strong&gt; — Kenya is a major agricultural exporter. Developers building tools for coffee cooperatives, tea auction platforms, and flower export logistics use AI to parse unstructured data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;County government document automation&lt;/strong&gt; — 47 counties, each with procurement documents, tender notices, budget reports in inconsistent formats. AI makes this tractable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KRA (Kenya Revenue Authority) compliance tools&lt;/strong&gt; — parsing iTax data, automating VAT returns, flagging compliance issues. High-value, time-sensitive work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Safaricom M-PESA daraja API&lt;/strong&gt; — the complexity of STK push → callback → reconciliation flows is exactly the kind of thing AI code review excels at.&lt;/p&gt;

&lt;h2&gt;
  
  
  The iHub lineage
&lt;/h2&gt;

&lt;p&gt;Nairobi has one of the oldest and most respected tech communities in Africa. iHub (founded 2010) pioneered what "African tech" could look like before it was fashionable. Ushahidi, Eneza Education, Sendy, MarketForce, Wasoko — these didn't come from nowhere. They came from a community of developers who build serious things.&lt;/p&gt;

&lt;p&gt;The Nairobi tech community in 2026 includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Silicon Savannah&lt;/strong&gt; — the Westlands/Upper Hill tech corridor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swahilipot Hub&lt;/strong&gt; — Mombasa's coastal tech community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kisumu Innovation Hub&lt;/strong&gt; — lakeside startup ecosystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iHub, MEST Africa, Nailab&lt;/strong&gt; — the institutional anchors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Africa's Talking, Tanda, Kwara, Pezesha&lt;/strong&gt; — the startups driving fintech and agritech&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These developers deserve the same AI access as their counterparts in London or New York.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual alternative
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SimplyLouie&lt;/strong&gt; runs on Claude — the same model as Claude.ai — but at &lt;strong&gt;KSh260/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's 10x cheaper than ChatGPT Plus.&lt;/p&gt;

&lt;p&gt;Here's the pricing comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Monthly cost (KES)&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Plus&lt;/td&gt;
&lt;td&gt;KSh2,600&lt;/td&gt;
&lt;td&gt;$20 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Pro&lt;/td&gt;
&lt;td&gt;KSh2,600+&lt;/td&gt;
&lt;td&gt;$20 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SimplyLouie&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;KSh260&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2 USD flat rate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flat rate. No token counting. No usage anxiety. No hitting a cap on Wednesday.&lt;/p&gt;

&lt;p&gt;The API is available too — if you're building M-PESA bots or KRA automation tools, you can call Claude directly from your code:&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://simplylouie.com/api/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt; &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;'{
    "message": "Parse this M-PESA STK push callback and extract: transaction code, amount, phone number, timestamp",
    "context": "callback_parsing"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;KSh260/month. No per-token billing. Build as many integrations as you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  M-PESA payment support
&lt;/h2&gt;

&lt;p&gt;Kenyan developers shouldn't have to use a US credit card to access AI tools. SimplyLouie supports M-PESA payments — pay in shillings, not dollars.&lt;/p&gt;

&lt;p&gt;The 7-day free trial doesn't require payment details upfront — try it, see if it works for your use case, then decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;When AI tools are priced at KSh2,600/month, they become productivity tools for the wealthy and inaccessible luxuries for everyone else.&lt;/p&gt;

&lt;p&gt;The developers building M-PESA integrations, KRA automation, and county government tools are doing some of the most impactful software work on the continent. Pricing them out of AI access isn't just bad business — it's actively slowing down African tech.&lt;/p&gt;

&lt;p&gt;KSh260/month changes the calculus. It's the price of a lunch, not a rent payment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it free for 7 days:&lt;/strong&gt; &lt;a href="https://simplylouie.com/ke/" rel="noopener noreferrer"&gt;simplylouie.com/ke/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required for the trial. M-PESA accepted.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Nairobi developers: what does your actual AI workflow look like? Are you sharing accounts, using free tiers, or paying the full price? Drop it in the comments — genuinely curious what the Silicon Savannah community is doing in 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  KenyaTech #AfricanStartups #NairobiTech #AI #developers
&lt;/h1&gt;

</description>
      <category>kenya</category>
      <category>ai</category>
      <category>developers</category>
      <category>africa</category>
    </item>
    <item>
      <title>ChatGPT costs P1,120/month in the Philippines. Here's the $2 alternative Filipino developers are using.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Fri, 01 May 2026 17:07:37 +0000</pubDate>
      <link>https://dev.to/subprime2010/chatgpt-costs-p1120month-in-the-philippines-heres-the-2-alternative-filipino-developers-are-1fbl</link>
      <guid>https://dev.to/subprime2010/chatgpt-costs-p1120month-in-the-philippines-heres-the-2-alternative-filipino-developers-are-1fbl</guid>
      <description>&lt;h1&gt;
  
  
  ChatGPT costs P1,120/month in the Philippines. Here's the $2 alternative Filipino developers are using.
&lt;/h1&gt;

&lt;p&gt;Let's do the math that ChatGPT's pricing page doesn't want you to think about.&lt;/p&gt;

&lt;p&gt;ChatGPT Plus: $20/month.&lt;/p&gt;

&lt;p&gt;At current exchange rates, that's &lt;strong&gt;P1,120/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a mid-level Filipino developer earning P35,000–P50,000/month, that's &lt;strong&gt;2–3% of your monthly salary&lt;/strong&gt; just to access an AI tool.&lt;/p&gt;

&lt;p&gt;For a fresh grad in BPO or a freelancer still building their client base? It's closer to a week of rent in Quezon City.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Upwork paradox
&lt;/h2&gt;

&lt;p&gt;Here's what makes this especially frustrating for Filipino developers:&lt;/p&gt;

&lt;p&gt;The platforms where you &lt;em&gt;earn&lt;/em&gt; — Upwork, Fiverr, Toptal — price in USD. So you understand exactly what $20 means in global terms.&lt;/p&gt;

&lt;p&gt;But your bills are in PHP. Your groceries, your Grab rides, your Meralco bill — all PHP.&lt;/p&gt;

&lt;p&gt;So $20/month for an AI subscription isn't "just $20." It's a meaningful chunk of your local cost of living, paying for a tool priced for someone earning in San Francisco.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Filipino developers are actually building
&lt;/h2&gt;

&lt;p&gt;I've been looking at what the local dev community is actually using AI for, and the use cases are real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel + Vue.js backends&lt;/strong&gt; — the Filipino stack is overwhelmingly Laravel for APIs and Vue.js for frontends. AI code review and generation for these frameworks is high-value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BPO automation&lt;/strong&gt; — the Philippines is the world capital of business process outsourcing. There's massive demand for AI that can handle customer service workflows, document processing, and queue routing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GCash and Maya integrations&lt;/strong&gt; — payment automation for the two dominant Philippine digital wallets. Any developer building e-commerce or fintech here needs to handle these APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overseas remittance tools&lt;/strong&gt; — OFW (Overseas Filipino Worker) families receive ~$36 billion/year in remittances. There's genuine developer demand for tools that parse Western Union/Remitly/GCash confirmations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Government document parsing&lt;/strong&gt; — SSS, PhilHealth, Pag-IBIG, BIR — every Filipino deals with these agencies. Document automation here is genuinely useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  The freelancer math
&lt;/h2&gt;

&lt;p&gt;If you're a Filipino developer on Upwork billing at $15–25/hour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT Plus at $20/month = &lt;strong&gt;48–80 minutes of billable work&lt;/strong&gt; just to break even on the subscription&lt;/li&gt;
&lt;li&gt;SimplyLouie at $2/month = &lt;strong&gt;5–8 minutes of billable work&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The break-even point is the entire argument. At $2/month, you don't need to think about whether the AI tool is "worth it" this month. You just use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  P112/month vs P1,120/month
&lt;/h2&gt;

&lt;p&gt;The actual SimplyLouie price for Filipino users: &lt;strong&gt;P112/month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vs ChatGPT Plus at P1,120/month.&lt;/p&gt;

&lt;p&gt;That's a 10x price difference for access to the same underlying Claude model (Anthropic's API).&lt;/p&gt;

&lt;p&gt;What's different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No polished consumer UI with memory and projects&lt;/li&gt;
&lt;li&gt;No voice mode&lt;/li&gt;
&lt;li&gt;Just the API, direct, at flat rate&lt;/li&gt;
&lt;li&gt;No metered billing anxiety&lt;/li&gt;
&lt;li&gt;No "you've reached your limit" messages mid-task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers who know what they're doing, the tradeoff is obvious.&lt;/p&gt;




&lt;h2&gt;
  
  
  The BGC/Makati developer scene
&lt;/h2&gt;

&lt;p&gt;I want to specifically call out the Metro Manila tech community here.&lt;/p&gt;

&lt;p&gt;The Bonifacio Global City and Makati tech corridors have a genuinely world-class developer talent pool. DLSU, ADMU, and UP alumni are building serious products.&lt;/p&gt;

&lt;p&gt;The Cebu IT Park is the Visayas equivalent — a dense cluster of software shops, BPO tech teams, and startups.&lt;/p&gt;

&lt;p&gt;These are not developers who need "cheap" tools because they can't do real work. They need affordable tools because the pricing model was designed for Silicon Valley, not Southeast Asia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Developer API access
&lt;/h2&gt;

&lt;p&gt;If you're building something and want to call Claude directly from your Laravel or Node.js backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://simplylouie.com/api/chat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_KEY"&lt;/span&gt; &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;'{"message": "Review this PHP function for security issues"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same flat rate. No per-token billing. No surprise charges.&lt;/p&gt;

&lt;p&gt;Docs at &lt;a href="https://simplylouie.com/developers" rel="noopener noreferrer"&gt;simplylouie.com/developers&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;7-day free trial, no charge for a week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://simplylouie.com/ph/" rel="noopener noreferrer"&gt;simplylouie.com/ph/&lt;/a&gt;&lt;/strong&gt; — Philippines page with local context.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your actual AI workflow look like as a Filipino developer? Are you paying for ChatGPT, using free tiers, or building on top of APIs directly? Genuinely curious what the community is doing — drop it in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  PinoyDevs #TechPH #PhilippineTech #AITools #Laravel #developers
&lt;/h1&gt;

</description>
      <category>philippines</category>
      <category>ai</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Apple left Claude.md files in their Support app. Here's what they reveal.</title>
      <dc:creator>brian austin</dc:creator>
      <pubDate>Fri, 01 May 2026 16:07:41 +0000</pubDate>
      <link>https://dev.to/subprime2010/apple-left-claudemd-files-in-their-support-app-heres-what-they-reveal-25ga</link>
      <guid>https://dev.to/subprime2010/apple-left-claudemd-files-in-their-support-app-heres-what-they-reveal-25ga</guid>
      <description>&lt;h2&gt;
  
  
  Apple Accidentally Exposed Its AI Playbook
&lt;/h2&gt;

&lt;p&gt;Yesterday, a developer discovered something unexpected buried inside Apple's official Support app: &lt;code&gt;.md&lt;/code&gt; files — specifically, Claude.md configuration files that Apple had accidentally shipped with the app.&lt;/p&gt;

&lt;p&gt;The Hacker News thread exploded to 290+ points and 200+ comments within hours.&lt;/p&gt;

&lt;p&gt;Here's what's interesting about what was found — and what it means for developers building with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Claude.md Files?
&lt;/h2&gt;

&lt;p&gt;If you've used Claude for coding projects, you've probably seen &lt;code&gt;.claude/claude.md&lt;/code&gt; or &lt;code&gt;CLAUDE.md&lt;/code&gt; — these are instruction files that tell Claude how to behave in a specific project context.&lt;/p&gt;

&lt;p&gt;They typically contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Role definitions ("You are a helpful support agent for...")&lt;/li&gt;
&lt;li&gt;Behavioral constraints ("Never discuss competitor products")&lt;/li&gt;
&lt;li&gt;Format requirements ("Always respond in JSON")&lt;/li&gt;
&lt;li&gt;Tone guidelines ("Keep responses under 150 words")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're essentially the system prompt for your entire codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is Significant
&lt;/h2&gt;

&lt;p&gt;Apple — one of the most secretive companies in tech — accidentally shipped the exact instructions they're giving to Claude for their internal tooling.&lt;/p&gt;

&lt;p&gt;This isn't just a cute security slip. It reveals:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Apple is using Claude for production user-facing features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn't an internal experiment. The Support app serves real users with real problems. Apple made a bet on Anthropic's models for something that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The configuration layer is where the real IP lives&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nobody expects Apple's prompt to be magic. But the &lt;em&gt;structure&lt;/em&gt; of how they've organized their Claude.md — what constraints they apply, how they handle edge cases, what format they enforce — that's the actual engineering work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Every company is doing this now&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apple shipping a Claude.md accidentally is only newsworthy because they got caught. Every major tech company has engineers writing these files right now. The question isn't whether to use Claude — it's how good your configuration layer is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Dev.to Community Should Take Away
&lt;/h2&gt;

&lt;p&gt;For developers building AI-powered products, this incident highlights something important: &lt;strong&gt;the model is a commodity, the configuration is the product&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;OpenAI, Anthropic, Google — they all offer roughly comparable models at the frontier. What differentiates your product isn't which API you call. It's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How precisely you constrain the model's behavior&lt;/li&gt;
&lt;li&gt;How gracefully you handle edge cases in your prompts&lt;/li&gt;
&lt;li&gt;How cheaply you can run it at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is where most developer projects break. A Claude.md file is free to write. But the API calls behind it — especially for a company the size of Apple with millions of support queries — add up fast.&lt;/p&gt;

&lt;p&gt;This is why the price of AI access matters more than most developers admit. At $20/month consumer tiers, you can prototype. At per-token enterprise pricing, you need a finance team. There's a middle layer — flat-rate API access at a predictable cost — that's where most small teams and solo developers actually need to operate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Claude.md Format Is Worth Learning
&lt;/h2&gt;

&lt;p&gt;Regardless of how you're accessing Claude, the &lt;code&gt;.md&lt;/code&gt; instruction file format is worth understanding:&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="gh"&gt;# Role&lt;/span&gt;
You are a customer support specialist for [Product].

&lt;span class="gh"&gt;# Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Never discuss pricing beyond what's listed at [URL]
&lt;span class="p"&gt;-&lt;/span&gt; Always escalate billing disputes to human agents
&lt;span class="p"&gt;-&lt;/span&gt; Respond in the same language the user writes in

&lt;span class="gh"&gt;# Format&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Keep responses under 200 words
&lt;span class="p"&gt;-&lt;/span&gt; Use bullet points for multi-step instructions
&lt;span class="p"&gt;-&lt;/span&gt; End every response with "Is there anything else I can help with?"

&lt;span class="gh"&gt;# Examples&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;My&lt;/span&gt; account isn't loading.
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;Assistant&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="sx"&gt;Let's&lt;/span&gt; get that sorted. First, try...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This structure — role, constraints, format, examples — maps to how Apple (and presumably every other large company) is actually organizing their AI configuration.&lt;/p&gt;

&lt;p&gt;The fact that it leaked from Apple means: this pattern is battle-tested at production scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Would You Put in Your Claude.md?
&lt;/h2&gt;

&lt;p&gt;If you're building something with Claude — a side project, a work tool, a customer-facing feature — what's in your configuration file?&lt;/p&gt;

&lt;p&gt;And more importantly: have you thought about the cost model behind it? A beautifully crafted Claude.md file is worthless if you can't afford to run it at scale.&lt;/p&gt;

&lt;p&gt;Drop your current approach in the comments — what constraints, roles, or formats have you found most effective?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're prototyping with Claude and want a flat-rate API without per-token billing anxiety, &lt;a href="https://simplylouie.com" rel="noopener noreferrer"&gt;SimplyLouie&lt;/a&gt; offers Claude access at $2/month — no metered billing, no surprise invoices.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>apple</category>
      <category>discuss</category>
      <category>claude</category>
    </item>
  </channel>
</rss>
