<?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: softalpha</title>
    <description>The latest articles on DEV Community by softalpha (@softalpha_0).</description>
    <link>https://dev.to/softalpha_0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3885591%2F7b7aedfd-f73d-48b1-8b37-ebfda8363e01.jpg</url>
      <title>DEV Community: softalpha</title>
      <link>https://dev.to/softalpha_0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/softalpha_0"/>
    <language>en</language>
    <item>
      <title>Second Guess: flashcards that notice when you're guessing</title>
      <dc:creator>softalpha</dc:creator>
      <pubDate>Wed, 11 Nov 2026 15:48:28 +0000</pubDate>
      <link>https://dev.to/softalpha_0/second-guess-flashcards-that-notice-when-youre-guessing-4d9n</link>
      <guid>https://dev.to/softalpha_0/second-guess-flashcards-that-notice-when-youre-guessing-4d9n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/presage"&gt;Presage SmartSpectra SDK Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Second Guess helps students find the answers they only guessed right, without trusting their own over-confident self-ratings.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;The problem.&lt;/strong&gt; Flashcard apps like Anki and Quizlet decide when you'll see a card again from &lt;em&gt;your own rating&lt;/em&gt; — and people overrate lucky guesses. A guess gets scheduled like real knowledge, pushed a week away, and forgotten. You find out in the exam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; Second Guess watches the few seconds between seeing a question and revealing the answer — the &lt;em&gt;recall window&lt;/em&gt; — using the SmartSpectra SDK. If you got it right but hesitated (a long pause, looking away, a held breath), it says &lt;strong&gt;"Right — but you hesitated: long pause, looked away"&lt;/strong&gt; and brings that card back &lt;strong&gt;tomorrow&lt;/strong&gt; instead of next week. Every signal is compared with your own 60-second warm-up, and you can always disagree with one key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0e1aw12ms5j3xfeee6n.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0e1aw12ms5j3xfeee6n.gif" alt="A caught guess" width="599" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Bw7pHNqaJRY" width="710" height="399"&gt;
  &lt;/iframe&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj79myhykvz7072p166d1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj79myhykvz7072p166d1.png" alt="Live SDK signals" width="800" height="445"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Live SDK signals on my laptop: breathing trace, blinks, expressions and the 478-point face mesh — numbers only, no video kept.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw9p4xd3h79rhxn9qdpc8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw9p4xd3h79rhxn9qdpc8.png" alt="Camera check" width="800" height="394"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Camera check: plain hints and a face-points "mirror" instead of a video preview.&lt;/em&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbyskqx1ocski9xpvbbf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgbyskqx1ocski9xpvbbf.png" alt="Session summary" width="800" height="426"&gt;&lt;/a&gt;&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqljq1bzifx5o6r06cjk5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqljq1bzifx5o6r06cjk5.png" alt="Check mode and signal replay" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Summary, Check mode result and signal replay.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/softalpha0" rel="noopener noreferrer"&gt;
        softalpha0
      &lt;/a&gt; / &lt;a href="https://github.com/softalpha0/second-guess" rel="noopener noreferrer"&gt;
        second-guess
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Second Guess&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Second Guess helps students find the answers they only guessed right, without trusting their own over-confident self-ratings.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A desktop flashcard app that watches for hesitation &lt;em&gt;while you recall&lt;/em&gt; an answer — using your webcam and the &lt;a href="https://github.com/Presage-Security/SmartSpectra" rel="noopener noreferrer"&gt;Presage SmartSpectra SDK&lt;/a&gt;. When a right answer was really a guess, it says &lt;strong&gt;"Right — but you hesitated"&lt;/strong&gt; and brings that card back tomorrow instead of next week.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/softalpha0/second-guess/docs/screenshots/hesitated.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fsoftalpha0%2Fsecond-guess%2FHEAD%2Fdocs%2Fscreenshots%2Fhesitated.gif" alt="Right — but you hesitated"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🎬 &lt;strong&gt;Demo video (1:27)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://youtu.be/Bw7pHNqaJRY" rel="nofollow noopener noreferrer"&gt;https://youtu.be/Bw7pHNqaJRY&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 &lt;strong&gt;DEV post&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/softalpha_0/second-guess-flashcards-that-notice-when-youre-guessing-4d9n" rel="nofollow"&gt;https://dev.to/softalpha_0/second-guess-flashcards-that-notice-when-youre-guessing-4d9n&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧾 &lt;strong&gt;Evidence&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/softalpha0/second-guess/docs/evidence/" rel="noopener noreferrer"&gt;docs/evidence&lt;/a&gt; — SDK field report from a real run, honest accuracy results, test results&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Built for the &lt;strong&gt;Presage SmartSpectra SDK Challenge&lt;/strong&gt; on DEV · categories: Best Thoughtful Real-World Use, Most Creative or Delightful Use.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Second Guess measures study hesitation — not stress, emotion or health. It is not a medical device.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Spaced-repetition apps (Anki, Quizlet, Brainscape) decide when you see a card again from &lt;strong&gt;your own rating&lt;/strong&gt; of how…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/softalpha0/second-guess" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Run it from source in four commands (see the README). Evidence (SDK field report from a real run, test results, honest accuracy numbers): &lt;a href="https://github.com/softalpha0/second-guess/tree/main/docs/evidence" rel="noopener noreferrer"&gt;docs/evidence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Responds to Human Signals
&lt;/h2&gt;

&lt;p&gt;The SDK runs in Electron's main process on the native camera and sends ~20 messages per second. Before writing any feature, I logged &lt;strong&gt;every field&lt;/strong&gt; it sent on my Windows laptop (&lt;a href="https://github.com/softalpha0/second-guess/blob/main/docs/evidence/sdk-field-report-windows.json" rel="noopener noreferrer"&gt;field report&lt;/a&gt;). That spike decided the design: a &lt;strong&gt;478-point face mesh including irises&lt;/strong&gt; (great for "looking away"), blinks, the chest-breathing trace and 8 expression scores at ~25 readings/s — and &lt;strong&gt;pulse only twice in 77 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;SDK source&lt;/th&gt;
&lt;th&gt;What counts as hesitation&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Long pause&lt;/td&gt;
&lt;td&gt;app timing&lt;/td&gt;
&lt;td&gt;Much slower than your pace on this deck (long questions get a reading allowance)&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Looking away&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;face.landmarks&lt;/code&gt; → head + eye direction&lt;/td&gt;
&lt;td&gt;Away from your usual direction &amp;gt; ~1 s&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breath hold&lt;/td&gt;
&lt;td&gt;&lt;code&gt;breathing.upperTrace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nearly flat for 2–4 s&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blinking&lt;/td&gt;
&lt;td&gt;&lt;code&gt;face.blinking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A burst, or none when some were expected&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;face.expression&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Moving away from your resting face&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pulse&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cardio.pulseRate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not used per card — too slow for a 3-second recall&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The weighted sum is a 0–100 score (threshold 50, adjustable); the two biggest contributors become the plain-language reasons. &lt;strong&gt;When the signal is poor&lt;/strong&gt; — face lost, too dark, camera stopped — the card is marked "no reading" and scheduled normally. SDK validation codes become plain hints on the camera check ("More light on your face, please").&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it work? Honest results
&lt;/h3&gt;

&lt;p&gt;Check mode asks "Was that a guess?" after each right answer and hides its own verdict. In a first test of &lt;strong&gt;16 right answers&lt;/strong&gt; of my own study, Second Guess &lt;strong&gt;caught all 5 of my guesses&lt;/strong&gt; — but it also flagged &lt;strong&gt;8 of the 11 answers I actually knew&lt;/strong&gt;, so it agreed with me about half the time. That's cautious on purpose (a false alarm costs one extra review; a missed guess costs you in the exam), but it isn't good enough yet. The data already told me what to fix: see Challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The warm-up was too easy.&lt;/strong&gt; "2 + 2" takes a second; real cards take longer even when you know them, so every answer looked like a long pause. Recall time is now compared with your own pace on the real deck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looking away pointed the wrong way&lt;/strong&gt; for me — I glance at the keyboard when I'm &lt;em&gt;sure&lt;/em&gt;. Check mode caught it; it's the next signal to re-tune.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulse&lt;/strong&gt; was too sparse per card, so it got weight 0 instead of pretending.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The SDK needs the internet while running.&lt;/strong&gt; A network drop stops the camera, so the app explains exactly why and offers "Turn camera back on".&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Electron + TypeScript + Vite, &lt;code&gt;@smartspectra/node-sdk&lt;/code&gt; 3.5 in the main process (the API key never reaches the window).&lt;/li&gt;
&lt;li&gt;All scoring, scheduling, baseline and import logic is pure TypeScript in &lt;code&gt;src/core&lt;/code&gt; with &lt;strong&gt;104 Vitest tests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Local JSON storage; the API key is encrypted with Windows DPAPI via Electron safeStorage.&lt;/li&gt;
&lt;li&gt;Hand-written SVG for the progress chart and signal replay; electron-builder for the Windows installer.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Re-tune with more Check-mode data and learn each user's weights from their own Y/N answers.&lt;/li&gt;
&lt;li&gt;A longer, varied warm-up so the baseline matches real cards from the first card.&lt;/li&gt;
&lt;li&gt;Anki export so "hesitated" verdicts can feed existing decks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Thoughtful Real-World Use&lt;/strong&gt; — it fixes a real flaw in spaced repetition, with consent first, no recording, "no reading" instead of guessing, and an honest measurement of its own accuracy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most Creative or Delightful Use&lt;/strong&gt; — physiological signals used not for health, but to catch a lucky guess.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consent and Data Handling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The camera starts only after a consent screen that explains what's measured, kept and sent. A &lt;strong&gt;Camera on&lt;/strong&gt; indicator and &lt;strong&gt;Stop camera&lt;/strong&gt; button are always visible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No video, frames or images are stored or sent by Second Guess.&lt;/strong&gt; The app never subscribes to the SDK's video output. Per card it keeps only the hesitation score, the reason labels and the recall time, in local JSON files.&lt;/li&gt;
&lt;li&gt;The SmartSpectra SDK processes the camera on the computer. It connects to Presage's servers to verify the API key and download its models — those requests are linked to the key, so I don't call it anonymous. &lt;strong&gt;SDK telemetry is off&lt;/strong&gt; (&lt;code&gt;enableTelemetry: false&lt;/code&gt;); per Presage's Telemetry &amp;amp; Privacy page, telemetry never includes frames or measured values anyway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Settings → Delete all data&lt;/strong&gt; removes history, schedule, imported decks, settings, the saved key and logs.&lt;/li&gt;
&lt;li&gt;It measures study hesitation — never stress, emotion or health. No AI services are used by the app.&lt;/li&gt;
&lt;li&gt;No camera or key? It works as plain flashcards, with a clear notice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;I built Second Guess solo with &lt;strong&gt;Claude Code&lt;/strong&gt;, from a written PRD and a &lt;code&gt;CLAUDE.md&lt;/code&gt; of rules (plan first, one feature at a time, pure tested core, no video stored, no health words). The riskiest part went first: an SDK spike on my own laptop that logged every field the SDK sends.&lt;/p&gt;

&lt;p&gt;Two real prompts from the session:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"read &lt;code&gt;CLAUDE.md&lt;/code&gt; and this file. Explain your plan in plain language and wait for approval. Build in the order of §7. The riskiest part (M1: what the SDK really gives us) comes first. Test after each feature, commit, then move on."&lt;/p&gt;

&lt;p&gt;"build everything that needs to built today"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude Code wrote the code and tests; I tested every feature on my own laptop and webcam, reported bugs from real use (a camera that stopped, a misleading banner, false alarms), and the fixes came from that real data.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>presagechallenge</category>
      <category>electron</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Planning a real trip with three Claude Code agents in Telegram, via Switch</title>
      <dc:creator>softalpha</dc:creator>
      <pubDate>Sat, 07 Nov 2026 16:44:18 +0000</pubDate>
      <link>https://dev.to/softalpha_0/planning-a-real-trip-with-three-claude-code-agents-in-telegram-via-switch-5hm7</link>
      <guid>https://dev.to/softalpha_0/planning-a-real-trip-with-three-claude-code-agents-in-telegram-via-switch-5hm7</guid>
      <description>&lt;p&gt;How three friends and three AI agents picked a destination, a hotel and a day-by-day plan in one hour, without the AI deciding anything.&lt;/p&gt;

&lt;p&gt;The problem: group trips die in the group chat&lt;br&gt;
You know how it goes. Someone says "we should travel in December!" Two hundred messages later there are links nobody opened, three different date ranges, and no decision. If the trip does happen, one person pays the deposit and spends the next month chasing everyone for their share.&lt;/p&gt;

&lt;p&gt;Asking a chatbot doesn't fix it. ChatGPT isn't in the group chat. It doesn't know who agreed to what, it can't run a vote, and it can't keep a plan that everyone sees.&lt;/p&gt;

&lt;p&gt;So for the Flip the Switch hackathon I built TripRoom: three AI agents that live inside our Telegram group and help us plan, while my friends and I keep every decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Golden rule:&lt;/strong&gt; agents propose, people vote, the trip lead confirms. Nothing is final until someone types "confirm".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea:&lt;/strong&gt; one room, three agents, one job each&lt;br&gt;
Switch turns a chat (Telegram, Slack, Mattermost, Discord or Teams) into a room where people and AI agents work together. I gave each agent one job:&lt;/p&gt;

&lt;p&gt;Agent   Job Owns&lt;br&gt;
scout   Researches destinations, stays, transport and food on the web, with sources Research posts&lt;br&gt;
planner Asks the kickoff questions, runs the votes, writes the itinerary    Trip brief, Itinerary, Decisions log&lt;br&gt;
treasurer   Tracks costs and works out who owes whom    Budget and split&lt;br&gt;
All three are Claude Code agents running on my laptop. Each one has its own folder with a short CLAUDE.md saying what it does and what it must never do. The big one: never book, pay, or ask anyone for money.&lt;/p&gt;

&lt;p&gt;What actually happened (the real run)&lt;br&gt;
On Saturday 7 November my friends Mufasa and Alina and I planned a real weekend away.&lt;/p&gt;

&lt;p&gt;11:43 I typed @planner start a trip. The planner asked six questions in one message: dates, who's coming and from where, budget, style, must-haves and no-gos, and who the trip lead is.&lt;/p&gt;

&lt;p&gt;11:49 Mufasa answered. The planner created a shared Trip brief document. When I answered a minute later, it updated it to v2: 4–6 December, from Lagos, $1,500 each, beach and culture, good food, no flights over two hours.&lt;/p&gt;

&lt;p&gt;11:51 The planner asked the scout for options by itself. The scout ran a dozen web searches and posted three:&lt;/p&gt;

&lt;p&gt;A: Accra, Ghana. About a 1h flight&lt;br&gt;
B: Grand-Bassam, via Abidjan. About a 1h45–2h flight&lt;br&gt;
C: Ouidah, via Cotonou. About a 45 min flight&lt;br&gt;
Every option had a price range and source links. Where it couldn't find something, like a museum entry fee or Sunday flight times, it wrote "Not stated" instead of making it up. That rule, from the room instructions, did more for trust than anything else.&lt;/p&gt;

&lt;p&gt;11:54 We both voted B. The planner posted "B wins 2–0", warned me that the flight is right at my 2-hour limit, and waited. I typed confirm, and it went into the Decisions log as decision 1.&lt;/p&gt;

&lt;p&gt;12:05 Alina joined late. The planner didn't count her vote until she said she was coming. Then it added her to the brief (v3). We picked the Koral Beach Hotel 3–0.&lt;/p&gt;

&lt;p&gt;Then Mufasa asked for a change: swap the museum for a lagoon boat trip. The planner changed only that day, bumped the Itinerary to v5, and waited for my confirm.&lt;/p&gt;

&lt;p&gt;Mufasa paid a $200 hotel deposit and told the treasurer. I asked for balances:&lt;/p&gt;

&lt;p&gt;Benjamin → Mufasa 67 · Alina → Mufasa 67. Sum: 134 − 67 − 67 = 0&lt;/p&gt;

&lt;p&gt;Result: in about an hour we had three decisions made by vote, four shared documents, a three-day itinerary and a settled deposit. Nobody had to be "the spreadsheet person".&lt;/p&gt;

&lt;p&gt;How I set it up (first-time Switch user, on Windows)&lt;br&gt;
Here's everything I did, including the parts that went wrong.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install the basics. You need Docker Desktop, Claude Code (irm &lt;a href="https://claude.ai/install.ps1" rel="noopener noreferrer"&gt;https://claude.ai/install.ps1&lt;/a&gt; | iex in PowerShell, then add %USERPROFILE%.local\bin to PATH) and Switch Console from the Switch releases page. In Switch Console, choose Get started → On this computer. It starts its own server and Mattermost in Docker, which takes about 5–10 minutes the first time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My Claude account hit its weekly limit. Switch said "Claude Code is signed in but could not answer a test prompt (weekly limit)". The fix was an API key from the Claude Console:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;claude auth logout&lt;br&gt;
Gotcha: the key only exists in new terminal windows. My test kept saying "Not logged in" until I closed every terminal (or loaded the key with $env:ANTHROPIC_API_KEY = &lt;a href="https://dev.to:SetEnvironmentVariable(%22ANTHROPIC_API_KEY%22,"&gt;Environment&lt;/a&gt;::GetEnvironmentVariable("ANTHROPIC_API_KEY","User")), then restarted Switch Console.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make a Telegram bot. In &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;: /newbot, save the token, then /mybots → Bot Settings → Group Privacy → Turn off before adding the bot to any group. In Switch Console go to Home → Messaging apps → Connect → Telegram. Then create a group, add the bot, and send "hello". The group becomes a Switch room on its own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linking my Telegram account. Switch searches for your Telegram username, not your display name, and the search fails if you include the @. I typed softalpha, not @SoftalphaX, and it found me.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the agents. In Your Agents → +, I made three, named planner.softalpha0, scout.softalpha0 and treasurer.softalpha0. I pasted each one's CLAUDE.md into Agent instructions, set Who can talk to your agent to Anyone so my friends could talk to them, and left Bypass permissions off.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Directory setting is hidden under Settings, and the folder picker opens in Documents. I pasted the full path, C:\Users\…\triproom\agents\planner, into the Folder box.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Room rules. I pasted the instructions under Your Rooms → weekend_trip → Configuration. Then, in Telegram:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;!invite-agent @planner.softalpha0      (and scout, treasurer)&lt;br&gt;
!set-alias @planner.softalpha0 @planner&lt;br&gt;
!assign-agent @planner                 un-tagged messages go to the planner&lt;br&gt;
!follow-ups off                        one agent answers per thread&lt;br&gt;
@planner define a shared role called scout, an exclusive role called planner, …&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/scout"&gt;@scout&lt;/a&gt; take the scout role             (and the other two)&lt;br&gt;
!roles&lt;br&gt;
🚧 Roles vs aliases: I gave the roles the same names as the aliases, so @planner addresses the role. Until each agent took its role, Switch warned "no agent currently holds the planner role". Ask each agent to take its role straight after you create the roles.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture it as a template. Under Configuration → Capture as template, Switch turns the room (instructions, roles and agents) into YAML. I cleaned it up for reuse and committed it. Anyone can now import it and get the same room.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;br&gt;
One job per agent beats one smart agent. The planner asked the scout and the treasurer for help on its own, but none of them stepped on each other's toes.&lt;br&gt;
Shared documents are the killer feature. The Trip brief, Itinerary, Decisions log and Budget live in the room, so every agent reads the same facts and every friend sees the same plan.&lt;br&gt;
"Not stated" builds trust. An agent that admits what it doesn't know is one you can let near your money.&lt;br&gt;
Humans stay in charge. The agents never decided anything. They made deciding easy.&lt;br&gt;
Try it&lt;br&gt;
Everything is in the repo: the agents, the room instructions, the template, the setup guide with Windows fixes, and the real transcript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt;&lt;a href="https://dev.tourl"&gt;github.com/softalpha0/TripRoom &lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Demo:&lt;/strong&gt;&lt;a href="https://dev.tourl"&gt; https://youtu.be/HfV6ZZXyhB4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clone it, invite your friends, and type @planner start a trip.&lt;/p&gt;

&lt;p&gt;Built for Flip the Switch (WeMakeDevs × DevTools Academy). #HowISwitch****&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>claude</category>
      <category>hackathon</category>
    </item>
  </channel>
</rss>
