| 48 |
48 |
|
|
| 49 |
49 |
|
**`alloy-menu`: fzf over desktop entries, run in rio.** Bound `Mod+D`. A shell script in `usr/bin/`, about forty lines, that reads `.desktop` files from the system, user and Flatpak paths, pipes names through fzf, and hands the chosen `Exec` line to `swaymsg exec` so the app outlives the terminal that launched it.
|
| 50 |
50 |
|
|
| 51 |
|
- |
The split with `Mod+Return` is the design. Typing a command is what a shell is for, and a shell is one keystroke away, so the launcher does not list every binary on `PATH`: doing that buries Firefox under coreutils. It lists the graphical apps that have a name, an icon and a binary nobody remembers. Two keys, two jobs.
|
|
51 |
+ |
The split with `Mod+Return` is the design. Typing a command is what a shell is for, and a shell is one keystroke away, so the launcher does not list every binary on `PATH`: doing that buries the browser under coreutils. It lists the graphical apps that have a name, an icon and a binary nobody remembers. Two keys, two jobs.
|
| 52 |
52 |
|
|
| 53 |
53 |
|
This replaces "none by default". That line read as terminal-first discipline and worked as one until `Mod+Return` broke, at which point a session with no launcher had no way to open a terminal and no way to edit the file that would have fixed it. A launcher is the second door.
|
| 54 |
54 |
|
|
| 74 |
74 |
|
|
| 75 |
75 |
|
## File manager
|
| 76 |
76 |
|
|
| 77 |
|
- |
**yazi** (Rust, async, plugin system, sixel/kitty/iTerm image preview). TUI-only, no GUI fallback shipped; the pivot's TUI-first line applies here the same way it applied to Rnote. Firefox and other GUI apps that need file dialogs go through xdg-desktop-portal, not a bundled file manager, so the daily case is covered.
|
|
77 |
+ |
**yazi** (Rust, async, plugin system, sixel/kitty/iTerm image preview). TUI-only, no GUI fallback shipped; the pivot's TUI-first line applies here the same way it applied to Rnote. The browser and other GUI apps that need file dialogs go through xdg-desktop-portal, not a bundled file manager, so the daily case is covered.
|
| 78 |
78 |
|
|
| 79 |
79 |
|
No custom egui file manager planned. Scope is too large (file ops, permissions, drag-drop, thumbnails, archives, mounts, trash, search, batch ops, associations) for a marquee-app slot, and the pivot moved off graphical authored surfaces anyway.
|
| 80 |
80 |
|
|
| 81 |
|
- |
Rejected: broot (Rust TUI, useful as a complement but a different model), nautilus / dolphin (not Rust), cosmic-files (was the pre-pivot GUI fallback; dropped along with the rest of the graphical stack). Users who want a graphical file manager install one themselves with `flatpak install flathub com.system76.CosmicFiles` (or thunar, nautilus), the same posture as ungoogled-chromium.
|
|
81 |
+ |
Rejected: broot (Rust TUI, useful as a complement but a different model), nautilus / dolphin (not Rust), cosmic-files (was the pre-pivot GUI fallback; dropped along with the rest of the graphical stack). Users who want a graphical file manager install one themselves with `flatpak install flathub com.system76.CosmicFiles` (or thunar, nautilus): Flathub is where ad-hoc applications come from, and Alloy provisions none of them.
|
| 82 |
82 |
|
|
| 83 |
83 |
|
## Text editor
|
| 84 |
84 |
|
|
| 137 |
137 |
|
|
| 138 |
138 |
|
## Browser
|
| 139 |
139 |
|
|
| 140 |
|
- |
**Firefox (upstream) baked in as the default; ungoogled-chromium available as an opt-in Flatpak.** Alloy's identity work happens at the engine level, not the fork level, so upstream Firefox is the right base: no ESR lag, no fork-specific patch drift, the most-tested Gecko build shipping. Alloy owns the visual and behavioral layer via four files, each landing at the path Firefox actually reads:
|
|
140 |
+ |
**Helium baked into the image as the default, unconfigured.** Helium is ungoogled-chromium with the behavior Alloy used to hand-build on top of Firefox already set upstream: ads, trackers, cookie banners and third-party cookies blocked by default, fingerprinting tampered with, no analytics, and no network request at all on first launch. Alloy ships no policy file, no preference seed, no chrome CSS and no extension pin for it. Shipping nothing is the reason it is the default, not an omission next to it. The packaging rules this follows are in the wiki note `alloy-packaging-policy`; the short form is that an app earns a recommendation by not needing configuration, which is the same test that picked helix over a configured vim.
|
| 141 |
141 |
|
|
| 142 |
|
- |
- [`etc/firefox/policies/policies.json`](../etc/firefox/policies/policies.json): enterprise policy. Pins **uBlock Origin** as a force-installed, update-locked extension. Disables telemetry, Pocket, studies, sponsored tiles, new-tab feed, formfill, and password saving at the policy layer (higher-precedence than user prefs).
|
| 143 |
|
- |
- [`usr/lib64/firefox/mozilla.cfg`](../usr/lib64/firefox/mozilla.cfg): system-wide default prefs, loaded via Firefox autoconfig. Configures compact UI density, blank new tab, DuckDuckGo suggestions off, quiet scroll, and enables `toolkit.legacyUserProfileCustomizations.stylesheets` so `userChrome.css` gets read. Every entry uses `defaultPref()` so users can still override in `about:config`.
|
| 144 |
|
- |
- [`usr/lib64/firefox/defaults/pref/autoconfig.js`](../usr/lib64/firefox/defaults/pref/autoconfig.js): one-line pointer telling Firefox to load `mozilla.cfg` at startup.
|
| 145 |
|
- |
- [`etc/skel/.mozilla/firefox/profiles.ini`](../etc/skel/.mozilla/firefox/profiles.ini) + [`etc/skel/.mozilla/firefox/alloy.default/chrome/userChrome.css`](../templates/etc/skel/.mozilla/firefox/alloy.default/chrome/userChrome.css.in): first-launch profile seed. `profiles.ini` names a fixed-path profile (`alloy.default/`) so the pre-seeded `chrome/userChrome.css` (Helium-style ultra-compact horizontal, Alloy light-mode tokens from [TOKENS.md](TOKENS.md)) lands under it. Firefox opens the seeded profile on first launch instead of generating a random-suffix one.
|
|
142 |
+ |
The package is `helium-browser-bin` from Terra, the repo Alloy already enables for satty.
|
| 146 |
143 |
|
|
| 147 |
|
- |
Runs all modern sites (uBlock Origin blocks ads, never JS). Horizontal tabs only, per firm preference.
|
|
144 |
+ |
**What Alloy used to ship here, and no longer does.** Five files went with this change: an enterprise policy pinning uBlock Origin and disabling telemetry, Pocket, studies, sponsored tiles and password saving; a `mozilla.cfg` of around fifty default prefs; the autoconfig pointer that loaded it; a `profiles.ini` naming a fixed-path profile; and roughly two hundred lines of `userChrome.css`. That CSS described its own purpose in its header as "Helium-style ultra-compact horizontal". It was emulating a browser that is packaged, so the emulation had no reason to exist. The fifty prefs were not only cosmetic, and dropping them on a browser with bad defaults would be indefensible. It is affordable here because the recommended browser already behaves that way.
|
| 148 |
145 |
|
|
| 149 |
|
- |
**Ungoogled-chromium** is offered as the second-engine escape valve for the rare site that only renders correctly under Blink, and for users who prefer Chromium ergonomics without Google telemetry. Not baked into the ISO. Install path:
|
|
146 |
+ |
**This is a non-endorsement, not a pick.** Alloy is not claiming Blink is the better engine, and the monoculture argument that previously rejected Chromium as the default is recorded as overridden rather than withdrawn. Reinforcing one engine's dominance is a real cost and Alloy is paying it. What it lost to is the theming rule: the previous answer was "ship Gecko and fix it", and Alloy no longer fixes browsers. **Firefox remains one line in the Containerfile** for anyone who wants Gecko, which is what a builder-not-artifact distribution means by a choice, and it would ship with no Alloy configuration on it either.
|
| 150 |
147 |
|
|
| 151 |
|
- |
```
|
| 152 |
|
- |
flatpak install flathub io.github.ungoogled_software.ungoogled_chromium
|
| 153 |
|
- |
```
|
| 154 |
|
- |
|
| 155 |
|
- |
No Alloy config is shipped for it. The point is a working Chromium engine on demand, not a second identity surface.
|
|
148 |
+ |
**What still reaches the browser** is system appearance, through the portal and the toolkit rather than through per-app files: `org.freedesktop.appearance` `color-scheme` for light and dark, the GTK theme for system dialogs, the cursor theme, and the font stack including the Noto coverage packages. That is the whole of it. Anything past what a well-behaved app reads from the system is now the user's to set in the browser's own settings.
|
| 156 |
149 |
|
|
| 157 |
150 |
|
Accepted costs:
|
| 158 |
|
- |
- **userChrome.css drifts** across Firefox major versions. Alloy owns the theme; re-verify after each Firefox major release. Bounded work (a few selectors per bump).
|
| 159 |
|
- |
- **uBlock Origin pinning** is Alloy's enterprise policy, so Firefox will refuse to let the user disable or uninstall it via the extensions UI. Users who need to disable it can edit `/etc/firefox/policies/policies.json` themselves; Alloy documents the location.
|
|
151 |
+ |
- **The day/night switch reaching the browser is unverified.** The deleted `mozilla.cfg` set `ui.systemUsesDarkTheme = 0`, so Alloy was deliberately fighting the portal and the portal path has never been observed working here. If it turns out not to drive Helium, that is recorded as a defect in the appearance propagation and fixed there. Per-app chrome CSS does not come back for it.
|
|
152 |
+ |
- **No blocker is pinned.** Helium's blocking is a browser feature rather than a forced extension, which also means a user who disables it has disabled it, with nothing in the image arguing.
|
|
153 |
+ |
- **`-bin` provenance.** Terra repackages an upstream binary rather than building from source, and this is the most attack-exposed program in the image. It is still better provenance than the alternatives: Helium has no official Flatpak and upstream refuses to make one, holding that Chromium cannot be packaged as a Flatpak without breaking its internal sandbox, so every Flatpak of it is an unofficial community repackaging.
|
|
154 |
+ |
- **Updates come with the image.** A browser inside the image moves when the image is rebuilt rather than on its own channel. `alloy update` shows what is booted, what is staged, and how to roll back; reporting how far behind the image's packages have fallen, with the browser called out rather than buried in a bulk count, is filed work and not yet shipped.
|
| 160 |
155 |
|
|
| 161 |
156 |
|
Rejected:
|
| 162 |
|
- |
- **Floorp.** Was the previous pick. Rough edges in daily use, ESR-based cadence lags Firefox security patches, fork-specific patches add drift Alloy doesn't own. Upstream Firefox with policies + userChrome.css captures the actual value (visual and behavioral configurability) at less cost.
|
| 163 |
|
- |
- **LibreWolf.** Ships uBlock Origin preinstalled (a real win), but its hardening (`resistFingerprinting`, letterboxing, cookie clears on close, WebGL off) breaks modern sites. Un-hardening it to pass Alloy's "runs all modern sites" bar erases the reason to choose it over Firefox.
|
|
157 |
+ |
- **Firefox as the default.** Was the previous pick, and upstream Gecko remains the right Gecko. It loses on rule 3 alone: keeping it as the default meant keeping the five files, and every one of them was Alloy configuring an application.
|
|
158 |
+ |
- **Ungoogled-chromium.** Helium is built on it, so these were never two options, and it is packaged for neither Fedora nor Terra. Compiling it in the image costs hours of build time and roughly 100 GB of scratch space for a subset of what the prebuilt package already provides.
|
|
159 |
+ |
- **Helium as a Flatpak.** See the provenance note above.
|
|
160 |
+ |
- **LibreWolf.** Ships uBlock Origin preinstalled, but its hardening (`resistFingerprinting`, letterboxing, cookie clears on close, WebGL off) breaks modern sites. Un-hardening it to pass the "runs all modern sites" bar erases the reason to choose it.
|
| 164 |
161 |
|
- **Zen Browser.** Gecko-based and design-forward, but its identity centers vertical tabs and sidebar-forward layout. Revisit only if Zen ships a first-class horizontal mode as a supported configuration.
|
| 165 |
|
- |
- **Chromium as default, Brave, Vivaldi, Arc, Helium.** Alloy doesn't reinforce browser-engine monoculture. Ungoogled-chromium covers the "I need Blink" case without making it the default.
|
|
162 |
+ |
- **Brave, Vivaldi, Arc.** Each arrives with a business model attached to the browser, which is the class of default Alloy is least willing to hand a user.
|
| 166 |
163 |
|
|
| 167 |
164 |
|
## Containers
|
| 168 |
165 |
|
|
| 349 |
346 |
|
|
| 350 |
347 |
|
### Media keys: **playerctl**
|
| 351 |
348 |
|
|
| 352 |
|
- |
C, MPRIS client. CLI. No config; sway binds media keys directly to `exec playerctl play-pause` and similar. Handles Spotify, mpv, Firefox, and any MPRIS-compliant source.
|
|
349 |
+ |
C, MPRIS client. CLI. No config; sway binds media keys directly to `exec playerctl play-pause` and similar. Handles Spotify, mpv, the browser, and any MPRIS-compliant source.
|
| 353 |
350 |
|
|
| 354 |
351 |
|
Rejected: playerctld (still a playerctl variant), no serious alternative.
|
| 355 |
352 |
|
|
| 379 |
376 |
|
|
| 380 |
377 |
|
Config at [`templates/etc/skel/.config/gtk-3.0/`](../templates/etc/skel/.config/gtk-3.0/) and [`templates/etc/skel/.config/gtk-4.0/`](../templates/etc/skel/.config/gtk-4.0/) with matching `gtk.css` and `settings.ini` per version.
|
| 381 |
378 |
|
|
| 382 |
|
- |
**What this covers:** any GTK 3 or GTK 4 app that consumes libadwaita's named tokens: swayosd (GTK-rendered overlays), Firefox's system dialogs, xdg-desktop-portal-gtk dialogs, etc.
|
|
379 |
+ |
**What this covers:** any GTK 3 or GTK 4 app that consumes libadwaita's named tokens: swayosd (GTK-rendered overlays), the portal file dialogs a browser opens, xdg-desktop-portal-gtk dialogs, etc.
|
| 383 |
380 |
|
|
| 384 |
381 |
|
**What this doesn't cover:**
|
| 385 |
382 |
|
- Legacy GTK 3 apps with their own token sets (rare; most have migrated).
|