a scene that never happened — between Ilya & Shane
A fan fiction dialogue generator for Ilya Rozanov and Shane Hollander from Heated Rivalry by Rachel Reid. Pick a preset scene or describe your own, and watch the two of them talk themselves into a corner.
This is a fan creation. Not for profit. No copyright infringement intended.
- 6 preset scenes + custom scene input (Chinese or English)
- Instant or typewriter-style animation, switchable
- Auto Chinese subtitle translation — natural, colloquial, no 翻译腔
- One-click copy (scene description + full dialogue)
- Save as image — long card or compact 2-image set (Chinese / English / bilingual)
- Smart auto-scroll that stops if you scroll manually
- React + Vite
- DeepSeek API (default)
- GitHub Models API — GPT-4o via
models.inference.ai.azure.com(fallback / alternative) - All API calls go through a local Vite dev proxy, so keys are never exposed to the browser
-
Clone the repo
-
Copy the example env file and fill in your key(s):
cp .env.example .env
Edit
.env:GITHUB_TOKEN=your_github_token_here DEEPSEEK_API_KEY=your_deepseek_api_key_hereYou only need one key to get started. DeepSeek is the default provider; the app falls back to GitHub Models if you have both.
-
Install dependencies and start the dev server:
npm install npm run dev
-
Open
http://localhost:5173in your browser.
API key notes
- DeepSeek key: get one at platform.deepseek.com/api_keys
- GitHub token: requires access to GitHub Models (Copilot subscription or Models beta)
Keys live in .env, which is gitignored and never committed. The Vite dev server proxies all API calls server-side, so keys are never visible in the browser or the built bundle. If you deploy this somewhere, make sure to handle the proxy yourself (e.g. a serverless function or your own backend) — do not put API keys directly in frontend code.
This is a non-commercial fan work. Characters and the fictional hockey universe are based on Heated Rivalry by Rachel Reid. No profit is made, and no copyright infringement is intended. All original creative content belongs to their respective owners.