<?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: charlie s'</title>
    <description>The latest articles on DEV Community by charlie s' (@charlie_s_c9de68658cfe2a).</description>
    <link>https://dev.to/charlie_s_c9de68658cfe2a</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%2F3591118%2Fc10b9b84-b8eb-43b7-b91d-f6341838200f.png</url>
      <title>DEV Community: charlie s'</title>
      <link>https://dev.to/charlie_s_c9de68658cfe2a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charlie_s_c9de68658cfe2a"/>
    <language>en</language>
    <item>
      <title>The $50 Coffee That Changed My Mind About AI: From Novelty to Playbook</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Mon, 10 Nov 2025 01:59:11 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/the-50-coffee-that-changed-my-mind-about-ai-from-novelty-to-playbook-4n5d</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/the-50-coffee-that-changed-my-mind-about-ai-from-novelty-to-playbook-4n5d</guid>
      <description>&lt;p&gt;An interesting story (purely fictional): I spent $50, not to buy coffee, but to understand how artificial intelligence can translate personalization into pricing power, and a practical blueprint that any entrepreneur can learn from.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☕ The Coffee Shop That Shouldn’t Exist
&lt;/h3&gt;

&lt;p&gt;Walking through downtown Portland, I saw a sign: “AI-Crafted Coffee — $50 per cup.” Ridiculous… until it wasn’t.&lt;/p&gt;

&lt;p&gt;Inside, the owner, Sarah, explained her setup. An AI system analyzes live context—weather, sentiment, local events, neighborhood trends—and proposes a blend for that exact moment and person.&lt;/p&gt;

&lt;p&gt;“People think I charge for coffee,” she said. “I charge for a personalized experience no human barista could create on the fly.”&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 The Numbers Behind the Magic
&lt;/h3&gt;

&lt;p&gt;Sarah tracks 47 variables: temperature, humidity, local news sentiment, social media trends, customer mood inputs—processed in seconds into a recipe.&lt;/p&gt;

&lt;p&gt;Revenue per square foot beats nearby chains&lt;br&gt;
Throughput: ~20 customers/day paying ~10× typical price&lt;br&gt;
Margins: ~3× those of traditional shops&lt;br&gt;
She isn’t competing on price or speed. She’s competing on precision-fit experiences that only AI can scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 The Taste Test (And Why It Works)
&lt;/h3&gt;

&lt;p&gt;I answered five questions: energy level, day quality, favorite season, sweet vs. bitter, typical sleep time. Eight minutes later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ethiopian for brightness&lt;/li&gt;
&lt;li&gt;Colombian for smoothness&lt;/li&gt;
&lt;li&gt;Cinnamon because the AI detected stress in my voice&lt;/li&gt;
&lt;li&gt;Vanilla because Tuesday afternoons skew toward “comfort” flavors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was the best coffee I’ve had. More importantly, I felt understood—the drink felt made for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧭 What This Means For Builders and Businesses
&lt;/h3&gt;

&lt;p&gt;Most businesses ship one product and one message, hoping “most people” fit. AI flips that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personalize flows, not just outputs&lt;/li&gt;
&lt;li&gt;Charge for fit, not features&lt;/li&gt;
&lt;li&gt;Scale “micro-rightness” in real time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI isn’t only for efficiency. It’s a revenue strategy when it engineers experiences customers can’t get anywhere else.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 The Real Lesson: Dynamic &amp;gt; Static
&lt;/h3&gt;

&lt;p&gt;I went back three days later. Different weather, different mood, different blend. The system adapted without ceremony.&lt;/p&gt;

&lt;p&gt;“Most shops serve the same drink every time,” Sarah said. “But people change every day.”&lt;/p&gt;

&lt;p&gt;That’s the future: not mass production, but mass personalization—without needing Amazon-scale resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 The Builder’s Playbook: Recreate This Pattern
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1) Data Signals To Track
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Context: weather, time of day, local events, traffic patterns&lt;/li&gt;
&lt;li&gt;User state: mood, energy, intent, recent behavior&lt;/li&gt;
&lt;li&gt;Social/ambient sentiment: local news, trending topics&lt;/li&gt;
&lt;li&gt;Operational constraints: queue length, inventory, staff load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with 5–10 high-signal inputs; expand only if outcomes improve.&lt;/p&gt;

&lt;h4&gt;
  
  
  2) Personalization Engine (MVP Architecture)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ingest: lightweight collectors + a job queue&lt;/li&gt;
&lt;li&gt;Feature store: normalized features (rolling windows: 1h, 24h, 7d)&lt;/li&gt;
&lt;li&gt;Policy: rules + LLM-generated “recipe” or “offer”&lt;/li&gt;
&lt;li&gt;Execution: render the personalized output with constraints&lt;/li&gt;
&lt;li&gt;Feedback: capture acceptance, conversion, satisfaction → close the loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make jobs idempotent; deduplicate by key: hash(user_id + normalized_input + time_bucket). Cache previews aggressively.&lt;/p&gt;

&lt;h4&gt;
  
  
  3) Latency And UX
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Preview-first: show a micro-recommendation in &amp;lt;2s; refine in background&lt;/li&gt;
&lt;li&gt;Model tiers: fast-cheap for previews; slower-high-quality for finals&lt;/li&gt;
&lt;li&gt;Graceful degrade: sparse signals → sensible default with transparent rationale&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4) Metrics That Matter
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;p50/p95 time to first visible response&lt;/li&gt;
&lt;li&gt;Conversion lift: default → personalized&lt;/li&gt;
&lt;li&gt;7-day repeat usage&lt;/li&gt;
&lt;li&gt;Cost per successful personalized outcome&lt;/li&gt;
&lt;li&gt;Cache hit rate and dedup effectiveness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a metric won’t drive a decision within a week, drop it.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Prompt Patterns (Abstracted Beyond Coffee)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“Given weather=rainy, time=3:30pm, user_energy=low, sentiment=stressed, propose a 2-step experience tailored to ‘comfort + focus’ that completes in &amp;lt;8 minutes and costs &amp;lt;$X.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Generate three variants: (A) comfort-forward, (B) performance-forward, (C) budget-forward. Include resources in stock. Return JSON with rationale and constraints respected.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Guardrails: token caps, cost ceilings, banned combos, and a validation layer that rejects out-of-policy outputs.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💡 Your “$50 Coffee” Moment
&lt;/h3&gt;

&lt;p&gt;Every product has a premium tier hiding in plain sight: when you stop competing on price and start competing on fit.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What would users pay extra for if it felt made-for-them?&lt;/li&gt;
&lt;li&gt;Which signals prove “now is the right moment”?&lt;/li&gt;
&lt;li&gt;How can AI orchestrate that fit in &amp;lt;2 seconds for a preview and &amp;lt;5 seconds for a final?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sarah started with a simple principle: the experience should match the person and the moment. AI made it operational and consistent. The demand followed.&lt;/p&gt;

&lt;p&gt;The AI revolution isn’t just about better models. It’s about better understanding—and putting it to work at the exact moment of need. That’s how a $50 coffee becomes a playbook, not a novelty.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>machinelearning</category>
      <category>product</category>
    </item>
    <item>
      <title>Anyone Can Impersonate You on GitHub - Here's How to Protect Yourself</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Fri, 07 Nov 2025 02:05:39 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/anyone-can-impersonate-you-on-github-heres-how-to-protect-yourself-4oii</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/anyone-can-impersonate-you-on-github-heres-how-to-protect-yourself-4oii</guid>
      <description>&lt;p&gt;Last week, I found something scary. Anyone can pretend to be you on GitHub. They can commit code using your name. They don't need your password. They don't need any permission.&lt;/p&gt;

&lt;p&gt;Look at this:&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 user.name &lt;span class="s2"&gt;"Linus Torvalds"&lt;/span&gt;
git config user.email &lt;span class="s2"&gt;"torvalds@linux-foundation.org"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Added backdoor (just kidding)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You just committed code as Linus Torvalds. Yes, it's that easy.&lt;/p&gt;

&lt;p&gt;This is not a bug. Git was designed this way. But now we have a problem. Hackers can attack our code. Companies need to verify who wrote what. We need better security.&lt;/p&gt;

&lt;p&gt;I will show you how to fix this. You will learn how to sign your commits with GPG. You will learn other security tips too. Let's start.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 The Problem: Anyone Can Fake Your Identity in Git
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why This Is Bad
&lt;/h3&gt;

&lt;p&gt;Git trusts whatever name you give it. This creates problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fake identity&lt;/strong&gt;: Someone can write bad code using your name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No proof&lt;/strong&gt;: Companies can't prove who wrote the code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source risk&lt;/strong&gt;: Project owners can't verify who is contributing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal trouble&lt;/strong&gt;: You might get blamed for code you didn't write&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Happened Before
&lt;/h3&gt;

&lt;p&gt;In 2021, some researchers tried to add bad code to Linux. They used fake names. The Linux team found out. They banned the whole university from contributing.&lt;/p&gt;

&lt;p&gt;This showed us something important. We need a way to prove who wrote the code.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Solution: Sign Your Commits with GPG
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is GPG?
&lt;/h3&gt;

&lt;p&gt;GPG is a tool. It uses math to prove your identity. Think of it like a signature on a paper document. But this signature is digital. No one can fake it.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You create two keys. One is public. One is private.&lt;/li&gt;
&lt;li&gt;You sign your commit with your private key.&lt;/li&gt;
&lt;li&gt;GitHub checks your signature with your public key.&lt;/li&gt;
&lt;li&gt;If it matches, GitHub shows a "Verified" badge.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to Set It Up
&lt;/h3&gt;

&lt;p&gt;I will show you every step. Follow along.&lt;/p&gt;

&lt;h4&gt;
  
  
  📦 Step 1: Install GPG
&lt;/h4&gt;

&lt;p&gt;First, you need to install GPG on your computer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you use macOS:&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;brew &lt;span class="nb"&gt;install &lt;/span&gt;gnupg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you use Ubuntu or Debian:&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="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;gnupg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If you use Windows:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can download it from gnupg.org. Or you can use this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;choco &lt;span class="nb"&gt;install &lt;/span&gt;gnupg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check if it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the version number.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔑 Step 2: Create Your GPG Key
&lt;/h4&gt;

&lt;p&gt;Now you will create your key. Run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--full-generate-key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program will ask you some questions. Here's what to choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key type&lt;/strong&gt;: Choose option 1 (RSA and RSA)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key size&lt;/strong&gt;: Type 4096 (this is the most secure)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How long is it valid&lt;/strong&gt;: Type 1y (one year is good)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your name&lt;/strong&gt;: Type your real name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your email&lt;/strong&gt;: Type your GitHub email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: Choose a strong password&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpg: key 3AA5C34371567BD2 marked as ultimately trusted
gpg: revocation certificate stored as '/Users/you/.gnupg/openpgp-revocs.d/...'
public and secret key created and signed.

pub   rsa4096 2025-11-07 [SC] [expires: 2026-11-07]
      4AE12B7F3D8C9E6A5B4C1D2E3AA5C34371567BD2
uid                      Your Name &amp;lt;your.email@example.com&amp;gt;
sub   rsa4096 2025-11-07 [E] [expires: 2026-11-07]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save that key ID. You will need it. In this example, the key ID is &lt;code&gt;3AA5C34371567BD2&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  ⚙️ Step 3: Tell Git to Use Your Key
&lt;/h4&gt;

&lt;p&gt;First, find your key ID. Run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--list-secret-keys&lt;/span&gt; &lt;span class="nt"&gt;--keyid-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;long
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sec   rsa4096/3AA5C34371567BD2 2025-11-07 [SC] [expires: 2026-11-07]
      4AE12B7F3D8C9E6A5B4C1D2E3AA5C34371567BD2
uid                 [ultimate] Your Name &amp;lt;your.email@example.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now tell Git to use this key. Replace &lt;code&gt;3AA5C34371567BD2&lt;/code&gt; with your key ID:&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;# Set your signing key&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.signingkey 3AA5C34371567BD2

&lt;span class="c"&gt;# Sign all commits automatically&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; commit.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Sign all tags too&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; tag.gpgsign &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows users need one more step:&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;git config &lt;span class="nt"&gt;--global&lt;/span&gt; gpg.program &lt;span class="s2"&gt;"C:/Program Files (x86)/GnuPG/bin/gpg.exe"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Git where to find GPG.&lt;/p&gt;

&lt;h4&gt;
  
  
  🌐 Step 4: Add Your Key to GitHub
&lt;/h4&gt;

&lt;p&gt;Now you need to give GitHub your public key. First, export it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--armor&lt;/span&gt; &lt;span class="nt"&gt;--export&lt;/span&gt; 3AA5C34371567BD2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGcsh...
[lots of random letters and numbers]
...=abcd
-----END PGP PUBLIC KEY BLOCK-----
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy everything. Include the BEGIN and END lines.&lt;/p&gt;

&lt;p&gt;Now go to GitHub:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://github.com/settings/keys" rel="noopener noreferrer"&gt;GitHub Settings → SSH and GPG keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click "New GPG key"&lt;/li&gt;
&lt;li&gt;Paste your public key&lt;/li&gt;
&lt;li&gt;Click "Add GPG key"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Done!&lt;/p&gt;

&lt;h4&gt;
  
  
  ✨ Step 5: Test It
&lt;/h4&gt;

&lt;p&gt;Let's make a signed commit. Try this:&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;# Create a test file&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"# Signed Commit Test"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; README.md
git add README.md
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"My first signed commit!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check if it worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--show-signature&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit abc123... (HEAD -&amp;gt; main)
gpg: Signature made Fri Nov  7 09:28:00 2025 CST
gpg: Good signature from "Your Name &amp;lt;your.email@example.com&amp;gt;" [ultimate]
Author: Your Name &amp;lt;your.email@example.com&amp;gt;
Date:   Fri Nov 7 09:28:00 2025 +0800

    My first signed commit!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push to GitHub. You will see a green "Verified" badge. You did it!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Common Problems and How to Fix Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem 1: "gpg failed to sign the data"
&lt;/h3&gt;

&lt;p&gt;This is the most common error. Here's how to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, test GPG directly:&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="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt; | gpg &lt;span class="nt"&gt;--clearsign&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this doesn't work, your GPG agent is not running. Start it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpgconf &lt;span class="nt"&gt;--launch&lt;/span&gt; gpg-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it still doesn't work, restart it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpgconf &lt;span class="nt"&gt;--kill&lt;/span&gt; gpg-agent
gpgconf &lt;span class="nt"&gt;--launch&lt;/span&gt; gpg-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Second, set up your terminal:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use macOS or Linux, add this to your shell config file. Open &lt;code&gt;~/.bashrc&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt; and add:&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;export &lt;/span&gt;&lt;span class="nv"&gt;GPG_TTY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;tty&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file. Then run:&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;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now try again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 2: "No secret key"
&lt;/h3&gt;

&lt;p&gt;This means you're using the wrong key ID. Check your keys again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--list-secret-keys&lt;/span&gt; &lt;span class="nt"&gt;--keyid-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;long
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find the right key ID. Update your Git config:&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 &lt;span class="nt"&gt;--global&lt;/span&gt; user.signingkey YOUR_CORRECT_KEY_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problem 3: GPG Asks for Password Every Time
&lt;/h3&gt;

&lt;p&gt;This is annoying. Here's how to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On macOS:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install GPG Suite. It works with your Keychain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; gpg-suite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;On Linux:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Edit your GPG config. Open this file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.gnupg/gpg-agent.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default-cache-ttl 34560000
max-cache-ttl 34560000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file. Reload GPG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg-connect-agent reloadagent /bye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now GPG will remember your password for a long time.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Other Ways to Keep Your Git Safe
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2. Use SSH Keys
&lt;/h3&gt;

&lt;p&gt;SSH keys are another way to prove your identity. They work with GitHub connections.&lt;/p&gt;

&lt;p&gt;Create an SSH key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your.email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new key. The program will ask where to save it. Press Enter for the default location.&lt;/p&gt;

&lt;p&gt;It will ask for a password. Choose a good one.&lt;/p&gt;

&lt;p&gt;Now add it to GitHub:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy your public key:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Go to GitHub Settings → SSH and GPG keys&lt;/li&gt;
&lt;li&gt;Click "New SSH key"&lt;/li&gt;
&lt;li&gt;Paste your key&lt;/li&gt;
&lt;li&gt;Click "Add SSH key"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a welcome message.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Turn On Vigilant Mode
&lt;/h3&gt;

&lt;p&gt;GitHub has a feature called Vigilant Mode. It shows which commits are signed and which are not.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://github.com/settings/keys" rel="noopener noreferrer"&gt;GitHub Settings&lt;/a&gt;. Find "Vigilant mode". Check the box that says "Flag unsigned commits as unverified".&lt;/p&gt;

&lt;p&gt;Now all your unsigned commits will show a warning.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Don't Save Passwords in Git Config
&lt;/h3&gt;

&lt;p&gt;Never put passwords in your Git config file. This is dangerous.&lt;/p&gt;

&lt;p&gt;Bad way:&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;# Don't do this!&lt;/span&gt;
git config user.password &lt;span class="s2"&gt;"secret123"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Good way - use a credential helper:&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 macOS&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; credential.helper osxkeychain

&lt;span class="c"&gt;# On Windows&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; credential.helper manager

&lt;span class="c"&gt;# On Linux&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; credential.helper cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tools save your passwords safely.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Set Up Branch Protection
&lt;/h3&gt;

&lt;p&gt;If you manage a repository, you can force everyone to sign commits.&lt;/p&gt;

&lt;p&gt;Go to your repo settings. Click "Branches". Add a rule. Check these boxes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require signed commits&lt;/li&gt;
&lt;li&gt;Require pull request reviews&lt;/li&gt;
&lt;li&gt;Require status checks to pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now no one can push unsigned commits.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Useful Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pre-commit Hooks
&lt;/h3&gt;

&lt;p&gt;Pre-commit hooks check your code before you commit. They can find security problems.&lt;/p&gt;

&lt;p&gt;Install it:&lt;br&gt;
&lt;/p&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;pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a config file. Make a new file called &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/gitleaks/gitleaks&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v8.18.0&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gitleaks&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/pre-commit/pre-commit-hooks&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v4.5.0&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-added-large-files&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;detect-private-key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pre-commit &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it will check your commits automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Git-secrets
&lt;/h3&gt;

&lt;p&gt;Git-secrets stops you from committing passwords or API keys.&lt;/p&gt;

&lt;p&gt;Install it:&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 macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;git-secrets

&lt;span class="c"&gt;# On other systems, get it from:&lt;/span&gt;
&lt;span class="c"&gt;# https://github.com/awslabs/git-secrets&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set it up in your repo:&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;cd &lt;/span&gt;your-repo
git secrets &lt;span class="nt"&gt;--install&lt;/span&gt;
git secrets &lt;span class="nt"&gt;--register-aws&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it will block commits that contain secrets.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check Signatures in CI/CD
&lt;/h3&gt;

&lt;p&gt;You can check commit signatures automatically. Here's a GitHub Actions example.&lt;/p&gt;

&lt;p&gt;Create a file at &lt;code&gt;.github/workflows/verify-commits.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify Signed Commits&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check commit signatures&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;for commit in $(git rev-list ${{ github.event.before }}..${{ github.sha }}); do&lt;/span&gt;
            &lt;span class="s"&gt;if ! git verify-commit $commit 2&amp;gt;/dev/null; then&lt;/span&gt;
              &lt;span class="s"&gt;echo "Error: Unsigned commit found: $commit"&lt;/span&gt;
              &lt;span class="s"&gt;exit 1&lt;/span&gt;
            &lt;span class="s"&gt;fi&lt;/span&gt;
          &lt;span class="s"&gt;done&lt;/span&gt;
          &lt;span class="s"&gt;echo "Success: All commits are signed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This checks every commit in your pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hardware Keys (YubiKey)
&lt;/h3&gt;

&lt;p&gt;If you want maximum security, you can use a hardware key. A YubiKey is a physical device. It stores your GPG key.&lt;/p&gt;

&lt;p&gt;Here's how to move your key to a YubiKey:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpg &lt;span class="nt"&gt;--edit-key&lt;/span&gt; 3AA5C34371567BD2
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; keytocard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your private key lives on the device. No one can steal it from your computer.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Signed vs Unsigned Commits
&lt;/h2&gt;

&lt;p&gt;Here's a quick comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;th&gt;Without Signing&lt;/th&gt;
&lt;th&gt;With GPG Signing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Proof of identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tamper protection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub badge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Unverified" warning&lt;/td&gt;
&lt;td&gt;Green "Verified" badge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Good for compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time to set up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0 minutes&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Daily effort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None (automatic)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📚 More Resources
&lt;/h2&gt;

&lt;p&gt;Here are some helpful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/authentication/managing-commit-signature-verification" rel="noopener noreferrer"&gt;GitHub Docs: Signing Commits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work" rel="noopener noreferrer"&gt;Git Book: Signing Your Work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/drduh/YubiKey-Guide" rel="noopener noreferrer"&gt;GPG Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Git was built a long time ago. Back then, people trusted each other. Now we have hackers. We have supply chain attacks. We need better security.&lt;/p&gt;

&lt;p&gt;The good news is that fixing this is easy. You spend 10 minutes now. You get security forever.&lt;/p&gt;

&lt;p&gt;You learned a lot today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why Git identity can be faked&lt;/li&gt;
&lt;li&gt;How to set up GPG signing step by step&lt;/li&gt;
&lt;li&gt;How to fix common problems&lt;/li&gt;
&lt;li&gt;Other security tips&lt;/li&gt;
&lt;li&gt;Tools that help you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you know how to protect yourself. Your next commit should be signed. Your code will be more secure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions? I read every comment. Let's make Git more secure together.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>git</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The AI Revolution in 2025: From NVIDIA's New GPUs to Industry Changes</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Thu, 06 Nov 2025 05:01:25 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/the-ai-revolution-in-2025-from-nvidias-new-gpus-to-industry-changes-50bc</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/the-ai-revolution-in-2025-from-nvidias-new-gpus-to-industry-changes-50bc</guid>
      <description>&lt;p&gt;AI technology is changing fast in 2025. New hardware and software are making big impacts across many industries. Let's look at the most important developments that are shaping our tech future.&lt;/p&gt;

&lt;h3&gt;
  
  
  NVIDIA's New Hardware: The RTX 5090 and More
&lt;/h3&gt;

&lt;p&gt;NVIDIA keeps leading AI hardware with strong new releases. The GeForce RTX 5090 is a powerful tool for AI work. It runs popular AI models like Stable Diffusion 3.5 and FLUX.1 up to 17 times faster than older versions . This big performance jump changes how developers work with AI model training and testing.&lt;/p&gt;

&lt;p&gt;NVIDIA also made the Vera Rubin 'superchip' for AI applications. This chip has six trillion transistors. Even the RTX 5090 with its 92-billion transistors looks small next to it . This shows the kind of hardware growth that powers today's AI boom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Big Partnerships Change Industries
&lt;/h3&gt;

&lt;p&gt;NVIDIA's work goes beyond single GPUs. The company made major partnerships that show where AI is going. They work with Samsung to build an AI Factory with 50,000 NVIDIA GPUs. This project aims to change global smart manufacturing. It focuses on AI applications for advanced chip making and mobile devices .&lt;/p&gt;

&lt;p&gt;NVIDIA also works with South Korea to expand the nation's AI infrastructure. They plan to use over 250,000 NVIDIA GPUs. This shows how much countries are investing in AI capabilities .&lt;/p&gt;

&lt;h3&gt;
  
  
  AI Use Becomes Common
&lt;/h3&gt;

&lt;p&gt;The numbers show AI's mainstream adoption clearly. Industry analysis shows that 378 million people will use AI tools in 2025. About 78% of organizations already use AI solutions . Most impressive is that 90% of hospitals now use AI for diagnosis and monitoring. This shows how AI moved from experimental to essential in critical applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  What This Means for Developers
&lt;/h3&gt;

&lt;p&gt;Developers are seeing a big shift in our industry. Machine learning models can now find subtle disease markers earlier than traditional methods. AI applications move beyond simple automation to complex problem-solving across sectors . The industrialization of machine learning becomes a main trend. Organizations focus on scaling AI implementations rather than just testing them .&lt;/p&gt;

&lt;h3&gt;
  
  
  The Developer's Role Going Forward
&lt;/h3&gt;

&lt;p&gt;Powerful hardware like NVIDIA's latest GPUs works with advanced AI models. This creates new opportunities for developers. You might work on healthcare applications, manufacturing automation, or creative tools. The barrier to entry for AI-powered solutions keeps getting lower. At the same time, the potential impact grows bigger.&lt;/p&gt;

&lt;p&gt;Developers need to stay informed about these hardware capabilities. They must understand how to use them in their projects. AI infrastructure is scaling globally and tools are becoming easier to use. 2025 might be the year that AI development becomes available to everyone.&lt;/p&gt;

&lt;p&gt;The combination of better hardware, smarter software, and wider adoption creates a perfect environment for innovation. Developers who understand these trends and adapt their skills will be ready for the AI-powered future that is already here.&lt;/p&gt;

&lt;p&gt;What AI developments excite you most as a developer? How do you plan to use these new capabilities in your projects? Share your thoughts in the comments below!&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>productivity</category>
      <category>developer</category>
    </item>
    <item>
      <title>Building TransMonkey: Lessons Learned from Creating an AI Translation Platform</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Wed, 05 Nov 2025 02:33:11 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/building-transmonkey-lessons-learned-from-creating-an-ai-translation-platform-466e</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/building-transmonkey-lessons-learned-from-creating-an-ai-translation-platform-466e</guid>
      <description>&lt;p&gt;As developers, we often encounter problems that existing tools cannot elegantly solve. My connection with TransMonkey began with a common challenge faced by developers: the fragmentation of language tools makes international collaboration exceptionally complex.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Challenge
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Problem Definition
&lt;/h3&gt;

&lt;p&gt;Working with international teams and content, I consistently faced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fragmented translation workflows&lt;/li&gt;
&lt;li&gt;Poor context preservation in existing tools
&lt;/li&gt;
&lt;li&gt;Expensive enterprise solutions vs. basic free tools&lt;/li&gt;
&lt;li&gt;No unified platform for document, image, and multimedia translation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solution Architecture
&lt;/h3&gt;

&lt;p&gt;TransMonkey addresses these challenges through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-format support: Documents up to 1500K characters&lt;/li&gt;
&lt;li&gt;Image translation: High-resolution processing up to 10MB&lt;/li&gt;
&lt;li&gt;Multimedia pipeline: Unified transcription, translation, and dubbing&lt;/li&gt;
&lt;li&gt;130+ language support: Comprehensive language coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Building the System
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Working with Multiple AI Models
&lt;/h3&gt;

&lt;p&gt;The biggest hurdle was integrating multiple AI models while maintaining performance. Each language model has unique characteristics, and creating a unified API required extensive optimization work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: Handling multiple AI model responses&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;processTranslation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetLang&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;modelResponse&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;selectOptimalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetLang&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;optimizeResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modelResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Optimization
&lt;/h3&gt;

&lt;p&gt;Balancing translation quality with response times required multi-level optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Algorithm selection based on content type&lt;/li&gt;
&lt;li&gt;Intelligent caching strategies
&lt;/li&gt;
&lt;li&gt;Server architecture improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some lessons I've learned in expanding AI applications:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model Selection Logic&lt;/strong&gt;: Different content types benefit from different models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching Strategy&lt;/strong&gt;: Intelligent caching reduces API costs by 60%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Processing&lt;/strong&gt;: Handling large files efficiently&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Managing Features
&lt;/h3&gt;

&lt;p&gt;As developers, it's easy to want to add every possible feature. However, we should focus on effectively solving core problems. I must always prioritize user pain points over the number of features.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  API Design Patterns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// RESTful endpoint structure&lt;/span&gt;
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;translate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;translate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;  
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;v1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;translate&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;multimedia&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handling Errors
&lt;/h3&gt;

&lt;p&gt;Robust error handling was crucial for user experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Graceful degradation for partial failures&lt;/li&gt;
&lt;li&gt;Detailed error messages for debugging&lt;/li&gt;
&lt;li&gt;Automatic retry logic for transient failures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Short-term Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;WebSocket implementation for real-time translation&lt;/li&gt;
&lt;li&gt;GraphQL API for more efficient data fetching&lt;/li&gt;
&lt;li&gt;Enhanced caching mechanisms&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Long-term Plans
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open-source SDK for developers&lt;/li&gt;
&lt;li&gt;Plugin architecture for extensibility&lt;/li&gt;
&lt;li&gt;Advanced analytics dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building TransMonkey taught me that successful developer tools require both technical excellence and deep understanding of user workflows. Every piece of content should deliver value, and every feature should solve a real problem.&lt;/p&gt;

&lt;p&gt;The platform is live and I'm actively gathering feedback from the developer community. Technical writing is about sharing knowledge and experience, so I'd love to hear about your own experiences with AI integration challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;: [&lt;a href="https://www.transmonkey.ai/" rel="noopener noreferrer"&gt;TransMonkey Platform&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>web3</category>
      <category>productivity</category>
    </item>
    <item>
      <title>From Stack to Impact: What Actually Worked in My 3 AI Tool Sites</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Tue, 04 Nov 2025 02:39:59 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/from-stack-to-impact-what-actually-worked-in-my-3-ai-tool-sites-576f</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/from-stack-to-impact-what-actually-worked-in-my-3-ai-tool-sites-576f</guid>
      <description>&lt;p&gt;I’ve already walked through the architecture and automation behind my three AI tool sites. This time, I’m focusing on what those choices did in the real world: where speed showed up, where costs crept in, and which refactors genuinely changed user outcomes. Here’s a structured look at results, trade-offs, and patterns you can copy tomorrow.&lt;/p&gt;

&lt;p&gt;📊Quick Context &amp;amp; Goals&lt;/p&gt;

&lt;p&gt;A short recap so we’re aligned on scope and intent.&lt;br&gt;
Three independent AI tools with similar foundations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API-first backend with job queue&lt;/li&gt;
&lt;li&gt;Prompt/versioning discipline&lt;/li&gt;
&lt;li&gt;CI/CD + observability baked in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Primary goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast first result (&amp;lt;2s perceived, &amp;lt;5s actual)&lt;/li&gt;
&lt;li&gt;Predictable costs under variable usage&lt;/li&gt;
&lt;li&gt;Reliable behavior at edge cases (timeouts, rate limits)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔎Outcome Metrics That Mattered&lt;/p&gt;

&lt;p&gt;I didn't focus on vanity numbers; instead, I tracked signals that aligned with the health of the product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency (p50/p95): user-perceived speed in core workflows&lt;/li&gt;
&lt;li&gt;Conversion: landing → try → repeat usage&lt;/li&gt;
&lt;li&gt;Stability: error rate, retry success, timeout counts&lt;/li&gt;
&lt;li&gt;Cost: per request, per active user, per successful output&lt;/li&gt;
&lt;li&gt;Dev velocity: time to ship features or fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bux30rgi823zbf6yuu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bux30rgi823zbf6yuu8.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;br&gt;
The key takeaway: perceived speed and reliability affected repeat usage more than any single feature.&lt;/p&gt;

&lt;p&gt;⚖️ What Scaled Well vs. What Hurt&lt;/p&gt;

&lt;p&gt;Let’s break down the winners and the pain points.&lt;/p&gt;

&lt;p&gt;Scaled Well&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Preview-first workflow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Micro-results in 1–2 seconds kept users engaged while heavier tasks ran in the background.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Tiered model strategy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast-cheap model for previews, slower-high-quality for final passes cut costs without hurting UX.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Idempotent job design&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Safe retries meant fewer hard failures; queues handled spikes gracefully.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Hurt or Dragged&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monolithic prompt files

&lt;ul&gt;
&lt;li&gt;Hard to test and revert; small copy changes broke assumptions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Overzealous real-time updates

&lt;ul&gt;
&lt;li&gt;Frequent polling increased infra noise and hit rate limits; event-driven beats aggressive refresh.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;“Just one more tweak” refactors

&lt;ul&gt;
&lt;li&gt;Time sinks without measurable impact; improvement needed a measurement gate.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;🧱 The Three Toughest Bottlenecks—and Fixes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cold starts on model-heavy endpoints&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix: warm paths with health checks and scheduled priming; route previews to always-hot instances.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Duplicate work under spikes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix: request deduplication keys + output caching; short TTLs for previews, longer for finals.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Retry storms during provider hiccups&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix: exponential backoff with jitter, circuit breakers, and vendor fallbacks; cap retries per job.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Result: fewer timeouts, predictable costs, calmer dashboards.&lt;/p&gt;

&lt;p&gt;🔧 The Refactor That Changed Everything&lt;/p&gt;

&lt;p&gt;I split “preview” and “final” into distinct pipelines with clear contracts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before

&lt;ul&gt;
&lt;li&gt;One pipeline tried to do everything—high latency and expensive failures.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;After

&lt;ul&gt;
&lt;li&gt;Preview pipeline: fast model, low token limits, strict time caps, aggressive caching.&lt;/li&gt;
&lt;li&gt;Final pipeline: quality model, richer context, longer time caps, robust retries.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Impact

&lt;ul&gt;
&lt;li&gt;p95 latency halved; repeat usage up; cost per success dropped notably.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Architecturally, the separation clarified decisions and made optimization straightforward.&lt;/p&gt;

&lt;p&gt;🧪 Mini Templates You Can Reuse&lt;/p&gt;

&lt;p&gt;Here are small, practical patterns that delivered outsized gains.&lt;/p&gt;

&lt;p&gt;1) Request Dedup Key&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key = hash(user_id + normalized_input + mode)&lt;/li&gt;
&lt;li&gt;If key exists in cache, return existing job/result instead of re-processing.
2) Fallback Tree&lt;/li&gt;
&lt;li&gt;Preview: fast_model → cache → graceful message&lt;/li&gt;
&lt;li&gt;Final: slow_model → alternate_vendor → queue retry → partial result
3) Latency Budget&lt;/li&gt;
&lt;li&gt;Set hard caps per step:

&lt;ul&gt;
&lt;li&gt;Input normalization: &amp;lt;50ms&lt;/li&gt;
&lt;li&gt;Cache lookup: &amp;lt;20ms&lt;/li&gt;
&lt;li&gt;Preview generation: &amp;lt;1.2s&lt;/li&gt;
&lt;li&gt;Final generation: &amp;lt;4.0s
If a step exceeds its cap, degrade gracefully (e.g., partial output + “enhance” CTA).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;📌 Monitoring Checklist&lt;/p&gt;

&lt;p&gt;A lightweight set of signals that stayed actionable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;p50/p95 latency per endpoint&lt;/li&gt;
&lt;li&gt;Error rate by cause: timeout, rate limit, provider error&lt;/li&gt;
&lt;li&gt;Retry count and success percentage&lt;/li&gt;
&lt;li&gt;Cache hit rate (preview vs. final)&lt;/li&gt;
&lt;li&gt;Cost per successful output (by model tier)&lt;/li&gt;
&lt;li&gt;User repeat rate in 7-day window&lt;/li&gt;
&lt;li&gt;Circuit breaker trips and vendor fallback frequency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a metric can’t trigger a decision in a week, drop it.&lt;/p&gt;

&lt;p&gt;🧠 Takeaways You Can Steal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separate preview from final. Different constraints, different wins.&lt;/li&gt;
&lt;li&gt;Cache the expensive parts; dedup the repetitive ones.&lt;/li&gt;
&lt;li&gt;Make retries idempotent and bounded. Storms are worse than failures.&lt;/li&gt;
&lt;li&gt;Track the “first-wow” latency. It predicts retention better than raw traffic.&lt;/li&gt;
&lt;li&gt;Use model tiers intentionally. Fast for trust, slow for polish.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>web3</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>I independently developed three AI tool websites: Architecture, Automation Stack, and Painful Lessons Learned.</title>
      <dc:creator>charlie s'</dc:creator>
      <pubDate>Mon, 03 Nov 2025 04:13:15 +0000</pubDate>
      <link>https://dev.to/charlie_s_c9de68658cfe2a/i-independently-developed-three-ai-tool-websites-architecture-automation-stack-and-painful-28gh</link>
      <guid>https://dev.to/charlie_s_c9de68658cfe2a/i-independently-developed-three-ai-tool-websites-architecture-automation-stack-and-painful-28gh</guid>
      <description>&lt;p&gt;Hello developers! I'm Charlie. I've independently developed three AI tools: TransMonkey, Imgkits, and TeachAny. I'll be sharing my architecture, automation stack, and the real-world challenges I encountered while using these products.&lt;/p&gt;

&lt;p&gt;1.Architecture for a solo developer Frontend&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use Next.js, React, and Tailwind.&lt;/li&gt;
&lt;li&gt;I choose them for SEO, reuse, and fast themes. I use MDX for docs and demos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I run serverless functions for burst tasks like translate, generate, and export.&lt;/li&gt;
&lt;li&gt;I run a job queue and workers for long tasks like OCR, media, and large translations.&lt;/li&gt;
&lt;li&gt;I store assets and previews in object storage behind a CDN.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data and documents&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use Postgres for jobs, quotas, and audit logs.&lt;/li&gt;
&lt;li&gt;I parse document layout into blocks, lines, and tables to keep structure.&lt;/li&gt;
&lt;li&gt;I use small embeddings only when retrieval helps, like glossaries and terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI and ML pipelines&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I do OCR. I build a layout graph. I translate by segment to keep order.&lt;/li&gt;
&lt;li&gt;I use LLMs for text. I use vision models with masks and seeds for control.&lt;/li&gt;
&lt;li&gt;I add guardrails after generation. I map font fallback. I apply RTL/LTR rules. I add safety filters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observability and reliability&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I send logs and traces to one place. I add per-job metrics.&lt;/li&gt;
&lt;li&gt;I track outcome metrics that users feel: table cell parity, subtitle drift, brand color delta, plan readability score.&lt;/li&gt;
&lt;li&gt;I use feature flags and staged rollouts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security and privacy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I keep data for a short time by default.&lt;/li&gt;
&lt;li&gt;I provide delete endpoints. I collect minimal PII. I show clear controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.Automation stack that helps me ship fast DevOps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use CI/CD with PR previews.&lt;/li&gt;
&lt;li&gt;I run tests for layout parity, subtitle timing, color deltas, and rubric checks.&lt;/li&gt;
&lt;li&gt;I use Infra as Code for repeat setups.&lt;/li&gt;
&lt;li&gt;I schedule cleanup jobs for previews and temp keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Workflow automation&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I orchestrate with queues. I retry with backoff. I send failed jobs to a dead-letter queue.&lt;/li&gt;
&lt;li&gt;I show early previews and honest progress bars.&lt;/li&gt;
&lt;li&gt;I send webhooks when tasks finish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.Problems I met that match my products, and how I fixed them &lt;br&gt;
Let me first briefly introduce my three artificial intelligence tool websites.:“&lt;br&gt;
&lt;a href="https://www.transmonkey.ai/" rel="noopener noreferrer"&gt;TransMonkey&lt;/a&gt;: AI translation for 130+ languages that preserves original layout across PDFs, Word, Excel, images, video, and audio.&lt;br&gt;
&lt;a href="https://www.imgkits.com/" rel="noopener noreferrer"&gt;Imgkits&lt;/a&gt;: AI creative studio that turns prompts into high‑quality images/videos with strong control and built‑in editing.&lt;br&gt;
&lt;a href="https://www.teachany.com/" rel="noopener noreferrer"&gt;TeachAny&lt;/a&gt;: AI teaching assistant that adapts materials to classroom context and diverse student needs.”&lt;/p&gt;

&lt;p&gt;A.TransMonkey: translation with layout intact and real-world files Real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many PDFs have mixed fonts. Some fonts miss glyphs after translation. Text shows as blocks.&lt;/li&gt;
&lt;li&gt;Many tables break after translation. Cell counts change. Merged cells split. Borders shift.&lt;/li&gt;
&lt;li&gt;Many files mix RTL and LTR. RTL in tables flips order. Numbers wrap wrong.&lt;/li&gt;
&lt;li&gt;Long SRT/VTT files drift after translation. Line length changes, so timings slip.&lt;/li&gt;
&lt;li&gt;Scans are low quality. Skew and noise cause wrong reading order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I run OCR with skew fix and denoise. I detect blocks, lines, and tables. I keep reading order.&lt;/li&gt;
&lt;li&gt;I build a layout graph for pages, headers, paragraphs, tables, and captions.&lt;/li&gt;
&lt;li&gt;I translate by region. I keep tokens per cell. I preserve cell count.&lt;/li&gt;
&lt;li&gt;I map font fallback per script. I test glyph coverage before render. I pick safe fonts automatically.&lt;/li&gt;
&lt;li&gt;I apply RTL/LTR rules per region. I keep number direction and punctuation rules.&lt;/li&gt;
&lt;li&gt;I retime subtitles after translation. I cap line length. I keep gaps. I check overlap and drift.&lt;/li&gt;
&lt;li&gt;I run post checks: page parity, table cell parity, caption timing, and font coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;B. Imgkits: on-brand image and video generation with stable framing&lt;br&gt;
Real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompts change framing. Faces move. Key objects crop.&lt;/li&gt;
&lt;li&gt;Brand colors drift across batches. One variant is too dark. Another is too bright.&lt;/li&gt;
&lt;li&gt;Small text becomes blurry at social sizes. Upscaling breaks strokes.&lt;/li&gt;
&lt;li&gt;Background removal leaves halos on hair and glass.&lt;/li&gt;
&lt;li&gt;Users want 3–6 good options fast, not 100 random images.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use masks to lock composition. I set control points for subject and horizon lines.&lt;/li&gt;
&lt;li&gt;I fix seed and guidance per brand preset. I vary only one parameter per batch.&lt;/li&gt;
&lt;li&gt;I measure color delta to brand palette. I reject out-of-range shots. I adjust with LUTs.&lt;/li&gt;
&lt;li&gt;I render at target size or exact scale factors. I use vector text or SDF text layers when possible.&lt;/li&gt;
&lt;li&gt;I use matting models with hair detail. I add edge-aware feather and color decontaminate.&lt;/li&gt;
&lt;li&gt;I produce 3–6 controlled variants per job. I label differences. I let users pick fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C. TeachAny: lesson plans for mixed-ability classes that are practical&lt;br&gt;
Real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One plan does not fit all levels. A single reading level loses many students.&lt;/li&gt;
&lt;li&gt;Many outputs are too long. Teachers have 40 minutes and one device per group.&lt;/li&gt;
&lt;li&gt;Some activities are not checkable. Teachers need quick checks for understanding.&lt;/li&gt;
&lt;li&gt;Accommodations are vague. Teachers need concrete supports they can use now.&lt;/li&gt;
&lt;li&gt;Standards mapping is weak. Plans miss the target objective.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I collect standards and clear objectives first. I lock time and device limits.&lt;/li&gt;
&lt;li&gt;I define learner levels. I add supports like sentence frames, visuals, and adjustable text.&lt;/li&gt;
&lt;li&gt;I generate multi-level tasks for the same goal. I include an exit ticket or quick check.&lt;/li&gt;
&lt;li&gt;I keep outputs short. I add steps, timings, and materials. I make it editable.&lt;/li&gt;
&lt;li&gt;I add teacher notes with why this helps. I show alignment to the standard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conclusion&lt;br&gt;
I independently developed three AI tool websites. I resolved issues such as missing layouts, brand drift, and one-size-fits-all approaches. I used a simple stack, clear checks, and robust security measures. Now, the products I deliver are trustworthy. I will continue to leverage user feedback to improve these products.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>developer</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
