Harmony
Most homeschool families try three or four curricula before finding the right fit — that’s $900+ wasted per learner. Harmony runs a five-minute learner profile and returns a ranked, buyable year-long plan of what actually fits, before you buy.
Homeschool parents face a fragmented curriculum market with no objective way to compare options. The average family burns through three or four bad picks — about $900 — before landing on something that fits. Harmony turns that decision into a five-minute learner profile and a ranked, buyable year-long plan, with the underlying recommendation logic exposed so a parent can see why each option made the list.
Built solo: a Vite + React 19 consumer app on top of a Supabase backend (17-table schema, 13 API endpoints), a subject-taxonomy-aware planner, multi-child support (cap of 4 per family), Stripe checkout, and 114 passing vitest cases across 13 test files covering scoring, planner mutations, and grade filtering. Underneath the product sits a two-phase LLM tagging pipeline (Haiku for web-search-grounded research, Sonnet for structured extraction) that’s tagged 1,307 curricula across 10 pedagogical dimensions — parent involvement, independence, structure, screen time, approach, learning style, religious content, consumable, additional materials, presentation — powering the recommendation engine.
Growth runs end-to-end through code: a Meta Ads automation layer programmatically creates and reports campaigns; landing-page variants are A/B-tested in production with Playwright-driven UX QA capturing every state. Campaign 02 hit 35 signups at $1.67/signup, a 7.34% CTR (5–10× the FB education benchmark), 25.6% landing-page conversion, and 87.5% questionnaire completion.
subject_taxonomy tree (17-table Supabase schema), a compute_default_subjects(grade) SQL function that seeds K-12 subject shells (K-5: math/LA/science/history/art … grade 12: calculus/essay-writing/physics/gov/languages/electives), a children table with soft-delete (is_active) and a partial index on (family_id) WHERE is_active to enforce the 4-child ceiling, and a scoring function (lib/scoring.js) that ranks against 10 tag dimensions with weighted matches and returns positive / negative / nudge reasons per result. supabase/migrations/2026_04_16_multi_child_support.sql · api/recommend.js · api/plan-subjects.jsprojects/homeschools/harmony/pipeline/tag.pyscripts/meta_ads/ · projects/homeschools/harmony/analysis/