## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# Image Management API

The image module handles downloading, caching, format detection, and overlay creation. Located in `crates/vm-manager/src/image.rs`.

## ImageManager

    #![allow(unused)]
    fn main() {
    pub struct ImageManager {
        client: reqwest::Client,
        cache: PathBuf,  // default: ~/.local/share/vmctl/images/
    }
    }

### new

    #![allow(unused)]
    fn main() {
    ImageManager::new() -> Self
    }

Creates an ImageManager with the default cache directory.

### download

    #![allow(unused)]
    fn main() {
    async fn download(&self, url: &str, destination: &Path) -> Result<()>
    }

Downloads an image from a URL to a local path. Skips if the destination already exists. Auto-decompresses `.zst`/`.zstd` files. Logs progress every 5%.

### pull

    #![allow(unused)]
    fn main() {
    async fn pull(&self, url: &str, name: Option<&str>) -> Result<PathBuf>
    }

Downloads an image to the cache directory and returns the cached path. If `name` is None, extracts the filename from the URL.

### list

    #![allow(unused)]
    fn main() {
    fn list(&self) -> Result<Vec<CachedImage>>
    }

Lists all images in the cache with their names, sizes, and paths.

### detect_format

    #![allow(unused)]
    fn main() {
    async fn detect_format(path: &Path) -> Result<String>
    }

Runs `qemu-img info --output=json` and returns the format string (e.g., `"qcow2"`, `"raw"`).

### create_overlay

    #![allow(unused)]
    fn main() {
    async fn create_overlay(base: &Path, overlay: &Path, size_gb: Option<u32>) -> Result<()>
    }

Creates a QCOW2 overlay with the given base image as a backing file. Optionally resizes to `size_gb`.

### convert

    #![allow(unused)]
    fn main() {
    async fn convert(src: &Path, dst: &Path, format: &str) -> Result<()>
    }

Converts an image between formats using `qemu-img convert`.