A small Windows app for blending essential oils. Pick your top, middle, and base notes, a carrier oil, and a bottle size, and it works out a properly diluted recipe — how many millilitres of each oil to use — using the classic 30/50/20 note ratio at a 3% dilution. It also shows the scent profile of your blend and includes a built-in reference on every oil, read aloud if you like.
Personal project. For hobby blending — not medical advice. Essential oils are potent; always dilute and patch-test, and check guidance before use on skin.
Get the latest version —
download EssentialOils-x.y.z-x64.msi from the latest release and run it. It installs
like any normal program (shows in Add/Remove Programs, and a newer version replaces
the old one automatically). No setup or accounts. (It's a personal build and not
code-signed, so Windows SmartScreen may warn — choose More info → Run anyway.)
- Recipe builder — select oils across the Top / Middle / Base note columns, a carrier oil, and a bottle size (15 ml → 960 ml), then click Create Recipe for a per-oil millilitre breakdown.
- Smart ratios — uses the 30/50/20 top/middle/base split at a 3% essential-oil dilution, and automatically redistributes a tier's share across the others when you leave that tier empty.
- Scent profile — highlights the fragrance families (Citrus, Floral, Herbal, Spicy, Woody) and effects (Energizing, Relaxing, Cleansing, Grounding) your blend covers. Click any family or effect to list the oils in it.
- Oil reference — flip on Research mode for any column and click an oil to read a full description, with text-to-speech (selectable voice) and print.
- Copy / Print / Save — copy the recipe to the clipboard, print it, or save it as a text file you can keep with your notes.
- Windows 10/11 (x64). The .NET runtime is bundled in the installer.
- Text-to-speech uses the Windows system voices (e.g. Microsoft David / Zira).
Prerequisites: .NET 10 SDK and
WiX v5 (dotnet tool install --global wix --version 5.0.2).
# Run the app
dotnet run --project EssentialOils.csproj
# Build the MSI installer (publishes self-contained, then builds the MSI)
pwsh ./build.ps1 -Version 1.0.0Every oil — its note column(s), fragrance families, effects, and reference description —
lives in a single data file, oils.json. The app loads it once at startup,
so adding or editing an oil is just a JSON edit; no code changes. The dilution maths and
scent-profile aggregation are pure, UI-free logic in Recipe.cs, and the
two windows (MainForm.cs and ResearchForm.cs) just
present it.
This project was cleaned up and converted with AI assistance and is set up so you can keep going the same way. To pick up where it left off on your own machine:
-
Get the code onto your PC
git clone https://github.com/dmpotter1361/EssentialOils.git cd EssentialOils -
Install Claude Code (Anthropic's coding CLI) and start it in the project folder:
npm install -g @anthropic-ai/claude-code claude
(You can also use the Claude Code extension for VS Code / JetBrains, or claude.ai/code.)
-
Point Claude at the project and ask for what you want. A good first prompt:
Read the README,
oils.json, andRecipe.cs, then run the app so you understand it. I'd like to add <your feature>.
oils.json— the single source of truth: every oil and carrier with its families, effects, and description. Edit this to add or change oils.OilCatalog.cs— strongly-typed model + loader foroils.json.Recipe.cs— pure dilution maths (the 30/50/20 split and redistribution) and scent-profile aggregation. No UI — the easiest place to add a test.MainForm.cs— the main window: list boxes, the recipe builder, profile highlights, copy/print/save.ResearchForm.cs— the per-oil description popup with print and text-to-speech.installer/Package.wxs+build.ps1— the WiX MSI installer.
Essential Oil Mixer was originally written by the author in Visual Basic. It was later cleaned up and rewritten in C# / .NET 10 collaboratively with Claude (Anthropic's AI) — consolidating the oil data into a single source of truth, untangling the duplicated logic, fixing a few bugs, and adding the installer and this README. The direction, decisions, and real-world testing are human; a lot of the cleanup and conversion was AI-assisted — and we're happy to say so. 🤖🤝