RemiFabre
Initial commit
61f606d

Chess Emotions App - Plan

My Understanding

You want a chess app where:

  1. You play chess in the browser against Stockfish
  2. Reachy Mini reacts with emotions based on how good/bad your moves are

The fun twist: Reachy is "rooting for" Stockfish (the computer), so when you make a bad move, Reachy is happy - and when you make a good move, Reachy gets nervous or upset!

Technical Approach

Architecture

┌─────────────────────────────────────────────────────┐
│                    Browser (static/)                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │
│  │ Chess Board │  │ Stockfish   │  │  Emotion    │  │
│  │ (chessboard │  │   (WASM)    │  │  Trigger    │  │
│  │    .js)     │  │             │  │  (to REST)  │  │
│  └─────────────┘  └─────────────┘  └─────────────┘  │
└───────────────────────────┬─────────────────────────┘
                            │ REST API calls
                            ▼
┌─────────────────────────────────────────────────────┐
│              Reachy Mini Daemon (port 8000)         │
│   /api/move/play/recorded-move-dataset/{dataset}/  │
│                     {emotion}                       │
└─────────────────────────────────────────────────────┘

Components

  1. Chess UI - Using chess.js + chessboard.js libraries (both run in browser)
  2. Stockfish - Using stockfish.js (WebAssembly, runs entirely in browser)
  3. Move Evaluation - Stockfish provides centipawn scores to evaluate moves
  4. Emotion Mapping - Map evaluation changes to emotions via REST API

Emotion Mapping (Draft)

Move Quality Eval Change Reachy's Reaction
Brilliant! User gains 200+ cp fear1, scared1, anxiety1
Good move User gains 50-200 cp worried, uncomfortable1
OK move -50 to +50 cp attentive1, thoughtful1
Mistake User loses 50-200 cp cheerful1, enthusiastic2
Blunder! User loses 200+ cp laughing1, success1, dance1
User checkmates Game over sad2, furious1, rage1
Stockfish wins Game over enthusiastic1, dance2, proud3

Libraries (all browser-based, no backend needed)

  • chess.js - Chess logic, move validation, game state
  • chessboard.js - Interactive board UI
  • stockfish.js - Stockfish WASM for move generation & evaluation

Questions

Q1: Reachy's allegiance?

Should Reachy root for Stockfish (funny) or for you (supportive)?

  • [ x ] Stockfish - Reachy is happy when you blunder, sad when you play well (funnier!)
  • You - Reachy cheers your good moves, sad when you blunder (supportive)

Q2: Stockfish difficulty?

Should Stockfish play at full strength or be adjustable?

  • Full strength - Maximum pain, Reachy will be happy a lot
  • [ x ] Adjustable - Slider to set ELO (e.g., 800-3000)
  • Fixed weaker - Set to ~1500 ELO for casual play

Q3: Reaction frequency?

How often should Reachy react?

  • [ x ] Every move - Constant reactions (might be chaotic)
  • Significant moves only - Only react to mistakes/good moves (>50cp change)
  • Dramatic moments - Only blunders, brilliant moves, and game end

Q4: Additional features?

Any extras you'd like?

  • Move commentary - Brief text explaining why the move was good/bad
  • [ x ] Sound effects - Reachy makes sounds with emotions --> Note that the emotions already have sounds when played !
  • Game history - Show evaluation graph over time
  • Hints - Button to ask Stockfish for a hint

Implementation - DONE!

How to Run

  1. Make sure the Reachy Mini daemon is running (on port 8000)
  2. Run the app:
    cd /home/remi/reachy_mini_apps/chess_emotions_app
    python -m chess_emotions_app.main
    
  3. Open http://localhost:8042/static/index.html in your browser
  4. Play chess! Reachy will react to every move.

What Was Implemented

  • Web UI with chessboard.js (drag & drop pieces)
  • Stockfish 16 WASM running in browser with adjustable ELO (800-2800)
  • Live evaluation bar showing position advantage
  • Emotion mapping based on centipawn changes:
    • Brilliant move (>200cp gain): Reachy gets scared/anxious
    • Good move (50-200cp): Reachy is uncomfortable
    • Neutral move: Reachy watches attentively
    • Mistake (-50 to -200cp): Reachy is cheerful
    • Blunder (>200cp loss): Reachy laughs and dances!
    • Game over: Rage if you win, celebration if Stockfish wins

Files

  • static/index.html - Chess UI layout
  • static/style.css - Dark theme styling
  • static/main.js - Chess logic, Stockfish integration, emotion triggers
  • main.py - Minimal Python wrapper (serves static files)