Egyptian Escape Room — Digital Lock

A touch-friendly React escape room for homeschool: artifact room door lock (/) and museum path drag puzzle (/museum-path).

Quick start (local)

npm install
./scripts/setup-dev-media.sh
npm run dev

Open http://localhost:5173. For iPad testing on your LAN: npm run dev -- --host.

Test checklist

Puzzle 1 (/)

  • Wrong code → jiggle + error banner
  • Correct code (8, 9, 10, 6, 8, 6, 12, 4 in order) → confetti → unlock video → map fade-in + HELP TED ESCAPE

Puzzle 2 (/museum-path)

  • Refresh stays on puzzle 2 (does not reset puzzle 1)
  • Drag 8 artifacts into ordered slots (touch + mouse)
  • Wrong path + CHECK PATH → error feedback
  • Correct path → confetti + “Ted escaped the museum!”

Media

Media is copied from the Egyptian Escape Room documents folder. setup-dev-media.sh also stitches the puzzle 5 map from EgyptEscapeRoomPrintables.pdf (pages 910). Requires pip install pymupdf once. Dev setup:

./scripts/setup-dev-media.sh

Config lives at public/media/config.json (see config.json.example).

Map artifacts (puzzle 5)

The 16 display images on PDF pages 910 are embedded in the printables PDF and can be extracted individually:

pip install -r scripts/requirements.txt   # once
python3 scripts/extract-artifact-images.py "/path/to/EgyptEscapeRoomPrintables.pdf"

Output: public/media/artifacts/*.png and manifest.json (slug, display name, dimensions). Use --mode embedded for raw JPEG/PNG bytes from the PDF instead of page renders.

Docker (local smoke test)

./scripts/setup-dev-media.sh
docker compose -f docker-compose.local.yml up --build

http://localhost:8080

Deploy to homelab

See AGENTS.md for stack name, hostname, and appdata paths.

# On Unraid
./scripts/setup-prod-media.sh

# Build and push
./scripts/build-push.sh

Then deploy the egyptian-escape-room Portainer stack from the homelab compose snapshot.

URL: https://egyptian-escape-room.locklear.net (LAN only)

S
Description
No description provided
Readme 167 KiB
Languages
TypeScript 46.7%
CSS 27.6%
Python 15.7%
Shell 7.1%
HTML 1.3%
Other 1.6%