Essential Relaxation 🧘
The Problem Worth Solving
Stress is invisible — until it shows up on your face. Dark circles, eye bags, tension lines, dryness, redness, loss of firmness, faded radiance. Most people notice these signs but have no idea what to do with them beyond skincare products that treat the surface.
Essential Relaxation treats the cause — stress itself.
The app reads the stress signals on your face and translates them into a personalized nature-and-art experience. Not generic wellness advice. A response calibrated to what your face is actually showing. There's no other app that does this — reads your stress biometrically and responds with a matched nature experience, an artwork, and a guided audio passage, all in one flow.
I built it for my wife. I think anyone who needs a moment of calm will get something from it.
Who It's For
Anyone who needs to decompress but doesn't know where to start. You don't need to know you're stressed — your face already does. The app reads it for you and gives you exactly what you need in that moment: a landscape that speaks to your specific stress, an artwork made from it, a passage read aloud to you, and the option to order the essential oils that will help.
Try it now
essential-relaxation.williamcheung.buzz
Upload a selfie, get 3 landscape recommendations matched to your stress, pick one, and the app generates an abstract artwork and reads you a calming passage. Takes about 30 seconds from selfie to relaxation.
What It Does
- Upload a selfie — AI skin analysis scans 7 stress indicators (fatigue, tension, dryness, dark circles, flushing, weariness, faded glow) and scores each by severity
- See your Stress Profile — each concern is mapped to a relatable label with severity (e.g. eye bag: fatigue (high), moisture: dryness (mild))
- Choose from 3 landscapes — an LLM translates your stress profile into a therapeutic landscape description, matched against a vector database of 100s of landscape photos. The 3 closest matches are shown — or browse further with next 3
- Experience relaxation — the app generates an abstract artwork from your chosen landscape, writes a calming 80-100 word passage, and reads it aloud via text-to-speech. Hit replay or loop it for a full meditation session
- Enhance with essential oils — optionally match 3 or more essential oils to your specific stress indicators, with aromatherapy justification for each. Order them on Instacart without leaving the app — no store, no hunting down products, no checkout line. Your oils arrive at your door ready for your next session.
- Save your session — create a collage of your landscape, its abstract artwork, and the other recommended landscapes. Download it and keep it as something to come back to when you need calm again
How It Works
The Pipeline
Selfie
→ YouCam Skin Analysis API → stress scores (7 indicators)
→ Gemini 2.5 Flash Lite (skin_to_landscape prompt) → landscape description
→ Gemini Embedding 2 (image + text in shared vector space) → cosine similarity search
→ top 3 landscape matches from pre-computed image embedding index
→ user selects landscape
┌─────────────────────────────────────────────┐
│ parallel │
│ Gemini Vision → landscape description │
│ → OpenAI gpt-image-1 → abstract artwork │
│ Llama 3.3 70B → relaxation passage │
└─────────────────────────────────────────────┘
→ Browser TTS reads passage aloud
→ optional: Gemini → essential oils list
→ Gemini + Google Search → UPC codes
→ Instacart Products Link API → shopping list
The Semantic Landscape Matching — the Core Idea
The most technically interesting piece is how landscapes are matched to stress profiles without any labeled training data.
Offline: Each landscape .jpg is embedded by Gemini Embedding 2 into a 3072-dimensional vector. Gemini's multimodal embedding model places images and text in the same semantic space — so an image of a misty lake and the words "misty lake" land near each other.
At runtime: The stress profile is fed to Gemini with a mapping guide that translates each stress indicator into concrete visual elements:
fatigue → peaceful stillness: undisturbed lakes, sleeping valleys, sheltered coves
dryness → water-rich scenes: rivers, misty forests, dewy meadows, waterfalls
tension → smooth, flowing elements: calm water, gentle rolling hills, soft clouds
This produces a landscape description which is embedded into the same space as the images. Cosine similarity finds the 3 closest matches. No fine-tuning, no labeling — just a shared semantic space and a well-designed prompt.
Model Selection
Different tasks use different models, chosen deliberately:
- Gemini 2.5 Flash Lite for structured mapping (stress → landscape, stress → oils, oils → UPCs) — fast and sufficient for instruction-following tasks with explicit guides
- Gemini Vision for landscape photo analysis — describes the selected landscape in sensory detail, feeding both the artwork generator and Llama
- Llama 3.3 70B for the relaxation passage — a larger model chosen for its warm, flowing prose quality that makes meditative text feel genuinely calming
- OpenAI gpt-image-1 for artwork — produces richer, more dreamlike abstract imagery than alternatives tested
Six Prompts
The app's intelligence runs on 6 carefully engineered prompts:
- Stress-to-landscape mapping — translates 7 stress indicators into a concrete 2-3 sentence visual description, constrained to searchable language (no metaphors, no poetry) because it feeds directly into the embedding search
- Landscape vision — describes a landscape photo in sensory-rich detail, feeding both the artwork generator and Llama
- Abstract artwork generation — instructs the image model to create a fully non-representational pattern, explicitly prohibiting literal depictions
- Relaxation passage — 80-100 word calm passage designed for TTS, avoiding poetic flourishes that feel performative when spoken aloud
- Essential oils recommendation — maps stress indicators to 3-5 single essential oils with aromatherapy justification, outputs structured JSON
- UPC lookup — uses Gemini with Google Search grounding to find real UPC codes for 0.5 oz bottles, enabling accurate Instacart product matching
Infrastructure
- Gradio — async UI with streaming so results appear progressively without blocking
- NumPy — in-memory vector store; full embedding index loads once at startup, cosine similarity is a single matrix multiply
- LangChain — LLM chaining and prompt templating
- Tenacity — retry with exponential backoff for all external API calls
The Experience
The app is designed to never make you wait in silence. Results appear as they're ready — the landscape matches show immediately, the artwork loads while the passage is being written, and the passage starts reading aloud as soon as it's done. You can replay it, loop it, or mute it. The pacing is intentional: a relaxation app that feels rushed or broken defeats its own purpose. The whole flow from selfie to relaxation takes about 30 seconds and requires nothing from you except choosing a landscape.
The Product Decisions That Matter
Why landscapes? Nature has the most robust evidence base for stress reduction — attention restoration theory, stress recovery theory. It's not a gimmick. The app picks the right kind of nature for your specific stress, not a random peaceful image.
Why abstract artwork? Looking at representational landscape photos keeps your mind active identifying things. Abstract artwork lets you drift. The prompt explicitly prohibits literal depictions for this reason.
Why Llama 3.3 70B for the passage? Tested multiple models. Llama's prose has a distinctive warmth and natural rhythm that makes the meditative text feel genuinely calming when read aloud. Smaller models produce text that sounds like instructions.
Why essential oils + Instacart? The app name isn't accidental — aromatherapy is a natural complement to the visual and audio relaxation experience. Each oil is matched to your specific stress indicators, not a generic recommendation. And oils are only useful if you actually have them — ordering from within the app using UPC codes for accurate product matching removes the friction of a separate shopping trip. One less thing to think about is itself a form of stress reduction.
Why TTS in the browser? No API call, no latency, no key. The Web Speech API runs client-side. For a relaxation app, removing any delay between selecting a landscape and hearing the passage matters.
Why the collage? The session should leave something tangible. A downloaded collage gives you a visual reminder of that moment of calm — something to come back to.
Challenges Solved
- Stress-to-landscape prompt conflicts — early versions produced contradictory visual signals (e.g. tired eyes → dim scenes conflicted with faded glow → bright scenes). The final guide resolves conflicts by prioritizing severity and finding elements that satisfy multiple concerns simultaneously.
- Embedding quality — solved by using the Kaggle landscape dataset which provides 100s of varied photos, giving the vector search enough coverage to return meaningfully different results for different stress profiles.
- Instacart product matching — their Products Link API is grocery-optimized. UPC-based matching via Gemini + Google Search grounding significantly improves essential oil resolution compared to name-only search.
- Progressive UI — async generators stream intermediate states (show landscape immediately, then artwork, then passage) without breaking the calm pacing of the experience.
Essential Relaxation
I built this for my wife but I think anyone who needs a moment of calm will get something from it. You upload a selfie, the app reads your stress and finds you a landscape, and turns it into an abstract artwork just for you. That's it — and you're somewhere soothing for a while.
Built With
- ai-skin-analysis
- google-embedding
- google-gemini
- gradio
- instacart
- kaggle-dataset
- langchain
- meta-llama
- nebius
- openai-image
- python
- tenacity
- text-to-speech

Log in or sign up for Devpost to join the conversation.