Team: Victoria Sister Fans Club · Members: Hailey Cheng (CityUHK) · Rabin Sarki (HKUST)
Mood is a cozy pixel art farming game that helps you manage stress, stay emotionally balanced, and build a healthier relationship with technology by turning daily journaling into something you actually want to do.
Write a reflection in the Journal House. AI reads the emotional tone and grows a plant in your garden that matches how you feel. Come back the next day and the garden will have grown a little more. Over time it becomes a quiet, living record of your inner life.
Stress, emotional imbalance, and screen fatigue are real and daily. The tools that exist to help (journaling apps, mindfulness timers, mood trackers) often feel clinical and transactional. People use them for a week, then stop. There is no reason to return.
We believe that is a design problem, not a habit problem.
Mood wraps the same healthy practices inside a cozy game world. Reflecting on your day feels like planting something. Breathing exercises happen by a quiet duck pond. The garden that grows is yours, shaped by your actual emotional patterns, not a generic progress bar.
The result is a tool for psychological well-being that you come back to because you want to, not because you scheduled a reminder.
Write freely inside the Journal House. Gemini 2.0 Pro reads your emotional tone (happiness, calm, stress, gratitude, growth) and a matching plant appears in your garden. No categories to select, no ratings to submit. Just writing.
Your garden is a visual record of your emotional patterns over time:
- Happy days grow Sunflowers
- Gratitude grows Daisies
- Calm grows Lotus flowers
- Stress grows Lavender
- Personal growth grows Oak saplings
Plants grow from seed to full bloom as your entries build up, so the garden always tells a real story.
Box breathing, body scan, and a 5-senses grounding exercise are built into the farm. Not hidden behind a menu, but places you walk to. The pond is where you breathe. The world slows down when you are there.
After enough journal entries, the game summarises your emotional week in a short, supportive paragraph written by Gemini 2.0 Pro. Never preachy. Just a gentle mirror.
Plants grow a little faster when you return after a real break. The game is designed to reward presence, not screen time. A healthier tech-life boundary built into the loop itself.
There are NPCs to talk to, quests to follow, and a farm to explore at your own pace. The cozy game layer is not decoration; it is what makes the well-being practices feel worth returning to every day.
| Framework | Next.js 14 (App Router) |
| Game Engine | Phaser 3 |
| Styling | Tailwind CSS |
| State | Zustand |
| AI | Gemini 2.0 Pro by Google |
| Database | Supabase |
| Deployment | Vercel |
| Pixel Art | Cozy Valley by iclaimthisname (premium) |
| Dev Tooling | Claude Code by Anthropic |
We used Claude Code throughout for game architecture, the quest system, audio management, UI polish, and a lot of the iteration in between. It felt like pair programming with someone who never gets tired.
mood/
├── app/ # Next.js App Router pages and API routes
│ ├── api/
│ │ ├── analyze/ # Emotion analysis + plant/journal save
│ │ ├── emotion-analysis/ # Daily record mood aggregation
│ │ └── weekly-summary/ # AI-generated weekly reflection
│ ├── game/
│ │ └── page.tsx # Main game page
│ ├── layout.tsx
│ └── page.tsx # Landing / home page
│
├── components/
│ ├── game/ # In-game React overlays
│ │ ├── HUD.tsx # Heads-up display (mood, streak, quests, time)
│ │ ├── JournalModal.tsx # Journaling interface
│ │ ├── BreathingOverlay.tsx# Mindfulness activities
│ │ ├── DailyRecordModal.tsx# Mood history and AI insights
│ │ ├── WeeklyInsightModal.tsx
│ │ ├── TutorialOverlay.tsx
│ │ ├── AvatarPickerOverlay.tsx
│ │ ├── DialogOverlay.tsx # NPC dialogue
│ │ └── GameCanvas.tsx # Phaser mount point and event bridge
│ ├── menu/
│ │ ├── MainMenu.tsx
│ │ └── SettingsModal.tsx # Audio volume, journal tone, display
│ └── ui/ # Reusable glassmorphism components
│ ├── GlassModal.tsx
│ ├── GlassButton.tsx
│ ├── GlassSlider.tsx
│ ├── GlassToggle.tsx
│ └── GlassPanel.tsx
│
├── game/ # Phaser game source
│ ├── PhaserGame.ts # Game config and init
│ ├── EventBridge.ts # Phaser to React event bus
│ ├── scenes/
│ │ ├── BootScene.ts # Asset preloading
│ │ └── FarmScene.ts # Main game world
│ ├── objects/
│ │ ├── Player.ts # Player sprite and movement
│ │ ├── NPC.ts # NPC behaviour
│ │ └── PlantSprite.ts # Garden plant rendering
│ ├── systems/
│ │ ├── GardenSystem.ts # Plot layout and growth logic
│ │ ├── DayNightSystem.ts # Lighting cycle
│ │ └── WeatherSystem.ts # Weather state transitions
│ └── utils/
│ └── CozyValleyLoader.ts # Asset manifest and Phaser loader
│
├── lib/
│ ├── gameStore.ts # Zustand global state
│ ├── audioManager.ts # SFX and BGM manager
│ ├── ai.ts # Gemini integration
│ ├── types.ts # Shared TypeScript types
│ ├── supabase.ts # Supabase client (browser)
│ └── supabaseServer.ts # Supabase client (server)
│
├── database/
│ └── schema.sql # Supabase table definitions
│
├── public/
│ ├── assets/ # Pixel art (tilesets, characters, animals)
│ └── audio/ # BGM and SFX audio files
│
└── tailwind.config.ts
- Node.js 18+
- A Supabase project (totally optional; it runs fine without one)
- A Google Cloud project with Vertex AI enabled (or just flip
AI_MOCK_MODE=trueand skip it entirely)
git clone https://github.com/heilcheng/Mood.git
cd Moodnpm installcp .env.example .env.localThen open .env.local. The only thing you need for a quick local run is:
AI_MOCK_MODE=trueThat is it. The game works fully without Supabase or Google Cloud. If you want the real AI and database, fill in the rest:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
GOOGLE_CLOUD_PROJECT_ID=your-gcp-project-id
GOOGLE_CLOUD_LOCATION=us-central1
GOOGLE_VERTEX_MODEL=gemini-2.0-pro
GOOGLE_APPLICATION_CREDENTIALS=./gcp-credentials.jsonIf you are using Supabase, paste the contents of database/schema.sql into your project's SQL editor and run it.
npm run devOpen http://localhost:3000 and click around. Audio starts on first interaction.
| Key | Action |
|---|---|
WASD / Arrow Keys |
Move character |
Shift + Move |
Sprint |
E |
Interact with nearby NPC / zone |
J |
Open journal from anywhere |
Esc |
Close modals |
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Optional | Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Optional | Supabase anon key |
SUPABASE_SERVICE_ROLE_KEY |
Optional | Service role key (server-side writes) |
AI_MOCK_MODE |
No | true to skip Gemini and use local keyword heuristic |
GOOGLE_CLOUD_PROJECT_ID |
Optional | GCP project ID |
GOOGLE_CLOUD_LOCATION |
Optional | Vertex AI region (default: us-central1) |
GOOGLE_VERTEX_MODEL |
Optional | Model name (default: gemini-2.0-pro) |
GOOGLE_APPLICATION_CREDENTIALS |
Optional | Path to GCP service account JSON |
- Pixel art by Cozy Valley from iclaimthisname, premium license. Tilesets, characters, animals, props, and all environment art.
- Music and ambient from Mixkit royalty-free library (Nap Time for night, Nature Meditation for ambient) plus a cozy piano farm theme for daytime.
- Sound effects from SoundBible (Temple Bell, Computer Magic) under CC and Public Domain licenses.
- AI dev tooling by Claude Code from Anthropic.
Victoria Sister Fans Club
- Hailey Cheng, City University of Hong Kong (CityUHK)
- Rabin Sarki, Hong Kong University of Science and Technology (HKUST)
Built at a hackathon. Your feelings deserve a garden.