hyprforge-mime 0.1.0

Reads the freedesktop shared MIME database: what type a file is by name or by its contents, which applications handle a type, which one is the default, and which icon a type has.
Documentation

hyprforge-mime

Reads the freedesktop shared MIME database: what type a file is by name or by its contents, which applications handle a type, which one is the default, and which icon a type has.

What type a file is, which applications can open it, and which one does by default.

Nearly every question has a data file of its own, all of them freedesktop's and all of them plain text:

Question File Module
What type is part.3mf? mime/globs2 globs
What is this file, with no name to go on? mime/magic magic
Which of those two wins? — lookup
What is a model/3mf a kind of? mime/subclasses, mime/aliases types
Which icon does a model/3mf have? mime/icons, mime/generic-icons icons
What can open a model/3mf? applications/mimeinfo.cache apps
Which one does, normally? mimeapps.list defaults

Why this crate exists

A double-clicked STL opened in Firefox. Not because anything chose that — because xdg-open, on a desktop it does not recognise (Hyprland is one), asks file --mime-type, which reads bytes and not names. An STL is application/octet-stream to it, a 3MF is a zip, a .blend is a zstd stream; none of those has a default application, and xdg-open answers a lookup that found nothing by walking a built-in list of web browsers. Every .stl, .3mf, .uf2, .blend and .sh in a real Downloads folder went that way.

The database on the machine had the right answer the whole time. So this reads it.

What this is not

Not a launcher, and not a fourth opinion about which application opens a file. It reads what the desktop already recorded and writes only what a person explicitly chose; running the thing is still gio launch with xdg-open behind it. Nothing here parses Exec= field codes, TryExec or Terminal=true — see apps for why that line is where it is.

Layering

A leaf, like hyprforge-look: no iced, nothing Hyprland-shaped, two dependencies (hyprforge-paths, for the config directory and the atomic write; hyprforge-process, for the bounded wait hyprforge-mimeopen puts on gio launch). The file manager and the Settings app's Default apps page read it today, and any future viewer needs the same answers.

Where this lives

Part of Hyprforge, a suite of native Hyprland desktop applications. This crate is crates/hyprforge-mime there; it is published to crates.io so the suite's applications can be built from their own repositories, and its API follows the suite. Issues and pull requests go to the suite repository.

cargo add hyprforge-mime

This README is rendered from the crate's //! documentation by tools/crate-readme.py; edit src/lib.rs, not this file.

Licence

MIT. See LICENSE.