<?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: Pratyay Banerjee</title>
    <description>The latest articles on DEV Community by Pratyay Banerjee (@neilblaze).</description>
    <link>https://dev.to/neilblaze</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F242559%2F25f55e4b-bea3-47c6-a261-e0a2d8a786c2.jpg</url>
      <title>DEV Community: Pratyay Banerjee</title>
      <link>https://dev.to/neilblaze</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neilblaze"/>
    <language>en</language>
    <item>
      <title>Kaizen — 𝘓𝘦𝘵 𝘺𝘰𝘶𝘳 𝘧𝘰𝘤𝘶𝘴 𝘧𝘰𝘭𝘭𝘰𝘸 𝘺𝘰𝘶! 🎯</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Wed, 04 Mar 2026 07:15:11 +0000</pubDate>
      <link>https://dev.to/neilblaze/kaizen-let-your-focus-follow-you-pi0</link>
      <guid>https://dev.to/neilblaze/kaizen-let-your-focus-follow-you-pi0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; &lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/gemini"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Presenting Kaizen 🦄
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kaizen&lt;/strong&gt; is a multi-agent Chromium extension that quietly tracks where your attention actually settles while you browse. It doesn’t block anything or try to push productivity. Instead, it helps you notice when your mind has drifted and guides you back to the thread you were following. Our brains are wired to conserve energy, so the moment we pause to ponder, we begin to wander. This is why long browsing sessions often feel scattered. Kaizen steps in at that exact point, especially for people who experience &lt;em&gt;attention drift or ADHD-like patterns&lt;/em&gt;, helping the web feel connected again rather than fragmented.ㅤ&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Try it out here&lt;/strong&gt;: &lt;a href="https://kaizen.apps.sandipan.dev" rel="noopener noreferrer"&gt;https://kaizen.apps.sandipan.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Demo ▶️
&lt;/h3&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The name "&lt;strong&gt;Kaizen&lt;/strong&gt;" comes from the Japanese concept of continuous improvement (改善). Small, steady gains. That's the whole philosophy — not perfection, just awareness.&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;p&gt;If you write code or study on the web, you’ve likely lived this moment — a tab for documentation leads to a blog post, then a video, then a forum thread, and somewhere between the scrolls, the thread of your original question frays. Minutes later, you know you saw something useful, but you can’t quite recall where, or what 😭&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Distraction is the modern poverty. Focus is the new wealth.” — James Clear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkboyba9u3zr0fehnf5nw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkboyba9u3zr0fehnf5nw.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The truth is, the internet has made information abundant, but our ability to retain and build on that knowledge hasn't kept pace. The truth is, our brains are wired to conserve energy, so the moment we pause to ponder, we begin to wander. This is why long browsing sessions often feel scattered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I suffer from ADHD. My co-builder &lt;a class="mentioned-user" href="https://dev.to/sandipndev"&gt;@sandipndev&lt;/a&gt; does too. We've both tried the usual focus apps, especially the ones that block websites or guilt-trip you with timers. They made us feel worse, not better.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, around New Year's, we decided that our resolution for 2026 would be to actually &lt;em&gt;fix&lt;/em&gt; this problem, but &lt;strong&gt;not&lt;/strong&gt; with another blocker or pomodoro clone, but &lt;em&gt;with something that genuinely understands how attention works&lt;/em&gt;! That motivation landed us at the &lt;a href="https://www.encodeclub.com/programmes/comet-resolution-v2-hackathon" rel="noopener noreferrer"&gt;Commit To Change: An AI Agents Hackathon 2026&lt;/a&gt; hosted by Encode Club, and that's where &lt;a href="https://kaizen.apps.sandipan.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Kaizen&lt;/strong&gt;&lt;/a&gt; was born.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmutsxl7fvroo7bcvgdi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmutsxl7fvroo7bcvgdi.png" alt="Kaizen_logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We asked ourselves: what if we could utilize AI smartly to understand where your attention actually settles, be it the content you read, the figure you saw, or the video you watched, and turn those moments into a private learning loop? We wanted to turn scattered web browsing into genuine learning, and that too without blocking sites or nagging you to focus, but by understanding what you're actually paying attention to and helping you build on it. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowvmsdg7c9ummfiu9e8r.gif" alt="kaizen-landing.gif"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo75sqsse7l4u9g3n26y.gif" alt="kaizen-glimpse.gif"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Built on Google &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-flash-lite/" rel="noopener noreferrer"&gt;gemini-3.1-flash&lt;/a&gt;, Kaizen supercharges your browser activity while keeping your data private. It notices, gently reflects, and helps you remember, the kind of help that keeps users rooted in the activity because progress is felt, not forced!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Codebase / App Repository 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kaizen&lt;/strong&gt; 👉 &lt;a href="https://github.com/anikvox/kaizen" rel="noopener noreferrer"&gt;github.com/anikvox/kaizen&lt;/a&gt; [Open Source]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live App&lt;/strong&gt; 👉 &lt;a href="https://kaizen.apps.sandipan.dev" rel="noopener noreferrer"&gt;kaizen.apps.sandipan.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/anikvox" rel="noopener noreferrer"&gt;
        anikvox
      &lt;/a&gt; / &lt;a href="https://github.com/anikvox/kaizen" rel="noopener noreferrer"&gt;
        kaizen
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      overcome adhd
    &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;Kaizen&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://kaizen.apps.sandipan.dev" rel="nofollow noopener noreferrer"&gt;kaizen.apps.sandipan.dev&lt;/a&gt;&lt;/strong&gt; · Focus that Follows You&lt;/p&gt;
&lt;p&gt;A privacy-first browser extension that tracks where your attention actually goes and gently helps you stay on track — without blocking content or enforcing rigid workflows.&lt;/p&gt;
&lt;p&gt;Built by CS students with ADHD who wanted a tool that understands attention patterns, not one that locks you out.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/anikvox/kaizen/apps/web/public/screenshots/extension-sidepanel.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fanikvox%2Fkaizen%2Fapps%2Fweb%2Fpublic%2Fscreenshots%2Fextension-sidepanel.png" alt="Extension Side Panel" width="280"&gt;&lt;/a&gt;
    
  &lt;a rel="noopener noreferrer" href="https://github.com/anikvox/kaizen/apps/web/public/screenshots/focus-nudge.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fanikvox%2Fkaizen%2Fapps%2Fweb%2Fpublic%2Fscreenshots%2Ffocus-nudge.png" alt="Focus Guardian Nudge" width="400"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;em&gt;Left: Extension side panel with focus tracking and growing tree. Right: Gentle nudge when you drift.&lt;/em&gt;
&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive Attention Tracking&lt;/strong&gt; — Knows what you're reading, watching, and listening to — not just which tabs are open&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus Guardian Agent&lt;/strong&gt; — Detects doomscrolling and distraction patterns, sends supportive nudges instead of blocking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Chat with Memory&lt;/strong&gt; — Ask "What was I reading about today?" and get context-aware answers from your browsing history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-Generated Quizzes&lt;/strong&gt; — Turn passive reading into active recall with knowledge verification quizzes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insights &amp;amp; Achievements&lt;/strong&gt; — Track streaks, milestones, and focus patterns over time&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/anikvox/kaizen" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h0814uhtrh5sl8t8blj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h0814uhtrh5sl8t8blj.png" alt="techy_blank_space"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does 🤔
&lt;/h2&gt;

&lt;p&gt;Kaizen acts as your AI co-pilot for focused learning on the web. It runs silently in the background, tracking what you actually pay attention to, including what you read, watch, and explore, and utilizes Google Gemini &amp;amp; Opik to help you stay focused, remember what matters, and test your understanding. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sjuc2lnwq3a5brgubt2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sjuc2lnwq3a5brgubt2.gif" alt="kaizen-demo.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you browse, &lt;em&gt;&lt;strong&gt;Kaizenm gradually turns your native attention into learning&lt;/strong&gt;&lt;/em&gt;. When your focus slips, it offers gentle nudges to bring you back. When you finish reading or watching something, it surfaces quick recall prompts to reinforce what you just absorbed. It occasionally slips in short, well-timed quizzes to check your understanding while the idea is still fresh. And when you want to go deeper, its context-aware chat remembers where you’ve been, helping you connect ideas and build knowledge over time.&lt;/p&gt;

&lt;p&gt;Kaizen is supercharged with a plethora of awesome features, &lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;Cognitive Attention Tracking&lt;/strong&gt; — tracks where your mind actually settles across text, images, audio &amp;amp; YouTube&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Multi-Agent AI System&lt;/strong&gt; — four coordinated agents (Focus Guardian, Chat, Focus Clustering, Mental Health) powered by Gemini&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Agentic Co-Pilot Chat&lt;/strong&gt; — tool-calling assistant that synthesizes your reading sessions with context-aware insights&lt;/li&gt;
&lt;li&gt;🌊 &lt;strong&gt;Supportive Pulse Nudges&lt;/strong&gt; — gentle reminders when you drift, never blocking — with self-calibrating sensitivity&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Knowledge Quizzes&lt;/strong&gt; — auto-generated verification quizzes from your actual browsing content&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Cognitive Analytics Dashboard&lt;/strong&gt; — attention entropy, browsing fragmentation, late-night patterns over 7–90 day windows&lt;/li&gt;
&lt;li&gt;🌱 &lt;strong&gt;Growing Plant Gamification&lt;/strong&gt; — a virtual plant that grows with your focus time&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Privacy-First Engine&lt;/strong&gt; — PII anonymization, encrypted API keys (AES-256-GCM), GDPR-compliant with full data export/deletion&lt;/li&gt;
&lt;li&gt;🔭 &lt;strong&gt;Full Opik Observability&lt;/strong&gt; — every LLM call, tool invocation, and agent decision traced end-to-end&lt;/li&gt;
&lt;/ul&gt;


&lt;/blockquote&gt;

&lt;p&gt;Also, for more transparency, we also present a comparative analysis of available solutions,&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Traditional Approach&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Kaizen Approach&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Blocks websites entirely&lt;/td&gt;
      &lt;td&gt;🟢 Supportive pulse nudges — zero blocking&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Binary "focused" / "distracted" state&lt;/td&gt;
      &lt;td&gt;🟢 Granular cognitive attention sensing&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Punishes distraction&lt;/td&gt;
      &lt;td&gt;🟢 Understands attention patterns and gently guides&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 No understanding of what you're learning&lt;/td&gt;
      &lt;td&gt;🟢 Tracks reading, images, audio, video — builds context&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Cloud-locked data silos&lt;/td&gt;
      &lt;td&gt;🟢 Privacy-first, PII-anonymized AI&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We wanted something that &lt;em&gt;understands&lt;/em&gt; where your attention actually goes and gently helps you stay on track — without locking you out of anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How Gemini powers the system ⚡
&lt;/h2&gt;

&lt;p&gt;"We used Gemini" tells you nothing. So let me be specific about how deeply it's woven into every layer of Kaizen.&lt;/p&gt;

&lt;p&gt;Gemini is the &lt;strong&gt;system default provider&lt;/strong&gt; throughout Kaizen, integrated via the &lt;a href="https://sdk.vercel.ai/" rel="noopener noreferrer"&gt;Vercel AI SDK&lt;/a&gt; (&lt;code&gt;@ai-sdk/google&lt;/code&gt; v3.0.22) alongside the direct Google SDK (&lt;code&gt;@google/genai&lt;/code&gt; v1.40.0). Every agent, every summarization call, every quiz — &lt;strong&gt;Gemini handles it&lt;/strong&gt; unless the user explicitly switches to another provider (Anthropic Claude or OpenAI GPT-4 are available as alternatives).&lt;/p&gt;

&lt;p&gt;Here's the core provider resolution logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// service.ts — LLM Provider Resolution&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LLMService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getProvider&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;LLMProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Check user's custom provider + encrypted API key&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;llmProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tryCreateUserProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// 2. Fall back to system Gemini&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSystemProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// → gemini-2.5-flash-lite&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// models.ts — System Defaults&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SYSTEM_DEFAULT_PROVIDER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LLMProviderType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SYSTEM_DEFAULT_MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-2.5-flash-lite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the &lt;code&gt;GeminiProvider&lt;/code&gt; class wraps the Vercel AI SDK with full tool-calling, multimodal content (text + base64 images), and streaming support:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// providers/gemini.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GeminiProvider&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;LLMProvider&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;providerType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LLMProviderConfig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;google&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createGoogleGenerativeAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LLMGenerateOptions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;LLMResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateText&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;google&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;experimental_telemetry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;getTelemetrySettings&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`gemini-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="c1"&gt;// Extract toolCalls and toolResults from response...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LLMStreamOptions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;streamText&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;google&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textStream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;callbacks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fullContent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  The four agents 🤖
&lt;/h3&gt;

&lt;p&gt;Kaizen isn't an usual GPT wrapper with a focus timer bolted on. It's a coordinated multi-agent system where each agent has a specific job, its own set of tools, and its own Gemini-powered decision loop.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;How Gemini is used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🛡️ &lt;strong&gt;Focus Guardian&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Monitors your browsing every 60 seconds. Detects doomscrolling, distraction, and focus drift. Sends nudges when confidence is high enough.&lt;/td&gt;
&lt;td&gt;Gemini analyzes 15 minutes of activity context (domain switches, dwell times, social media ratio) and returns a structured JSON decision at &lt;code&gt;temperature: 0.1&lt;/code&gt; for consistency.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Chat Agent&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Conversational AI with tool-calling. You can ask "what was I reading about today?" and it queries your actual attention data.&lt;/td&gt;
&lt;td&gt;Gemini streams responses via &lt;code&gt;streamText()&lt;/code&gt; with up to &lt;strong&gt;5 agentic steps&lt;/strong&gt;. It autonomously selects from 11 tools to ground answers in real data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎯 &lt;strong&gt;Focus Agent&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Clusters your attention into focus sessions. Figures out what topics you're working on and tracks evolution.&lt;/td&gt;
&lt;td&gt;Gemini runs an agentic loop (up to &lt;strong&gt;10 iterations&lt;/strong&gt;) calling tools like &lt;code&gt;create_focus&lt;/code&gt;, &lt;code&gt;merge_focuses&lt;/code&gt;, &lt;code&gt;update_focus&lt;/code&gt; to organize attention data into coherent sessions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧘 &lt;strong&gt;Mental Health Agent&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Generates cognitive wellness reports — fragmentation, sleep patterns, media balance, quiz retention.&lt;/td&gt;
&lt;td&gt;Gemini runs another agentic loop with specialized tools (&lt;code&gt;analyze_sleep_patterns&lt;/code&gt;, &lt;code&gt;analyze_focus_quality&lt;/code&gt;, &lt;code&gt;analyze_media_balance&lt;/code&gt;, &lt;code&gt;think_aloud&lt;/code&gt;) and produces a full report in supportive, non-clinical language.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ◉ Temperature tuning across tasks 🌡️
&lt;/h3&gt;

&lt;p&gt;Different tasks need different levels of creativity. We tuned Gemini's temperature for each use case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config.ts — LLM Configuration Presets&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LLM_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;   &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Should we nudge? Yes/no.&lt;/span&gt;
  &lt;span class="na"&gt;summarization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Factual, deterministic&lt;/span&gt;
  &lt;span class="na"&gt;focusAnalysis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;   &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Concise clustering&lt;/span&gt;
  &lt;span class="na"&gt;imageDescription&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Vision captions&lt;/span&gt;
  &lt;span class="na"&gt;titleGeneration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Creative but short&lt;/span&gt;
  &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;           &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// Chat — balanced&lt;/span&gt;
  &lt;span class="na"&gt;quizGeneration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// We *want* variety!&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At &lt;code&gt;0.1&lt;/code&gt;, Gemini is disciplined — it gives consistent nudge decisions. At &lt;code&gt;0.9&lt;/code&gt;, it generates creative quiz question phrasing without going off the rails. That predictability across the temperature range was one of the reasons we kept Gemini as the default over other providers.&lt;/p&gt;

&lt;h3&gt;
  
  
  ◉ Tool-calling in practice 🔧
&lt;/h3&gt;

&lt;p&gt;The Chat Agent's tool-calling is where Gemini's structured output really shines. When you ask "what have I been focusing on?", here's what actually happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User message arrives
  → Gemini evaluates available tools
  → Selects: get_active_focus
  → Tool executes Prisma query against PostgreSQL
  → Results returned to Gemini
  → Gemini composes a response grounded in your data
  → Response streamed back via SSE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 11 tools available to the Chat Agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_attention_data&lt;/code&gt; — recent text/image/audio/YouTube attention&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_active_website&lt;/code&gt; — what tab you're on right now&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_active_focus&lt;/code&gt; — your current focus topics&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_browsing_history&lt;/code&gt; — search past activity&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_reading_activity&lt;/code&gt; — reading session data&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_youtube_history&lt;/code&gt; — YouTube watch history&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_focus_history&lt;/code&gt; — past focus sessions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_current_time&lt;/code&gt; — current time in user's timezone&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_current_weather&lt;/code&gt; — weather at user's location&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set_user_location&lt;/code&gt; — remember location (geocoding via OpenMeteo)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set_translation_language&lt;/code&gt; — language preferences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemini picks which tools to call, interprets the results, and sometimes chains multiple tool calls in a single turn. We capped it at 5 steps per message to prevent runaway loops. Here's the actual execution from &lt;code&gt;agent.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// chat/agent.ts — Agentic Chat Execution&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;streamText&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modelId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Fetched from Opik prompt library&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;coreMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Supports multimodal (text + images)&lt;/span&gt;
  &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxSteps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;onStepFinish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create Opik span for each tool call&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolCalls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolSpan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;span&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`tool:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toolCall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="nx"&gt;toolSpan&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tool output */&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We tested Gemini, Claude, and GPT-4 for this pipeline. Gemini's tool selection was the most reliable for our use case — it rarely picked the wrong tool or returned malformed tool calls across 11 different tool schemas. That's why it became the default.&lt;/p&gt;

&lt;h3&gt;
  
  
  ◉ Multimodal attention — Gemini Vision 👁️
&lt;/h3&gt;

&lt;p&gt;When you linger on an image while browsing, the extension tracks your hover duration and confidence score. If you're actually paying attention, Kaizen sends the image as base64-encoded data directly to Gemini for caption generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// providers/gemini.ts — Multimodal content formatting&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;formatUserContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LLMMessageContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`data:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;base64,&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the Chat Agent can later tell you &lt;em&gt;"you were looking at a diagram of TCP handshakes"&lt;/em&gt; instead of just &lt;em&gt;"you visited a networking article."&lt;/em&gt; The image summaries + text summaries together form Kaizen's memory layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  ◉ Quiz generation from real attention 📝
&lt;/h3&gt;

&lt;p&gt;When you hit "Generate Quiz," a &lt;code&gt;pg-boss&lt;/code&gt; background job fires. The Quiz Agent pulls your recent attention data, feeds it to Gemini at &lt;code&gt;temperature: 0.9&lt;/code&gt;, and generates 10 multiple-choice questions based on what you've been reading. A content hash prevents duplicate questions across sessions. The quiz stays valid for 24 hours.&lt;/p&gt;

&lt;p&gt;This is probably the feature I'm most proud of. Passive reading becomes active recall, and you didn't have to do anything extra. You just browsed normally, and now there's a quiz waiting for you. 🎯&lt;/p&gt;

&lt;h3&gt;
  
  
  ◉ Focus Guardian — the self-learning nudge engine 🛡️
&lt;/h3&gt;

&lt;p&gt;The Focus Guardian runs autonomously, analyzing your last 15 minutes of activity. Here's what actually happens in the decision loop (from &lt;code&gt;focus-agent.ts&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// agent/focus-agent.ts — Focus Guardian Decision&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;promptData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;

RECENT ACTIVITY (last 15 minutes):
- Domains visited: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recentDomains&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
- Number of different sites: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;domainSwitchCount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
- Average time per page: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;averageDwellTime&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;s
- Social media/entertainment time: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;socialMediaTime&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;s
- Reading time (estimated): &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readingTime&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;s
- Has active focus: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasActiveFocus&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`Yes (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focusTopics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;)`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;

USER FEEDBACK HISTORY:
- False positive rate: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;falsePositiveRate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;%
- Acknowledged rate: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="nx"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;acknowledgedRate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;%
- Sensitivity setting: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sensitivity&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nudge types: &lt;code&gt;doomscroll&lt;/code&gt;, &lt;code&gt;distraction&lt;/code&gt;, &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;focus_drift&lt;/code&gt;, &lt;code&gt;encouragement&lt;/code&gt;, and &lt;code&gt;all_clear&lt;/code&gt;. There's a configurable cooldown between nudges so it never feels like nagging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system self-calibrates.&lt;/strong&gt; Every nudge records whether you acknowledged it, dismissed it, or marked it as a false positive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Sensitivity auto-adjustment from user feedback&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false_positive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;newSensitivity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newSensitivity&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// fewer nudges&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;acknowledged&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;newSensitivity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newSensitivity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// nudge was helpful&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over time, the agent learns &lt;em&gt;your&lt;/em&gt; patterns. If it keeps getting it wrong, it backs off. If it's on point, it stays the course.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack ⚙️
&lt;/h2&gt;

&lt;p&gt;Everything runs on a &lt;strong&gt;TypeScript monorepo&lt;/strong&gt; (pnpm workspaces):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kaizen/
├── apps/
│   ├── api/          # Hono backend — agents, data ingestion, SSE
│   ├── extension/    # Plasmo browser extension — attention sensors
│   └── web/          # Next.js dashboard — analytics, chat, settings
├── packages/
│   ├── api-client/   # Shared typed API client
│   └── ui/           # Shared component library
└── docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What we used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Node.js 22+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hono v4.6.14, Prisma ORM v6.2.1, PostgreSQL 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Job Queue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pg-boss v12 (single-concurrency, resource-aware)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Custom SSE (Server-Sent Events) for cross-device sync&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clerk v1.21.4 (web), device token handshake (extension)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google Gemini via Vercel AI SDK v6.0.77 (&lt;code&gt;@ai-sdk/google&lt;/code&gt; + &lt;code&gt;@google/genai&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Comet Opik v1.0.6 — tracing, prompt library, anonymizers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Plasmo, React, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Next.js 15, Tailwind CSS, Lucide Icons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AES-256-GCM for API key storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Attention sensors 📡
&lt;/h3&gt;

&lt;p&gt;The extension runs separate monitors for different content types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sensor&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What it tracks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📖 &lt;strong&gt;Text&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;monitor-text.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Paragraphs read, words processed, reading progress, sustained attention duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🖼️ &lt;strong&gt;Image&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;monitor-image.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hover duration, confidence score → triggers Gemini Vision for caption generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔊 &lt;strong&gt;Audio&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;monitor-audio.ts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Playback duration, active listening time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📺 &lt;strong&gt;YouTube&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;background scripts&lt;/td&gt;
&lt;td&gt;Watch time, captions ingestion, video context&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each sensor generates a &lt;strong&gt;confidence score (0–100)&lt;/strong&gt; based on hover duration, scroll velocity, and viewport position. A quick skim doesn't count as learning. Sustained attention does.&lt;/p&gt;




&lt;h3&gt;
  
  
  Database Schema 🗄️
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Core attention tracking
TextAttention    → text, wordsRead, confidence, timestamp
ImageAttention   → src, alt, hoverDuration, summary (AI-generated)
AudioAttention   → playbackDuration, activeTime
YoutubeAttention → captions, activeWatchTime

// Agentic features
Focus            → item, keywords[], isActive, lastActivityAt
AgentNudge       → type, message, confidence, reasoning, response
Pulse            → userId, message (short nudges)

// Quiz system
Quiz             → questions (JSON), contentHash (deduplication)
QuizAnswer       → selectedIndex, isCorrect
QuizResult       → totalQuestions, correctAnswers

// User settings (encrypted API keys)
UserSettings     → geminiApiKeyEncrypted, llmProvider, llmModel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-time SSE events 📡
&lt;/h3&gt;

&lt;p&gt;Custom Server-Sent Events sync state across browser extension + dashboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pomodoro-tick&lt;/code&gt; — Timer updates&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat-message-created/updated&lt;/code&gt; — Chat streaming&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;active-tab-changed&lt;/code&gt; — Tab context sync&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;focus-changed&lt;/code&gt; — Focus session state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;settings-updated&lt;/code&gt; — Cross-device settings sync&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pulses-updated&lt;/code&gt; — Nudge notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability with Opik 🔭
&lt;/h2&gt;

&lt;p&gt;We integrated &lt;a href="https://www.comet.com/site/products/opik/" rel="noopener noreferrer"&gt;Comet Opik&lt;/a&gt; for full observability across the entire agent system. This turned out to be one of the best decisions we made, as you can't evaluate what you can't see.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  What we instrumented
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🔗 Tracing&lt;/strong&gt; — Every LLM call, every tool invocation, every agent decision is traced end-to-end. Traces are grouped by thread ID so you can follow the full decision flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// telemetry.ts — Opik Trace Hierarchy&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;anonymizeInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kaizen&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;threadId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;threadId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Nested spans for each step&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;span&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool:get_attention_data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;anonymizeInput&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;toolCall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;processedOutput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;endTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting trace hierarchy looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trace: chat-agent
├── Span: streamText [type: llm]
│   ├── Span: tool:get_active_website [type: tool]
│   ├── Span: tool:get_attention_data [type: tool]
│   └── Span: tool:search_browsing_history [type: tool]
└── Span: followUp-streamText [type: llm]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📚 Prompt Library&lt;/strong&gt; — All 11 system prompts live in Opik under named entries, fetched fresh on every call with local fallbacks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// prompt-provider.ts — Opik-first, local fallback&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getPromptWithMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PromptName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isOpikPromptsEnabled&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opikPrompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPromptFromOpik&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;opikPrompt&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;opikPrompt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;opik&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="na"&gt;promptVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;opikPrompt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commit&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LOCAL_PROMPT_MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This let us iterate on prompts &lt;em&gt;without redeploying code&lt;/em&gt;. We'd see a bad nudge in a trace, tweak the prompt in Opik's dashboard, and the fix was live immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔒 Anonymizers&lt;/strong&gt; — Before anything gets logged to Opik, we strip PII using &lt;code&gt;@cdssnc/sanitize-pii&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// anonymizer.ts — PII Protection&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isSensitiveKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sensitivePatterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sr"&gt;/^userId$/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/password/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/secret/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sr"&gt;/token/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/api&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]?&lt;/span&gt;&lt;span class="sr"&gt;key/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/auth/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sr"&gt;/credential/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/private&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;_-&lt;/span&gt;&lt;span class="se"&gt;]?&lt;/span&gt;&lt;span class="sr"&gt;key/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sensitivePatterns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// User inputs → anonymized. LLM outputs → preserved for debugging.&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anonymizeInput&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;anonymizeData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anonymizeOutput&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* only redact sensitive keys */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🛡️ Guardrails&lt;/strong&gt; — Agents validate inputs before tool execution. The Focus Guardian only fires a nudge when confidence exceeds a dynamically adjusted threshold. The Chat Agent validates tool arguments before running Prisma queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Opik mattered 🎯
&lt;/h3&gt;

&lt;p&gt;Early on, the Focus Guardian was nudging people during legitimate deep dives. Someone would be reading a 30-minute technical article, and the agent would flag it as distraction because the domain switching pattern looked similar to aimless browsing.&lt;/p&gt;

&lt;p&gt;Without &lt;a href="https://www.comet.com/docs/opik/" rel="noopener noreferrer"&gt;&lt;strong&gt;Opik&lt;/strong&gt;&lt;/a&gt;, we'd have said "the AI is dumb" and guessed at fixes.&lt;/p&gt;

&lt;p&gt;With tracing, we could pull up the exact decision chain: here's the 15 minutes of context the agent saw, here's the domain switch count, here's the confidence score, here's the prompt, here's the output. The problem was obvious — the prompt didn't have a strong enough signal for sustained single-topic browsing. We tweaked the prompt in Opik, the fix deployed without a code change, and false positives dropped.&lt;/p&gt;

&lt;p&gt;That cycle — &lt;strong&gt;trace the failure → find the root cause → fix the prompt → verify in production&lt;/strong&gt; — happened dozens of times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What worked well ✅
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool-calling was reliable.&lt;/strong&gt; We tested Gemini, Claude, and GPT-4 for our agent pipelines, and Gemini's structured output parsing was the most consistent for our use case. The Chat Agent makes autonomous tool selections across 11 different tools, and Gemini rarely picked the wrong one or returned malformed tool calls. This is why it became our system default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The million-token context window was a real advantage.&lt;/strong&gt; Gemini &lt;code&gt;3.1-flash&lt;/code&gt; and &lt;code&gt;3.1-flash-lite&lt;/code&gt; both support &lt;strong&gt;1M token context windows&lt;/strong&gt;. For the Focus Agent's clustering loop, which sometimes processes hours of attention data across many topics, especially having that headroom meant we didn't have to aggressively truncate context. We could pass in a richer activity history and get better clustering decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temperature control behaved predictably.&lt;/strong&gt; From &lt;code&gt;0.1&lt;/code&gt; for binary decisions to &lt;code&gt;0.9&lt;/code&gt; for quiz generation, Gemini responded consistently. At &lt;code&gt;0.1&lt;/code&gt; it was disciplined; at &lt;code&gt;0.9&lt;/code&gt; it got creative without going off the rails. That predictability across the full range was a real win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal input worked out of the box.&lt;/strong&gt; We send base64-encoded images directly to Gemini for caption generation. The quality of image descriptions was good enough that the Chat Agent could later reference them meaningfully. No separate vision pipeline needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model fetcher dynamically discovers new models.&lt;/strong&gt; We use &lt;code&gt;@google/genai&lt;/code&gt; to fetch the live model list from the Gemini API (filtering for &lt;code&gt;generateContent&lt;/code&gt; support), with sorting priority baked in for the upcoming gemini-series family, so when new model lands, Kaizen will pick it up automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Research 📚
&lt;/h2&gt;

&lt;p&gt;We don’t remember things just because we saw them. We remember them when we bring them back to mind. A small, well-timed reminder can turn a passing moment online into something that actually sticks. And it works better when the reminder supports your intention rather than trying to control your behavior. When your browser can quietly keep track of the ideas you spent time on and surface them again when you need them, the pressure of “trying to hold everything in your head” eases up.&lt;/p&gt;

&lt;p&gt;This is especially supportive for people with &lt;a href="https://en.wikipedia.org/wiki/Attention_deficit_hyperactivity_disorder" rel="noopener noreferrer"&gt;&lt;em&gt;ADHD&lt;/em&gt;&lt;/a&gt;, where working memory and task switching can feel heavy, and for people who experience &lt;a href="http://en.wikipedia.org/wiki/Dementia" rel="noopener noreferrer"&gt;&lt;em&gt;early memory decline&lt;/em&gt;&lt;/a&gt;, where gentle spaced recall helps keep learning active. Kaizen helps keep the thread. Small nudges, quick check-ins, and context that stays with you, so you don’t have to start from scratch every time you return to a thought.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://news.umich.edu/distractibility-trait-linked-to-adhd/" rel="noopener noreferrer"&gt;Distractibility trait linked to ADHD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timesofindia.indiatimes.com/life-style/health-fitness/health-news/fighting-adhd-along-the-hustle-culture-how-can-employees-keep-their-mental-health-in-check/articleshow/105568659.cms" rel="noopener noreferrer"&gt;Fighting ADHD along the hustle culture: How can employees keep their mental health in check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC6198603/" rel="noopener noreferrer"&gt;Study of Internet addiction in children with attention-deficit hyperactivity disorder and normal control&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.childrenandscreens.org/learn-explore/research/adhd-youth-and-digital-media-use/" rel="noopener noreferrer"&gt;ADHD Youth and Digital Media Use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apa.org/news/podcasts/speaking-of-psychology/attention-spans" rel="noopener noreferrer"&gt;Attention Spans — Podcast (APA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.additudemag.com/tag-digital-distractions/" rel="noopener noreferrer"&gt;Digital Distractions (ADDitude Magazine – tag archive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.newyorker.com/magazine/2025/01/27/the-sirens-call-chris-hayes-book-review" rel="noopener noreferrer"&gt;What if the Attention Crisis Is All a Distraction? (The New Yorker)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.news24.com/life/wellness/mind/distraction-fatigue-vs-adhd-how-technology-is-reshaping-our-attention-spans-20250910-0534" rel="noopener noreferrer"&gt;Distraction fatigue vs ADHD: How technology is reshaping our attention spans&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.frontiersin.org/articles/10.3389/fpsyg.2019.02997/full" rel="noopener noreferrer"&gt;Retrieval practice helps strengthen memory by actively recalling information&lt;/a&gt; (FPSYG, 2019)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mavmatrix.uta.edu/cgi/viewcontent.cgi?article=1160&amp;amp;context=psychology_theses" rel="noopener noreferrer"&gt;Spaced retrieval improves retention by revisiting information over time&lt;/a&gt; (Mavmatrix, art. 1160)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.focusbear.io/blog-post/how-to-improve-memory-with-adhd-effective-techniques" rel="noopener noreferrer"&gt;Small external cues and short recall prompts support working memory in ADHD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6481376/" rel="noopener noreferrer"&gt;Gentle reminders and cueing tools help reduce memory load in dementia&lt;/a&gt; (NCBI, 2017)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sciencedirect.com/topics/social-sciences/memory-retrieval" rel="noopener noreferrer"&gt;Retrieval reactivates and stabilizes memory traces when spaced and repeated&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.alzheimers.org.uk/get-support/living-with-dementia/memory-aids-and-tools" rel="noopener noreferrer"&gt;Everyday memory aids help maintain independence and reduce strain in dementia&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kaizen keeps attention anchored to meaning, not effort! ✨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges we ran into 😤
&lt;/h2&gt;

&lt;p&gt;We did run into a few challenges along the way. Since we were working from different time zones, coordinating calls and staying in sync took some extra effort. Most of our collaboration happened asynchronously, which meant we had to be very clear about decisions and hand-offs.&lt;/p&gt;

&lt;p&gt;On the technical side, figuring out what “real attention” meant was something we had to refine multiple times. We experimented with how much weight to give scroll patterns, mouse movement, viewport position, and reading pace so that quick skims didn’t count as learning. Handling different types of content also took care, especially images and YouTube videos, since the context needed to stay meaningful, not noisy.&lt;/p&gt;

&lt;p&gt;Besides, some other challenges we faced aren't limited to,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-turn coherence degraded over long conversations.&lt;/strong&gt; After 10+ turns with interleaved tool calls, the Chat Agent would sometimes lose track of earlier context or repeat information. We partially fixed this by injecting a conversation summary into the system prompt, but it meant extra token usage. Not unique to Gemini, but noticeable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming with tool calls needed careful handling.&lt;/strong&gt; When Gemini decides mid-stream to call a tool, the handoff between text chunks and tool-call events required state management in our SSE layer. The Vercel AI SDK abstracted most of it, but edge cases (tool call at the very start, multiple rapid tool calls) needed explicit handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Occasional overconfidence in Focus Guardian decisions.&lt;/strong&gt; At &lt;code&gt;temperature: 0.1&lt;/code&gt;, when the Focus Guardian is wrong, it's &lt;em&gt;confidently&lt;/em&gt; wrong. A few times it classified focused research (lots of Stack Overflow tabs) as aimless browsing. The fix was better prompting + the feedback loop, not a model change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned 🙌
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Proper sleep is very important!&lt;/strong&gt; 😛&lt;/p&gt;

&lt;p&gt;Well, a lot of things, both summed up in technical &amp;amp; non-technical sides. We learned that — it’s one thing to get the AI features working, and another to make them feel good while someone is actually browsing. Most of our time went into small details: when to nudge, when to stay quiet, how to store attention history without slowing down browser, and how to keep things calm instead of distracting. Shipping Kaizen from a barebone idea into something stable took a lot of iteration, testing, and rethinking. It reminded us that real products are built in the tiny decisions, not the big demos! 🤗&lt;/p&gt;

&lt;p&gt;There are a few more items that I'd love to share with the community,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟦 &lt;strong&gt;Building for attention requires restraint.&lt;/strong&gt; The hardest design decisions weren't technical. They were about when &lt;em&gt;not&lt;/em&gt; to act. Our early Focus Guardian nudged aggressively, mostly it felt like a backseat driver. So, our lesson was that if your tool annoys people, they'll uninstall it. Being right isn't enough; you have to be right at the right moment.&lt;/li&gt;
&lt;li&gt;🟦 &lt;strong&gt;Agents need structure, not freedom.&lt;/strong&gt; We initially gave the Chat Agent broad instructions. The results were inconsistent. What worked was constraining each agent to a narrow job with specific tools and clear decision boundaries. The Focus Guardian doesn't chat. The Chat Agent doesn't nudge. In sharp, &lt;code&gt;Specialization&lt;/code&gt; + &lt;code&gt;Coordination&lt;/code&gt; &amp;gt; &lt;code&gt;Generalization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;🟦 &lt;strong&gt;Observability isn't optional for agent systems.&lt;/strong&gt; Without Opik traces, we'd still be guessing why nudges misfired. We stopped treating the AI as a black box and started treating it like any other system component with logs and metrics.&lt;/li&gt;
&lt;li&gt;🟦 &lt;strong&gt;The real product is the quiet moments.&lt;/strong&gt; Nobody remembers the quiz that worked perfectly. They remember the time the extension stayed silent for 45 minutes during a Wikipedia deep dive they genuinely cared about, and then gently reminded them about the assignment they'd originally set out to work on. Getting those moments right took dozens of prompt iterations and hundreds of traced decisions.&lt;/li&gt;
&lt;li&gt;🟦 &lt;strong&gt;Gemini as a default provider was the right call.&lt;/strong&gt; After benchmarking all three providers, Gemini's combination of reliable tool-calling, 1M context window, and consistent temperature behavior made it the best fit. Our system makes potentially dozens of Gemini calls per user per hour — attention summaries, focus clustering, guardian checks — and reliability at that volume mattered more than peak performance on any single call.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;We're continuing to develop Kaizen and planning the next release cycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Spaced repetition&lt;/strong&gt; — surfacing what you read at the moment you're most likely to forget it&lt;/li&gt;
&lt;li&gt;🕸️ &lt;strong&gt;Topic relationship mapping&lt;/strong&gt; — showing how things you learn connect across sessions&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Better batching&lt;/strong&gt; — optimized Gemini call grouping during long browsing sessions&lt;/li&gt;
&lt;li&gt;📤 &lt;strong&gt;Export to note-taking tools&lt;/strong&gt; — so learning doesn't stay trapped in the extension&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Shareable study threads&lt;/strong&gt; — lightweight collaboration for shared focus sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For Gemini specifically, we're interested in &lt;strong&gt;structured output (JSON mode)&lt;/strong&gt; for agent responses. Right now we parse freeform text from several agent pipelines, and guaranteed JSON would let us simplify those parsing layers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  End notes 🙌🏻
&lt;/h2&gt;

&lt;p&gt;As CS students who struggle with ADHD, we primarily built Kaizen because we needed it ourselves. Traditional blockers felt like punishment. Our New Year's resolution was to build the tool we wished existed, something that doesn't lock you out, doesn't judge, just watches where your attention goes, learns your patterns, and gently, continuously helps you get better. That's what kaizen (改善) stands for, i.e. &lt;strong&gt;&lt;em&gt;continuous improvement&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Huge thanks to &lt;a href="https://dev.to"&gt;DEV&lt;/a&gt; and &lt;a href="https://mlh.io" rel="noopener noreferrer"&gt;MLH&lt;/a&gt; for hosting this writing challenge, and to the &lt;strong&gt;Google Gemini&lt;/strong&gt; team for building models that actually hold up under real multi-agent workloads! 🙌&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License ⚖️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/anikvox/kaizen/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;&lt;/p&gt;

</description>
      <category>geminireflections</category>
      <category>ai</category>
      <category>gemini</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Fragments — 𝙏𝙞𝙣𝙮 𝙁𝙧𝙖𝙜𝙢𝙚𝙣𝙩𝙨 𝙢𝙖𝙠𝙞𝙣𝙜 𝙮𝙤𝙪𝙧 𝙇𝙞𝙛𝙚 𝙁𝙪𝙡𝙡 ✨</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Mon, 05 Jan 2026 03:25:34 +0000</pubDate>
      <link>https://dev.to/neilblaze/fragments--2h12</link>
      <guid>https://dev.to/neilblaze/fragments--2h12</guid>
      <description>&lt;h2&gt;
  
  
  𝗖𝗮𝘁𝗲𝗴𝗼𝗿𝘆 𝗦𝘂𝗯𝗺𝗶𝘀𝘀𝗶𝗼𝗻: &lt;strong&gt;Best Use of Mux&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; We'd also like to consider our project under the &lt;strong&gt;Show and Tell&lt;/strong&gt; track. &lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux-2025-12-03"&gt;DEV's Worldwide Show and Tell Challenge Presented by Mux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Participants: &lt;a class="mentioned-user" href="https://dev.to/neilblaze"&gt;@neilblaze&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/achalbajpai"&gt;@achalbajpai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Ever lose that &lt;em&gt;perfect video moment&lt;/em&gt; because you forgot where you saw it? That frame that could've sparked your next big idea – gone. &lt;em&gt;Your brain isn't a hard drive&lt;/em&gt;. That's why we built &lt;a href="https://fragmentsofmux.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;Fragments&lt;/strong&gt;&lt;/a&gt;! ✨&lt;/p&gt;

&lt;h3&gt;
  
  
  Video ▶️
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe src="https://player.mux.com/Jjc4zR38yy9dh2rw5vIoCbra6P7bOrQJ5ef5qyXGkCY" width="710" height="399"&gt;
&lt;/iframe&gt;



&lt;/p&gt;

&lt;center&gt; — OR — &lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;br&gt;


  &lt;iframe src="https://www.youtube.com/embed/oF72-3ybIcg"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built 🤔
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/neilblaze/Fragments" rel="noopener noreferrer"&gt;Fragments&lt;/a&gt;&lt;/strong&gt; is your &lt;strong&gt;visual second brain&lt;/strong&gt; for creators who believe great work is shaped by &lt;em&gt;intentional consumption&lt;/em&gt;. It's a seamless synergy of both Webapp and Chrome extension that lets you capture, organize, and rediscover video moments that spark insight! Ideas don't appear in isolation — they emerge from moments you notice, save, and revisit over time. In many creative fields, a short video clip can convey more insight than pages of text. ⚡&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fragmentsofmux.vercel.app" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyb90a1kchvgumcqx80fs.gif" alt="landing-fragment.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 The whole idea behind Fragments is that &lt;em&gt;great creators aren't just skilled at making — they're careful about what they consume&lt;/em&gt;. We built a tool that makes capturing those fleeting "aha!" moments as effortless as a keyboard shortcut. Whether you're a designer spotting a slick animation, a developer watching a tutorial, or a researcher collecting interview clips — &lt;strong&gt;Fragments ensures nothing gets lost&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;🔗&lt;strong&gt;Try it out here&lt;/strong&gt;: &lt;a href="https://fragmentsofmux.vercel.app" rel="noopener noreferrer"&gt;https://fragmentsofmux.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

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

&lt;p&gt;Users install our Chrome extension and sign up via &lt;strong&gt;Supabase Auth&lt;/strong&gt; with Google OAuth. Once authenticated, they can capture any screen content with a simple &lt;strong&gt;Alt+Shift&lt;/strong&gt; shortcut. The recording (max 60 seconds) gets uploaded directly to &lt;strong&gt;&lt;a href="https://mux.com" rel="noopener noreferrer"&gt;Mux&lt;/a&gt;&lt;/strong&gt; for processing. Mux handles video storage, streaming, thumbnail generation, and AI-powered transcription. Users add tags, notes, and categories while saving. The dashboard provides a beautiful gallery view with GIF previews, full-text search across titles/tags/transcripts, and detailed analytics per fragment. Everything syncs in real-time via &lt;strong&gt;&lt;a href="https://supabase.com" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;&lt;/strong&gt; PostgreSQL database.&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h2&gt;
  
  
  Codebase / App Repository 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fragments&lt;/strong&gt; 👉  &lt;a href="https://github.com/neilblaze/fragments" rel="noopener noreferrer"&gt;github.com/neilblaze/fragments&lt;/a&gt; [Open Source] &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragments Extension&lt;/strong&gt; 👉  &lt;a href="https://github.com/Neilblaze/fragments/releases/tag/v1.0.0" rel="noopener noreferrer"&gt;github.com/Neilblaze/fragments/releases/tag/v1.0.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Neilblaze" rel="noopener noreferrer"&gt;
        Neilblaze
      &lt;/a&gt; / &lt;a href="https://github.com/Neilblaze/fragments" rel="noopener noreferrer"&gt;
        fragments
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Tiny Fragments making your Life Full ✨
    &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;Fragments&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Fragments is a web-app and chromium extension designed for creators who believe that great work is shaped by intentional consumption. Ideas do not appear in isolation. They emerge from moments you notice, save, and revisit over time. In many creative fields, a short video clip can convey more insight than pages of text.&lt;/p&gt;
&lt;p&gt;Fragments helps you capture, organize, and rediscover those moments so they are available when you need them most, built with &lt;a href="http://mux.com/" rel="nofollow noopener noreferrer"&gt;Mux&lt;/a&gt; and &lt;a href="https://supabase.com/" rel="nofollow noopener noreferrer"&gt;Supabase&lt;/a&gt; for the &lt;a href="https://dev.to/devteam/devs-worldwide-show-and-tell-challenge-presented-by-mux-pitch-your-projects-3000-in-prizes-40g7" rel="nofollow"&gt;DEV's Worldwide Show and Tell Challenge 2025&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Next.js 15&lt;/li&gt;
&lt;li&gt;Mux (Video processing and streaming and AI features)&lt;/li&gt;
&lt;li&gt;Supabase (Authentication and Database)&lt;/li&gt;
&lt;li&gt;Tailwind CSS + Shadcn UI&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 20 or higher&lt;/li&gt;
&lt;li&gt;Mux account and API tokens&lt;/li&gt;
&lt;li&gt;Supabase project and service role key&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Env Configuration&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Create a .env file in the root directory with the following variables.&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key

MUX_TOKEN_ID=your_mux_token_id
MUX_TOKEN_SECRET=your_mux_token_secret
MUX_WEBHOOK_SECRET=your_mux_webhook_secret

DASHBOARD_URL=http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Database Setup&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Open your Supabase…&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/Neilblaze/fragments" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;ㅤ&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome Extension&lt;/strong&gt; with invisible capture (Alt+Shift shortcut, max 60s)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mux Video Processing&lt;/strong&gt; for streaming, thumbnails, and GIF previews&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Transcription&lt;/strong&gt; via Mux's auto-generated captions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Search&lt;/strong&gt; across titles, tags, notes, and transcripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neobrutalist UI&lt;/strong&gt; with RetroUI-inspired design (Tailwind + ShadCN)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google OAuth&lt;/strong&gt; via Supabase Authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public/Private Sharing&lt;/strong&gt; with NSFW detection and age verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reddit-style Voting&lt;/strong&gt; (upvotes/downvotes) on community fragments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View Analytics&lt;/strong&gt; tracking per fragment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MP4 Downloads&lt;/strong&gt; via Mux Static Renditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag Management&lt;/strong&gt; with popular tag suggestions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NSFW Restrictions&lt;/strong&gt; with NSFW.js on every fragments &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt; works on desktop and mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Updates&lt;/strong&gt; via Supabase subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first&lt;/strong&gt; with Row Level Security (RLS) policies&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy &amp;amp; Security 🔐
&lt;/h3&gt;

&lt;p&gt;Fragments deals with personal video captures, which can be sensitive. We've implemented &lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt; policies in Supabase ensuring users can only access their own fragments. Public sharing is explicit and opt-in. NSFW content is detected and requires age verification to view. All API calls are authenticated, and video processing happens securely through Mux's infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ggob5phm8ic28vptl77.png" alt="transparent-divider"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Background 📜
&lt;/h3&gt;

&lt;p&gt;Here's the thing — &lt;strong&gt;creators consume thousands of videos&lt;/strong&gt; but only a handful of moments truly matter. Those 10-second clips that demonstrate a technique, explain a concept, or inspire an idea. But where do they go? 😔&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  The problem with current solutions:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bookmarks get lost, notes lack context, and rewatching entire videos to find that one moment is painful&lt;/strong&gt;. Creators need a system that captures moments &lt;em&gt;in context&lt;/em&gt;, makes them searchable, and surfaces them when relevant. &lt;strong&gt;It's 2026, and we're still losing inspiration to forgotten browser tabs&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core problem is that video content is hard to search and organize. Text notes can be searched, but video moments require watching. Until now.&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Traditional Approach&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Fragments Solution&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Bookmarking full videos&lt;/td&gt;
      &lt;td&gt;🟢 Capture only the moment that matters&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Text notes without visual context&lt;/td&gt;
      &lt;td&gt;🟢 Video clips with searchable transcripts&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Scattered across multiple apps&lt;/td&gt;
      &lt;td&gt;🟢 Single organized library&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Can't search video content&lt;/td&gt;
      &lt;td&gt;🟢 Full-text search across transcripts&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 No way to preview quickly&lt;/td&gt;
      &lt;td&gt;🟢 Looping GIF previews in gallery&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 No sharing workflow&lt;/td&gt;
      &lt;td&gt;🟢 Public/private with community feed&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fragments transforms passive video consumption into an active, searchable knowledge base. Capture what matters, search by what was said, and build your visual second brain! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Fragments&lt;/strong&gt; changes the game by &lt;em&gt;making video moments as searchable as text, as organized as notes, and as shareable as links&lt;/em&gt;! 👪&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Mux?
&lt;/h3&gt;

&lt;p&gt;Video processing is make-or-break for a tool like Fragments. &lt;strong&gt;Mux&lt;/strong&gt; gives us everything we need without the headaches.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mux handles video upload, processing, streaming, thumbnail generation, GIF creation, and AI transcription — all through a single, elegant API. This lets us focus on the user experience instead of video infrastructure.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Mux Integration in Fragments 🎬&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;muxService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createUpload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;corsOrigin&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mux&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getMux&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;cors_origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;corsOrigin&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;new_asset_settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;playback_policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="na"&gt;static_renditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;resolution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;highest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                    &lt;span class="na"&gt;generated_subtitles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
                        &lt;span class="na"&gt;language_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;English (auto)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="p"&gt;}],&lt;/span&gt;
                &lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;uploadUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;uploadId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;getThumbnailUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png?time=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="nf"&gt;getGifUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/animated.gif?start=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;end=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mux powers our entire video stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Upload &amp;amp; Processing&lt;/strong&gt; — Direct uploads from the extension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming&lt;/strong&gt; — HLS playback via @mux/mux-player-react&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thumbnails &amp;amp; GIFs&lt;/strong&gt; — Instant preview generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Transcription&lt;/strong&gt; — Auto-generated captions searchable in our database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Renditions&lt;/strong&gt; — MP4 downloads for users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt; — View counts and engagement metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FLsB4G3Gz%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Data Overview&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;

    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FvTjG5q61%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Assets&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;

    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2F9fpVLFqy%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Engagement&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;
  &lt;/tr&gt;

  &lt;tr&gt;
    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FSRXhQ6tm%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Metrics&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;

    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FGhyCZjyH%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Error Logs&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;

    &lt;td&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FzvHsYJV1%2Fimage.png"&gt;
      
        &lt;center&gt;&lt;strong&gt;Views Metrics&lt;/strong&gt;&lt;/center&gt;
      
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We dove deep into &lt;strong&gt;Mux's API&lt;/strong&gt; for webhooks, asset management, and playback customization. Building a video-first app was a learning curve — we had to understand encoding, streaming protocols, and optimal UX for video galleries. &lt;strong&gt;Mux made it manageable!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Use of Mux (Additional Prize Category) 🎬
&lt;/h3&gt;

&lt;p&gt;As mentioned before, Fragments utilizes &lt;strong&gt;7 distinct Mux features&lt;/strong&gt; beyond just video hosting. Here's a deep dive into our implementation:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Direct Uploads (Extension → Mux)
&lt;/h4&gt;

&lt;p&gt;We use &lt;a href="https://docs.mux.com/guides/upload-files-directly" rel="noopener noreferrer"&gt;Mux Direct Uploads&lt;/a&gt; to enable our Chrome extension to upload screen recordings directly to Mux without routing through our server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Chrome extension uploads directly to Mux&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;cors_origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;new_asset_settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;playback_policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;static_renditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;resolution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;highest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="na"&gt;generated_subtitles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;language_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;English (auto)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="c1"&gt;// Extension uses upload.url to PUT video directly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Mux Player React
&lt;/h4&gt;

&lt;p&gt;We use &lt;a href="https://github.com/muxinc/elements/tree/main/packages/mux-player-react" rel="noopener noreferrer"&gt;@mux/mux-player-react&lt;/a&gt; for seamless HLS playback with built-in controls, customizable theming, and analytics tracking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MuxPlayer&lt;/span&gt;
    &lt;span class="na"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;video_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;video_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;player_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fragments Dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;accentColor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#ff6101"&lt;/span&gt;
    &lt;span class="na"&gt;streamType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"on-demand"&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Dynamic Thumbnails
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://docs.mux.com/guides/get-images-from-a-video" rel="noopener noreferrer"&gt;Mux Image API&lt;/a&gt; generates thumbnails on-the-fly for our gallery cards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Thumbnails at any timestamp&lt;/span&gt;
&lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png?time=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;width=640`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Animated GIF Previews
&lt;/h4&gt;

&lt;p&gt;We create looping GIF previews for gallery hover states using Mux's GIF endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 5-second looping previews&lt;/span&gt;
&lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/animated.gif?start=0&amp;amp;end=5&amp;amp;fps=15&amp;amp;width=320`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. AI-Powered Auto-Transcription
&lt;/h4&gt;

&lt;p&gt;We enable &lt;a href="https://docs.mux.com/guides/add-autogenerated-captions" rel="noopener noreferrer"&gt;auto-generated subtitles&lt;/a&gt; during asset creation. The transcripts are searchable in our database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;generated_subtitles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;language_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;English (auto)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6. Static Renditions (MP4 Downloads)
&lt;/h4&gt;

&lt;p&gt;Users can download fragments as MP4 files via &lt;a href="https://docs.mux.com/guides/enable-static-mp4-renditions" rel="noopener noreferrer"&gt;Static Renditions&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Download URL for users&lt;/span&gt;
&lt;span class="s2"&gt;`https://stream.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/highest.mp4?download=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  7. Webhooks + NSFW Moderation Pipeline
&lt;/h4&gt;

&lt;p&gt;Our most creative use of Mux! We listen to &lt;a href="https://docs.mux.com/guides/listen-for-webhooks" rel="noopener noreferrer"&gt;Mux Webhooks&lt;/a&gt; and trigger content moderation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Webhook handler: video.asset.ready&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video.asset.ready&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Update fragment status&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fragments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;mux_asset_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assetId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;mux_playback_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ready&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;thumbnail_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Trigger NSFW detection using Mux thumbnails!&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/moderate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;fragmentId&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The NSFW moderation leverages Mux thumbnails&lt;/strong&gt; — we extract frames at multiple timestamps and run them through OpenAI's &lt;code&gt;omni-moderation-latest&lt;/code&gt; model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Moderation uses Mux thumbnail API for frame extraction&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thumbnailUrls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png?time=1&amp;amp;width=640`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png?time=5&amp;amp;width=640`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`https://image.mux.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;playbackId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/thumbnail.png?time=10&amp;amp;width=640`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Each frame is analyzed for NSFW content&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moderations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;omni-moderation-latest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image_url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;thumbnailUrl&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If flagged, the fragment is automatically marked as NSFW and requires age verification to view publicly. Note that, due to exhaustion of OpenAI credits (on our end), we're rolled back this feature to &lt;a href="https://nsfwjs.com/" rel="noopener noreferrer"&gt;NSFW.js&lt;/a&gt; which functions using an ultra-lightweight onDevice MobileNet v2 model (4.2MB), that works flawlessly! &lt;/p&gt;

&lt;h2&gt;
  
  
  ㅤ
&lt;/h2&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h2&gt;
  
  
  Design 🎨
&lt;/h2&gt;

&lt;p&gt;We were heavily inspired by the &lt;strong&gt;Neobrutalist&lt;/strong&gt; design — bold borders, stark shadows, and intentional imperfection. Our UI uses &lt;strong&gt;&lt;a href="https://github.com/Logging-Studio/RetroUI" rel="noopener noreferrer"&gt;RetroUI&lt;/a&gt;&lt;/strong&gt; components combined with &lt;strong&gt;Tailwind CSS&lt;/strong&gt; and &lt;strong&gt;ShadCN UI&lt;/strong&gt; for a distinctive aesthetic.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt;: Minimal, invisible UI that doesn't interrupt flow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize&lt;/strong&gt;: Tags, categories, and notes for context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: Find by what was said, not just titles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share&lt;/strong&gt;: Public community feed with voting&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;We focused on making the gallery feel like a creative workspace — GIF previews loop automatically, cards have subtle hover effects, and the search experience is fast and intuitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CREDITS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Resources&lt;/strong&gt;: RetroUI, Neobrutalist principles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt;: Lucide React, Hugeicons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt;: Syne, Space Mono, Geist Mono&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Challenges we ran into 😤
&lt;/h3&gt;

&lt;p&gt;Building a screen capture extension + video platform brought some interesting technical challenges.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The biggest headache was getting screen capture to work reliably across different websites and tab contexts.&lt;/strong&gt; Chrome's Manifest V3 has strict security policies, and coordinating the capture → upload → process → display flow required careful state management.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Real-time video processing&lt;/strong&gt; meant handling async webhooks from Mux and updating the UI accordingly. We implemented polling for status updates while waiting for transcription to complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance optimization&lt;/strong&gt; for the gallery was crucial — loading dozens of GIF previews without janky scrolling required lazy loading and careful memory management.&lt;/p&gt;

&lt;p&gt;We're really proud of creating a capture experience that feels invisible and a gallery that makes rediscovery delightful! :)&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

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

&lt;p&gt;Fragments has serious potential to become the go-to visual knowledge base for creators. We've built the foundation, and there's so much more to explore!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we're building next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser Integration&lt;/strong&gt;: Support for Firefox and Edge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collections&lt;/strong&gt;: Group related fragments into themed collections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Summaries&lt;/strong&gt;: Auto-generated descriptions for each fragment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: Share collections with teams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile App&lt;/strong&gt;: Capture from mobile screens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Access&lt;/strong&gt;: Let developers build on top of Fragments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're excited to expand Mux integration, improve search accuracy, and build a thriving creator community!&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  End Notes 🙌🏻
&lt;/h3&gt;

&lt;p&gt;Huge thanks to &lt;a href="https://dev.to"&gt;DEV&lt;/a&gt; for hosting this challenge, the &lt;strong&gt;Mux team&lt;/strong&gt; for incredible video infrastructure and documentation, and to the open-source community for inspiration! 🙌&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License ⚖️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/neilblaze/fragments/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" alt="breaker.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>Dawn — 𝘾𝙚𝙣𝙨𝙤𝙧𝙨𝙝𝙞𝙥 𝙍𝙚𝙨𝙞𝙨𝙩𝙖𝙣𝙩 𝙈𝙚𝙙𝙞𝙖 ⚡</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Sun, 07 Sep 2025 19:28:29 +0000</pubDate>
      <link>https://dev.to/neilblaze/dawn-1gl5</link>
      <guid>https://dev.to/neilblaze/dawn-1gl5</guid>
      <description>&lt;h2&gt;
  
  
  𝗖𝗮𝘁𝗲𝗴𝗼𝗿𝘆 𝗦𝘂𝗯𝗺𝗶𝘀𝘀𝗶𝗼𝗻 for the &lt;a href="https://dev.to/challenges/midnight-2025-08-20"&gt;Midnight Network "Privacy First" Challenge&lt;/a&gt;: &lt;strong&gt;Protect That Data prompt&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; We'd also like to consider our project for the &lt;strong&gt;Best Tutorial&lt;/strong&gt; track!&lt;/p&gt;

&lt;p&gt;👥 &lt;strong&gt;Participants:&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/neilblaze"&gt;@neilblaze&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/sandipndev"&gt;@sandipndev&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/subhamx"&gt;@subhamx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Video ▶️
&lt;/h3&gt;

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

&lt;p&gt;💡 &lt;strong&gt;TIP:&lt;/strong&gt; Watch at 1.25x for better experience!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI-Demo ▶️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/738916" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnf3lcvqnjgmujiqhlaje.gif" alt="CLI_Demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔎 Why we built it
&lt;/h2&gt;

&lt;p&gt;Today, whistleblowers and citizens face two major problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fear of retaliation:&lt;/strong&gt; Speaking out against powerful entities risks jobs, reputations, and even lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Censorship of evidence:&lt;/strong&gt; Reports can be deleted, altered, or ignored, leaving no permanent public record.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Dawn&lt;/strong&gt; solves this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allowing &lt;em&gt;anyone&lt;/em&gt; to publish anonymously but with verifiable authenticity via attestation&lt;/li&gt;
&lt;li&gt;Making every report &lt;em&gt;permanent&lt;/em&gt; and &lt;em&gt;censorship-resistant&lt;/em&gt; through blockchain&lt;/li&gt;
&lt;li&gt;Organizing reports into Boards (categorization) so the public, journalists, and NGOs can discover, verify, and act on credible information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 In short: we protect voices, preserve evidence, and rebuild trust in media&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌘 What is Dawn?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Dawn&lt;/strong&gt; is a censorship-resistant media platform built on the &lt;a href="https://midnight.network" rel="noopener noreferrer"&gt;Midnight Network&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s designed to ensure that your voice cannot be silenced, while the authenticity of every report is cryptographically verified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4nmpa2269jz4uek80vxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4nmpa2269jz4uek80vxl.png" alt="screenshot_array"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Users can publish Reports into thematic Bulletins (like Governance, Healthcare, or Corporate). Each report is immutable, linked to a decentralized store, and backed by zero-knowledge attestations that prove the author’s role without revealing their identity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Why We Stand Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lace Wallet Integration in the Web&lt;/strong&gt;: One of the only projects with a fully functioning end to end Midnight Lace Wallet integration in the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Working Deployment&lt;/strong&gt;: &lt;a href="https://midnightodawn.xyz" rel="noopener noreferrer"&gt;Midnightodawn&lt;/a&gt; is live and publicly accessible and works on any Chromium browser with Midnight Lace Wallet extension&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Attestation Service&lt;/strong&gt;: whose proof is verified using their public key inside our smart contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj7n8blfy00tutohc8mn.png" alt="Breaker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⛓ Nodes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attestation Service&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Uses LLM to determine board access for an user based on their email&lt;/li&gt;
&lt;li&gt;Generates signed attestations&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://attestor.midnightodon.xyz" rel="noopener noreferrer"&gt;https://attestor.midnightodon.xyz&lt;/a&gt;, &lt;a href="https://mail.midnightodawn.xyz" rel="noopener noreferrer"&gt;https://mail.midnightodawn.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;User Interface&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Clean web UI deployed to Vercel&lt;/li&gt;
&lt;li&gt;Features: connect wallet, browse Reports, filter by board, view/download attached files&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Command Line Interface&lt;/strong&gt; (CLI)

&lt;ul&gt;
&lt;li&gt;Alternate client for publishing Reports without using the web UI&lt;/li&gt;
&lt;li&gt;Uses same attestation and contract verification pipeline&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏃🏻‍♂️ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Knowledge Role Verification&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Users prove eligibility (e.g., government employee, healthcare professional, citizen) via attestations&lt;/li&gt;
&lt;li&gt;Attestation service issues a signed board proof after OTP email verification&lt;/li&gt;
&lt;li&gt;Smart contract verifies proofs with stored EDDSA (Poseidon) keys&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Censorship-Resistant Publishing&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Publish immutable Reports with title, content, summary, and attachments (PDFs, docs)&lt;/li&gt;
&lt;li&gt;Reports are organized into Bulletins under Categories&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Wallet Integration&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Deployed on Midnight testnet&lt;/li&gt;
&lt;li&gt;Complete end-to-end integration through Lace Wallet for transaction signing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Smart Contracts&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Witness-based verification of signed attestations&lt;/li&gt;
&lt;li&gt;On-chain state stores Reports, linked to decentralized storage&lt;/li&gt;
&lt;li&gt;Supports multiple contract deployments for duplicate instances&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Infrastructure &amp;amp; Deployment&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Web frontend on Vercel&lt;/li&gt;
&lt;li&gt;Attestation/email services containerized with Docker Compose, running via static IP&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Continuous testing with GitHub Actions&lt;/strong&gt; for smart contracts&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📢 Proof of Work
&lt;/h2&gt;

&lt;p&gt;You can see and interact with the DApp yourself by using the links below. We encourage you to do it so that you can get a feel of our application. &lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;NOTE:&lt;/strong&gt; You'll need a funded Lace Midnight Wallet on Midnight Network Testnet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏠 &lt;strong&gt;Portal:&lt;/strong&gt; &lt;a href="https://midnightodawn.xyz" rel="noopener noreferrer"&gt;https://midnightodawn.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Dummy Emails:&lt;/strong&gt; &lt;a href="https://mail.midnightodawn.xyz" rel="noopener noreferrer"&gt;https://mail.midnightodawn.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/sandipndev/dawn" rel="noopener noreferrer"&gt;https://github.com/sandipndev/dawn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💎 &lt;strong&gt;BONUS:&lt;/strong&gt; Follow the &lt;a href="https://github.com/sandipndev/dawn/blob/main/readme.md" rel="noopener noreferrer"&gt;&lt;em&gt;getting started&lt;/em&gt;&lt;/a&gt; guide to setup &lt;a href="https://midnightodawn.xyz/" rel="noopener noreferrer"&gt;Dawn&lt;/a&gt; on your local! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h0814uhtrh5sl8t8blj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7h0814uhtrh5sl8t8blj.png" alt="techy_blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visit the portal&lt;/strong&gt; → &lt;a href="https://midnightodawn.xyz" rel="noopener noreferrer"&gt;midnightodawn.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect Lace Wallet&lt;/strong&gt; → Authorize the DApp in your &lt;a href="https://chromewebstore.google.com/detail/lace-midnight-preview/hgeekaiplokcnmakghbdfbgnlfheichg" rel="noopener noreferrer"&gt;Midnight Lace Wallet&lt;/a&gt; (testnet)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse Reports&lt;/strong&gt; → Instantly see all existing Reports and filter them by board/category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Report&lt;/strong&gt; → Click Create Report to start publishing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get an Attestation&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Enter your email → receive a one-time code (via our &lt;a href="https://mail.midnightodawn.xyz" rel="noopener noreferrer"&gt;toy SMTP service&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Paste the code to verify → the Attestation Service issues a signed proof of which boards you can post to&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write your Report&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Select your Board → Attestation grants you access to boards. Everyone can post to Citizen Board, but only verified domains can access Government or Healthcare boards&lt;/li&gt;
&lt;li&gt;Fill in Title, Content, Summary, and optional Footnotes/References.&lt;/li&gt;
&lt;li&gt;Content and Footnotes support rich text and file uploads (e.g., PDFs)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Submit the Report → sign the transaction in Lace Wallet&lt;/li&gt;
&lt;li&gt;The smart contract verifies the attestation on-chain using stored public keys (EDDSA over Poseidon)&lt;/li&gt;
&lt;li&gt;If valid, the Report is permanently stored, linked to its off-chain attachments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Done&lt;/strong&gt; 🎉 → The Report appears in the list instantly. Your eligibility is proven, but your identity is never revealed or saved&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  System Architecture 📊
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtixo1lgtmfiyk8iqw9x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtixo1lgtmfiyk8iqw9x.png" alt="SysArch.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 From Demo to Vision
&lt;/h2&gt;

&lt;p&gt;Our hackathon demo proves the concept. The MVP vision goes further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable verifiers:&lt;/strong&gt; support multiple attestation methods (gov councils, NGOs, zk-email, Merkle roots).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spam resistance:&lt;/strong&gt; rate-limiting nullifiers to prevent Sybil abuse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Richer discovery tools:&lt;/strong&gt; allow journalists and citizens to navigate Bulletins, Sub-Categories, and Categories at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t5ozp7ntc1n37arp6o5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t5ozp7ntc1n37arp6o5.png" alt="anonymous_face_fukCensor.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiavlt6owfse2hf24zd7z.png" alt="blank_space"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌅 Closing
&lt;/h2&gt;

&lt;p&gt;Midnightodawn demonstrates how censorship-resistant media can be built on Midnight. Every Report is permanent, every author is protected, and every piece of evidence can be trusted.&lt;/p&gt;

&lt;p&gt;From Midnight to Dawn, truth survives the night!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>midnightchallenge</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Wynnie 🦄 — 𝘠𝘰𝘶𝘳 𝘚𝘩𝘰𝘱𝘱𝘪𝘯𝘨, 𝘯𝘰𝘸 𝘰𝘯 𝘈𝘶𝘵𝘰𝘱𝘪𝘭𝘰𝘵!</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Mon, 28 Jul 2025 02:17:17 +0000</pubDate>
      <link>https://dev.to/neilblaze/wynnie--4po3</link>
      <guid>https://dev.to/neilblaze/wynnie--4po3</guid>
      <description>&lt;h2&gt;
  
  
  𝗖𝗮𝘁𝗲𝗴𝗼𝗿𝘆 𝗦𝘂𝗯𝗺𝗶𝘀𝘀𝗶𝗼𝗻: &lt;strong&gt;Business Automation Voice Agent&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; We'd also like to consider our project under the &lt;strong&gt;Real-Time Voice Performance&lt;/strong&gt; track.&lt;/p&gt;

&lt;p&gt;Participants: &lt;a class="mentioned-user" href="https://dev.to/neilblaze"&gt;@neilblaze&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/achalbajpai"&gt;@achalbajpai&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Video ▶️
&lt;/h3&gt;

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

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built 🤔
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/achal-b/wynnie/" rel="noopener noreferrer"&gt;Wynnie&lt;/a&gt;&lt;/strong&gt; is your smart &lt;strong&gt;autonomous AI shopping companion / agent&lt;/strong&gt; that revolutionizes how people shop online through simple &lt;em&gt;natural language&lt;/em&gt;. It's like having a personal shopping genie 🧞 that actually &lt;em&gt;understands what you want&lt;/em&gt; and handles everything automatically, starting from finding products to getting the best deals, it got all covered! We built this using &lt;strong&gt;AssemblyAI's speech recognition&lt;/strong&gt; that can detect over 50 languages on the fly! ⚡ &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k1bmch7z8wfpwtits4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9k1bmch7z8wfpwtits4f.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 The whole idea behind a smart system like this is that it &lt;em&gt;eliminates all the tedious shopping work&lt;/em&gt; while making everything accessible to literally anyone - whether you speak English, Hindi, Spanish, or whatever. Plus it scales incredibly well because each user gets their own personalized shopping brain. Most importantly, it caters to this huge mass of elderly people who have money to spend and need to shop, but they're being shut out by friction designed for digital natives. That's millions of potential customers just sitting there, frustrated and underserved, whom we (as well as business owners) care about and thus we're serving what they want!&lt;/p&gt;

&lt;p&gt;🏠&lt;strong&gt;Homepage&lt;/strong&gt;: &lt;a href="https://wynnie-v1.vercel.app" rel="noopener noreferrer"&gt;https://wynnie-v1.vercel.app&lt;/a&gt;&lt;br&gt;
🔗&lt;strong&gt;Try it out here&lt;/strong&gt;: &lt;a href="https://wynnie.vercel.app" rel="noopener noreferrer"&gt;https://wynnie.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works? 💣
&lt;/h2&gt;

&lt;p&gt;Users simply sign up using Google OAuth, and we handle the same via &lt;a href="https://firebase.google.com/docs/auth" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt;. Once they’re in, they land on the dashboard, and from there, they can ask for anything, either by typing it out or just talking. If it’s voice, &lt;a href="https://www.assemblyai.com/" rel="noopener noreferrer"&gt;AssemblyAI&lt;/a&gt;'s speech recognition kicks in to transcribe everything in real-time, even down to the word-level timestamps and formatting. That transcription is then piped to &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, which pulls out what the user wants, any key details, and even picks up on tone or emotion. Then our AI agents jump in, digging through &lt;a href="https://serpapi.com" rel="noopener noreferrer"&gt;SERP APIs&lt;/a&gt; and &lt;a href="https://www.perplexity.ai/sonar" rel="noopener noreferrer"&gt;Perplexity Sonar&lt;/a&gt; to find the best product matches, factoring in things like location, coupons, and what they’ve liked before. Once the picks are ready, they hit the inventory, coupons get auto-applied using Synphase, and payments are seamlessly handled through &lt;a href="https://www.npci.org.in/what-we-do/upi-lite/upi-lite-x/product-overview" rel="noopener noreferrer"&gt;UPI LiteX&lt;/a&gt;. All of it’s tracked and stored in &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;, keeping everything clean, secure, and seamless.&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;
&lt;h2&gt;
  
  
  App Repository 🔗
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Wynnie.AI&lt;/strong&gt; 👉  &lt;a href="https://github.com/achal-b/wynnie/" rel="noopener noreferrer"&gt;https://github.com/achal-b/wynnie&lt;/a&gt; [Open source on GitHub]&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;
&lt;h2&gt;
  
  
  Features 🎠
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Autonomous AI shopping buddy that delivers true performance!&lt;/li&gt;
&lt;li&gt;AssemblyAI's Voice recognition that works with 50+ languages automatically!&lt;/li&gt;
&lt;li&gt;Scales like crazy with our multi-agent orchestrated architecture&lt;/li&gt;
&lt;li&gt;Real-time product hunting using Perplexity AI (&lt;a href="https://sonar.perplexity.ai" rel="noopener noreferrer"&gt;Sonar&lt;/a&gt;) &amp;amp; &lt;a href="https://serpapi.com" rel="noopener noreferrer"&gt;SERP API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Smart deal finder that optimizes your cart automatically!&lt;/li&gt;
&lt;li&gt;Intelligent delivery planning with eco-friendly routing&lt;/li&gt;
&lt;li&gt;Works offline as a Progressive Web App (PWA)!&lt;/li&gt;
&lt;li&gt;Speaks your language - literally any of 50+ languages, with &lt;a href="https://www.assemblyai.com/docs/speech-to-text/pre-recorded-audio/supported-languages" rel="noopener noreferrer"&gt;AssemblyAI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Knows who's talking with speaker identification &amp;amp; automatically isolates background noise. &lt;/li&gt;
&lt;li&gt;Clean, modern interface built with Next.js &amp;amp; Tailwind&lt;/li&gt;
&lt;li&gt;Google OAuth SSO via Google Firebase&lt;/li&gt;
&lt;li&gt;Live price tracking and bundle suggestions!&lt;/li&gt;
&lt;li&gt;True AI recommendations that finetuned to user's experience!&lt;/li&gt;
&lt;li&gt;Supabase backend for blazing fast performance!&lt;/li&gt;
&lt;li&gt;Seamless payments via UPI-Litex are highly secure &amp;amp; E2E encrypted!&lt;/li&gt;
&lt;li&gt;Comes with batteries &amp;amp; has CI/CD via GitHub actions.&lt;/li&gt;
&lt;li&gt;Saves you 💰 + tons of time!&lt;/li&gt;
&lt;li&gt;Works for everyone - accessibility first!&lt;/li&gt;
&lt;li&gt;Privacy-focused and GDPR* compliant!&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;ㅤ&lt;/p&gt;
&lt;h3&gt;
  
  
  System Architecture 📊
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffswk03acycv3dn1bz866.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffswk03acycv3dn1bz866.png" alt="SysArch.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Privacy &amp;amp; Security 🔐
&lt;/h3&gt;

&lt;p&gt;Wynnie deals with your shopping data and payment info, which is pretty sensitive stuff. We've gone overboard on security to make sure everything stays locked down and &lt;strong&gt;100% GDPR compliant&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;All communication happens over encrypted channels, and we use Supabase's built-in security features. Voice data gets processed securely through AssemblyAI's endpoints. Down the road, we're planning full end-to-end encryption for everything.&lt;/p&gt;
&lt;h3&gt;
  
  
  Background 📜
&lt;/h3&gt;

&lt;p&gt;Here's the thing - online shopping is still a pain for way &lt;em&gt;too many&lt;/em&gt; people! &lt;strong&gt;Language barriers, confusing interfaces, and just the overwhelming number of choices&lt;/strong&gt; make it really hard for people to find what they actually need and get good deals. 😔&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vvxvpbf4ihsw3ez1e0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vvxvpbf4ihsw3ez1e0h.png" alt="Retailwire.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;
&lt;b&gt;Source:&lt;/b&gt; https://retailwire.com/discussion/are-retailers-making-it-too-tough-for-seniors-to-shop-online&lt;/center&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Most shopping sites basically dump you into this maze where you have to:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Navigate complex menus, compare tons of products manually, figure out which deals are actually good, and somehow optimize everything yourself&lt;/strong&gt;. If you don't speak the main language perfectly, or if you have accessibility needs, or if you just find tech interfaces confusing - you're pretty much out of luck. &lt;strong&gt;It's 2025 and we're still making people work way too hard just to buy stuff&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core problem is that e-commerce platforms are built like databases instead of conversations. Nobody shops by filling out forms, rather we shop by talking about what we need.&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Traditional E-commerce Pain Points&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
      &lt;th&gt;&lt;strong&gt;&lt;center&gt;Wynnie's AI Solution&lt;/center&gt;&lt;/strong&gt;&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Users manually search for products&lt;/td&gt;
      &lt;td&gt;🟢 AI-driven intent detection + voice/text input&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Overwhelming product listings&lt;/td&gt;
      &lt;td&gt;🟢 Personalized, context-aware recommendations&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 No clarity on best deals or coupons&lt;/td&gt;
      &lt;td&gt;🟢 Auto-applied coupons via Synphase Scraper&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Complex checkout flows&lt;/td&gt;
      &lt;td&gt;🟢 Streamlined voice-first ordering system&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Static dashboards and limited insights&lt;/td&gt;
      &lt;td&gt;🟢 Dynamic dashboard with conversational UX&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 No real-time decision feedback&lt;/td&gt;
      &lt;td&gt;🟢 LLM-as-Judge provides on-the-fly optimization&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Limited customer engagement&lt;/td&gt;
      &lt;td&gt;🟢 Conversational agents tailored to user needs&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;🟠 Siloed services &amp;amp; fragmented UX&lt;/td&gt;
      &lt;td&gt;🟢 Unified AI Orchestrator with agent collaboration&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Instead of making people navigate complex websites, Wynnie lets you just talk naturally about what you're looking for. The AI figures out your intent, researches products automatically, finds the best deals, and presents you with optimized options. It's like having a really smart friend who knows everything about shopping! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Wynnie&lt;/strong&gt; changes the game by &lt;em&gt;understanding natural conversation, making smart decisions independently, and handling all the tedious optimization work automatically&lt;/em&gt;! 👪&lt;/p&gt;

&lt;p&gt;Beyond just understanding what you say, Wynnie does the heavy lifting with &lt;strong&gt;real-time product research through Perplexity AI&lt;/strong&gt;, &lt;strong&gt;automatic deal optimization&lt;/strong&gt;, and &lt;strong&gt;smart delivery planning&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;The kicker? &lt;strong&gt;Users don't need to learn anything new&lt;/strong&gt; — just talk naturally about what you want! This makes shopping accessible to everyone, regardless of language, tech skills, or physical abilities.&lt;/p&gt;

&lt;p&gt;We're aiming for shopping that's &lt;em&gt;fast, smart, and genuinely helpful through AI conversations that understand context, preferences, and optimize for the best outcomes&lt;/em&gt; automatically! ✨&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9blv6t8q0tlaj3taqauj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9blv6t8q0tlaj3taqauj.png" alt="AgenticWorkflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our mission is making online shopping &lt;strong&gt;work for everyone&lt;/strong&gt; through natural AI conversations that connect people with exactly what they need through &lt;strong&gt;&lt;em&gt;Intelligent Shopping Automation&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;


&lt;h3&gt;
  
  
  Snapshots 🖼️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwur5dfbjo29203ymuh9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwur5dfbjo29203ymuh9d.png" alt="ScreenshotPanel.png"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Why AssemblyAI?
&lt;/h3&gt;

&lt;p&gt;Voice recognition is make-or-break for accessible shopping. &lt;strong&gt;AssemblyAI's Universal Speech Model&lt;/strong&gt; gives us the accuracy and language support we need without the headaches.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AssemblyAI automatically detects what language someone's speaking from a list of 50+, figures out who's talking when, and gives us word-level timing. This lets us build shopping experiences that actually work for real people having real conversations.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// AssemblyAI Voice Processor for Wynnie 🦄&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;transcribeAudio&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;speech_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;universal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;language_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;punctuate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;format_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;speaker_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;speakers_expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;AssemblyAITranscriptionRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AssemblyAITranscriptionResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audioUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uploadAudio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transcriptionJob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startTranscription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;speech_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;language_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;punctuate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;format_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;speaker_labels&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;speakers_expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completedTranscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pollForCompletion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transcriptionJob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;completedTranscription&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error transcribing audio with AssemblyAI:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AssemblyAI processes all our voice input&lt;/strong&gt; and turns natural speech into shopping intent. The multi-language support means we can help users regardless of what language feels most comfortable to them.&lt;/p&gt;

&lt;p&gt;Also, thanks for the $50 credits which helped us quickly get started! 🙏🏻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6el89f0twe2r1xko4fl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6el89f0twe2r1xko4fl.png" alt="Cost_AssemblyAI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our &lt;strong&gt;AI agent system&lt;/strong&gt; (powered by OpenAI's &lt;a href="https://openai.com/index/gpt-4o-mini-advancing-cost-efficient-intelligence" rel="noopener noreferrer"&gt;GPT-4o mini&lt;/a&gt;) &lt;strong&gt;generates smart yet fast shopping recommendations&lt;/strong&gt; where &lt;strong&gt;AssemblyAI handles the voice input, and our orchestrator coordinates specialized agents&lt;/strong&gt; for finding products, optimizing deals, and planning delivery. Everything works together seamlessly! 🙂&lt;/p&gt;

&lt;p&gt;We dove deep into &lt;strong&gt;AssemblyAI's advanced features&lt;/strong&gt; like speaker diarization and confidence scoring. &lt;em&gt;Building voice-first interfaces&lt;/em&gt; was &lt;strong&gt;definitely a learning curve&lt;/strong&gt; since most of us come from traditional web development. &lt;strong&gt;We had to study voice interaction patterns and accessibility guidelines from scratch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Besides AssemblyAI, we learned tons about autonomous agent architectures, real-time AI coordination, and building systems that actually scale. 🌟&lt;/p&gt;

&lt;h2&gt;
  
  
  ㅤ
&lt;/h2&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h2&gt;
  
  
  Design 🎨
&lt;/h2&gt;

&lt;p&gt;We were heavily inspired by the revised version of &lt;strong&gt;Double Diamond&lt;/strong&gt; design process, a model popularized by the &lt;a href="https://www.designcouncil.org.uk/our-work/news-opinion/double-diamond-universally-accepted-depiction-design-process/" rel="noopener noreferrer"&gt;British Design Council&lt;/a&gt;, which not only includes visual design, but a full-fledged research cycle in which you must discover and define your problem before tackling your solution &amp;amp; then finally deploy it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7wt90i43psamzewcegl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7wt90i43psamzewcegl.png" alt="Design Process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt;: Understanding why current shopping experiences fail so many people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define&lt;/strong&gt;: Figuring out what an autonomous shopping agent actually needs to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop&lt;/strong&gt;: Building the multi-agent system that handles real conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver&lt;/strong&gt;: Launching with PWA support and continuous learning from real users.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;We used Figma extensively, focusing on voice interaction flows and accessibility patterns. Our friend &lt;a href="https://www.linkedin.com/in/praveenlodhiofficial" rel="noopener noreferrer"&gt;Praveen&lt;/a&gt; did the user testing which helped us refine how the AI responds and when it asks for clarification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CREDITS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Resources&lt;/strong&gt;: Figma Community, Web Accessibility Initiative&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt;: Lucide React, accessibility-focused icon sets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt;: Manrope and other system fonts for maximum readability&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Challenges we ran into 😤
&lt;/h3&gt;

&lt;p&gt;Building an autonomous shopping agent brought some really interesting technical challenges, especially around coordinating multiple AI services in real-time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The biggest headache was getting all our AI services to work together smoothly&lt;/strong&gt; without creating noticeable delays. We needed AssemblyAI for voice processing, Perplexity AI for product research, and OpenAI for reasoning, all of them working in harmony. &lt;strong&gt;Orchestrating these different agents while maintaining fast response times&lt;/strong&gt; required some creative prompt engineering and smart fallback strategies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Getting voice recognition accuracy right&lt;/strong&gt; across different accents and speaking styles was trickier than expected. AssemblyAI's auto-detection helped a ton, but we still had to fine-tune confidence thresholds and build intelligent fallback mechanisms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time optimization without sacrificing privacy&lt;/strong&gt; was another puzzle. We ended up doing as much processing as possible on the client side while using secure API calls for the AI services.&lt;/p&gt;

&lt;p&gt;We're really proud of creating a shopping experience that genuinely works across languages and provides intelligent optimization. The multi-agent architecture successfully handles complex shopping tasks without human intervention! :)&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

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

&lt;p&gt;Wynnie has serious potential to change how people think about online shopping. We want this to be the thing that finally makes e-commerce work for everyone, regardless of language, tech comfort, or physical abilities!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we're building next:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predictive Shopping&lt;/strong&gt;: AI that suggests things before you even ask&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Product Search&lt;/strong&gt;: Point your camera at something and find it online&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group Shopping&lt;/strong&gt;: Shop with friends and family through shared conversations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sustainability Scoring&lt;/strong&gt;: See the environmental impact of your purchases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform&lt;/strong&gt;: Native mobile apps and smart speaker integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're excited to expand language support, improve AI accuracy, and connect with more online retailers!&lt;/p&gt;

&lt;p&gt;ㅤ&lt;/p&gt;

&lt;h3&gt;
  
  
  End Notes 🙌🏻
&lt;/h3&gt;

&lt;p&gt;Huge thanks to &lt;a href="https://dev.to"&gt;DEV&lt;/a&gt; for hosting this challenge and the AssemblyAI team for excellent documentation and API design, and to the open-source community for inspiration and support! 🙌&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License ⚖️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/achal-b/wynnie/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" alt="breaker.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>assemblyaichallenge</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>Kleio — Transform Meetings into Actionable Insights ⚡</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Mon, 25 Nov 2024 07:54:48 +0000</pubDate>
      <link>https://dev.to/neilblaze/kleio-11bd</link>
      <guid>https://dev.to/neilblaze/kleio-11bd</guid>
      <description>&lt;h3&gt;
  
  
  Categories of Submission for the &lt;a href="https://dev.to/challenges/assemblyai"&gt;AssemblyAI Challenge &lt;/a&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No More Monkey Business&lt;/strong&gt; 🙈&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Really Rad Real-Time&lt;/strong&gt; 🤖&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Team 👥 : &lt;a class="mentioned-user" href="https://dev.to/neilblaze"&gt;@neilblaze&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/rds_agi"&gt;@rds_agi&lt;/a&gt;
&lt;/h3&gt;




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

&lt;p&gt;&lt;a href="https://kleio.vercel.app" rel="noopener noreferrer"&gt;&lt;strong&gt;Kleio&lt;/strong&gt;&lt;/a&gt; is a bleeding-edge SaaS AI solution that enhances your meeting experience. Our platform seamlessly integrates with your video conferencing tools to capture, analyze, and distill the essence of your meetings into clear, concise, and actionable formats ✨&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%2Fres.cloudinary.com%2Fdmlwye965%2Fimage%2Fupload%2Fv1732592902%2Fxemc9uhtg99emuncctod.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%2Fres.cloudinary.com%2Fdmlwye965%2Fimage%2Fupload%2Fv1732592902%2Fxemc9uhtg99emuncctod.png" alt="body_thumb" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it's much much more than that! Check out the video below 👇🏻&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo Video ▶️
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  App Tryout Link 🔗
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kleio&lt;/strong&gt; 👉  &lt;a href="https://kleio.vercel.app" rel="noopener noreferrer"&gt;&lt;strong&gt;kleio.vercel.app&lt;/strong&gt;&lt;/a&gt; / [Deployed on Vercel ▲]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" alt="filler" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it Work?
&lt;/h2&gt;

&lt;p&gt;Kleio operates through a browser extension that, upon user authentication and consent, integrates with Google Meet sessions to capture audio streams. The system implements dual processing: primary audio segments are stored in Cloudflare R2 Datastore and processed through AssemblyAI's speech-to-text engine, while a fallback mechanism leverages the WebSpeech API to store temporary caption snapshots in IndexDB. Real-time processing via AssemblyAI's &lt;a href="https://www.assemblyai.com/blog/lemur" rel="noopener noreferrer"&gt;&lt;strong&gt;LeMUR&lt;/strong&gt;&lt;/a&gt; generates contextual summarization, analytics, sentiments, and mindmaps, all accessible through an end-to-end encrypted Next.js dashboard built with ShadCN UI components. The dashboard enables real-time querying and converts discussions into AI-generated handwritten study notes, with all insights available immediately post-meeting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" alt="filler" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jncav5emkadxilqvsnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jncav5emkadxilqvsnx.png" alt="uxflow" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" alt="filler" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" alt="filler" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Intelligent Transcription&lt;/strong&gt; with advanced speech-to-text technology&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Meeting Summary Generation&lt;/strong&gt; highlighting key points and action items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-Click Presentation Creation&lt;/strong&gt; transforming meetings into professional slides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive Meeting Analytics&lt;/strong&gt; tracking participation, patterns, and productivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Handwritten Answer Note Generation&lt;/strong&gt; (especially useful for students)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seamless Platform Integration, supports Google Meet, MSFT Teams, and Zoom (Web)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Chrome Extension for ease of access!&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Meeting Transcript Analysis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise-Grade Security with E2E Encryption&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable Infrastructure&lt;/strong&gt; supporting meetings of all sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Insights Delivery&lt;/strong&gt; through intuitive web application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instant Collaborative Sharing of Meeting Insights&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpkl0fdx4y1voy22upud.png" alt="filler" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Target Audience 👥
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Students&lt;/li&gt;
&lt;li&gt;Business Professionals&lt;/li&gt;
&lt;li&gt;Startups&lt;/li&gt;
&lt;li&gt;Enterprise Teams&lt;/li&gt;
&lt;li&gt;Remote Workers&lt;/li&gt;
&lt;li&gt;Collaborative Teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  So, how's AssemblyAI's LeMUR being used here? 🤔
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatic transcription of audio recordings&lt;/li&gt;
&lt;li&gt;Generating context-aware answers to specific questions&lt;/li&gt;
&lt;li&gt;Supporting multiple question formats&lt;/li&gt;
&lt;li&gt;Handling predefined answer options&lt;/li&gt;
&lt;li&gt;Processing spoken data with intelligent retrieval&lt;/li&gt;
&lt;li&gt;Extracting insights from meeting transcripts&lt;/li&gt;
&lt;li&gt;Enabling Q&amp;amp;A functionality on audio content&lt;/li&gt;
&lt;li&gt;Flexible summarization of meeting discussions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Design 🎨
&lt;/h2&gt;

&lt;p&gt;We were heavily inspired by the revised version of &lt;strong&gt;Double Diamond&lt;/strong&gt; design process, a model popularized by the &lt;a href="https://www.designcouncil.org.uk/our-work/news-opinion/double-diamond-universally-accepted-depiction-design-process/" rel="noopener noreferrer"&gt;British Design Council&lt;/a&gt;, which not only includes visual design, but a full-fledged research cycle in which you must discover and define your problem before tackling your solution &amp;amp; then finally deploy it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiohh2d159njqb8stbk18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiohh2d159njqb8stbk18.png" alt="UPDATETHIS" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt;: a deep dive into the problem we are trying to solve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define&lt;/strong&gt;: synthesizing the information from the discovery phase into a problem definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop&lt;/strong&gt;: think up solutions to the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver&lt;/strong&gt;: pick the best solution and build that.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moreover, we utilized design tools like Figma &amp;amp; Photoshop to prototype our designs before doing any coding. Through this, we are able to get iterative feedback so that we spend less time re-writing code.&lt;/p&gt;




&lt;h4&gt;
  
  
  🟦 GitHub Repository: &lt;a href="https://github.com/H4CK4TH0N/kleio" rel="noopener noreferrer"&gt;https://github.com/H4CK4TH0N/kleio&lt;/a&gt;
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;To run the app locally, follow &lt;a href="https://res.cloudinary.com/dmlwye965/raw/upload/v1732594173/at7l7djcgo10xgmtvpku.md" rel="noopener noreferrer"&gt;this&lt;/a&gt; guide.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  🟦 License: &lt;a href="https://github.com/H4CK4TH0N/kleio/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;
&lt;/h4&gt;




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

&lt;p&gt;&lt;em&gt;We believe that our App has great potential&lt;/em&gt;. We just really want this project to have a positive impact on people's lives! We would love to make it more &lt;em&gt;cross-platform&lt;/em&gt; and &lt;em&gt;multilingual&lt;/em&gt; so that the user interaction increases to a great extent! &lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion 🐣
&lt;/h3&gt;

&lt;p&gt;It has been all fun, and we got to learn so many things in such a short span 🙌. Thank you #DEV #DEVCommunity &amp;amp; #AssemblyAI for hosting this hackathon! 💙&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>assemblyaichallenge</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>VisuSpeak — 𝙑𝙞𝙨𝙪𝙖𝙡𝙞𝙯𝙚 𝙩𝙤 𝙎𝙥𝙚𝙖𝙠 👀🗣️</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Mon, 24 Jun 2024 06:51:25 +0000</pubDate>
      <link>https://dev.to/neilblaze/visuspeak--24j</link>
      <guid>https://dev.to/neilblaze/visuspeak--24j</guid>
      <description>&lt;p&gt;This project has been archived!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>twiliochallenge</category>
      <category>ai</category>
      <category>twilio</category>
    </item>
    <item>
      <title>HealthifAI — 𝘚𝘦𝘢𝘮𝘭𝘦𝘴𝘴 𝘏𝘦𝘢𝘭𝘵𝘩𝘤𝘢𝘳𝘦 𝘴𝘰𝘭𝘶𝘵𝘪𝘰𝘯𝘴 𝘧𝘰𝘳 𝘗𝘳𝘰𝘷𝘪𝘥𝘦𝘳𝘴 🏥⚕️</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Mon, 20 Feb 2023 21:43:43 +0000</pubDate>
      <link>https://dev.to/neilblaze/healthifai--5ad4</link>
      <guid>https://dev.to/neilblaze/healthifai--5ad4</guid>
      <description>&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wacky Wildcard&lt;/strong&gt; 🃏&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smooth Shifters&lt;/strong&gt; 🌬️&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What we built 🤗
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HealthifAI&lt;/strong&gt; is a smart &lt;em&gt;Web application&lt;/em&gt; built to provide &lt;em&gt;Seamless Healthcare solutions for Providers&lt;/em&gt; &amp;amp; is fueled by &lt;a href="https://linode.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Linode&lt;/strong&gt;&lt;/a&gt;. 🏥⚕️&lt;/p&gt;

&lt;h4&gt;
  
  
  Creators :
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Pratyay Banerjee   (&lt;a href="https://dev.to/neilblaze"&gt;&lt;strong&gt;@neilblaze&lt;/strong&gt;&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;Subham Sahu   (&lt;a href="https://dev.to/subhamx"&gt;&lt;strong&gt;@subhamx&lt;/strong&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Inspiration 💡
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Healthcare&lt;/strong&gt; &lt;em&gt;is one of the most important and critical industries in the world&lt;/em&gt;. Providing quality medical care to patients is essential, but it is often hindered by various challenges such as overburdened healthcare workers, lack of medical devices in rural areas, and administrative stress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe104bfe8g2iegpdcodcp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe104bfe8g2iegpdcodcp.png" alt="image" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the advent of &lt;em&gt;artificial intelligence&lt;/em&gt; and &lt;em&gt;machine learning&lt;/em&gt;, the healthcare industry has a unique opportunity to tackle these challenges head-on and revolutionize the way medical care is delivered.&lt;/p&gt;

&lt;p&gt;With this as context, we plan to tackle the &lt;strong&gt;Provider Shortage &amp;amp; Burnout&lt;/strong&gt; and &lt;strong&gt;Access to Care&lt;/strong&gt; strategic themes. &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%2Fuser-images.githubusercontent.com%2F48355572%2F218312595-e9a81ade-d336-4aa4-bb21-af1a6ed2d353.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%2Fuser-images.githubusercontent.com%2F48355572%2F218312595-e9a81ade-d336-4aa4-bb21-af1a6ed2d353.png" alt="image" width="800" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;HealthifAI&lt;/em&gt; aims to tackle several key pain points in the healthcare industry — specifically for the following :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Provider Shortage &amp;amp; Burnout :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Intuitive, easy &amp;amp; safe digital patient record entry which eliminates the need for manual and legacy record entry methods.&lt;/li&gt;
&lt;li&gt;We provide an ML-powered "soft diagnosis" to save time for doctors and nurses.&lt;/li&gt;
&lt;li&gt;We have location-based COVID-19 alerts to better equip workers.&lt;/li&gt;
&lt;li&gt;Multilingual &lt;em&gt;speech-to-text&lt;/em&gt; notes, because it's easier!&lt;/li&gt;
&lt;li&gt;Reminder system to help with medication/check-ups. Keeping track of everything is hard!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr72jmemwygwcxm242hku.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr72jmemwygwcxm242hku.gif" alt="Group 30" width="600" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access to care :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multilingual communication model that transcribes speech from any language into English. This is particularly helpful in rural areas where communication is a barrier. &lt;/li&gt;
&lt;li&gt;Experimental Computer-Vision powered heart rate monitor. This transforms everyday hand-held devices into medical devices - an exciting &lt;em&gt;vision&lt;/em&gt; for the future!&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  App Tryout Link 🔗
&lt;/h3&gt;

&lt;p&gt;👉  Home : &lt;a href="https://healthifai-with.tech" rel="noopener noreferrer"&gt;&lt;strong&gt;https://healthifai-with.tech&lt;/strong&gt;&lt;/a&gt;  [Frontend deployed on Vercel ▲ &amp;amp; Backend deployed on &lt;strong&gt;Linode&lt;/strong&gt;]&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Alternate URL : &lt;a href="http://45.79.166.94/login" rel="noopener noreferrer"&gt;http://45.79.166.94&lt;/a&gt; (Hosted on Linode)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  📌 Endpoint List :
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://healthifai-with.tech/login" rel="noopener noreferrer"&gt;https://healthifai-with.tech/login&lt;/a&gt; →  &lt;strong&gt;Login page&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://healthifai-with.tech/result" rel="noopener noreferrer"&gt;https://healthifai-with.tech/result&lt;/a&gt; →  &lt;strong&gt;Bad Request (4xx)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://healthifai-with.tech/result?sym1=cough&amp;amp;sym2=itching&amp;amp;sym3=none&amp;amp;sym4=none&amp;amp;sym5=none" rel="noopener noreferrer"&gt;https://healthifai-with.tech/result?sym1=cough&amp;amp;sym2=itching&amp;amp;sym3=none&amp;amp;sym4=none&amp;amp;sym5=none&lt;/a&gt; →  &lt;strong&gt;Disease Prediction&lt;/strong&gt; [Note : Passing "none" is allowed, provied we have to pass all five symptoms. Feel free to explore list of symptoms over &lt;a href="https://www.kaggle.com/datasets/itachi9604/disease-symptom-description-dataset?select=dataset.csv" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Methods allowed : &lt;code&gt;POST&lt;/code&gt; &amp;amp; &lt;code&gt;GET&lt;/code&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6saaf1fm9za0v69hv1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6saaf1fm9za0v69hv1t.png" alt="image" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://healthifai-with.tech/transcribe" rel="noopener noreferrer"&gt;https://healthifai-with.tech/transcribe&lt;/a&gt; →  &lt;strong&gt;OpenAI Whisper Auto-Translate EN Transcription&lt;/strong&gt; [ You can view the uploaded &lt;code&gt;recdummy.mp3&lt;/code&gt; file recorded in &lt;code&gt;Hindi&lt;/code&gt; (HI) language &lt;a href="https://anonymfile.com/8pN8N/recdummy.mp3" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Methods allowed : &lt;code&gt;POST&lt;/code&gt; &amp;amp; &lt;code&gt;GET&lt;/code&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u5abxn8q0k0ch208bjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u5abxn8q0k0ch208bjh.png" alt="image" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://healthifai-with.tech/d3data?sym1=cough&amp;amp;sym2=itching&amp;amp;sym3=none&amp;amp;sym4=none&amp;amp;sym5=none" rel="noopener noreferrer"&gt;https://healthifai-with.tech/d3data?sym1=cough&amp;amp;sym2=itching&amp;amp;sym3=none&amp;amp;sym4=none&amp;amp;sym5=none&lt;/a&gt; →  &lt;strong&gt;Returns only precautions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq8fqbeh43wyifcku447.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq8fqbeh43wyifcku447.png" alt="image" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Video ▶️
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Privacy &amp;amp; Security 🔐
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HealthifAI&lt;/strong&gt; handles a wide range of &lt;em&gt;sensitive information&lt;/em&gt; as &lt;em&gt;healthcare data&lt;/em&gt;. In the wrong hands, this data could dramatically harm individuals. We took special efforts and considerations to ensure that our platform protects the privacy and sensitive information of all of our users making it &lt;strong&gt;100% GDPR compliant!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How we built it ⚙️
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HealthifAI&lt;/strong&gt; was built using &lt;strong&gt;cutting-edge AI and Machine Learning technologies&lt;/strong&gt;, including OpenAI's whisper as well as DETR (End-to-End Object Detection) model with ResNet-50 backbone. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1czh0nh4wyrhzm5dtw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1czh0nh4wyrhzm5dtw9.png" alt="image" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the disease detection part, we've used a Kaggle dataset which can be found &lt;a href="https://www.kaggle.com/datasets/itachi9604/disease-symptom-description-dataset" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Our machine learning model performs extremely well in terms of &lt;em&gt;disease prediction&lt;/em&gt; as we benchmarked an accuracy of more than 92% over a prolonged period. Based on the inference, we also return symptom severity and basic precautions in no time!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a6q2fkn5wt380w767i0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5a6q2fkn5wt380w767i0.png" alt="image" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We used the Flask framework to build a RESTful API that can handle incoming requests and return appropriate responses. For the front-end, we used &lt;em&gt;React.JS&lt;/em&gt; &amp;amp; &lt;em&gt;Tailwind&lt;/em&gt; as CSS framework. The Authentication (OAuth) has been done by &lt;em&gt;Firebase&lt;/em&gt; &amp;amp; we’re also using the &lt;em&gt;Cloudstore database&lt;/em&gt; for storing user logs. We have deployed the &lt;em&gt;front-end of our Webapp on Vercel&lt;/em&gt; &amp;amp; most importantly, &lt;em&gt;the backend is running on&lt;/em&gt; &lt;strong&gt;Linode&lt;/strong&gt;. &lt;/p&gt;

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

&lt;p&gt;The API was integrated with the Open-AI speech-to-text model "whisper" to transcribe speech from &lt;strong&gt;any&lt;/strong&gt; language into English. Further, Gaussian Naive Bayes for classification was implemented to "soft diagnose" patients based on their symptoms.  &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%2Fcdn.openai.com%2Fwhisper%2Fdraft-20220919a%2Fasr-details-desktop.svg" 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%2Fcdn.openai.com%2Fwhisper%2Fdraft-20220919a%2Fasr-details-desktop.svg" alt="image" width="1355" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're also running our custom algorithm to analyse and return the heartbeat in &lt;em&gt;realtime&lt;/em&gt; using a concept called as &lt;a href="https://www.google.com/search?q=photoplethysmography" rel="noopener noreferrer"&gt;&lt;strong&gt;photoplethysmography&lt;/strong&gt;&lt;/a&gt;, where we leverage a camera &amp;amp; with the capability of face detection, we record images of facial skin, as skin can represent changes in arterial blood volume between the systolic and diastolic phases of the cardiac cycle &amp;amp; then we return the ROI. The computer-vision powered heart rate monitor was built using image processing techniques built with OpenCV. In essence, the camera detects sensitive changes in the neck and forehead which is then used to infer heart rate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0sscg1xf4a8l4kz9apc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0sscg1xf4a8l4kz9apc.png" alt="image" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Screenshots 🖼️
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Disease Prediction&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Heartbeat Monitor&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8sng2g0v5ktg2izstw2.gif" alt="DPx" width="600" height="308"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ofoi33mr8lv7juh5vfy.gif" alt="HBx" width="720" height="370"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fuser-images.githubusercontent.com%2F48355572%2F220217321-95b04386-9c0f-463f-b787-5bd5cf339150.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%2Fuser-images.githubusercontent.com%2F48355572%2F220217321-95b04386-9c0f-463f-b787-5bd5cf339150.png" alt="image" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code 👨‍💻
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Neilblaze" rel="noopener noreferrer"&gt;
        Neilblaze
      &lt;/a&gt; / &lt;a href="https://github.com/Neilblaze/HealthifAI" rel="noopener noreferrer"&gt;
        HealthifAI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      HealthyfAI — Crafted with 💙
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/48355572/220209075-b5382401-8c5d-4492-8733-f54183ae736a.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F220209075-b5382401-8c5d-4492-8733-f54183ae736a.gif" alt="DevThumb"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Category Submission:&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wacky Wildcard&lt;/strong&gt; 🃏&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smooth Shifters&lt;/strong&gt; 🌬️&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;What we built 🤗&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;HealthifAI&lt;/strong&gt; is a smart &lt;em&gt;Web application&lt;/em&gt; built to provide &lt;em&gt;Seamless Healthcare solutions for Providers&lt;/em&gt; &amp;amp; is fueled by &lt;a href="https://linode.com" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Linode&lt;/strong&gt;&lt;/a&gt;. 🏥⚕️&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Inspiration 💡&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Healthcare&lt;/strong&gt; &lt;em&gt;is one of the most important and critical industries in the world&lt;/em&gt;. Providing quality medical care to patients is essential, but it is often hindered by various challenges such as overburdened healthcare workers, lack of medical devices in rural areas, and administrative stress.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/48355572/220201124-d1813a1f-dbba-4a3b-bf64-4308bc7f4e2b.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F220201124-d1813a1f-dbba-4a3b-bf64-4308bc7f4e2b.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With the advent of &lt;em&gt;artificial intelligence&lt;/em&gt; and &lt;em&gt;machine learning&lt;/em&gt;, the healthcare industry has a unique opportunity to tackle these challenges head-on and revolutionize the way medical care is delivered.&lt;/p&gt;
&lt;p&gt;With this as context, we plan to tackle the &lt;strong&gt;Provider Shortage &amp;amp; Burnout&lt;/strong&gt; and &lt;strong&gt;Access to Care&lt;/strong&gt; strategic themes.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/48355572/218312595-e9a81ade-d336-4aa4-bb21-af1a6ed2d353.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F218312595-e9a81ade-d336-4aa4-bb21-af1a6ed2d353.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does 🤔&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;em&gt;HealthifAI&lt;/em&gt; aims to tackle several key pain points in the healthcare industry — specifically for the following…&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/Neilblaze/HealthifAI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Permissive License ⚖️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Neilblaze/HealthifAI/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Linode?
&lt;/h3&gt;

&lt;p&gt;Building &lt;em&gt;scalable systems&lt;/em&gt; are always a tricky thing. Although our app is not serving millions of customers as of now, but as software enthusiast, &lt;em&gt;we strive to build an infinitely scalable application&lt;/em&gt;. And here &lt;em&gt;Linode&lt;/em&gt; helped us a lot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsz1ajrwtvssejh4m5uo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsz1ajrwtvssejh4m5uo.png" alt="image" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Thanks to Linode for providing us with $100 credits! 😊&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Linode is a cloud-based virtual machine service that we used to deploy the backend of our HealthifAI project. We chose Linode because it provides a reliable and scalable hosting solution for our web application, and it also offers competitive pricing. &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%2Fuser-images.githubusercontent.com%2F48355572%2F220668005-17bc65bc-0a70-4157-bc60-1090227c656d.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%2Fuser-images.githubusercontent.com%2F48355572%2F220668005-17bc65bc-0a70-4157-bc60-1090227c656d.png" alt="image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once our virtual machine was up and running, we installed and configured the necessary softwares and other tools required for our application. We also set up security measures, including firewalls and SSL certificates, to ensure that our backend was protected from potential cyber threats.&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%2Fuser-images.githubusercontent.com%2F48355572%2F220668099-379304f0-4d7d-4099-af40-e23edb3f9c4d.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%2Fuser-images.githubusercontent.com%2F48355572%2F220668099-379304f0-4d7d-4099-af40-e23edb3f9c4d.png" alt="image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linode provided us with an &lt;em&gt;easy-to-use interface to manage our virtual machine&lt;/em&gt;, including monitoring tools to track server performance and resource usage. It also allowed us to scale our resources up or down depending on the demands of our application.&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%2Fuser-images.githubusercontent.com%2F48355572%2F220668230-c70dfbfc-2f69-4e98-ae4b-ba67a9d7f61c.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%2Fuser-images.githubusercontent.com%2F48355572%2F220668230-c70dfbfc-2f69-4e98-ae4b-ba67a9d7f61c.png" alt="image" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall, using Linode allowed us to deploy a reliable and scalable backend for our HealthifAI project, without worrying about the complexities of managing our own physical servers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design 🎨
&lt;/h2&gt;

&lt;p&gt;We were heavily inspired by the revised version of &lt;strong&gt;Double Diamond&lt;/strong&gt; design process, a model popularized by the &lt;a href="https://www.designcouncil.org.uk/our-work/news-opinion/double-diamond-universally-accepted-depiction-design-process/" rel="noopener noreferrer"&gt;British Design Council&lt;/a&gt;, which not only includes visual design, but a full-fledged research cycle in which you must discover and define your problem before tackling your solution &amp;amp; then finally deploy it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falpslq96a80jz2ody83y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falpslq96a80jz2ody83y.png" alt="image" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt;: a deep dive into the problem we are trying to solve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define&lt;/strong&gt;: synthesizing the information from the discovery phase into a problem definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop&lt;/strong&gt;: think up solutions to the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver&lt;/strong&gt;: pick the best solution and build that.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moreover, we utilized design tools like Figma, Photoshop &amp;amp; Illustrator to prototype our designs before doing any coding. Through this, we are able to get iterative feedback so that we spend less time re-writing code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfe33z6dshuo071yumzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfe33z6dshuo071yumzm.png" alt="image" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Research 📚
&lt;/h3&gt;

&lt;p&gt;Research is the key to empathizing with users: we found our specific user group early and that paves the way for our whole project. Here are a few of the resources that were helpful to us —&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5801881/" rel="noopener noreferrer"&gt;What do healthcare workers spend most time on?&lt;/a&gt; | NIH&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://alumni.media.mit.edu/~djmcduff/assets/remote-physiology.html" rel="noopener noreferrer"&gt;Measuring Heart-rate through muted videos&lt;/a&gt; | MIT Media lab&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ruralhealthinfo.org/topics/healthcare-access" rel="noopener noreferrer"&gt;An overview of healthcare in rural areas&lt;/a&gt; | Rural Health Information&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ncbi.nlm.nih.gov/books/NBK538330/" rel="noopener noreferrer"&gt;Provider Burnout&lt;/a&gt; | NIH&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://optimizingruralhealth.org/communication-in-healthcare/" rel="noopener noreferrer"&gt;Communication in rural healthcare&lt;/a&gt; | Optimizing rural healthcare&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8950225/" rel="noopener noreferrer"&gt;Can we use ML to diagnose diseases?&lt;/a&gt; | NIH&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.reuters.com/article/us-braindrain-idINTRE49001E20081001" rel="noopener noreferrer"&gt;Lack of medical workers plagues developing world&lt;/a&gt; | Reuters&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linode.com/docs" rel="noopener noreferrer"&gt;Linode docs&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linode.com/docs/products/compute/compute-instances/faqs" rel="noopener noreferrer"&gt;Linode Compute Instances&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CREDITS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Resources&lt;/strong&gt; : Freepik, Behance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt; : Icons8, fontawesome&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Font&lt;/strong&gt; : Righteous / Roboto / Raleway &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Challenges we ran into 😤
&lt;/h3&gt;

&lt;p&gt;Building &lt;em&gt;HealthifAI&lt;/em&gt; was not without its challenges. One of our challenges was integrating the various AI and machine learning technologies into a cohesive and functional system. This required a deep understanding of each technology, as well as expertise in data processing and software engineering.  We participated in hourly review sessions to share findings of distributed research - our biggest challenge was sticking to tight schedules! Moreover, we also ran into troubles while deploying the backend on Linode, but thanks to it's amazing documentation, things got sorted quite quickly!  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24iv94ji3fhspc0mu3x5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F24iv94ji3fhspc0mu3x5.png" alt="image" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are proud of finishing the project on time which seemed like a tough task as we started working on it quite late due to other commitments. We were also able to add most of the features that we envisioned for the app during ideation. And as always, working overnight was pretty fun! :)&lt;/p&gt;

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

&lt;p&gt;The sky's the limit for &lt;strong&gt;HealthifAI&lt;/strong&gt;. We are already exploring new ways to improve and expand the platform, including incorporating new technologies and partnering with healthcare providers to bring our vision to a wider audience. We're committed to making a real impact in the healthcare industry and changing lives for the better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion 🐣
&lt;/h3&gt;

&lt;p&gt;That's it for now! We can't wait to see the impact that HealthifAI will have on the world. Stay tuned for updates and more exciting developments! Also, I would love to thank my project partner &lt;a class="mentioned-user" href="https://dev.to/subhamx"&gt;@subhamx&lt;/a&gt; for helping me, &amp;amp; Special thanks goes to &lt;a class="mentioned-user" href="https://dev.to/devencourt"&gt;@devencourt&lt;/a&gt; for resolving everyone's doubts! 🙌. &lt;/p&gt;

&lt;p&gt;And as always, thank you #DEV #DEVCommunity &amp;amp; #Linode for hosting this hackathon! 💚&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" alt="breaker.png" width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Binoculearn.ai — 𝘓𝘦𝘢𝘳𝘯𝘪𝘯𝘨 𝘪𝘯 𝘭𝘰𝘸-𝘣𝘢𝘯𝘥𝘸𝘪𝘥𝘵𝘩 𝘪𝘯𝘵𝘦𝘳𝘯𝘦𝘵 𝘙𝘦𝘥𝘦𝘧𝘪𝘯𝘦𝘥⚡</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Thu, 08 Dec 2022 21:47:04 +0000</pubDate>
      <link>https://dev.to/neilblaze/binoculearnai--4ld0</link>
      <guid>https://dev.to/neilblaze/binoculearnai--4ld0</guid>
      <description>&lt;h3&gt;
  
  
  Category Submission:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose Your Own Adventure&lt;/strong&gt; ⚛&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Superstar&lt;/strong&gt; ☁️&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What we built 🤔
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://binoculearn-5jjb23a4oq-ue.a.run.app" rel="noopener noreferrer"&gt;Binoculearn&lt;/a&gt;&lt;/strong&gt; is a bleeding-edge smart P2P &lt;em&gt;educational&lt;/em&gt; &lt;strong&gt;&lt;em&gt;video conferencing web application&lt;/em&gt;&lt;/strong&gt; aimed to deliver a &lt;em&gt;reliable frame rate&lt;/em&gt; &amp;amp; is backed by low-latency support along with low jitter (smooth and consistent), as well as high audio quality. We do this by &lt;em&gt;converting the video stream into ASCII characters on the client side&lt;/em&gt; and send it via &lt;em&gt;WebRTC&lt;/em&gt; using &lt;a href="https://www.twilio.com/docs/video" rel="noopener noreferrer"&gt;&lt;strong&gt;Twilio’s video conferencing service&lt;/strong&gt;&lt;/a&gt; deployed on &lt;strong&gt;&lt;a href="https://cloud.google.com/run" rel="noopener noreferrer"&gt;Google Cloud App Run ☁️&lt;/a&gt;&lt;/strong&gt; &amp;amp; is fuelled by &lt;a href="https://www.mongodb.com/atlas/database" rel="noopener noreferrer"&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt;&lt;/a&gt;! 🍃&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3v2zb4om2sdne0bc6aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3v2zb4om2sdne0bc6aa.png" alt="image" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 Implementing video conferencing using this technique &lt;em&gt;saves bandwidth bidirectionally&lt;/em&gt; &amp;amp; especially on the receiver end. This method is both &lt;em&gt;vertically&lt;/em&gt; &amp;amp; &lt;em&gt;horizontally scalable&lt;/em&gt; as we can feed more users as they enter the conference.&lt;/p&gt;

&lt;h3&gt;
  
  
  App Tryout Link 🔗
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Binoculearn.Ai&lt;/strong&gt; 👉  &lt;a href="https://binoculearn-5jjb23a4oq-ue.a.run.app" rel="noopener noreferrer"&gt;https://binoculearn-5jjb23a4oq-ue.a.run.app&lt;/a&gt; [Deployed on Google Cloud App Run ☁️]&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.amazonaws.com%2Fuploads%2Farticles%2Faq8fqbeh43wyifcku447.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faq8fqbeh43wyifcku447.png" alt="image" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Features 🎠
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;P2P lagfree video conferencing app with ultra-low bandwidth support!&lt;/li&gt;
&lt;li&gt;Bleeding-edge Image Compression Algorithm!&lt;/li&gt;
&lt;li&gt;Vertically &amp;amp; Horizontally Scaleble [Currently capped at 4, because of Twilio Credits]&lt;/li&gt;
&lt;li&gt;Twilio Live Transcription [Stored in MongoDB Atlas]&lt;/li&gt;
&lt;li&gt;P2P Messaging with Sentiment Analysis via Natural Language API!&lt;/li&gt;
&lt;li&gt;Generate Summary &amp;amp; Transcript of the meeting!&lt;/li&gt;
&lt;li&gt;File Sharing (blob) via MongoDB Atlas!&lt;/li&gt;
&lt;li&gt;User Dashboard with Previous Activity Tracker!&lt;/li&gt;
&lt;li&gt;Minimalist UI/UX powered by ReactJS &amp;amp; Tailwind CSS&lt;/li&gt;
&lt;li&gt;High Quality Multiplexed Audio!&lt;/li&gt;
&lt;li&gt;Overall Meeting Emotion Tracker&lt;/li&gt;
&lt;li&gt;MongoDB Atlas as Non-SQL DB&lt;/li&gt;
&lt;li&gt;Deployed on Google Cloud App Run&lt;/li&gt;
&lt;li&gt;Saves 💰 + Internet Data!&lt;/li&gt;
&lt;li&gt;Secure O-Auth via Firebase by Google!&lt;/li&gt;
&lt;li&gt;100% GDPR compliant &amp;amp; SEO friendly inteface!&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Video ▶️
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Privacy &amp;amp; Security 🔐
&lt;/h3&gt;

&lt;p&gt;Binoculearn deals with a wide range of &lt;em&gt;sensitive information&lt;/em&gt;. In the wrong hands, this data could dramatically harm individuals. We took special efforts and considerations to ensure that our platform protects the privacy and sensitive information of all of our users making it &lt;strong&gt;100% GDPR compliant!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We also made sure that all data is sent securely over the network. Binoculearn leverages the security benefits of &lt;em&gt;TLS&lt;/em&gt; for encryption. We also encoded all of our data using Base64 encoding. Ideally, in a future iteration, we would like to encrypt all data using a more secure method.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background 📜
&lt;/h3&gt;

&lt;p&gt;As ubiquitous and fast as the internet seems in developed countries, &lt;strong&gt;developing countries still struggle with reliable internet connections&lt;/strong&gt;. The impact of &lt;strong&gt;&lt;a href="https://msutoday.msu.edu/news/2020/poor-internet-connection-leaves-rural-students-behind" rel="noopener noreferrer"&gt;poor internet connectivity exasperate the education inequality between children from prosperous countries and children from developing countries&lt;/a&gt;&lt;/strong&gt;, because the latter cannot benefit from remote learning via video conferencing. 😔&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv02yuzrz0adi753x7hv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv02yuzrz0adi753x7hv7.png" alt="MSU News" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last year, it was found that &lt;strong&gt;millions of students&lt;/strong&gt; in the state of Odisha in India are stuck at home with no access to either internet or online education. My friend (teammate) &lt;a href="https://dev.to/subhamx"&gt;&lt;strong&gt;Subham Sahu&lt;/strong&gt;&lt;/a&gt;, an Odisha native, has had first-hand experience of interruptions during his undergraduate studies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For even those who have access to the internet, the price is premium and the bandwidth is limited. For instance, while talking to his parents in India, &lt;a href="https://dev.to/subhamx"&gt;Subham&lt;/a&gt; found that they frequently run out of their allocated 1 GB far before the allowance period, after which the bandwidth gets throttled: &lt;strong&gt;&lt;em&gt;stalled frames, choppy audio, painful delays, and eventual disconnections, and subsequent retries are a normal occurrence&lt;/em&gt;&lt;/strong&gt;, but still arguably much better than normal telephone conversations because he gets to &lt;strong&gt;&lt;em&gt;“see”&lt;/em&gt;&lt;/strong&gt; them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the heart of the problem may lack tele-infrastructure for the implementation of education on virtual platforms.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Why RGB Frames are heavy?&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why of What?&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88v30nds45y3xdmvavmk.png" alt="image" width="800" height="450"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzf6ugzwsqo6pd26ikf3o.png" alt="image" width="800" height="450"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Videos are array of images that consists of large bytes of data which packets transfer from one place to another. Using our smart algorithm, we are compressing the image and then converting it into grayscale bit images which are then transfused by ASCII characters while transmitting. 🪄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To address this problem, we propose a new approach based on the insight that &lt;em&gt;if we are willing to give up some realism or realistic rendering of faces and screens, then there is a whole new world of face and screen representations that can be derived for ultra-low bandwidth, with an acceptable quality of experience&lt;/em&gt;! 👪&lt;/p&gt;

&lt;p&gt;The proposed solution can be primarily implemented as software &lt;strong&gt;needing no change in the underlying infrastructure&lt;/strong&gt;! This would in turn be &lt;strong&gt;cheaper&lt;/strong&gt;, and &lt;em&gt;allow internet access to people that are currently being marginalized based on their &lt;a href="https://www.cnbc.com/2021/10/06/heres-why-high-speed-internet-is-so-expensive-in-the-us.html" rel="noopener noreferrer"&gt;affordability&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We aim to prioritize a &lt;em&gt;reliable frame rate with low latency and low jitter (smooth and consistent), as well as high audio quality serving the purpose of online education for the better!&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.amazonaws.com%2Fuploads%2Farticles%2Fmvejynwa4c22xv1f7dig.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvejynwa4c22xv1f7dig.gif" alt="Group-1686550957.gif" width="1280" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our goal with this platform is to connect students in poorly connected areas with highly qualified teachers in metropolitan areas and abroad to &lt;strong&gt;&lt;em&gt;facilitate Cost-Effective Stable Remote Collaboration&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;




&lt;h3&gt;
  
  
  Screenshots 🖼️
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Home Page [Before O-Auth]&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Home Page [After O-Auth]&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207170255-63bee0a9-335d-498f-9cd0-1125299c376a.png" alt="image" width="800" height="393"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207170335-104e0675-77a4-49fa-802f-70a25f30b6ba.png" alt="image" width="800" height="393"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Host a Meeting [Old / 16:9]&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Join a Meeting [Old / 16:9]&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F206564693-06c567bd-ec04-414d-a51c-365dc6e210a7.png" alt="image" width="800" height="459"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F206564807-7775e11e-128f-487e-a6c7-52f56474a9a4.png" alt="image" width="800" height="459"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Host a Meeting [New]&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Join a Meeting [New]&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207169963-edf70d20-976e-41cd-82ff-7cb76b610b72.png" alt="image" width="800" height="392"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207170102-8dbab8e2-3158-442e-b8be-cdbbe7fe47b5.png" alt="image" width="800" height="392"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;User Dashboard [New]&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Dashboard Insight [New]&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207169331-de1c1f7f-cd0e-41f2-b371-fe221dcc5dbc.png" alt="image" width="800" height="392"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F207169526-48a96216-d4f8-467d-b2a5-940abb9f5ae3.png" alt="image" width="800" height="392"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8lz7mcrya2a78itlkztl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8lz7mcrya2a78itlkztl.gif" alt="ezgif-2-2129dd4bf5" width="480" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;☝️ Final Demo done by Pratyay [Click Above]&lt;/center&gt;



&lt;h3&gt;
  
  
  Description 🦄
&lt;/h3&gt;

&lt;p&gt;Experience a &lt;em&gt;Superfast&lt;/em&gt;, &lt;em&gt;low-latency&lt;/em&gt; P2P videochat even on &lt;em&gt;ultra-low Bandwidth&lt;/em&gt; networks. Redefining the communication gap, Binoculearn is a &lt;strong&gt;MIT licensed&lt;/strong&gt; open-sourced project made for students, by the students &amp;amp; will be &lt;strong&gt;Free Forever&lt;/strong&gt;! ⚡ &lt;/p&gt;

&lt;p&gt;On top of the bandwidth-saving functionality, we also offer educational and content-moderation tools like &lt;strong&gt;Sentiment Analysis via Google Cloud's &lt;a href="https://cloud.google.com/natural-language" rel="noopener noreferrer"&gt;Natural Language API&lt;/a&gt;&lt;/strong&gt; for session chat QnA and our custom Trained ML model deployed on GCP for &lt;strong&gt;Meeting Summarization&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36hagxx8dfcpk14q236n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36hagxx8dfcpk14q236n.png" alt="image" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These features allow both the educators and students to maintain decorum in the meeting and also have follow-up material to retain information about the meeting!&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code 👨‍💻
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Neilblaze" rel="noopener noreferrer"&gt;
        Neilblaze
      &lt;/a&gt; / &lt;a href="https://github.com/Neilblaze/Binoculearn.AI" rel="noopener noreferrer"&gt;
        Binoculearn.AI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      𝘓𝘦𝘢𝘳𝘯𝘪𝘯𝘨 𝘪𝘯 𝘭𝘰𝘸-𝘣𝘢𝘯𝘥𝘸𝘪𝘥𝘵𝘩 𝘪𝘯𝘵𝘦𝘳𝘯𝘦𝘵 𝘙𝘦𝘥𝘦𝘧𝘪𝘯𝘦𝘥⚡ — Project Submission for MongoDB Atlas Hackathon'22
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/48355572/206574506-a4f3ea19-b32a-4941-91d5-8917e6b3c7ee.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F206574506-a4f3ea19-b32a-4941-91d5-8917e6b3c7ee.png" alt="thumbnail-gh"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Binoculearn.ai&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;𝘓𝘦𝘢𝘳𝘯𝘪𝘯𝘨 𝘪𝘯 𝘭𝘰𝘸-𝘣𝘢𝘯𝘥𝘸𝘪𝘥𝘵𝘩 𝘪𝘯𝘵𝘦𝘳𝘯𝘦𝘵 𝘙𝘦𝘥𝘦𝘧𝘪𝘯𝘦𝘥⚡ — Project Submission for MongoDB Atlas Hackathon'22 🍃&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Binoculearn&lt;/strong&gt; is a bleeding-edge smart P2P &lt;em&gt;educational&lt;/em&gt; &lt;em&gt;&lt;strong&gt;video conferencing web application&lt;/strong&gt;&lt;/em&gt; aimed to deliver a &lt;em&gt;reliable frame rate&lt;/em&gt; &amp;amp; is backed by low-latency support along with low jitter (smooth and consistent), as well as high audio quality. We do this by &lt;em&gt;converting the video stream into ASCII characters on the client side&lt;/em&gt; and send it via &lt;em&gt;WebRTC&lt;/em&gt; using &lt;a href="https://www.twilio.com/docs/video" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Twilio’s video conferencing service&lt;/strong&gt;&lt;/a&gt; &amp;amp; is fuelled by &lt;a href="https://www.mongodb.com/atlas/database" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt;&lt;/a&gt;! 🍃&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/48355572/206498204-02bf9689-74f3-4bb2-82a6-bf1f3c54de77.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F48355572%2F206498204-02bf9689-74f3-4bb2-82a6-bf1f3c54de77.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;💡 Implementing video conferencing using this technique &lt;em&gt;saves bandwidth bidirectionally&lt;/em&gt; &amp;amp; especially on the receiver end. This method is &lt;em&gt;horizontally scalable&lt;/em&gt; as we can feed more users as they enter the conference.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installing / Getting started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;There are two folders, where &lt;code&gt;my-app&lt;/code&gt; is for the front-end &amp;amp; &lt;code&gt;server&lt;/code&gt; is for the backend.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Setting up Dev [Make sure &lt;code&gt;.env&lt;/code&gt; is loaded with your own credentials]&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Neilblaze/Binoculearn.AI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Permissive License ⚖️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Neilblaze/Binoculearn.AI/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How we built it ⚙️
&lt;/h3&gt;

&lt;p&gt;First and foremost, it is Crafted with 💙. The whole process can be broken into the following points :-&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;➤ React.JS, Redux + Tailwind CSS on the frontend&lt;/li&gt;
&lt;li&gt;➤ Express.js, Node.js, Sockets, WebRTC, Twilio Live on the backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmb7gzh9qjt5bsi63eo53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmb7gzh9qjt5bsi63eo53.png" alt="image" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;➤ Prisma for connecting the Frontend to the MongoDB Atlas to store user Data + Logs&lt;/li&gt;
&lt;li&gt;➤ External services like Twilio, GCP Natural Language API&lt;/li&gt;
&lt;li&gt;➤ GitHub as CI/CD and Google's App Engine for Deployment [Duplicate Deployment done on Vercel]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffm1fr21we3hpfzv7d4tt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffm1fr21we3hpfzv7d4tt.png" alt="image" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;QnA model Architecture BERT:&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Summarizer Architecture&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwjakf83vyuj5nqak5c8c.png" alt="image-172.png" width="800" height="290"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiq62d7osfwysqiefulfs.png" alt="image-173.png" width="800" height="454"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;➤  &lt;strong&gt;Prisma Schema for MongoDB Atlas:&lt;/strong&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%2Fuser-images.githubusercontent.com%2F48355572%2F206562434-7e8b63d0-3c28-4460-aa89-68609e280435.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%2Fuser-images.githubusercontent.com%2F48355572%2F206562434-7e8b63d0-3c28-4460-aa89-68609e280435.png" alt="image" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➤  &lt;strong&gt;Database Deployments for MongoDB Atlas [Click Below .Gif ⬇️]:&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2F37ohk0w6fr0zrunoxe8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37ohk0w6fr0zrunoxe8x.png" alt="image" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➤  &lt;strong&gt;Data Services — MongoDB Atlas [Click Below .Gif ⬇️]:&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fvkhutgbcselgqd9pmboj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkhutgbcselgqd9pmboj.gif" alt="Recording" width="600" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➤  &lt;strong&gt;Collections — MongoDB Atlas [Binoculearn]:&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fyvd6gv1db9txtapivuii.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyvd6gv1db9txtapivuii.gif" alt="Recording2" width="720" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➤  &lt;strong&gt;Session Timeline-Chart MongoDB Atlas [Binoculearn]:&lt;/strong&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%2Fuser-images.githubusercontent.com%2F48355572%2F207320336-eadb35e7-604c-4860-aada-4fd075815993.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%2Fuser-images.githubusercontent.com%2F48355572%2F207320336-eadb35e7-604c-4860-aada-4fd075815993.png" alt="image" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;➤  &lt;strong&gt;Session Sentiment — Timeline MongoDB Atlas [Binoculearn]:&lt;/strong&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%2Fuser-images.githubusercontent.com%2F48355572%2F207328185-ee3627c1-8044-42e7-9a57-390ba53de974.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%2Fuser-images.githubusercontent.com%2F48355572%2F207328185-ee3627c1-8044-42e7-9a57-390ba53de974.png" alt="image" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why MongoDB Atlas?
&lt;/h3&gt;

&lt;p&gt;Databases are always a tricky thing, as they're stateful in nature. Although our app is not serving millions of customers, but as software enthusiast, we strive to build an infinitely scalable application. And here MongoDB Atlas helped a lot.&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%2Fuser-images.githubusercontent.com%2F48355572%2F207319379-2a1971f0-18f3-4b27-aa6c-879a649461cc.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%2Fuser-images.githubusercontent.com%2F48355572%2F207319379-2a1971f0-18f3-4b27-aa6c-879a649461cc.png" alt="image" width="800" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We didn't have to manage the database, no need to work on complex networking between shards, etc. (And thanks to Google Cloud Run, our server can scale too. Hopefully this app gets viral and we're able to cater a million real users! 😊)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;We used MongoDB as our primary database to store user sessions, meeting details, user socket IDs (which powers our real-time websockets engine), etc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We're also &lt;strong&gt;generating summary of the meeting&lt;/strong&gt;, and instead of generating in an synchronous flow, &lt;strong&gt;we're using MongoDB realm to have a serverless function hosted to generate the summary&lt;/strong&gt;. In this way, we're able to keep the app more cohesive! 🙂&lt;/p&gt;

&lt;p&gt;We learnt a lot of things including most of the &lt;strong&gt;MongoDB Realm&lt;/strong&gt;, and many of the features of &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;. &lt;em&gt;Data modelling&lt;/em&gt; in MongoDB was &lt;strong&gt;bit tricky&lt;/strong&gt;, &lt;em&gt;as both Neel and I come from transitional relational database space&lt;/em&gt;. &lt;strong&gt;We together studied few of the video lectures from MongoDB University to understand the anti patterns and in-depth data modelling in MongoDB.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apart from MongoDB we learnt about Google App Engine, Cloud run, and Cloud build. 🌟&lt;/p&gt;




&lt;h2&gt;
  
  
  Design 🎨
&lt;/h2&gt;

&lt;p&gt;We were heavily inspired by the revised version of &lt;strong&gt;Double Diamond&lt;/strong&gt; design process, a model popularized by the &lt;a href="https://www.designcouncil.org.uk/our-work/news-opinion/double-diamond-universally-accepted-depiction-design-process/" rel="noopener noreferrer"&gt;British Design Council&lt;/a&gt;, which not only includes visual design, but a full-fledged research cycle in which you must discover and define your problem before tackling your solution &amp;amp; then finally deploy it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4uox0rfpknebvz16g3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4uox0rfpknebvz16g3z.png" alt="UPDATETHIS" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Discover&lt;/strong&gt;: a deep dive into the problem we are trying to solve.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define&lt;/strong&gt;: synthesizing the information from the discovery phase into a problem definition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Develop&lt;/strong&gt;: think up solutions to the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver&lt;/strong&gt;: pick the best solution and build that.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Moreover, we utilized design tools like Figma, Photoshop &amp;amp; Illustrator to prototype our designs before doing any coding. Through this, we are able to get iterative feedback so that we spend less time re-writing code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr8blp86gbqayw9t7vdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdr8blp86gbqayw9t7vdn.png" alt="image-178.png" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Research 📚
&lt;/h1&gt;

&lt;p&gt;Research is the key to empathizing with users: we found our specific user group early and that paves the way for our whole project. Here are a few of the resources that were helpful to us —&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://msutoday.msu.edu/news/2020/poor-internet-connection-leaves-rural-students-behind" rel="noopener noreferrer"&gt;https://msutoday.msu.edu/news/2020/poor-internet-connection-leaves-rural-students-behind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theguardian.com/technology/2021/nov/30/more-than-a-third-of-worlds-population-has-never-used-the-internet-says-un" rel="noopener noreferrer"&gt;https://www.theguardian.com/technology/2021/nov/30/more-than-a-third-of-worlds-population-has-never-used-the-internet-says-un&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bit.ly/3UCmir3" rel="noopener noreferrer"&gt;https://bit.ly/3UCmir3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://towardsdatascience.com/video-calling-for-billions-without-internet-40d10069c464" rel="noopener noreferrer"&gt;https://towardsdatascience.com/video-calling-for-billions-without-internet-40d10069c464&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.retrium.com/blog/dont-let-slow-internet-connections-ruin-your-retrospectives" rel="noopener noreferrer"&gt;https://www.retrium.com/blog/dont-let-slow-internet-connections-ruin-your-retrospectives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.statista.com/chart/17247/the-average-cost-of-mobile-data-in-selected-countries/" rel="noopener noreferrer"&gt;https://www.statista.com/chart/17247/the-average-cost-of-mobile-data-in-selected-countries/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.broadbandsearch.net/blog/internet-statistics" rel="noopener noreferrer"&gt;https://www.broadbandsearch.net/blog/internet-statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.speechly.com/blog/create-a-webrtc-video-chat-app-with-speechly-transcription" rel="noopener noreferrer"&gt;https://www.speechly.com/blog/create-a-webrtc-video-chat-app-with-speechly-transcription&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://aclanthology.org/2020.lrec-1.825.pdf" rel="noopener noreferrer"&gt;https://aclanthology.org/2020.lrec-1.825.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.currentscience.ac.in/Volumes/110/01/0069.pdf" rel="noopener noreferrer"&gt;https://www.currentscience.ac.in/Volumes/110/01/0069.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prisma Docs : &lt;a href="https://www.prisma.io/docs/guides/database/using-prisma-with-mongodb" rel="noopener noreferrer"&gt;https://www.prisma.io/docs/guides/database/using-prisma-with-mongodb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Atlas Docs : &lt;a href="https://www.mongodb.com/docs/atlas" rel="noopener noreferrer"&gt;https://www.mongodb.com/docs/atlas&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GCP Natural Language API with MongoDB Atlas : &lt;a href="https://youtu.be/4DoU32EHC8c?t=3131" rel="noopener noreferrer"&gt;https://youtu.be/4DoU32EHC8c?t=3131&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ReactJS Docs : &lt;a href="https://reactjs.org/docs/getting-started.html" rel="noopener noreferrer"&gt;https://reactjs.org/docs/getting-started.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iimskills.com/the-future-of-online-education-in-india" rel="noopener noreferrer"&gt;https://iimskills.com/the-future-of-online-education-in-india&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ucf.edu/online/leadership-management/news/why-the-future-of-learning-is-digital-and-for-everyone" rel="noopener noreferrer"&gt;https://www.ucf.edu/online/leadership-management/news/why-the-future-of-learning-is-digital-and-for-everyone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CREDITS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design Resources&lt;/strong&gt; : Freepik, Behance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons&lt;/strong&gt; : Icons8, fontawesome&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Font&lt;/strong&gt; : Urbanist / Roboto / Raleway &lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Challenges we ran into 😤
&lt;/h3&gt;

&lt;p&gt;This project was initially built in &lt;a href="https://devpost.com/software/binoculearn" rel="noopener noreferrer"&gt;&lt;em&gt;under 24 hours&lt;/em&gt;, 19th Nov — 20th Nov, 2022&lt;/a&gt; &amp;amp; I actually got to know about &lt;a href="https://dev.to/devteam/announcing-the-mongodb-atlas-hackathon-2022-on-dev-2107"&gt;the MongoDB Atlas hackathon&lt;/a&gt; from &lt;a href="https://dev.to/subhamx"&gt;&lt;strong&gt;Subham&lt;/strong&gt;&lt;/a&gt; on 20th of November, 2022 (IST time) when we were eagerly waiting for &lt;a href="https://metrohacks.dev/" rel="noopener noreferrer"&gt;MetroHack&lt;/a&gt;'s result. Personally, I'm a Hackathon freak. I love hackathons because it helps to generate specific ideas in a distinct domain within a small span of time &amp;amp; as a result, it not only increases the creativity but also enhances the curiosity while tackling corner cases while building the project/product. Since then, we kept committing towards this project. We [I, Subham &amp;amp; Gaurang] did face some challenges during the hackathon, many of which ironically related to working remotely. One of the major challenges was the time difference. All of us participated from different time zones, which created communication challenges.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One of the biggest challenge we faced was with deployment.&lt;/strong&gt; Since our application has a &lt;em&gt;web socket&lt;/em&gt; endpoint, we had very few deployment options. We initially thought that App Engine standard environment would serve the purpose, but in the end realised that it doesn't support Websockets. Finally we had to migrate our deployment stack to Google Cloud Run, which provided us the flexibility of environment and also allowed to use web sockets.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnrhsqvii2hg3f54yu8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnrhsqvii2hg3f54yu8a.png" alt="image" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are proud of finishing the project on time which seemed like a tough task as we started working on it quite late due to other commitments. We were also able to add most of the features that we envisioned for the app during ideation. And as always, working overnight was pretty fun! :)&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;We believe that our App has great potential&lt;/em&gt;. We just really want this project to have a positive impact on people's lives! We would love to make it more &lt;em&gt;scalable&lt;/em&gt; &amp;amp; &lt;em&gt;cross-platform&lt;/em&gt; so that the user interaction increases to a great extent! Also, it's noted that we do have a bunch of ideas in our bucket-list which we are looking forward to transform into reality!&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion 🐣
&lt;/h3&gt;

&lt;p&gt;It has been all fun, &amp;amp; I would love to thank my buddies &lt;a class="mentioned-user" href="https://dev.to/subhamx"&gt;@subhamx&lt;/a&gt; &amp;amp; &lt;a href="https://www.gaurang-ruparelia.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Gaurang&lt;/strong&gt;&lt;/a&gt; for helping me, &amp;amp; Special thanks goes to &lt;a class="mentioned-user" href="https://dev.to/stanimiravlaeva"&gt;@stanimiravlaeva&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/mlynn"&gt;@mlynn&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/joel__lord"&gt;@joel__lord&lt;/a&gt; 🙌. And as always, thank you #DEV #DEVCommunity &amp;amp; #MongoDB for hosting this hackathon! 💚&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [13/12/2022] ⚠️ — Few days ago, we ran out of credits, hence API credentials had been revoked! You can run the same on your local, hence, use your own credentials. But recently, we re-deployed it via Google Cloud Run, so hopefully you can explore our live-app at — &lt;a href="https://binoculearn-5jjb23a4oq-ue.a.run.app/" rel="noopener noreferrer"&gt;https://binoculearn-5jjb23a4oq-ue.a.run.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update [15/12/2022] ⚠️ — Replaced Old Demo Video with &lt;a href="https://youtu.be/OCoe5Dilt44" rel="noopener noreferrer"&gt;New&lt;/a&gt; one!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohy7k856tgac9wp6yhf8.png" alt="breaker.png" width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>career</category>
    </item>
    <item>
      <title>Who-of-us? — Find else he'll escape 😉</title>
      <dc:creator>Pratyay Banerjee</dc:creator>
      <pubDate>Sun, 10 Jan 2021 12:10:28 +0000</pubDate>
      <link>https://dev.to/neilblaze/who-of-us-find-him-else-he-ll-escape-1plp</link>
      <guid>https://dev.to/neilblaze/who-of-us-find-him-else-he-ll-escape-1plp</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Whoofus is a sleuth game based on &lt;em&gt;phaser js&lt;/em&gt;, where the crux of the matter is that you need to be at utmost alert to find out the killer!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Immersive yourself as a &lt;strong&gt;Detective&lt;/strong&gt;, &amp;amp; solve the mystery to find out &lt;em&gt;who of us&lt;/em&gt; did it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqxozom1pdrihtizixzfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqxozom1pdrihtizixzfr.png" alt="Whoofus" width="600" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission: &lt;strong&gt;Random Roulette&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;Whoofus is deployed on both DigitalOcean &amp;amp; Vercel. The game can be played at,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whoofus ~ DigitalOcean ➟ &lt;a href="https://whoofus-qahgs.ondigitalocean.app" rel="noopener noreferrer"&gt;&lt;strong&gt;Play Here&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Whoofus ~ Vercel ➟ &lt;a href="https://whoof.us" rel="noopener noreferrer"&gt;&lt;strong&gt;Play Here&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gameplay Demo :- &lt;a href="https://youtu.be/x7WqmYT5tLc" rel="noopener noreferrer"&gt;https://youtu.be/x7WqmYT5tLc&lt;/a&gt;
&lt;/h4&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;br&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.amazonaws.com%2Fi%2Fbnyh7hd9ernew2h1nwty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbnyh7hd9ernew2h1nwty.png" alt="Alt Text" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Homepage&lt;/center&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7gezrelyxuzuv11uzoog.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7gezrelyxuzuv11uzoog.jpg" alt="Alt Text" width="573" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;The main map&lt;/center&gt;

&lt;p&gt;&lt;br&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.amazonaws.com%2Fi%2Fsu2vz1if6vq5997amo72.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsu2vz1if6vq5997amo72.gif" alt="Alt Text" width="404" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;center&gt;Game Demo&lt;/center&gt;



&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;As previously mentioned, &lt;em&gt;Whoofus&lt;/em&gt; is a single-player TPF (Third person View) sluth game based on phaser js, where the crux of the matter is that &lt;strong&gt;you need to be at utmost alert to find out the killer!&lt;/strong&gt; Immersive yourself as a Detective, &amp;amp; solve the mystery to find out who did it! There are 8 characters roaming about this map, moving about. There are walkways and pathways in which they can meet one another. When they meet, one of them can either kill the other one, or they could just pass by each other. When there is a murder, as a detective, your task is to find out who is the murderer of that specific dead body. And also not to mention, we also added some Easter Eggs inside this game! 😉&lt;/p&gt;

&lt;p&gt;Whoofus runs on both on PC &amp;amp; mobile directly on the browser (on Canvas), although it's always recommended to play on PC for much better experience! ✨&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Github Repository : &lt;a href="https://github.com/Neilblaze/Whoofus" rel="noopener noreferrer"&gt;https://github.com/Neilblaze/Whoofus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Neilblaze/Whoofus/commit/0501f2725419d10b556fdaa5638d0b23f01d424d" rel="noopener noreferrer"&gt;Initial commit&lt;/a&gt; - 12th Dec'2020&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;➤ Whoofus is registered under &lt;a href="https://github.com/Neilblaze/Whoofus/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache License 2.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;It all started with a detective themed hackathon on 12th Dec'20. Personally, I'm a Hackathon freak. I love hackathons because it helps to generate specific ideas in a distinct domain within a small very period of time &amp;amp; as a result, it not only increases the creativity but also enhances the curiosity while tackling corner cases while building the project/product. Unfortunately, we couldn't finish making &lt;em&gt;Whoofus&lt;/em&gt; during the hackathon (since my exams were going on then) but now, it's ready to play! :D&lt;/p&gt;

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

&lt;p&gt;We used the following tech stacks for building our project,&lt;/p&gt;

&lt;p&gt;➤ &lt;a href="https://phaser.io" rel="noopener noreferrer"&gt;Phaser Js&lt;/a&gt;&lt;br&gt;
➤ &lt;a href="https://vuejs.org" rel="noopener noreferrer"&gt;Vue.js&lt;/a&gt;&lt;br&gt;
➤ Vanilla Javascript&lt;br&gt;
➤ HTML&lt;br&gt;
➤ &lt;a href="https://getbootstrap.com" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt;&lt;br&gt;
➤ &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt;&lt;br&gt;
➤ &lt;a href="https://jquery.com" rel="noopener noreferrer"&gt;jQuery&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenges we ran into
&lt;/h4&gt;

&lt;p&gt;We weren't that much expert in phaser js. So, we had a lot of issues to set up the map and push those characters into the same. But with the same side, the documentation of phaser is just awesome as it provides lots of materials to get started! The game engine works on Vue.js, which wasn't a piece of cake for all of us since most of us prefer working in React.js. Also, it was a bit difficult for us to collaborate in a virtual setting but we somehow managed to finish the project on time.&lt;/p&gt;

&lt;h4&gt;
  
  
  What we learned?
&lt;/h4&gt;

&lt;p&gt;A lot of things, both summed up in technical &amp;amp; non-technical sides. For the technical side, we got to learn so much about configuring the game engine which is entirely written on phaser.js. We also gained some UI/UX skills while one of us was busy building the frontend side of the project. Not to mention, Stackoverflow was the gem for us while we're troubleshooting some complicated issues.&lt;/p&gt;

&lt;p&gt;Coming to the deployment part, I've been deploying apps to DigitalOcean since Hacktoberfest'19 😉&lt;br&gt;
And I can fairly say, it's very easy to deploy apps over there specifically using DigitalOcean App Platform! For newbies, this &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-deploy-a-static-website-to-the-cloud-with-digitalocean-app-platform" rel="noopener noreferrer"&gt;guide&lt;/a&gt; from DO will get them started!&lt;br&gt;
Also not to mention, the same instance is also being deployed via &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; as mentioned above.&lt;/p&gt;

&lt;h4&gt;
  
  
  What's next for Whoofus
&lt;/h4&gt;

&lt;p&gt;We're going to go through many changes &amp;amp; planning to add the following updates to the project in the future,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve the UI of the game.&lt;/li&gt;
&lt;li&gt;Add more characters (Currently 8 characters available)&lt;/li&gt;
&lt;li&gt;Add multiplayer feature (on Socket.io)&lt;/li&gt;
&lt;li&gt;Live Chat support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whoofus can be further developed to add more features to make it more attractive &amp;amp; fluidic on every device! This would include some research work which we are planning to undergo soon!&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://phaser.io/docs" rel="noopener noreferrer"&gt;Phaser Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://phaser.io/docs" rel="noopener noreferrer"&gt;Vuejs Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;It has been all fun, &amp;amp; I would love to thank my friend &lt;a href="https://sandipan.dev" rel="noopener noreferrer"&gt;Sandipan&lt;/a&gt; for helping me, &amp;amp; as always, thank you #DEV #DEVCommunity &amp;amp; DigitalOcean for hosting this hackathon! ❤️&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>gamedev</category>
      <category>phaserjs</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
