Files
Toastconcern--FrameStudio/docs/bundles.md
T
ToastconcernandClaude Opus 5.5 8b0c2aa5a3 Studio: bundles (Bundle menu and Inspector tab), Sound into the Environment tab, tab labels no longer clipped
- 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>
2026-10-21 12:44:57 -05:00

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.

  1. Bundle > New Bundle starts an empty one, and the Bundle tab opens.

  2. Give it a Name. It's the bundle's own name; each environment keeps its name.

  3. 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 .fenv file. 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 .fenv file itself stays where it is. Double-click a row to open that environment.

  4. 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.fbundle
    

    On Windows, drop it onto Install Frame Home.bat, or run powershell -ExecutionPolicy Bypass -File install-frame-home.ps1 my-collection.fbundle.

  • By hand: copy the .fbundle into ~/frame-home/envs on 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 .fenv files 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.