| 8 |
8 |
|
|
| 9 |
9 |
|
**ublue relationship: alongside, not downstream.** Preserves naming and architectural independence. The "Alloy" name was picked specifically to avoid the ublue "Blue\*" prefix. Tradeoff: no shared image-building infrastructure, so whatever Alloy ships for image composition is on Alloy to build/maintain. Upside: total architectural freedom and a clean brand.
|
| 10 |
10 |
|
|
| 11 |
|
- |
**Composition strategy:** bootc + Containerfile, `FROM quay.io/fedora/fedora-bootc:42`. Source on `git.sr.ht/~maxmj/alloy`, CI on `builds.sr.ht`, published container image on `quay.io/alloy/alloy`. This is the ublue *convention* (Containerfile, OCI registry, CI-driven build) without ublue's base image, which is what "alongside ublue" resolves to in practice. Full delivery strategy and open questions in [IMAGE.md](IMAGE.md). Containerfile at the repo root; sr.ht CI at `.builds/alloy-image.yml`.
|
|
11 |
+ |
**Composition strategy:** bootc + Containerfile, `FROM quay.io/fedora/fedora-bootc:43`. Source on `git.sr.ht/~maxmj/alloy`, CI on `builds.sr.ht`, published container image on `quay.io/alloy/alloy`. This is the ublue *convention* (Containerfile, OCI registry, CI-driven build) without ublue's base image, which is what "alongside ublue" resolves to in practice. Full delivery strategy and open questions in [IMAGE.md](IMAGE.md). Containerfile at the repo root; sr.ht CI at `.builds/alloy-image.yml`.
|
| 12 |
12 |
|
|
| 13 |
13 |
|
## Compositor
|
| 14 |
14 |
|
|
| 48 |
48 |
|
|
| 49 |
49 |
|
## Screenshot stack
|
| 50 |
50 |
|
|
| 51 |
|
- |
- **grim** for capture, **slurp** for region select. sway has no built-in screenshot (Niri did, which is why this stack changed in the pivot); grim+slurp is the canonical wlroots pairing. Bound in the sway config: Print (full), Shift/Ctrl+Print (region via slurp). Active-window grab wants jq to parse the tree, left as a documented optional.
|
|
51 |
+ |
- **grim** for capture, **slurp** for region select. sway has no built-in screenshot (Niri did, which is why this stack changed in the pivot); grim+slurp is the canonical wlroots pairing. Bound in the sway config: Print (full), Shift+Print (region via slurp), Ctrl+Print (active window). The active-window grab reads the focused rect out of `swaymsg -t get_tree` with jq, which the fedora-bootc base already carries, so it costs nothing to ship.
|
| 52 |
52 |
|
- **satty** for annotation when needed (Rust, modern, replaces swappy). Mod+Print annotates the most recent capture.
|
| 53 |
53 |
|
- **wl-clipboard** for clipboard plumbing.
|
| 54 |
54 |
|
|
| 174 |
174 |
|
|
| 175 |
175 |
|
Rejected: fish (safer pick but Alloy's audience is script-writers), zsh (raw zsh unpleasant; adopting oh-my-zsh/zinit imports someone else's opinions), bash-as-login (un-opinionated at a layer where Alloy is opinionated everywhere else).
|
| 176 |
176 |
|
|
|
177 |
+ |
### Directory jumping: **zoxide**
|
|
178 |
+ |
|
|
179 |
+ |
Rust, tiny, no daemon. Tracks the directories you actually visit and ranks them by frequency and recency, so `z alloy` lands in the project from anywhere. On a tiling system where every workspace holds a terminal, the alternative is retyping paths all day; this is one of the few adjuncts that pays for itself within a session of use.
|
|
180 |
+ |
|
|
181 |
+ |
The Containerfile generates the nu integration at build time (`zoxide init nushell` into `/usr/share/nushell/vendor/autoload/`), so it is live on first login with nothing for the user to wire up.
|
|
182 |
+ |
|
|
183 |
+ |
Rejected: autojump (Python, effectively unmaintained), z / z.lua (shell-script and Lua ancestors of the idea; zoxide is the modern rewrite of exactly this), fasd (unmaintained), fzf-driven `cd` (needs a config recipe rather than a default, which is the pattern Alloy rejects), and shipping nothing (nu's `cd` plus tab completion is the baseline zoxide beats).
|
|
184 |
+ |
|
|
185 |
+ |
### Per-directory environment: **direnv**
|
|
186 |
+ |
|
|
187 |
+ |
Go, mature, the de facto answer for binding a project's environment to its directory: `cd` into a repo and its `.envrc` loads, leave and it unloads. Alloy's audience keeps toolchains, API endpoints, and per-project paths out of the global environment, and direnv is how that stays automatic instead of remembered.
|
|
188 |
+ |
|
|
189 |
+ |
Go rather than Rust, named per principle 1. Two Rust options exist and were weighed. **mise** does per-directory env, but its center of gravity is tool-version management (an asdf replacement), so adopting it for the env half means shipping a version manager Alloy has no position on. **shadowenv** (Rust, Shopify) is closer to the right scope, but configures in a Lisp dialect, which is the same scripting-language-config line the stack holds against wezterm and eww. direnv's `.envrc` is shell, which every user already reads.
|
|
190 |
+ |
|
|
191 |
+ |
Also rejected: autoenv (bare `source`, no security model, no unload), and per-project `nu` scripts sourced by hand (not automatic, which is the whole feature).
|
|
192 |
+ |
|
|
193 |
+ |
**Known gap: direnv ships inert.** It has no nushell hook, so the build-time autoload trick used for starship and zoxide has nothing to call. `direnv export json` is the supported seam, and the integration is an Alloy-authored snippet in `etc/skel/.config/nushell/integrations/` per [SHELL.md](SHELL.md#interoperability). Until that lands the binary is present and does nothing under the login shell.
|
|
194 |
+ |
|
| 177 |
195 |
|
## Utility defaults: content viewers
|
| 178 |
196 |
|
|
| 179 |
197 |
|
Alloy ships defaults for the three content types users open constantly. Not shipping them cedes the choice to whatever a user's first web search returns (VLC for video, nomacs for images), which conflicts with the curated-defaults principle everywhere else.
|