# Rally

> Waifu visual novel chat experience with Live2D, memory, and a relationship loop you can actually play.

- Role: Product engineer
- Status: Ungated SFW clip + architecture on this page; live demo Access-gated; source private
- Stack: React, Vite, Live2D, Hono, Cloudflare Workers
- Page: https://thomasjvu.com/projects/rally
- Markdown: https://thomasjvu.com/projects/rally.md

## Links

- [Demo (Access-gated)](https://app.rally.sh)

## Metrics

- Public proof: SFW clip + architecture — Portfolio page carries an SFW presence clip and an architecture walkthrough recruiters can inspect without login.
- Product path: Access-gated — app.rally.sh (including Local Mode) currently sits behind Cloudflare Access — ask for a demo login or walkthrough.
- Runtime split: First Phantasy product — Shipped consumer proof that the Phantasy character runtime can power a real playable loop.

## Writeup

## Overview

Rally is a waifu visual novel chat experience you play with, not a chat box with a portrait. Live2D presence, memory, dates, inventory, and progression sit in one product. Ordinary chat history can stay in the browser. The hosted path is gated.

Audience note: the *hosted* product is adults-only. The engineering proof below does not require that path. Source is private; available on request for serious hiring conversations.

## How to evaluate (recruiter path)

You do not need hosted access, adult content, or a public repo to judge the work.

1. **SFW presence clip** — short muted loop on this page (stage idle). Character product motion without needing a login.
2. **Architecture** — browser client (React/Vite/Live2D + local state) talks to Cloudflare Workers (Hono) for product/entitlement state; Phantasy owns the character runtime boundary.
3. **Runtime split** — Rally owns consumer loops (dates, wardrobe, access gates). [Phantasy](/projects/phantasy) owns reusable character identity, memory, tools, and operator approvals.
4. **Live demo** — [app.rally.sh](https://app.rally.sh) is currently behind Cloudflare Access (including Local Mode). I can grant a short-lived demo login for hiring conversations.

If you only have five minutes: SFW clip + architecture is enough. Interactive demo and source walkthroughs are available on request.

## Architecture

```text
Browser (Local Mode)
  React + Vite UI
  Live2D presence
  local chat / runtime state where possible
        |
        | product state, entitlement, hosted handoff
        v
Cloudflare Workers (Hono)
  sessions, affection, dates, inventory, mana, payments
        |
        | character runtime boundary
        v
Phantasy engine
  identity, memory, tools, approvals
```

What stays local vs what needs a server is intentional: chat can be private in the browser; entitlement and durable product state cannot pretend to be.

## Problem

Most companion demos are a system prompt plus a sprite. They do not remember anything useful, they have no product loop, and they cannot be judged except by reading the transcript. Rally exists to make personality, memory, and progression visible.

## What I built

The client is React and Vite with Live2D, local storage for ordinary chat and runtime state, and optional local model loading. The API is Hono on Cloudflare Workers: profile sessions, affection, dates, inventory, mana, payment state, and hosted-session handoff.

I designed the product boundary so Rally owns consumer-specific loops (dates, wardrobe, access gates) while Phantasy owns reusable character runtime.

## Hard parts

- Keeping chat local without lying about what still needs a server (product state, entitlement).
- Making Live2D, visual-novel scenes, and model turns feel like one product instead of three widgets.
- Designing a Local Mode path people can try, while keeping hosted/adult chat behind a real access check (the live hostname is Access-wrapped today; portfolio media is the ungated proof).

## Result

Rally is the first playable product on the Phantasy runtime. Recruiter-reachable proof on this page: SFW presence clip + architecture. The live app hostname is Access-gated today; I share demo logins and private source on request for serious hiring conversations. Hosted chat stays gated for the adult product path.
