Inspiration

Skincare advice today is often generic. People buy products based on trends, social media, or marketing without understanding what their skin actually needs. Even when they use skin analysis apps, they usually receive a one-time report with little context and no long-term guidance.

But there is a second problem that skin analysis alone can't fix: a routine only works if people actually follow it. A routine built around brands someone dislikes, influencers they don't trust, or products they'll never buy will be abandoned, however correct it is for their skin.

I wanted to build something that feels like a personal skincare companion rather than a simple scanner. Skin analysis tells Alina what the skin needs. Qloo tells Alina what this person will actually love. Alina combines the two, so recommendations are right for the skin and right for the person.

What it does

Alina is an AI-powered skincare assistant that analyzes a user's skin, tracks progress over time, and generates personalized skincare guidance grounded in the user's real cultural taste.

Users upload or capture a facial image, which is analyzed using Perfect Corp.'s YouCam Skin Analysis API. The scan detects dozens of skin attributes, including skin age, acne, wrinkles, pores, redness, oiliness, moisture, firmness, texture, radiance, dark circles, and more.

After the scan, a Google Gemma 4 AI Agent takes over. It retrieves previous scans and observations, compares the current scan against history, writes summaries and observations, and suggests routines, products and habits. Before it recommends anything, it consults Qloo.

What makes Alina Qloo-powered

Qloo is exposed to the agent as three read-only tools. Each one works across five kinds of entities: brands, products, places, influencers and podcasts.

  • Recommend: brands, products, local places, influencers and podcasts ranked by the user's taste, built from their favorite brands, age range, gender and city.
  • Compare: put two to four options side by side (two brands, two podcasts, two places) and see their shared and distinct traits, their popularity trend, and how close each is to this specific user's taste.
  • Trending: see what is trending for the user's age range, gender and city, or check whether a specific brand, place, influencer or podcast is rising, steady or falling.

Two people can get the same scan results, with the same redness and the same low moisture, and receive different brands, different influencers to follow, different podcasts and different places to shop. The skin analysis decides what needs treating. Qloo decides which of the suitable options this person will love.

The agent uses Qloo in plain conversation too, not just after scans. A user can ask "is this brand worth it compared to that one?", "what's trending right now?" or "who should I follow for skincare advice?" and get an answer shaped by their taste. Nothing is saved to their routine unless they ask for it.

Taste never overrides safety. Qloo only chooses between options that already suit the skin, and a product containing an ingredient the user avoids is rejected on the server, whatever its taste score.

How we built it

I built Alina as a modern full-stack web application. The frontend uses React and TypeScript, and the backend uses Fastify, TypeScript, PostgreSQL, Prisma ORM, Redis and BullMQ for background jobs.

The AI workflow combines three technologies:

  • Perfect Corp. YouCam Skin Analysis API performs professional facial skin analysis and returns detailed skin metrics.
  • Google Gemma 4 powers an agent that reasons through function calling.
  • Qloo's API and taste graph ground every recommendation in real cultural taste.

The Qloo integration uses several parts of the API:

  • Search resolves the user's favorite brands, and any names mentioned in chat, into Qloo entities.
  • Insights ranks brands, places, people and podcasts using those entities as interest signals, plus age range and gender as demographic signals, plus the user's city for local results and trend bias for what is currently rising.
  • Compare, Entities and Trending power side-by-side comparisons, entity details, and popularity momentum over roughly 90 days.

The three Qloo tools sit in the same function-calling registry as the agent's database tools. The agent reads the user's preferences, decides what it needs, calls Qloo, and then calls the saving tools only when the user wants something created. The inputs come from the user's own profile (favorite brands, age range, gender, city), and the agent can add context, such as a brand the user just mentioned.

Qloo has no "product" entity type, so product recommendations are built from brand affinity. The agent then picks real products from Alina's own catalog, or confirms them with Google Search, instead of inventing them.

Responses are cached in Redis with short lifetimes tuned per request type. The cache fails open, identical concurrent requests share one upstream call, and cache keys are hashed so they contain no personal data.

Challenges we ran into

Making taste useful without making it dangerous. A taste engine will happily recommend a beloved brand that is wrong for someone's skin. I had to make skin needs, avoided ingredients and budget always win, through both prompt rules and a hard server-side check, so Qloo only ever picks between safe options.

Designing tools an LLM can use well. My first design had a separate tool for every combination of recommend, compare and trending across five entity types. Instead I built three tools with an entity type argument, compact outputs and clear status codes. Fewer, simpler tools made the agent much more reliable at choosing the right one.

Qloo has no product type. Brand affinity is the closest signal, so I combined it with the app's catalog and Google Search grounding to turn brand taste into real, verified product suggestions.

Handling missing data gracefully. Not every user has favorite brands saved, not every city has data, and an upstream call can fail. Each tool returns explicit statuses such as needs-location, no-match and unavailable, and the agent falls back to skin-only guidance without ever showing the user an error.

Privacy. Skin data is sensitive. Only brand names, an age range, an optional gender and a city are ever sent to Qloo. Scan data, images, skin type, name, email and phone number stay on my servers.

Accomplishments that we're proud of

I am proud that taste is the deciding factor in what Alina recommends, not decoration. Remove Qloo and the same scan gives everyone the same generic answer.

I am proud of building an agent that knows when to use Qloo: before recommending in chat, before saving a recommendation after a scan, when comparing two options, and when someone asks what is popular, while knowing when not to.

I am also proud of the privacy design, which uses coarse signals instead of raw personal data, and of a reliability design that keeps the app useful when Qloo has no answer.

What we learned

Cultural intelligence changes the answer, not just the wording. Grounding a recommendation in what people like makes it feel chosen for the person rather than generated at them.

I learned how to design function-calling tools for a language model: fewer, broader tools with structured statuses beat many narrow ones. I learned that coarse signals like an age range and a city are enough to personalize without collecting more than is needed. And I learned that an agent has to be told as clearly when not to act as when to act, especially when it can both advise and save.

What's next for Alina

Next, I plan to use Qloo's tag taxonomy to match skincare "vibes" such as minimalist, clean beauty or glam, so recommendations capture style as well as brand. I also want proactive alerts when a user's favorite brands start trending (background job), verified skincare influencer and podcast discovery, local store and clinic discovery, and a taste onboarding flow for new users.

Beyond Qloo, I plan to add real-time facial scanning (considering connecting to external camera source, for example home camera or ring), mobile apps for Android and iOS, voice conversations with the assistant, ingredient compatibility checking, routine adherence tracking, and deeper trend analysis across months of skin history.

Built With

Share this project:

Updates

Submission history