FrameOS
Guide

Virtual frames

Run a frame with no hardware at all - the backend or FrameOS Cloud renders the scene and serves it as an image URL and a self-refreshing page.

A virtual frame is a frame with no device behind it. A self-hosted backend renders its scenes and serves the result two ways:

  • An image URL - one PNG per request, at whatever size and color mode you picked.
  • A self-refreshing page - a black, full-bleed kiosk page that swaps the image in place on the frame's interval, without the white flash a meta-refresh would cause.

Both URLs appear in the frame's settings once it is added.

Self-hosted backend and FrameOS Cloud

Both have virtual frames. On a backend they're free and as many as you like, since your own machine renders them. In FrameOS Cloud they're part of the paid plans - see below.

What it's for

  • Old tablets, browser kiosks and signage players. Anything that can show a web page becomes a frame - no FrameOS software on the device at all.
  • Trying FrameOS, or designing scenes, before any hardware arrives.
  • Feeding other software: a Home Assistant dashboard card, a Slack unfurl, a wallpaper script, an e-ink display driven by something else entirely - anything that can fetch a PNG.
  • Previewing what a panel will look like. Pick the color mode of the panel you're considering and the render is quantised the same way, dithering included.

Add one

Click New frame → Virtual frame, then set:

  • Width and height in pixels.
  • Color mode: full color, black & white, 4-level grayscale, black/white/yellow/red, 7-color ACeP, or Spectra 6. Anything but full color is dithered to that palette, exactly as a real panel would be.

From there it's an ordinary frame: install scenes, edit them in the scene editor, set a render interval, change its state fields live.

How it differs from a real frame

  • The backend does the rendering, so a virtual frame stops updating when the backend does. Every other kind of frame keeps going.
  • Assets and scene state live on the backend rather than on a device. The Docker image keeps the state in a Redis that writes to the data volume, so the active scene and its field values survive a container restart.
  • Anything tied to real hardware - GPIO buttons, the frame's own web server and QR code, panel-specific behaviour - has nothing to talk to.

Everything else works: the same apps, the same scenes, the same state fields.

In FrameOS Cloud

The cloud renders virtual frames too, on the paid plans: one for each dollar of the plan a month (two on the $2 plan, nine on the $9 one), none on Free. Add frame → Virtual frame creates one, and its settings hold its size and a private link that shows the picture and nothing else - open it in a browser on a spare screen, an old tablet, a TV or a dashboard. It renders when you push a scene or ask for a render, and on its interval while someone has the link open, but no more often than every five minutes.

From there it's managed like any cloud frame - scenes, the editor, the schedule, the activity trail - minus what needs a body: assets, metrics, reboots and firmware updates.

Sharing the URLs

The image and page URLs carry the frame's access key as a ?k= parameter, and the page never prints the key in its markup - only inside the image URL it already arrived with. Anyone with the link can see the frame, so treat it like any other unlisted URL: fine for a tablet on your wall, not something to post publicly.

On this page