← Projects

SFW presence proof: character-led motion without the hosted/adult path. Local Mode is still the interactive try-link.

Rally

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

Product engineer · Ungated SFW clip + architecture on this page; live demo Access-gated; source private

ReactViteLive2DHonoCloudflare Workers
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.

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 owns reusable character identity, memory, tools, and operator approvals.
  4. 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.

Media

Rally landing page showing the Live2D character product surface
Product surface: character-led UI, not a chatbot with a mascot bolted on.
Rally adventure scene with Live2D character, visual novel background, and dialogue box
Relationship loop UI: presence, scene, and dialogue in one surface (product chrome, not the adult gate).
# ai# visual-novel# local-first# product-engineering