GentStore 1.3.0 ~amd64 GitHub
app-portage/gentstore

Portage, with a view
of what is about to happen.

A graphical front-end for Portage on Gentoo Linux. Searching for and installing packages, USE flags with an explanation of what each one does, masks and licences, overlays, and the full system update cycle.

Every change to /etc/portage is previewed before it is written. The interface never runs as root.

Install
emerge --ask app-portage/gentstore

once the overlay is registered — see below

  • Python 3.12+
  • PyQt6
  • GPL-2+
  • pl · en
  • 572 tests
Search and install: the query mpv, media-video/mpv selected, the USE flags panel
Search and install — results from four repositories, package details, versions with their keywords, the command under the buttons

Principles

Five rules the whole application stands on

Not slogans — each one has a specific consequence in the interface, visible on screen before anything is written.

Nothing happens quietly

Every change to /etc/portage is previewed before it is written, and afterwards the application shows the exact path of the file and the exact line it added. Every button that executes a command has a tooltip with the command in full.

We never overwrite your files

We append lines, or change one specific line; comments and the formatting of the rest of the file are left untouched.

The graphical process is not root

Everything that needs privileges goes through pkexec and a small, reviewable helper program.

The data comes from the portage API

Not from parsing ebuilds. The core/ layer is plain Python with no Qt — it can be queried from a terminal.

The chosen repository applies everywhere

Clicking a ::repo badge narrows not only the list but also the detail panel, the versions, and the atom emerge is given. The same package in two overlays no longer blurs together.


Nine screens

The whole Portage cycle, screen by screen

Search and install

Searching by name, category and description. Repository filters, a list of versions, and the Pretend, Install and Uninstall actions — each shows the exact command before it runs it.

System update

Six steps, each run separately: sync, Gentoo news, a preview in the form of a table, the update itself with a live log and an “Interrupt” button, --depclean, and the configuration files.

Repositories

What you have configured, with the repos.conf section verbatim — and the catalogue of 459 Gentoo repositories in the second tab. Enabling an overlay is one click.

Masks and licences

Why Portage refuses: for a mask, the maintainer's note verbatim along with the file it came from; for keywords, three cases told apart; for a licence, the full text to read.

Configuration files

The ._cfg files, with the package that brought each one and the number of changed lines. Next to it the difference, and under that three answers: keep mine, take the new one, merge by hand.

make.conf

Two values for each variable: the one written in the file and the one Portage actually uses. A change replaces one line. MAKEOPTS gets a suggestion computed from the core count and the amount of memory.

elog messages

What packages said about themselves during installation — the messages that scroll past in the terminal and vanish. Each entry has a class and a build phase, and the left edge of the row carries the colour of the most serious message inside it.

@world set

Side by side, two things that look identical once installed: the packages you asked for, and everything that is installed. Removing an entry uninstalls nothing.

Profile

The profiles from eselect, with the current one marked and, before a change, what follows from it said plainly: different default USE flags, different masks, a full rebuild.

Ctrl+1…9 switches screens, Ctrl+F jumps to the search box, Ctrl+L to the log.

The USE flags panel for media-video/mpv with the vulkan flag unfolded
USE flags — where each flag's value comes from, and exactly what turning it on changes

A USE flag stops being a guess

For each flag you can see where its value comes from — the ebuild, the profile, make.conf, package.use — and the description from the repository.

Unfolded: exactly what turning it on changes, which packages will be pulled in and which ones will have the same flag forced on them. REQUIRED_USE conditions are checked as you go, and saving is blocked until the selection satisfies them.

At the bottom of the panel, the exact line that will go into the file, and the file it will be appended to — before anything happens.

dev-libs/zydis narrowed to ::guru
One repository at a time — the same package lives in ::gentoo and in ::guru; the badge you pick decides which one the install comes from
The Available tab: the catalogue searched for kde
Adding one — who runs each repository, and the two commands enabling it would run

Privileges

GentStore never runs as root

Started with sudo it says so in a dialog and asks to be closed. Everything that needs privileges goes through pkexec and two small programs in /usr/libexec.

Both are single files that use nothing but the standard library, with no imports from the rest of the project — written so that they can be read end to end before being let anywhere near root. It is worth doing.

Without the privileged half the application still runs — read-only: search, browsing flags, emerge --pretend. Every attempt to write then says what is missing.

What make install puts in place
  • /usr/libexec/gentstore/gentstore-helper
    the only program that writes to /etc/portage
  • /usr/libexec/gentstore/gentstore-launcher
    runs emerge and friends, and can interrupt them
  • /usr/share/polkit-1/actions/org.gentoo.gentstore.policy
    two named polkit actions
  • /usr/share/applications/gentstore.desktop
    the menu entry
  • /usr/share/icons/hicolor/scalable/apps/gentstore.svg
    the icon

Installation

Two routes

The choice comes down to whether Portage should know about GentStore.

From the working directory — for working on the code

The .qm catalogues are not kept in the repository.

emerge --ask dev-python/pyqt6 dev-qt/qttools \
  app-eselect/eselect-repository sys-auth/polkit

python tools/i18n.py compile
sudo make install

python -m gentstore

You get the tagged release, unless you say otherwise — the installer asks, and --stable and --live skip the question. The 9999 ebuild sorts above every release there will ever be, so choosing the release means the live one is deliberately left unaccepted.

Requirements

dev-lang/python ≥ 3.12 the runtime
sys-apps/portage the portage module — package data
dev-python/pyqt6 the graphical interface
dev-qt/qttools[linguist] lrelease — compiling the translations
app-eselect/eselect-repository overlays and the repositories.xml catalogue
sys-auth/polkit pkexec — raising privileges

Optional: app-portage/gentoolkit (GLSA scanning) and app-portage/cpuid2cpuflags. Their absence disables a single feature and is reported in the interface — it does not bring the application down.

The backend without the GUI

The core/ layer is plain Python with no Qt, so it can be queried from a terminal. Useful when a list in the window is empty and you need to know whether the problem is in the interface or in the data.

python -m gentstore.core.cli info
python -m gentstore.core.cli repos -v
python -m gentstore.core.cli search mpv
python -m gentstore.core.cli show media-video/mpv
python -m gentstore.core.cli show dev-libs/zydis --repo guru
python -m gentstore.core.cli world

Every command takes --json and --debug. It is a development tool — it speaks English only, because it is not part of the interface.


Where the project stands

Version 1.3.0

All nine screens work, and both halves have been exercised on a live system: the read-only side — search, USE flags, masks, repositories, the update preview, configuration files, make.conf, elog and @world — and the privileged one, which has written real package.use, package.license and package.accept_keywords entries through pkexec.

New in 1.3.0

The Repositories screen is one list with two tabs

“Configured” and “Available” are the same question asked at different times. One search box serves whichever tab is open, and picking a row fills the right side — for a configured repository, also what it brings: the packages that come from it and nowhere else.

Three holes in the privileged half closed

emerge --unmerge '*/*' passed the launcher's argument check; the helper answered a malformed request with a traceback instead of an answer; cfg_apply could be aimed outside /etc/portage. A failed restore no longer takes the configuration root with it.

USE flags of a package from an overlay finally have descriptions

use.desc lives in the master repository, and it was being looked for beside the ebuild, where no overlay carries it.

1.1.1 is withdrawn

The release, its asset and its tag are deleted, and the ebuild is out of the overlay, so Portage cannot resolve to a version that cannot be built. The changelog keeps the section, marked [YANKED] — a withdrawn release is a fact about the project.

The full changelog →

Polish and English, switched on the fly

The language comes from the system settings; View → Language changes it without a restart. The interface scale — 100, 115 or 130% — is under View → Interface size, because the 12.5 px base font is small on purpose: the screens show a lot of data at once.

The settings also carry how the application becomes root, and how many copies of /etc/portage to keep.

The Settings dialog: language, interface size, how the application becomes root, how many backups to keep
Settings — language, interface size, how the application becomes root, and how many backups to keep

Install it and see what Portage was trying to tell you

The script stops short of installing anything and prints the command instead. You run it yourself.

sudo bash make-overlay.sh
emerge --ask app-portage/gentstore
The repository on GitHub