Skip to content

FrameOS Cloud 3/4: scene and frame config backups - #265

Merged
mariusandra merged 3 commits into
mainfrom
cloud-config-backups
Aug 1, 2026
Merged

FrameOS Cloud 3/4: scene and frame config backups#265
mariusandra merged 3 commits into
mainfrom
cloud-config-backups

Conversation

@mariusandra

Copy link
Copy Markdown
Collaborator

Summary

Part 3 of the FrameOS Cloud stack (on top of the linking and login PRs; #257 with the store + cloud drive sits on top of this).

  • Push scenes (as the template interchange zip) and sanitized frame configs to the linked provider, and restore either from the settings page. Local machine credentials (SSH, TLS, admin auth, wifi/agent secrets, deploy snapshots) are stripped; app API keys and configured upload headers are intentionally retained so restored scenes keep working
  • The backup scopes come with every cloud account, but nothing is uploaded until the matching local switch is on (backup_scenes_enabled / backup_frames_enabled, + migration)
  • Automatic frame backup after every successful deploy, driven by the update_frame broadcast in the cloud sync worker; durable last_cloud_backup_deploy_at tracking (+ migration) so a worker restart neither re-uploads every frame nor loses a failed upload
  • "Back up now" + backup listing/restore in the cloud settings section
  • templates.py: the template zip build/parse refactor shared with the backup payloads; exports now record the FrameOS version they were made with

Test plan

  • pytest test_cloud_backups.py app/cloud/tests/test_sync.py test_templates.py + the earlier cloud suites — 60 passed (full backend suite: 780 passed)
  • Both frontend builds pass

🤖 Generated with Claude Code

mariusandra and others added 2 commits August 2, 2026 01:32
Phase 3 of CLOUD-TODO.md, on top of the link and cloud login:

- Push scenes (as the template interchange zip) and sanitized frame configs
  to the linked provider; restore either from the settings page. Local
  machine credentials (SSH, TLS, admin auth, wifi/agent secrets) are
  stripped; app API keys are intentionally retained so restored scenes keep
  working
- The backup scopes come with every cloud account, but nothing is uploaded
  until the matching local switch is turned on (backup_scenes_enabled /
  backup_frames_enabled + migration)
- Automatic frame backup after every successful deploy, driven by the
  update_frame broadcast in the cloud sync worker; durable
  last_cloud_backup_deploy_at tracking (+ migration) so a worker restart
  neither re-uploads everything nor loses failed uploads
- Local tarball export of all templates stays available without a link
- templates.py: template zip build/parse refactor shared with the backup
  payloads, and exports now record the FrameOS version they were made with

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review follow-ups for the cloud config backups:

- Seal every backup payload with an account X25519 key before upload
  (backup_crypto.py): the provider stores ciphertext plus a curated
  plaintext manifest. Key auto-generates on first backup; FRBK1- recovery
  code shown in settings and importable after a reinstall. Legacy
  plaintext backups still restore.
- Sanitizer rework: keep user-level secrets (wifi/mountpoint passwords,
  app API keys, upload headers) inside the sealed payload so restores
  work; strip only per-install machine credentials. Scenes pass through
  untouched — the old recursive scrub deleted `secret: true` field flags.
- One "Cloud backups" switch instead of the confusing frames/scenes
  split; restore confirms and reports; per-backup delete; spinner
  failure resets; NaN-KB guard; local tar.gz export link.
- Sync worker: substring guard before parsing broadcast messages.
- Browser tests: first on-frame admin Playwright suite (served compiled
  frame_web bundle, no Nim server), cloud backups visual cases +
  interaction tests, CI builds the frame bundle for them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@mariusandra
mariusandra force-pushed the cloud-config-backups branch from 6e7dc37 to 82b514d Compare August 1, 2026 23:34
@mariusandra
mariusandra merged commit 544b9d9 into main Aug 1, 2026
@mariusandra
mariusandra deleted the cloud-config-backups branch August 1, 2026 23:51
mariusandra added a commit that referenced this pull request Aug 1, 2026
Rebased onto main after #265 merged: the phase-2 delta (store publishing,
install by URL, private cloud scenes, save-modal polish, review fixes and
the visual-cloud-store snapshots) squashed into one commit on top of the
squash-merged stack.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mariusandra added a commit that referenced this pull request Aug 2, 2026
* FrameOS Cloud 4/4: cloud store and private cloud scenes

Rebased onto main after #265 merged: the phase-2 delta (store publishing,
install by URL, private cloud scenes, save-modal polish, review fixes and
the visual-cloud-store snapshots) squashed into one commit on top of the
squash-merged stack.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Update frontend visual snapshots

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: FrameOS Bot <git@frameos.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant