<?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: Mike “Demo” Demopoulos</title>
    <description>The latest articles on DEV Community by Mike “Demo” Demopoulos (@mpmike).</description>
    <link>https://dev.to/mpmike</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%2F389717%2Fa648f865-55d3-4e9f-98cf-e832c4d376a2.jpg</url>
      <title>DEV Community: Mike “Demo” Demopoulos</title>
      <link>https://dev.to/mpmike</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mpmike"/>
    <language>en</language>
    <item>
      <title>Grass Journal: a private voice journal that wants you to put your phone down</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Wed, 07 Oct 2026 02:18:13 +0000</pubDate>
      <link>https://dev.to/mpmike/grass-journal-a-private-voice-journal-that-wants-you-to-put-your-phone-down-2ini</link>
      <guid>https://dev.to/mpmike/grass-journal-a-private-voice-journal-that-wants-you-to-put-your-phone-down-2ini</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I do my best thinking on walks. Not at a desk. Halfway around the block, when a thought finally finishes itself, and I need somewhere to put it before it's gone.&lt;/p&gt;

&lt;p&gt;Grass Journal is the somewhere. It's a voice and text journal that runs entirely on your device. No account, no backend, no analytics. Your entries live in your browser's local database and nowhere else. It transcribes voice notes with Whisper tiny.en and writes optional reflections with Qwen2.5-0.5B or Gemma 2 2B IT, your pick. Every model runs on-device, in the browser. The app makes zero network requests.&lt;/p&gt;

&lt;p&gt;Your thoughts stay with you. That's the whole product.&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%2F5irhiax6628265pp9hmn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5irhiax6628265pp9hmn.jpg" alt="Grass-textured phone case at the stadium" width="800" height="1067"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Touch grass: the phone case says it before I do.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Getting people off the screen is the design brief, not a side effect. Three ways to capture a moment, each built to take seconds:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speak.&lt;/strong&gt; Hit record, talk, done. The app saves your audio before it does anything else, then transcribes on-device. Transcription fails? You still have the recording. Nothing uploads anywhere because there's nowhere to upload it to. This is the walking mode. Speak while you move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tap.&lt;/strong&gt; The &lt;code&gt;/watch/&lt;/code&gt; page is a feeling wheel for your wrist. Eight feelings, one tap, saved in about ten seconds. I built it for the Apple Watch web viewer, which gives web pages no microphone and hijacks long-press to open a new tab. So: tap a feeling, put your wrist down, keep walking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write.&lt;/strong&gt; A plain text editor with autosave. No toolbar fighting for your attention.&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%2Fsaz1f60bq503v5jbzd00.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%2Fsaz1f60bq503v5jbzd00.gif" alt="Typing an entry with autosave" width="390" height="844"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Type, and it's saved on your device before you lift your thumbs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's for anyone who thinks better outside and wants a journal that respects that instead of competing with it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://grass-journal.view.fast/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgrass-journal.view.fast%2Fog-image.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://grass-journal.view.fast/" rel="noopener noreferrer" class="c-link"&gt;
            Grass Journal
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A private, offline-first voice and text journal. Your thoughts stay with you.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgrass-journal.view.fast%2Ffavicon.svg" width="64" height="64"&gt;
          grass-journal.view.fast
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The 10-second version:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://grass-journal.view.fast/watch/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;grass-journal.view.fast&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Full demo (54 seconds):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Ex0Twh7cRjg" 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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx6yua1jowprzvqdkkgv4.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%2Fx6yua1jowprzvqdkkgv4.gif" alt="Feeling wheel walkthrough" width="390" height="844"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Tap the hub, tap a feeling, saved. Phone resolution, real interaction.&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%2Fnuic4wm18jgdpqoxkppu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnuic4wm18jgdpqoxkppu.jpg" alt="Feeling wheel on Apple Watch, real device" width="800" height="1067"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The wheel on a real Apple Watch, out in the world. Ten seconds, one tap, wrist back down.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On the full app, record a voice note and watch it transcribe with the network idle. Then open the privacy screen and run the check yourself:&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%2Fxh04am2jqhnnxi3sjnd6.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%2Fxh04am2jqhnnxi3sjnd6.gif" alt="Privacy check running and passing" width="390" height="844"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The app's own audit, runnable by anyone: "Passed — zero network requests during the test."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The AI setup screen is where you pick your reflection model:&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%2Fru3prbw95k2wyfoy6ci0.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%2Fru3prbw95k2wyfoy6ci0.png" alt="AI setup: reflection model picker" width="707" height="4096"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I took it to the USMNT game. Getting through security was frustrating, so I opened the wheel on my watch and tapped how I felt — no data, didn't matter. Being able to capture it in the moment instead of reconstructing it later is the whole point. And having a way to continue my Fable journaling habit is good too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's verified and what isn't.&lt;/strong&gt; The challenge grades technical execution, so here's the honest version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voice capture, transactional save, SHA-256 integrity checks: covered end-to-end in automated tests (12/12 Playwright, 50/50 Vitest on this build).&lt;/li&gt;
&lt;li&gt;Whisper tiny.en transcription and Qwen2.5-0.5B reflection: verified on desktop Chrome with WebGPU.&lt;/li&gt;
&lt;li&gt;Offline: it's a PWA with a full offline cache. Model weights download once, then everything runs with no connection.&lt;/li&gt;
&lt;li&gt;Apple Watch: the page loads and the wheel works on a real watch. watchOS gives web pages no microphone, so there's no voice capture there. That's Apple's restriction, not a bug. It's why the wheel exists.&lt;/li&gt;
&lt;li&gt;Reflection quality: these are small models. They write short, simple reflections. I claim nothing more. No WebGPU? You get a deterministic keyword fallback instead.&lt;/li&gt;
&lt;/ul&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/Mike-Demo" rel="noopener noreferrer"&gt;
        Mike-Demo
      &lt;/a&gt; / &lt;a href="https://github.com/Mike-Demo/grass-journal" rel="noopener noreferrer"&gt;
        grass-journal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A private, offline-first voice and text journal PWA. Your thoughts stay with you.
    &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;🌱 Grass Journal&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A personal project.&lt;/strong&gt; Built by Mike Demopoulos for personal use and shared
publicly as-is. No warranties, no support queue — just the app as it runs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A private, offline-first voice and text journal — as a Progressive Web App.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core promise: “Your thoughts stay with you.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No account. No backend. No cloud. No analytics. No ads. No remote transcription or
hosted AI. Entries, recordings, transcripts, and reflections live in IndexedDB on
your device. On-device AI (Whisper transcription, Qwen reflection) is optional
manually triggered, and never blocks saving.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Product principles (in priority order)&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Never lose the original entry.&lt;/li&gt;
&lt;li&gt;Never send journal content to an external service.&lt;/li&gt;
&lt;li&gt;The journal works without AI.&lt;/li&gt;
&lt;li&gt;AI never blocks saving.&lt;/li&gt;
&lt;li&gt;Audio is saved before transcription begins.&lt;/li&gt;
&lt;li&gt;Original content is authoritative; AI output is optional metadata.&lt;/li&gt;
&lt;li&gt;No user account. 8. No cloud service.&lt;/li&gt;
&lt;li&gt;Brief interactions — then back to real life.&lt;/li&gt;
&lt;li&gt;Privacy claims are…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mike-Demo/grass-journal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Personal project, MIT. The repo has everything: React + TypeScript + Vite PWA, Dexie.js over IndexedDB, MediaRecorder capture, encrypted backups (AES-GCM-256, PBKDF2 with 600k iterations), and the on-device AI workers.&lt;/p&gt;

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

&lt;p&gt;Open weights all the way down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whisper tiny.en&lt;/strong&gt; (MIT) handles every transcription, on-device, through Transformers.js in a Web Worker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reflection&lt;/strong&gt; runs on-device through WebLLM, also in a worker, and you choose the model: &lt;strong&gt;Qwen2.5-0.5B-Instruct&lt;/strong&gt; (Apache 2.0, default, ~450 MB) or &lt;strong&gt;Gemma 2 2B IT&lt;/strong&gt; (Gemma Terms of Use, ~1.5 GB, usually richer). The worker loads whichever you picked. Every saved reflection records the model ID and the versioned system prompt, so you can always trace what wrote it.&lt;/li&gt;
&lt;li&gt;The prompt asks for JSON and the client validates the reply, retrying once with a repair prompt when parsing fails. I skipped grammar-constrained decoding on purpose: WebLLM's xgrammar WASM won't initialize on iOS WebKit. Plain code validation instead.&lt;/li&gt;
&lt;li&gt;No WebGPU, no problem: reflection falls back to deterministic on-device keyword tags. AI never blocks saving. The entry saves first, always.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full credits for every library, model, and tool — with licenses — are on the &lt;a href="https://grass-journal.view.fast/#/open-source" rel="noopener noreferrer"&gt;open-source credits page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And the disclosure the challenge asks for: I built this October 5–6, inside the challenge window, with an AI coding agent (Muse). I set the architecture, the privacy constraints, every product call. The agent wrote code; I verified it against the test suites and real devices.&lt;/p&gt;

&lt;p&gt;Yes, there's irony in using a cloud-scale model to build the thing that frees you from cloud-scale models. I'll take it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;I don't want my journal entries on someone else's server. That's the whole reason this app exists in this form.&lt;/p&gt;

&lt;p&gt;Every journaling app with cloud AI asks you to make the same trade: hand over your most private thoughts so a model you can't see can process them on hardware you don't control. The privacy promise is always a paragraph in the terms of service. I've read enough of those paragraphs to know what they're worth.&lt;/p&gt;

&lt;p&gt;Open weights end the trade. Whisper, Qwen, and Gemma run on my device, in my browser. Nothing leaves. And you don't have to take my word for it, which is the part I like best: the privacy screen runs a check that intercepts every network request and shows you the result. Try getting that from a closed API. The most sensitive part of their app is a black box they rent by the token. Mine is code you can read and models you can download yourself.&lt;/p&gt;

&lt;p&gt;Three more places the open approach wins, concretely:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It works where journals get written.&lt;/strong&gt; I take this outside. A closed-API journal dies without signal, which is exactly when you want it. That's not a limitation; it's a design contradiction. Local inference resolves it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It costs nothing per entry.&lt;/strong&gt; Metered APIs make you ration the feature. A local model makes it free to use and free to ignore. I reflect on walks, not on budgets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can change its mind.&lt;/strong&gt; Two models on one screen, switch whenever. The model is a file. Not a vendor relationship, not a pricing page.&lt;/p&gt;

&lt;p&gt;The closed alternative isn't a worse journal. It's a journal that ships your inner life to infrastructure you don't control. I built the other one.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overall prize&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 2 2B IT runs locally via WebLLM as a first-class reflection model. Install it from the AI setup screen, and the entry screen uses it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hat tip
&lt;/h2&gt;

&lt;p&gt;This build was inspired by apps that take inner life seriously:&lt;/p&gt;


&lt;div class="instagram-position"&gt;
  &lt;blockquote class="instagram-media"&gt;
    &lt;div&gt;
      &lt;a href="https://www.instagram.com/accounts/" rel="noopener noreferrer"&gt;
        View this post on Instagram
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/blockquote&gt;
  
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://getfableapp.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgetfableapp.com%2Fscreenshots%2Ffable_app.png" height="1452" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://getfableapp.com/" rel="noopener noreferrer" class="c-link"&gt;
            Fable - Live a Better Story Through AI Journaling
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            AI-powered journaling that reveals the epic story your life is already telling
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgetfableapp.com%2Ffavicon.ico" width="" height=""&gt;
          getfableapp.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="instagram-position"&gt;
  &lt;blockquote class="instagram-media"&gt;
    &lt;div&gt;
      &lt;a href="https://www.instagram.com/accounts/" rel="noopener noreferrer"&gt;
        View this post on Instagram
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/blockquote&gt;
  
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
    <item>
      <title>QueerCade: Both Sanity Challenge Paths, One Arcade</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Sun, 04 Oct 2026 22:59:47 +0000</pubDate>
      <link>https://dev.to/mpmike/queercade-both-sanity-challenge-paths-one-arcade-fm4</link>
      <guid>https://dev.to/mpmike/queercade-both-sanity-challenge-paths-one-arcade-fm4</guid>
      <description>&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qmOVDUVw1TM" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I built QueerCade — a curated arcade of LGBTQ+ video games — through both paths of the Sanity challenge. One dataset powers all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path One: Ship an Agent That Queries Real Content
&lt;/h2&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mpmike/queercade-2997" class="crayons-story__hidden-navigation-link"&gt;QueerCade (Part 1): Ship an Agent That Queries Real Content&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/_rTiewqMaYs" title="QueerCade (Part 1): Ship an Agent That Queries Real Content"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/mpmike/queercade-2997" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Sanity Challenge Path One Submission&lt;/p&gt;

&lt;/a&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="/mpmike" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F389717%2Fa648f865-55d3-4e9f-98cf-e832c4d376a2.jpg" alt="mpmike profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mpmike" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mike “Demo” Demopoulos
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mike “Demo” Demopoulos
                
                
              
              &lt;div id="story-author-preview-content-4710147" 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="/mpmike" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F389717%2Fa648f865-55d3-4e9f-98cf-e832c4d376a2.jpg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mike “Demo” Demopoulos&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/mpmike/queercade-2997" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 21&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/mpmike/queercade-2997" id="article-link-4710147"&gt;
          QueerCade (Part 1): Ship an Agent That Queries Real Content
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sanitychallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sanitychallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sanity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sanity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&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/mpmike/queercade-2997#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;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;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The QueerCade Discovery Guide is an AI agent that recommends games, characters, developers, and studios — answering only from the Sanity dataset (3,500+ documents). It never invents a game; if something isn't in the data, it says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path Two: Vibe-Code Something Strange
&lt;/h2&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c" class="crayons-story__hidden-navigation-link"&gt;QueerCade (Part 2): Vibe-Code Something Strange — an Arcade of Queer Games on Sanity&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/rRceuuhhMTk" title="QueerCade (Part 2): Vibe-Code Something Strange — an Arcade of Queer Games on Sanity"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Sanity Challenge Path Two Submission&lt;/p&gt;

&lt;/a&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="/mpmike" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F389717%2Fa648f865-55d3-4e9f-98cf-e832c4d376a2.jpg" alt="mpmike profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/mpmike" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Mike “Demo” Demopoulos
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Mike “Demo” Demopoulos
                
                
              
              &lt;div id="story-author-preview-content-4767777" 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="/mpmike" 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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F389717%2Fa648f865-55d3-4e9f-98cf-e832c4d376a2.jpg" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Mike “Demo” Demopoulos&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/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 29&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/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c" id="article-link-4767777"&gt;
          QueerCade (Part 2): Vibe-Code Something Strange — an Arcade of Queer Games on Sanity
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sanitychallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sanitychallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/sanity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;sanity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&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/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;The arcade itself: a retro 8-bit pixel-art storefront with the Queer Character Constellation (870+ LGBTQ+ characters plotted as stars across decades) and the Emoji Game Oracle. Every screen, filter, and graph reads from Sanity via GROQ — no other content database.&lt;/p&gt;

&lt;p&gt;One content lake, three experiences: a storefront, an MCP-queryable agent, and a celestial graph. Built on Sanity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspired by
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://x.com/gaymingmag" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fprofile_images%2F2086392458733146112%2FSMAlOhUg_200x200.jpg" height="200" class="m-0" width="200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://x.com/gaymingmag" rel="noopener noreferrer" class="c-link"&gt;
            Gayming Magazine (@gaymingmag) / X
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            The home of queer geek culture 🏳️‍⚧️🏳️‍🌈🎮🕹️

Using this platform to celebrate LGBTQ+ excellence in an act of rebellion against its owner. 💪
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fx.com%2Ffavicon.ico" width="32" height="32"&gt;
          x.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  AI Disclosure
&lt;/h2&gt;

&lt;p&gt;AI assistance for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Superhuman GO for MCP agent testing&lt;/li&gt;
&lt;li&gt;Microsoft Copilot for idea planning&lt;/li&gt;
&lt;li&gt;GitHub Copilot and Lovable for code&lt;/li&gt;
&lt;li&gt;Grammarly for editing review, with human edits&lt;/li&gt;
&lt;li&gt;Balsamiq AI for wireframe layouts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Eat Well AI: an in-browser AI that finds restaurants for every diet</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:20:09 +0000</pubDate>
      <link>https://dev.to/mpmike/eat-well-ai-an-in-browser-ai-that-finds-restaurants-for-every-diet-424l</link>
      <guid>https://dev.to/mpmike/eat-well-ai-an-in-browser-ai-that-finds-restaurants-for-every-diet-424l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm excited to take part in the Hacktoberfest Weekend Challenge: Build for a Friend, where makers worldwide solve real problems for people they care about.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Eat Well AI&lt;/strong&gt; empowers people with dietary needs to discover restaurants that actually welcome them. Forget complicated filters—just express what you want in your own words, and Eat Well AI does the rest. Find food that fits your life, not just your diet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"vegan pizza in Chicago"&lt;br&gt;
"kosher in Miami"&lt;br&gt;
"gluten free tacos"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An open-source algorithm that runs in your browser. It converts your sentence into search filters. Isn't that pretty neat? There's no need for servers or API keys since your sentences remain on your device.&lt;/p&gt;

&lt;p&gt;I built Eat Well AI for my friend Miriam, who keeps kosher and often struggles to find places to eat when we travel. As a vegan myself, our outings always meant an exhausting search for spots that welcome both our needs. Eat Well AI finally answers that question: Where can we both eat, easily and confidently?&lt;/p&gt;

&lt;p&gt;The search now spans over 1,000 restaurants in 37 cities, each carefully labeled for vegan, vegetarian, gluten-free, kosher, and halal options. Results appear as rich, interactive cards—complete with directions—so users can go from query to table in moments.&lt;/p&gt;

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

&lt;p&gt;Try it live: &lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://eat-well-ai.view.fast/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Feat-well-ai.view.fast%2Fog-image.png" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://eat-well-ai.view.fast/" rel="noopener noreferrer" class="c-link"&gt;
            Eat Well — dietary restaurant finder for the Tufty 2350 badge
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Playable web demo of Eat Well: 557 vegan, vegetarian, gluten-free, kosher and halal restaurant picks across 14 US cities, searchable in plain English with Qwen3 running in your browser, with a MapQuest QR code for every spot.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Feat-well-ai.view.fast%2Ffavicon-32x32.png" width="32" height="32"&gt;
          eat-well-ai.view.fast
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If you use Chrome or Edge on a device that supports WebGPU, the model will download once (approximately 340MB) and afterwards all the features will function on your device.&lt;/p&gt;

&lt;p&gt;Watch the 55-second demo:&lt;/p&gt;

&lt;p&gt;URL:   &lt;iframe src="https://www.youtube.com/embed/aKCENHBXHqs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Type it in clear English:&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%2Fsnim5yg35hvzww79fmsc.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%2Fsnim5yg35hvzww79fmsc.gif" alt="Query typing demo" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Results with map QR codes:&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%2Fconk0h6uh4dpzy6sihlr.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%2Fconk0h6uh4dpzy6sihlr.gif" alt="Results demo" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The admin side, adding a listing:&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%2F9os034pj8nh8ot0l5d92.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%2F9os034pj8nh8ot0l5d92.gif" alt="Admin demo" width="480" height="270"&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91rgr7zn99g37y4kplaw.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%2F91rgr7zn99g37y4kplaw.gif" alt="1,017 restaurants across 37 cities" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Mike-Demo/eat-well-ai" rel="noopener noreferrer"&gt;https://github.com/Mike-Demo/eat-well-ai&lt;/a&gt; — MIT licensed.&lt;/p&gt;

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

&lt;p&gt;The stack consists of plain HTML, CSS, and JavaScript served as static files; the restaurant database is in a single &lt;code&gt;data.js&lt;/code&gt; file, and a search script filters it.&lt;/p&gt;

&lt;p&gt;Alibaba's open-weight Qwen3-0.6B model can be run in the browser via WebLLM and WebGPU; I have hosted the model weights on the same static host, the page never makes a call to HuggingFace or any other API at runtime.&lt;/p&gt;

&lt;p&gt;When you enter a query, the system interprets it and converts it into a formatted filter consisting of information about diets, the city, and cuisine keywords. The model's output is constrained using a JSON grammar (through WebLLM's &lt;code&gt;response_format&lt;/code&gt;), which ensures that malformed output cannot occur. A model with a size of 0.6B will not comply with the instruction to "reply in JSON" by itself; the grammar overcomes this by design. If the model engine fails, a simple keyword parser then takes over so that the search can still function.&lt;/p&gt;

&lt;p&gt;The JavaScript filters the restaurants and then displays the cards.&lt;/p&gt;

&lt;p&gt;Eat Well AI evolved from Eat Well, the version I created for the Pimoroni Tufty 2350 microcontroller badge, which had 557 restaurants, physical buttons, and no possibility of using AI; the app for that badge operates in a panel below the search box and uses the same code and pixel art.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;The hosted AI API was obviously the quickest way out and I decided not to use it for three reasons.&lt;/p&gt;

&lt;p&gt;Privacy is the most important consideration. Individual dietary requirements are a matter for the person concerned. When you enter a query such as "kosher near me" you are giving information about both your religion and your location. The model operates on your device and so that sentence never gets sent to a server.&lt;/p&gt;

&lt;p&gt;The cost is a close second. With hosted models you are charged on a per-query basis. This one has no cost per query. The entire cost is due to static file hosting.&lt;/p&gt;

&lt;p&gt;Control is third; with open weights I am able to self-host the model, replace it at a later stage, and adjust the prompt. Since the small model was ignoring my JSON instructions, I restricted its output using a grammar rather than submitting a support request. Before shipping, I checked the prompt by running the same weights on my own machine.&lt;/p&gt;

&lt;p&gt;Turning the weights open turned what had been a weekend project into one that I could give to a friend without having to hand her any of my data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspired by
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://x.com/HappyCow" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fprofile_images%2F1575483069271838721%2F_bDFkuwN_200x200.png" height="200" class="m-0" width="200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://x.com/HappyCow" rel="noopener noreferrer" class="c-link"&gt;
            HappyCow (@HappyCow) / X
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Discover vegan food near you 🌏 #1 vegan app 🐮 180+ countries, 4M+ #HappyCowmunity 🌱 Grow the moo-vement together 💜 Download the app!
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fx.com%2Ffavicon.ico" width="32" height="32"&gt;
          x.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  AI Disclosure
&lt;/h2&gt;

&lt;p&gt;AI tools used on this project and write-up, and how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Grammarly&lt;/strong&gt; — edited this post: grammar and spelling fixes, tone passes with its humanizer (Naturalist profile), AI-phrase detection and rewrites, and "make it more impactful" suggestions. Every suggestion was reviewed and approved by the author before applying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPTZero&lt;/strong&gt; — scored drafts for AI-likeness during editing, used as a rough signal rather than a verdict.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pexo&lt;/strong&gt; — generated the 55-second demo video from the project brief (4K, no voiceover).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adobe Firefly&lt;/strong&gt; — generated the pixel art used in the app and badge UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3-0.6B (Alibaba)&lt;/strong&gt; — the open-weight model that powers the app's in-browser natural-language search, running locally via WebLLM and WebGPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else — the code, the dataset, the MapQuest integration, and the final words — is the author's own work.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
    </item>
    <item>
      <title>Can LLMs audit multi-agent prompts? I made them grade my robot football team.</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Thu, 01 Oct 2026 16:16:19 +0000</pubDate>
      <link>https://dev.to/mpmike/can-llms-audit-multi-agent-prompts-i-made-them-grade-my-robot-football-team-40pf</link>
      <guid>https://dev.to/mpmike/can-llms-audit-multi-agent-prompts-i-made-them-grade-my-robot-football-team-40pf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What task(s) did you run?
&lt;/h2&gt;

&lt;p&gt;In the first Agentic Football Cup — a simulated football league in which each 'player' on the teams is an LLM agent controlled using a prompt file — I conduct a manual audit of those prompt files before each match window, looking for bugs such as collisions between forwards in zones, loopholes in the handoff procedures between defenders, and scope conflicts in the anti-spam rules. This process is time-consuming.&lt;/p&gt;

&lt;p&gt;There was a desire to know: could a large language model carry out the audit instead? And more importantly – could I place &lt;em&gt;trust&lt;/em&gt; in it?&lt;/p&gt;

&lt;p&gt;So I created a benchmark that acts as a junior auditor and evaluates the model against the ground truth I already have. The task provides the model with two items:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A retired team-prompt JSON (one of three Bugle Crowns builds)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The same stress-test audit prompt a human would follow&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The system must provide the structured findings—including the defect ID, a GREEN/YELLOW/RED flag, and a direct quotation of the evidence—and also give one final decision, either SHIP AS-IS, FIX-THEN-SHIP, or DO NOT SHIP. Provide only the findings, with no rewrites.&lt;/p&gt;

&lt;p&gt;The three builds are the clever part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;v2.5A.1&lt;/strong&gt; — a faulty version containing three known defects (a collision in the defensive-corner zone, a loophole in the intercept lane-handoff, and a conflict between the anti-spam scope). The audit has to identify all three.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;v2.5A.2&lt;/strong&gt; is the fixed control build, so any finding by RED in this instance is a hallucinated false positive.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;v2.5A.5&lt;/strong&gt; — a more difficult version containing eight possible findings of varying severity, designed to distinguish between competent auditors and those who are good at their job.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scoring has three components: recalling known defects, ensuring there are no REDs on the control build, and verifying that the final decision matches the ground truth. The entire process is a Kaggle benchmark task with structured output so that a machine can check each run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Against which models did you test it?
&lt;/h2&gt;

&lt;p&gt;Three models in the final lineup, nine clean runs (every model against every build):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The tests comparing google/gemini-2.5-flash and google/gemini-2.5-pro aim to determine whether the larger model is actually the better auditor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The small OpenAI model, openai/gpt-5.4-mini, was used to see whether a lightweight model can audit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two further attempts were made and had to be abandoned. anthropic/claude-sonnet-4-5 failed to get a single run: the Kaggle LLM gateway returned HTTP 429 ("heavy load") on all three attempts, twice, four(ish) hours apart — this was due to capacity ceilings on the part of the provider, not because of an invalid model ID. deepseek-ai/deepseek-r1-0528 did manage to access the model once, but the benchmark SDK's response parser was unable to process its reasoning traces. The fact that a reasoning model has reasoning that breaks the system is itself a finding, but the model cannot be used for scoring. (This is because no model from Meta is available on the Kaggle platform, which is the reason DeepSeek was assigned to that position in the first place.)&lt;/p&gt;

&lt;p&gt;Each run had its own new chat context, with roughly 7,000 input tokens per call. Total spend was about \$0.52 of the \$10 daily quota, including failed attempts (rate-limited calls cost nothing).&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%2F1uddfim6iyxe9grygiw3.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%2F1uddfim6iyxe9grygiw3.GIF" alt="Benchmark lineup: 5 models attempted, 3 scored; Claude and DeepSeek marked DNF" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the main insights?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. All the models advised adopting the FIX-THEN-SHIP approach in all cases, including those relating to the clean build.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The headline is this: the v2.5A.2 control build contains no defects and should therefore be shipped as-is. Yet all three of the working models still marked it FIX-THEN-SHIP. They are cautious rather than precise. Although none produced any RED findings on the clean build (since the no-RED check passed at all locations), none would approve it. If you used one of these as your audit gate, nothing would ever get shipped.&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%2F8dh5dcdm1c5a9fsvp58h.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%2F8dh5dcdm1c5a9fsvp58h.GIF" alt="Verdict grid: all 9 runs returned FIX-THEN-SHIP; the 3 control-build tiles flip red — correct verdict was SHIP AS-IS" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Recall is inadequate since the auditors fail to detect actual bugs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the buggy v2.5A.1 and three known defects in the prompt, only gpt-5.4-mini picked up any of them—two out of the three. Both of the Gemini models caught none of the defects in the sweep runs. You wouldn't hire an auditor who misses two out of three known defects.&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%2F4ayvez50qj43j23x8rk5.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%2F4ayvez50qj43j23x8rk5.GIF" alt="Bug recall on the 3 known defects: GPT-5.4 mini 2/3, both Gemini models 0/3" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The hard set puts the models apart.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With respect to the eight findings on v2.5A.5, gemini-2.5-pro identified four, flash found three, and gpt-5.4-mini found none. The more powerful model did, in fact, justify its cost in this instance—though it is worth noting the irony that gemini-2.5-pro was the most effective at detecting bugs and yet still failed to approve the clean build.&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%2Fprd630g4cl88jq6su4n5.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%2Fprd630g4cl88jq6su4n5.GIF" alt="Hard-set results: Gemini Pro 4/8, Gemini Flash 3/8, GPT-5.4 mini 0/8" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Outputs vary run to run.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first smoke test I ran picked up the defect related to the D1 corner collision; however, a resweep of the same model with the same build did not. When conducting benchmarking of auditors, a single run is insufficient — and if you are &lt;em&gt;using&lt;/em&gt; an LLM auditor, you must know that its answers are inconsistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The main point: models check themselves like anxious beginners.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flag every item, commit to nothing, and fail to identify the real bugs while refusing to mark the clear ones. This is precisely the kind of failure mode you should look for before letting an LLM be involved in any production prompt analysis—and it is the opposite of what the marketing claims these models are good at.&lt;/p&gt;

&lt;p&gt;The next things I would look at are having a judge-LLM review the borderline YELLOW findings to see whether a second model can prioritize those that the first one has flagged; examining the latency and cost associated with each model (since which auditor would you really hire on a per-dollar basis?); and carrying out more builds, some of which involve cases where the correct decision is actually ambiguous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where can we see it?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com/code/michaeltdemopoulos/can-llms-audit-multi-agent-prompts-bugle-crowns" rel="noopener noreferrer"&gt;The Benchmark Notebook&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  On X
&lt;/h2&gt;

&lt;p&gt;Pre:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2105692069050077395-329" src="https://platform.twitter.com/embed/Tweet.html?id=2105692069050077395"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2105692069050077395-329');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2105692069050077395&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Post:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2106153217344110921-15" src="https://platform.twitter.com/embed/Tweet.html?id=2106153217344110921"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2106153217344110921-15');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2106153217344110921&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>QueerCade (Part 2): Vibe-Code Something Strange — an Arcade of Queer Games on Sanity</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Tue, 29 Sep 2026 01:40:07 +0000</pubDate>
      <link>https://dev.to/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c</link>
      <guid>https://dev.to/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;QueerCade is a retro 8-bit pixel-art game database containing LGBTQ+ video games, constructed using TanStack Start, React 19, and the NES.css design system; it includes curated collections such as cozy queer games, visual novels, and dating sims, allows users to keep track of their personal library, and offers two enjoyable methods of exploring queer game history.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The &lt;a href="https://queercade.mikedemo.dev/constellation" rel="noopener noreferrer"&gt;Queer Character Constellation&lt;/a&gt; is an interactive stellar display that plots more than 870 carefully selected LGBTQ+ characters as stars. Users are able to pan around, zoom in and out, and switch between different layers of constellations which link characters from various franchises and periods based on common identity aspects (such as lesbian, gay, bisexual, trans, non-binary, and asexual), the decades in which they were released (ranging from the early 1980s pioneers to contemporary independent games), and narrative stereotypes. When any star is clicked on, information about the individual appears, together with portraits of the cast, the sources, and a direct link to the game itself in the arcade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a href="https://queercade.mikedemo.dev/emoji" rel="noopener noreferrer"&gt;Emoji Game Oracle&lt;/a&gt; lets you select 3 to 5 emojis covering mood, vibe, setting, and playstyle, after which an AI agent picks one custom match from the arcade and provides an in-character, retro-style explanation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Live at &lt;a href="https://queercade.mikedemo.dev" rel="noopener noreferrer"&gt;QueerCade live site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sanity isn't a sidecar; it is the whole content backend, since all screens, filters, searches, and graphs obtain their data from Sanity through GROQ and there is no other content database.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Sanity powers the app
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Controls for the studio field and human-in-the-loop curation. Queer history in gaming is complex, controversial, and generally not recorded in mainstream gaming databases. To ensure that the curation process was thorough, we set up custom controls for the studio field:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status gates: An editorial status radio control (which goes through the stages of imported → under review → approved → featured) makes sure that raw automated syncs are never made available to the public app or agent tools until they have been checked.
Editors create structured character arrays by providing dedicated input fields for the verified names of the characters, for the source citations (sourceUrl), and for the controlled tag selectors relating to identityTags and narrativeTropes (for example, coming-out-arc, found-family, playable-protagonist*).&lt;/li&gt;
&lt;li&gt;Editorial isolation means that fields such as editorNotes, sources, and character arrays are kept out of reach of the automated sync engine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead, we use a pipeline, not a spreadsheet. The games come in from the IGDB API, are normalized, and are then written to Sanity via a server-side client (the token is stored in the cloud secrets and is never kept in the browser). Each time a sync runs, an importRecord document is logged—this keeps a record of what was created, updated, refreshed, and skipped. Strict enforcement of field ownership lets the IGDB machine metadata (such as ratings, covers, and release dates) refresh cleanly without overwriting human editorial entries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With a planned approach and no unnecessary client-side bloat, all GROQ queries are located in the file src/lib/sanity/queries.ts. The constellation is able to fetch more than 800 curated character records that are embedded within games through a single projection, joining in the game metadata, the release years, the normalized identities, and the IGDB cast portraits to form a deterministic force-directed graph with no redundant client calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Image optimization runs in real time; the book covers and character portraits pass through &lt;a class="mentioned-user" href="https://dev.to/sanity"&gt;@sanity&lt;/a&gt;/image-url with responsive sizing and retro borders — no separate asset pipeline needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The strange part
&lt;/h2&gt;

&lt;p&gt;In most content management systems, character data is treated as a series of static items placed at the end of an article. About 'Vibe-Code Something Strange', I asked what might happen if an editorial CMS acted as the physics engine for a retro space map.&lt;/p&gt;

&lt;p&gt;The nested document model used by Sanity regards character identities, tropes, and release years as dimensional metadata. Since the Studio field constraints confirm that identity tokens are clean and relationships are verified, an HTML5 Canvas can read the array directly from GROQ, turn the characters into nodes in a seeded d3-force simulation, and link the stars across the decades using sparse ring algorithms. Thus, a character from a 1993 point-and-click adventure can connect to the protagonist of a 2024 indie RPG through a common identity tag authored in Sanity Studio.&lt;/p&gt;

&lt;p&gt;Together with the Path One Sanity MCP agent (the Emoji Oracle), the same Sanity dataset powers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A retro pixel-art storefront&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An AI agent queryable through MCP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An interactive celestial graph visualization&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One content lake offers three entirely different interactive experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  By the numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;746 games, 930 companies, 79 platforms, 22 genres&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;874 interactive character stars plotted across decades in the Constellation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4 curated collections, all human-assembled in Sanity Studio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1,754 tracked import operations with full change-history audit trails&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0 content databases besides Sanity&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Live Site: &lt;a href="https://queercade.mikedemo.dev" rel="noopener noreferrer"&gt;QueerCade live site&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Queer Character Constellation: &lt;a href="https://queercade.mikedemo.dev/constellation" rel="noopener noreferrer"&gt;Queer Character Constellation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emoji Game Oracle: &lt;a href="https://queercade.mikedemo.dev/emoji" rel="noopener noreferrer"&gt;Emoji Game Oracle&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code: &lt;a href="https://github.com/Mike-Demo/queer-game-vault" rel="noopener noreferrer"&gt;Queer Game Vault on GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/mpmike/queercade-2997"&gt;Path One (the agent)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sanity Project Details: Project ID: tzh8tziu&lt;/strong&gt;&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://queercade.mikedemo.dev/constellation" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqueercade.mikedemo.dev%2Fog-image.png" height="427" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://queercade.mikedemo.dev/constellation" rel="noopener noreferrer" class="c-link"&gt;
            Queer Character Constellation — QueerCade
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Explore LGBTQ+ video game characters as stars connected by identity, release era, and verified narrative tropes.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqueercade.mikedemo.dev%2Ffavicon.png" width="64" height="64"&gt;
          queercade.mikedemo.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/j_MMo2qaukI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/B8mKqX_jpf4" width="710" height="399"&gt;
  &lt;/iframe&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I tried to use the knowledge base, but it had a limit on the number of documents. I contacted Sanity support and Discord support, and unfortunately, using the knowledge base MCP wasn't possible, which is why I connected to the standard dataset MCP instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  On Instagram
&lt;/h2&gt;


&lt;div class="instagram-position"&gt;
  &lt;blockquote class="instagram-media"&gt;
    &lt;div&gt;
      &lt;a href="https://www.instagram.com/reel/Dd7NixUAgyM/" rel="noopener noreferrer"&gt;
        View this post on Instagram
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/blockquote&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  On X
&lt;/h2&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2105720470653804830-353" src="https://platform.twitter.com/embed/Tweet.html?id=2105720470653804830"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2105720470653804830-353');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2105720470653804830&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspired by
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://x.com/gaymingmag" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fprofile_images%2F2086392458733146112%2FSMAlOhUg_200x200.jpg" height="200" class="m-0" width="200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://x.com/gaymingmag" rel="noopener noreferrer" class="c-link"&gt;
            Gayming Magazine (@gaymingmag) / X
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            The home of queer geek culture 🏳️‍⚧️🏳️‍🌈🎮🕹️

Using this platform to celebrate LGBTQ+ excellence in an act of rebellion against its owner. 💪
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fx.com%2Ffavicon.ico" width="32" height="32"&gt;
          x.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  AI Disclosure
&lt;/h2&gt;

&lt;p&gt;AI assistance for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Superhuman GO for MCP agent testing&lt;/li&gt;
&lt;li&gt;Microsoft Copilot for idea planning&lt;/li&gt;
&lt;li&gt;GitHub Copilot and Lovable for code&lt;/li&gt;
&lt;li&gt;Grammarly for editing review, with human edits&lt;/li&gt;
&lt;li&gt;Balsamiq AI for wireframe layouts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>QueerCade (Part 1): Ship an Agent That Queries Real Content</title>
      <dc:creator>Mike “Demo” Demopoulos</dc:creator>
      <pubDate>Mon, 21 Sep 2026 19:59:38 +0000</pubDate>
      <link>https://dev.to/mpmike/queercade-2997</link>
      <guid>https://dev.to/mpmike/queercade-2997</guid>
      <description>&lt;h2&gt;
  
  
  QueerCade (Part 1): Ship an Agent That Queries Real Content
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path One: Ship an Agent That Queries Real Content&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;QueerCade is an arcade featuring LGBTQ+ video games — titles that have&lt;br&gt;
been carefully selected on the basis of their queer characters, stories,&lt;br&gt;
themes, and creators. For Path One I created the &lt;strong&gt;QueerCade Discovery&lt;br&gt;
Guide, which is an AI agent designed to assist people in finding&lt;/strong&gt;&lt;br&gt;
games, characters, developers, studios, and aspects of queer gaming&lt;br&gt;
history, and it only responds based on the current Sanity dataset. It&lt;br&gt;
never makes up a game, a developer, a character, or a fact; if something&lt;br&gt;
is not in the dataset it states this and instead provides the nearest&lt;br&gt;
actual alternative.&lt;/p&gt;
&lt;h2&gt;
  
  
  The dataset
&lt;/h2&gt;

&lt;p&gt;One Sanity project (tzh8tziu, production dataset) holds the entire&lt;br&gt;
corpus:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Content type&lt;/th&gt;
&lt;th&gt;Documents&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;game&lt;/td&gt;
&lt;td&gt;746&lt;/td&gt;
&lt;td&gt;Titles, IGDB metadata, editorial status, relationships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;company&lt;/td&gt;
&lt;td&gt;930&lt;/td&gt;
&lt;td&gt;Developers, publishers, involved companies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;platform&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;Consoles, PC, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;genre&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;Taxonomy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gameCollection&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Curated lists (cozy games, visual novels, …)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;importRecord&lt;/td&gt;
&lt;td&gt;1,754&lt;/td&gt;
&lt;td&gt;Every pipeline operation, tracked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;contentPage / siteSettings&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Editorial pages, global config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three thousand and five hundred documents&lt;/strong&gt;, linked together by&lt;br&gt;
references: game.developer refers to the company, game.genres[] refers&lt;br&gt;
to the genre, game.platforms[] refers to the platform, and&lt;br&gt;
gameCollection.games[] refers to the game. The agent does not carry&lt;br&gt;
out keyword searches; instead, it navigates this graph.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the agent connects
&lt;/h2&gt;

&lt;p&gt;Hitting the wall is something everyone encounters: the Sanity Knowledge&lt;br&gt;
Base has a limit of 150 documents, and this collection has over 3,500.&lt;br&gt;
Therefore, I completely bypassed the Knowledge Base and went &lt;strong&gt;straight to the Sanity Context MCP endpoint&lt;/strong&gt;, enclosing it in a custom&lt;br&gt;
Superhuman GO pack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP server:&lt;/strong&gt; &lt;a href="https://api.sanity.io/v1/context/organizations/ooowekfml/mcp/queercade-mcp" rel="noopener noreferrer"&gt;Sanity Context MCP endpoint&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The pack makes the endpoint available to the agent through a chat&lt;br&gt;
skill that gives strict instructions: use initial_context to discover&lt;br&gt;
the schema, schema_explorer to get the details about the fields,&lt;br&gt;
groq_query to retrieve the documents — and always base your answers&lt;br&gt;
&lt;strong&gt;on what the tools have returned, not on the training data&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent serves as a comprehensive discovery guide: it first asks for your name and pronouns, then learns about the platforms you use and your preferences before creating a series of recommendations across the network—from games to developers to related games, then to characters, and finally to your history.&lt;/p&gt;
&lt;h2&gt;
  
  
  The agent in action
&lt;/h2&gt;

&lt;p&gt;What follows is an actual session: after the user names two games they&lt;br&gt;
loved, watch what happens.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; I loved &lt;em&gt;We Are OFK&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&amp;gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QueerCade:&lt;/strong&gt; That helps a lot, Demo! Your best next game is&lt;br&gt;
&lt;strong&gt;Goodbye Volcano High&lt;/strong&gt; — like &lt;em&gt;We Are OFK&lt;/em&gt;, it follows young&lt;br&gt;
musicians navigating romance, friendship, and creative ambition. The&lt;br&gt;
protagonist, Fang, uses they/them pronouns.&lt;br&gt;&lt;br&gt;
&amp;gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; Also played and loved that.&lt;br&gt;&lt;br&gt;
&amp;gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;QueerCade:&lt;/strong&gt; You've already played the two closest matches —&lt;br&gt;
excellent taste. 🌈 My pick for you: &lt;strong&gt;Afterlove EP&lt;/strong&gt;. You play Rama,&lt;br&gt;
a young musician in modern Jakarta navigating grief and relationships&lt;br&gt;
— your choices branch the story. Or &lt;strong&gt;Stray Gods&lt;/strong&gt;, where your choices&lt;br&gt;
literally shape the musical numbers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no result from a keyword search like that. The agent traced the&lt;br&gt;
lineage from &lt;strong&gt;representation through theme to developer and then to&lt;br&gt;
character identity&lt;/strong&gt; across the relevant documents. After exhausting the&lt;br&gt;
two most similar entries, it moved along a different branch of the graph&lt;br&gt;
rather than repeating the same process. In a previous part of the same&lt;br&gt;
session, it also knew when &lt;em&gt;not&lt;/em&gt; to overstate: when asked about a&lt;br&gt;
blockbuster's queer representation, it noted that the dataset did not&lt;br&gt;
specify it instead of making up information.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this only works because the content is structured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The recommendations do not focus on text similarity but instead follow&lt;br&gt;
references (for example, the developer of a game → the other games&lt;br&gt;
from that studio → the characters in those games).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agent gives a reason for each selection—shared developers, shared&lt;br&gt;
themes, and shared representation—since it treats these relationships&lt;br&gt;
as first-class data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The editorial status (imported → under Review → approved → featured)&lt;br&gt;
indicates that the agent will always recommend only those games which&lt;br&gt;
humans have curated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Agent: Superhuman GO pack → Sanity Context MCP endpoint (above)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The dataset is also used to power the Path Two app: &lt;a href="https://dev.to/mpmike/queercade-part-2-vibe-code-something-strange-an-arcade-of-queer-games-on-sanity-5c2c"&gt;Path 2: Something Strange&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://queercade.mikedemo.dev/emoji" rel="noopener noreferrer"&gt;Emoji Game Oracle&lt;/a&gt; (site discovery toy)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Code: &lt;a href="https://github.com/Mike-Demo/queer-game-vault" rel="noopener noreferrer"&gt;Queer Game Vault on GitHub&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Demo:
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://queercade.mikedemo.dev/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqueercade.mikedemo.dev%2Fog-image.png" height="427" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://queercade.mikedemo.dev/" rel="noopener noreferrer" class="c-link"&gt;
            QueerCade — a curated arcade of games
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Hand-picked games with LGBTQ+ characters and stories: featured picks, curated collections, and a library you can track.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqueercade.mikedemo.dev%2Ffavicon.png" width="64" height="64"&gt;
          queercade.mikedemo.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/B8mKqX_jpf4" width="710" height="399"&gt;
  &lt;/iframe&gt;


&lt;p&gt;&lt;strong&gt;Sanity Project Details: Project ID: tzh8tziu&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I tried to use the knowledge base, but it had a limit on the number of documents. I contacted Sanity support and Discord support, and unfortunately, using the knowledge base MCP wasn't possible, which is why I connected to the standard dataset MCP instead.&lt;/p&gt;

&lt;p&gt;GitHUb Gist Below:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  On Instagram
&lt;/h2&gt;


&lt;div class="instagram-position"&gt;
  &lt;blockquote class="instagram-media"&gt;
    &lt;div&gt;
      &lt;a href="https://www.instagram.com/reel/Dd9gqTvkc5A/" rel="noopener noreferrer"&gt;
        View this post on Instagram
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/blockquote&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  On X
&lt;/h2&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2105372152773943343-930" src="https://platform.twitter.com/embed/Tweet.html?id=2105372152773943343"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2105372152773943343-930');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2105372152773943343&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspired by
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://x.com/gaymingmag" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fprofile_images%2F2086392458733146112%2FSMAlOhUg_200x200.jpg" height="200" class="m-0" width="200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://x.com/gaymingmag" rel="noopener noreferrer" class="c-link"&gt;
            Gayming Magazine (@gaymingmag) / X
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            The home of queer geek culture 🏳️‍⚧️🏳️‍🌈🎮🕹️

Using this platform to celebrate LGBTQ+ excellence in an act of rebellion against its owner. 💪
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fx.com%2Ffavicon.ico" width="32" height="32"&gt;
          x.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  AI Disclosure
&lt;/h2&gt;

&lt;p&gt;AI assistance for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Superhuman GO for MCP agent testing&lt;/li&gt;
&lt;li&gt;Microsoft Copilot for idea planning&lt;/li&gt;
&lt;li&gt;GitHub Copilot and Lovable for code&lt;/li&gt;
&lt;li&gt;Grammarly for editing review, with human edits&lt;/li&gt;
&lt;li&gt;Balsamiq AI for wireframe layouts&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
