github elophanto/EloPhanto v2026.05.22
v2026.05.22 — Dashboard mascot

latest releases: v2026.08.11, v2026.08.07, v2026.06.20...
3 months ago

First dated release on top of v2026.05.20.2.

What's new

Terminal dashboard mascot 🆕

The terminal dashboard gets a small ASCII character at the top of the sidebar whose face mirrors agent state at a glance — sleep / idle / thinking / working / happy / concerned / humbled.

╭───────────╮
│           │
│  ◔     ◔  │      thinking — pupils rotate
│     ·     │
│   · · ·   │      thought dots accumulate in the bottom row
╰───────────╯
  thinking
  EloPhanto

Lives entirely inside the existing Textual dashboard — no new windows, no GUI dependency, no extra process.

State priority chain: concerned > happy > working > thinking > humbled > idle > sleep. Reads from mind_state, current_tool + freshness, ego_mood, ego_coherence, recent events scanned for error/success markers, and a last_activity_ts stamped on every gateway message (RESPONSE, EVENT, APPROVAL, ERROR) so the face lights up even during chat-only sessions where no mind cycle fires.

Super-alive animations

Each state's animation does more than a single trick:

  • sleep — Z drifts diagonally up-left across the top row, fades, repeats
  • idle — glance left → blink → glance right → mouth-shift → blink
  • thinking — pupil rotation ◔→◓→◑→◒ AND thought dots accumulating in the bottom row (·· · ·)
  • working — mouth flexes (o/O//·) + eyes occasionally look down at the work
  • happy — squint + tiny laugh moment with open mouth + occasional wink
  • concerned — eyes dart nervously left/right + mouth quivers + stress blink
  • humbled — mostly still + rare slow blink (alive but quiet, not frozen)

Frame width is pinned across every frame of every state so the sidebar never reflows on a state change. Transitions inject a brief closed-eye frame (Disney's anticipation principle).

Config

# config.yaml (default)
dashboard:
  mascot_enabled: true

Disable by setting mascot_enabled: false. Setting is picked up at dashboard launch.

What we explicitly didn't do

  • No "breathing" vertical-shift motion. Prototyped and removed — in character cells it reads as a discrete hop, not breath. State-internal animation carries the aliveness signal instead.
  • No floating overlay window. Would contradict EloPhanto's TUI-first positioning.

Tests

32 tests covering state priority chain, rendering invariants (frame-width consistency, color contract, transition anticipation), and panel-side event scanning. All green; ruff + mypy clean.

Updating

./update.sh

The migrator does not need to touch your config.yaml for the mascot — it's enabled by default and reads dashboard.mascot_enabled if you've explicitly added the key. Set to false to opt out.

Commits

  • 61b38ea Dashboard mascot: 7-state ASCII face in sidebar with animation
  • f5760f7 Mascot: richer per-state animation (Z drift, glances, thought dots, wink, eye-darts)
  • 7968e53 Release v2026.05.22

Full diff: v2026.05.20.2...v2026.05.22

Don't miss a new EloPhanto release

NewReleases is sending notifications on new releases.