Back to home

william-jin-cmu

dsh-gal

Galgame / visual-novel UI plugin for the DeepSeek Harness: a whale-girl companion with animated expressions, scene-at-a-time dialogue, and an LLM emotion judge

Stars
0
Language
TypeScript
Created
Aug 15, 2026
Updated
Aug 16, 2026

Introduction

dsh-gal

A galgame / visual-novel UI for the DeepSeek Harness (dsh), packaged as a dsh plugin.

Your agent becomes a whale girl. Each reply plays as a dialogue scene — typewriter text, one turn at a time, no scrolling wall of history — while she reacts with animated expressions chosen by an emotion judge. The backlog is one click away, just like a real visual novel.

dsh-gal

What it does

  • Scene-at-a-time dialogue — only the latest exchange is on screen, rendered with a typewriter effect. Long replies page like VN text boxes (click / Space to advance, Auto mode available).

  • Animated whale girl — six expressions (neutral, happy, thinking, surprised, sad, excited), each a looping micro-animation (Seedance 2.0 mini / MiniMax H3 image-to-video on fal.ai, from AI-generated base sprites); layers cross-fade on emotion change.

  • Emotion judge — after each assistant turn, a tiny side LLM call classifies the reply's tone into one of the six expressions; a keyword heuristic covers fallback. While the agent works, she switches to thinking and a status ticker shows tool activity.

  • Backlog — press L or click History for the full scrollable conversation log.

    backlog

  • Drive the session from the UI — the input box sends real user turns into the live dsh session.

Install

git clone https://github.com/william-jin-cmu/dsh-gal
cd dsh-gal && ./scripts/build.sh   # links against your dsh checkout and compiles src/ → lib/

Register it in ~/.dsh/cordis.patch.yml (older builds: ~/.dsh/config.yaml):

- insert:
    - id: dsh-gal
      name: /absolute/path/to/dsh-gal/lib/index.js
      config:
        port: 4877          # UI at http://127.0.0.1:4877/
        characterName: Cetus

Start dsh web as usual and open http://127.0.0.1:4877/. If no session is open yet, the first message you send opens one on your default model — the novel is playable standalone.

Configuration

keydefaultdescription
port4877Listen port on 127.0.0.1
token""Optional shared token appended to the URL
characterNameCetusName shown on the dialogue nameplate
judgeEnabledtrueUse an LLM call to pick the expression (heuristic fallback otherwise)
judgeTimeoutMs4000Deadline for the emotion judge before falling back

Regenerating the art

The sprites and motion loops ship with the repo, but everything is reproducible:

  • Base sprite + expression variants: any strong image model — generate one base portrait, then edit it per expression with the base as reference so the character stays consistent
  • Micro-animations: scripts/animate.sh <sprite.png> <out.mp4> "<motion prompt>" [h3] — Seedance 2.0 mini image-to-video on fal.ai (bytedance/seedance-2.0/mini/image-to-video, 720p ≈ $0.15/s) by default, MiniMax H3 (minimax/h3/image-to-video, 768P) with the h3 arg

License

BSD-3-Clause