Introduces __fish_user_dots_path universal variable so users can point the private overlay directory at any path via set -U __fish_user_dots_path /your/path, rather than being locked to ~/.config/.user-dots/fish/
Simplifies sourcing model: config.fish now sources only local.fish; local.fish is responsible for sourcing its own secrets.fish companion (removes redundant double-sourcing)
Updates docs/fish-config.md Sections 1, 7, and 10 to document the new variable and sourcing model
Updates README.md Personalization section and "How it works" code example
Files Changed
File
Change
config.fish
Replace hardcoded dot_fish local + secrets.fish source with set -q __fish_user_dots_path fallback; source only local.fish
docs/fish-config.md
Document __fish_user_dots_path in Sections 1, 7, 10; update path references and sourcing model description
README.md
Update Personalization intro, directory tree, and "How it works" code block
Manual Verification
Open a new Fish shell — confirm no errors on startup
Confirm local.fish is still sourced from the default path (~/.config/.user-dots/fish/local.fish) when __fish_user_dots_path is not set
Run set -U __fish_user_dots_path /tmp/test-dots and create /tmp/test-dots/local.fish with set -gx DOTS_PATH_TEST ok; open a new shell and confirm echo $DOTS_PATH_TEST prints ok
Confirm secrets.fish is no longer sourced directly by config.fish (it is now sourced inside local.fish)
Run set -e __fish_user_dots_path to restore default; open new shell — confirm normal operation resumes
## Summary
- Introduces `__fish_user_dots_path` universal variable so users can point the private overlay directory at any path via `set -U __fish_user_dots_path /your/path`, rather than being locked to `~/.config/.user-dots/fish/`
- Simplifies sourcing model: `config.fish` now sources only `local.fish`; `local.fish` is responsible for sourcing its own `secrets.fish` companion (removes redundant double-sourcing)
- Updates `docs/fish-config.md` Sections 1, 7, and 10 to document the new variable and sourcing model
- Updates `README.md` Personalization section and "How it works" code example
## Files Changed
| File | Change |
|---|---|
| `config.fish` | Replace hardcoded `dot_fish` local + `secrets.fish` source with `set -q __fish_user_dots_path` fallback; source only `local.fish` |
| `docs/fish-config.md` | Document `__fish_user_dots_path` in Sections 1, 7, 10; update path references and sourcing model description |
| `README.md` | Update Personalization intro, directory tree, and "How it works" code block |
## Manual Verification
- [x] Open a new Fish shell — confirm no errors on startup
- [x] Confirm `local.fish` is still sourced from the default path (`~/.config/.user-dots/fish/local.fish`) when `__fish_user_dots_path` is not set
- [x] Run `set -U __fish_user_dots_path /tmp/test-dots` and create `/tmp/test-dots/local.fish` with `set -gx DOTS_PATH_TEST ok`; open a new shell and confirm `echo $DOTS_PATH_TEST` prints `ok`
- [x] Confirm `secrets.fish` is no longer sourced directly by `config.fish` (it is now sourced inside `local.fish`)
- [x] Run `set -e __fish_user_dots_path` to restore default; open new shell — confirm normal operation resumes
Allow users to customize the location of their private overlay directory
via `set -U __fish_user_dots_path /your/path`. Falls back to the previous
hardcoded default of `$XDG_CONFIG_HOME/.user-dots/fish` when unset.
Simplify the sourcing model: config.fish now sources only local.fish,
which is responsible for sourcing its own secrets.fish companion. The
redundant direct sourcing of secrets.fish from config.fish is removed.
Update docs/fish-config.md (Sections 1, 7, 10) and README.md to
document the new variable, the custom-path override pattern, and the
simplified sourcing model.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
__fish_user_dots_pathuniversal variable so users can point the private overlay directory at any path viaset -U __fish_user_dots_path /your/path, rather than being locked to~/.config/.user-dots/fish/config.fishnow sources onlylocal.fish;local.fishis responsible for sourcing its ownsecrets.fishcompanion (removes redundant double-sourcing)docs/fish-config.mdSections 1, 7, and 10 to document the new variable and sourcing modelREADME.mdPersonalization section and "How it works" code exampleFiles Changed
config.fishdot_fishlocal +secrets.fishsource withset -q __fish_user_dots_pathfallback; source onlylocal.fishdocs/fish-config.md__fish_user_dots_pathin Sections 1, 7, 10; update path references and sourcing model descriptionREADME.mdManual Verification
local.fishis still sourced from the default path (~/.config/.user-dots/fish/local.fish) when__fish_user_dots_pathis not setset -U __fish_user_dots_path /tmp/test-dotsand create/tmp/test-dots/local.fishwithset -gx DOTS_PATH_TEST ok; open a new shell and confirmecho $DOTS_PATH_TESTprintsoksecrets.fishis no longer sourced directly byconfig.fish(it is now sourced insidelocal.fish)set -e __fish_user_dots_pathto restore default; open new shell — confirm normal operation resumes