{"id":50672066,"url":"https://github.com/franzos/guix-rs","last_synced_at":"2026-06-08T12:04:12.656Z","repository":{"id":358511786,"uuid":"1241339550","full_name":"franzos/guix-rs","owner":"franzos","description":" The unofficial, missing GUI for day-to-day Guix usage (+ rust library) — search, install, upgrade, and (with polkit) pull and reconfigure the system. ","archived":false,"fork":false,"pushed_at":"2026-05-17T18:10:23.000Z","size":1781,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-17T19:47:26.401Z","etag":null,"topics":["guix","guixsd","packages","packages-manager"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franzos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T09:02:03.000Z","updated_at":"2026-05-17T18:10:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/franzos/guix-rs","commit_stats":null,"previous_names":["franzos/guix-rs"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/franzos/guix-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzos%2Fguix-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzos%2Fguix-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzos%2Fguix-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzos%2Fguix-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franzos","download_url":"https://codeload.github.com/franzos/guix-rs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franzos%2Fguix-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34061125,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["guix","guixsd","packages","packages-manager"],"created_at":"2026-06-08T12:04:11.889Z","updated_at":"2026-06-08T12:04:12.649Z","avatar_url":"https://github.com/franzos.png","language":"Rust","funding_links":[],"categories":["Tools"],"sub_categories":[],"readme":"# Guix GUI + Library (rust)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"guix GUI\" width=\"280\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  The unofficial, missing GUI for day-to-day Guix usage — search, install, upgrade, and (with polkit) pull and reconfigure the system.\n\u003c/p\u003e\n\n## Description\n\nTwo pieces: a Rust library (`libguix`) that wraps the `guix` CLI and its machine-readable REPL, and a GUI (`guix-gui`, built on [Iced](https://iced.rs)) that uses the library to search packages, install / remove / upgrade them, and — with polkit — pull and reconfigure the system. The library surface also covers generation listing, switching, and rollback; the GUI doesn't expose those yet.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/home.png\" alt=\"Home\" width=\"18%\"\u003e\n  \u003cimg src=\"assets/search.png\" alt=\"Search\" width=\"18%\"\u003e\n  \u003cimg src=\"assets/installed.png\" alt=\"Installed\" width=\"18%\"\u003e\n  \u003cimg src=\"assets/updates.png\" alt=\"Updates\" width=\"18%\"\u003e\n  \u003cimg src=\"assets/settings.png\" alt=\"Settings\" width=\"18%\"\u003e\n\u003c/p\u003e\n\n## Install — GUI\n\nPackaged on the [panther channel](https://codeberg.org/gofranz/panther). With the channel configured:\n\n```bash\nguix package -i guix-gui\n```\n\nOr build and run from source:\n\n```bash\ncargo run -p guix-gui --release\n```\n\nFor smoke-testing without mutating your real profile, build with the `dev-temp-profile` feature — install/remove will target a temp profile instead of `$GUIX_PROFILE`:\n\n```bash\ncargo run -p guix-gui --release --features dev-temp-profile\n```\n\n## Translations\n\nThe GUI ships in English plus German, Spanish, French, Italian, Brazilian Portuguese, and Simplified Chinese. It follows your system locale by default and falls back to English; you can also override the language in **Settings**, and the switch is live — no restart.\n\nStrings live as [Fluent](https://projectfluent.org/) catalogues under [`guix-gui/i18n/`](guix-gui/i18n) — one `\u003clang\u003e/guix-gui.ftl` per locale, embedded into the binary at build time. Adding a language is just dropping a new `i18n/\u003ccode\u003e/guix-gui.ftl` (copy `en/` as the template) and rebuilding — no code change.\n\nOne caveat: only the English catalogue is hand-written. The rest are machine-translated and haven't had a native-speaker pass, so expect the odd rough edge. Corrections and new languages are very welcome — a PR against the relevant `.ftl` is the whole job.\n\n## Build\n\nThe repo has a `manifest.scm` that pins every native dep `libguix` and `guix-gui` need — Rust toolchain, `gcc-toolchain` with `CC` set, `pkg-config`, `openssl` with `OPENSSL_DIR` set, plus the X11 / Wayland / Vulkan / fontconfig stack that Iced 0.13 (on wgpu) requires at build and run time.\n\n```bash\nguix shell -m manifest.scm -- cargo build --release\n```\n\nOr, à la carte:\n\n```bash\nguix shell rust rust:cargo gcc-toolchain -- sh -c \"CC=gcc cargo build --release -p libguix\"\n```\n\n## Usage — library\n\n[![Crates.io](https://img.shields.io/crates/v/libguix.svg)](https://crates.io/crates/libguix)\n[![Docs.rs](https://docs.rs/libguix/badge.svg)](https://docs.rs/libguix)\n\n```toml\n[dependencies]\nlibguix = \"0.1\"\n```\n\n```rust\nuse libguix::Guix;\n\nlet guix = Guix::discover().await?;\nfor hit in guix.package().search_fast(\"ripgrep\").await? {\n    println!(\"{} — {}\", hit.name, hit.synopsis);\n}\n```\n\nLong-running operations return an `Operation` with a coalesced event stream and a `CancelHandle`:\n\n```rust\nuse futures_util::StreamExt;\nuse libguix::ProgressEvent;\n\nlet mut op = guix.package().install(\u0026[\"ripgrep\", \"fd\"])?;\nwhile let Some(batch) = op.events_mut().next().await {\n    for evt in batch {\n        if let ProgressEvent::Line { text, .. } = evt {\n            println!(\"{}\", text);\n        }\n    }\n}\nop.await_completion().await?;\n```\n\nSee `libguix/README.md` and `libguix/src/lib.rs` for the full surface.\n\n## Polkit\n\nPolkit is required **only for the privileged paths** — `SystemOps::reconfigure` and `PullOps::as_root` — both of which need to mutate system state owned by root. Everything else (user-profile install/remove/upgrade, search, generation listing) runs unprivileged against `$GUIX_PROFILE` and needs no agent. (Library consumers that are already root, e.g. an installer on a TTY, can pass `Privilege::AlreadyRoot` to skip polkit entirely — see `libguix/README.md`.)\n\nTwo custom polkit actions ship under [`polkit/`](polkit):\n\n- `org.libguix.system-reconfigure` — permits `/run/current-system/profile/bin/guix system reconfigure …`\n- `org.libguix.system-pull` — permits `/run/current-system/profile/bin/guix pull …` (updates the root catalog at `/var/guix/profiles/per-user/root/current-guix`, which is what `system reconfigure` resolves against)\n\nBoth are scoped via argv constraints so they only match the specific subcommand, and both use `auth_admin_keep` so successive calls within polkit's grace window don't re-prompt. Full rationale and install instructions are in [`polkit/README.md`](polkit/README.md).\n\n### Authentication agent\n\n`pkexec` only works if a polkit **authentication agent** is running in your session — the agent is what shows the password prompt. Without one, the privileged calls from the GUI will hang or fail silently. `libguix` detects this case and surfaces a clear error pointing at the polkit README.\n\nPick whichever agent matches your desktop:\n\n| Agent | Notes |\n|-------|-------|\n| `lxqt-policykit-agent` | Lightweight, works under any WM. I run this one — `lxqt-policykit-agent \u0026` from my session startup. |\n| `polkit-gnome-authentication-agent-1` | GNOME |\n| `polkit-kde-authentication-agent-1` | KDE Plasma |\n| `mate-polkit`, `xfce-polkit`, `hyprpolkitagent` | matching desktops |\n\n### Install the actions\n\n- **Guix System:** declare the policies via `polkit-service-type`. A reference package (`libguix-polkit`) lives in the [panther channel](https://codeberg.org/gofranz/panther) at `px/packages/libguix.scm` — lift it into any channel. See `polkit/README.md` for the `simple-service` snippet.\n- **Foreign distro:** copy both `.policy` files into `/etc/polkit-1/actions/` as root. Polkit picks them up without a restart.\n\nVerify either way:\n\n```sh\npkaction --action-id org.libguix.system-reconfigure --verbose\npkaction --action-id org.libguix.system-pull        --verbose\n```\n\n## Packaging\n\nFor packagers — the app icon and a reference `.desktop` entry ship under [`assets/`](assets):\n\n- [`assets/icon.svg`](assets/icon.svg) — square SVG. SVG icons are picked up directly by most desktops (GNOME, KDE, LXQt, Xfce) when installed to `share/icons/hicolor/scalable/apps/guix-gui.svg`. For desktops that insist on raster, render PNGs at 48/64/128/256 from the SVG.\n- [`assets/guix-gui.desktop`](assets/guix-gui.desktop) — drop into `share/applications/`.\n\n## Development\n\n```bash\nguix shell -m manifest.scm -- cargo test\n```\n\n`libguix` has a `live-tests` feature that actually shells out to a working `guix` on the host (rather than the controlled subprocess used by default). Off by default; opt in when you want to exercise the real CLI:\n\n```bash\nguix shell -m manifest.scm -- cargo test -p libguix --features live-tests\n```\n\nFormat via Podman (the rustfmt component isn't in the Guix toolchain):\n\n```bash\npodman run --rm -v $PWD:/work -w /work rust:latest \\\n  sh -c \"rustup component add rustfmt \u0026\u0026 cargo fmt\"\n```\n\n## License\n\nLicensed per crate:\n\n- **libguix** — MIT OR Apache-2.0 (permissive, so other tools can embed it freely). See `libguix/LICENSE-MIT` and `libguix/LICENSE-APACHE`.\n- **guix-gui** — GPL-3.0-only (end-user binary). See the root `LICENSE` file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzos%2Fguix-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranzos%2Fguix-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranzos%2Fguix-rs/lists"}