Format
AES-256-GCM, key = PBKDF2-SHA256(passphrase, salt, iterations).
Plaintext = gzip(JSON {files: [{path, b64}]}). Envelope is the JSON in
<script id="bundle">. Without a browser:
python3 -m pip install cryptography
python3 - recovery.html <<'EOF'
import base64, getpass, gzip, hashlib, json, re, sys, pathlib
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
e = json.loads(re.search(r'json">(\{"v"[^<]*)', open(sys.argv[1]).read())[1])
b = lambda s: base64.b64decode(s)
k = hashlib.pbkdf2_hmac("sha256", getpass.getpass().encode(), b(e["kdf"]["salt"]), e["kdf"]["iterations"], 32)
for f in json.loads(gzip.decompress(AESGCM(k).decrypt(b(e["iv"]), b(e["data"]), None)))["files"]:
p = pathlib.Path("out", f["path"]); p.parent.mkdir(parents=True, exist_ok=True); p.write_bytes(b(f["b64"]))
EOF