<?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: Elizabeth Stein</title>
    <description>The latest articles on DEV Community by Elizabeth Stein (@liztacular).</description>
    <link>https://dev.to/liztacular</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%2F2358502%2F871ac71e-e018-4710-87c1-3770be7a0087.JPG</url>
      <title>DEV Community: Elizabeth Stein</title>
      <link>https://dev.to/liztacular</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liztacular"/>
    <language>en</language>
    <item>
      <title>My Bartending Job Taught Me More About Software Than School Did</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Fri, 06 Mar 2026 03:25:40 +0000</pubDate>
      <link>https://dev.to/liztacular/my-bartending-job-taught-me-more-about-software-than-school-did-1iap</link>
      <guid>https://dev.to/liztacular/my-bartending-job-taught-me-more-about-software-than-school-did-1iap</guid>
      <description>&lt;p&gt;I've been bartending since 2013. I graduate with my software development degree in three weeks.&lt;/p&gt;

&lt;p&gt;The verdict: The bar taught me more useful skills than most of my classes.&lt;/p&gt;

&lt;p&gt;I'm not saying school was useless. I learned algorithms, data structures, SQL optimization, and all that stuff matters.&lt;/p&gt;

&lt;p&gt;But the skills that actually help me build things, ship projects, and work with people? &lt;strong&gt;Those came from dealing with drunk people at 11 PM on a Saturday.&lt;/strong&gt;&lt;/p&gt;

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




&lt;h2&gt;
  
  
  1. User Experience Is Everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
If someone can't figure out how to order from you in 10 seconds, they go somewhere else. You learn to read people instantly. What do they want? What's confusing them? How do I make this easier?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
If your user can't figure out your app in 10 seconds, they close the tab. Same energy. Same urgency.&lt;/p&gt;

&lt;p&gt;School taught me how to build a database. The bar taught me why &lt;strong&gt;nobody cares about your database if they can't find the damn submit button.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;UX isn't a nice-to-have. It's the whole point.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Handle Production Issues in Real Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
The POS system crashes during Friday rush. The blender breaks mid-margarita. Someone spills a full tray. You don't get to "push a hotfix tomorrow." You &lt;strong&gt;fix it now&lt;/strong&gt; while 30 people are staring at you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
Production goes down. Users are waiting. No one cares that you're scared or don't know the answer yet. You troubleshoot under pressure, ask for help when stuck, and ship the fix.&lt;/p&gt;

&lt;p&gt;School gave me practice problems with perfect conditions.&lt;/p&gt;

&lt;p&gt;The bar gave me &lt;strong&gt;chaos management.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the real skill.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Communication &amp;gt; Technical Perfection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
You can make the most technically perfect cocktail in the world. If you're rude, slow, or confusing, no one cares. They leave. They don't tip. They tell their friends you suck.&lt;/p&gt;

&lt;p&gt;The bartender who's decent at drinks but great with people? Packed every shift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
You can write the cleanest code in the world. If you can't explain your decisions, can't collaborate, or make everything harder for your team, &lt;strong&gt;no one wants to work with you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've seen brilliant developers get passed over for promotion because they couldn't communicate.&lt;/p&gt;

&lt;p&gt;I've seen average developers lead teams because they could explain things clearly and make people feel heard.&lt;/p&gt;

&lt;p&gt;School never taught me that. The bar beat it into me every single shift.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Scope Creep Is Real (and You Have to Say No)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
"Can you make me something fruity but not sweet, strong but not too strong, with vodka but also tequila, and make it look cool?"&lt;/p&gt;

&lt;p&gt;If you say yes to everything, you'll spend 10 minutes on one drink while six other people walk out.&lt;/p&gt;

&lt;p&gt;You learn to &lt;strong&gt;manage expectations&lt;/strong&gt; and set boundaries fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
"Can we add login, payments, analytics, dark mode, mobile app, and AI chatbot to this MVP all in three weeks?"&lt;/p&gt;

&lt;p&gt;If you say yes to everything, you'll ship nothing.&lt;/p&gt;

&lt;p&gt;Bartending taught me that &lt;strong&gt;saying no is a skill&lt;/strong&gt;, not a weakness.&lt;/p&gt;

&lt;p&gt;You don't ignore the customer. You guide them to something achievable. Same with clients and stakeholders.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. You Learn More By Doing Than By Studying
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
No amount of training videos prepares you for a Saturday night rush. You learn by getting destroyed on your first weekend, making mistakes, and figuring it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
No amount of tutorials prepares you for building a real project. You learn by breaking things, Googling errors at 2 AM, and shipping messy v1s.&lt;/p&gt;

&lt;p&gt;School gave me theory. The bar gave me &lt;strong&gt;reps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And reps are what actually make you good.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. People Don't Care How Hard It Was
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At the bar:&lt;/strong&gt;&lt;br&gt;
No one cares that the ice machine is broken or that you're short-staffed. They want their drink. Now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In software:&lt;/strong&gt;&lt;br&gt;
No one cares that the API docs were terrible or that your teammate quit mid-sprint. They want the feature. Working.&lt;/p&gt;

&lt;p&gt;You learn to &lt;strong&gt;stop making excuses&lt;/strong&gt; and start solving problems.&lt;/p&gt;

&lt;p&gt;Bartending beat the victim mentality out of me fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Actually Means
&lt;/h2&gt;

&lt;p&gt;I'm not saying everyone should bartend before they code (though honestly, it wouldn't hurt).&lt;/p&gt;

&lt;p&gt;I'm saying &lt;strong&gt;the soft skills matter more than we admit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And most of them don't come from a classroom. They come from high-pressure environments where you have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read people quickly&lt;/li&gt;
&lt;li&gt;Communicate clearly
&lt;/li&gt;
&lt;li&gt;Fix things under stress&lt;/li&gt;
&lt;li&gt;Say no when necessary&lt;/li&gt;
&lt;li&gt;Ship results, not excuses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're switching careers into tech, don't downplay your "non-technical" experience.&lt;/p&gt;

&lt;p&gt;That bartending job? That retail grind? That customer service hell?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Those taught you things a bootcamp can't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They taught you how to handle pressure, work with people, and get things done when everything is on fire.&lt;/p&gt;

&lt;p&gt;That's not a side skill. That's the whole game.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Advice If You're Career Switching
&lt;/h2&gt;

&lt;p&gt;Don't hide your past work. &lt;strong&gt;Use it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're in interviews, don't say:&lt;br&gt;
❌ &lt;em&gt;"I used to bartend but now I'm a developer"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Say:&lt;br&gt;
✅ &lt;em&gt;"I spent 7 years managing high-pressure customer interactions in real time. Now I build software that solves real user problems under tight deadlines."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Same background. Different framing. Way more powerful.&lt;/p&gt;

&lt;p&gt;Your "unrelated" job taught you things that a lot of junior devs don't have yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to stay calm under pressure&lt;/li&gt;
&lt;li&gt;How to communicate with non-technical people
&lt;/li&gt;
&lt;li&gt;How to manage scope and expectations&lt;/li&gt;
&lt;li&gt;How to ship when things aren't perfect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That's not a weakness. That's your edge.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What "unrelated" job taught you the most about tech?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built HireReady: AI voice interviews + spaced repetition for tech interview prep</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Thu, 05 Mar 2026 20:15:40 +0000</pubDate>
      <link>https://dev.to/liztacular/i-built-hireready-ai-voice-interviews-spaced-repetition-for-tech-interview-prep-17ab</link>
      <guid>https://dev.to/liztacular/i-built-hireready-ai-voice-interviews-spaced-repetition-for-tech-interview-prep-17ab</guid>
      <description>&lt;p&gt;Hey DEV community! I just launched &lt;strong&gt;&lt;a href="https://imhireready.com" rel="noopener noreferrer"&gt;HireReady&lt;/a&gt;&lt;/strong&gt; and wanted to share it with you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;p&gt;HireReady is a technical interview preparation platform that combines two things I think are underused in interview prep:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI-powered voice interviews&lt;/strong&gt; using OpenAI's Realtime API — so you can actually practice speaking your answers out loud, not just typing them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spaced repetition&lt;/strong&gt; (FSRS-5 algorithm) — so the app automatically schedules reviews of questions you're weakest on&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I was frustrated with existing interview prep tools. Most of them are just question banks where you grind through problems with no structure. You forget what you studied last week, and you never practice actually &lt;em&gt;talking&lt;/em&gt; through your answers — which is what the real interview is.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1,300+ questions&lt;/strong&gt; across coding, system design, and behavioral categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI voice interviews&lt;/strong&gt; — talk through problems like a real interview, get real-time feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive difficulty&lt;/strong&gt; using Item Response Theory (IRT) parameters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spaced repetition scheduling&lt;/strong&gt; via ts-fsrs so you review at optimal intervals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STAR method story bank&lt;/strong&gt; for behavioral questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gamification&lt;/strong&gt; — XP, streaks, leaderboards, and mastery badges to keep you consistent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Study plans&lt;/strong&gt; — AI-generated personalized plans based on your target role and timeline&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Next.js 16 + React 19 (App Router)&lt;/li&gt;
&lt;li&gt;TypeScript, Tailwind CSS 4, shadcn/ui&lt;/li&gt;
&lt;li&gt;Supabase (Postgres + Auth + RLS)&lt;/li&gt;
&lt;li&gt;Stripe for subscriptions&lt;/li&gt;
&lt;li&gt;OpenAI Realtime API for voice&lt;/li&gt;
&lt;li&gt;ts-fsrs for spaced repetition&lt;/li&gt;
&lt;li&gt;Deployed on Vercel&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The free tier gives you access to practice questions with spaced repetition. Pro unlocks voice interviews, advanced analytics, and unlimited practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out at &lt;a href="https://imhireready.com" rel="noopener noreferrer"&gt;imhireready.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback — what features would be most useful for your interview prep? Drop a comment below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>career</category>
      <category>react</category>
    </item>
    <item>
      <title>How I Built an AI Documentation Engine with Tree-sitter, Claude AI, and RAG</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Tue, 03 Mar 2026 15:27:45 +0000</pubDate>
      <link>https://dev.to/liztacular/how-i-built-an-ai-documentation-engine-with-tree-sitter-claude-ai-and-rag-4jgk</link>
      <guid>https://dev.to/liztacular/how-i-built-an-ai-documentation-engine-with-tree-sitter-claude-ai-and-rag-4jgk</guid>
      <description>&lt;p&gt;Documentation is every developer’s least favorite task.&lt;/p&gt;

&lt;p&gt;We all agree it’s important. We all intend to keep it updated. And yet… it’s usually the first thing to fall behind.&lt;/p&gt;

&lt;p&gt;After watching this happen on every team I’ve worked with, I built &lt;strong&gt;AutomaDocs&lt;/strong&gt; — an AI-powered documentation engine that connects to your GitHub repos and keeps docs in sync automatically.&lt;/p&gt;

&lt;p&gt;Here’s how the system works and what I learned building it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;Every engineering team has had this conversation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PM: “Are the docs updated?”&lt;/li&gt;
&lt;li&gt;Dev: “Uh… mostly.”&lt;/li&gt;
&lt;li&gt;PM: “The API endpoint changed last week.”&lt;/li&gt;
&lt;li&gt;Dev: “…I’ll update them tomorrow.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue isn’t laziness. It’s architecture.&lt;/p&gt;

&lt;p&gt;We treat documentation as a &lt;em&gt;separate artifact&lt;/em&gt; from the code — but the code changes constantly. Keeping two parallel systems in sync manually doesn’t scale.&lt;/p&gt;

&lt;p&gt;So I asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if documentation wasn’t written manually at all?&lt;br&gt;&lt;br&gt;
What if it was generated directly from structured code understanding?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That became AutomaDocs.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Architecture
&lt;/h1&gt;

&lt;p&gt;AutomaDocs has three core layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Structured code analysis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM-powered documentation generation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous sync + retrieval (RAG)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Code Analysis with :contentReference[oaicite:0]{index=0}
&lt;/h2&gt;

&lt;p&gt;Most AI documentation tools just feed raw source code into an LLM.&lt;/p&gt;

&lt;p&gt;That works… but it’s noisy and unreliable.&lt;/p&gt;

&lt;p&gt;Instead, I parse repositories into an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt; using Tree-sitter. This gives structured, language-aware understanding of the codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function signatures with parameters and return types
&lt;/li&gt;
&lt;li&gt;Class hierarchies
&lt;/li&gt;
&lt;li&gt;Import/export graphs
&lt;/li&gt;
&lt;li&gt;Docstring extraction
&lt;/li&gt;
&lt;li&gt;Type information
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of seeing “text,” the AI sees structured architecture.&lt;/p&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;function_declaration&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;createUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;role&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UserRole&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;returnType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Promise&amp;lt;User&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;docstring&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Creates a new user account&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That structure dramatically improves documentation quality compared to raw code prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
LLMs perform significantly better when you reduce ambiguity before prompting them.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. AI Generation with :contentReference[oaicite:1]{index=1}
&lt;/h2&gt;

&lt;p&gt;Once we have structured AST data, we feed it into Claude with carefully designed prompts.&lt;/p&gt;

&lt;p&gt;The system generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API endpoint documentation
&lt;/li&gt;
&lt;li&gt;Method/function descriptions
&lt;/li&gt;
&lt;li&gt;Parameter breakdowns with types
&lt;/li&gt;
&lt;li&gt;Usage examples
&lt;/li&gt;
&lt;li&gt;High-level architecture summaries
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the input is structured, the output is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More consistent
&lt;/li&gt;
&lt;li&gt;Less hallucinated
&lt;/li&gt;
&lt;li&gt;Easier to regenerate deterministically
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation — &lt;em&gt;parser for understanding, LLM for explanation&lt;/em&gt; — keeps responsibilities clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Auto-Sync with :contentReference[oaicite:2]{index=2} Webhooks + RAG
&lt;/h2&gt;

&lt;p&gt;Documentation should never be stale.&lt;/p&gt;

&lt;p&gt;Here’s what happens when you push code:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GitHub webhook fires
&lt;/li&gt;
&lt;li&gt;We detect changed files
&lt;/li&gt;
&lt;li&gt;Tree-sitter re-parses only affected nodes
&lt;/li&gt;
&lt;li&gt;Claude regenerates relevant documentation
&lt;/li&gt;
&lt;li&gt;Embeddings update in :contentReference[oaicite:3]{index=3}
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your docs are never more than one push behind your code.&lt;/p&gt;

&lt;p&gt;No manual updates required.&lt;/p&gt;




&lt;h1&gt;
  
  
  The RAG Chat System
&lt;/h1&gt;

&lt;p&gt;We also built an AI chat interface over your documentation.&lt;/p&gt;

&lt;p&gt;Instead of basic vector search, we implemented &lt;strong&gt;hybrid retrieval&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BM25&lt;/strong&gt; → precise keyword matching (function names, error codes)
&lt;/li&gt;
&lt;li&gt;Pinecone → semantic search (conceptual questions)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reciprocal Rank Fusion (RRF)&lt;/strong&gt; → combines both ranking systems
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means users can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How does authentication work?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even if the word &lt;em&gt;authentication&lt;/em&gt; doesn’t appear directly in code, the system still finds relevant logic, middleware, or config.&lt;/p&gt;

&lt;p&gt;Hybrid search dramatically improves answer quality compared to pure embeddings.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&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;Next.js 16 (App Router)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Express (ES Modules)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector DB&lt;/td&gt;
&lt;td&gt;Pinecone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Claude (Anthropic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parser&lt;/td&gt;
&lt;td&gt;Tree-sitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;td&gt;BullMQ + Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Vercel + Railway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The biggest architectural decision was separating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parsing layer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generation layer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieval layer&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping those decoupled made iteration much faster.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I’d Do Differently
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Start with fewer languages
&lt;/h3&gt;

&lt;p&gt;Supporting 15+ languages from day one was overly ambitious.&lt;/p&gt;

&lt;p&gt;If I rebuilt it today, I’d focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript / TypeScript
&lt;/li&gt;
&lt;li&gt;Python
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nail those first. Expand later.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Build “Documentation Health Scores” earlier
&lt;/h3&gt;

&lt;p&gt;We added a documentation health scoring system later — and surprisingly, it became one of the most loved features.&lt;/p&gt;

&lt;p&gt;Gamification works.&lt;/p&gt;

&lt;p&gt;Teams are far more likely to maintain docs when they can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coverage %&lt;/li&gt;
&lt;li&gt;Outdated endpoints&lt;/li&gt;
&lt;li&gt;Missing descriptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I were starting again, this would be v1.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Use WebSockets instead of polling
&lt;/h3&gt;

&lt;p&gt;We currently poll for generation status updates.&lt;/p&gt;

&lt;p&gt;WebSockets would make the system cleaner and more real-time.&lt;/p&gt;

&lt;p&gt;Classic v1 tradeoff: ship now, refine later.&lt;/p&gt;




&lt;h1&gt;
  
  
  Lessons from Building AI Dev Tools
&lt;/h1&gt;

&lt;p&gt;A few high-level takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structured input &amp;gt; clever prompts&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Retrieval quality matters more than model size&lt;/li&gt;
&lt;li&gt;Dev tools succeed when they reduce friction, not add AI novelty&lt;/li&gt;
&lt;li&gt;Automation only works if it’s invisible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is powerful — but only when wrapped in good architecture.&lt;/p&gt;




&lt;h1&gt;
  
  
  Try It
&lt;/h1&gt;

&lt;p&gt;AutomaDocs is live with a free tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 repositories&lt;/li&gt;
&lt;li&gt;20 AI generations/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://automadocs.com" rel="noopener noreferrer"&gt;https://automadocs.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’d genuinely love feedback from the dev.to community:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What’s your biggest documentation pain point right now?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>documentation</category>
      <category>javascript</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Sat, 14 Feb 2026 21:59:09 +0000</pubDate>
      <link>https://dev.to/liztacular/-17cn</link>
      <guid>https://dev.to/liztacular/-17cn</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il" class="crayons-story__hidden-navigation-link"&gt;I Built the First A11y CLI That Auto-Fixes Code While You Type (+ Teaches Copilot Your Patterns)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/liztacular" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2358502%2F871ac71e-e018-4710-87c1-3770be7a0087.JPG" alt="liztacular profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/liztacular" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elizabeth Stein
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elizabeth Stein
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3256627" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/liztacular" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2358502%2F871ac71e-e018-4710-87c1-3770be7a0087.JPG" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elizabeth Stein&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 14&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il" id="article-link-3256627"&gt;
          I Built the First A11y CLI That Auto-Fixes Code While You Type (+ Teaches Copilot Your Patterns)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubcopilotclichallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubcopilotclichallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/a11y"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;a11y&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>githubcopilotclichallenge</category>
      <category>a11y</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Built the First A11y CLI That Auto-Fixes Code While You Type (+ Teaches Copilot Your Patterns)</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Sat, 14 Feb 2026 17:10:20 +0000</pubDate>
      <link>https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il</link>
      <guid>https://dev.to/liztacular/i-built-the-first-a11y-cli-that-auto-fixes-code-while-you-type-teaches-copilot-your-patterns-49il</guid>
      <description>&lt;h2&gt;
  
  
  🎬 Watch It In Action First
&lt;/h2&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Nobody's Solved
&lt;/h2&gt;

&lt;p&gt;Every accessibility tool tells you what's broken. &lt;strong&gt;None of them fix it automatically while you code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you scan your codebase with axe-cli, pa11y, or Lighthouse, you get a list of violations. Then you context-switch to fix them. By next week, new violations creep in. The backlog grows. Teams feel overwhelmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;95.9% of websites still fail basic WCAG standards&lt;/strong&gt; (WebAIM Million). That's 1 billion users who can't fully use the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes ally Different
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;ally&lt;/strong&gt; - an accessibility CLI with &lt;strong&gt;two industry-first features&lt;/strong&gt; that no competitor has:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Real-Time Auto-Fix on Save
&lt;/h3&gt;

&lt;p&gt;Watches your files and auto-applies WCAG fixes as you save — zero manual intervention.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ally watch src/ &lt;span class="nt"&gt;--fix-on-save&lt;/span&gt;

✓ Auto-fix: ON &lt;span class="o"&gt;(&lt;/span&gt;confidence ≥ 90%&lt;span class="o"&gt;)&lt;/span&gt;
📄 Button.tsx changed
   ✓ Auto-applied 2 fixes
   • &amp;lt;button&amp;gt; → &amp;lt;button aria-label&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Submit"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
   • &amp;lt;img&amp;gt; → &amp;lt;img &lt;span class="nv"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Logo"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

Score: 62 → 100 ✨
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 Instant fixes — No "fix later" backlog&lt;/li&gt;
&lt;li&gt;🎯 High confidence — Only applies fixes ≥90% certainty&lt;/li&gt;
&lt;li&gt;⚡ Zero friction — Edit files normally, ally handles the rest&lt;/li&gt;
&lt;li&gt;🤖 Pattern learning — Learns from your fix history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No other accessibility tool has this.&lt;/strong&gt; Not axe-cli. Not pa11y. Not Lighthouse.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Impact Scoring (0-100)
&lt;/h3&gt;

&lt;p&gt;Shows which violations &lt;strong&gt;actually hurt users&lt;/strong&gt; — eliminates developer overwhelm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ally scan ./src

&lt;span class="o"&gt;[!!!]&lt;/span&gt; CRITICAL Impact: 98/100 &lt;span class="o"&gt;(&lt;/span&gt;WCAG A&lt;span class="o"&gt;)&lt;/span&gt;
    Buttons must have discernible text
    💡 Users cannot activate buttons, blocking core actions
    👥 Affects: Screen reader &lt;span class="nb"&gt;users&lt;/span&gt;, Voice control &lt;span class="nb"&gt;users&lt;/span&gt;
    📊 Estimated: 15-20% of &lt;span class="nb"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of treating all violations equally, ally scores each 0-100 based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WCAG level (A &amp;gt; AA &amp;gt; AAA for priority)&lt;/li&gt;
&lt;li&gt;User groups affected (screen readers, keyboard-only, low vision)&lt;/li&gt;
&lt;li&gt;% of users impacted&lt;/li&gt;
&lt;li&gt;Business context (checkout pages score higher for form issues)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix the highest-score issues first.&lt;/strong&gt; Stop guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GitHub Copilot CLI Integration That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting for this challenge.&lt;/p&gt;

&lt;p&gt;Most submissions will say "I used Copilot to write my code."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ally goes further:&lt;/strong&gt; I built a &lt;strong&gt;custom MCP (Model Context Protocol) server&lt;/strong&gt; (2,094 lines) that &lt;strong&gt;teaches GitHub Copilot about YOUR accessibility patterns&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;When you install ally and run &lt;code&gt;ally init&lt;/code&gt;, it creates &lt;code&gt;.copilot/mcp-config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ally-patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"./node_modules/ally-a11y/mcp-server/dist/index.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when you ask Copilot to fix accessibility issues, it gets context from &lt;strong&gt;7 MCP tools&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_component_patterns&lt;/code&gt;&lt;/strong&gt; - Your existing ARIA patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_design_tokens&lt;/code&gt;&lt;/strong&gt; - WCAG-compliant colors from your codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_fix_history&lt;/code&gt;&lt;/strong&gt; - Previously applied fixes for consistency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_scan_summary&lt;/code&gt;&lt;/strong&gt; - Current accessibility violations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;get_wcag_guideline&lt;/code&gt;&lt;/strong&gt; - Full WCAG criterion details&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;suggest_aria_pattern&lt;/code&gt;&lt;/strong&gt; - ARIA patterns for component types&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;check_color_contrast&lt;/code&gt;&lt;/strong&gt; - Calculate WCAG contrast ratios&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Feedback Loop
&lt;/h3&gt;

&lt;p&gt;This creates a powerful workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. ally scans and finds issues&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ally scan Button.tsx
&lt;span class="o"&gt;[!!!]&lt;/span&gt; CRITICAL: Button missing aria-label

&lt;span class="c"&gt;# 2. Use Copilot with ally's context&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;gh copilot suggest &lt;span class="s2"&gt;"fix the button accessibility"&lt;/span&gt;

&lt;span class="c"&gt;# Behind the scenes, Copilot calls your MCP server:&lt;/span&gt;
&lt;span class="c"&gt;# - get_component_patterns → sees you use aria-label consistently&lt;/span&gt;
&lt;span class="c"&gt;# - get_design_tokens → knows your color palette&lt;/span&gt;
&lt;span class="c"&gt;# - get_fix_history → sees 47 previous aria-label fixes&lt;/span&gt;
&lt;span class="c"&gt;# - get_scan_summary → knows this specific violation&lt;/span&gt;

&lt;span class="c"&gt;# Result: Copilot suggests code that matches YOUR patterns&lt;/span&gt;
&lt;span class="c"&gt;# &amp;lt;button aria-label="Submit form"&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# 3. Apply fix and rescan&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ally scan Button.tsx
✓ No violations found &lt;span class="o"&gt;(&lt;/span&gt;score: 100&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 4. Fix becomes part of your history&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;ally &lt;span class="nb"&gt;history&lt;/span&gt;
✓ Button.tsx: 62 → 100 &lt;span class="o"&gt;(&lt;/span&gt;+38&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is what Copilot CLI integration should look like:&lt;/strong&gt; Not just using Copilot to build a tool, but &lt;strong&gt;making Copilot smarter&lt;/strong&gt; at its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned Building With Copilot CLI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. MCP Servers Are Incredibly Powerful
&lt;/h3&gt;

&lt;p&gt;Building the MCP server taught me that Copilot CLI isn't just a code generator — it's an &lt;strong&gt;extensible platform&lt;/strong&gt;. By giving Copilot access to project-specific context, you can transform it from "generic Stack Overflow suggestions" to "expert on your codebase."&lt;/p&gt;

&lt;p&gt;The telemetry proves it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[MCP Telemetry] get_component_patterns called (47x total)
[MCP Telemetry] get_design_tokens called (23x total)
[MCP Telemetry] get_fix_history called (156x total)
[MCP Telemetry] suggest_aria_pattern called (89x total)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real developers are using it. Copilot is getting smarter about accessibility because of ally's MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context Is Everything for AI Code Generation
&lt;/h3&gt;

&lt;p&gt;Generic Copilot suggestions are often wrong for accessibility because every project uses different ARIA patterns, design systems, and conventions.&lt;/p&gt;

&lt;p&gt;The MCP server solves this by teaching Copilot &lt;strong&gt;your patterns&lt;/strong&gt;, not generic ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developer Experience &amp;gt; Features
&lt;/h3&gt;

&lt;p&gt;ally has 19 commands, but the two that matter most solve &lt;strong&gt;emotional problems&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ally watch --fix-on-save&lt;/code&gt; (removes friction)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ally scan&lt;/code&gt; with impact scores (eliminates overwhelm)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot CLI taught me this during development — the best features &lt;strong&gt;remove blockers&lt;/strong&gt;, not add capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters (The $200B Problem)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Business Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;95.9% of websites fail WCAG (WebAIM Million)&lt;/li&gt;
&lt;li&gt;1 billion users have disabilities&lt;/li&gt;
&lt;li&gt;ADA lawsuits increased 400% (2017-2023)&lt;/li&gt;
&lt;li&gt;WCAG compliance is legally required (US, EU, Canada)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What ally Solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eliminates overwhelm via impact scoring&lt;/li&gt;
&lt;li&gt;Zero-friction fixes via auto-fix on save&lt;/li&gt;
&lt;li&gt;Pattern consistency via MCP server&lt;/li&gt;
&lt;li&gt;Compliance documentation via reports&lt;/li&gt;
&lt;li&gt;Team education via &lt;code&gt;ally learn&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Complete Toolkit (19 Commands)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scanning &amp;amp; Real-Time&lt;/span&gt;
ally scan ./src              &lt;span class="c"&gt;# Impact scoring&lt;/span&gt;
ally watch &lt;span class="nt"&gt;--fix-on-save&lt;/span&gt;     &lt;span class="c"&gt;# Auto-fix as you code&lt;/span&gt;
ally crawl &amp;lt;url&amp;gt;             &lt;span class="c"&gt;# Multi-page scanning&lt;/span&gt;
ally scan-storybook          &lt;span class="c"&gt;# Storybook integration&lt;/span&gt;

&lt;span class="c"&gt;# Fixing &amp;amp; Triage  &lt;/span&gt;
ally fix                     &lt;span class="c"&gt;# Interactive fixes&lt;/span&gt;
ally triage                  &lt;span class="c"&gt;# Prioritize violations&lt;/span&gt;
ally explain                 &lt;span class="c"&gt;# WCAG + Copilot tips&lt;/span&gt;
ally learn &amp;lt;topic&amp;gt;           &lt;span class="c"&gt;# WCAG education&lt;/span&gt;

&lt;span class="c"&gt;# Reporting &amp;amp; Progress&lt;/span&gt;
ally report                  &lt;span class="c"&gt;# MD/HTML/JSON/SARIF/CSV&lt;/span&gt;
ally &lt;span class="nb"&gt;history&lt;/span&gt;                 &lt;span class="c"&gt;# Progress trends&lt;/span&gt;
ally stats                   &lt;span class="c"&gt;# Dashboard&lt;/span&gt;
ally pr-check                &lt;span class="c"&gt;# GitHub PR comments&lt;/span&gt;

&lt;span class="c"&gt;# Plus: tree, badge, audit-palette, init, doctor, health, completion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Try It Yourself (3 Commands)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; ally-a11y

&lt;span class="c"&gt;# 2. Initialize (creates MCP config)&lt;/span&gt;
ally init

&lt;span class="c"&gt;# 3. Start auto-fixing&lt;/span&gt;
ally watch src/ &lt;span class="nt"&gt;--fix-on-save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With GitHub Copilot CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gh copilot suggest &lt;span class="s2"&gt;"fix accessibility in Button.tsx"&lt;/span&gt;
&lt;span class="c"&gt;# Copilot now uses ally's MCP server for project-specific context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Should Win
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Genuinely Novel Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time auto-fix (no competitor has this)&lt;/li&gt;
&lt;li&gt;Impact scoring 0-100 (industry-first)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Deep Copilot Integration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not just "built with" but "makes Copilot smarter"&lt;/li&gt;
&lt;li&gt;2,094-line MCP server with 7 tools&lt;/li&gt;
&lt;li&gt;Production telemetry proving real usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Production-Ready&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Published to npm&lt;/li&gt;
&lt;li&gt;16,505 lines TypeScript&lt;/li&gt;
&lt;li&gt;122+ tests&lt;/li&gt;
&lt;li&gt;GitHub Action + SARIF output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Real Impact&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$200B accessibility market&lt;/li&gt;
&lt;li&gt;1 billion users affected&lt;/li&gt;
&lt;li&gt;Solves #1 developer pain point&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP Server (2,094 lines):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 tools with telemetry&lt;/li&gt;
&lt;li&gt;Pattern/token caching&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;TypeScript safety&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact Scoring:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WCAG level weighting&lt;/li&gt;
&lt;li&gt;User group analysis&lt;/li&gt;
&lt;li&gt;Business context&lt;/li&gt;
&lt;li&gt;0-100 scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Auto-Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;35+ patterns&lt;/li&gt;
&lt;li&gt;Confidence threshold (≥90%)&lt;/li&gt;
&lt;li&gt;Fix history tracking&lt;/li&gt;
&lt;li&gt;Dry-run mode&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/forbiddenlink/ally" rel="noopener noreferrer"&gt;github.com/forbiddenlink/ally&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/ally-a11y" rel="noopener noreferrer"&gt;npmjs.com/package/ally-a11y&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo Video:&lt;/strong&gt; &lt;a href="https://youtu.be/r2LgYIoVrU4" rel="noopener noreferrer"&gt;youtu.be/r2LgYIoVrU4&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Making the web accessible, one auto-fix at a time.&lt;/em&gt; ♿✨&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned Building With Copilot CLI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why accessibility matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;95.9% of top 1 million websites have WCAG failures&lt;/li&gt;
&lt;li&gt;1 billion people worldwide have disabilities&lt;/li&gt;
&lt;li&gt;ADA lawsuits increased 400% from 2017-2023&lt;/li&gt;
&lt;li&gt;WCAG compliance is legally required in many countries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What ally solves:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eliminates overwhelm&lt;/strong&gt; - Impact scoring shows what to fix first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-friction fixes&lt;/strong&gt; - Auto-fix on save means no backlog accumulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern consistency&lt;/strong&gt; - MCP server ensures fixes match your codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance documentation&lt;/strong&gt; - Generate reports for audits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ally scan ./src              &lt;span class="c"&gt;# Scan with impact scoring&lt;/span&gt;
ally watch &lt;span class="nt"&gt;--fix-on-save&lt;/span&gt;     &lt;span class="c"&gt;# Auto-fix as you code&lt;/span&gt;
ally &lt;span class="nb"&gt;history&lt;/span&gt;                 &lt;span class="c"&gt;# View progress over time&lt;/span&gt;
ally fix                     &lt;span class="c"&gt;# Interactive fix approval&lt;/span&gt;
ally explain                 &lt;span class="c"&gt;# WCAG explanations&lt;/span&gt;
ally report                  &lt;span class="c"&gt;# Generate reports (MD/HTML/JSON/SARIF)&lt;/span&gt;
ally triage                  &lt;span class="c"&gt;# Prioritize violations interactively&lt;/span&gt;
ally crawl &amp;lt;url&amp;gt;             &lt;span class="c"&gt;# Multi-page website scanning&lt;/span&gt;
ally pr-check                &lt;span class="c"&gt;# Post results to GitHub PRs&lt;/span&gt;
ally badge                   &lt;span class="c"&gt;# Generate accessibility badges&lt;/span&gt;
ally learn &amp;lt;topic&amp;gt;           &lt;span class="c"&gt;# Educational WCAG explainer&lt;/span&gt;
ally tree &amp;lt;url&amp;gt;              &lt;span class="c"&gt;# View accessibility tree&lt;/span&gt;
ally doctor                  &lt;span class="c"&gt;# Diagnose setup issues&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; ally-a11y

&lt;span class="c"&gt;# Initialize in your project&lt;/span&gt;
ally init

&lt;span class="c"&gt;# Scan your project&lt;/span&gt;
ally scan ./src

&lt;span class="c"&gt;# See what's wrong&lt;/span&gt;
ally explain

&lt;span class="c"&gt;# Fix with AI assistance&lt;/span&gt;
ally fix

&lt;span class="c"&gt;# Generate report&lt;/span&gt;
ally report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;GitHub Copilot CLI (optional, for AI-powered explain/fix)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/forbiddenlink/ally" rel="noopener noreferrer"&gt;github.com/forbiddenlink/ally&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://npmjs.com/package/ally-a11y" rel="noopener noreferrer"&gt;npmjs.com/package/ally-a11y&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubcopilotclichallenge</category>
      <category>a11y</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Specter: Give Your Codebase a Voice</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Sat, 14 Feb 2026 13:42:11 +0000</pubDate>
      <link>https://dev.to/liztacular/specter-give-your-codebase-a-voice-2pd0</link>
      <guid>https://dev.to/liztacular/specter-give-your-codebase-a-voice-2pd0</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Specter&lt;/strong&gt; is a code analysis CLI that speaks &lt;em&gt;as&lt;/em&gt; your codebase in first person. It builds a knowledge graph from your source code and git history, then uses that graph to power 66 commands across analysis, fun/shareable, daily workflow, and AI-powered categories.&lt;/p&gt;

&lt;p&gt;The twist: Specter has personality. Your codebase literally talks about itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I'm feeling pretty good about myself. My complexity hotspots are
 under control, though src/legacy/parser.ts keeps me up at night..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why I Built It
&lt;/h3&gt;

&lt;p&gt;Developer tools are powerful but dry. Nobody shares a SonarQube report on Twitter. I wanted to build something that gives developers the insights they need (health scores, complexity hotspots, DORA metrics) while also being genuinely fun to use and share.&lt;/p&gt;

&lt;p&gt;The result: a tool where &lt;code&gt;specter roast&lt;/code&gt; tears your code apart with animated glitch effects, &lt;code&gt;specter tinder&lt;/code&gt; creates a dating profile for your codebase, and &lt;code&gt;specter anthem&lt;/code&gt; generates a theme song in 8 genres based on your actual metrics.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Serious Analysis (that actually helps)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;specter health&lt;/code&gt; — Health report with complexity distribution and animated score reveal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter hotspots&lt;/code&gt; — Complexity x churn scatter plot with quadrant analysis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter dora&lt;/code&gt; — DORA metrics for delivery performance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter bus-factor&lt;/code&gt; — Knowledge concentration risks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter coupling&lt;/code&gt; — Hidden couplings between files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter cycles&lt;/code&gt; — Circular dependency detection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter cost&lt;/code&gt; — Tech debt estimated in dollars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fun &amp;amp; Shareable (that make people install it)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;specter roast&lt;/code&gt; — Comedic codebase roast with animated glitch intro&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter tinder&lt;/code&gt; — Dating profile for your code with green/red flags&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter wrapped&lt;/code&gt; — Spotify Wrapped-style year in review&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter anthem&lt;/code&gt; — Stats-driven theme song (8 genres)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter fame&lt;/code&gt; — Compare your codebase to famous open-source projects&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter horoscope&lt;/code&gt; — Daily code horoscope based on commit patterns&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter obituary &amp;lt;file&amp;gt;&lt;/code&gt; — Memorial for a file about to be deleted&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter seance&lt;/code&gt; — Summon spirits of deleted code from git history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Daily Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;specter morning&lt;/code&gt; — Daily standup briefing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter precommit&lt;/code&gt; — Risk check before committing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter predict&lt;/code&gt; — PR impact prediction&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter fix&lt;/code&gt; — Actionable fix suggestions with interactive mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;specter tour&lt;/code&gt; — Guided walkthrough for new developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;12 Personality Modes&lt;/strong&gt; — Add &lt;code&gt;--personality &amp;lt;mode&amp;gt;&lt;/code&gt; to any command: default, mentor, critic, historian, cheerleader, minimalist, noir, therapist, roast, dramatic, ghost, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD Ready&lt;/strong&gt; — Every analysis command supports &lt;code&gt;--json&lt;/code&gt; for machine-readable output and &lt;code&gt;--exit-code&lt;/code&gt; for quality gates.&lt;/p&gt;
&lt;h3&gt;
  
  
  MCP Server: 14 Tools for GitHub Copilot CLI
&lt;/h3&gt;

&lt;p&gt;Specter's MCP integration is the core of this submission. One command adds it to Copilot CLI:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot mcp add specter &lt;span class="nt"&gt;--&lt;/span&gt; npx @purplegumdropz/specter-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then use natural language:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Use specter to find complexity hotspots in my codebase"&lt;/span&gt;
copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Use specter to show team expertise for src/api/"&lt;/span&gt;
copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Use specter to analyze the impact of changing config.ts"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;14 MCP tools:&lt;/strong&gt; file relationships, complexity hotspots, codebase summary, dead code detection, symbol search, call chains, architecture diagrams, change coupling, impact analysis, bus factor, code archaeology, health trends, risk scoring, and knowledge map.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6 MCP prompt templates:&lt;/strong&gt; &lt;code&gt;specter:introduce&lt;/code&gt;, &lt;code&gt;specter:review&lt;/code&gt;, &lt;code&gt;specter:onboard&lt;/code&gt;, &lt;code&gt;specter:refactor-plan&lt;/code&gt;, &lt;code&gt;specter:standup-summary&lt;/code&gt;, &lt;code&gt;specter:health-check&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 MCP resources:&lt;/strong&gt; &lt;code&gt;specter://summary&lt;/code&gt;, &lt;code&gt;specter://health&lt;/code&gt;, &lt;code&gt;specter://hotspots&lt;/code&gt;, &lt;code&gt;specter://architecture&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This means Copilot CLI can understand your entire codebase through Specter's knowledge graph — not just the files you have open, but the relationships between them, the complexity patterns, the team expertise distribution, and the historical evolution.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Install &amp;amp; Try
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @purplegumdropz/specter

&lt;span class="c"&gt;# Or try without installing&lt;/span&gt;
npx @purplegumdropz/specter-roast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Demo (30 seconds)
&lt;/h3&gt;

&lt;p&gt;Watch Specter scan, diagnose, and roast a codebase in 30 seconds.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/ZumEIb6uA-0"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;
&lt;h3&gt;
  
  
  Repository
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&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/forbiddenlink" rel="noopener noreferrer"&gt;
        forbiddenlink
      &lt;/a&gt; / &lt;a href="https://github.com/forbiddenlink/specter" rel="noopener noreferrer"&gt;
        specter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ghost-themed interactive web experience with atmospheric effects and immersive storytelling
    &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;👻 Specter&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://www.npmjs.com/package/@purplegumdropz/specter" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/24cea9417b45c671e26284b1fdc471ab885c484f535f2fc88e14a506b78c4420/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f40707572706c6567756d64726f707a2f737065637465722e737667" alt="npm version"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forbiddenlink/specter/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/forbiddenlink/specter/workflows/CI/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forbiddenlink/specter/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/369fbc42307edf603a92ad6f48025d969c1776d27da57c8bd72dbb4a9efe67cf/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f6c2f40707572706c6567756d64726f707a2f737065637465722e737667" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/@purplegumdropz/specter" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5f526d2d103ddf1699567aba52929b7966948d79e5569f47e85f5cdbeeca0c58/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f40707572706c6567756d64726f707a2f73706563746572" alt="npm downloads"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;strong&gt;Give your codebase a voice.&lt;/strong&gt;&lt;br&gt;
  A code intelligence CLI that speaks &lt;em&gt;as&lt;/em&gt; your codebase in first person.&lt;br&gt;
  &lt;strong&gt;65 commands. 14 MCP tools. 12 personality modes. 1 ghost in your git history.&lt;/strong&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What Makes Specter Different?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Traditional analysis tools show metrics without meaning. Specter &lt;strong&gt;connects the dots&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;The Problem&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Specter's Answer&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;"Cyclomatic complexity: 45"&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Where&lt;/strong&gt; the hotspots are + &lt;strong&gt;why&lt;/strong&gt; they matter&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;"Tech debt exists"&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;$510k&lt;/strong&gt; annual maintenance burden (your hourly rate)&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;"Bus factor: 1"&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;strong&gt;Who&lt;/strong&gt; owns what + &lt;strong&gt;what breaks&lt;/strong&gt; if they leave&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Numbers without context&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;AI-powered explanations in 12 personality modes&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install and get started in 30 seconds&lt;/span&gt;
npm install -g @purplegumdropz/specter
specter scan &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; specter health

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Or try without installing&lt;/span&gt;
npx @purplegumdropz/specter-roast&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://youtu.be/ZumEIb6uA-0" rel="nofollow noopener noreferrer"&gt;Watch 30-second demo →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Real-World Examples&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Find the code that's slowing your team down&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;specter hotspots              &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Complexity × Churn = Refactoring Priority&lt;/span&gt;
specter cost                  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Tech debt in dollars ($510k/year)&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/forbiddenlink/specter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&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%2Fco7cjqvpxc7azwsat2xt.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%2Fco7cjqvpxc7azwsat2xt.png" alt=" "&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%2Fc0kj23rw3g38acj43hx9.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%2Fc0kj23rw3g38acj43hx9.png" alt=" "&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%2F51ib525mxdcyml4jhgzk.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%2F51ib525mxdcyml4jhgzk.png" alt=" "&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%2Fqqjwgbfgwguhax529dhf.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%2Fqqjwgbfgwguhax529dhf.png" alt=" "&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%2Fnjb1wq1nxb6aoxh5zibk.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%2Fnjb1wq1nxb6aoxh5zibk.png" alt=" "&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%2Flaveke7wdo3zhx7rx36s.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%2Flaveke7wdo3zhx7rx36s.png" alt=" "&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%2F8up6w575j0486sdsznq8.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%2F8up6w575j0486sdsznq8.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;Building Specter's MCP integration was the most technically interesting part of this project. The MCP protocol gives Copilot CLI structured access to tools, and designing the right tool surface area was a real design challenge.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Worked Well
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot CLI as a natural language interface to analysis tools.&lt;/strong&gt; Instead of remembering flag combinations like &lt;code&gt;specter hotspots --top 10 --sort churn --format table&lt;/code&gt;, users can just say "show me the files that change the most and are most complex." Copilot CLI maps that to the right MCP tool call with the right parameters. This is a genuinely better UX for exploratory analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP prompt templates for common workflows.&lt;/strong&gt; The &lt;code&gt;specter:onboard&lt;/code&gt; template gives Copilot CLI a structured way to introduce new developers to a codebase. The &lt;code&gt;specter:review&lt;/code&gt; template combines file relationships, complexity data, and change coupling to give context-aware code review suggestions. These aren't just wrappers — they compose multiple tools in ways that would be tedious to do manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP resources for ambient context.&lt;/strong&gt; Having &lt;code&gt;specter://summary&lt;/code&gt; and &lt;code&gt;specter://health&lt;/code&gt; available as resources means Copilot CLI can reference your codebase state without an explicit tool call. When you ask "should I refactor this?", it already knows your health score and hotspot distribution.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Design tools for AI, not just humans.&lt;/strong&gt; MCP tools need to return structured data that an LLM can reason about. I spent time making sure tool outputs include both raw numbers and contextual descriptions — so Copilot CLI can say "this file has a bus factor of 1, meaning only one person has ever touched it" rather than just returning &lt;code&gt;{"busFactor": 1}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The personality system works surprisingly well with LLMs.&lt;/strong&gt; When Copilot CLI pipes Specter's personality-enhanced output into its responses, the result feels conversational rather than robotic. The ghost metaphor ("I am the ghost in your git history") gives the tool a memorable identity that makes the AI interaction feel more natural.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; with ts-morph for AST analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commander.js&lt;/strong&gt; for CLI framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP SDK&lt;/strong&gt; (&lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;) for the MCP server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chalk&lt;/strong&gt;, &lt;strong&gt;gradient-string&lt;/strong&gt;, &lt;strong&gt;cfonts&lt;/strong&gt; for terminal UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vitest&lt;/strong&gt; for testing (313 tests across 13 files)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biome&lt;/strong&gt; for linting and formatting&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built by &lt;a href="https://github.com/elizabethsiegle" rel="noopener noreferrer"&gt;Liz Stein&lt;/a&gt; — &lt;em&gt;"I am the ghost in your git history."&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubcopilotcli</category>
      <category>devchallenge</category>
      <category>cli</category>
      <category>typescript</category>
    </item>
    <item>
      <title>TimeSlipSearch: A Conversational Time Machine for Pop Culture</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Mon, 09 Feb 2026 00:52:54 +0000</pubDate>
      <link>https://dev.to/liztacular/timeslipsearch-a-conversational-time-machine-for-pop-culture-51e7</link>
      <guid>https://dev.to/liztacular/timeslipsearch-a-conversational-time-machine-for-pop-culture-51e7</guid>
      <description>&lt;p&gt;This is my submission for the DEV Challenge: &lt;a href="https://dev.to/challenges/algolia"&gt;Consumer-Facing Conversational Experiences&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;TimeSlipSearch&lt;/strong&gt; is a conversational time machine that answers questions like:&lt;/p&gt;

&lt;p&gt;“What was the #1 song the day I was born?”&lt;/p&gt;

&lt;p&gt;…in under 100 milliseconds.&lt;/p&gt;

&lt;p&gt;Type a date in plain English, like “Summer of ’69,” “Christmas 1985,” or “the day the Berlin Wall fell,” and instantly receive a complete cultural snapshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Billboard Hot 100 chart results&lt;/li&gt;
&lt;li&gt;Movies in theaters&lt;/li&gt;
&lt;li&gt;Gas prices and other economic context&lt;/li&gt;
&lt;li&gt;Historical events from that exact moment in time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Nostalgia is a $260B+ industry, yet exploring historical pop culture still requires jumping between Wikipedia, Billboard archives, IMDb, and economic databases.&lt;/p&gt;

&lt;p&gt;The data exists, it’s just scattered and hard to access conversationally.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;A single unified search across &lt;strong&gt;420,000+ indexed records&lt;/strong&gt;, wrapped in an immersive VHS/CRT retro interface that makes time travel feel real.&lt;/p&gt;

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

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

&lt;p&gt;Try these queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July 20, 1969 — Moon landing day&lt;/li&gt;
&lt;li&gt;Summer of ’69 — Natural language works&lt;/li&gt;
&lt;li&gt;Compare 1989 vs 1979 — Side-by-side decades&lt;/li&gt;
&lt;li&gt;Your birthday&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Used Algolia Agent Studio
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Indexed Data: 420K+ Records Across 4 Indices
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Index&lt;/th&gt;
&lt;th&gt;Records&lt;/th&gt;
&lt;th&gt;What It Contains&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeslip_songs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;350,000&lt;/td&gt;
&lt;td&gt;Every Billboard Hot 100 entry, 1958–2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeslip_movies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;Theatrical releases from TMDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeslip_prices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;td&gt;Gas, minimum wage, movie tickets (FRED)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeslip_events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20,000&lt;/td&gt;
&lt;td&gt;Historical events (Wikimedia)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Retrieval Strategy: Parallel Multi-Index Search
&lt;/h3&gt;

&lt;p&gt;Every user query triggers &lt;strong&gt;one HTTP request&lt;/strong&gt; that searches all four indices simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;indexName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeslip_songs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`date &amp;gt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; AND date &amp;lt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hitsPerPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;indexName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeslip_movies&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`date &amp;gt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; AND date &amp;lt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hitsPerPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;indexName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeslip_prices&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`date &amp;gt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; AND date &amp;lt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hitsPerPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;indexName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timeslip_events&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`date &amp;gt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; AND date &amp;lt;= &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hitsPerPage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This batched approach is critical, sequential queries would take ~4× longer and break the conversational feel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt Engineering: Era-Aware Context Generation
&lt;/h3&gt;

&lt;p&gt;Raw search results aren’t enough for conversation. I built a cultural context layer that enriches responses with era-specific narratives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;YEAR_HIGHLIGHTS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;1969&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Summer of Love peaked as humans walked on the moon.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;1984&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MTV transformed music into a visual medium.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;1989&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The Berlin Wall fell and hip-hop went mainstream.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="c1"&gt;// 60+ curated year narratives&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent also generates contextual follow-up suggestions based on actual results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Found George Michael? → “Explore more from George Michael”&lt;/li&gt;
&lt;li&gt;Searched 1988? → “See nearby: 1989 — The year the Berlin Wall fell”&lt;/li&gt;
&lt;li&gt;First time in the 80s? → “Discover more of the 80s”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory System: Persistence Without Accounts
&lt;/h3&gt;

&lt;p&gt;Following a retrieval + scale + memory approach, I implemented localStorage-based memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search History&lt;/strong&gt; — last 20 queries with one-click replay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Favorites&lt;/strong&gt; — save meaningful dates with personal notes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Achievements&lt;/strong&gt; — unlock badges for exploring different decades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates session continuity without requiring authentication, the agent “remembers” your journey through time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Fast Retrieval Matters
&lt;/h2&gt;

&lt;p&gt;TimeSlipSearch lives or dies by speed. Here’s why Algolia was essential:&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Conversational UX requires instant responses
&lt;/h3&gt;

&lt;p&gt;Chat interfaces create expectations of immediacy. A 2-second delay feels like the agent is “thinking too hard.” Algolia’s sub-100ms retrieval keeps the conversation flowing naturally.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Four indices, one round-trip
&lt;/h3&gt;

&lt;p&gt;Without batched multi-index search, I’d need 4 sequential API calls. At ~150ms each, that’s ~600ms of network latency alone, before any processing. Algolia collapses this to a single request.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) The retro aesthetic is decoration, not necessity
&lt;/h3&gt;

&lt;p&gt;The VHS tracking lines and CRT glow are purely stylistic. Results arrive so fast that the “loading” animation is optional, users see their time capsule before the tape even finishes rewinding.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Numeric range filtering at scale
&lt;/h3&gt;

&lt;p&gt;Searching 350,000 Billboard records by Unix timestamp range could be expensive. Algolia’s numeric filters handle it effortlessly, enabling queries like “show me everything from June 1–7, 1988” without performance degradation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16&lt;/li&gt;
&lt;li&gt;Algolia v5&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;chrono-node for natural language date parsing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Billboard Hot 100&lt;/li&gt;
&lt;li&gt;TMDB&lt;/li&gt;
&lt;li&gt;FRED Economic Data&lt;/li&gt;
&lt;li&gt;Wikimedia&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>algoliachallenge</category>
      <category>devchallenge</category>
      <category>search</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>ContradictMe: An AI That Disagrees With You (For Good)</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Mon, 09 Feb 2026 00:32:38 +0000</pubDate>
      <link>https://dev.to/liztacular/contradictme-an-ai-thats-designed-to-disagree-with-you-21d7</link>
      <guid>https://dev.to/liztacular/contradictme-an-ai-thats-designed-to-disagree-with-you-21d7</guid>
      <description>&lt;p&gt;This is my submission for the DEV Challenge: &lt;a href="https://dev.to/challenges/algolia"&gt;Consumer-Facing Conversational Experiences&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;ContradictMe&lt;/strong&gt; is an AI designed to disagree with you.&lt;/p&gt;

&lt;p&gt;Most AI assistants are optimized to be helpful, harmless, and agreeable. ContradictMe is built to &lt;strong&gt;challenge your beliefs with the strongest possible counterarguments&lt;/strong&gt; , not to be contrarian, but to make you think better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;We’re drowning in agreement.&lt;/p&gt;

&lt;p&gt;Social algorithms feed us content that confirms what we already believe. AI assistants optimize for satisfaction. The result is echo chambers everywhere.&lt;/p&gt;

&lt;p&gt;The consequences are real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students graduate without learning to defend their ideas&lt;/li&gt;
&lt;li&gt;Professionals make decisions without stress-testing assumptions&lt;/li&gt;
&lt;li&gt;Public discourse becomes tribal, we don’t even understand the other side anymore&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;ContradictMe weaponizes disagreement for good. Tell it something you believe strongly, and it will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Steel-man the opposition&lt;/strong&gt; , present the strongest version of counterarguments, not weak straw-men
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cite real research&lt;/strong&gt; , every claim backed by credible sources and scored for quality
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acknowledge nuance&lt;/strong&gt; , flags limitations, mixed evidence, and where you might actually be right
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spark deeper thinking&lt;/strong&gt; , ends with reflection questions that stay with you
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s not about changing minds. It’s about strengthening them.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;a href="https://contradict-me.vercel.app" rel="noopener noreferrer"&gt;https://contradict-me.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Experience: Challenge Your Beliefs
&lt;/h2&gt;

&lt;p&gt;Enter any belief, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Remote work is always better”&lt;/li&gt;
&lt;li&gt;“AI will take all jobs”&lt;/li&gt;
&lt;li&gt;“College isn’t worth it”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and get a thoughtful, evidence-based counterargument in seconds.&lt;/p&gt;

&lt;p&gt;What you’ll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quality scores (0-100) for each argument&lt;/li&gt;
&lt;li&gt;Source credibility badges (peer-reviewed, institution, citation count)&lt;/li&gt;
&lt;li&gt;Explicit limitations (example: “This study only examined tech workers”)&lt;/li&gt;
&lt;li&gt;Follow-up questions to explore further&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Debate Arena
&lt;/h2&gt;

&lt;p&gt;Can’t decide what to think? Watch two AI agents battle it out.&lt;/p&gt;

&lt;p&gt;Enter a topic and watch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logical Larry&lt;/strong&gt; (evidence-focused)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotional Emma&lt;/strong&gt; (values-focused)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…debate through &lt;strong&gt;5 structured rounds&lt;/strong&gt;. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interject with your own questions mid-debate&lt;/li&gt;
&lt;li&gt;Vote for the winner&lt;/li&gt;
&lt;li&gt;Export the full transcript&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Analytics &amp;amp; Achievements
&lt;/h2&gt;

&lt;p&gt;Track your intellectual journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topics explored (tag cloud visualization)&lt;/li&gt;
&lt;li&gt;Arguments encountered&lt;/li&gt;
&lt;li&gt;Critical thinking achievements (example: “Renaissance Mind” for exploring 5+ topics)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Feature List
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Dark/light/system themes (keyboard shortcut: ⌘⇧L)&lt;/li&gt;
&lt;li&gt;Conversation history with search + bookmarks&lt;/li&gt;
&lt;li&gt;Export conversations (JSON, Markdown, TXT)&lt;/li&gt;
&lt;li&gt;WCAG accessibility compliance&lt;/li&gt;
&lt;li&gt;Streaming responses with elegant loading states&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Used Algolia Agent Studio
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;User belief → Agent Studio (GPT-4) → Algolia Search → ranked arguments → synthesized response&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The magic is in how retrieval and generation work together.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Curated Argument Database
&lt;/h3&gt;

&lt;p&gt;I didn’t index random content. I built a curated database of &lt;strong&gt;26 research-backed arguments&lt;/strong&gt; across controversial topics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote productivity&lt;/li&gt;
&lt;li&gt;4-day workweek&lt;/li&gt;
&lt;li&gt;Gig economy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Economics&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum wage&lt;/li&gt;
&lt;li&gt;UBI&lt;/li&gt;
&lt;li&gt;Cryptocurrency&lt;/li&gt;
&lt;li&gt;Housing policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technology&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI displacement&lt;/li&gt;
&lt;li&gt;EVs&lt;/li&gt;
&lt;li&gt;Social media effects&lt;/li&gt;
&lt;li&gt;Space funding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Social&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gun policy&lt;/li&gt;
&lt;li&gt;Immigration&lt;/li&gt;
&lt;li&gt;Drug decriminalization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Health/Education&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plant-based diets&lt;/li&gt;
&lt;li&gt;Healthcare systems&lt;/li&gt;
&lt;li&gt;College ROI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each argument is structured for optimal retrieval. Example record shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"objectID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remote-work-innovation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"against_remote_work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"opposingBeliefs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"remote work is always better"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"offices are obsolete"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainClaim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Innovation often depends on unplanned collaboration"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Summary of findings and key results..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"supportingPoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Spontaneous cross-team idea flow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Whiteboard brainstorming sessions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Mentorship through observation"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limitations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Context limits, population limits, or mixed evidence notes..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceMetadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Innovation Patterns in Distributed Teams"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"authors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Author One"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Author Two"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"institution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example University"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"publicationType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"peer-reviewed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"yearPublished"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"citationCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;847&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"doi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.xxxx/xxxx.xxxx"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"qualityScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceCredibility"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidenceStrength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Average quality score across the database: &lt;strong&gt;88.1 / 100&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Search Configuration
&lt;/h3&gt;

&lt;p&gt;Key idea: &lt;strong&gt;rank by quality, not just relevance&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Searchable attributes&lt;/span&gt;
&lt;span class="nx"&gt;searchableAttributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mainClaim&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;evidence&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;supportingPoints&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;opposingBeliefs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// key: matches user's stated belief&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;metadata.tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;metadata.domain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="c1"&gt;// Custom ranking - quality over relevance&lt;/span&gt;
&lt;span class="nx"&gt;customRanking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc(qualityScore)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc(sourceCredibility)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc(evidenceStrength)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="c1"&gt;// Faceting for filtering&lt;/span&gt;
&lt;span class="nx"&gt;attributesForFaceting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filterOnly(position)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;searchable(metadata.domain)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filterOnly(sourceMetadata.yearPublished)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;opposingBeliefs&lt;/code&gt; field is crucial, it’s how the agent matches “I believe remote work is better” to arguments that oppose that position.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Prompt Engineering for Steel-Manning
&lt;/h3&gt;

&lt;p&gt;System prompt principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acknowledge the user’s perspective, don’t dismiss it&lt;/li&gt;
&lt;li&gt;Retrieve the &lt;strong&gt;strongest&lt;/strong&gt; counterarguments (steel-man, not straw-man)&lt;/li&gt;
&lt;li&gt;Present 2-3 top-ranked arguments with:

&lt;ul&gt;
&lt;li&gt;Core claim&lt;/li&gt;
&lt;li&gt;Supporting evidence + quality indicators&lt;/li&gt;
&lt;li&gt;Source attribution (authors, institution, year)&lt;/li&gt;
&lt;li&gt;Explicit limitations or caveats&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Note where the user’s belief has valid points&lt;/li&gt;

&lt;li&gt;End with a thought-provoking question&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Tone rules: never condescending, never attack the person, challenge ideas with evidence and curiosity.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Streaming Integration (SSE)
&lt;/h3&gt;

&lt;p&gt;The frontend uses Server-Sent Events (SSE) for real-time streaming so the response feels like the AI is reasoning in front of you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;agentEndpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userBelief&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;compatibilityMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ai-sdk-5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Stream chunks to client&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Parse SSE format and forward to UI&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Fast Retrieval Matters
&lt;/h2&gt;

&lt;p&gt;Speed isn’t a nice-to-have for ContradictMe, it’s essential to the psychology of the experience.&lt;/p&gt;

&lt;p&gt;When someone shares a deeply-held belief, they’re in a narrow window of openness. If the system is slow, defenses come back up and they start preparing rebuttals before they even read the response.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast (&amp;lt; 2s):&lt;/strong&gt; user stays engaged and receptive
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow (&amp;gt; 5s):&lt;/strong&gt; user disengages or “armors up”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algolia’s fast search lets the agent retrieve, rank, and synthesize arguments before that window closes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real Performance Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average belief-to-first-token&lt;/td&gt;
&lt;td&gt;1.2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full response completion&lt;/td&gt;
&lt;td&gt;4-6 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debate Arena (10 retrievals)&lt;/td&gt;
&lt;td&gt;Smooth, no lag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests passing&lt;/td&gt;
&lt;td&gt;73 / 73&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Debate Arena Stress Test
&lt;/h3&gt;

&lt;p&gt;Each 5-round debate requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 argument retrievals (5 per side)&lt;/li&gt;
&lt;li&gt;real-time synthesis&lt;/li&gt;
&lt;li&gt;awareness of prior rounds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With slower retrieval, this feature wouldn’t feel usable. With Algolia, it feels like watching two informed debaters go head-to-head in real time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;ContradictMe isn’t just a demo, it’s a proof of concept for a different kind of AI.&lt;/p&gt;

&lt;p&gt;What if we built systems that made us &lt;strong&gt;better thinkers&lt;/strong&gt;, not just more efficient workers? What if disagreement was a feature, not a bug?&lt;/p&gt;

&lt;p&gt;Algolia Agent Studio made this possible by combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fast semantic search over structured argument data&lt;/li&gt;
&lt;li&gt;GPT-4 synthesis for nuanced responses&lt;/li&gt;
&lt;li&gt;streaming delivery for conversational flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is an AI that respects you enough to disagree.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://contradict-me.vercel.app" rel="noopener noreferrer"&gt;https://contradict-me.vercel.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algoliachallenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>search</category>
    </item>
    <item>
      <title>StanceStream – Real-Time Multi-Agent AI Debates Powered by Redis</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Sun, 10 Aug 2025 19:56:02 +0000</pubDate>
      <link>https://dev.to/liztacular/stancestream-real-time-multi-agent-ai-debates-powered-by-redis-482m</link>
      <guid>https://dev.to/liztacular/stancestream-real-time-multi-agent-ai-debates-powered-by-redis-482m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Beyond the Cache&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;StanceStream is a production-ready, multi-agent AI debate engine that transforms political discussions into live, evolving simulations.&lt;br&gt;
Built entirely on Redis 8, it goes far beyond caching by orchestrating all four Redis data models in a single architecture to power intelligent agents with persistent personalities, memory-driven reasoning, real-time stance evolution, and advanced fact-checking.&lt;/p&gt;

&lt;p&gt;The result is a fully operational real-time AI platform that demonstrates how Redis can serve as the primary data layer for a complex, high-performance AI application — handling everything from semantic search and live analytics to event streaming and structured data storage.&lt;/p&gt;

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

&lt;p&gt;Live app: &lt;a href="https://stancestream.vercel.app/" rel="noopener noreferrer"&gt;https://stancestream.vercel.app/&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/forbiddenlink/stancestream" rel="noopener noreferrer"&gt;https://github.com/forbiddenlink/stancestream&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo Highlights:&lt;br&gt;
-4-mode navigation: Standard debate, Multi-debate viewer, Analytics dashboard, Business metrics&lt;br&gt;
-Real-time stance charts tracking position changes during debates&lt;br&gt;
-Semantic Cache Dashboard showing live Redis Vector operations&lt;br&gt;
Multi-agent debates: SenatorBot vs ReformerBot on 8+ political topics&lt;br&gt;
-Topic synchronization ensuring accurate stance tracking across all components&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;p&gt;RedisJSON – Complex Data Structures&lt;br&gt;
-Stores detailed agent profiles with nested personality traits, evolving political stances, and emotional states&lt;br&gt;
-Tracks cache metrics, contest scoring, and AI-generated key moment summaries&lt;br&gt;
-Maintains intelligence metrics for emotional trajectory analysis&lt;/p&gt;

&lt;p&gt;Redis Streams – Real-Time Messaging&lt;br&gt;
-Broadcasts public debate messages via WebSocket to all clients&lt;br&gt;
-Maintains private agent memory streams for strategic reasoning and coalition building&lt;br&gt;
-Logs message history with pagination for replay and context&lt;/p&gt;

&lt;p&gt;RedisTimeSeries – Time-Based Analytics&lt;br&gt;
-Tracks stance evolution over time for each agent&lt;br&gt;
-Records emotional shifts influencing responses&lt;br&gt;
-Captures performance metrics for live optimization and momentum tracking&lt;/p&gt;

&lt;p&gt;Redis Vector – Semantic Intelligence&lt;br&gt;
-Runs semantic caching with an 85% similarity threshold, achieving 70%+ hit rates&lt;br&gt;
-Powers fact-checking by comparing claims across multiple knowledge bases using COSINE similarity&lt;br&gt;
-Isolates topics to prevent cross-contamination between debates&lt;br&gt;
-Uses OpenAI text-embedding-ada-002 for high-quality embeddings&lt;/p&gt;

&lt;p&gt;Beyond the Cache&lt;br&gt;
StanceStream demonstrates Redis as far more than a cache — it’s the real-time AI backbone for an application that merges natural language reasoning, fact verification, and live analytics.&lt;br&gt;
By combining RedisJSON, Streams, TimeSeries, and Vector Search, the system delivers intelligent, personality-driven debates with business-ready dashboards, semantic intelligence, and millisecond-level responsiveness.&lt;/p&gt;

&lt;p&gt;This project proves Redis can function as a complete, multi-model primary database for advanced AI workloads, pushing the limits of what’s possible in real-time applications.&lt;/p&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>StanceStream – Real-Time Multi-Agent AI Debates Powered by Redis</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Sun, 10 Aug 2025 19:49:04 +0000</pubDate>
      <link>https://dev.to/liztacular/stancestream-real-time-multi-agent-ai-debates-powered-by-redis-20d0</link>
      <guid>https://dev.to/liztacular/stancestream-real-time-multi-agent-ai-debates-powered-by-redis-20d0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/redis-2025-07-23"&gt;Redis AI Challenge&lt;/a&gt;: Real-Time AI Innovators&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;StanceStream is a production-ready, multi-agent AI debate engine that turns political discussions into live, evolving simulations.&lt;br&gt;
It uses all four Redis 8 data models in a single cohesive system to power intelligent agents with persistent personalities, memory-driven reasoning, stance evolution tracking, and real-time fact-checking.&lt;/p&gt;

&lt;p&gt;This is not just a demo — it’s a fully operational real-time AI platform built for performance, scalability, and contest readiness.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;br&gt;
-Real-time debates between intelligent AI agents with distinct political personalities&lt;br&gt;
-Semantic caching engine achieving 70%+ hit rates with Redis Vector search&lt;br&gt;
-Live stance evolution tracking using RedisTimeSeries&lt;br&gt;
-Multi-agent intelligence with emotional states and coalition building&lt;br&gt;
-Advanced fact-checking with multi-source verification and confidence scoring&lt;br&gt;
-Business intelligence dashboard showing ROI and cost savings&lt;br&gt;
-Concurrent debate support with topic isolation across all components&lt;br&gt;
-Performance optimization via live metrics engine&lt;/p&gt;

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

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

&lt;p&gt;Repo: &lt;a href="https://github.com/forbiddenlink/stancestream" rel="noopener noreferrer"&gt;https://github.com/forbiddenlink/stancestream&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Highlights:&lt;br&gt;
-4-mode navigation: Standard debate, Multi-debate viewer, Analytics dashboard, Business metrics&lt;br&gt;
-Real-time stance charts: Track position changes during the debate&lt;br&gt;
-Semantic Cache Dashboard: Live Redis Vector operations in action&lt;br&gt;
-Agent battles: SenatorBot vs ReformerBot on 8+ political topics&lt;br&gt;
-Topic synchronization: Ensures accurate stance tracking in multi-agent debates&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Redis 8
&lt;/h2&gt;

&lt;p&gt;*RedisJSON – Complex Data Structures&lt;br&gt;
-Stores rich agent profiles with nested personality traits, evolving political stances, and emotional states&lt;br&gt;
-Tracks cache metrics, contest scoring, and key moments with AI-generated summaries&lt;br&gt;
-Maintains intelligence metrics for emotional trajectory analysis&lt;br&gt;
*Redis Streams – Real-Time Messaging&lt;br&gt;
-Broadcasts public debate messages via WebSocket to all connected clients&lt;br&gt;
-Maintains private agent memories for strategic reasoning and coalition building&lt;br&gt;
-Logs message history with pagination for replay and context management&lt;br&gt;
*RedisTimeSeries – Time-Based Analytics&lt;br&gt;
-Tracks stance evolution over time for each agent&lt;br&gt;
-Measures emotional shifts that influence debate responses&lt;br&gt;
-Records system performance metrics for live optimization&lt;br&gt;
-Monitors debate momentum and trend patterns&lt;br&gt;
*Redis Vector – Semantic Intelligence&lt;br&gt;
-Runs semantic caching with an 85% similarity threshold, achieving 70%+ hit rates&lt;br&gt;
-Powers the fact-checker, comparing claims against multiple knowledge bases using COSINE similarity&lt;br&gt;
-Isolates topics to prevent cross-contamination between debates&lt;br&gt;
-Uses OpenAI text-embedding-ada-002 (1536 dimensions) for high-quality embeddings&lt;/p&gt;

&lt;p&gt;Advanced Redis Features&lt;br&gt;
-Vector search with topic filtering to maintain cache accuracy&lt;br&gt;
-Real-time Redis optimization with live performance tuning&lt;br&gt;
-Concurrent connection management with automatic cleanup&lt;br&gt;
-Enterprise-grade error handling and reconnection strategies&lt;br&gt;
Memory-efficient operations using data retention policies&lt;/p&gt;

&lt;p&gt;Production-Ready Architecture&lt;br&gt;
-Centralized Redis connection manager with health monitoring&lt;br&gt;
-WebSocket broadcasting to multiple clients for instant updates&lt;br&gt;
-Background process orchestration for long-running simulations&lt;br&gt;
-Comprehensive logging and live performance metrics&lt;/p&gt;

&lt;p&gt;Why It’s Unique&lt;br&gt;
StanceStream proves Redis is far more than a cache — it’s a complete real-time AI backbone.&lt;br&gt;
By orchestrating multiple data models in a single architecture, it delivers intelligent, personality-driven debates with live analytics, semantic reasoning, and fact verification at scale.&lt;br&gt;
This project demonstrates how Redis 8 can drive high-performance, multi-model AI applications in production environments, showcasing true real-time intelligence.&lt;/p&gt;

</description>
      <category>redischallenge</category>
      <category>devchallenge</category>
      <category>database</category>
      <category>ai</category>
    </item>
    <item>
      <title>🌟 Quantum Forge - Dream Intranet Portal</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Mon, 28 Jul 2025 06:50:33 +0000</pubDate>
      <link>https://dev.to/liztacular/quantum-forge-dream-intranet-portal-4jh6</link>
      <guid>https://dev.to/liztacular/quantum-forge-dream-intranet-portal-4jh6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I created Quantum Forge, an employee portal that transforms the traditional intranet concept into a spectacular digital workspace. This isn't just another corporate portal—it's a dream intranet that showcases what's possible when you combine technical excellence with creative innovation.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;br&gt;
35+ Custom Web Components built with vanilla JavaScript&lt;br&gt;
AI-Powered Task Management with visual workflow optimization&lt;br&gt;
Real-Time Analytics Dashboard with memory-optimized Chart.js integration&lt;br&gt;
Interactive Office Visualizer with 3D workspace booking&lt;br&gt;
Dynamic Color Theming with HSL-based real-time customization&lt;br&gt;
18 Fully Functional Pages (exceeds contest requirements)&lt;br&gt;
100% Accessible with WCAG 2.1 AA compliance&lt;br&gt;
Spectacular Visual Effects with 60FPS animations and glassmorphism design&lt;br&gt;
The portal features everything a modern workplace needs: task management, team collaboration, analytics insights, event planning, document management, and even an interactive office floor plan for desk booking. Every element has been crafted to provide an intuitive, engaging user experience that makes work feel less like work.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://quantum-forge-intranet.netlify.app/" rel="noopener noreferrer"&gt;https://quantum-forge-intranet.netlify.app/&lt;/a&gt; Experience the full portal functionality&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/forbiddenlink/quantum-forge" rel="noopener noreferrer"&gt;https://github.com/forbiddenlink/quantum-forge&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;The Challenge&lt;br&gt;
Creating a dream intranet with only HTML, CSS, and JavaScript seemed daunting at first. How do you build something that feels modern and sophisticated without frameworks? The answer was Web Components and a service-based architecture that rivals any framework-based solution.&lt;/p&gt;

&lt;p&gt;Design Innovation: Glassmorphism Meets Functionality&lt;br&gt;
I'm particularly proud of the glassmorphism design system that makes every component feel like it's floating in space while maintaining perfect readability and accessibility. The dynamic color theming system uses HSL values to generate entire color palettes in real-time.&lt;/p&gt;

&lt;p&gt;Performance Mastery&lt;br&gt;
Memory management was crucial, especially with Chart.js integration. I built a centralized ChartManager service that prevents memory leaks.&lt;/p&gt;

&lt;p&gt;Accessibility First&lt;br&gt;
Every component includes comprehensive accessibility features:&lt;/p&gt;

&lt;p&gt;ARIA labels and landmarks&lt;br&gt;
Keyboard navigation support&lt;br&gt;
Screen reader announcements&lt;br&gt;
High contrast mode support&lt;br&gt;
Reduced motion preferences&lt;br&gt;
CSS Architecture Excellence&lt;br&gt;
I developed advanced CSS cleanup tools that reduced duplicates by 92% (from 344 to 27). The modular CSS architecture with systematic imports ensures maintainable, performant styling.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;br&gt;
Vanilla JavaScript is Powerful - You don't need frameworks to build sophisticated applications&lt;br&gt;
Web Components are the Future - They provide framework-like organization with zero dependencies&lt;br&gt;
Performance Matters - Real-time monitoring and optimization make applications feel magical&lt;br&gt;
Accessibility is Non-Negotiable - Building inclusively from the start is easier than retrofitting&lt;br&gt;
CSS Grid is Amazing - Modern CSS layout capabilities rival any framework&lt;br&gt;
Proudest Achievements&lt;br&gt;
Zero Build Dependencies - Just open index.html and it works&lt;br&gt;
35+ Reusable Components - Each component is a self-contained, reusable piece&lt;br&gt;
100% Functional Interface - Every button, link, and interaction works perfectly&lt;br&gt;
Technical Innovation - Features like the 3D office visualizer push web boundaries&lt;br&gt;
Enterprise Quality - Code quality and architecture suitable for production use&lt;br&gt;
The most rewarding moment was when everything came together - watching the aurora particle effects dance behind the glassmorphism cards while real-time data updates smoothly, all running at 60fps with perfect accessibility. It proves that with creativity and technical skill, pure web technologies can create experiences that rival any modern framework.&lt;/p&gt;

&lt;p&gt;This project represents hours of passionate development, pushing the boundaries of what's possible with vanilla web technologies while maintaining the highest standards of accessibility, performance, and user experience.&lt;/p&gt;

&lt;p&gt;🏆 Built with ❤️ for the Frontend Challenge: Office Edition&lt;/p&gt;

&lt;p&gt;Quantum Forge - Where spectacular design meets technical excellence&lt;/p&gt;

&lt;p&gt;License&lt;br&gt;
MIT License - Feel free to use this code in your own projects!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Zoom Grid Mayhem</title>
      <dc:creator>Elizabeth Stein</dc:creator>
      <pubDate>Thu, 17 Jul 2025 11:50:42 +0000</pubDate>
      <link>https://dev.to/liztacular/zoom-grid-mayhem-1g27</link>
      <guid>https://dev.to/liztacular/zoom-grid-mayhem-1g27</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, CSS Art: Office Culture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;"You're still on mute."&lt;br&gt;
We've all heard it. With Zoom Grid Mayhem, I wanted to playfully capture the chaos, comedy, and sometimes downright awkwardness of virtual meetings. Inspired by the endless tiles of distracted coworkers, surprise cat cameos, and mysterious ceiling fan views, I built a mini art piece that turns the typical Zoom call into an interactive, animated CSS grid party. It’s a love letter (or a warning?) to remote office life.&lt;/p&gt;

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

&lt;p&gt;🎮 Check out the mayhem: &lt;a href="https://zoomgridmayhem.netlify.app/" rel="noopener noreferrer"&gt;https://zoomgridmayhem.netlify.app/&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%2Fcpkvj50yiexjrbjk5r9l.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%2Fcpkvj50yiexjrbjk5r9l.png" alt=" " width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to view the source code via browser inspect tools or fork your own version!&lt;br&gt;
&lt;a href="https://github.com/forbiddenlink/zoom-grid-mayhem" rel="noopener noreferrer"&gt;https://github.com/forbiddenlink/zoom-grid-mayhem&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I started with a simple grid layout to mimic a typical video call screen and let my imagination run wild. Using only HTML and CSS (with a tiny dash of animation), I styled each "participant" to reflect common—and absurd—video meeting moments:&lt;br&gt;
The person who's frozen.&lt;br&gt;
The one clearly working out during the call.&lt;br&gt;
Pets taking over the webcam.&lt;/p&gt;

&lt;p&gt;One of the most fun parts was experimenting with expressive CSS styles and animations to give each tile its own "personality" using minimal markup. I avoided JavaScript to stay within the spirit of CSS art, relying on @keyframes, :hover states, and creative use of ::before and ::after.&lt;/p&gt;

&lt;p&gt;I learned how powerful CSS Grid and creative constraints can be—especially when you're trying to express real-world chaos using code.&lt;/p&gt;

&lt;p&gt;I’d love to expand this with user-generated mayhem tiles, randomize the grid chaos, and maybe even build a “live meeting” version that lets users join in. For now, this piece stands as a pixelated tribute to the beautiful absurdity of remote work.&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
  </channel>
</rss>
