Scheduled daily at 4am on the ultra. launchd can't exec scripts inside
~/Documents (TCC), so the job runs a copy under Application Support;
header documents the sync/manage/remove commands.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The vault's user data (argon2 hashes + saved worlds) only lives on the
VPS and isn't in git. backup.sh pulls /opt/mrpgi-vault/data down as a
timestamped tarball, keeps the 30 newest, and documents the restore
path in its header.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- mrpgi-vault (standalone crate): tiny signup/login/world-save service.
Argon2 password hashes, random session cookies, JSON-file storage,
naive per-IP rate limit, 4MB body cap. tiny_http, no framework, no db.
Runs as a container on the dealgod network; nginx proxies
/engine/api/ to it.
- core: WorldBundle — a whole world (manifest + every room) as one JSON
document, with World::to_bundle/apply_bundle.
- web bridge: mrpgi_request_save / mrpgi_alloc / mrpgi_world_in exports
+ an mrpgi_world_saved JS plugin import; the page's SAVE button pulls
the live world out of the running engine, LOAD swaps it back in.
SAVE_REQUESTED is an AtomicBool on purpose — wasm's thread-less
Mutex<bool> is a plain static to LLVM and release builds const-folded
the read (the only writer is JS-visible, not IR-visible).
- web UI: SIGN IN tab → create account (own username + password) /
sign in / Save world / Load world / sign out. Session restores on
revisit.
Verified live end-to-end through Cloudflare: signup → save → reload →
anonymous rejected; throwaway account removed after.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>