<?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: Utkarsh Mishra</title>
    <description>The latest articles on DEV Community by Utkarsh Mishra (@bluestars).</description>
    <link>https://dev.to/bluestars</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg</url>
      <title>DEV Community: Utkarsh Mishra</title>
      <link>https://dev.to/bluestars</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bluestars"/>
    <language>en</language>
    <item>
      <title>Lets goo! Had to pull an all nighter to get this submission done before deadline. Finished with exams , got sick. Had only 24h to build something. Somehow figured out what to build and how to build. Check out POT - PeopleOfdPast</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Sun, 01 Nov 2026 04:23:45 +0000</pubDate>
      <link>https://dev.to/bluestars/lets-goo-had-to-pull-an-all-nighter-to-get-this-submission-done-before-deadline-finished-with-58kc</link>
      <guid>https://dev.to/bluestars/lets-goo-had-to-pull-an-all-nighter-to-get-this-submission-done-before-deadline-finished-with-58kc</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el" class="crayons-story__hidden-navigation-link"&gt;It's time to come back to the POT - PeopleOfdPast&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/zwuG8uBSCRQ" title="It's time to come back to the POT - PeopleOfdPast"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/bluestars" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" alt="bluestars profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/bluestars" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Utkarsh Mishra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Utkarsh Mishra
                
                
              
              &lt;div id="story-author-preview-content-4955776" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/bluestars" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Utkarsh Mishra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 1&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el" id="article-link-4955776"&gt;
          It's time to come back to the POT - PeopleOfdPast
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            18 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

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

&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>It's time to come back to the POT - PeopleOfdPast</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Sun, 01 Nov 2026 04:15:09 +0000</pubDate>
      <link>https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el</link>
      <guid>https://dev.to/bluestars/its-time-to-come-back-to-the-pot-peopleofdpast-29el</guid>
      <description>&lt;h1&gt;
  
  
  Welcome to the POT 👻
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ⚠️ A small note before trying the live demo
&lt;/h3&gt;

&lt;p&gt;I'm hosting the application on &lt;strong&gt;Render's free tier&lt;/strong&gt;, so there's one little thing to keep in mind.&lt;/p&gt;

&lt;p&gt;If the demo hasn't received any traffic for a while, the &lt;strong&gt;backend service may have gone to sleep&lt;/strong&gt;. The first request can take a little longer while Render wakes it up.&lt;/p&gt;

&lt;p&gt;So, if the application appears to be loading or the first API request takes time, &lt;strong&gt;please give it a moment before refreshing the page.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a &lt;strong&gt;free-tier cold start&lt;/strong&gt;, not necessarily a broken demo. :)&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Building People of the Past for Hacktoberfest Open Source AI Challenge — Week 4: Ghost in the Machine&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Every time I thought I had figured out the AI part of this project, &lt;strong&gt;the problem moved one layer deeper.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, I needed a model that could hold a conversation. Then I realised &lt;strong&gt;a conversation without memory was just another chatbot.&lt;/strong&gt; Once I started building memory, I had to think about retrieval, context, identity, privacy, and what happens when the AI confidently says something that was never actually told to it.&lt;/p&gt;

&lt;p&gt;And somewhere in between, a modal decided it wanted to live in the top-left corner of the screen. :)&lt;/p&gt;

&lt;p&gt;This is the story of building &lt;strong&gt;People of the Past (POT)&lt;/strong&gt;: the decisions that shaped it, the things that broke, the experiments that didn't go as planned, and the architecture I ended up with.&lt;/p&gt;




&lt;h2&gt;
  
  
  01. What did I build?
&lt;/h2&gt;

&lt;p&gt;People of the Past started with a simple idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we could have meaningful conversations with people from the past, while preserving the memories and stories that make those people special?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I eventually split that idea into &lt;strong&gt;two experiences.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://youtu.be/zwuG8uBSCRQ" rel="noopener noreferrer"&gt;https://youtu.be/zwuG8uBSCRQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/utkarsh-g19/PeopleOfdPast" rel="noopener noreferrer"&gt;https://github.com/utkarsh-g19/PeopleOfdPast&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosted on Render:&lt;/strong&gt; &lt;a href="https://people-of-the-past-web.onrender.com/" rel="noopener noreferrer"&gt;https://people-of-the-past-web.onrender.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hacktoberfest Challenge:&lt;/strong&gt; Open Source AI Challenge — Week 4: Ghost in the Machine&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👻 Ghost Gallery — conversations with people from history
&lt;/h3&gt;

&lt;p&gt;Ghost Gallery lets users explore conversations with &lt;strong&gt;notable historical figures.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The challenge here isn't simply making an AI imitate a historical personality. &lt;strong&gt;A convincing response that invents historical facts is not a good response.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted the experience to be informed by &lt;strong&gt;historical profiles and source details&lt;/strong&gt;, rather than relying entirely on whatever the model happens to know.&lt;/p&gt;

&lt;p&gt;The historical profiles are stored separately from private TYLO companions. That distinction matters: &lt;strong&gt;historical information and personal family memories have very different privacy and grounding requirements.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgotz73rxzypdtows843.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgotz73rxzypdtows843.png" alt=" " width="621" height="290"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb82pcdriukr7hwzc3t49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb82pcdriukr7hwzc3t49.png" alt=" " width="605" height="572"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbh82gxtidrujgec8isl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwbh82gxtidrujgec8isl.png" alt=" " width="556" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ❤️ TYLO — Talk to Your Loved Ones
&lt;/h3&gt;

&lt;p&gt;TYLO is the more personal side of the project.&lt;/p&gt;

&lt;p&gt;It allows someone to create an &lt;strong&gt;AI memory companion&lt;/strong&gt; using information they provide about a loved one who has passed away.&lt;/p&gt;

&lt;p&gt;Instead of asking users to write one enormous prompt, I built a &lt;strong&gt;structured profile&lt;/strong&gt; that captures different dimensions of a person's life:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;Information collected&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Their life&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Life stages, relationship, family and friends, important dates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Their personality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nature, nicknames, speaking style, favourite phrases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your shared world&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Special moments, stories, routines, interests and hobbies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What they believed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Values, likes and dislikes, lessons and advice&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A profile also includes a &lt;strong&gt;photograph and an introduction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is to give the system more than a name and a generic personality description. It needs the little details: &lt;strong&gt;the nickname, the familiar phrase, the Christmas tradition, the way someone approached a difficult day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those details are what make a memory personal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One distinction I want to make very clear:&lt;/strong&gt; TYLO does not bring someone back, and it does not recreate their actual consciousness. It generates conversations using information and memories supplied by the user. &lt;strong&gt;It is a space for remembrance, not a replacement for the person.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jcc111d3cpgo3ooaru4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jcc111d3cpgo3ooaru4.png" alt=" " width="800" height="567"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rj311tpt7nhbevc1306.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rj311tpt7nhbevc1306.png" alt=" " width="799" height="541"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foigpjgupp86lbeqg9oyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foigpjgupp86lbeqg9oyg.png" alt=" " width="800" height="554"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpzxwslffu3whoxitfyvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpzxwslffu3whoxitfyvj.png" alt=" " width="800" height="565"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ou3sqrlh5dy6o8ebsbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ou3sqrlh5dy6o8ebsbt.png" alt=" " width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  02. The first big realisation: a prompt is not a memory system
&lt;/h2&gt;

&lt;p&gt;My earliest instinct was to think about the model first.&lt;/p&gt;

&lt;p&gt;Which model should I use? How should I write the system prompt? How do I make the responses sound natural?&lt;/p&gt;

&lt;p&gt;But I eventually ran into a much more important problem.&lt;/p&gt;

&lt;p&gt;Imagine someone creates a companion and tells it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their grandmother was always positive.&lt;/li&gt;
&lt;li&gt;She loved being around people.&lt;/li&gt;
&lt;li&gt;She had a particular nickname for them.&lt;/li&gt;
&lt;li&gt;Every Christmas, the family had a special tradition.&lt;/li&gt;
&lt;li&gt;She would often say, "Oh, come on, we will get it done."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine the user returns after several conversations and asks about that Christmas tradition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A model that only sees the latest message has no reliable way of recalling it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sending every piece of profile information and the entire conversation on every request is not a sensible long-term solution either. &lt;strong&gt;Context needs to be selected.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where the &lt;strong&gt;TYLO memory architecture&lt;/strong&gt; became the centre of the project.&lt;/p&gt;

&lt;p&gt;I stopped thinking of TYLO as simply a chatbot with a personality prompt. I started treating it as a system with several sources of context:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The companion's profile.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recent conversation history.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saved memories and the companion summary.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relevant older conversation exchanges retrieved through vector search.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model generates the response. &lt;strong&gt;The memory system decides what information the model gets to work with.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That separation changed how I approached the backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  03. How TYLO remembers: the actual memory architecture
&lt;/h2&gt;

&lt;p&gt;This is the current architecture behind a TYLO message.&lt;/p&gt;

&lt;h3&gt;
  
  
  The database structure
&lt;/h3&gt;

&lt;p&gt;I'm using &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; for both the application data and the vector retrieval layer.&lt;/p&gt;

&lt;p&gt;The main collections are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Collection&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;personas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Published historical profiles and their source details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;companions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TYLO profiles, saved memories and summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tylomessages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persisted TYLO conversation messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tylomemories&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conversation exchanges and their 768-dimensional embeddings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The distinction between &lt;code&gt;tylomessages&lt;/code&gt; and &lt;code&gt;tylomemories&lt;/code&gt; is intentional.&lt;/p&gt;

&lt;p&gt;The message collection stores the conversation history. The memory collection provides a &lt;strong&gt;retrieval-oriented representation&lt;/strong&gt; of conversation exchanges, including their embeddings.&lt;/p&gt;

&lt;p&gt;This allows the application to maintain recent conversational context while also looking for &lt;strong&gt;older, semantically relevant exchanges.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Embeddings and Atlas Vector Search
&lt;/h3&gt;

&lt;p&gt;When a user sends a message, the API creates an &lt;strong&gt;embedding for the question.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The expected embedding size in this implementation is &lt;strong&gt;768 dimensions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That vector is used to query the MongoDB Atlas Vector Search index:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tylo_memory_vector_index&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The current retrieval configuration is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector index&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tylo_memory_vector_index&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expected vector dimensions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;768&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Candidate documents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Relevant exchanges returned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Up to 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ownership filters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ownerSub&lt;/code&gt; and &lt;code&gt;companionId&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model compatibility filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;embeddingModel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why retrieve 50 candidates if we only need up to four?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea is to search a wider candidate set and then provide a smaller, relevant selection to the generation step. &lt;strong&gt;The model doesn't need fifty old exchanges in its prompt. It needs the few that are useful for the current message.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is also an important reason for filtering on &lt;code&gt;embeddingModel&lt;/code&gt;: vectors generated by different embedding models should not be casually treated as interchangeable. &lt;strong&gt;Retrieval needs to respect the embedding model used to create the stored vectors.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually enters the model's context?
&lt;/h3&gt;

&lt;p&gt;This is the part I wanted to make explicit because it is easy to say "we use vector search" without explaining what happens after the search.&lt;/p&gt;

&lt;p&gt;For a typical TYLO message, the context is assembled from:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context source&lt;/th&gt;
&lt;th&gt;Maximum included&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Companion profile&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relevant profile information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recent conversation history&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Latest 8 message records&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Saved memories&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Up to 3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Companion summary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Current summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retrieved conversation exchanges&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Up to 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The result is a &lt;strong&gt;bounded context assembled from several sources&lt;/strong&gt;, rather than blindly sending the entire conversation.&lt;/p&gt;

&lt;p&gt;The memory retrieval step also has a fallback.&lt;/p&gt;

&lt;p&gt;If vector retrieval fails, the API logs the failure and continues with the companion profile and recent conversation history.&lt;/p&gt;

&lt;p&gt;That doesn't magically make missing memories available. It does, however, &lt;strong&gt;prevent a retrieval failure from automatically turning into a completely failed conversation.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjksaf9z7it8znbsjjvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvjksaf9z7it8znbsjjvc.png" alt=" " width="662" height="385"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fccbban32agqsibitsvmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fccbban32agqsibitsvmh.png" alt=" " width="640" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important part is that &lt;strong&gt;memory creation and memory retrieval are separate stages.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A conversation exchange can be persisted first and processed for embedding in the background. On a later message, that exchange can become a candidate for semantic retrieval.&lt;/p&gt;

&lt;p&gt;This is the foundation of &lt;strong&gt;TYLO's longer-term memory behaviour.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  04. Why Auth0? Because TYLO is not an ordinary chatbot.
&lt;/h2&gt;

&lt;p&gt;This was one partner decision I didn't want to treat as just another item in the technology stack.&lt;/p&gt;

&lt;p&gt;Ghost Gallery deals with published historical information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TYLO is different.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A user could upload a photograph of a loved one, describe their family relationships, share private experiences, explain personal traditions, and write down memories they may never have shared publicly.&lt;/p&gt;

&lt;p&gt;That information deserves a &lt;strong&gt;proper identity and access-control layer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I chose &lt;strong&gt;Auth0&lt;/strong&gt; because I needed to establish who was making a request before the API accessed their private companion data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the integration does
&lt;/h3&gt;

&lt;p&gt;On the frontend, I'm using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@auth0/auth0-react&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;On the Express API, token validation is handled using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;express-oauth2-jwt-bearer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user authenticates through Auth0.&lt;/li&gt;
&lt;li&gt;The frontend sends an Auth0 access token with a protected TYLO API request.&lt;/li&gt;
&lt;li&gt;The Express API validates the token's issuer and audience.&lt;/li&gt;
&lt;li&gt;The API reads the authenticated user's subject.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Companion and memory access is scoped to that identity.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is especially important for vector search.&lt;/p&gt;

&lt;p&gt;Consider two users who have both created a companion profile for their grandmother. Their memories might contain similar words, names, family relationships or traditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A semantic search that ignores ownership could return a memory belonging to the wrong user.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is unacceptable for TYLO.&lt;/p&gt;

&lt;p&gt;The vector retrieval query is therefore scoped using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ownerSub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;companionId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;embeddingModel&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The ownership identity must come from the validated token&lt;/strong&gt;, not from an arbitrary user identifier supplied by the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Auth0 does not automatically do
&lt;/h3&gt;

&lt;p&gt;I also want to be precise about the security claims.&lt;/p&gt;

&lt;p&gt;Auth0 establishes and verifies identity and gives the API a trusted identity context. &lt;strong&gt;It does not automatically encrypt every MongoDB record, enforce every database filter, or make the application end-to-end encrypted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those responsibilities still belong to the application's backend, database configuration and data-handling design.&lt;/p&gt;

&lt;p&gt;I have also not claimed to implement Auth0's more advanced AI-agent capabilities such as Token Vault, asynchronous authorization or fine-grained authorization unless those features are actually integrated.&lt;/p&gt;

&lt;p&gt;For this project, the implemented value is the &lt;strong&gt;identity and protected API layer around private AI conversations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is why Auth0 mattered to the architecture rather than simply being another login button.&lt;/p&gt;




&lt;h2&gt;
  
  
  05. Choosing Gemma: my laptop had an opinion too.
&lt;/h2&gt;

&lt;p&gt;Now for the model side.&lt;/p&gt;

&lt;p&gt;I wanted to experiment with &lt;strong&gt;open-weight models&lt;/strong&gt; and run local inference during development. Ollama made it straightforward to pull a model and connect it to the application.&lt;/p&gt;

&lt;p&gt;Then I met the less exciting part of local AI development:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware limitations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I experimented with different local model options, but my laptop's available RAM made larger models uncomfortable to work with. I needed something practical enough to test repeatedly, not a model that turned every experiment into a hardware-management exercise.&lt;/p&gt;

&lt;p&gt;I settled on experimenting with &lt;strong&gt;Gemma through Ollama&lt;/strong&gt;, including the &lt;code&gt;gemma4:e2b&lt;/code&gt; model.&lt;/p&gt;

&lt;p&gt;It wasn't about declaring one model universally better than everything else. It was about finding a practical model that allowed me to keep building and testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model was only half the work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;I did not fine-tune Gemma or retrain its weights.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The improvements I worked on were at the application level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Refining the instructions&lt;/strong&gt; given to the model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supplying relevant companion profile information.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selecting recent conversation context.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieving older exchanges through vector search.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Including saved memories and the companion summary.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adjusting how the application assembles the final context.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, I was improving &lt;strong&gt;the information available to the model and the way the task was framed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;A model can produce a poor answer because its underlying capabilities are limited. But it can also produce a poor answer because the application supplied incomplete, irrelevant or misleading context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Those are different problems, and they need different solutions.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The model provider is configurable
&lt;/h3&gt;

&lt;p&gt;The backend is not tightly coupled to a single local Ollama process.&lt;/p&gt;

&lt;p&gt;The inference architecture supports &lt;strong&gt;Cloudflare Workers AI&lt;/strong&gt; when the required API credentials are configured. Otherwise, the local inference path uses Ollama through &lt;code&gt;MODEL_BASE_URL&lt;/code&gt;, which defaults to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://localhost:11434&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This separation helped keep the API architecture flexible.&lt;/p&gt;

&lt;p&gt;It also created an important deployment lesson: &lt;strong&gt;Render does not automatically have access to the Ollama instance running on my laptop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The API service needs a reachable inference endpoint. Cloudflare credentials or another correctly configured model endpoint must be supplied to the deployed API.&lt;/p&gt;

&lt;p&gt;I don't want to claim that Render hosts Gemma inference. &lt;strong&gt;It hosts the application services; inference is handled separately.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  06. The architecture: Render, Express and MongoDB Atlas
&lt;/h2&gt;

&lt;p&gt;The application is split into separate services.&lt;/p&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;Technology&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React + TypeScript + Vite&lt;/td&gt;
&lt;td&gt;User interface and application experience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tailwind CSS&lt;/td&gt;
&lt;td&gt;Layout and visual design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React Router&lt;/td&gt;
&lt;td&gt;Navigation between experiences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auth0&lt;/td&gt;
&lt;td&gt;Authentication and access-token identity&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;Node.js + Express + TypeScript&lt;/td&gt;
&lt;td&gt;API, validation and application logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MongoDB Atlas&lt;/td&gt;
&lt;td&gt;Profiles, messages and memories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Atlas Vector Search&lt;/td&gt;
&lt;td&gt;Semantic memory retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloudflare Workers AI / Ollama&lt;/td&gt;
&lt;td&gt;Model inference through configured provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;td&gt;Frontend and API hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why separate the frontend and API?
&lt;/h3&gt;

&lt;p&gt;The React application is served as a &lt;strong&gt;Render static site.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Express backend runs as a &lt;strong&gt;separate Render web service.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This keeps the responsibilities clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The frontend&lt;/strong&gt; handles the user experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The API&lt;/strong&gt; handles identity validation, database access and context assembly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; stores application data and supports memory retrieval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The configured inference provider&lt;/strong&gt; generates the response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare credentials are not declared in &lt;code&gt;render.yaml&lt;/code&gt;&lt;/strong&gt; in the architecture snapshot I'm documenting. They need to be supplied through the API service's environment configuration to use the Cloudflare path in production.&lt;/p&gt;

&lt;p&gt;Otherwise, the API falls back to the configured Ollama endpoint. On Render, &lt;code&gt;localhost&lt;/code&gt; refers to the API service environment, not my personal laptop.&lt;/p&gt;

&lt;p&gt;It sounds obvious once you draw the diagram. It is considerably less obvious when you're staring at a deployment that works locally and doesn't behave the same way remotely.&lt;/p&gt;




&lt;h2&gt;
  
  
  07. The testing: where the architecture had to justify itself
&lt;/h2&gt;

&lt;p&gt;I don't think &lt;strong&gt;"I sent a message and the model replied"&lt;/strong&gt; is a meaningful test for a project like this.&lt;/p&gt;

&lt;p&gt;A memory companion can generate a warm, natural response and still get the important details wrong.&lt;/p&gt;

&lt;p&gt;For TYLO, I wanted to look at whether the conversation reflected the profile, whether the memory architecture could supply relevant context, and whether the system respected the boundaries around private information.&lt;/p&gt;

&lt;p&gt;Here are some of the checks and observations that shaped the implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 1 — Does the profile influence the response?
&lt;/h3&gt;

&lt;p&gt;I created a sample companion profile with information across the four sections: personality, speaking style, favourite phrases, shared experiences, beliefs and routines.&lt;/p&gt;

&lt;p&gt;Then I tried a simple greeting.&lt;/p&gt;

&lt;p&gt;The resulting conversation reflected the &lt;strong&gt;positive, encouraging tone&lt;/strong&gt; described in the profile.&lt;/p&gt;

&lt;p&gt;That was encouraging. It showed that the companion profile could influence the generated response rather than the model replying with a completely generic greeting.&lt;/p&gt;

&lt;p&gt;But the response also included a &lt;strong&gt;present-day detail that had not been supplied in the profile.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was an important observation.&lt;/p&gt;

&lt;p&gt;The response sounded natural, but &lt;strong&gt;sounding natural is not the same as being grounded in memory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It exposed a distinction I need to preserve throughout the project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The system can use a person's personality and memories as conversational context, but it should not invent personal facts and present them as remembered experiences.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is an ongoing quality and prompt-design challenge, not something I will pretend has been completely solved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 2 — Can the application use older context?
&lt;/h3&gt;

&lt;p&gt;A conversation has two different memory requirements.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;immediate continuity&lt;/strong&gt;: understanding what was said a few messages ago.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;long-term recall&lt;/strong&gt;: finding something meaningful from an older exchange that is no longer in the recent message window.&lt;/p&gt;

&lt;p&gt;The current context assembly addresses both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The latest 8 message records&lt;/strong&gt; provide recent conversational continuity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The companion summary&lt;/strong&gt; provides compressed context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Up to 3 saved memories&lt;/strong&gt; provide additional profile-level information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlas Vector Search&lt;/strong&gt; retrieves up to 4 relevant older exchanges from a candidate set of 50.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The consequence is architectural: &lt;strong&gt;an older relevant exchange does not have to be present in the latest eight messages to be considered for the next response.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I haven't produced a formal retrieval-accuracy benchmark, so I won't attach a made-up percentage to this improvement. The retrieval configuration is implemented; its quality still needs systematic evaluation across a larger set of real test cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 3 — Can one user's memories leak into another user's conversation?
&lt;/h3&gt;

&lt;p&gt;This is one of the most important tests for TYLO.&lt;/p&gt;

&lt;p&gt;A normal search might find semantically similar memories across multiple users. But &lt;strong&gt;TYLO cannot treat all stored memories as one shared pool.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The retrieval query includes the &lt;strong&gt;verified owner identity and companion identifier.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That gives the memory search a defined ownership boundary, rather than relying on the model to decide which memories are appropriate.&lt;/p&gt;

&lt;p&gt;The implementation uses &lt;code&gt;ownerSub&lt;/code&gt; and &lt;code&gt;companionId&lt;/code&gt; as filters.&lt;/p&gt;

&lt;p&gt;The next level of verification here is a dedicated multi-user integration test: create separate users with similar companion profiles, seed similar memories, and verify that each user can retrieve only their own data. &lt;strong&gt;The filters are part of the architecture, but I won't describe that as a completed security audit.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 4 — What happens when retrieval fails?
&lt;/h3&gt;

&lt;p&gt;Vector search is an additional source of context, not the only source.&lt;/p&gt;

&lt;p&gt;The failure path logs a retrieval error and continues with the companion profile and recent history.&lt;/p&gt;

&lt;p&gt;That gives the application a &lt;strong&gt;graceful-degradation path.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is better to have a conversation with limited context than to silently pretend that missing memories were successfully retrieved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 5 — Does the profile creation flow enforce the required information?
&lt;/h3&gt;

&lt;p&gt;The TYLO creation flow was also tested beyond just its appearance.&lt;/p&gt;

&lt;p&gt;The companion creation process requires a photograph and the structured profile details. &lt;strong&gt;Validation exists on the server as well as in the interface.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That matters because frontend validation alone can be bypassed.&lt;/p&gt;

&lt;p&gt;The image flow also needed attention: &lt;strong&gt;image selection, JPEG compression, previewing the selected image and saving the resulting image data&lt;/strong&gt; with the companion document.&lt;/p&gt;

&lt;p&gt;The current implementation stores the photo as image data in MongoDB. That is straightforward for an initial version, but it increases document payload size. &lt;strong&gt;Moving images to dedicated object storage&lt;/strong&gt; is a sensible future improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the tests actually establish
&lt;/h3&gt;

&lt;p&gt;I want to be honest about the level of verification.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What has been established&lt;/th&gt;
&lt;th&gt;What is still needed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Profile creation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Required photo and profile validation, including server-side validation&lt;/td&gt;
&lt;td&gt;Broader browser and edge-case testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Selection, compression, preview and persistence flow implemented&lt;/td&gt;
&lt;td&gt;Evaluate object storage as usage grows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conversation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A sample profile-driven response was generated&lt;/td&gt;
&lt;td&gt;Larger grounded-response evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory retrieval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector index, candidate retrieval, limits and filters are part of the architecture&lt;/td&gt;
&lt;td&gt;Formal recall and relevance evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Owner and companion filters are used for retrieval&lt;/td&gt;
&lt;td&gt;Dedicated multi-user security integration tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Health endpoint returned successfully outside the restricted development environment&lt;/td&gt;
&lt;td&gt;Full deployed request-path verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm run build&lt;/code&gt; passed at the documented development snapshot&lt;/td&gt;
&lt;td&gt;Re-run after subsequent changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full AI conversation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The application flow and a sample conversation are present&lt;/td&gt;
&lt;td&gt;A complete end-to-end test across deployed Auth0, API, MongoDB and the configured inference provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not a claim that the system is production-audited or that retrieval accuracy has been scientifically measured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is a record of what works, what the design does, and what still deserves testing.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  08. The bugs that had nothing to do with AI
&lt;/h2&gt;

&lt;p&gt;Some of the most frustrating problems had absolutely nothing to do with the model.&lt;/p&gt;

&lt;p&gt;While building the frontend, I ran into several regressions that reminded me how much work exists between a feature working in isolation and the application feeling coherent.&lt;/p&gt;

&lt;p&gt;A few examples:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Explore Story page.&lt;/strong&gt; It initially displayed a large chat composer where I wanted a focused story experience. The selected historical figure also needed to load directly from its slug. The navigation and route handling had to be corrected so a figure could be opened reliably.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Talk Now modal.&lt;/strong&gt; The modal had an issue with its lifecycle and could close unexpectedly. React Strict Mode exposed behaviour that wasn't as stable as I wanted. I had to fix the modal's interaction handling, including Escape and backdrop behaviour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The modal position.&lt;/strong&gt; After a CSS reset, the modal appeared pinned to the top-left instead of sitting in the centre. It was one of those bugs where the code looked reasonable until the browser rendered it. &lt;strong&gt;Explicit positioning fixed it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The TYLO layout.&lt;/strong&gt; The companion creation form was appearing before the existing memory spaces and conversations. That made the page feel like a setup screen even for someone who had already created companions. &lt;strong&gt;Reordering the experience made the saved spaces and conversations easier to reach.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical portraits.&lt;/strong&gt; Finding images for historical figures was another problem. A URL returning an image does not prove that the image depicts the right person. Some candidate images needed stricter filtering and manual review. &lt;strong&gt;An unrelated film still or an incorrectly attributed portrait can undermine the whole experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also used &lt;strong&gt;Codex&lt;/strong&gt; to help inspect and fix targeted issues. It was useful for identifying regressions and making focused changes, but I still had to review the results and build the application again.&lt;/p&gt;

&lt;p&gt;At one point, the changes had passed the build check, but the &lt;strong&gt;full live AI conversation had not been verified end to end.&lt;/strong&gt; That distinction matters.&lt;/p&gt;

&lt;p&gt;A successful build tells me the code compiles. It doesn't tell me that Auth0, the database, vector retrieval and the deployed inference provider all cooperate correctly in a real conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  09. The DigitalOcean plan that never happened
&lt;/h2&gt;

&lt;p&gt;I initially considered provisioning a &lt;strong&gt;DigitalOcean Droplet&lt;/strong&gt; to run model inference.&lt;/p&gt;

&lt;p&gt;The idea was straightforward: host the model separately and have the API communicate with it.&lt;/p&gt;

&lt;p&gt;But I got stuck at the billing setup and, honestly, &lt;strong&gt;I was too lazy to finish the provisioning process&lt;/strong&gt; at that stage.&lt;/p&gt;

&lt;p&gt;So I moved forward with the architecture I could actually work with: &lt;strong&gt;Render for the web application and API, MongoDB Atlas for persistence and retrieval, and a configurable inference provider.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It wasn't some grand technical decision after an extensive infrastructure benchmark.&lt;/p&gt;

&lt;p&gt;Sometimes the engineering story is simply that &lt;strong&gt;the infrastructure you planned is not the infrastructure you end up using.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am not claiming a DigitalOcean integration, because I did not provision one.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Why each partner technology belongs in this project
&lt;/h2&gt;

&lt;p&gt;I didn't want to select partner categories just because a technology appeared somewhere in the dependency list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each one needs to have a meaningful responsibility in the application.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of MongoDB Atlas
&lt;/h3&gt;

&lt;p&gt;MongoDB Atlas is the &lt;strong&gt;persistence and memory-retrieval layer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It stores the historical profiles, TYLO companions, conversation messages and memory exchanges. Atlas Vector Search supports semantic retrieval over the &lt;strong&gt;768-dimensional memory embeddings.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;tylo_memory_vector_index&lt;/code&gt; index, candidate limit, returned exchanges and owner/companion filters are part of the actual memory architecture.&lt;/p&gt;

&lt;p&gt;Without this layer, TYLO would have a much weaker approach to &lt;strong&gt;long-term conversational recall.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;Render hosts &lt;strong&gt;two distinct application services:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The React frontend as a static site.&lt;/li&gt;
&lt;li&gt;The Express API as a separate web service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The API handles protected requests, database operations, context assembly and communication with the configured model provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render is responsible for hosting the application services. It is not the machine running my laptop's local Gemma model.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Auth0 for AI Agents
&lt;/h3&gt;

&lt;p&gt;TYLO works with &lt;strong&gt;private, user-provided information.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Auth0 establishes the authenticated identity used by protected API requests. The Express backend validates the access token, reads the user's subject and uses that identity when accessing companion and memory data.&lt;/p&gt;

&lt;p&gt;The relationship between identity and memory retrieval is the important part here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A user should not be able to access another person's companion simply because a vector search finds similar text.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm describing the Auth0 functionality actually integrated: &lt;strong&gt;authentication, access-token validation and protected API access.&lt;/strong&gt; I'm not claiming Token Vault, asynchronous authorization or fine-grained authorization features that are not part of the current implementation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma was part of my &lt;strong&gt;local model experimentation through Ollama.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hardware limitations on my laptop influenced the model I could practically use during development. I then iterated on the application-side instructions and context assembly to improve the quality of the conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I did not fine-tune Gemma.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One important submission detail: the deployed inference provider is configurable. I will make sure the submitted demo's actual model configuration supports the Gemma category claim. &lt;strong&gt;A local development experiment alone should not be presented as proof that the deployed demo is currently running Gemma.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Categories I am not claiming
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DigitalOcean:&lt;/strong&gt; I considered it but never provisioned the Droplet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs:&lt;/strong&gt; It belongs to a different project direction, not the current POT implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot:&lt;/strong&gt; I used Codex for coding assistance; I am not claiming GitHub Copilot integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would rather enter fewer categories with a defensible technical explanation than list every partner name without meaningful usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Open innovation: why open models mattered to me
&lt;/h2&gt;

&lt;p&gt;One of the most interesting parts of this project was being able to experiment with &lt;strong&gt;open-weight models&lt;/strong&gt; rather than treating the AI layer as an invisible external service.&lt;/p&gt;

&lt;p&gt;Using Ollama gave me a practical local development path. I could experiment with a model, modify the application prompt, change the context being supplied and inspect the response.&lt;/p&gt;

&lt;p&gt;That made the model layer feel like something I could investigate and improve around.&lt;/p&gt;

&lt;p&gt;But there is a distinction I want to preserve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-weight model experimentation does not automatically make an application fully local or private.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;POT also uses hosted infrastructure. &lt;strong&gt;MongoDB Atlas stores application data, Render hosts the application services, and the configured inference provider may be cloud-based.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The system's privacy and data-handling properties depend on the actual deployment and configuration, not simply on whether the model's weights are open.&lt;/p&gt;

&lt;p&gt;That is especially important for TYLO.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. What I would improve next
&lt;/h2&gt;

&lt;p&gt;There are several things I would like to take further.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A proper memory evaluation suite.&lt;/strong&gt; I want a repeatable collection of questions where the correct answer depends on an older profile detail or a previous conversation. I would measure whether the right exchange is retrieved, whether irrelevant memories are excluded and whether the generated answer stays within the available evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stronger grounding behaviour.&lt;/strong&gt; The sample conversation showed that a warm response can still introduce unsupported details. I want the companion to distinguish between something explicitly remembered, a reasonable conversational response and something it simply does not know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A dedicated privacy test suite.&lt;/strong&gt; Multi-user tests should verify that similar companion profiles and overlapping memories never cross ownership boundaries. I also want broader tests around protected routes and companion access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Object storage for photographs.&lt;/strong&gt; Storing compressed image data directly with companion documents is convenient at this stage, but dedicated object storage will be a better direction as the number of users and images grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical source quality.&lt;/strong&gt; Ghost Gallery needs a stronger process for reviewing profile information and portrait attribution. A historical conversation should not sound confident about information that is uncertain or unsupported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A more complete deployed integration test.&lt;/strong&gt; I want to verify the full path—from Auth0 authentication to the Express API, MongoDB retrieval, configured model inference and the streamed response—in the actual deployed environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. The part I enjoyed the most
&lt;/h2&gt;

&lt;p&gt;The most satisfying moment wasn't getting an API endpoint to return a response.&lt;/p&gt;

&lt;p&gt;It was seeing a &lt;strong&gt;structured companion profile turn into an actual conversation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A photograph, a relationship, a collection of everyday details, favourite phrases and stories—all of that information started to become useful conversational context.&lt;/p&gt;

&lt;p&gt;It made me think differently about what a memory system needs to do.&lt;/p&gt;

&lt;p&gt;It also made me more cautious about what it should say.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A convincing imitation is not necessarily a respectful one.&lt;/strong&gt; The system needs to be thoughtful about the difference between what a person actually shared and what a language model is capable of inventing.&lt;/p&gt;

&lt;p&gt;That is probably the biggest lesson I am taking away from this build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI part is exciting. The engineering around it is what makes the experience meaningful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And there is still a lot I want to get right.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Overall Winner 👀&lt;/li&gt;
&lt;li&gt;Best Use of MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;li&gt;Best Use of Auth0 for AI Agents&lt;/li&gt;
&lt;li&gt;Best Use of Gemma &lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Imagine using your own tool to check if you are one of the winners of previous week's challenge 👀</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Fri, 30 Oct 2026 15:59:19 +0000</pubDate>
      <link>https://dev.to/bluestars/imagine-using-your-own-tool-to-check-if-you-are-one-of-the-winners-of-previous-weeks-challenge-2f7k</link>
      <guid>https://dev.to/bluestars/imagine-using-your-own-tool-to-check-if-you-are-one-of-the-winners-of-previous-weeks-challenge-2f7k</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-story__hidden-navigation-link"&gt;I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/7fj0NWulcSg" title="I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/bluestars" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" alt="bluestars profile" class="crayons-avatar__image" width="500" height="500"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/bluestars" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Utkarsh Mishra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Utkarsh Mishra
                
                
              
              &lt;div id="story-author-preview-content-4917610" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/bluestars" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" class="crayons-avatar__image" alt="" width="500" height="500"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Utkarsh Mishra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" id="article-link-4917610"&gt;
          I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>I built ReadYou because I kept losing time trying to figure out what interesting open-source projects actually do. It turns Hacktoberfest winners into short, source-grounded briefings—and lets you ask questions by text or voice.</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:56:27 +0000</pubDate>
      <link>https://dev.to/bluestars/i-built-readyou-because-i-kept-losing-time-trying-to-figure-out-what-interesting-open-source-21op</link>
      <guid>https://dev.to/bluestars/i-built-readyou-because-i-kept-losing-time-trying-to-figure-out-what-interesting-open-source-21op</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-story__hidden-navigation-link"&gt;I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧&lt;/a&gt;
    &lt;div class="crayons-article__cover crayons-article__cover__image__feed"&gt;
      &lt;iframe src="https://www.youtube.com/embed/7fj0NWulcSg" title="I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧"&gt;&lt;/iframe&gt;
    &lt;/div&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/bluestars" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" alt="bluestars profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/bluestars" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Utkarsh Mishra
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Utkarsh Mishra
                
                
              
              &lt;div id="story-author-preview-content-4917610" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/bluestars" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158465%2F0407c1e5-0c7d-46a8-8a18-cefd1186258d.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Utkarsh Mishra&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" id="article-link-4917610"&gt;
          I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              2&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I struggled to understand Hacktoberfest winners projects, so I built ReadYou to summarize them—and let me talk to the projects 🎧</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:48:51 +0000</pubDate>
      <link>https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a</link>
      <guid>https://dev.to/bluestars/i-struggled-to-understand-hacktoberfest-winners-projects-so-i-built-readyou-to-summarize-them-and-497a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkh4vr703n47uttsvka46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkh4vr703n47uttsvka46.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(Please be patient while going through the video demo 🫶)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know what I find frustrating?&lt;/p&gt;

&lt;p&gt;Finding an open-source project that looks genuinely cool, starting to read about it, and then getting completely lost in the technical explanation. 😭&lt;/p&gt;

&lt;p&gt;The architecture looks interesting. The developer clearly put a lot of thought into it. But then come the unfamiliar terms, workflows and design decisions—and the feeling that I need to understand five other technologies before I can understand this one project.&lt;/p&gt;

&lt;p&gt;I was going through Hacktoberfest winners and spending way too much time trying to figure out what each project actually did.&lt;/p&gt;

&lt;p&gt;I kept thinking: &lt;em&gt;There has to be a less exhausting way to do this.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I started building &lt;strong&gt;ReadYou&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbphaua97rltck4gdhn69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbphaua97rltck4gdhn69.png" alt=" " width="800" height="383"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqxhq092knpkaysyhjhl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhqxhq092knpkaysyhjhl.png" alt=" " width="800" height="381"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcnyuima3e5qef086kz5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcnyuima3e5qef086kz5i.png" alt=" " width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ReadYou collects Hacktoberfest winner announcements and turns the projects into readable technical briefings, short audio introductions, and conversations about individual projects.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🏆 Winner digest&lt;/td&gt;
&lt;td&gt;Brings winning projects together in one place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 Gemma 4&lt;/td&gt;
&lt;td&gt;Generates project briefings and answers questions using project sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔎 Repository checks&lt;/td&gt;
&lt;td&gt;Treats linked READMEs as candidates and excludes ones that don’t confidently match the submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎧 ElevenLabs audio&lt;/td&gt;
&lt;td&gt;Turns project introductions into playable audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🗣️ Voice Mentor&lt;/td&gt;
&lt;td&gt;Lets you ask about a selected project by typing or speaking, then hear the answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔔 Scheduled updates&lt;/td&gt;
&lt;td&gt;Checks for new winner announcements automatically and can email you when it finds them&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The idea isn’t to replace the original developer’s documentation. I want to understand the big picture first, so when I open the README, I’m not assembling the entire project from scratch in my head.&lt;/p&gt;

&lt;p&gt;Automated Email ( as soon as the scheduler discovers new relevant announcement , digest build is created to create summaries and email is sent to notify the user )&lt;/p&gt;

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

&lt;p&gt;Job Scheduling ( scans immediately and at every 3h for any new updates i.e. the winner announcements )&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;ReadYou is my attempt to make that first step less painful.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/utkarsh-g19/ReadYou" rel="noopener noreferrer"&gt;utkarsh-g19/ReadYou on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I’m a student developer, and this project became a fun excuse to experiment with local AI, backend architecture and voice technology. I used ChatGPT to reason through architecture and debugging, and Codex to inspect the repository and implement changes.&lt;/p&gt;

&lt;p&gt;The most interesting moments weren’t when something worked immediately. They were when something &lt;em&gt;looked&lt;/em&gt; like it worked, and then I found out it was doing the wrong thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  😭 The bug that made me rethink my research pipeline
&lt;/h3&gt;

&lt;p&gt;A DEV submission can contain several GitHub links. My first approach was to retrieve the READMEs and give them to Gemma along with the submission.&lt;/p&gt;

&lt;p&gt;Simple, right?&lt;/p&gt;

&lt;p&gt;Except some links pointed to dependencies, examples, frameworks or unrelated repositories. Gemma could read those READMEs and confidently describe features or technologies that the actual submission didn’t have.&lt;/p&gt;

&lt;p&gt;That’s a nasty kind of bug: &lt;strong&gt;the summary looks convincing, but the information underneath is wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn’t want to keep patching individual bad summaries. I wanted to stop feeding the model the wrong information in the first place.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Earlier approach 😬&lt;/th&gt;
&lt;th&gt;Updated approach 🛠️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fetch up to five linked READMEs&lt;/td&gt;
&lt;td&gt;Treat them as candidates, not trusted sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assume a linked repository is relevant&lt;/td&gt;
&lt;td&gt;Ask Gemma to compare it with the actual submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Include candidate docs in the summary prompt&lt;/td&gt;
&lt;td&gt;Include only documentation that passes a confidence threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk repeating a cached mistake&lt;/td&gt;
&lt;td&gt;Regenerate selected summaries while retaining previous versions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The classifier returns structured JSON with a relevance decision and confidence score. The backend requires a score of at least &lt;code&gt;0.85&lt;/code&gt;. If classification is uncertain or fails, the README is excluded and ReadYou uses the DEV submission on its own.&lt;/p&gt;

&lt;p&gt;That threshold doesn’t guarantee Gemma can never be wrong. It makes the pipeline cautious when the evidence isn’t convincing.&lt;/p&gt;

&lt;p&gt;There was another trap: &lt;strong&gt;the cache could preserve a bad summary even after I fixed the research code.&lt;/strong&gt; ReadYou stores processed winners by submission URL, so changing the prompt alone wouldn’t repair summaries already saved.&lt;/p&gt;

&lt;p&gt;I added targeted summary regeneration and kept previous summary versions in the cache history. I used it to regenerate affected summaries from the &lt;em&gt;Build for a Friend&lt;/em&gt; and &lt;em&gt;Touch Grass&lt;/em&gt; winner announcements without wiping the rest of the application state.&lt;/p&gt;

&lt;p&gt;I learned that a reliable AI application isn’t just about writing a better prompt. Sometimes the real fix is changing what the model is allowed to see.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Playing with Gemma 4 E2B
&lt;/h3&gt;

&lt;p&gt;I’m running &lt;code&gt;gemma4:e2b&lt;/code&gt; locally through Ollama.&lt;/p&gt;

&lt;p&gt;I chose the E2B variant as a practical starting point for local inference on student-level hardware. I wanted to experiment with an open-weight model I could run and configure myself, instead of making every AI operation depend on a hosted model API.&lt;/p&gt;

&lt;p&gt;I’m not claiming it’s the best model for every task. Smaller models have limitations, and I noticed them quickly once I started building the chatbot.&lt;/p&gt;

&lt;p&gt;My first attempts at project chat could be repetitive, irrelevant or overly cautious. A question like &lt;em&gt;“What is this project all about?”&lt;/em&gt; could fall through to Hacktoberfest boilerplate instead of explaining the project.&lt;/p&gt;

&lt;p&gt;I remember thinking: &lt;em&gt;Come on, you’re looking right at the project. Just tell me what it does!&lt;/em&gt; 😂&lt;/p&gt;

&lt;p&gt;The issue wasn’t just the model. My source-selection logic sometimes prioritised the wrong material for the question. I improved it so broad overview questions look for project-specific sections such as &lt;strong&gt;“What I Built”&lt;/strong&gt;, rather than challenge boilerplate.&lt;/p&gt;

&lt;p&gt;I also found a fallback that could respond with &lt;em&gt;“I couldn’t put that together clearly”&lt;/em&gt; and then paste a technical source sentence. I changed that path to give Gemma one short retry, asking it to explain the answer plainly using the same selected sources.&lt;/p&gt;

&lt;p&gt;Then I ran into a broader problem: people can ask the same question in very different ways. Punctuation, typos or casual phrasing shouldn’t decide whether a question is about the project. I changed the shared chat flow so Gemma assesses whether the question is about the selected project and drafts its answer from the project sources in the same call. The backend checks the supporting quotes; an unrelated question gets a redirect, and an unsupported project question gets an uncertainty response.&lt;/p&gt;

&lt;p&gt;That’s a workflow change for all projects, not a collection of project-specific answers. But the model can still misunderstand a question, so I wanted to be clear about what I’ve actually tested.&lt;/p&gt;

&lt;h4&gt;
  
  
  What my tests tell me—and what they don’t
&lt;/h4&gt;

&lt;p&gt;The latest backend test run passed &lt;strong&gt;45 tests&lt;/strong&gt;. These cover behaviors such as accepting a casually formatted project question when Gemma marks it as relevant, distinguishing an unrelated question from a related-but-undocumented one, rejecting an invalid scope assessment, and checking that evidence quotes appear in their cited source sections.&lt;/p&gt;

&lt;p&gt;Those tests verify the application’s handling of model output. &lt;strong&gt;They are not a benchmark of Gemma’s real-world accuracy.&lt;/strong&gt; I haven’t yet run a systematic live-model evaluation across a fixed set of projects and paraphrased questions, so I can’t claim a success rate.&lt;/p&gt;

&lt;p&gt;That’s still work I need to do: test ordinary questions, typos and punctuation, follow-ups, unrelated questions, and questions the project sources can’t answer—and record where the model gets the scope or answer wrong.&lt;/p&gt;

&lt;p&gt;The chat service asks Gemma for claims with supporting quotes. The backend checks that each quote appears in the cited source section. &lt;strong&gt;That verifies the quote and citation match; it doesn’t prove the quote logically supports every claim.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also worked on follow-up questions and language preferences, including Hindi. I want Voice Mentor to feel like an informal conversation with a developer friend, not a report generator that has learned to add question marks.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎙️ ElevenLabs: I didn’t want another button that just says “Listen”
&lt;/h3&gt;

&lt;p&gt;The basic audio feature takes a short project introduction and uses ElevenLabs text-to-speech to generate an MP3.&lt;/p&gt;

&lt;p&gt;I also didn’t want replaying the same introduction to trigger another generation request every time. Generated introductions are cached locally, and duplicate requests can reuse a generation that’s already in progress.&lt;/p&gt;

&lt;p&gt;But I wanted to experiment with something more interactive. That’s where &lt;strong&gt;Voice Mentor&lt;/strong&gt; came in.&lt;/p&gt;

&lt;p&gt;Instead of making people read a complicated explanation, I wanted them to ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Okay, but what does this project actually do?”&lt;/li&gt;
&lt;li&gt;“Why did they choose this tech stack?”&lt;/li&gt;
&lt;li&gt;“Can you explain that workflow more simply?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how the voice interaction works:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Ask aloud&lt;/td&gt;
&lt;td&gt;ElevenLabs Scribe&lt;/td&gt;
&lt;td&gt;Transcribes the spoken question&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Reason&lt;/td&gt;
&lt;td&gt;Gemma 4 via Ollama&lt;/td&gt;
&lt;td&gt;Answers using the selected project sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Speak back&lt;/td&gt;
&lt;td&gt;ElevenLabs TTS&lt;/td&gt;
&lt;td&gt;Turns the answer into audio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It’s a sequential pipeline, not real-time speech-to-speech. ElevenLabs handles speech recognition and synthesis; Gemma does the reasoning locally.&lt;/p&gt;

&lt;p&gt;The interface shows listening, thinking and speaking states based on what the app is doing. Users can interrupt spoken answers with another question, and typing is available if they don’t want to use a microphone. Spoken answers are cleaned up so the app doesn’t read Markdown headings and URLs aloud, while the fuller answer and its sources stay on screen.&lt;/p&gt;

&lt;p&gt;There’s still room to improve, especially around latency and answer quality, but this is the kind of interaction I wanted to explore.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 A little funk in the interface
&lt;/h3&gt;

&lt;p&gt;I wanted ReadYou to feel inviting to browse, not like a plain dashboard full of project links. So I used warm cream backgrounds, chunky dark borders, and bright orange, lime and lavender accents. The cards and labels are playful, but I’ve also been adjusting the typography so the project descriptions stay comfortable to read.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ Why I kept the backend separated
&lt;/h3&gt;

&lt;p&gt;I didn’t want every feature crammed into one enormous &lt;code&gt;server.js&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;The backend separates winner discovery, DEV article retrieval, GitHub research, repository relevance checks, summaries, chat and ElevenLabs integration into services and controllers. The digest service coordinates the pipeline and manages cached state.&lt;/p&gt;

&lt;p&gt;Digest data and generated MP3s are stored locally. Chat sessions stay in backend memory and expire rather than being saved in the digest cache. File-based persistence and in-memory sessions have limits, but they kept the project understandable and easy for me to debug without adding infrastructure I didn’t yet need.&lt;/p&gt;

&lt;p&gt;The announcement scheduler checks for new DEV Team posts when the backend starts and every three hours by default while it’s running. If email is configured, ReadYou can notify me when a scan finds new winner announcements. That means I don’t have to remember to check manually, though the scheduler only runs while the backend is online.&lt;/p&gt;

&lt;p&gt;The frontend production build passed as well.&lt;/p&gt;

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

&lt;p&gt;I could have built ReadYou around a hosted model API and asked it to summarise every project. That might have been the quicker route to a first demo.&lt;/p&gt;

&lt;p&gt;Instead, Gemma runs locally through Ollama. I can inspect the prompts, change the retrieval logic and experiment with the model’s behaviour.&lt;/p&gt;

&lt;p&gt;That doesn’t make the whole application offline. ReadYou still fetches source material from DEV.to and GitHub, and ElevenLabs handles speech transcription and synthesis. Those voice features need an internet connection and an API key.&lt;/p&gt;

&lt;p&gt;For me, open innovation means having the freedom to understand what I’m building, change it when it doesn’t work, and share what I learned with other developers.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Learning from Previous Winners
&lt;/h2&gt;

&lt;p&gt;ReadYou’s summaries helped me quickly explore past ElevenLabs category winners: &lt;strong&gt;Padh Ke Batao, Outside and Auditly&lt;/strong&gt;. I could get a quick sense of what each project did, then look closer at the ideas that caught my attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Padh Ke Batao&lt;/strong&gt; uses voice to make complex documents easier to understand. It got me thinking about keeping ReadYou’s audio introductions clear and concise, and caching them so replaying one wouldn’t generate it again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outside&lt;/strong&gt; makes listening interactive. It inspired me to let Voice Mentor users interrupt a spoken answer and ask a follow-up question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditly&lt;/strong&gt; showed me that reliable voice interaction depends on more than speech. In ReadYou, I focused on answering from each project’s selected sources and checking that evidence quotes appear in the cited text.&lt;/p&gt;

&lt;p&gt;I didn’t recreate these projects or all their features. I adapted ideas I found useful to a different problem: helping developers understand open-source projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I started by struggling to understand other people’s projects. Along the way, those same projects taught me how to build mine better.&lt;/strong&gt; ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff 🦥
&lt;/h2&gt;

&lt;p&gt;I haven’t measured exactly how many minutes ReadYou saves, so I’m not going to invent a number.&lt;/p&gt;

&lt;p&gt;The intended payoff is straightforward: get a quick understanding of a winning project, listen to its introduction, ask questions when something doesn’t make sense, and decide where to spend your deeper reading time.&lt;/p&gt;

&lt;p&gt;The bigger payoff for me has been learning how to put local inference, evidence retrieval, backend services, caching and external speech APIs together—and how to debug the system when the output looks right but the information underneath is wrong.&lt;/p&gt;

&lt;p&gt;The small chore I wanted to avoid was repeatedly checking for new Hacktoberfest winners, then opening every submission just to work out which projects were worth a closer look.&lt;/p&gt;

&lt;p&gt;ReadYou checks for new DEV Team announcements when the backend starts and every three hours while it’s running. If I configure email, it can notify me when a scan finds new winners. The digest gives me a starting point: a project briefing, a short introduction I can listen to, and Voice Mentor when I want to ask a question.&lt;/p&gt;

&lt;p&gt;I haven’t measured how much time that saves, so I won’t make up a number. The useful part is that I can catch up on projects in one place and spend my reading time on the ones that interest me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;There’s still work to do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better source coverage:&lt;/strong&gt; Some DEV submissions are vague or don’t have useful READMEs. When the evidence isn’t there, ReadYou needs to say so rather than invent an explanation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster local inference:&lt;/strong&gt; Gemma’s response time depends on the hardware, and the sequential voice pipeline adds latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More voice testing:&lt;/strong&gt; Transcription quality depends on the recording, language and service capabilities. Hindi handling has improved, but I haven’t established universal multilingual reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More chat evaluation:&lt;/strong&gt; I need to test live Gemma responses across more projects and question styles. Source checks and focused backend tests catch some failures, but they don’t guarantee a useful conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More than Hacktoberfest winners:&lt;/strong&gt; I’d like to adapt the same collect → check sources → summarize workflow to produce weekly briefings from technical reports and other useful publications across different websites.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d rather be honest about these limitations than call the project finished just because the demo works.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma 4 E2B is central to ReadYou’s research and explanation workflow. It generates project briefings, assesses whether linked repositories match a submission, and answers questions using selected project sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;ElevenLabs generates project introductions, transcribes spoken questions and produces spoken answers for Voice Mentor. It’s part of how users interact with the product, not just a voiceover added to a demo.&lt;/p&gt;

&lt;p&gt;I think the interesting part is how the two fit together: Gemma helps make complicated engineering easier to understand, while ElevenLabs gives people another way to explore those explanations.&lt;/p&gt;

&lt;p&gt;Using two partner technologies doesn’t automatically make this a winning entry. I hope the work that went into making them useful together stands out: selecting sources carefully, checking evidence quotes, handling uncertainty and making the experience feel conversational.&lt;/p&gt;

&lt;p&gt;I started ReadYou because I was tired of struggling through technical explanations just to understand projects I found interesting.&lt;/p&gt;

&lt;p&gt;Now I’m having a lot of fun building a tool that helps me do something about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Great projects deserve to be understood.&lt;/strong&gt; ❤️&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #hf26challenge
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>First Post! Newbie</title>
      <dc:creator>Utkarsh Mishra</dc:creator>
      <pubDate>Thu, 08 Oct 2026 20:30:14 +0000</pubDate>
      <link>https://dev.to/bluestars/first-post-newbie-3gcn</link>
      <guid>https://dev.to/bluestars/first-post-newbie-3gcn</guid>
      <description>&lt;p&gt;Hey there! Another newbie into the picture of open source , hope every established ones here are willing to help me out understanding open source better!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
