Skip to content

Add named storage profiles on top of TART_HOME #1306

Description

@TyceHerrman

Problem

TART_HOME already allows Tart's VMs and cache to live on an external drive, as documented through #221 and #845. It works well when a user has one alternate storage root.

Using multiple roots is less ergonomic: callers must export or prefix TART_HOME with a path for every command, remember which root contains each VM, and reproduce those paths across scripts. The path-based approach proposed in #199 was closed in favor of TART_HOME, but named roots could remain fully compatible with that decision.

Proposal

Allow users to register storage roots by name and select one per command. For example:

tart storage add internal ~/.tart
tart storage add external /Volumes/VMs/tart
tart storage list

tart --storage external list
tart --storage external run review-macos

This would be a small configuration layer over the existing Tart home abstraction rather than a new VM format.

Suggested behavior

  • Preserve the current default storage location and TART_HOME behavior.
  • Define clear precedence between --storage, TART_HOME, and the default location.
  • Apply the selected storage root consistently to VMs, OCI cache, temporary files, pruning, and free-space checks.
  • Namespace duplicate VM names by storage profile.
  • Validate that configured locations exist and are writable.
  • Warn when a non-APFS destination prevents efficient copy-on-write cloning.
  • Removing a profile should remove only its configuration, never its VMs or cache.

Alternatives considered

Shell aliases such as TART_HOME=/Volumes/VMs/tart tart ... work, but they duplicate absolute paths and provide no discovery mechanism for tools or users. Symlinking ~/.tart also makes switching roots awkward and has caused support issues in the past.

Would named storage profiles be acceptable as an additive interface over TART_HOME?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions