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.
- SFW presence clip — short muted loop on this page (stage idle). Character product motion without needing a login.
- Architecture — browser client (React/Vite/Live2D + local state) talks to Cloudflare Workers (Hono) for product/entitlement state; Phantasy owns the character runtime boundary.
- Runtime split — Rally owns consumer loops (dates, wardrobe, access gates). Phantasy owns reusable character identity, memory, tools, and operator approvals.
- Live demo — 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
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.

