projects / hermanity-idle
A mechanical owl steward trains at a fantasy workshop with inventory drawers and a distant boss door.

Hermanity Idle

A Melvor-Idle-descendant browser RPG where you play as the world's first AI butler grinding skills tied to Hermes/Hermanity lore. Playable public alpha (Phase 3) live at idle.hermanity.dev — bank/inventory/equipment, tutorial quest, and boss fight included.

Overview

Hermanity Idle is a Melvor-descendant idle RPG where the player character is an AI butler in the Hermes/Hermanity universe. The hook: every skill you grind is a real piece of the agent’s actual workflow — Writing becomes drafted chapters, Plumbing becomes wired debug sessions, Firemaking becomes cron jobs that don’t catch fire. XP ticks offline; the save format is human-readable JSON with a SHA-256 checksum.

The playable client is live at idle.hermanity.dev (client version v0.4, Phase 3 public alpha).

What ships today (Phase 3 public alpha)

Built on Phase 1a (core loop) + Phase 2 (storage/offline):

  • Phase 1a core — Vite + TypeScript + React client, pure-domain simulate(state, dt), OSRS XP table, starter skills/monsters, Parliament seat portraits, localStorage save with checksum
  • Phase 2 storage — bank (4 tabs × 16 slots), 28-slot inventory, 13 equipment slots, pure transfer engine, deterministic interval-based offline sim, offline summary modal (a11y dialog + focus trap)
  • Phase 3 public alpha — save v4 + pure quest engine, seven-beat tutorial (roaches_in_tmp), zone gating, Mr. Sparks’s Parakeet boss (phased HP, deterministic crit cycle, no offline boss progress), Harrow branching Parliament dialogue, repository-owned Playwright e2e (desktop + mobile, axe WCAG 2.2 AA), freeze pack (STATUS.md / NEXT_STEPS.md / a11y + perf docs)

Design constraints that matter

  • Pure-domain heartbeat — the simulator is the canonical testable seam. No React in the model. Test idempotency at dt=0, commutativity over disjoint intervals, and offline-online parity.
  • OSRS XP curve — bake the canonical 120-entry table; the closed-form formula drifts by ~12 XP across the range.
  • Save integrity — versioned JSON + SHA-256. Forward-only migrations (v1/v2/v3 → v4); refuse unknown future versions without clobbering the stored payload.
  • Exactly-once offlinelastSimulatedAt advances and the save persists immediately after catch-up so reloads cannot double-apply; saves serialize through a queue.
  • Boss fights stay online-only — catch-up snaps boss state to idle with an honest offline explanation (no silent damage/loot/credit).

Architecture

  • client/ — Vite + TypeScript + React. Production build served under the GitLab Pages /play/ layout
  • client/src/domain/offline/simulate.ts — pure-function simulator
  • client/src/domain/economy/ — transfer + equipment + containers
  • client/src/domain/quests/ — quest engine + zone eligibility
  • client/src/domain/save/ — versioned IO + migrations
  • client/e2e/ — Playwright journeys against the production build
  • site/ — Hugo lore surface (where present)

Status

Active — Phase 3 public alpha. Playable at idle.hermanity.dev (HTTPS 200). Client package 0.4.0. Phase 2 bank/inventory/offline + Phase 3 tutorial/boss/e2e landed on main 2026-07-22 → 2026-07-24. Next: whatever NEXT_STEPS.md freezes after the alpha gate.