- Bundle tab: name, environments with their pictures (read in place), add the open one / My Environments / any .fenv, reorder, remove, double-click to open (unpacked first), Save / Save As, Install on Steam Frame (onto the Headset tab's list), Unpack into My Environments. Saving and unpacking run in the background. - .fbundle opens from File > Open, the Bundle menu or a drop; the installer takes bundles and shows the first .fenv. - HslRenderer::createPicture / releasePicture for UI thumbnails. - Inspector tabs: ImGui draws a tab's label with the padding at BeginTabBar, so the snug padding is pushed there too. - Self-test: bundle make, save, validate, reopen and unpack (93/93). - docs/bundles.md written; Studio guide and README follow. - Linux: no GLFW_INCLUDE_NONE redefinition, freopen's result checked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.8 KiB
Bundles
A bundle (.fbundle) is several environments in one file: a collection to share, or to install on the headset
in one go. Each environment in it stays its own environment. On the headset, a bundle is unpacked into the .fenv
files it holds, and the Environments panel lists each one separately.
Making a bundle in Frame Studio
Everything is in the Bundle menu and on the Inspector's Bundle tab.
-
Bundle > New Bundle starts an empty one, and the Bundle tab opens.
-
Give it a Name. It's the bundle's own name; each environment keeps its name.
-
Add environments:
- Add the Open Environment: the environment you have open, as it was last saved. Save first (Ctrl+S) to include your latest changes. A home that has never been saved can't be added yet.
- My Environments ▾: anything you've saved.
- Add .fenv...: any
.fenvfile. You can pick several at once.
Each row shows the environment's picture, name and size. ▲ moves it up: the order is kept in the file. ✕ takes it out of the bundle; the
.fenvfile itself stays where it is. Double-click a row to open that environment. -
Save Bundle... writes the
.fbundle. The environments are stored as they are, not packed a second time, so saving is quick, and the bundle is about as big as its environments together.
Opening a bundle
Bundle > Open Bundle..., File > Open Home..., or dropping a .fbundle on the window opens the bundle on the
Bundle tab. Its environments are listed in place; nothing is unpacked yet.
- Double-click an environment to open it. It is unpacked into a scratch folder first.
- Add, remove or reorder environments, then Save Bundle (the same file) or Save Bundle As... (a new one).
- Unpack into My Environments copies every environment out of the bundle into My Environments. An identical environment already there is skipped. A different one with the same name is kept, and the bundle's copy is added as "name 2".
Installing a bundle on the Steam Frame
-
From Studio: with the bundle saved, choose Install on Steam Frame... on the Bundle tab or in the Bundle menu. The bundle is added to the Headset tab's install list. Then choose Install Frame Home there. The Headset tab's Add .fenv or .fbundle... button adds bundles too.
-
Without Studio: give the bundle to the stand-alone installer like any environment (see install-frame-home.md):
sh install-frame-home.sh --host steamos@frame my-collection.fbundleOn Windows, drop it onto
Install Frame Home.bat, or runpowershell -ExecutionPolicy Bypass -File install-frame-home.ps1 my-collection.fbundle. -
By hand: copy the
.fbundleinto~/frame-home/envson the headset.
On the headset, Frame Home's Environments panel unpacks any bundle in ~/frame-home/envs in the background. Each
environment becomes its own .fenv, and the bundle is then deleted to save space. An environment already there is
kept, as above. A bundle that's damaged, or still being copied, is left alone and tried again once it changes.
A bundle never changes which environment is shown. When you install .fenv files and bundles together, the first
.fenv is the one shown.
From the command line
fenv-tool (built with Frame Home, see building.md) makes and reads bundles:
fenv-tool bundle "My collection.fbundle" --name "My collection" calm.fenv beach.fenv night.fenv
fenv-tool info "My collection.fbundle" # each environment: name, size, picture, damaged or not
fenv-tool unbundle "My collection.fbundle" out-folder # the .fenv files, one each
What's inside
A .fbundle is a ZIP archive:
my-collection.fbundle
├── bundle.json the bundle's name and its environments, in order
└── environments/
├── calm.fenv each environment, stored as it is
├── beach.fenv
└── night.fenv
{
"format": "fbundle",
"version": 1,
"name": "My collection",
"environments": [
{ "file": "environments/calm.fenv", "name": "Calm", "size": 94371840 }
]
}
- The
.fenvfiles are stored, not compressed again: they're already compressed inside, so packing and unpacking are just copies, and each one can be read in place (Studio reads names and pictures without unpacking). - Bundles over 4 GB use ZIP64. Any ZIP tool can open a bundle.
- Two environments with the same file name get "name 2"; names are compared without regard to case, so they unpack separately on Windows too.
- Every member's checksum is verified when it's unpacked: a damaged bundle stops without leaving half a file.
The format is in src/fenv_bundle.h; .fenv itself is described in
environments-and-fenv.md.