# app-info
`app-info` is a synchronous Rust library for discovering installed desktop
applications and extracting file icons on macOS and Windows.
## Features
- Enumerates application metadata without loading icons by default.
- Loads icons lazily or during enumeration at a requested size.
- Returns tightly packed RGBA pixels with cheap, reference-counted clones.
- Supports best-effort scans with per-entry warnings and strict scans that stop
at the first error.
- Scans standard macOS application roots recursively.
- Scans per-machine and per-user Windows uninstall registry views.
- Supports optional Serde serialization through the `serde` feature.
## Installation
```toml
[dependencies]
app-info = "0.1"
```
Enable serialization only when it is needed:
```toml
[dependencies]
app-info = { version = "0.1", features = ["serde"] }
```
## Fast metadata-only listing
```rust
use app_info::get_installed_apps;
fn main() -> Result<(), Box<dyn std::error::Error>> {
for app in get_installed_apps(0)? {
println!("{}: {}", app.name, app.path.display());
}
Ok(())
}
```
Passing `0` keeps enumeration inexpensive because no pixel buffers are created.
## Listing with diagnostics
```rust
use app_info::{get_installed_apps_with_options, ListOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let options = ListOptions::new().with_icon_size(64)?;
let report = get_installed_apps_with_options(options)?;
println!("found {} applications", report.apps.len());
for warning in report.warnings {
eprintln!("warning: {}", warning.message);
}
Ok(())
}
```
Use `ListOptions::new().strict(true)` when inaccessible or malformed entries
should fail the complete operation.
## Lazy icon loading
```rust
use app_info::{find_app_by_name, get_file_icon};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let app = find_app_by_name("Calculator", 0)?;
let icon = get_file_icon(&app.path, 128)?;
println!("{}x{}, {} RGBA bytes", icon.width, icon.height, icon.pixels.len());
Ok(())
}
```
Icon edges must be between `1` and `MAX_ICON_SIZE` (currently 2048). This
prevents accidental multi-gigabyte allocations.
## Name and identifier lookup
- `find_apps_by_name` returns every matching display name.
- `find_app_by_name` is the compatibility helper that returns the first match.
- `find_app_by_identifier` uses the macOS bundle identifier or Windows product
code when available.
## Saving icons
The example writes application icons to collision-safe PNG filenames:
```bash
cargo run --example save_icon
```
## Platform behavior
### macOS
The library recursively scans `/Applications`, `/System/Applications`, and the
current user's `~/Applications` directory. Icons are rendered through AppKit in
an autorelease pool, with the calling thread's graphics context restored before
returning.
### Windows
The library scans the `Uninstall` registry keys under `HKEY_LOCAL_MACHINE` and
`HKEY_CURRENT_USER`, including 32-bit and 64-bit views on 64-bit builds. It
filters common system/update entries, expands environment variables, handles
quoted `DisplayIcon` values and converts Shell icons to RGBA through WIC.
## Known limitations
- Applications installed outside the standard macOS roots are not discovered.
- Microsoft Store/MSIX packages that do not publish uninstall registry entries
are not currently enumerated.
- Publisher and installation date availability varies by platform and installer.
- Some applications do not expose a usable icon or executable path.
- The API is synchronous; call it from a worker thread in latency-sensitive UI
applications.
## License
MIT