<?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: Noorin S</title>
    <description>The latest articles on DEV Community by Noorin S (@ns007-dev).</description>
    <link>https://dev.to/ns007-dev</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%2F947638%2F13485d25-ad22-4cb2-bc9f-9255787fb83b.JPG</url>
      <title>DEV Community: Noorin S</title>
      <link>https://dev.to/ns007-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ns007-dev"/>
    <language>en</language>
    <item>
      <title>I built my sister a personal stylist that lives on my laptop</title>
      <dc:creator>Noorin S</dc:creator>
      <pubDate>Mon, 05 Oct 2026 08:02:59 +0000</pubDate>
      <link>https://dev.to/ns007-dev/i-built-my-sister-a-personal-stylist-that-lives-on-my-laptop-jco</link>
      <guid>https://dev.to/ns007-dev/i-built-my-sister-a-personal-stylist-that-lives-on-my-laptop-jco</guid>
      <description>&lt;p&gt;Every morning, I get asked the same question: &lt;em&gt;"What am I going to wear?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Her closet is full of potential outfits, but choosing takes time, she doesn't want to repeat an outfit, and she wants whatever she wears to feel like &lt;em&gt;her&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So I built her something. It's called &lt;strong&gt;ClosetCue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I started it for the Hacktoberfest &lt;em&gt;Build for a Friend&lt;/em&gt; challenge. I missed the submission cutoff by about twenty minutes, so this isn't an entry. I still wanted to share it, because it's the project I'm proudest of so far.&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%2Fnejlhfakjjnp0s60jfqi.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%2Fnejlhfakjjnp0s60jfqi.png" alt="The Today screen" width="800" height="1218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I asked her first
&lt;/h2&gt;

&lt;p&gt;Before writing any code, I asked my sister what the problem actually was. Her answers became the product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choosing outfits for school mornings and for going out is hard.&lt;/li&gt;
&lt;li&gt;Not repeating outfits is a big worry.&lt;/li&gt;
&lt;li&gt;Choosing what to wear is stressful.&lt;/li&gt;
&lt;li&gt;Her two main occasions are school and shopping / going out.&lt;/li&gt;
&lt;li&gt;Style matters most to her.&lt;/li&gt;
&lt;li&gt;She's willing to photograph her entire wardrobe.&lt;/li&gt;
&lt;li&gt;Her dream feature: an outfit waiting for her every morning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem wasn't "nothing to wear." It was decision fatigue.&lt;/p&gt;

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

&lt;p&gt;She photographs the clothes she already owns. A local AI model reads each photo and writes a caption: category, type, colour, pattern, style, season. She can correct anything it gets wrong. She picks the styles and moods she loves, and then the app styles a look for &lt;strong&gt;School&lt;/strong&gt; or &lt;strong&gt;Shopping / Out&lt;/strong&gt;, using only clothes she actually owns.&lt;/p&gt;

&lt;p&gt;She can tap &lt;strong&gt;Wear this&lt;/strong&gt; to file the outfit, or &lt;strong&gt;Try another&lt;/strong&gt; and tell it why. Every look she wears goes into an archive, so the app remembers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI doesn't get to break the rules
&lt;/h2&gt;

&lt;p&gt;The decision I'm happiest with was splitting the work on purpose:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The AI handles&lt;/th&gt;
&lt;th&gt;Plain code handles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading clothing photos&lt;/td&gt;
&lt;td&gt;Storing the wardrobe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proposing outfits&lt;/td&gt;
&lt;td&gt;Remembering what was worn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explaining why a look works&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Blocking repeats&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Checking an outfit is complete (top + bottom or a dress, plus shoes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Ranking and validating&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The AI proposes four outfits. Then code throws out anything invalid or recently worn, ranks what's left (pieces she hasn't worn lately and her chosen styles score higher), and shows the best one. No complete outfit repeats within 14 days, and every look comes only from her real closet.&lt;/p&gt;

&lt;p&gt;If I'd let the AI do everything, it would eventually suggest a jacket she doesn't own. Putting the rules in normal code means they can't be ignored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open-weight matters here
&lt;/h2&gt;

&lt;p&gt;ClosetCue runs an open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model on my own laptop through &lt;strong&gt;Ollama&lt;/strong&gt;. It costs nothing to run, needs no account or paid API, and her photos are read on the same machine that stores them.&lt;/p&gt;

&lt;p&gt;I'll be exact about what that means. Photos and the database stay on my laptop. The AI runs locally, so nothing is sent to an AI service. The browser does load the typefaces from Google Fonts, and downloading the model the first time needs internet. It's also a single-user local app with no accounts, so it shouldn't be put on the public internet as it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  It had to look like her, not like a dashboard
&lt;/h2&gt;

&lt;p&gt;I didn't want a chatbot or an analytics screen. I wanted it to feel like opening a magazine: a serif masthead, hairline rules, ivory paper, one oxblood accent, and big numbered photos with captions, like a fashion spread.&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%2Fd51vhc8hmmlt52k0lwdk.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%2Fd51vhc8hmmlt52k0lwdk.png" alt="The closet" width="800" height="1218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;This is the part I learned the most from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uploads froze.&lt;/strong&gt; At first, every photo waited for the AI to finish reading it before the next one could upload. Ten photos took forever, and reloading the page lost everything. I rebuilt it so photos save instantly and the AI reads them in a background queue on the server. It survives reloads and restarts, and unfinished pieces show "Reading…".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outfits hung.&lt;/strong&gt; When the AI was busy with photos, asking for an outfit just sat there. Now the AI gets 25 seconds, and if it's too slow, a simpler mode takes over. The simple mode still builds valid, non-repeating outfits, so she's never left waiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A hosting lesson.&lt;/strong&gt; I wanted to put it online, then realised that would mean accounts, private storage per user, and a plan for the AI. It's a rewrite, not a setting. So it stays local for now, and that's in my "next" list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Her reaction
&lt;/h2&gt;

&lt;p&gt;[Replace this with what she actually said or did when she used it. Keep it honest, even if it's mixed.]&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Choose several pieces and build a look around all of them&lt;/li&gt;
&lt;li&gt;Build an outfit by hand&lt;/li&gt;
&lt;li&gt;Accounts and private per-user storage, so others can use it safely&lt;/li&gt;
&lt;li&gt;A real morning notification&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The code and setup steps are on GitHub: &lt;strong&gt;&lt;a href="https://github.com/NS007-dev/closet-cue" rel="noopener noreferrer"&gt;NS007-dev/closetcue&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built with React, TypeScript, Vite, Tailwind, Python, FastAPI, SQLite, Ollama and Gemma.&lt;/p&gt;

&lt;p&gt;If you build something for one specific person, I recommend it. Asking her what she needed did more for the project than any technical choice I made.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>react</category>
      <category>python</category>
    </item>
  </channel>
</rss>
