Skip to content

FrameOS Cloud 4/4: cloud store and private cloud scenes - #257

Merged
mariusandra merged 2 commits into
mainfrom
backend-cloud-connect
Aug 2, 2026
Merged

FrameOS Cloud 4/4: cloud store and private cloud scenes#257
mariusandra merged 2 commits into
mainfrom
backend-cloud-connect

Conversation

@mariusandra

@mariusandra mariusandra commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Final part of the FrameOS Cloud stack — on top of #263 (linking), #264 (cloud login), and #265 (backups). This PR now carries only the store + private cloud scenes work; the earlier phases were split into the stack below (and ESP32/JS-runtime/editor work went to #258/#259/#260 before that).

  1. FrameOS Cloud 1/4: device-flow linking of backends and frames #263 — device-flow linking (phase 0)
  2. FrameOS Cloud 2/4: cloud login on backends and frames #264 — cloud login (phase 1)
  3. FrameOS Cloud 3/4: scene and frame config backups #265 — scene/frame config backups (phase 3)
  4. This PR — cloud store + "Private cloud scenes" (phase 2)
  • Store publishing (store:publish scope): publish scenes as immutable versions to the cloud store; the connected provider's store repository is auto-seeded per project (with provider-change migration of the old marker), and store templates show author/version/risk flags plus a "View store page" link. Installing a scene flagged as running shell commands asks for confirmation on every install path, drag-and-drop included
  • Install by URL: pasting a store page URL into the Templates search installs the scene — the backend follows the page's <meta name="frameos:zip"> tag; URLs on the linked provider get the link token attached so private cloud scenes install too
  • "Private cloud scenes": the account's own scenes (private ones included) listed in the Templates panel, proxied through the backend because <img> tags can't carry the link token (the proxy only relays image/* responses); "Save to private cloud" from the scene dropdowns and template modal, with a visibility control (keep / private / public) and private/public tags on the listed scenes. The section hides on frame admin pages and when the cloud feature is disabled
  • Template save modal polish: selected scenes float to the top, and the preview image is the first selected scene's snapshot when the frame currently shows an unrelated scene (image_scene_id)
  • visual-cloud-store.spec.ts snapshots the states: populated drive (private/public/shell-flagged/newer-FrameOS scenes), empty drive, not-connected promo, and the save modal (PNGs are CI-rendered)

Test plan

  • pytest test_cloud_store.py test_repositories.py test_templates.py — green (full backend suite passes)
  • E2E happy path against a local frameos-cloud dev server via test_cloud_e2e.py (FRAMEOS_CLOUD_E2E_URL)
  • pnpm --dir frontend run build passes
  • visual-cloud-store.spec.ts passes locally against the fixture backend

🤖 Generated with Claude Code

@mariusandra mariusandra changed the title FrameOS Cloud link, embedded scene editor, and ESP32 runtime hardening FrameOS Cloud: link backends and frames to cloud.frameos.net Jul 14, 2026
mariusandra added a commit that referenced this pull request Jul 15, 2026
Split out of #257. Device runtime, firmware pipeline, and embedded
frontend workflows:

- Streaming decode of multi-MB PNGs and chunked HTTP bodies, so
  downloads are no longer size-limited by fragmentation; images too
  large for the device paint a download-failure frame instead of
  'No image provided'
- Memory-aware scene node cache (frame-sized images are not pinned),
  OOM-aborted renders that leak the heap beyond recovery trigger a
  restart; render errors paint into the live canvas
- Serialized scenes.json writers, reliable OTA acknowledgement,
  post-flash reboot/reconnect, and the state partition survives
  re-flashing
- Content-addressed firmware download URLs with no-store responses;
  stale firmware cache invalidates on source changes
- USB serial render lifecycle events with Pi event parity; frontend
  USB commands fall back to HTTP when the port is stale; post-deploy
  USB preview retries until the first render exists; identical-board
  reconnects require explicit reselection
- Document the no-image-proxies-for-frames rule

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
mariusandra added a commit that referenced this pull request Jul 15, 2026
Split out of #257. The embedded scene editor and in-browser scene
runtime:

- Embeddable AGPL scene editor bundle published as the frameos-editor
  npm package: full scene workspace panels, theme support via init
  message, light-mode diagram styling, hashed entry files, and a demo
  page; standalone embeds answer API calls with synthetic 404s
- frameos-wasm npm package (moved to frameos/wasm): typed wrapper
  around the emscripten wasm preview worker with a showIf-aware
  management interface; preview HTTP goes client-side first so the
  same-origin proxy only carries CORS-blocked hosts
- Live preview: renders keep unapplied form edits, one action row,
  "Save screenshot" in the Preview panel, event buttons send their
  label in the payload
- Release plumbing: publish-npm workflow job, per-package version
  sync in tools/update_versions.py (editor gets its own component
  hash in versions.json), pnpm workspace + Dockerfile entries
- Auth-guard redirects use replace instead of push so Back does not
  loop through the redirect

The regenerated frontend/src/generated/builtinApps.ts snapshot
includes app data from sibling PRs split out of #257 (bird journal
app, gallery error-image change); `pnpm --dir frontend run build`
regenerates it from the checked-out sources.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@mariusandra mariusandra changed the title FrameOS Cloud: link backends and frames to cloud.frameos.net FrameOS Cloud 4/4: cloud store and "My cloud drive" Jul 18, 2026
@mariusandra
mariusandra changed the base branch from main to cloud-config-backups July 18, 2026 21:36
@mariusandra mariusandra changed the title FrameOS Cloud 4/4: cloud store and "My cloud drive" FrameOS Cloud 4/4: cloud store and private cloud scenes Aug 1, 2026
Base automatically changed from cloud-config-backups to main August 1, 2026 23:51
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
mariusandra force-pushed the backend-cloud-connect branch from d522e9c to 2fa511d Compare August 1, 2026 23:59
@mariusandra
mariusandra merged commit a7b25e1 into main Aug 2, 2026
@mariusandra
mariusandra deleted the backend-cloud-connect branch August 2, 2026 00:28
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