- Without the maintainer's key, Android compatibility reports stay on the Mac and the UI says so; the shared database is never contacted. - Remove personal infrastructure details from scripts and docs: the Drive folder and gog wrapper now come from the environment, and the Chromium build host is required instead of defaulted. - Add an MIT license, tester instructions in the README, and bump to 0.2.0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
compat-db: Frame Control's compatibility database
A private Lakebed capsule holding compatibility
reports for Android apps on the Steam Frame. For now only the maintainer's
copy of Frame Control has the key to read or write it. Everyone else's reports
stay on their own Mac (see shared() in ui/frame_compat_db.py).
- Live:
https://frame-compat.lakebed.app(deploydep_dDmcsosVSiFirpW6, claimed, so it doesn't expire). The browser page only says it's private. - Access:
GET /v1/reports?since=<createdAt>andPOST /v1/reportswith{"reports": [...]}. Both need thex-frame-control-keyheader. There are no Lakebed queries or mutations, so nothing else can reach the rows. - Key:
FRAME_CONTROL_KEYin.env.lakebed.server(git-ignored, synced on deploy) and in the Mac's login Keychain (serviceframe-control-compat-db, accountapp-key), whereui/frame_compat_db.pyreads it. - Duplicates: each report carries a
clientId, and a report already stored is skipped, so retries and restores are safe to repeat. - Free-plan limits: 1 MiB of data and 16,384 rows per deploy, 1,000 writes a day. A report is about 300 bytes, so roughly 3,000 reports fit.
Backups
scripts/compat-db-backup.sh exports every report through the app key and
keeps dated copies in
~/Library/Application Support/Frame Control/compat-db/backups (newest 60).
When the data has changed, it also uploads them with gog to the Google
Drive folder named by DRIVE_FOLDER_ID (set it in the LaunchAgent's
EnvironmentVariables). A LaunchAgent runs it daily at 03:40 and logs to
~/Library/Logs/frame-compat-backup.log. If an export has fewer reports than
the last good backup (backups/.last-good), it's kept as refused-*.json,
nothing is uploaded, and every later run refuses too until you rerun with
--accept-shrink.
Reports that can't be sent (unreadable outbox lines, or ones the server
rejects, which it lists by clientId) are never dropped: they move to
~/Library/Application Support/Frame Control/compat-db/compat-outbox.jsonl.rejected,
with the reason.
Restore (to this deploy or a new one):
python3 ui/frame_compat_db.py import BACKUP.json # duplicates are skipped
python3 ui/frame_compat_db.py count
npx lakebed db export dep_dDmcsosVSiFirpW6 --out full.json is a second,
owner-only export path through the Lakebed CLI.
Change and deploy
cd compat-db
npx lakebed dev --port 3917 # local; data resets on restart
npx lakebed deploy # updates frame-compat.lakebed.app
To rotate the key: generate a new one, update the Keychain item and
.env.lakebed.server, then deploy.