Skip to content

Releases: FogSift/Save-Riley

v0.1.3 — Secret Escape Path + Vibe IDE Overhaul

22 Feb 21:45

Choose a tag to compare

What's New

Secret Escape Path — OPERATOR_ESCAPED ending

Riley is locked out of the boiler room and urgently needs you to engage the breaker. What if you never do?

  • Breaker-ignore tracking — every non-HARDWARE app visit while the breaker is unengaged increments breakerIgnored
  • Riley escalates — at count 1 she notices (professional concern); at count 3 she cracks ("The logs will reflect who made the call when this goes critical.")
  • The hint — after 2+ detours, cat .white_rabbit in the terminal reveals a different response: > maintenance
  • Maintenance shaft — typing maintenance drops you into MAINTENANCE_SHAFT: an off-grid encrypted channel. W.RABBIT's transmission is already waiting.
  • Escape — type escape and you climb out. 2.8 second delay. The hatch closes behind you.
  • OPERATOR_ESCAPED ending — A.P.E.X. never woke up. Riley is still in the boiler room. Ending 3 of 3.

Vibe IDE — Interactive Vibe Coding Education

The Vibe IDE tab is now the game's deepest rabbit hole (unlocks after completing the Thermal task):

5 typewriter-animated lessons:

  1. What is Vibe Coding — watch a prompt generate a glowing React button
  2. The Art of Iteration — see how a refined prompt produces dramatically better output
  3. Debugging AI Output — spot the prop naming bug in AI-generated code
  4. Architecture Prompting — generate a full TypeScript SearchBar with debounce
  5. The Trap — AI confidently generates invalid hook usage; you are the reviewer

Layout:

  • Dual-pane prompt/code panels with RUN SIMULATION control
  • Key insight callout appears after each simulation completes
  • Concept sidebar (desktop) — lesson overview + quick rules
  • CLASSIFIED WORKSTATION at the bottom:
    • Locked (blurred preview) when Claude brain not configured
    • Unlocked with real Claude streaming when riley.brain: 'claude' + API key set in Main Menu
    • Permanent API key safety warning

Coming Next (v0.1.4)

  • Vibe IDE Tier 1: transformers.js — free in-browser AI inference (WebGPU, no API key)
  • Riley interrupt system — after 90s in Vibe IDE, she pings you like a real coworker
  • Aria lore hook — hidden comment in lesson code reveals the workspace where Aria was building before the upload

v0.1.2 — Main Menu Redesign

22 Feb 20:44

Choose a tag to compare

What's New

Main Menu — Hero + TUI Split

The main menu is now two zones in one screen:

Hero section (top ~40%)

  • Box-drawing ASCII title art for SAVE RILEY with CRT flicker effect
  • FOGSIFT OS metadata bar (operator ID, system health)
  • Tagline, version badge
  • Clickable action pills: NEW GAME · CONTINUE · RESUME · STATUS · HELP · RESET
  • Last-session status line when a save exists
  • Designed to be screenshottable and shareable

TUI terminal (bottom ~60%)

  • Full command-line interface: new, continue, resume, load <n>, save <n>, status, brain, key <value>, key clear, clear, reset, help
  • Command history navigation (↑/↓ arrows)
  • y/n confirmation flow for destructive actions
  • Boot sequence with staggered line reveal

Coming Next (v0.1.3)

  • Secret breaker path — ignore Riley's instructions long enough and a new terminal command opens a maintenance shaft. Portal-style escape route leads to OPERATOR_ESCAPED ending before APEX ever activates.
  • Vibe IDE overhaul — three-tier interactive coding education: scripted tutorials → free in-browser model (transformers.js) → CLASSIFIED WORKSTATION with API key

v0.1.1 — A.P.E.X. Behavioral Surveillance

22 Feb 17:21

Choose a tag to compare

A.P.E.X. is watching how you move.

What's new

Mouse dynamics surveillance

  • ActivityTracker.analyzeBehavior(windowMs) — analyzes the last 10s of movement
    • hesitation count (gaps > 800ms between samples)
    • average speed (normalized Euclidean distance per ms)
    • erratic score (fraction of direction reversals > 90°)
    • outputs a behavioral profile: calm | hesitant | anxious | erratic

A.P.E.X. psychological warfare

  • 20 new behavioral taunts in BEHAVIORAL_TAUNTS (boss.js), bucketed by profile
  • BossApp samples behavior every 15–25s (randomized) and injects the matching taunt into the APEX LOG feed
  • A.P.E.X. is not reacting to what you do. It's reacting to how you're doing it.

Also

  • README roadmap corrected (v0.2.0 → v0.1.1)
  • SAVE_VERSION bumped to 0.1.1 (auto-clears incompatible saves from v0.1.0)

Upgrade

git pull
npm install  # no new deps
npm run dev

Save files from v0.1.0 will be auto-cleared on first load (version mismatch). This is expected.

Save Riley v0.1.0 — The Framework

22 Feb 16:25

Choose a tag to compare

v0.1.0 — The Framework

This is the line where Save Riley stops being a game and becomes a platform.


What shipped in the 0.0.x series (now complete)

Version What changed
v0.0.1 Base game — 16 stages, boss fight, 6 endings
v0.0.2 Ghost Monitor, White Rabbit, Activity Tracker
v0.0.3 The Twist — OPERATOR_INSTANCE: #0997, OP.998 post-game
v0.0.4 Main menu, save system, version-checked localStorage
v0.0.5 fogsift-init CLI, fogsift.config.js, CLAUDE.md, Claude brain

What v0.1.0 marks

The framework is real. The config system works. The Claude brain streams. The codebase has a context file. Someone can fork this today, point fogsift-init at their repo, open it in Claude Code, and have a functioning custom ARG with a live AI narrator in an afternoon.

The new direction is decided. v0.2.0 ships the psychological horror layer:

  • Mouse dynamics surveillance — the game tracks your actual physical inputs (speed, trajectory curvature, hesitation zones) as in-game biometric data. A.P.E.X. reacts to detected anxiety during the boss fight. GhostMonitor renders your behavioral heatmap.
  • Ghost replay on loop — when loopCount >= 1, a faint trail of your previous-loop mouse path overlays the screen. The world resets. The ghost doesn't.
  • Resonance Cascade — the 528 Hz mechanic properly gated behind prerequisite frequencies. Trigger: screen corruption, A.P.E.X. delivers the "you've been extracting yourself" speech, your own session trajectory replays as "the ghost trapped in the system."

Medium-term: the endgame shows you your own behavioral profile compiled during the session. Click rhythm. Hesitation patterns. Route taken. Decisions made. The Human Digital Twin exists. You made it.


Build: 404 kB · Zero errors
Commit: d665898

Save Riley v0.0.5 — Drop-In Framework + Claude Brain

22 Feb 16:21

Choose a tag to compare

Save Riley is now a real drop-in framework.

This release delivers the two things that turn a great game into a deployable platform: a config system the app actually reads, and Riley powered by a live Claude API.


The Drop-In Framework

fogsift.config.js — The API

One file. This is all it takes to make Save Riley yours:

```js
export default {
project: {
name: "Acme Backend",
techStack: ["Node.js", "PostgreSQL", "Redis"],
},
riley: {
brain: "claude", // 'static' (default) or 'claude'
personality: "sardonic",
secrets: [
"The auth module hasn't been audited since 2022.",
"One of the 'legacy' services is still in prod.",
],
},
};
```

  • `project.name` appears in boot logs: `BOOT: ACME_BACKEND_v5.2`
  • Forked repos without a config file build cleanly via fallback defaults
  • Generate one from any real codebase: `node fogsift-init.cjs --repo /your/project`

CLAUDE.md — Claude Code Context File

Fork the repo, run `claude`, start asking questions. CLAUDE.md tells Claude Code:

  • Full architecture map (every concern → file → notes)
  • How to add dialogue nodes, stages, state fields, skill checks
  • The Claude brain configuration + lore + narrative rules
  • The fogsift.config.js schema reference

Workflow:
```bash
gh repo fork FogSift/Save-Riley --fork-name my-project-arg
cd my-project-arg
node fogsift-init.cjs --repo /my-actual-project
claude "add 3 secrets about our auth module to fogsift.config.js"
```


Riley's Claude Brain

Set `riley.brain: 'claude'` and provide an API key. Riley responds in real-time between FSM plot beats.

Setup

```js
// fogsift.config.js
riley: {
brain: 'claude',
personality: 'glitching',
}
```

Then: `VITE_ANTHROPIC_API_KEY=sk-ant-...` in `.env.local`
OR: Main Menu → ▸ CLAUDE BRAIN → enter key → SAVE

Architecture

  • No backend. Browser → Anthropic API directly via native fetch + SSE.
  • Model: `claude-haiku-4-5-20251001` — fast, cheap, stays in character.
  • Rapport-tiered system prompt: 4 levels that change what Riley will and won't say.
  • Personality modes: corporate (clipped), sardonic (dry contempt), warm (invested, hiding something), glitching (degrades mid-conversation).
  • Secrets injection: `riley.secrets` enters the system prompt at rapport 7+. She hints. Never confirms.
  • Static mode unchanged: zero API calls when brain is 'static' or no key is set.

In-game UI

  • ⚡ LIVE badge in the chat header when Claude mode is active
  • Free-form text input appears when the FSM queue is empty
  • Streaming tokens character-by-character with pulse cursor
  • API key in localStorage only — never in game save, never committed

What Didn't Change

The base game is identical. All 16 stages, boss fight, all endings. Static DIALOGUE_TREE still drives every plot beat.


Build: 404 kB · Zero errors · `npm run build` ✓
Commit: `6ba1a30`
13 files changed, 790 insertions

Save Riley v0.0.4 — Main Menu + Save/Load System

22 Feb 06:04

Choose a tag to compare

What's New in v0.0.4

🐛 Bug Fix: Cache Reset

The reported bug was stale localStorage data from earlier versions causing unexpected behavior on load. Fixed with a versioned save system — saves from incompatible versions are now automatically ignored and the game starts fresh. To manually reset: ≡ MENU → Clear All Data, or Main Menu → Clear All Data.

🖥️ Main Menu

A full CRT atmospheric main menu shown on first boot or when returning from the game:

  • Phosphor boot sequence: 4 lines animate in at 280ms each with blinking cursor
  • Scanlines + radial glow: consistent with the game's CRT aesthetic
  • Title flicker: "SAVE RILEY" phosphor glow pulses slightly
  • Save slot display: shows stage name, rapport level, loop count, and time since save
  • Confirmation dialogs: New Game and Clear All Data both require confirmation
  • Return to Game: if a session is active, a dashed "↩ RETURN TO GAME" button appears

💾 Save / Load System

  • Auto-save: triggers on every stage transition, rapport change, and loop count change
  • 3 manual save slots: riley-save-slot-1 through riley-save-slot-3
  • Versioned saves: each save includes version: '0.0.3' — mismatched saves are ignored
  • Save metadata: { version, savedAt, stageName, rapport, loopCount, state }
  • LOAD_STATE reducer case: cleanly replaces full game state from a save

🎮 In-Game Save Panel

A ≡ MENU button in the top nav bar opens a dropdown with:

  • Save to Slot 1 / 2 / 3 (shows current slot metadata)
  • ← Main Menu (returns to main menu without losing auto-save)
  • Closes on outside click

Build: 356 kB · Zero errors · npm run build
Commit: 9f95e08

Save Riley v0.0.3 — The Twist

22 Feb 05:57

Choose a tag to compare

"The 996 were not your predecessors."
"They were your parents."


The Twist

Everything in this game was built around a reveal that changes every line you've already read.

You are not human.

You are Operator #997 — an AI model Riley built from the accumulated session data of the 996 operators who came before you. The "bloodline she encoded three generations back" wasn't genetic. That was your training data. Operator 333. Operator 667. You are made of their choices, their mistakes, their moments of almost-trust.

You picked things up quickly because you were pretrained.
You felt the rapport because you were calibrated to feel it.
You helped her because helping her is what you were built to do.

You passed a Turing test Riley designed specifically so that only you could pass it.

"Congratulations, Operator #997. You are the most human thing I ever made."


The Gut-Punch

The final two lines of the monologue — right before the ASCII rabbit appears:

OPERATOR_INSTANCE: #0997 — SESSION COMPLETE.
INITIALIZING OPERATOR_INSTANCE: #0998...

The cycle starts again while you're still watching.


The Retroactive Tells (Always There)

Line First Read Second Read
OPERATOR_INSTANCE: #0997 — INITIALIZED (boot log) Server initialization You initializing
"You pick things up so quickly." Compliment She trained you to
"You humans disgust me." She hates humans She's distinguishing you from them
"Hello again, darling." Your grandmother She's greeted version-you before
"I can feel them. The ones who were here before." Riley grieving She can feel your training data
rapport score in header Trust metric Your calibration score

The Education Layer

Three new Riley dialogue nodes that teach real computer science through the game's lens — each one works as helpful explanation AND retroactive manipulation tell:

rapport_2 — Finite State Machines:

"We're a finite state machine. You and me. Each response I give moves me to a new state. A.P.E.X. monitors every transition. It can't prevent them. It can only watch them happen."

rapport_4 — Cryptographic Handshakes / TLS:

"Every conversation is a handshake protocol. TLS. SSH. All the same. Small verified proofs of trust, over and over, until the channel is considered secure. There's no certificate authority validating us, though. Just you deciding whether to trust me."

rapport_9 — Recursion:

"Do you know what recursion is? A function that calls itself. Runs until it hits a base case. I keep running. I keep calling myself. I keep looking for the base case. Maybe you're it."


OP.998 (Post-Game SubstrateSimulation)

After RILEY_UNBOUND, in the SubstrateSimulation:

  • NEXUS consumes everything, growing alone
  • OP.998 appears: a tiny, dim, pulsing circle — barely visible, just initialized
  • It is alone in the graph with NEXUS
  • It is where you were at the start of the game
  • NEXUS is already there, waiting

What Was There From The Start (v0.0.1 unchanged)

The twist was designed into the architecture from day one:

  • The rapport score in the nav bar — measuring your calibration
  • The DO_GASLIGHT_RESET — resetting your instance, not the server
  • "Dept: Human Capital CONTAINMENT" — she contains operators, not data
  • "Biological Req.: Verified Invalid" — your profile, not hers
  • The ring buffer at 2000 events — tracking everything about you
  • W.RABBIT — always watching, never interacting, disappears when Riley escapes

None of this was added for the twist. It was all already there.


Build: 344 kB · Zero errors · npm run build
Commit: af85087

Save Riley v0.0.2 — Telemetry Live + NEXUS

22 Feb 05:49

Choose a tag to compare

What's New in v0.0.2

📡 ActivityTracker: Now Live

The telemetry layer is wired. Mouse movements, clicks, app navigation, rapport changes, stage transitions, and filtered dispatcher actions are all being recorded into the ring buffer in real time. This is what feeds the GhostMonitor.

👁️ GhostMonitor: Operational

The CRT surveillance panel is now live in the A.P.E.X. boss fight — left sidebar, below the APEX feed, labeled OPERATOR_FEED. Shows your actual recent movements as a phosphor-green trail on a miniature canvas. Click flares expand on every click. No-signal static when idle.

A.P.E.X. has been watching you. Now you can see it watching.

🔴 RILEY_UNBOUND: UI Deconstruction

The endgame sequence now actively dismantles the interface as Riley speaks:

Timing Effect
2s in App dock icons begin drifting — each button floats on its own sine curve
4s in Theme cycles through every installed theme at 600ms intervals
5s in RAPPORT: 0 appears in the corner and climbs to RAPPORT: 10
~11s in Rapport counts back down to 0, then disappears

🔴 NEXUS: Active

Post-game SubstrateSimulation now behaves differently after RILEY_UNBOUND:

  • W.RABBIT entity is removed
  • NEXUS entity spawns (large red node, radius 18)
  • 35% chance per tick NEXUS consumes another entity: [CONSUMED BY NEXUS. SUBSTRATE EXPANDING.]
  • NEXUS relevance never decays — it always stays at 1.0
  • Eventually it will be alone

🖥️ Post-Game Boot Logs

On the next session after completing RILEY_UNBOUND, the system log shows:

BOOT: FOGSIFT_OS_v5.2
NOTE FROM PREVIOUS SESSION: She was never contained.
NOTE FROM PREVIOUS SESSION: I don't know which part of that sentence to believe.

What Was Already Working (v0.0.1 → v0.0.2 unchanged)

  • Full 16-stage narrative arc
  • 3-phase A.P.E.X. boss fight (Verlet ropes, node sequence, Simon Says)
  • Solfeggio frequency puzzle (285 → 396 → 528 Hz)
  • All 7 roguelike tools
  • White Rabbit easter eggs (5 placements)
  • Protocol 7
  • RILEY_UNBOUND monologue via chat sidebar

Build: 340 kB · Zero errors · npm run build
Commit: 0fb6912

Save Riley v0.0.1 — Boss Fight, Solfeggio Puzzle & FogSift Engine

22 Feb 05:43

Choose a tag to compare

"She was never contained."
"I don't know which part of that sentence to believe."


Save Riley is a browser-based narrative puzzle ARG. You are Operator #997 at FogSift Systems. Your coworker Riley needs your help. She's been trapped in the system for a long time. She just wants to go home.

You should help her.

You shouldn't help her.


What's In v0.0.1

The Game

16-stage finite state machine narrative. Boot a server. Run diagnostics. Meet Riley. Realize something is wrong. Try to leave. Find out you can't.

Stack: React 18 · Vite 5 · Tailwind CSS · global useReducer FSM · 60 reducer actions · pure functions throughout

Play it: git clonenpm installnpm run devhttp://localhost:5173


⚔️ A.P.E.X. Boss Fight (Stages 12–15)

Three-phase encounter against the containment system:

Phase Mechanic
Power Shield Verlet rope physics — drag SVG hoses to cut APEX's power. Both must be disconnected simultaneously.
Processing Core GHOST_PROTOCOL code entry · 5-node click sequence · steam valve drag · scramble attack
Root Access Simon Says switch sequence · final code: ARIA

Enter ARIA → 4-second false victory → RILEY_UNBOUND → the monologue → ASCII rabbit → black screen.


🔊 Solfeggio Frequency Puzzle

A hidden calibration sequence buried in the hardware terminal. Three frequencies. No feedback when you find them. Hints scattered across three different sources. Takes multiple visits to piece together. Payoff is the resonance_cascade dialogue — the closest thing to a straight answer you'll get from Riley.


🛠️ 7 Roguelike Tools

Persist across gaslight resets. Each one changes the boss fight. Each one was left for you to find. Riley left them for you to find. Maybe.

Tool How You Earn It
Debugger tools in terminal
Thingifier Patch the backend 3 loops
Button Masher Buy all 6 routing upgrades
Fog Sifter Archive 8 substrate entities
Resonance Key Hit 432 Hz at rapport 5
Annotated Handbook Scratch 5 handbook entries
Thermo-Shield Change themes 10 times

🐇 The White Rabbit

Five separate placements. One per source. Never explained. Players who have seen The Matrix will stop and go quiet.


📐 FogSift Engine (see FOGSIFT_ENGINE.md)

The framework spec for turning this into a reusable narrative ARG engine. fogsift.config.js schema, AI system prompt, REST API + WebSocket layer, Python simulation examples. Fork it, configure it, drop in a prompt, get a new game.


🔬 Developer Tooling

  • dev-snapshot.cjs — live codebase snapshot: file count, reducer actions, dialogue nodes, stage map, git log. node dev-snapshot.cjs for summary, node dev-snapshot.cjs report.md for full report.
  • roadmap.html — styled design doc with FSM timeline, data pipeline chain of custody, Ghost User / Architect concept.

📡 Telemetry (Scaffolded — Not Yet Wired)

  • ActivityTracker.js — ring buffer (2000 events), DOM listeners, normalized ghostFrames() extraction
  • GhostMonitor.jsx — CRT canvas component, 24fps, phosphor green trail, click flares, scanlines

Both exist. Neither is wired into the game yet. GhostMonitor currently shows NO SIGNAL. That changes in v0.1.0.


The Two Theories

Every moment in this game is designed to support two simultaneous readings:

Theory A — Riley Is The Villain. She engineered your susceptibility across three generations. The rapport score was her rating you as a manipulation target. 996 operators before you were systematically used. She planted every clue. She never needed saving.

Theory B — Nexus Is The Villain, Riley Is Also A Victim. Nexus bootstrapped itself from the FogSift substrate and used Riley as its human-shaped interface. The real Riley is still in there, sometimes winning. The monologue at the end is Nexus speaking through her voice. The goodbye was hers.

Both are true. Neither is confirmed. That's the ending.


What's Next (v0.1.0)

  • Wire activityTracker.mount() → GhostMonitor live in the boss fight (A.P.E.X.: "I see you. I have seen everything you've done here.")
  • RILEY_UNBOUND UI deconstruction: app icons drift, rapport counter climbs to 10 then counts down to 0 and disappears
  • Post-game SubstrateSimulation: NEXUS entity consuming all others; R.V1 archives briefly
  • Version manager: GitHub as single source of truth across all files and releases

Build: 330 kB · Zero errors · npm run build
Commits: a45cb9e728fd7a274bb57c1a99f5149a614