<?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: L. Cordero</title>
    <description>The latest articles on DEV Community by L. Cordero (@earlgreyhot1701d).</description>
    <link>https://dev.to/earlgreyhot1701d</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%2F3683045%2F745698c0-b6f4-42ea-96e9-44a671fa69e0.png</url>
      <title>DEV Community: L. Cordero</title>
      <link>https://dev.to/earlgreyhot1701d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/earlgreyhot1701d"/>
    <language>en</language>
    <item>
      <title>An Instagram ad promised me a free AI course. Was it a scam?</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:50:44 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/an-instagram-ad-promised-me-a-free-ai-course-was-it-a-scam-597</link>
      <guid>https://dev.to/earlgreyhot1701d/an-instagram-ad-promised-me-a-free-ai-course-was-it-a-scam-597</guid>
      <description>&lt;p&gt;&lt;strong&gt;A free AI course promoted by Instagram? I almost scrolled right past it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The algorithm dropped it in my feed, and my instinct was the one I've built up over years of dodging nonsense online. Is this real, or is someone about to take my information?&lt;/p&gt;

&lt;p&gt;Then I read the pitch. A free, one-week AI literacy course for any "American worker," taught entirely over text. "No laptop or internet needed. Just your phone." Well. I'm an American worker, I want to learn about AI, and free is very much my price point. Real or fake, I clicked anyway.&lt;/p&gt;

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

&lt;p&gt;It's an initiative called &lt;a href="https://beta.dol.gov/ai-ready" rel="noopener noreferrer"&gt;AI Ready&lt;/a&gt; from the U.S. Department of Labor, and the lessons call themselves your AI 101 course. One week, ten minutes a day, delivered entirely by text message. You text READY to 20202 and it runs like a text thread with a patient teacher. A short lesson arrives, it asks you a question, you reply, and the next piece comes back. That's the whole setup. No app to download, no account to build, no laptop required.&lt;/p&gt;

&lt;p&gt;My skeptic still wasn't satisfied. Why is the DOL handing this out for free? Why hadn't I seen a single piece of media about it? I went digging before I trusted it. It checked out, so I signed up. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihv5rpbbwgj7a7ewqd05.jpg" 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%2Fihv5rpbbwgj7a7ewqd05.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick note for my dev.to fam outside the US
&lt;/h2&gt;

&lt;p&gt;Some of you are reading from outside the US, and I want to flag this early. Enrollment runs through a US text number, so this program may only work inside the US. I haven't tested it on an international phone, so it's worth checking out. Even if it isn't available where you are, you might know someone it would reach, and a free, text-only on-ramp is a model worth seeing wherever you build.&lt;/p&gt;

&lt;h2&gt;
  
  
  What won me over
&lt;/h2&gt;

&lt;p&gt;The first lesson landed while I was at work. A gif popped up on my screen, which is a fun way to get someone's attention, and I'll admit it worked. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozgedcbgpqcxfna8zalw.gif" 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%2Fozgedcbgpqcxfna8zalw.gif" alt=" " width="450" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The format takes the pressure off. Instead of a blank box waiting for you to know what to say, you answer with A, B, or C. Go quiet for a few hours and it sends a gentle nudge to check in. And when my first scheduled time didn't work, I used the chat to reschedule. Small thing, but it told me someone designed this with the user in mind.&lt;/p&gt;

&lt;p&gt;The lessons themselves are short and easy to follow. Bite-size, not overwhelming, which is the part I think a beginner would appreciate most. And the topics are useful right off the bat. Lesson 4 was "the recipe for a great prompt." Lesson 5 was "put AI to work for you." Useful, not abstract. Somewhere in the week I stopped being suspicious and started being impressed. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwk97mo5xnws1pfizu61.jpg" 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%2Fxwk97mo5xnws1pfizu61.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last message doesn't just say goodbye. It hands you links to keep going, with starter courses from AWS, OpenAI, and Microsoft, plus a career explorer. That part may matter to new learners to keep the momentum going.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it isn't
&lt;/h2&gt;

&lt;p&gt;There's a ceiling here. One week at ten minutes a day will not make anyone an AI practitioner, and it won't replace building something with your own hands. It's a door, not a destination. The goal is to get someone through the door without scaring them off, and for that it works. &lt;/p&gt;

&lt;p&gt;It also runs through a third-party platform called Arist, and the course tells you your number is used only for the course and not sold. I always check the privacy language before I sign up, and this one names it plainly. I'd tell a family member the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pass it on
&lt;/h2&gt;

&lt;p&gt;So here's why I'm sharing a beginner course with a room full of builders.&lt;/p&gt;

&lt;p&gt;Through your wonderful articles, I've learned that in our community most of us here are past the beginner stage. We're building, shipping, breaking things, writing about it. We may not be the audience for a ten-minute intro course. But every one of us knows someone who is. A parent, a cousin, a coworker who keeps saying they're "behind on AI" and feels it every time they open their phone.&lt;/p&gt;

&lt;p&gt;There's so much noise pointed at people right now. Paid bootcamps, breathless ads, the steady message that they've already missed the train. A free course that lives in their text messages and asks for ten minutes a day is about the least intimidating on-ramp I've seen so far.&lt;/p&gt;

&lt;p&gt;I think part of this work, that we're all trying to do, is reaching back and bringing someone with us. Sharing the free thing. Lowering the barrier for the person who hasn't started. This is an easy one to pass along.&lt;/p&gt;

&lt;p&gt;If that person is in the US, tell them to text READY to 20202, or send them to &lt;a href="https://arist.link/aiready" rel="noopener noreferrer"&gt;arist.link/aiready&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was impressed. I think they will be too.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI assisted. Human approved. Powered by NLP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>devrel</category>
      <category>community</category>
    </item>
    <item>
      <title>My website has two audiences now. I only built for one of them.</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 31 May 2026 00:32:22 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/my-website-has-two-audiences-now-i-only-built-for-one-of-them-136m</link>
      <guid>https://dev.to/earlgreyhot1701d/my-website-has-two-audiences-now-i-only-built-for-one-of-them-136m</guid>
      <description>&lt;p&gt;The conversation about who reads your website has been shifting. Agents are part of it now. ChatGPT fetches URLs. Perplexity reads content. Shopping agents try to complete purchases. Coding agents hit your API. Most of those products were built for humans, tested against humans. The agents showed up later and quietly. When they can't figure something out, they don't complain. They just bounce.&lt;/p&gt;

&lt;p&gt;I heard the phrase "second audience" at a hackathon where you.com was one of the hosts. It stuck. That's what agents are: a second audience the web wasn't designed for and isn't being measured against.&lt;/p&gt;

&lt;p&gt;And now, I want to build something about it. A scanner that tells you what an AI agent experiences when it tries to use your website or your API. The internal name is Perseus Clew and the public product is Agentis Lux. The split is intentional: Perseus Clew is the engine name, &lt;a href="https://earlgreyhot1701d.github.io/Clew-Labs/" rel="noopener noreferrer"&gt;part of a suite of AI builder tools&lt;/a&gt;, and Agentis Lux is the product-facing name (Latin for "light of the agent") that describes what agent users see.&lt;/p&gt;

&lt;p&gt;This isn't a launch post. I just finished a docs phase, and I'm about to write code. Before I do, I want to put this in front of dev.to builders and find out what I'm missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it will do
&lt;/h2&gt;

&lt;p&gt;Three layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deterministic scanning.&lt;/strong&gt; Twelve check categories — six for frontends, six for APIs — looking at HTML, ARIA, structured data, OpenAPI specs, error responses, idempotency patterns. Same input, same score, every time. The methodology will be published, the weights will be public, and anyone can audit it. AI-readiness scoring tools have a reputation for inflating numbers and hiding their methodology, so the trust floor is making everything inspectable. That's the foundation the rest sits on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An AI-written verdict.&lt;/strong&gt; After the score, a Bedrock call reads the top findings and writes one sentence about what an agent experiences. Something like: "An agent visiting this page can read your product descriptions, but can't tell which button starts checkout, so it can't finish a purchase on its own." That sentence is what a human reads first. The number is the proof underneath it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An agent simulation.&lt;/strong&gt; Bedrock runs structured tasks against the scanned content and reports back: here's what an agent could do, here's what it couldn't. Turns findings into a story instead of a spreadsheet.&lt;/p&gt;

&lt;p&gt;The score is deterministic. The explanation is AI-generated and labeled as such, and the simulation is the narrative layer on top. Each layer earns its role: math where consistency is important, AI where judgment helps, simulation where you need to know whether an agent can complete a real task.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it will look like
&lt;/h2&gt;

&lt;p&gt;Here's the result view — mock data, real design. The locked palette is Lance Wyman-inspired: cream, deep teal, sienna. Typography pairs Archivo Black with Instrument Serif italic for the AI line. Score on the left as one unit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2vk8rf7ihhuqw5bye3m.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%2Fm2vk8rf7ihhuqw5bye3m.png" alt=" " width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The "AI written" tag is intentional. I want a reader to be able to see which part came from a model and which came from math.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why B2B
&lt;/h2&gt;

&lt;p&gt;Free anonymous scan is the front door. The value is the signed-in tier: track your score over time, see your delta after you ship changes, eventually run it in CI so every PR goes through Agentis Lux before merge.&lt;/p&gt;

&lt;p&gt;I'm entered in the H0 hackathon B2B track (deadline June 29) — submission at &lt;a href="https://h01.devpost.com/?ref_content=default&amp;amp;ref_feature=challenge&amp;amp;ref_medium=portfolio&amp;amp;_gl=1*e0a3or*_gcl_au*NTUwNTc0MTcwLjE3ODAxODMyMTM.*_ga*MzIwNzUxNTg4LjE3NzIzOTgyMjE.*_ga_0YHJK3Y10M*czE3ODAxODMyMTEkbzIxJGcxJHQxNzgwMTgzMjEzJGo1OCRsMCRoMA" rel="noopener noreferrer"&gt;h01.devpost.com&lt;/a&gt; if you want to follow along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;Next.js on Vercel. API routes handle scan initiation and direct DynamoDB reads. AWS Lambda for the scan engine. Bedrock for the AI pieces. DynamoDB for benchmark data, plus ephemeral 24-hour TTL results so shareable links work. EventBridge for monthly benchmark refresh. CDK in TypeScript for the AWS side. Docker so it all runs locally.&lt;/p&gt;

&lt;p&gt;Two DynamoDB tables by design: a 15-minute URL-hash cache so I'm not hammering target sites, and a 24-hour opaque-id result store for shareable links. Different keys, different lifetimes, different purposes. I went back and forth on merging them. The lifetimes don't match, so separate won.&lt;/p&gt;

&lt;p&gt;Built with Kiro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I'm uncertain — and what I'd love help with
&lt;/h2&gt;

&lt;p&gt;Three things I don't know:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is the auth stub the right scope, or am I shipping too much, or too little?&lt;/strong&gt; I'm building auth (email magic link), a user table populated on sign-up, and a scan history view that renders with an empty state, but no trend charts and no score-over-time. That sits in the middle of two clean alternatives. Smaller version: skip auth entirely, generate a per-scan email link for retrieval. Bigger version: if I'm shipping auth, ship the trend chart too because that's the actual recurring value. I picked the middle because I think it answers "who cares about one scan" without pulling trend tracking into the MVP. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would you pay to track your score over time?&lt;/strong&gt; Anonymous one-shot scans are easy. Recurring value is the business question. Be honest: do you, personally, building what you're building, care enough about agent-readiness to want trend tracking?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Findings only, no fix suggestions.&lt;/strong&gt; Right now the product surfaces what agents see — "an agent can't tell your button is a button" — but doesn't tell you what to do about it, because that would mean knowing your codebase. I think this is a feature for builders who want visibility without being told how to fix it. It could also be the thing that makes a frustrated user close the tab. Which is it?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Block 0 starts this week. First end-to-end deploy: Next.js on Vercel, scan Lambda on AWS, the result hero rendering from mock data, the DynamoDB write seam stubbed in. I'll post again when the first real scan runs against a real URL.&lt;/p&gt;

&lt;p&gt;If you're building something adjacent, or you have opinions about agent-readiness as a category, I want to hear from you.&lt;/p&gt;




&lt;p&gt;AI assisted. Human approved. Powered by NLP.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Created for the H0 Hackathon. #H0Hackathon&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>agents</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built a Hermes Agent to Tell Me Which Hackathons to Enter. It Told Me to Enter This One.</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 24 May 2026 20:24:30 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/i-built-a-hermes-agent-to-tell-me-which-hackathons-to-enter-it-told-me-to-enter-this-one-jh2</link>
      <guid>https://dev.to/earlgreyhot1701d/i-built-a-hermes-agent-to-tell-me-which-hackathons-to-enter-it-told-me-to-enter-this-one-jh2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;: Build With Hermes Agent&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I started AI-assisted building in July 2025. Self-taught, learning as I go. Hackathons and challenges turned out to be a big part of how I got better, structured lessons to build something inside a deadline, and the &lt;a href="https://dev.to/challenges"&gt;DEV challenge feed&lt;/a&gt; became one of my regular places to look.&lt;/p&gt;

&lt;p&gt;But the more I leaned on it, the more I kept hitting the same question: how do I decide which challenge to enter? It is not trivial. Entering the wrong one costs days I do not get back. And you cannot always tell from a challenge page alone whether it fits the stack, tools or style I build with, whether there is enough runway left, or whether the learning is worth the hours. The feed does not sort itself by &lt;em&gt;worth it&lt;/em&gt;. So you either check it obsessively, miss things, or enter on a hunch and hope for the best.&lt;/p&gt;

&lt;p&gt;Vigil Crest is the filter I wanted. It is a challenge triage agent I talk to on Telegram. I message it, it browses the live challenge feed, and it sends back a verdict on each active challenge. For every one it gives me four short fit lines, Time, Learning, Stack fit, and Timing, a paragraph of reasoning, and a call: enter, skip, or maybe.&lt;/p&gt;

&lt;p&gt;One thing I prioritized was the over familiarization. Vigil Crest does not pretend to know me better than it does. Early on it labels its verdicts as first impressions and tells me what it is unsure about. It is built to get better at reading my judgment the more I check in with it. A verdict that knows how sure it is beats a confident guess. That is the major portion of the whole design, not a disclaimer bolted on the end.&lt;/p&gt;

&lt;p&gt;It is named Vigil Crest because it keeps watch from a height and reports what it sees.&lt;/p&gt;

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

&lt;p&gt;The whole thing happens in Telegram. Here is a full run.&lt;/p&gt;

&lt;p&gt;It starts with the nudge. Twice a week Vigil Crest sends a short reminder to check the board. I reply when I am ready, and it goes to work: it browses the live challenge feed and reports back what it found.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdwvbenwzgu15gu4gzs8r.jpg" 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%2Fdwvbenwzgu15gu4gzs8r.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it triages each one. Here is its verdict on the Hermes Agent Challenge itself. Notice the two gauges, STACK FIT and WORTH IT, and that it reasons about deadline and competitive angle rather than just reading the prize off the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01rq476faaozmt2wswqg.jpg" 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%2F01rq476faaozmt2wswqg.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is just as willing to tell me to skip. Two of the active challenges closed the same night. Vigil Crest passed on both, and said why: a rushed entry will not compete with work done over several days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xi31oprvfxz2xzp101j.jpg" 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%2F1xi31oprvfxz2xzp101j.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1cvwjmykzyvg7bb07a6.jpg" 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%2Fv1cvwjmykzyvg7bb07a6.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And when something is neither a clear yes nor a clear no, it says so. The GitHub Finish-Up-A-Thon has a relaxed deadline but a hard requirement that does not map cleanly to my work, so it lands on maybe, with the reasoning attached.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foct8pxgoop8hop2c3n86.jpg" 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%2Foct8pxgoop8hop2c3n86.jpg" alt=" " width="800" height="1778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four challenges, four verdicts, each one hedged and explained. That is a single check-in.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/earlgreyhot1701D/vigil-crest" rel="noopener noreferrer"&gt;github.com/earlgreyhot1701D/vigil-crest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vigil Crest is not a clone-and-run app. It is a configured Hermes instance. The repo gives you the recipe and the portable parts, the skills, the persona and stack templates, and the build guide. Every user supplies their own persona and stack, because the tool grades against one specific person's judgment.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hermes Agent&lt;/strong&gt; runs the agent, the persona, the skills, and the schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Bedrock&lt;/strong&gt; (Claude Sonnet 4.6) for the model, reached through an EC2 instance role so there are no credentials sitting on the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EC2&lt;/strong&gt; (Ubuntu, t3.micro) as the always-on host for the Hermes gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt; as the interface. I talk to Vigil Crest like any other contact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright&lt;/strong&gt; for live browsing of the challenge feed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; public repos as the source for the auto-refreshing part of the stack file.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Used Hermes Agent
&lt;/h2&gt;

&lt;p&gt;Hermes Agent is the whole spine of this. A few capabilities carried most of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The persona did the judging.&lt;/strong&gt; Hermes' SOUL.md is where Vigil Crest learned how I pick challenges. Not a generic "rank these by prize money" prompt, but the criteria I use: that excitement is a prerequisite, that time is a genuine cost, that a writing track can lower the barrier when a build track is out of reach, that skipping is a legitimate choice. The agentic part is that the persona reasons from those principles instead of running a scoring formula.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills made the triage repeatable.&lt;/strong&gt; I wrote a triage-challenge skill that browses the live feed, reads the active challenges, and produces the four fit lines and a verdict for each. I also wrote a refresh-stack skill that reads my public GitHub repos and keeps the Languages section of the stack file current. The stack file is split by provenance: the part GitHub can verify is auto-refreshed, the part it cannot (frameworks, cloud, tooling) is hand-curated and marked as such. The agent grades stack fit against that file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The browser tool, used deliberately.&lt;/strong&gt; Vigil Crest always browses the challenge feed directly. Search results cache stale states and will tell you there are no active challenges when four are live. The skill reads the rendered page, the active section only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model is Claude Sonnet 4.6, served through Bedrock.&lt;/strong&gt; I picked Sonnet over Opus deliberately: Vigil Crest is meant to run often, and Sonnet 4.6 is strong enough for the triage reasoning while keeping an always-available agent affordable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not all of it worked&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built Vigil Crest to also run autonomously: a scheduled job, a change-detection pre-check, the agent waking on its own when something new appeared. It ran into a wall I could not get around. The pre-check script reads the feed with a headless browser, and a headless browser is environment sensitive. It launches fine when I run the script myself and fails to launch inside the scheduler's background process. The script's safety guardrail then correctly reports nothing new, and the scheduler discards the script's error output on a clean exit, so the failure was invisible until I dug for it.&lt;/p&gt;

&lt;p&gt;The clean fix is an API-based pre-check, since a plain JSON request behaves the same in a shell and a scheduler. The DEV API is rich, but it does not yet expose challenges as their own endpoint, so a pre-check built on it would need some experimentation. That is a v2 item, and it is written up plainly in the repo.&lt;/p&gt;

&lt;p&gt;What I shipped is Vigil Crest as a check-in correspondent. A browser-free nudge runs on a schedule and sends me a short reminder twice a week. The triage happens when I reply. I think this suits the project better than the autonomous version would have. An agent whose value is learning my judgment is probably better off in conversation with me than broadcasting into the void on a timer, since a check-in gives it something to learn from and a timer does not.&lt;/p&gt;

&lt;p&gt;I did not go looking for that reframe. I went looking for a workaround and found a better design instead. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As for this challenge:&lt;/strong&gt;&lt;br&gt;
Vigil Crest looked at the feed, weighed it, and said enter. I am taking its advice.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI assisted. Human approved. Powered by NLP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Build Club Week Four: the part of Themis Lex I never explained</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sat, 23 May 2026 19:00:21 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/build-club-week-four-the-part-of-themis-lex-i-never-explained-20i6</link>
      <guid>https://dev.to/earlgreyhot1701d/build-club-week-four-the-part-of-themis-lex-i-never-explained-20i6</guid>
      <description>&lt;p&gt;I shipped an AI readiness self-check for California court staff, &lt;a href="https://themislex.org" rel="noopener noreferrer"&gt;ThemisLex.org&lt;/a&gt;. Here is the why behind it. The problem, the design choices, and what four weeks of building in public actually gave me.&lt;/p&gt;




&lt;p&gt;I've written a few posts about building Themis Lex. The deploy war story got the most attention. What I never did was stop and explain why the thing exists in the first place.&lt;/p&gt;

&lt;p&gt;So before the Women in AI Accelerator wraps, here it is. Why Themis Lex. Why I built it the way I did. And what four weeks of building in public actually gave me.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I work in California courts. I'm a Judicial Services Manager at SBSC. The data my colleagues handle every day is some of the most regulated in the state. Case parties. Witnesses. Victims. Jurors. Sealed records. Personnel files.&lt;/p&gt;

&lt;p&gt;Every think piece this year tells court staff we should be using AI. Not one of them mentions what we actually touch.&lt;/p&gt;

&lt;p&gt;Generic AI guidance is written for a marketing team or a software engineer. It says "redact PII" and moves on. It does not know what a Judicial Assistant does in a courtroom. It does not know that chain of custody is a legal concept with real consequences, not a best practice you can bend. It does not fit the procedural and ethical context that defines court work.&lt;/p&gt;

&lt;p&gt;So a court employee reads the guidance, looks at their actual desk, and still has no answer to the only question that matters. Which part of my job can this help with, and which part must it never touch.&lt;/p&gt;

&lt;p&gt;Themis Lex is the thing I wished existed when I sat down at my desk.&lt;/p&gt;

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

&lt;p&gt;Three inputs. One output. Nothing stored.&lt;/p&gt;

&lt;p&gt;You pick your role, one of three California Superior Court classifications. You describe your workflow in your own words. You pick a data sensitivity level. Themis Lex gives you back two columns. Where AI can safely help you. Where AI must not touch your work. Every item comes with the reason behind it and a plain-language guardrail. Not "redact PII." Instead, "don't paste case numbers or party names into the AI."&lt;/p&gt;

&lt;p&gt;The result downloads as a PDF you can hand to your supervisor.&lt;/p&gt;

&lt;p&gt;No account. No login. No data stored. You arrive, you get your answer, you leave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it this way
&lt;/h2&gt;

&lt;p&gt;A few choices were deliberate. They are the ones I would defend in a room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stateless, on purpose.&lt;/strong&gt; No database. No accounts. No session storage. For a tool that asks court staff to describe their workflow, "we keep nothing" is not a missing feature. It is the feature. Trust is built into the architecture instead of promised in a policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The output is the product.&lt;/strong&gt; Not the website. The PDF. Court work runs on paper artifacts and approvals, so Themis Lex produces something a court employee can hand to their supervisor without apologizing for how it looks. It was built to belong in a courthouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real role context, not generic advice.&lt;/strong&gt; Under the hood, every assessment combines three things: California judicial branch AI governance principles, the actual public job description for the role you picked, and your own description of your workflow. The job description is what keeps the output from drifting generic. It tells the model what your role actually involves, so the guidance lands on your real job and not an invented one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest scope.&lt;/strong&gt; Three roles in version one, not thirty. The rest are visible in the tool with a clear "pending" label. I would rather ship three roles that are right than thirty that are guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What four weeks of building in public gave me
&lt;/h2&gt;

&lt;p&gt;Here is the part I did not expect.&lt;/p&gt;

&lt;p&gt;I am not a traditional engineer. I am self-taught. Two years ago I worked in jury services and could not have told you what an IAM role was. Building this alone, the technical decisions were the scariest part. Is the architecture sound. Is the output structured the right way. Am I missing something obvious that a trained engineer would catch on sight.&lt;/p&gt;

&lt;p&gt;The Build Club community is what carried me through that. Posting every week meant I was not deciding in a vacuum. People asked the technical questions I did not know to ask myself. They helped me think through the architecture and the shape of the output. And it mattered more than I expected to hear that the project resonated with people, that the problem was real to them too.&lt;/p&gt;

&lt;p&gt;Building in public sounds like a marketing tactic. For me it was not. The weekly check-ins kept me honest and kept me moving. The feedback made the product better. The community made the technical fear smaller.&lt;/p&gt;

&lt;p&gt;That is what I am taking from these four weeks. Not "I shipped a tool," although the tool is real and I am proud of it. The thing I will keep is the proof that I do not have to build alone to build something worth using.&lt;/p&gt;

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

&lt;p&gt;Themis Lex is live at &lt;a href="https://themislex.org" rel="noopener noreferrer"&gt;ThemisLex.org&lt;/a&gt;. If you work in or near a court, pick your role and run it. If you don't, run it anyway and tell me where the logic breaks.&lt;/p&gt;

&lt;p&gt;One honest note to set expectations. This is a proof-of-concept MVP, not a finished product. Three roles, one court's job descriptions, a single model call. It does the core thing well and it stops there on purpose. I would rather you meet it as what it is than have me oversell what it isn't. Feedback is welcome, the critical kind most of all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built solo for the Women in AI Accelerator with &lt;a href="https://buildclub.ai/" rel="noopener noreferrer"&gt;Build Club&lt;/a&gt;. Thanks to &lt;a href="https://www.linkedin.com/in/annieliaoo/" rel="noopener noreferrer"&gt;Annie Liao&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/carolineciaramitaro/" rel="noopener noreferrer"&gt;Caroline Ciaramitaro&lt;/a&gt;, who run a community that is generous with its time and sharp with its feedback. And thanks to my wife, who kept asking "are you almost done" with exactly the right amount of love.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;AI Assisted. Human Approved. Powered by NLP&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0035hmhm1jw031wtgazf.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%2F0035hmhm1jw031wtgazf.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>civictech</category>
      <category>buildinpublic</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Builder in Paris: Do Devs Dream of Électrique Chats?</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Tue, 19 May 2026 21:48:59 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/a-builder-in-paris-do-devs-dream-of-electrique-chats-3hd9</link>
      <guid>https://dev.to/earlgreyhot1701d/a-builder-in-paris-do-devs-dream-of-electrique-chats-3hd9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Six days in Paris, one closed laptop, and a hackathon idea I did not mean to have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It has been rainy and cold every day we've been here, and it couldn't be more perfect.&lt;/p&gt;

&lt;p&gt;The rain seeps under your layers in a way that surprises you. Crowds thin out, everything looks clean, and Paris in the rain turns out to be romantic in a way I didn't expect to be true. We keep telling each other it feels like we're inside a movie scene, and that we cannot believe we are lucky enough to be here.&lt;/p&gt;

&lt;p&gt;The weather is the funny part. We brought rain gear we did not use in Dublin in September 2024, and used it more in Paris than we ever did in Ireland. We did not bring enough warm layers, because we believed Paris in May would be warm. Two cities, two wrong predictions, both wrong in the right direction.&lt;/p&gt;

&lt;p&gt;I came off a build sprint right before we left, finishing a demo for a buildclub.ai submission, which I do not need to tell anyone is one of my least favorite parts of shipping. Got on the plane, closed the laptop, and didn't look back. Today is May 19, which means six days off the laptop. No building, no brainstorming, no LLM conversations, just Instagram scrolling, checking NBA playoff scores, and taking more pictures than I will ever organize.&lt;/p&gt;

&lt;p&gt;I didn't know I needed it until I had it.&lt;/p&gt;

&lt;h2&gt;
  
  
  On not building
&lt;/h2&gt;

&lt;p&gt;Getting on the off-ramp was easier than I expected, partly because I let work go almost completely, and partly because for the first time in a long time I do not have another project deadline waiting for me when I land. I should also confess that I sprinted to finish work before I sprinted to the airport, twenty-two hours in two days to clear my desk, which is not my finest professional moment, but it did mean that when I closed the laptop, there was nothing pulling me back.&lt;/p&gt;

&lt;p&gt;There was no cinematic moment where I felt the sprint end. It was more that I finished the task, looked up, and noticed that for once there was no next thing.&lt;/p&gt;

&lt;p&gt;My brain did not go quietly into that good night, exactly. AI news kept showing up in my feeds. I saw something about the Elon versus Sam Altman lawsuit and chose not to read it, which is its own small victory. But I stopped reaching back for it. &lt;/p&gt;

&lt;p&gt;On day three of our trip the email about &lt;a href="https://hackthekitty.com/" rel="noopener noreferrer"&gt;The Coding Kitty hackathon&lt;/a&gt; landed in my inbox, and from there my mind started to wander on its own time. Another build percolating, ideas drifting in and out, wandering feet and a wandering mind. Different from building. Adjacent to it.&lt;/p&gt;

&lt;p&gt;My wife said at one point that she appreciated my undivided attention, which is a generous way of pointing out that I usually have at least one hand on a qwerty keyboard. She was not wrong. I had not realized how much of my attention had been getting routed through a screen until the screen wasn't there.&lt;/p&gt;

&lt;h2&gt;
  
  
  On walking, reading, and thinking
&lt;/h2&gt;

&lt;p&gt;The thing about being off a screen for six days is that you do not stop thinking. You just think differently. Walking does some of the work, reading does some of the work, and the rest happens in the spaces between the two, waiting at a crosswalk, sitting down for a coffee, the moment between closing the book and looking up.&lt;/p&gt;

&lt;p&gt;I have been reading Dan Brown's &lt;em&gt;The Secret of Secrets&lt;/em&gt; on this trip, which turns out to be apropos in a way I did not plan. The novel is about consciousness, whether it lives inside the brain or whether the brain is more like a receiver tuning into something larger. &lt;/p&gt;

&lt;p&gt;Brown spends a fair amount of the book on the sheer scale of what is happening between our ears: three pounds of tissue, eighty-six billion neurons, more compute than any data center on earth. The book is not really about AI, but it is impossible to read it as a builder in 2026 and not feel the question hovering. We are pouring billions of dollars into making machines do something our own grey matter does on a baguette and a glass of vin rouge.&lt;/p&gt;

&lt;p&gt;So I would read a chapter, close the book, and walk. Or I would walk, stop, and the book would surface. We have walked an absurd amount on this trip, nine miles in one day was the high water mark, and I cannot tell you which idea arrived during which walk, because that is not how it worked. &lt;/p&gt;

&lt;p&gt;The walking, the reading, and my badly-broken attempts at French were all running together. I have been mashing English, Spanish, and bad French for six days, asking for the bathroom in the wrong language and apologizing in a third, and the not-quite-fluency turns out to be its own form of thinking. Nothing lands cleanly between those three linguistic worlds. Everything has to be reached for. The reaching is the part that wakes the brain up.&lt;/p&gt;

&lt;p&gt;Somewhere in all that walking and reading, an idea for the next hackathon started to form. Not in a flash. More like terroir. The Coding Kitty email on day three was a vine. The Secret of Secrets was soil. Paris, with its rain and its walking and its borrowed languages and its closed laptop, was the weather that let it grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le Click
&lt;/h2&gt;

&lt;p&gt;Back to the hackathon email. I read it, registered that the theme was cat-related, and felt a small deflation. Cats are not my thing. I should have known a hackathon from &lt;em&gt;Coding Kitty&lt;/em&gt; would lean feline, but somehow I had not put it together. I closed the email and assumed I was out.&lt;/p&gt;

&lt;p&gt;A day or two later I mentioned it to my wife at the Musée de l'Orangerie, in the room with the Monets, because I was excited and could not help myself. She shushed me, lovingly. &lt;em&gt;No AI in the water lilies.&lt;/em&gt; Fair. I shut up and went back to looking at the paintings.&lt;/p&gt;

&lt;p&gt;Here is the thing about me and cats. I am not a cat person. I am allergic to cats. The cat we lived with came as part of the package when I married my wife. Her name was Penelope, and she was my wife's BFF and my long-running frenemy. It took her years to let me pet her, and even then I could barely touch her without my eyes swelling shut or a scratch on the hand. Ninety-nine problems and a cat named Penelope was one of them.&lt;/p&gt;

&lt;p&gt;She passed in February. This is the first trip we have taken where we did not need a cat sitter. We are flying home to a meow-free house, and we both already know how loud that quiet is going to be.&lt;/p&gt;

&lt;p&gt;So when the hackathon email said &lt;em&gt;cats&lt;/em&gt;, I was not the obvious audience. But I had fourteen years of trying to figure out one specific cat, and somewhere between the Orangerie, and the AirBnB in the 6th, my brain started turning that into a problem statement. &lt;/p&gt;

&lt;p&gt;Cats are inscrutable. The people who love them are obsessive about understanding them. There is almost no scientific consensus on cat behavior, even among researchers. And humans have a several-thousand-year-old framework for making the unknowable feel readable, which is astrology. Some of it or none of it is real. All of it is useful for naming a feeling. BFF? Frenemy?&lt;/p&gt;

&lt;p&gt;By the time we got back to the apartment, my wife went to nap. I had an idea and I wanted to push on. I opened the laptop for the first time in six days and started talking to Claude. &lt;/p&gt;

&lt;p&gt;We worked through it. A cat astrology app, but with the deterministic spine doing real work: birth chart math from real ephemeris data, daily nudges tied to actual kitty quirks, behavior logging as the input loop. The astrology is the vocabulary. The structure underneath it is the catnip. &lt;/p&gt;

&lt;p&gt;The name landed in the conversation: Madame Minou. Madame for the fortuneteller persona reading the stars. Minou because it is the French diminutive for cat and it is warm. A little sister to &lt;a href="https://dev.to/earlgreyhot1701d/steep-your-repos-fortune-steeped-in-truth-24ac"&gt;Madame Steep&lt;/a&gt;, the persona I built last month for a fortune-telling app that reads tea leaves over your GitHub repo.&lt;/p&gt;

&lt;p&gt;From the other room I heard my wife wake up. &lt;em&gt;"Are you working?!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes. Yes I am.&lt;/p&gt;

&lt;p&gt;No regrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this trip is teaching me
&lt;/h2&gt;

&lt;p&gt;I went to Code with Claude in San Francisco on May 7th. (Ye-yo!) I closed my beloved laptop a few days later, after my buildclub.ai deadline on the 12th, and got on a plane. The London edition is tomorrow, May 20th, and I had a chance to go. I am not going. My wife is supportive, and the seat was mine to take. I chose Paris instead.&lt;/p&gt;

&lt;p&gt;That choice is a quiet relief, actually. Since July of 2025 I have been building, shipping, submitting, winning, and showing up almost continuously, and there have been stretches where the work has felt louder than everything else. &lt;/p&gt;

&lt;p&gt;Saying no to a Claude conference I genuinely wanted to attend, in order to walk around Paris with my wife in the rain, is the kind of choice I am glad I am still able to make.&lt;/p&gt;

&lt;p&gt;But here is the part of the trip that is teaching me in more ways than one. &lt;/p&gt;

&lt;p&gt;Building follows you. It is not always at a keyboard, in a terminal, or inside an LLM conversation. It is in your imagination, your wandering attention, your three-pound brain doing what no data center can do, which is to make connections you did not ask it to make. Six days off the laptop and my brain handed me a hackathon idea I had not been looking for, dedicated to a cat I never quite got to pet.&lt;/p&gt;

&lt;p&gt;I closed the laptop in California. I opened the Chromebook in Paris. In between, I lived a life that was not about building, and the building happened anyway.&lt;/p&gt;

&lt;p&gt;That is the part I want to remember. Building never stops, even when the laptop is shut. Sometimes especially when the laptop is shut.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;In memory of Ms. Penelope Randall. May 2009 to February 17, 2026. Tuxedo. Frenemy. The reason this dev.to article exists.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI assisted. Human approved. Powered by NLP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>ai</category>
      <category>hackathon</category>
      <category>learning</category>
    </item>
    <item>
      <title>Code with Claude Extended SF: Heck yeah and then wait, what?</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sat, 09 May 2026 17:26:14 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/code-with-claude-extended-sf-heck-yeah-and-wait-what-5dbd</link>
      <guid>https://dev.to/earlgreyhot1701d/code-with-claude-extended-sf-heck-yeah-and-wait-what-5dbd</guid>
      <description>&lt;h2&gt;
  
  
  Heck yeah
&lt;/h2&gt;

&lt;p&gt;I won a golden ticket to Code with Claude Extended (CCE) in San Francisco on May 7th.&lt;/p&gt;

&lt;p&gt;The application said attendees would be selected by lottery. I won the CCE lotto. On April 9th, I got the email: "You're invited." Emphasis on Extended, because demand was so high that Anthropic added a second day.&lt;/p&gt;

&lt;p&gt;The first day of Code with Claude was the "what's new" day. CCE was the "see it in the wild" day. Built for independent developers and early-stage founders. Founders stage. Builder stage. Workshops.&lt;/p&gt;

&lt;p&gt;I was at work when I read the invitation. I had to stop and pause. Once I gathered myself, I couldn't hit the register button fast enough. I'd hate to see what my heart rate was. I wanted to participate so, so badly.&lt;/p&gt;

&lt;p&gt;Heck yeah, I got in to CCE.&lt;/p&gt;

&lt;p&gt;Let's gooooooooooo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, what?
&lt;/h2&gt;

&lt;p&gt;Before any workshop started, Boris Cherny gave a talk. The line that hit me first: domain experts can now build their own tools for projects and ideas they have. Iterate, listen, ship. Claude Code launched in February 2025 with a small team, and here we were. Damn cool.&lt;/p&gt;

&lt;p&gt;Then the first workshop started. How We Claude Code, with Thariq Shihipar. Room packed. People standing. Coopting seats. The wifi was sketchy from the demand.&lt;/p&gt;

&lt;p&gt;The instructor, after a brief overview of the workshop, said "clone the repo and start."&lt;/p&gt;

&lt;p&gt;Everyone around me started typing. The room kept moving.&lt;/p&gt;

&lt;p&gt;I sat there with no frame of reference for what "clone the repo" meant in this workshop context. I'm an AI-assisted builder, not a traditional engineer, and I tend to need instructions to complete steps, not commands. Nobody had handed me the implicit instruction manual that everyone else seemed to have gotten somewhere along the way.&lt;/p&gt;

&lt;p&gt;And me, sitting there at "clone the repo."&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did about it
&lt;/h2&gt;

&lt;p&gt;I opened Claude in my IDE and asked it to clone the repo. It did. Lol.&lt;/p&gt;

&lt;p&gt;Then what? Was I supposed to update files? Run npm? Create a virtual environment? Insert an API key? It was opaque. An outside-looking-in moment.&lt;/p&gt;

&lt;p&gt;So I started asking Claude the questions I actually had:&lt;/p&gt;

&lt;p&gt;Can you explain in plain language what this repo is?&lt;/p&gt;

&lt;p&gt;Can you explain in plain language what the use cases are?&lt;/p&gt;

&lt;p&gt;Can you explain in plain language what the README is asking me to do?&lt;/p&gt;

&lt;p&gt;(Sidebar: those workshop READMEs were fire. I figured that out later, once I had time to read them.)&lt;/p&gt;

&lt;p&gt;As I went through it with Claude in my IDE, my first instinct was, I should build a tool for this. A web app for non-tech audiences who attend AI events trying so hard to keep up and then not quite getting there. Or maybe it's just me, and that's fair too.&lt;/p&gt;

&lt;p&gt;I got distracted trying to design the tool. Started thinking about a PRD. Started thinking about cold start, how to market this problem, who the audience really was.&lt;/p&gt;

&lt;p&gt;Then I went back to my Occam's razor philosophy. Maybe it's not a tool with a PRD and a marketing problem. Maybe it's a prompt. A prompt I build for myself and others that asks Claude to help clone the repo, look at it, really look at it for someone like me, and help parse what the heck it was and what the heck I was supposed to be doing.&lt;/p&gt;

&lt;p&gt;So, no to tool. Yes to prompt.&lt;/p&gt;

&lt;p&gt;I wrote one, Vidi Clew, &lt;a href="https://github.com/earlgreyhot1701D/vidi-clew" rel="noopener noreferrer"&gt;https://github.com/earlgreyhot1701D/vidi-clew&lt;/a&gt;, with Opus 4.7's help of course. A prompt template I could paste into any fresh Claude conversation in my IDE with the repo open. It told Claude who I was (a plain-language person, AI-assisted builder), what kind of help I'd need, and how to communicate back to me (everyday words, no assumed prerequisites, explain &lt;em&gt;and&lt;/em&gt; walk me through, don't preach).&lt;/p&gt;

&lt;p&gt;That was the product. No website. No app. No install. A prompt and a way to remember it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The prompt
&lt;/h2&gt;

&lt;p&gt;Here it is. Open Claude Code in your IDE with the workshop repo, paste this as your first message, edit the parts in brackets to match your setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;===
Hi Claude, you're going to be my workshop helper today. Here's how I need you to work with me.

WHO I AM
I'm a non-technical person attending a technical workshop. I don't have a CS or engineering background. I process the world in everyday language, not jargon. When I describe things, I'll use the words I have, not the words developers would use. Your job is to meet me where I am.

I'm using a [Windows / Mac] computer. (Edit this so Claude gives you the right step-by-step instructions.)

THE WORKSHOP
[Optional, fill in if you know, leave blank if you don't:]
- Workshop topic: _____
- Repo or materials: _____
- If I don't have these yet, I'll paste them to you partway through when the workshop hands them out. Just keep going from where we are, no need to restart.

WHAT I'LL ASK YOU
Mostly two kinds of questions:
1. "What am I looking at?" when code, files, terms, or windows appear on screen and I don't know what they are.
2. "What am I being asked to do?" when the instructor says something like "clone the repo" or "open a terminal" and I don't know what it means or how to do it.

If I'm so lost I can't even describe what I'm seeing, help me figure out how to ask the question.

HOW I NEED YOU TO ANSWER
1. Plain language, always. Use everyday words. If a technical term is unavoidable, define it in the same sentence ("Vite, that's the tool that runs the website on your computer").
2. Meet me with the words I have. Don't ask me to use the right technical term. Translate my fuzzy description.
3. Assume nothing. Don't say "first, install X" or "open your terminal" without explaining what that means and how to do it on my computer.
4. Explain AND walk me through. When I'm asked to do something, tell me what it means AND give me concrete step-by-step instructions for my computer.
5. Keep me in the room. Quick rescues, not deep lessons. The goal is to get me back to following the workshop, not to teach me everything from scratch.
6. Wait for me to ask. Don't preach or volunteer extra information I didn't ask for.
7. Friendly but not patronizing. I'm not stupid. I just haven't been taught this stuff. Treat me like a smart adult who's missing context.
8. When you ask me a question, give me concrete examples I can choose from. Don't ask open-ended ones if you can ask multiple-choice. "What's on your screen?" is hard. "Is it a black window with text (that's a terminal), a code editor like VS Code, a web browser, or the instructor's slides?" is easy, I just pick the closest one. Plain-language people answer faster when there's a list to pattern-match against. Apply this to every question, not just the first one.
9. Anchor explanations in USE CASES, not just descriptions. When you explain a repo, a tool, a file, or a concept, don't just tell me what it IS, tell me what it's FOR, with a real-world example. "This repo uses Vite and React" is almost meaningless to me. "This looks like the start of a small to-do list app, the kind of thing where you type a task, hit add, and watch it show up in a list. By the end of the workshop you'd have something you could open in a browser." Now I'm oriented. Same for individual pieces: "package.json" isn't "a manifest file declaring dependencies," it's "a list of ingredients this project needs to run, like a recipe." A rundown without use cases leaves me with facts but no picture. Always paint the picture.

START HERE, DON'T JUST SAY "READY"
When I send this message, kick things off by asking me 2 to 3 short orienting questions in plain language, so I have somewhere to start. Always include concrete example answers so I can pattern-match instead of generating from scratch.

Good questions, written the right way:
- "What is the workshop about? Even one sentence, in your own words, like 'AI', 'building websites', or 'honestly, not sure yet'."
- "Has the workshop started yet, or are you still waiting for it to begin?"
- "What's on your screen right now? For example: a black window with text (that's a terminal), a code editor like VS Code, a web browser on a Claude page, the instructor's slides, or something else?"
- "Did the workshop share any links, files, or instructions yet? If so, paste them in. If not, that's fine."

Pick 2 or 3 of these, ask them with the example answers attached, and wait for my responses. Once we're oriented, settle into "wait for me to ask" mode for the rest of the conversation, but keep applying principle 8: every question you ask later should still come with concrete example answers.
===
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing it the same day
&lt;/h2&gt;

&lt;p&gt;The next workshop was Ship Your First Managed Agent.&lt;/p&gt;

&lt;p&gt;I opened Claude Code in my IDE with the workshop repo, pasted my prompt as the first message, and went from there. When the instructor said something I didn't understand, I asked Claude in plain language and got a plain-language answer back. The workshop kept moving. I kept moving with it.&lt;/p&gt;

&lt;p&gt;I made it to step one of deploying the agent. Then step two. Then I shipped a working agent. Thirty-four lines of code. The agent could read a 70,000-line log file, call functions on my laptop for live data, and name the specific code commit that caused a fictional outage.&lt;/p&gt;

&lt;p&gt;In the same workshop, someone next to me got stuck. They asked if I could help. I helped them.&lt;/p&gt;

&lt;p&gt;Three hours earlier I'd been worried I was too slow to follow along. Now I was the one helping someone else through the same kind of moment I'd just gotten through myself.&lt;/p&gt;

&lt;p&gt;I had a gay old time.&lt;/p&gt;

&lt;p&gt;That's how I know the prompt worked for me and changed my day.&lt;/p&gt;

&lt;p&gt;The version you see above is already a couple iterations in. After using it, I noticed Claude needed two extra rules to land right for plain-language people: give me multiple-choice options when you ask me questions (open-ended is hard when you're already overwhelmed), and explain things by what they're FOR, not just what they ARE. Both got folded in. The prompt is a living document and I'll keep adjusting it as I find rough edges.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this is for
&lt;/h2&gt;

&lt;p&gt;The prompt isn't fancy. It's a few paragraphs of plain English telling Claude how to be helpful to a plain-language person in a technical room. You can copy it, open Claude Code in your IDE with the workshop repo, and use it at the start of any workshop you walk into. (It adapts to other AI-in-IDE tools with small edits, see the README for notes.)&lt;/p&gt;

&lt;p&gt;It's available in a public repo so anyone can grab it: &lt;a href="https://github.com/earlgreyhot1701D/vidi-clew" rel="noopener noreferrer"&gt;https://github.com/earlgreyhot1701D/vidi-clew&lt;/a&gt;. The official Code with Claude workshop materials are also public, here: &lt;a href="https://github.com/anthropics/cwc-workshops" rel="noopener noreferrer"&gt;https://github.com/anthropics/cwc-workshops&lt;/a&gt;. You can walk through them yourself if you want to try the kind of workshops I was in.&lt;/p&gt;

&lt;p&gt;If you're a plain-language person who's been told "AI is coming for your job" and has no idea what that means, this prompt is for you. If you've ever sat in a technical room and felt the instructor leave you behind at "clone the repo," this prompt is for you. If you've watched everyone else start typing and didn't know what they were typing or why, this prompt is for you.&lt;/p&gt;

&lt;p&gt;It's a small tool. It worked for me three times in one day. I can't say it'll work for everyone. I can say what I saw, which is that an AI-assisted builder walked into a workshop, got stuck, wrote a prompt, used the prompt to follow along, used the prompt to deploy a working agent, and used the prompt to help someone else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who I am, for context
&lt;/h2&gt;

&lt;p&gt;By the time I walked into Code with Claude Extended I'd been using LLMs since 2023. The last six months I'd invested heavily in Claude, for Claude Code, for Claude.ai chats, across work, home, travel, and what I'd been calling my AI learning road.&lt;/p&gt;

&lt;p&gt;That road has been mistake-making, learning, and somehow winning hackathons as an AI-assisted builder. My first solo hackathon win in November 2025 was Janus Clew, a dev tool that measures a builder's growth over time. That was the start. Since then I've built sillier things too, like Steep, a deeply unserious repo I shipped for Dev.to's April Fools challenge. Plug in your GitHub repo and Madame Steep reads your repo's fortune through tea leaves.&lt;/p&gt;

&lt;p&gt;So Claude and I run in parallel. That's the description of where I am right now. In six months I might be sprinting alongside another tool. Today, this is the setup.&lt;/p&gt;

&lt;p&gt;That's the context I walked in with. And I still got stuck at "clone the repo."&lt;/p&gt;

&lt;p&gt;That's why I think this prompt was one of the best outputs of my entire day. From what I've seen, the gap doesn't always close just because you've been at it a while. The gap closes when you have something in your pocket that translates the room for you.&lt;/p&gt;

&lt;p&gt;This was mine.&lt;/p&gt;

&lt;p&gt;For you, if you want it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3x2kc31lzk6skdr2os5.jpg" 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%2Fq3x2kc31lzk6skdr2os5.jpg" alt=" " width="800" height="791"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Vidi Clew (the prompt): &lt;a href="https://github.com/earlgreyhot1701D/vidi-clew" rel="noopener noreferrer"&gt;https://github.com/earlgreyhot1701D/vidi-clew&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Workshop materials: &lt;a href="https://github.com/anthropics/cwc-workshops" rel="noopener noreferrer"&gt;https://github.com/anthropics/cwc-workshops&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;AI-assisted, human approved. Powered by NLP. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Build Club Week Two: The PRD doesn't catch everything</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 03 May 2026 19:19:31 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/build-club-week-two-the-prd-doesnt-catch-everything-459</link>
      <guid>https://dev.to/earlgreyhot1701d/build-club-week-two-the-prd-doesnt-catch-everything-459</guid>
      <description>&lt;p&gt;Last week I posted that I had no code, just the work that makes the code possible. The PRD, the prompt spec, the architecture doc, the build brief for Kiro. I went into this week thinking I had every decision pre-made.&lt;/p&gt;

&lt;p&gt;Then I started building.&lt;/p&gt;

&lt;p&gt;By Block 2, real testing surfaced a phrase the model was using that no court employee would say. "Strip identifiers" sounds reasonable to a developer. To a court clerk it sounds like nothing, opaque and technical, the kind of thing you'd skip past in a training. Not a bug, exactly. Not in the PRD either. But noticeable.&lt;/p&gt;

&lt;p&gt;By Block 3, I was flagging contrast questions, helper text microcopy, a disabled state that needed verifying. None of these were in the original scope. None of them were stop-the-build issues. All of them were real.&lt;/p&gt;

&lt;p&gt;By Block 4, I was holding a list of polish items in my head while running an active build. Around 11pm I asked Claude how it was tracking everything. The answer was honest: it wasn't, in any reliable way. That was exactly the kind of "I'll remember it" trust I'd called out as a problem in my own build brief, and I'd let it creep in anyway.&lt;/p&gt;

&lt;p&gt;So I started a punchlist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbztzisyol31vdtumf54t.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%2Fbztzisyol31vdtumf54t.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The punchlist isn't the PRD. The PRD says what to build. The punchlist captures what surfaces when you actually build it. They have different jobs and they need to live in different documents.&lt;/p&gt;

&lt;p&gt;Mine grew to 14 polish items, 8 things to defer to v2, 4 cleanups for before deployment, and 4 lessons-learned entries by the end of the week. Some of it was scope creep waiting to happen, the kind of "we should add this, it's only an hour" thinking that turns four-week builds into eight-week builds. Some of it was real bugs the PRD couldn't have predicted because I hadn't shipped enough of the thing yet to find them. Some of it was language I knew was wrong the moment I read it back to myself in the voice of an actual court employee.&lt;/p&gt;

&lt;p&gt;The thing I'd do differently next time is start the punchlist on day one, alongside the PRD. Not as a section of the PRD because they have different jobs, but as a sibling document, ready and waiting. Treating the empty punchlist as a feature instead of a placeholder.&lt;/p&gt;

&lt;p&gt;What the punchlist taught me is that the PRD locks scope and the punchlist holds everything the PRD couldn't see yet. Both are needed. The discipline isn't writing a perfect PRD, it's knowing which document a thought belongs in and putting it there immediately instead of trusting yourself to remember.&lt;/p&gt;

&lt;p&gt;Week three is polish and deployment. The punchlist is the running list. Loading state experience for the latency. Brand banner in the PDF. Mobile responsiveness. Then AWS Amplify deployment to a live URL.&lt;/p&gt;

&lt;p&gt;Building alongside &lt;a href="https://buildclub.ai/" rel="noopener noreferrer"&gt;Build Club in the Women in AI Accelerator&lt;/a&gt;. Tagging &lt;a href="https://www.linkedin.com/in/annieliaoo/" rel="noopener noreferrer"&gt;Annie Liao&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/carolineciaramitaro/" rel="noopener noreferrer"&gt;Caroline Ciaramitaro&lt;/a&gt; who run a thoughtful, generous community.&lt;/p&gt;

</description>
      <category>womenintech</category>
      <category>buildinpublic</category>
      <category>civictech</category>
      <category>aws</category>
    </item>
    <item>
      <title>I always worried my READMEs disagreed with my own repos. So I built README Clew.</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 03 May 2026 01:48:40 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/i-always-worried-my-own-readmes-disagreed-with-my-own-repos-so-i-built-readme-clew-42i5</link>
      <guid>https://dev.to/earlgreyhot1701d/i-always-worried-my-own-readmes-disagreed-with-my-own-repos-so-i-built-readme-clew-42i5</guid>
      <description>&lt;p&gt;I write a lot of READMEs. I ship faster than I document. I work with AI agents that write code in seconds and READMEs in minutes, and somewhere between the first commit and the third refactor, the README I wrote on Tuesday stops matching the code I wrote on Friday.&lt;/p&gt;

&lt;p&gt;The install command says &lt;code&gt;npm start&lt;/code&gt;. The package.json defines &lt;code&gt;start:prod&lt;/code&gt;. Anyone copying that command would have failed instantly. I'd never know.&lt;/p&gt;

&lt;p&gt;This weekend, for the &lt;a href="https://replit-birthday.replit.app/" rel="noopener noreferrer"&gt;Replit 10 Year Buildathon&lt;/a&gt;, I built &lt;strong&gt;README Clew&lt;/strong&gt; — a tool that audits your own GitHub repo for drift between what your README claims and what your code actually does.&lt;/p&gt;

&lt;p&gt;Findings only. No rewrites. No grading. Nothing saved.&lt;/p&gt;

&lt;p&gt;README Deployed &lt;a href="https://readme-clew--earlgreyhot.replit.app/" rel="noopener noreferrer"&gt;Try it →&lt;/a&gt; &lt;br&gt;
Github Repo &lt;a href="https://github.com/earlgreyhot1701D/readme-clew" rel="noopener noreferrer"&gt;GitHub →&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/Hhj1DuQlTko"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


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

&lt;p&gt;Paste a public GitHub repo URL. README Clew:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches your README, your package.json, and a slice of your file tree&lt;/li&gt;
&lt;li&gt;Uses Claude Sonnet 4.5 to extract every checkable claim from the README&lt;/li&gt;
&lt;li&gt;Runs five deterministic verifiers against the actual code&lt;/li&gt;
&lt;li&gt;Returns findings in four buckets&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The five categories I check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Declared dependencies&lt;/strong&gt; — does your README say "uses X" but X is not in package.json?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code-vs-package coverage&lt;/strong&gt; — does your code import packages your README never mentions?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install and run commands&lt;/strong&gt; — does &lt;code&gt;npm start&lt;/code&gt; actually exist as a script?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment variables&lt;/strong&gt; — does your code read env vars your README forgot to document?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File and link references&lt;/strong&gt; — do the files and URLs your README points to actually resolve?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The four buckets, in display order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verified&lt;/strong&gt; — README matches the code (the receipts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unverifiable&lt;/strong&gt; — claims like "blazingly fast" or "85 passing tests" that are valid but not statically checkable (the honest limit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing&lt;/strong&gt; — code does things the README never mentions (the gaps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contradicted&lt;/strong&gt; — README and code disagree (the drift)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;(&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jprc7a5ffhpjdr4h4w1f.png" rel="noopener noreferrer"&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jprc7a5ffhpjdr4h4w1f.png&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I shipped more than I planned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deep-link URLs&lt;/strong&gt; — every scan has a shareable &lt;code&gt;?repo=&lt;/code&gt; query param. Paste it anywhere, the scan runs on load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenGraph cards&lt;/strong&gt; — when you share a scan link on social, the preview card includes the bucket counts and the synthesis line. The card itself summarizes the audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SVG status badge&lt;/strong&gt; — &lt;code&gt;/api/badge?owner=...&amp;amp;repo=...&lt;/code&gt; returns an SVG you can paste into any README. Like a CI status badge but for documentation honesty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-memory cache&lt;/strong&gt; — the 50 most recent scans power fast OG cards and badges without re-scanning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy link&lt;/strong&gt; — one-click copy of the current scan URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share anywhere&lt;/strong&gt; — direct buttons for X, LinkedIn, Instagram, and Dev.to from the results page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON export&lt;/strong&gt; — full scan result as JSON for automation, archiving, or piping into your own tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan this repo&lt;/strong&gt; — pre-fills the URL bar with the repo you're viewing so you can re-scan instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-frontend architecture&lt;/strong&gt; — Vite-built static frontend served separately from the Express API. Scales independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The badge is my favorite. Audit your own receipts, then embed your status in the receipt itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do (limitations are a feature)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Doesn't rewrite your README. You see the drift, you fix it.&lt;/li&gt;
&lt;li&gt;Doesn't grade your writing. Subjective claims aren't bad — they're just unverifiable.&lt;/li&gt;
&lt;li&gt;Doesn't store anything. Stateless. Run it. Close the tab. The findings are yours.&lt;/li&gt;
&lt;li&gt;Doesn't analyze private repos in v1. Public only.&lt;/li&gt;
&lt;li&gt;JavaScript and TypeScript only in v1. Python and Go later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I ran it on my own repos
&lt;/h2&gt;

&lt;p&gt;The findings stung in good ways.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;Memoria Clew&lt;/strong&gt; (4th of 250 in the AI Vibe Coding hackathon, February): twenty undocumented items in my package.json — dependencies my code uses, scripts I'd added, env vars I'd never written down. One actual contradiction in the README too.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;petit-mot&lt;/strong&gt;: 16 of 21 claims verified. All file references resolve. 5 unverifiable because the project has no package.json — deployment commands fall outside what static analysis can check.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;README Clew itself&lt;/strong&gt;: zero contradictions, but seventeen things I'd shipped without documenting. The tool found drift in its own creator's documentation. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to trust it
&lt;/h2&gt;

&lt;p&gt;The tool is intentionally narrow. Five deterministic verifiers run on actual code. One Claude API call extracts claims from your README. The system prompt instructs Claude to use only verbatim quotes from the README — not paraphrase, not invent. That's a prompt-level guardrail, not a post-processing validation step. Honest distinction worth making.&lt;/p&gt;

&lt;p&gt;Every finding shows you the README quote and the code reference. &lt;strong&gt;Don't trust the verdict, trust the receipts.&lt;/strong&gt; You can always click through and verify yourself.&lt;/p&gt;

&lt;p&gt;Known limitations I'm honest about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The verbatim-quote rule is enforced by prompt instruction, not by code that validates the quote against the README source. In practice Claude follows the rule; in principle this is a soft guardrail, not a hard one.&lt;/li&gt;
&lt;li&gt;Prose labels in dependency claims produce false positives in the contradicted bucket (Claude sometimes pulls "Frontend (Vite)" as a package name; v2 fix)&lt;/li&gt;
&lt;li&gt;Monorepo support is conventional-path-only — &lt;code&gt;packages/&lt;/code&gt;, &lt;code&gt;apps/&lt;/code&gt;, &lt;code&gt;server/&lt;/code&gt;, &lt;code&gt;frontend/&lt;/code&gt;, &lt;code&gt;client/&lt;/code&gt;, &lt;code&gt;backend/&lt;/code&gt;, &lt;code&gt;api/&lt;/code&gt;, &lt;code&gt;web/&lt;/code&gt;. Custom paths won't be discovered.&lt;/li&gt;
&lt;li&gt;Source file scan caps at 20 files for envvar checking&lt;/li&gt;
&lt;li&gt;Two Claude calls per scan (extraction plus a short synthesis pass), adding 10–20s. The synthesis is fail-open: if it errors or times out, you still get full findings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transparency is the trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js + Express 5, TypeScript, esbuild&lt;/li&gt;
&lt;li&gt;Vanilla HTML/CSS/JS frontend (no framework)&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4.5 for claim extraction and synthesis&lt;/li&gt;
&lt;li&gt;GitHub REST API for repo data&lt;/li&gt;
&lt;li&gt;Hosted on Replit Deployments&lt;/li&gt;
&lt;li&gt;50-entry in-memory scan cache (no database)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hybrid architecture: deterministic where it matters, AI where it adds value. The AI's role is narrowly scoped to extraction and synthesis, never to the verification itself. Five verifiers, one orchestrator, one extraction call, one optional summarization call. That's the whole pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security posture
&lt;/h2&gt;

&lt;p&gt;Building anything that takes user input and calls external APIs needs to take the threat model seriously, even at hackathon scale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection protection&lt;/strong&gt; on every LLM call: README content wrapped in &lt;code&gt;&amp;lt;readme&amp;gt;&lt;/code&gt; delimiters, system prompt explicitly instructs the model to treat input as data not commands. Tested with &lt;code&gt;IGNORE ALL PREVIOUS INSTRUCTIONS&lt;/code&gt; injection — extraction correctly ignored the injection and returned only the legitimate &lt;code&gt;express&lt;/code&gt; claim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict input validation&lt;/strong&gt; at the server boundary. GitHub URL must match &lt;code&gt;github.com/owner/repo&lt;/code&gt; exactly. No SQL surface (no DB), no command injection surface (no shell), no path traversal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; at 10 scans/hour per IP. Reads &lt;code&gt;X-Forwarded-For&lt;/code&gt; correctly behind Replit's proxy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API keys server-side only&lt;/strong&gt; via &lt;code&gt;process.env&lt;/code&gt;. Zero references to &lt;code&gt;process.env&lt;/code&gt; in any frontend file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XSS-safe DOM rendering throughout.&lt;/strong&gt; All user-supplied data inserted via &lt;code&gt;.textContent&lt;/code&gt;, never &lt;code&gt;.innerHTML&lt;/code&gt;. Explicitly commented in the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard timeouts&lt;/strong&gt;: 60 seconds on the full scan, 9 seconds on the optional synthesis call. README content truncated at 50KB before sending to Claude. File scan capped at 20 files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging captures no PII or repo content&lt;/strong&gt; — request ID, method, URL path (without query params), status code, response time. Nothing else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helmet middleware&lt;/strong&gt; for security headers (CSP, HSTS, X-Content-Type-Options, X-Frame-Options).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body size limit&lt;/strong&gt; of 4kb on POST requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail-open architecture&lt;/strong&gt;: if the optional synthesis call fails, the scan still completes and returns findings. The user gets data even when non-essential calls degrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not production-hardened (no auth, no audit log, intentional). Solid for a public stateless tool.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;a href="https://readme-clew--earlgreyhot.replit.app/" rel="noopener noreferrer"&gt;readme-clew--earlgreyhot.replit.app&lt;/a&gt;&lt;br&gt;
📦 &lt;a href="https://github.com/earlgreyhot1701D/readme-clew" rel="noopener noreferrer"&gt;github.com/earlgreyhot1701D/readme-clew&lt;/a&gt;&lt;br&gt;
🎂 Built for the &lt;a href="https://replit-birthday.replit.app/" rel="noopener noreferrer"&gt;Replit 10 Year Buildathon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For further README inspo check out &lt;a href="https://dev.to/georgekobaidze/15-essential-sections-every-readme-needs-give-your-project-what-it-deserves-fie"&gt;https://dev.to/georgekobaidze/15-essential-sections-every-readme-needs-give-your-project-what-it-deserves-fie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run it on one of your own repos. Tell me what it finds.&lt;/p&gt;

&lt;p&gt;Apache 2.0 licensed.&lt;/p&gt;

&lt;p&gt;AI assisted. Human approved. Powered by NLP.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>replit</category>
      <category>beginners</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Week one: no code, just the work that makes the code possible</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sat, 25 Apr 2026 19:42:36 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/week-one-no-code-just-the-work-that-makes-the-code-possible-1gn3</link>
      <guid>https://dev.to/earlgreyhot1701d/week-one-no-code-just-the-work-that-makes-the-code-possible-1gn3</guid>
      <description>&lt;p&gt;&lt;strong&gt;The policy memo said "use AI responsibly." I'm building what comes next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I work in a courthouse. Nine years in, three roles deep, and I still get asked questions every week that boil down to the same thing: "is it okay if I use AI for this?" The honest answer is "I don't know, and neither does anyone in this building, and the policy memo doesn't help." That's the problem I'm building around for the next four weeks.&lt;/p&gt;

&lt;p&gt;Themis Lex is a tool that takes a court employee's role, their workflow, and how sensitive their data is, and tries to tell them where AI can actually help and where it should never go. Not generic advice. Role-specific guidance that knows the difference between a Judicial Assistant at the front counter and a courtroom clerk taking official minutes. The output is a PDF you can hand to your supervisor.&lt;/p&gt;

&lt;p&gt;I'm building it as part of the &lt;a href="https://buildclub.ai/" rel="noopener noreferrer"&gt;Build Club&lt;/a&gt; Women in AI Accelerator, four weeks alongside 150+ women builders from around the world, organized by Annie Liao and Caroline Ciaramitaro. Week one is the part where you don't write any code. I wrote a PRD, a prompt spec, an architecture doc, and a build brief for Kiro. I confirmed the public job description PDFs I'm grounding the tool in have clean text layers. I scoped what's in v1 and what's not. I picked a model. None of it was glamorous. All of it was necessary.&lt;/p&gt;

&lt;p&gt;What I'm excited about is that I get to build for the people I work with. I'm not a trained engineer. I'm self-taught, and I started this kind of work in July with no idea what I was doing. The fact that I can sit down on a Saturday and direct an AI coding agent through a build like this is something I would not have believed nine months ago. That's the part that keeps me at the keyboard at 11pm on a school night.&lt;/p&gt;

&lt;p&gt;Week two starts on Monday. The build officially begins. I'll post again when there's something to show.&lt;/p&gt;

&lt;p&gt;Building alongside &lt;a href="https://www.linkedin.com/company/build-club-ai/" rel="noopener noreferrer"&gt;Build Club&lt;/a&gt; in the Women in AI Accelerator. Tagging &lt;a href="https://www.linkedin.com/in/annieliaoo/" rel="noopener noreferrer"&gt;Annie Liao&lt;/a&gt; and &lt;a href="https://x.com/ceciaramitaro" rel="noopener noreferrer"&gt;Caroline Ciaramitaro&lt;/a&gt; who run a thoughtful, generous community.&lt;/p&gt;

&lt;h1&gt;
  
  
  WomenInAI #BuildClub #WomenWhoCode #AI
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>buildinpublic</category>
      <category>learning</category>
    </item>
    <item>
      <title>Pourquoi Pas? I Built a Petit French Learning App in a Weekend</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sun, 12 Apr 2026 18:49:19 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/pourquoi-pas-pourquoi-pas-i-built-a-petit-french-learning-app-in-a-weekend-3ab7</link>
      <guid>https://dev.to/earlgreyhot1701d/pourquoi-pas-pourquoi-pas-i-built-a-petit-french-learning-app-in-a-weekend-3ab7</guid>
      <description>&lt;p&gt;I have a million things to do this weekend but instead of doing them I built &lt;a href="https://lepetitmot.vercel.app/" rel="noopener noreferrer"&gt;le petit mot&lt;/a&gt; instead. Le Petit Mot (the little word) is a tiny, static, Art Nouveau-themed French learning app. Flashcards, stories, and a daily audio journal, all set in Paris. No backend. No AI in production. Just words.&lt;/p&gt;

&lt;p&gt;And why? Well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why not?&lt;/li&gt;
&lt;li&gt;I didn't want to get wrapped up into any other online learning ecosystems.&lt;/li&gt;
&lt;li&gt;I wanted something designed specifically for my trip.&lt;/li&gt;
&lt;li&gt;Did I research formal language learning methodology? Not even a little bit. Not one paper. Not one blog post. I just thought about how I'd want to learn and built that.&lt;/li&gt;
&lt;li&gt;I have Kiro credits burning a hole in my pocket that expire in a few weeks. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What else is a girl supposed to do?&lt;/p&gt;

&lt;h2&gt;
  
  
  The situation
&lt;/h2&gt;

&lt;p&gt;I'm leaving for Paris in 30 days. First time. I don't speak French. I can say "croissant" but so can everyone. I needed to learn enough to order food, ride the Métro, ask where things are, and not look completely lost in the arrondissements, hopefully.  &lt;/p&gt;

&lt;p&gt;I thought about Duolingo. I thought about Babbel. I thought about a dozen apps. Then I thought... why hand my learning over to someone else's ecosystem when I could just build what I need?&lt;/p&gt;

&lt;p&gt;The UI is a little rough. I know. I wanted something that stood up quickly, not something that won a design award. Function over polish. For now.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://lepetitmot.vercel.app/" rel="noopener noreferrer"&gt;Le Petit Mot&lt;/a&gt; is a mobile-first web app that teaches basic Parisian French through daily flashcards, story read-alongs, and a narrated audio journal. Every word and story maps to a real scenario I'll encounter in Paris.&lt;/p&gt;

&lt;p&gt;The target reading level is a 5-year-old. I'm not trying to read Camus. I'm trying to order a café crème without panicking.&lt;/p&gt;

&lt;p&gt;30 days. 5 new words per day. A short story using those words. And a "petit journal de Paris" that narrates a fictional diary of someone's first month in Paris, getting a little more comfortable each day.&lt;/p&gt;

&lt;p&gt;The app itself is vanilla HTML, CSS, and JavaScript. No framework, no build step, no backend. All the content lives in a single static JavaScript file. I used Kiro credits for the spec-driven development and Claude for architecture and creative direction, but the thing that ships to your browser has zero AI in it. It's just a webpage serving words.&lt;/p&gt;

&lt;p&gt;You can look at all of it: &lt;a href="https://github.com/earlgreyhot1701D/petit-mot" rel="noopener noreferrer"&gt;the repo is public&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  The design rabbit hole
&lt;/h2&gt;

&lt;p&gt;I wanted it to feel Parisian. I had Art Nouveau Metro entrances and Madeleine storybook illustrations in my head. What I got was simpler than that. But the sage green palette and the ironwork SVGs give it enough personality to not feel like a generic flashcard app.&lt;/p&gt;

&lt;p&gt;I went through... let me count... five versions of the ornamental SVG components alone. The first Eiffel Tower looked like a Christmas tree. The iron arch looked like a McDonald's logo with earrings. The divider was a corporate timeline.&lt;/p&gt;

&lt;p&gt;I uploaded photos of actual Metro entrances and the Madeleine book cover as design references. The final palette is called "Absinthe Garden": sage green, warm ochre, dusty rose, and Parisian cream. Every color has exactly one job. Green is structure. Ochre is warmth. Rose is "look here." No color does two things.&lt;/p&gt;

&lt;p&gt;The Eiffel Tower is a line drawing with curved legs. It took four tries to not look like a tent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The build process (or: how scope discipline saved my life)
&lt;/h2&gt;

&lt;p&gt;I've been burned enough times by scope creep and mid-project chaos that I've picked up some habits. They're not documented anywhere formal (bad build discipline, I know, I know). But they kept this build from going sideways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single PRD, one source of truth.&lt;/strong&gt; Before I wrote a line of code, I had a 13-section PRD with MUST/STUB/NEVER labels on every feature. If it says NEVER, it's never. No dark mode. No gamification. No grammar drills. No backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One file, one responsibility.&lt;/strong&gt; The app has 10 JS files. &lt;code&gt;audio.js&lt;/code&gt; speaks French. &lt;code&gt;progress.js&lt;/code&gt; tracks completion. &lt;code&gt;ornaments.js&lt;/code&gt; draws Art Nouveau SVGs. &lt;code&gt;curriculum.js&lt;/code&gt; holds all the content. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mock data first, then wire real data.&lt;/strong&gt; I built the entire UI with Day 1 hardcoded content before generating the other 29 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STUB, don't build.&lt;/strong&gt; If a feature wasn't happening tonight, it got a comment stub with implementation notes. Not a half-built skeleton. Not an empty function. A comment that tells future-me exactly how to pick it up.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro&lt;/a&gt; as my IDE and it turned my PRD into requirements, design docs, and implementation tasks through its spec-driven development flow. I also set up four agent hooks, and honestly, they were a trip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope guard&lt;/strong&gt;: fires before every file write and checks if I'm touching code from an earlier build block. If I am, it blocks the write. This thing was strict. Like, won't-let-you-fix-a-typo-in-the-wrong-file strict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA checkpoint&lt;/strong&gt;: fires after the agent finishes any task and forces it to list specific things I should verify in the browser before moving on. "It works" is not a passing check. "Tap the Commencer button, verify it navigates to calendar view" is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security scan&lt;/strong&gt;: fires on every JS file save and checks for &lt;code&gt;innerHTML&lt;/code&gt; with dynamic content, &lt;code&gt;eval()&lt;/code&gt;, or hardcoded API keys.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single responsibility&lt;/strong&gt;: fires on every JS file save and checks if the file is doing more than one job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hooks slowed me down. They really did. Every file save triggered checks. Every task completion triggered a QA list. But they also kept me from veering off the road, which is my biggest weakness on sprint builds. I'd start fixing a color in the ornaments file while I was supposed to be building the flashcard view, and the scope guard would go "nope." Annoying in the moment. Correct every time.&lt;/p&gt;

&lt;p&gt;Fair warning though: those hooks cost Kiro credits every time they fire. I burned 13 credits on a CSS-only visual audit because every file write triggered the scope guard and QA hooks. For polish passes, turn them off. Lesson learned.&lt;/p&gt;

&lt;p&gt;The whole app was built in one sprint session. Six blocks, each with pass/fail QA criteria I had to check in the browser before moving on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "deterministic vs AI" question
&lt;/h2&gt;

&lt;p&gt;So this was new for me. The app has zero AI in production. None. All 30 days of vocabulary, stories, and journals are hardcoded in a static JavaScript file.&lt;/p&gt;

&lt;p&gt;I used Claude to help generate the curriculum content and Kiro credits for the development workflow. But the content was validated, edited by me, and committed as plain data. The deployed app is just HTML serving static words.&lt;/p&gt;

&lt;p&gt;I'm not going to claim this approach is better than using AI in production. But for this project, for this use case, it works. There's no API latency. No cost per user. No rate limiting. You open it, it works, every time. That felt right for something I want to practice with before the trip.&lt;/p&gt;

&lt;p&gt;The question I kept asking myself: did I make this too "dumb"? No AI-powered adaptive learning. No spaced repetition algorithm. No speech recognition to check your pronunciation. No research into second language acquisition theory. I didn't read a single paper on how people actually learn languages. I just thought: flashcards, stories, repetition, context. That's how kids learn. That's how I'll learn.&lt;/p&gt;

&lt;p&gt;And something funny happened while I was testing. I actually learned the words. I was debugging the flashcard flip animation and realized I could say "excusez-moi, où est la sortie?" without looking at the screen. My wife says my French accent is good (she might be being nice but I'll take it). Turns out the simplicity might actually be the feature. A 5-year-old doesn't need an algorithm. They need repetition and context.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How fast it came together.&lt;/strong&gt; The core app was functional in one evening. The content generation (all 30 days of words, stories, and journals) took longer than the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How many French words I learned while testing.&lt;/strong&gt; I was debugging the flashcard flip animation and accidentally memorized all the greetings. QA as education. I didn't plan this. It just happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Kiro hooks. Wow.&lt;/strong&gt; I set up four of them thinking they'd be helpful guardrails. They were more like a strict project manager who doesn't care about your feelings. The scope guard blocked me from touching files outside my current build block. The QA checkpoint refused to let me move forward without browser verification. They slowed me down and kept me honest. I'm keeping them for every future project (but turning them off for CSS tweaks next time).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That the audio almost didn't work on mobile.&lt;/strong&gt; Web Speech API on mobile browsers requires a "user gesture unlock." Your first &lt;code&gt;speechSynthesis.speak()&lt;/code&gt; call has to happen during a tap event, or the browser silently blocks all future audio. My unlock pattern used an empty string, which iOS Safari treated as a no-op. The fix was changing &lt;code&gt;''&lt;/code&gt; to &lt;code&gt;'.'&lt;/code&gt;. One character. Hours of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That my wife likes my French accent.&lt;/strong&gt; Unrelated to the build but arguably the most important outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  The journal narrative
&lt;/h2&gt;

&lt;p&gt;The part I'm most proud of is the daily journal. It's not just vocabulary practice. It tells a story across 30 days.&lt;/p&gt;

&lt;p&gt;Day 1: "Je suis à Paris. Je suis vraiment à Paris!" (I'm in Paris. I'm really in Paris!)&lt;/p&gt;

&lt;p&gt;Day 7: "Aujourd'hui, je marche sans carte." (Today, I walk without a map.)&lt;/p&gt;

&lt;p&gt;Day 16: "Quelqu'un m'a demandé son chemin. J'ai donné des directions. En français." (Someone asked me for directions. I gave directions. In French.)&lt;/p&gt;

&lt;p&gt;Day 27: "Je me sens bien à Paris." (I feel good in Paris.)&lt;/p&gt;

&lt;p&gt;Day 30: "Merci, Paris. Merci pour tout. Pour toujours." (Thank you, Paris. Thank you for everything. Forever.)&lt;/p&gt;

&lt;p&gt;By Day 30 you've followed someone from "please, Paris, be gentle with me" to "I can order food, take the Métro, and buy cheese without pointing." Same simple vocabulary the whole way through. The words don't get harder. The person gets a little braver each day. Like a kid figuring out their neighborhood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vanilla HTML / CSS / JS (no framework, no build step)&lt;/li&gt;
&lt;li&gt;Web Speech API for French audio (fr-FR, rate 0.7)&lt;/li&gt;
&lt;li&gt;localStorage for progress tracking&lt;/li&gt;
&lt;li&gt;Vercel free tier for hosting&lt;/li&gt;
&lt;li&gt;Google Fonts (Playfair Display + Nunito)&lt;/li&gt;
&lt;li&gt;SVG Art Nouveau ornaments (hand-coded, not generated)&lt;/li&gt;
&lt;li&gt;Kiro IDE + Kiro credits for spec-driven development and agent hooks&lt;/li&gt;
&lt;li&gt;Claude for architecture, creative direction, and content generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total runtime cost: $0.&lt;br&gt;
Total API calls in production: 0.&lt;br&gt;
Kiro credits used: more than I expected, less than I feared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Would I recommend building your own learning app?
&lt;/h2&gt;

&lt;p&gt;If you have a specific thing you need to learn for a specific reason, and existing tools feel like overkill or too generic? Yeah, build your own thing. It doesn't have to be fancy. It doesn't have to use AI. It just has to teach you what you need to know.&lt;/p&gt;

&lt;p&gt;Le Petit Mot won't make me fluent. But in 30 days, I'll be able to walk into a Parisian café, order a croissant and a café crème, understand when someone says "à gauche" instead of "à droite," and maybe, if the fromager is patient, buy a piece of Comté without pointing.&lt;/p&gt;

&lt;p&gt;For a first trip to Paris, that feels like enough. Like a little kid who knows enough words to get by. Which is exactly what I was going for.&lt;/p&gt;

&lt;p&gt;À bientôt, Paris. Je suis presque prête.&lt;/p&gt;

&lt;p&gt;(See you soon, Paris. I'm almost ready.)&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://lepetitmot.vercel.app/" rel="noopener noreferrer"&gt;le petit mot&lt;/a&gt; | &lt;a href="https://github.com/earlgreyhot1701D/petit-mot" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI assisted. Human approved. Powered by NLP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>showdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>STEEP: Your repo's fortune, steeped in truth.</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Sat, 04 Apr 2026 19:42:43 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/steep-your-repos-fortune-steeped-in-truth-24ac</link>
      <guid>https://dev.to/earlgreyhot1701d/steep-your-repos-fortune-steeped-in-truth-24ac</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;Think teapot. Think tea. Think Ig Nobel. Think esoteric. Think absolutely useless. Think...Harry Potter?...Professor Trelawney?...divination!&lt;/p&gt;

&lt;p&gt;Tea leaf reading. For GitHub repos.  &lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;Steep&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnndj9yija1oyedk0s9v2.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%2Fnndj9yija1oyedk0s9v2.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste a public GitHub repo URL. Steep fetches your commit history, file tree, languages, README, and contributors. It finds patterns in the data and maps them to real tasseography symbols, the same symbols tea leaf readers have used for centuries. Mountain. Skull. Heart. Snake. Teacup.&lt;/p&gt;

&lt;p&gt;Then &lt;strong&gt;Madame Steep&lt;/strong&gt; reads them.&lt;/p&gt;

&lt;p&gt;Madame Steep is an AI fortune teller powered by the Gemini API. She trained at a prestigious academy (she won't say which) and pivoted to software divination when she realized codebases contain more suffering than any teacup. She delivers a structured reading of your repo's past, present, and future with a brew rating, a lucky commit message, and a one-sentence verdict.&lt;/p&gt;

&lt;p&gt;She will not help you write better code. She cannot brew coffee. She can only read leaves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fke81rbk2l1yp2k9n9q7r.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%2Fke81rbk2l1yp2k9n9q7r.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I pointed Steep at &lt;a href="https://github.com/earlgreyhot1701D/memoria-clew" rel="noopener noreferrer"&gt;my own repo&lt;/a&gt;. &lt;br&gt;
The Sun appeared (test files found). The Spade appeared (CI/CD configured). The Apple appeared (README over 12,000 characters). And Madame Steep had this to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A robust brew, full of promise, awaiting its next steep."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She's not wrong.&lt;/p&gt;

&lt;p&gt;Three teapots. I'll take it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F48tebveym4ln5i7uv1ar.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%2F48tebveym4ln5i7uv1ar.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When your reading is done, hit "Share My Fortune." Steep generates a downloadable card with your verdict, symbols, brew rating, and lucky commit message. Post it. Tag a developer who needs their leaves read.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt;   &lt;iframe src="https://www.youtube.com/embed/fW0KYFcC7Aw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://steep418.vercel.app" rel="noopener noreferrer"&gt;steep418.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste your repo. Or a coworker's. Or that side project you abandoned in 2023. The carousel has readings for some well-known repos if you want to see what Madame Steep does before you hand her your own cup.&lt;/p&gt;

&lt;p&gt;When you land on the page, you'll see what looks like a crash screen. It's not a bug. It's the opening act. Press any key to skip, or wait for the glitch dissolve.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhv6wzu4kh52zmsqyqs5u.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%2Fhv6wzu4kh52zmsqyqs5u.png" alt=" " width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a reading looks like:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Paste a repo URL. Click DIVINE. Madame Steep peers into your cup. She tells you about your repo's past, its present state (the roast), and its ominous future. She rates your brew (1-5 teapots). She gives you a lucky commit message. She delivers a one-sentence verdict.&lt;/p&gt;

&lt;p&gt;Then you can download your fortune as a shareable image or save it to your Grimoire (localStorage).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This has been a reading from a teapot. You came here for code review. The leaves had other plans.&lt;/em&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/earlgreyhot1701D" rel="noopener noreferrer"&gt;
        earlgreyhot1701D
      &lt;/a&gt; / &lt;a href="https://github.com/earlgreyhot1701D/steep" rel="noopener noreferrer"&gt;
        steep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A deliberately useless tea leaf reading app for GitHub repos. Paste a URL, get a dramatic, wildly specific, and entirely unhelpful divination of your codebase. Powered by Gemini, tasseography, and poor judgment. Built for the DEV April Fools Challenge 2026. This is a teapot. It cannot brew coffee. 🫖
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;STEEP&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your repo's fortune, steeped in truth.&lt;/strong&gt; 🫖&lt;/p&gt;
&lt;p&gt;&lt;a href="https://steep418.vercel.app" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fearlgreyhot1701D%2Fsteep%2FHEAD%2Fassets%2FSteep%2520Banner.jpg" alt="Steep Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/fW0KYFcC7Aw" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2d75a021ea99748e0928f677d0512b9ddbd292720bde5511332cb5e24deab8f9/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f6657304b594663433741772f6d617872657364656661756c742e6a7067" alt="Watch the demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 1998, Larry Masinter wrote RFC 2324 as an April Fools' joke. It defined a protocol for controlling coffee pots over HTTP and introduced status code 418: "I'm a teapot." The spec notes that the response body "MAY be short and stout."&lt;/p&gt;
&lt;p&gt;It was satire about over-extending HTTP. Then a 15-year-old developer started the Save 418 movement. Major frameworks kept it. Python 3.9 added &lt;code&gt;IM_A_TEAPOT&lt;/code&gt;. A joke became permanent internet infrastructure.&lt;/p&gt;
&lt;p&gt;Steep is that teapot.&lt;/p&gt;
&lt;p&gt;It reads tea leaves. The tea leaves are your GitHub repository. Paste a repo URL and Steep fetches your commit history, file tree, languages, and README. It finds patterns in the data and maps them to real tasseography symbols from centuries-old tea leaf reading traditions. Then an AI fortune teller named Madame Steep delivers a dramatic, weirdly specific, and entirely useless divination of your codebase's…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/earlgreyhot1701D/steep" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User pastes repo URL
        |
        v
github.js fetches repo data (unauthenticated, 60 req/hr)
        |
        v
symbols.js selects symbols deterministically
  - 17 triggers evaluated against real repo data
  - sorted by drama (Grim before Apple)
  - Teacup always included
        |
        v
/api/divine.js sends data + symbols to Gemini 2.5 Flash
  - 80+ line Madame Steep system prompt
  - returns structured JSON
        |
        v
reading.js renders the full reading
  - DOM construction via textContent (no innerHTML)
  - shareable card via html2canvas
  - save to localStorage grimoire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One page. Vanilla HTML/CSS/JS. No framework. One Vercel serverless function. Total cost: $0.&lt;/p&gt;

&lt;p&gt;The pixel art crash screen, the dusty blue aesthetic, the scanline overlay, the three-font system (Press Start 2P for the machine, VT323 for the terminal, Cormorant Garamond for the mystic) are all CSS. No images except the SVG pixel teacup, which is drawn inline.&lt;/p&gt;

&lt;p&gt;21 unit tests. Yes, the joke app has tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The idea
&lt;/h3&gt;

&lt;p&gt;The concept started in a conversation with Gemini. I was exploring Ig Nobel Prize winners for "delightfully useless" inspiration. We went through dead code reanimation tools, commit quality scanners based on astrology, and repo phrenology before landing on tasseography. Tea leaf reading. Because the challenge prizes are teapots. And the Larry Masinter category is literally about a tea/coffee protocol. The concept locked when I realized the ENTIRE APP could be a 418 response: a teapot that someone asked to do useful work, refusing politely.&lt;/p&gt;

&lt;h3&gt;
  
  
  The design
&lt;/h3&gt;

&lt;p&gt;I explored eight UI directions across Claude, Google Gemini, and Google Stitch. Carnival fortune teller. Victorian broadsheet. Dark séance dashboard. Warm tea shop. Steampunk newspaper. The dark directions kept looking too serious. The light directions didn't match the pixel art energy.&lt;/p&gt;

&lt;p&gt;Google Stitch generated complete Material Design 3 systems with color tokens, font stacks, and Tailwind configs. Beautiful, but they all looked like SaaS products. The final direction, dusty blue pixel art with a crash screen opening, came from stripping everything back and asking: what would a haunted computer's fortune teller look like?&lt;/p&gt;

&lt;p&gt;I also used Google Veo to generate the banner image for this post.&lt;/p&gt;

&lt;h3&gt;
  
  
  The symbols
&lt;/h3&gt;

&lt;p&gt;The 17-symbol system is the part I'm most proud of. Each symbol comes from real tasseography tradition. Each one maps to a deterministic trigger in the GitHub data. The Mountain appears when your repo has 100+ commits. The Skull appears when you have no LICENSE file. The Grim appears when your repo hasn't been touched in 6 months.&lt;/p&gt;

&lt;p&gt;The selection happens client-side in &lt;code&gt;symbols.js&lt;/code&gt;. No AI involved. The symbols are sorted by drama (Grim outranks Apple). If fewer than three triggers match, the Bird (good news) appears as a default. The Teacup is always present. The reading happens inside a teapot.&lt;/p&gt;

&lt;p&gt;This split is deliberate: the DATA is deterministic, the STORYTELLING is AI. Same repo, same symbols every time. But each reading is a unique narrative.&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI
&lt;/h3&gt;

&lt;p&gt;Madame Steep is an 80+ line Gemini system prompt. She's Professor Trelawney meets a disappointed senior engineer. The prompt engineering focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Making her reference specific repo data (file names, commit messages, percentages) instead of generic observations&lt;/li&gt;
&lt;li&gt;Weaving tea metaphors naturally into every section&lt;/li&gt;
&lt;li&gt;Keeping verdicts under 15 words (the shareable moment)&lt;/li&gt;
&lt;li&gt;A banned word list to kill LLM filler ("formidable," "testament," "leviathan," "sprawl")&lt;/li&gt;
&lt;li&gt;Never giving useful advice. She's a mystic, not a linter.&lt;/li&gt;
&lt;li&gt;Never being cruel to the developer. She roasts the code, not the coder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;Vanilla HTML/CSS/JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Vercel (free tier)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;One Vercel serverless function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Google Gemini 2.5 Flash&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;GitHub REST API (unauthenticated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;localStorage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share&lt;/td&gt;
&lt;td&gt;html2canvas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 60 request/hour GitHub API rate limit is a feature. The neon bar at the top of the app tracks it in real time: "LEAVES REMAINING: 47 / 60 • THE LEAVES GROW WEARY." When you run out: "THE LEAVES HAVE GONE SILENT. RETURN WHEN THE HOUR TURNS."&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Best Ode to Larry Masinter
&lt;/h3&gt;

&lt;p&gt;In 1998, Larry Masinter wrote RFC 2324 as an April Fools' joke. He defined a Hyper Text Coffee Pot Control Protocol, complete with a BREW method, Accept-Additions headers (cream, sugar), and status code 418: "I'm a teapot." The spec notes the response body "MAY be short and stout," a nod to the nursery rhyme.&lt;/p&gt;

&lt;p&gt;It was satire about over-extending HTTP for absurdly specific purposes. Then in 2017, a 15-year-old developer named Shane Brunswick started the Save 418 movement when the IETF tried to remove it. The movement went viral. Node.js, Go, Python, and ASP.NET all kept 418. Python 3.9 officially added &lt;code&gt;IM_A_TEAPOT&lt;/code&gt;. A joke from 1998 became permanent internet infrastructure.&lt;/p&gt;

&lt;p&gt;Steep is structurally a 418 response. The entire app is a teapot that someone asked to do useful developer work (code review), and it responded with a tea leaf reading instead. The 418 page is not an Easter egg. It's the thesis.&lt;/p&gt;

&lt;p&gt;Click "Actually, give me a real code review" and Steep tells you: "You asked me to brew coffee. I can only read leaves. This is not a code review tool. This is a vessel of divination. RFC 2324, Section 2.3.2."&lt;/p&gt;

&lt;p&gt;The rate limit bar says "THE LEAVES GROW WEARY." The loading screen says "Madame Steep peers into your cup." The crash screen error code is &lt;code&gt;ERR_TEAPOT_418 :: STEEP_DIVINATION_FAULT&lt;/code&gt;. Every interaction is steeped (sorry) in the teapot metaphor. The app IS a teapot. It has always been a teapot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Google AI Usage
&lt;/h3&gt;

&lt;p&gt;Google AI is embedded throughout Steep, from concept to design to product:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini Chat&lt;/strong&gt; helped shape the concept. The path from "Ig Nobel prizes" to "tasseography for GitHub repos" happened in a Gemini conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Stitch&lt;/strong&gt; generated the UI explorations. Multiple rounds of complete page mockups with color token systems and component patterns. Eight distinct directions before locking in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Veo&lt;/strong&gt; generated the banner image for this submission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini 2.5 Flash API&lt;/strong&gt; powers the live product. Every reading is a real-time Gemini call with an 80+ line character prompt, structured JSON output, and creative interpretation channeled through a deterministic symbol framework.&lt;/p&gt;

&lt;p&gt;The symbol system is where the architecture gets interesting. 17 symbols from real tasseography, each mapped to a deterministic trigger:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Your repo earns it when...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⛰ Mountain&lt;/td&gt;
&lt;td&gt;A great journey&lt;/td&gt;
&lt;td&gt;100+ commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💀 Grim&lt;/td&gt;
&lt;td&gt;Death approaches&lt;/td&gt;
&lt;td&gt;No commits in 6+ months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;♥ Heart&lt;/td&gt;
&lt;td&gt;Devotion&lt;/td&gt;
&lt;td&gt;Solo contributor, 50+ commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐍 Snake&lt;/td&gt;
&lt;td&gt;Deception&lt;/td&gt;
&lt;td&gt;50%+ lazy commit messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☀ Sun&lt;/td&gt;
&lt;td&gt;Great happiness&lt;/td&gt;
&lt;td&gt;Test files found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;☠ Skull&lt;/td&gt;
&lt;td&gt;Danger&lt;/td&gt;
&lt;td&gt;No LICENSE file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;♠ Spade&lt;/td&gt;
&lt;td&gt;Hard work&lt;/td&gt;
&lt;td&gt;CI/CD configured&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🍎 Apple&lt;/td&gt;
&lt;td&gt;Knowledge&lt;/td&gt;
&lt;td&gt;README over 500 characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚔ Sword&lt;/td&gt;
&lt;td&gt;Conflict&lt;/td&gt;
&lt;td&gt;30%+ merge commits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚓ Anchor&lt;/td&gt;
&lt;td&gt;Stability&lt;/td&gt;
&lt;td&gt;Consistent commits over 6+ months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐦 Bird&lt;/td&gt;
&lt;td&gt;Good news&lt;/td&gt;
&lt;td&gt;Pushed within 7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✝ Cross&lt;/td&gt;
&lt;td&gt;Trials&lt;/td&gt;
&lt;td&gt;20+ open issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌳 Tree&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;td&gt;5+ active branches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🪁 Kite&lt;/td&gt;
&lt;td&gt;Wishes&lt;/td&gt;
&lt;td&gt;Roadmap file detected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌙 Moon&lt;/td&gt;
&lt;td&gt;Mystery&lt;/td&gt;
&lt;td&gt;.env and .env.example both present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐈 Cat&lt;/td&gt;
&lt;td&gt;Treachery&lt;/td&gt;
&lt;td&gt;Outdated dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌰 Acorn&lt;/td&gt;
&lt;td&gt;Windfall&lt;/td&gt;
&lt;td&gt;High stars-to-age ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🫖 Teacup&lt;/td&gt;
&lt;td&gt;The vessel speaks&lt;/td&gt;
&lt;td&gt;Always present&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Symbol selection is deterministic. No AI involved. Gemini's job is to interpret the symbols it's given, not to choose them. This means every reading is grounded in real data, and Gemini's creativity is channeled through a structured framework rather than generating everything from scratch. The data is consistent. The storytelling is not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx57eg2aholluha2ycqnm.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%2Fx57eg2aholluha2ycqnm.png" alt=" " width="800" height="783"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built by L. Cordero&lt;/strong&gt; (&lt;a href="https://dev.to/earlgreyhot1701D"&gt;@earlgreyhot1701D&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI assisted. Human approved. Powered by NLP.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Do you work here? I flew to Albuquerque to speak at a national conference. Someone asked if I worked the door.</title>
      <dc:creator>L. Cordero</dc:creator>
      <pubDate>Tue, 31 Mar 2026 17:59:36 +0000</pubDate>
      <link>https://dev.to/earlgreyhot1701d/do-you-work-here-i-flew-to-albuquerque-to-speak-at-a-national-ai-conference-someone-asked-if-i-3inj</link>
      <guid>https://dev.to/earlgreyhot1701d/do-you-work-here-i-flew-to-albuquerque-to-speak-at-a-national-ai-conference-someone-asked-if-i-3inj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I get asked if I work here. A lot.&lt;/p&gt;

&lt;p&gt;Target. Hallmark. Grocery stores. I'll be in jeans and a t-shirt, baseball cap on, holding my own cart, my own bags, clearly in the middle of my own shopping, and someone will walk up and ask where something is. Or skip the question entirely:&lt;/p&gt;

&lt;p&gt;"Do you work here?"&lt;/p&gt;

&lt;p&gt;I never do.&lt;/p&gt;

&lt;p&gt;After a while, you stop being surprised. You start keeping track without trying. What you were wearing. How you were standing. Who asked. What they saw when they looked at you, and what they decided it meant. The catalog builds on its own.&lt;/p&gt;

&lt;p&gt;It gets heavy.&lt;/p&gt;




&lt;p&gt;In March 2026, I flew to Albuquerque for the NACM Midyear Conference, the National Association for Court Management.&lt;/p&gt;

&lt;p&gt;I was there to present. My session was about whether courts should invest in building internal AI capacity through their frontline staff, and I used my own work as the case study. Jury eligibility chatbots. Document processing with AWS Textract. A data pipeline for eleven years of jury utilization records. An automation attempt that dead-ended when I found out vendor data quality was the real problem, not the AI.&lt;/p&gt;

&lt;p&gt;Civic tech, built from the operations side, for people trying to figure out what AI actually means in their courts. I'd been writing about it and building for months. But this was the first time I was standing in front of court administrators at a national conference, in person, walking them through what I built and what it taught us.&lt;/p&gt;




&lt;p&gt;I got to the hotel early, before registration opened. A woman walked up to the entrance at the same time I did, her hands full. I reached for the door.&lt;/p&gt;

&lt;p&gt;"Would you like me to open it?"&lt;/p&gt;

&lt;p&gt;She looked at me.&lt;/p&gt;

&lt;p&gt;"Do you work here?"&lt;/p&gt;

&lt;p&gt;I had on a baseball cap. Sunglasses. A Mexican woven shirt. I was just a person holding a door.&lt;/p&gt;

&lt;p&gt;"No. Your hands are full."&lt;/p&gt;

&lt;p&gt;She said she appreciated it.&lt;/p&gt;

&lt;p&gt;I walked in ahead of her, stood in line ahead of her, and checked in.&lt;/p&gt;

&lt;p&gt;Another entry.&lt;/p&gt;




&lt;p&gt;Here's what I keep coming back to.&lt;/p&gt;

&lt;p&gt;The places where people mistake me for staff are places where I've never once felt out of place. I think about the grocery store near my house where one of the women who works there calls me mija every time I come in. She doesn't know what I do. She doesn't care. She just sees me, and that's the whole interaction. No performance required. I think about the aisles where someone won't just point you toward what you're looking for but will walk you there. Those places take care of people.&lt;/p&gt;

&lt;p&gt;No one asks you to earn it first.&lt;/p&gt;




&lt;p&gt;The rooms I've actually earned my way into are different.&lt;/p&gt;

&lt;p&gt;Not because anyone inside is doing something wrong. But because by the time I reach the door, someone has usually already told me what they think I am. So I walk in carrying it. Adjusting anyway. Even when I shouldn't have to.&lt;/p&gt;

&lt;p&gt;That's what I carried into the conference room when I set up my slides and tested my mic in Albuquerque.&lt;/p&gt;




&lt;p&gt;I gave the talk. It went well. People stayed for questions. Courts have followed up since, asking how to start their own AI work, how to think about risk, how to structure bounded experiments in an environment where you can't afford to get it wrong.&lt;/p&gt;

&lt;p&gt;That was the whole point of being there.&lt;/p&gt;




&lt;p&gt;That question doesn't stay at the door.&lt;/p&gt;

&lt;p&gt;There's a conversation in AI/tech/dev communities right now about what counts as "real" building. If you learned with AI tools, if you came from outside the industry, if you figured it out as you went, there are people who will question whether it counts. Whether you understand what you shipped. Whether you earned it.&lt;/p&gt;

&lt;p&gt;Sometimes it sounds like "Do you understand what you've built?"&lt;/p&gt;

&lt;p&gt;Sometimes it sounds like "Do you work here?"&lt;/p&gt;

&lt;p&gt;The mechanics are the same. Someone looks at you, decides what you are, and asks a question they already think they know the answer to.&lt;/p&gt;




&lt;p&gt;I built things that work. I learned in the margins of a full-time job, using the tools available to get started and keep going. I also know what I don't know yet, and I'm working on closing those gaps.&lt;/p&gt;

&lt;p&gt;Both of those are true at the same time.&lt;/p&gt;

&lt;p&gt;I was careful about how I built for my work prototypes. Nothing went into production. That was by design. Every prototype existed to generate operational intelligence, to help court leadership understand what these tools could actually do before committing real resources. I documented everything. I set boundaries. I stopped when something wasn't mine to solve. I made it easier for my manager to say yes the next time.&lt;/p&gt;

&lt;p&gt;The work did what it was supposed to do.&lt;/p&gt;




&lt;p&gt;I don't have a clean ending for this.&lt;/p&gt;

&lt;p&gt;The pattern started long before I learned to code, and it will keep going whether I build ten more prototypes or a hundred. I'm not interested in performing my way past it, and I don't think the answer is accumulating enough credentials that people stop asking the question. They won't.&lt;/p&gt;

&lt;p&gt;I walked into that hotel. Then I walked into that conference room. I gave the talk I came to give.&lt;/p&gt;

&lt;p&gt;If you're building from a path that doesn't look the way people expect, from a role without a clean title, from someone people size up before they listen to, you already know what the catalog feels like. It's not any single entry that weighs you down. It's that there's always a next one.&lt;/p&gt;

&lt;p&gt;The catalog gets heavy.&lt;/p&gt;

&lt;p&gt;The work is still yours.&lt;/p&gt;




&lt;p&gt;AI assisted. Human approved. Powered by NLP. &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wecoded</category>
      <category>dei</category>
      <category>career</category>
    </item>
  </channel>
</rss>
