

https://mwmbl.org/ has a custom index of user-submitted domains and user-curated results but it’s not suitable for daily use yet.
https://mwmbl.org/ has a custom index of user-submitted domains and user-curated results but it’s not suitable for daily use yet.
You can also put this in ~/.config/xkb/symbols/us-custom
(create the parent directories if necessary) and set the environment variable XKB_DEFAULT_LAYOUT=us-custom
. This works in most Wayland compositors, including river and niri. For Hyprland, you can add this to your config file:
input {
kb_layout = us-custom
}
If you use GNOME, run
gsettings set org.gnome.desktop.input-sources mru-sources "[('xkb', 'us-custom')]"
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us-custom')]"
and restart GNOME.
This is my keyboard layout (I explained some bits of it here):
default partial alphanumeric_keys
xkb_symbols "basic" {
include "us(de_se_fi)" // Umlauts (ä, ö, ü) and €
include "level5(rctrl_switch)"
key.type[Group1] = "EIGHT_LEVEL";
// Number row
key <TLDE> {[ grave, asciitilde, dead_grave, dead_tilde ]};
key <AE01> {[ 1, exclam, onesuperior, U2081 ]}; // x₁
key <AE02> {[ 2, at, twosuperior, U2082 ]}; // x₂
key <AE03> {[ 3, numbersign, threesuperior, U2083 ]}; // x₃
key <AE06> {[ 6, asciicircum, dead_circumflex, dead_caron ]};
key <AE08> {[ 8, asterisk, enfilledcircbullet, U22C5, infinity ]}; // dot operator
key <AE10> {[ 0, parenright, NoSymbol, NoSymbol ]};
key <AE11> {[ minus, underscore, endash, emdash, U207B ]}; // x⁻
key <AE12> {[ equal, plus, notequal, approxeq ]};
// Top row
key <AD01> {[ q, Q, NoSymbol, U211A, NoSymbol, NoSymbol ]}; // ℚ
key <AD02> {[ w, W, NoSymbol, NoSymbol, Greek_omega, Greek_OMEGA ]};
key <AD03> {[ e, E, NoSymbol, NoSymbol, Greek_epsilon, U2203 ]}; // ∃
key <AD04> {[ r, R, NoSymbol, U211D, Greek_rho, U03F1 ]}; // ℝ ϱ
key <AD05> {[ t, T, U03D1, Greek_tau, Greek_theta, Greek_THETA ]}; // ϑ
key <AD08> {[ i, I, U21d2, U21d4, Greek_iota, integral ]}; // ⇒ ⇔
key <AD09> {[ o, O, NoSymbol, NoSymbol, Greek_omega, Greek_OMEGA ]};
key <AD10> {[ p, P, section, paragraph, Greek_pi, Greek_PI ]};
// Home row
key <AC01> {[ a, A, NoSymbol, NoSymbol, Greek_alpha, U2200 ]}; // ∀
key <AC02> {[ s, S, NoSymbol, NoSymbol, Greek_sigma, Greek_SIGMA ]};
key <AC03> {[ d, D, NoSymbol, NoSymbol, Greek_delta, Greek_DELTA ]};
key <AC04> {[ f, F, NoSymbol, NoSymbol, Greek_phi, Greek_PHI ]};
key <AC05> {[ g, G, degree, NoSymbol, Greek_gamma, Greek_GAMMA ]};
key <AC06> {[ h, H, U2190, NoSymbol, Greek_eta, U2225 ]}; // ← ∥
key <AC07> {[ j, J, U2193, NoSymbol, NoSymbol, NoSymbol ]}; // ↓
key <AC08> {[ k, K, U2191, NoSymbol, Greek_kappa, U03F0 ]}; // ↑ ϰ
key <AC09> {[ l, L, U2192, NoSymbol, Greek_lambda, Greek_LAMBDA ]}; // →
key <AC10> {[ semicolon, colon, dead_diaeresis, NoSymbol, NoSymbol, NoSymbol ]};
key <AC11> {[ apostrophe, quotedbl, rightsinglequotemark, NoSymbol, NoSymbol, NoSymbol ]};
key <AC12> {[ backslash, bar, U2500, U2502, NoSymbol, NoSymbol ]}; // box drawing
// Bottom row
key <AB01> {[ z, Z, NoSymbol, U2124, Greek_zeta, U2220 ]}; // ℤ ∠
key <AB02> {[ x, X, multiply, NoSymbol, Greek_xi, Greek_XI ]};
key <AB03> {[ c, C, NoSymbol, U2102, Greek_chi, copyright ]}; // ℂ
key <AB04> {[ v, V, doublelowquotemark, singlelowquotemark, Greek_psi, Greek_PSI ]};
key <AB05> {[ b, B, leftdoublequotemark, leftsinglequotemark, Greek_beta, NoSymbol ]};
key <AB06> {[ n, N, rightdoublequotemark, rightsinglequotemark,Greek_nu, U2115 ]}; // ℕ
key <AB07> {[ m, M, U2212, plusminus, Greek_mu, NoSymbol ]}; // minus
key <AB08> {[ comma, less, dead_cedilla, NoSymbol, U27e8, NoSymbol ]}; // ⟨
key <AB09> {[ period, greater, ellipsis, dead_abovedot, U27e9, NoSymbol ]}; // ⟩
key <AB10> {[ slash, question, division, questiondown, NoSymbol, NoSymbol ]};
};
GNOME Settings shows a visual preview of the first four layers:
See also this writeup by Leon Plickat.
Store your Firefox profile and all tabs in RAM for snappier browsing: https://wiki.archlinux.org/title/Firefox/Profile_on_RAM
Using MIT license means the developers cannot look at GNU source code when writing code for uutils. This feels like a unnecessary hurdle given that uutils wants to be 100% compatible with GNU tools.