One of my partner’s hobbies is nail polishβ€”but calling it a hobby doesn’t really do it justice. While we binge horror movies, Hollow’s playthroughs, or our favorite IASIP episodes, she’s often painting her nails, and even that undersells it. These are elaborate, intricate designs I didn’t even realize were possible with nail polish. I’ve learned a lot.

As you might expect, she has an enormous collection. Clear, neatly organized boxesβ€”reminiscent of the ones I used for my Hot Wheelsβ€”are stacked high and packed with polish. Hundreds of bottles. I think it was soon after we started dating that I half‑joked I could build an app to inventory them all. The β€œhalf” is doing some heavy lifting there; the sheer amount of data entry would be massive.

A few weeks ago, I started thinking about that idea more seriously. There had to be a better way.

I kept turning the idea over while staying sharp with another project: a web app I’d originally built to help parents understand the school system’s redistricting options as we watched Good Mythical Morning.

The app no longer had a relevant user base, so it wasn’t much of a challenge, but I’d been using it as an excuse to replace the long-outdated AngularJS frontend and finally move from myself from Angular proper to React.

I wanted something that felt like a real, full-fledged applicationβ€”a project that needed the whole stack. That little app became a sandbox for a prototype-grade system with newer technologies, but I realized I needed a new problem space and a fresh challenge.

I kept thinking about the problem and surveyed the current nail polish inventory tools: they all suck. None of them solves the core challenge of onboarding a nail polish savant’s collection: turning hundreds of bottlesβ€”including dozens of non-SKU’d indie brandsβ€”into an organized, searchable library. That initial setup is the real barrier. If we could streamline and automate it, we could unlock many powerful features.

The real issue was the data. How do you build a catalog that’s complete enough to be genuinely useful? What features would a true nail fanatic actually care about? I asked whether color-matching to prevent dupesβ€”as they’re called in the bizβ€”would be helpful. β€œYes, of course,” she said. β€œDuh.” That led to another idea: not just finding matches, but also identifying the oppositeβ€”shades that are underrepresented in a collection, a kind of gap analysis.

Then there was the question of tagging finishes. How do we keep cremes separate from crellys, holos distinct from duochromes, and make sure magnetics never get lumped in with ordinary glitter or flakies? Could we suggest harmonious color combinations?

I’ve learned a lot about nail polish through this processβ€”mostly by peppering my girlfriend with questions while she’s trying to concentrate on her nails. I swear she doesn’t mind it.

The ideas started to come together, and I began prototyping to see what was possibleβ€”and it’s getting pretty cool. We came up with a temporary name, SwatchWatch, and ran with it. I could incorporate AI, draft React components, experiment with tools like Next.js, and leverage my AWS background while further exploring Azure.

At JHUAPL, I worked on integrating Azure services to analyze video, process data, improve search, and deliver analytics. This project felt like a good opportunity to experiment with Azure’s serverless technologies and deepen my experience in a few key areas: getting comfortable with server-side rendering, exploring their Lambda-equivalent services, integrating an LLM, building a custom model, and working with federated logins using OAuth-style authentication.

I’ve been tinkering with Azure’s OpenAI offerings like the new Foundry, static hosting, storage containers, and managed Postgres with pgvector support. With approval, I defined some core features and started building. I’ve made substantial progress in about three weekends and a few weekdaysβ€”helped by the fact that I’m currently between jobs.

🧠 still have to figure out β˜‘οΈ proven + will be in MVP βœ… in progress 🏁 done and in MVP
🏁 πŸ’… Smart Polish Collection Manager β€” Track your nail polish collection with brand, shade, finish, and star ratings.
🏁 🎨 Color Wheel Search β€” Interactive canvas-based color wheel using OKLAB perceptual color matching to find the closest polishes in your collection.
🏁 πŸ•³οΈ Collection Gap Heatmap β€” Hue Γ— lightness coverage map that reveals gaps in your collection and suggests what to buy next.
🧠 πŸ—£οΈ Voice Add β€” Dictate polish details; Azure Speech + OpenAI parse them into structured entries.
🧠 πŸ“Έ Rapid Capture β€” Scan barcodes, labels, or bottle colors, then use an adaptive question flow to quickly add new polishes
β˜‘οΈ πŸ” Fuzzy Catalog Search β€” pg_trgm-powered search across brands, shade names, and aliases.
πŸ€– AI Hex Detection β€” Azure OpenAI analyzes product images to detect the true hex color of the base polish shade.
🏁 🧬 Swatch Similarity / Dupe Finder β€” pgvector embeddings for finding near-dupes in your collection.
βœ… 🏭 Connector Ingestion Pipeline β€” Async jobs pull polish data from OpenBeautyFacts, MakeupAPI, Shopify, and other sources.
β˜‘οΈ πŸ” Azure AD B2C Auth β€” Full MSAL-based authentication with graceful dev-bypass fallback and federated logins.
βœ… βš™οΈ Unified Admin Console β€” Manage finish types, harmony types, normalization aliases, ingestion jobs, and job history in one place.
🧠 πŸ“± Cross-Platform β€” Web (Next.js) + Mobile (Expo/React Native) sharing types via a monorepo.

🧠 still have to figure out β˜‘οΈ proven + will be in MVP< βœ… in progress 🏁 done and in MVP

🏁 πŸ’… Smart Polish Collection Manager β€” Track your nail polish collection with brand, shade, finish, and star ratings. 🏁 🎨 Color Wheel Search β€” Interactive canvas-based color wheel using OKLAB perceptual color matching to find the closest polishes in your collection. 🏁 πŸ•³οΈ Collection Gap Heatmap β€” Hue Γ— lightness coverage map that reveals gaps in your collection and suggests what to buy next. 🧠 πŸ—£οΈ Voice Add β€” Dictate polish details; Azure Speech + OpenAI parse them into structured entries. 🧠 πŸ“Έ Rapid Capture β€” Scan barcodes, labels, or bottle colors, then use an adaptive question flow to quickly add new polishes β˜‘οΈ πŸ” Fuzzy Catalog Search β€” pg_trgm-powered search across brands, shade names, and aliases. πŸ€– AI Hex Detection β€” Azure OpenAI analyzes product images to detect the true hex color of the base polish shade. 🏁 🧬 Swatch Similarity / Dupe Finder β€” pgvector embeddings for finding near-dupes in your collection. βœ… 🏭 Connector Ingestion Pipeline β€” Async jobs pull polish data from OpenBeautyFacts, MakeupAPI, Shopify, and other sources. β˜‘οΈ πŸ” Azure AD B2C Auth β€” Full MSAL-based authentication with graceful dev-bypass fallback and federated logins. βœ… βš™οΈ Unified Admin Console β€” Manage finish types, harmony types, normalization aliases, ingestion jobs, and job history in one place. 🧠 πŸ“± Cross-Platform β€” Web (Next.js) + Mobile (Expo/React Native) sharing types via a monorepo.

🧠 still have to figure out  β˜‘οΈ proven + will be in MVP<
βœ… in progress  🏁 done and in MVP

🏁 πŸ’… Smart Polish Collection Manager β€” Track your nail polish collection with brand, shade, finish, and star ratings.
🏁 🎨 Color Wheel Search β€” Interactive canvas-based color wheel using OKLAB perceptual color matching to find the closest polishes in your collection.
🏁 πŸ•³οΈ Collection Gap Heatmap β€” Hue Γ— lightness coverage map that reveals gaps in your collection and suggests what to buy next.
🧠 πŸ—£οΈ Voice Add β€” Dictate polish details; Azure Speech + OpenAI parse them into structured entries.
🧠 πŸ“Έ Rapid Capture β€” Scan barcodes, labels, or bottle colors, then use an adaptive question flow to quickly add new polishes 
β˜‘οΈ πŸ” Fuzzy Catalog Search β€” pg_trgm-powered search across brands, shade names, and aliases.
 πŸ€– AI Hex Detection β€” Azure OpenAI analyzes product images to detect the true hex color of the base polish shade.
 🏁 🧬 Swatch Similarity / Dupe Finder β€” pgvector embeddings for finding near-dupes in your collection.
 βœ… 🏭 Connector Ingestion Pipeline β€” Async jobs pull polish data from OpenBeautyFacts, MakeupAPI, Shopify, and other sources.
β˜‘οΈ πŸ” Azure AD B2C Auth β€” Full MSAL-based authentication with graceful dev-bypass fallback and federated logins.
βœ… βš™οΈ Unified Admin Console β€” Manage finish types, harmony types, normalization aliases, ingestion jobs, and job history in one place.
🧠 πŸ“± Cross-Platform β€” Web (Next.js) + Mobile (Expo/React Native) sharing types via a monorepo.

As I mentioned, it’s turning out to be pretty damn coolβ€”a great chance to sharpen existing skills and explore new ones. Plus, I get to build a project from scratch, exactly the way I think it should be done, following best practices. I’m aiming to release the MVP in about a month. Honestly, I really want the challenge of finding time to work on it while employedβ€”it’s rough out here!

She’s already asking when she can show it off and get feedback from her nerdy-polish friends, and I’m looking forward to that. Huzzah! Let me know what you think, and I’ll keep anyone who cares posted. I’ve left some code lying around and possibly a development environment as well.

Leave a Reply

Discover more from Matt McKnight's Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading