# XDG Base Directory

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Related articles

- dotfiles
- XDG user directories

This article summarizes the XDG Base Directory specification in #Specification and tracks software support in #Support.

## Specification

Please read the full specification. This section will attempt to break down the essence of what it tries to achieve.

Only `XDG_RUNTIME_DIR` is set by default through pam_systemd. It is up to the user to explicitly define the other variables according to the specification.

See Environment variables#Globally for information on defining variables.

### User directories

- `XDG_CONFIG_HOME`
  - Where user-specific configurations should be written (analogous to `/etc`).
  - Should default to `$HOME/.config`.

- `XDG_CACHE_HOME`
  - Where user-specific non-essential (cached) data should be written (analogous to `/var/cache`).
  - Should default to `$HOME/.cache`.

- `XDG_DATA_HOME`
  - Where user-specific data files should be written (analogous to `/usr/share`).
  - Should default to `$HOME/.local/share`.

- `XDG_STATE_HOME`
  - Where user-specific state files should be written (analogous to `/var/lib`).
  - Should default to `$HOME/.local/state`.

- `XDG_RUNTIME_DIR`
  - Used for non-essential, user-specific data files such as sockets, named pipes, etc.
  - Not required to have a default value; warnings should be issued if not set or equivalents provided.
  - Must be owned by the user with an access mode of `0700`.
  - Filesystem fully featured by standards of OS.
  - Must be on the local filesystem.
  - May be subject to periodic cleanup.
  - Modified every 6 hours or set sticky bit if persistence is desired.
  - Can only exist for the duration of the user's login.
  - Should not store large files as it may be mounted as a tmpfs.
  - pam_systemd sets this to `/run/user/$UID`.

### System directories

- `XDG_DATA_DIRS`
  - List of directories separated by `:` (analogous to `PATH`).
  - Should default to `/usr/local/share:/usr/share`.

- `XDG_CONFIG_DIRS`
  - List of directories separated by `:` (analogous to `PATH`).
  - Should default to `/etc/xdg`.

## Support

This section exists to catalog the growing set of software using the XDG Base Directory Specification introduced in 2003. This is here to demonstrate the viability of this specification by listing commonly found dotfiles and their support status. For those not currently supporting the Base Directory Specification, workarounds will be demonstrated to emulate it instead.

The workarounds will be limited to anything not involving patching the source, executing code stored in environment variables or compile-time options. The rationale for this is that configurations should be portable across systems and having compile-time options prevent that.

Hopefully this will provide a source of information about exactly what certain kinds of dotfiles are and where they come from.

### Contributing

When contributing make sure to use the correct section.

Nothing should require code evaluation (such as vim and `VIMINIT`), patches or compile-time options to gain support and anything which does must be deemed hardcoded. Additionally, if the process is error prone or difficult, it should also be classified as hardcoded.

- The first column should be either a link to an internal article, a Template:Pkg or a Template:AUR.
- The second column is for any legacy files and directories the project had (one per line), this is done so people can find them even if they are no longer read.
- In the third, try to find the commit or version a project switched to XDG Base Directory or any open discussions and include them in the next two columns (two per line).
- The last column should include any appropriate workarounds or solutions. Please verify that your solution is correct and functional.

### Supported

Application | Legacy Path | Supported Since | Discussion | Notes
--- | --- | --- | --- | ---
aerc-gitAUR |  |  |  |
ALSA | `~/.asoundrc` | 577df36 1.2.3 | [1] | `XDG_CONFIG_HOME/alsa/asoundrc`
Android Studio | `~/.AndroidStudioX.X` | Android Studio 4.1 |  |
    XDG_CONFIG_HOME/Google/AndroidStudioX.X
    XDG_DATA_HOME/Google/AndroidStudioX.X
    XDG_CACHE_HOME/Google/AndroidStudioX.X
Location overview by Google doesn't mention XDG - paths could be hardcoded instead of using the proper variable, though that is unlikely as Intellij IDEA, which Android Studio is based on, implements it properly as well
antimicroAUR[broken link: package not found] | `~/.antimicro` | edba864 | [2] | Package moved to antimicroxAUR - this entry needs to be migrated
aria2 | `~/.aria2` | 8bc1d37 | [3] |
    XDG_CONFIG_HOME/aria2/
    XDG_CACHE_HOME/aria2/
asunder | `~/.asunder` `~/.asunder_album_artist` `~/.asunder_album_genre` `~/.asunder_album_title` | 2.9.0[dead link 2021-05-17 ⓘ] | [4][dead link 2021-05-17 ⓘ] | Uses `XDG_CONFIG_HOME/asunder/asunder` for `~/.asunder` and `XDG_CACHE_HOME/asunder/asunder_album_...` for the other 3 files. Legacy paths are not removed after migration, they have to be deleted manually.
binwalk | `~/.binwalk` | 2051757 | [5] | `XDG_CONFIG_HOME/binwalk`
Blender | `~/.blender` | 4293f47 | [6] |
byobu | `~/.byobu` | 4.17 | [7] | `XDG_CONFIG_HOME/byobu` Legacy path takes precedence if present, or if `XDG_CONFIG_HOME` is not set.
calcurse | `~/.calcurse` | 04162d | [8] [9] |
    XDG_CONFIG_HOME/calcurse
    XDG_DATA_HOME/calcurse
If the legacy path `~/.calcurse` is present, it will take precedence.
calibre |  |  |  |
ccache | `~/.ccache` | 4.0 | [10] |
    XDG_CACHE_HOME/ccache
    XDG_CONFIG_HOME/ccache/ccache.conf
citra-gitAUR | `~/.citra-emu` | f7c3193 | [11] |
clangd | `~/.clangd` | fdf7dcc | [12] | `XDG_CONFIG_HOME/clangd/config.yml` `XDG_CACHE_HOME/clangd` Project specific configuration can be specified in `proj/.clangd`. Configuration is combined when this is sensible. In case of conflicts, user config has the highest precedence, then inner project, then outer project.
Composer | `~/.composer` | 1.0.0-beta1 | [13] |
d-feet | `~/.d-feet` | 7f6104b |  |
dconf |  |  |  |
Dolphin emulator | `~/.dolphin-emu` | a498c68 | [14] |
dr14_tmeterAUR |  | 7e777ca | [15] | `XDG_CONFIG_HOME/dr14tmeter/`
dunst |  | 78b6e2b | [16] |
dwb |  |  |  |
fish |  |  |  |
fontconfig | `~/.fontconfig` `~/.fonts` | 8c255fb, [17] |  | Use `XDG_DATA_HOME/fonts` to store fonts instead.
fontforge | `~/.FontForge` `~/.PfaEdit` | e4c2cc7 | [18] [19] |
freerdp | `~/.freerdp` | edf6e72 |  |
Emacs | `~/.emacs` `~/.emacs.d/init.el` | [20] 27.1 |  | `XDG_CONFIG_HOME/emacs/init.el` Legacy paths have precedence over XDG paths. Emacs will never create `XDG_CONFIG_HOME/emacs/`. Workaround for 26.3 or older: It's possible to set `HOME`, but it has unexpected side effects.
Gajim | `~/.gajim` | 3e777ea | [21] |
gconfAUR | `~/.gconf` | fc28caa | [22] |
GIMP | `~/.gimp-x.y` `~/.thumbnails` | 60e0cfe 483505f | [23] [24] |
Git | `~/.gitconfig` | 0d94427 |  | `XDG_CONFIG_HOME/git/config`
gops |  | 71c4255 |  |
GStreamer | `~/.gstreamer-0.10` | 4e36f93 | [25] |
Godot Engine | `~/.godot` | 73049d1 3.0-stable | [26] |
GTK 3 |  |  |  |
helm | `~/.helm` | 3.0.0 |  |
htop | `~/.htoprc` | 93233a6 |  |
httpie | `~/.httpie` | 5af0874 | [27] |
i3 | `~/.i3` | 7c130fb |  |
i3status | `~/.i3status.conf` | c3f7fc4 |  |
imagemagick |  |  |  |
Inkscape | `~/.inkscape` | 0.47 | [28] |
iwd / iwctl | `~/.iwctl_history` | d3e00d7f |  |
intellij-idea-community-edition / intellij-idea-ultimate-editionAUR | `~/.IntelliJIdeaXXXX.X` | 2020.1 | [29] |
    XDG_CONFIG_HOME/JetBrains/IntelliJIdeaXXXX.X
    XDG_DATA_HOME/JetBrains/IntelliJIdeaXXXX.X
    XDG_CACHE_HOME/JetBrains/IntelliJIdeaXXXX.X
josm | `~/.josm` | 11162 | [30] |
Kakoune |  |  |  |
latexmk (in texlive-core) | `~/.latexmkrc` |  |  | `XDG_CONFIG_HOME/latexmk/latexmkrc`
lftp | `~/.lftp` | 21dc400 | [31] |
lgogdownloaderAUR | `~/.gogdownloader` | d430af6 | [32] |
LibreOffice |  | a6f56f7 25bd2ee | [33] |
NSS | `~/.pki` | 3.42 | [34] |
Streamlink | `~/.livestreamerrc` | ea80591 | [35] |
llpp |  | 3ab86f0 |  | Currently llpp places the configuration directly under `XDG_CONFIG_HOME` instead of creating a directory.
mc | `~/.mc` | 1b99570 0b71156 ce401d7 | [36] |
Mercurial | `~/.hgrc` | 3540200 4.2 |  | `XDG_CONFIG_HOME/hg/hgrc`.
msmtp | `~/.msmtprc` | af2f409 v1.6.7+ |  | `XDG_CONFIG_HOME/msmtp/config`.
mesa |  | 87ab26b |  | `XDG_CACHE_HOME/mesa`
milkytracker | `~/.milkytracker_config` | eb487c5 | [37] |
mozc | `~/.mozc` | 91cc1e1 | [38] |
mpd | `~/.mpdconf` | 87b7328 |  |
mpv | `~/.mpv` | cb250d4 | [39] |
mutt | `~/.mutt` | b17cd67 | [40] |
mypaint | `~/.mypaint` | cf723b7 |  |
nano | `~/.nano/` `~/.nanorc` | c16e79b | [41] |
ncmpcpp | `~/.ncmpcpp` | 38d9f81 27cd86e | [42] [43] | `ncmpcpp_directory` should be set to avoid an `error.log` file in `~/.ncmpcpp`.
Neovim | `~/.nvim` `~/.nvimlog` `~/.nviminfo` | 1ca5646 | [44] [45] |
newsbeuter | `~/.newsbeuter` | 3c57824 | [46] | It is required to create both directories [47]: `mkdir -p "$XDG_DATA_HOME"/newsbeuter "$XDG_CONFIG_HOME"/newsbeuter`
node-gyp | `~/.node-gyp` | 2b5ce52a | [48] | Only available on master as of 2018-12-04.
np2kai-gitAUR | `~/.config/np2kai` `~/.config/xnp2kai` | 56a1cc2 | [49] |
nteract-binAUR |  | 4593e72 | [50] [51] | does not recognize workarounds for ipython/jupyter
OfflineIMAP | `~/.offlineimaprc` | 5150de5 | [52] |
opentyrianAUR | `~/.opentyrian` | 39559c3 | [53] |
pandoc | `~/.pandoc/` | 0bed0ab | [54] |
PCManFM | `~/.thumbnails` | 1.3.2 |  |
pcsx2 | `~/.pcsx2` | 87f1e8f a9020c6 3b22f0f 0a012ae | [55] [56] |
Pry | `~/.pryrc` `~/.pry_history` | a0be0cc7 15e1fc92 e9d1be0e | [57] |
python-pip | `~/.pip` | 6.0 | [58] |
powershellAUR |  | 6.0 |  |
ppsspp | `~/.ppsspp` | 132fe47 | [59] |
procps-ng | `~/.toprc` | af53e17 | [60] [61] |
orbment-gitAUR |  |  |  |
pacman | `~/.makepkg.conf` | 80eca94 | [62] |
panda3dAUR | `~/.panda3d` | 2b537d2 |  |
poezioAUR |  |  |  |
PulseAudio | `~/.pulse` `~/.pulse-cookie` | 59a8618 87ae830 9ab510a 4c195bc | [63] |
pyroomAUR |  |  |  |
quodlibet | `~/.quodlibet` | 3.10.0 | [64] |
qutebrowser |  |  |  |
qtile |  | fd8686e 66d704b 51cff01 | [65] | Some optional bar widgets can create files and directories in non-compliant paths, but most often these are still configurable.
rclone | `~/.rclone.conf` | 9d36258 | [66] |
retroarch |  |  |  |
rrAUR | `~/.rr` | 02e7d41 | [67] |
RSpec | `~/.rspec` | 5e395e2 | [68] |
rTorrent | `~/.rtorrent.rc` | 6a8d332 |  |
RuboCop | `~/.rubocop.yml` | 6fe5956 | [69] |
sdcv | `~/.stardict/` `~/.sdcv_history` | 958ec35 | [70] |
skypeforlinux-stable-binAUR | `~/.Skype` | 8.0 |  |
snes9x | `~/.snes9x` | 93b5f11 | [71] | By default, the configuration file is left blank with intention that the user will fill it at their will (through the gui or manually).
spectrwm | `~/.spectrwm` | a30bbb | [72] |
sublime-text-devAUR |  |  |  | Cache is placed in `XDG_CONFIG_HOME/sublime-text-3/Cache` instead of expected `XDG_CACHE_HOME/sublime-text-3`.
surfraw | `~/.surfraw.conf` `~/.surfraw.bookmarks` | 3e4591d bd8c427 f57fc71 |  |
sway | `~/.sway/config` | 614393c | [73] |
systemd |  |  |  |
teeworlds | `~/.teeworlds` | [74] |  |
termite |  |  |  |
tig | `~/.tigrc`, `~/.tig_history` | 2.2 | [75] | `~/.local/share/tig` directory must exist, writes to `~/.tig_history` otherwise.
tmux | `~/.tmux.conf` | 3.1 | [76] | 3.1 introduced `~/.config/tmux/tmux.conf` and in 3.2 `XDG_CONFIG_HOME/tmux/tmux.conf` was added
tmuxp | `~/.tmuxp` | 1.5.0 | [77] | Fixed in 1.5.2
tmuxinatorAUR | `~/.tmuxinator` | 2636923 | [78] |
Transmission | `~/.transmission` | b71a298 |  |
util-linux |  | 570b321 |  |
Uzbl |  | c6fd63a | [79] |
vimb |  |  |  |
VirtualBox | `~/.VirtualBox` | 4.3 | [80] |
vis | `~/.vis` | 68a25c7 d138908 | [81] |
VLC | `~/.vlcrc` | 16f32e1 | [82] |
warsow | `~/.warsow-2.x` | 98ece3f | [83] |
WeeChat | `~/.weechat` | [84] 3.2 | [85] [86] |
    XDG_CONFIG_HOME/weechat
    XDG_CACHE_HOME/weechat
    XDG_DATA_HOME/weechat
Wireshark | `~/.wireshark` | b0b53fa |  |
xsettingsd-gitAUR | `~/.xsettingsd` | b4999f5 |  |
xmonad | `~/.xmonad` | 40fc10b | [87] [88] | Alternatively the environments `XMONAD_CONFIG_HOME`, `XMONAD_DATA_HOME`, and `XMONAD_CACHE_HOME` are also available.
xsel | `~/.xsel.log` | ee7b481 | [89] |

### Partial

Application | Legacy Path | Supported Since | Discussion | Notes
--- | --- | --- | --- | ---
abookAUR | `~/.abook` |  |  | `abook --config "$XDG_CONFIG_HOME"/abook/abookrc --datafile "$XDG_DATA_HOME"/abook/addressbook`
anacondaAUR | `~/.conda/.condarc`, `~/.conda/condarc`, `~/.conda/condarc.d/`, `~/.condarc` |  | [90] | `export CONDARC="$XDG_CONFIG_HOME/conda/condarc"`
ack | `~/.ackrc` |  | [91] | `export ACKRC="$XDG_CONFIG_HOME/ack/ackrc"`
Anki | `~/Anki`, `~/Documents/Anki` |  | [92] [93] | `anki -b "$XDG_DATA_HOME"/Anki`
aspell | `~/.aspell.conf` |  | [94] | `export ASPELL_CONF="per-conf $XDG_CONFIG_HOME/aspell/aspell.conf; personal $XDG_CONFIG_HOME/aspell/en.pws; repl $XDG_CONFIG_HOME/aspell/en.prepl"`
Atom | `~/.atom` |  | [95] | `export ATOM_HOME="$XDG_DATA_HOME"/atom`
aws-cli | `~/.aws` | 1.7.45 | [96] | `export AWS_SHARED_CREDENTIALS_FILE="$XDG_CONFIG_HOME"/aws/credentials`, `export AWS_CONFIG_FILE="$XDG_CONFIG_HOME"/aws/config`
bash-completion | `~/.bash_completion` |  |  | `export BASH_COMPLETION_USER_FILE="$XDG_CONFIG_HOME"/bash-completion/bash_completion`
bazaar | `~/.bazaar`, `~/.bzr.log` | 2.3.0 | [97] | Discussion in upstream bug states that bazaar will use `~/.config/bazaar` if it exists. The logfile `~/.bzr.log` might still be written.
btpd-gitAUR | `~/.btpd/` |  | [98] | `btpd -d "$XDG_DATA_HOME"/.btpd` `HOME="$XDG_DATA_HOME" btcli`
buchhaltung-gitAUR | `~/.buchhaltung` |  | [99] | `export BUCHHALTUNG="$XDG_CONFIG_HOME"/buchhaltung`
Ruby#Bundler | `~/.bundle` | 2.1.0 | [100] [101] [102] |
     export BUNDLE_USER_CONFIG="$XDG_CONFIG_HOME"/bundle
     export BUNDLE_USER_CACHE="$XDG_CACHE_HOME"/bundle
     export BUNDLE_USER_PLUGIN="$XDG_DATA_HOME"/bundle
Is considered as fixed by the environment variables.
cabal | `~/.cabal/` |  | [103] |
    export CABAL_CONFIG="$XDG_CONFIG_HOME"/cabal/config
    export CABAL_DIR="$XDG_CACHE_HOME"/cabal
See documentation on environment variables. CABAL_DIR may be put into DATA if you consider downloaded files as such.
Rust#Cargo | `~/.cargo` |  | [104] [105] [106] [107] | `export CARGO_HOME="$XDG_DATA_HOME"/cargo`
chez-schemeAUR | `~/.chezscheme_history` |  |  | `petite --eehistory "$XDG_DATA_HOME"/chezscheme/history`
Chromium | `~/.chromium`, `~/.pki` | 23057 | [108] [109] [110] |
cinelerra | `~/.bcast5` |  | [111] | `export CIN_CONFIG="$XDG_CONFIG_HOME"/bcast5`
conky | `~/.conkyrc` | 00481ee | [112] | `conky --config="$XDG_CONFIG_HOME"/conky/conkyrc`
claws-mail | `~/.claws-mail` |  | [113] | `claws-mail --alternate-config-dir "$XDG_DATA_HOME"/claws-mail`
coreutils | `~/.dircolors` |  |  | `eval $(dircolors "$XDG_CONFIG_HOME"/dircolors)`
crawl | `~/.crawl` |  |  | The trailing slash is required: `export CRAWL_DIR="$XDG_DATA_HOME"/crawl/`
clusterssh | `~/.clusterssh/` |  |  | `alias cssh="cssh --config-file '$XDG_CONFIG_HOME/clusterssh/config'"`
    $XDG_CONFIG_HOME/clusterssh/config
    extra_cluster_file=$HOME/.config/clusterssh/clusters
    extra_tag_file=$HOME/.config/clusterssh/tags
Despite this, clusterssh will still create `~/.clusterssh/`.
CUDA | `~/.nv` |  |  | `export CUDA_CACHE_PATH="$XDG_CACHE_HOME"/nv`
dict | `~/.dictrc` |  |  | `dict -c "$XDG_CONFIG_HOME"/dict/dictrc`
Docker | `~/.docker` |  |  | `export DOCKER_CONFIG="$XDG_CONFIG_HOME"/docker`
docker-machine | `~/.docker/machine` |  |  | `export MACHINE_STORAGE_PATH="$XDG_DATA_HOME"/docker-machine`
DOSBox | `~/.dosbox/dosbox-0.74-2.conf` |  | [114] | `dosbox -conf "$XDG_CONFIG_HOME"/dosbox/dosbox.conf`
Electrum Bitcoin Wallet | `~/.electrum` | c121230 |  | `export ELECTRUMDIR="$XDG_DATA_HOME/electrum"`
ELinks | `~/.elinks` |  |  | `export ELINKS_CONFDIR="$XDG_CONFIG_HOME"/elinks`
elixir | `~/.mix` | afaf889 | [115] [116] | Elixir do not fully conform to XDG specs, it will use XDG only if the environment variables are present, otherwise it will by default use legacy path.
Elm | `~/.elm` |  |  | `export ELM_HOME="$XDG_CONFIG_HOME"/elm`
flutterAUR | `~/.flutter`, `~/.flutter_settings`, `~/.flutter_tool_state` |  | [117] |
emscripten | `~/.emscripten`, `~/.emscripten_sanity`, `~/.emscripten_ports`, `~/.emscripten_cache__last_clear` |  | [118] | `export EM_CONFIG="$XDG_CONFIG_HOME"/emscripten/config`, `export EM_CACHE="$XDG_CACHE_HOME"/emscripten/cache`, `export EM_PORTS="$XDG_DATA_HOME"/emscripten/cache`, `emcc --em-config "$XDG_CONFIG_HOME"/emscripten/config --em-cache "$XDG_CACHE_HOME"/emscripten/cache`
freecad | `~/.FreeCAD` |  | [119] | `freecad -u "$XDG_CONFIG_HOME"/FreeCAD/user.cfg -s "$XDG_CONFIG_HOME"/FreeCAD/system.cfg` Despite these options, freecad will still create the file `.FreeCAD/cookie` as the web module has it hard coded
GDB | `~/.gdbinit`, `~/.gdb_history` |  |  | `export GDBHISTFILE="$XDG_DATA_HOME"/gdb/history`, `gdb -nh -x "$XDG_CONFIG_HOME"/gdb/init`
get_iplayerAUR | `~/.get_iplayer` |  |  | `export GETIPLAYERUSERPREFS="$XDG_DATA_HOME"/get_iplayer`
getmail | `~/.getmail/getmailrc` |  |  | `getmail --rcfile="$XDG_CONFIG_HOME/getmail/getmailrc" --getmaildir="$XDG_DATA_HOME/getmail"`
glivAUR | `~/.glivrc` |  |  | `gliv --glivrc="$XDG_CONFIG_HOME"/gliv/glivrc`
gnuradio | `~/.gnuradio` |  | [120] |
GnuPG | `~/.gnupg` |  | [121] [122] | `export GNUPGHOME="$XDG_DATA_HOME"/gnupg`, `gpg2 --homedir "$XDG_DATA_HOME"/gnupg` Note that this currently does not work out-of-the-box using systemd user units and socket-based activation, since the socket directory changes based on the hash of `$GNUPGHOME`. You can get the new socket directory using `gpgconf --dry-run --create-socketdir` and have to modify the systemd user units to listen on the correct sockets accordingly.
Go | `~/go` | [123] |  | `export GOPATH="$XDG_DATA_HOME"/go`
Google Earth | `~/.googleearth` |  |  | Some paths can be changed with the `KMLPath` and `CachePath` options in `~/.config/Google/GoogleEarthPlus.conf`
gopass | `~/.password-store` |  |  | Override settings in `~/.config/gopass/config.yml`:
    ~/.config/gopass/config.yml
    root:
    path: gpgcli-gitcli-fs+file:///home/<userid>/.config/password-store
gpodder | `~/gPodder` |  |  | `GPODDER_DOWNLOAD_DIR` sets the download folder. `GPODDER_HOME` - where config and database files are stored, downloads also if `GPODDER_DOWNLOAD_DIR` is not set.
GQ LDAP client | `~/.gq`, `~/.gq-state` | 1.51 |  | `export GQRC="$XDG_CONFIG_HOME"/gqrc`, `export GQSTATE="$XDG_DATA_HOME"/gq/gq-state`, `mkdir -p "$(dirname "$GQSTATE")"`
Gradle | `~/.gradle` |  | [124] | `export GRADLE_USER_HOME="$XDG_DATA_HOME"/gradle`
GTK 1 | `~/.gtkrc` |  |  | `export GTK_RC_FILES="$XDG_CONFIG_HOME"/gtk-1.0/gtkrc`
GTK 2 | `~/.gtkrc-2.0` |  |  | `export GTK2_RC_FILES="$XDG_CONFIG_HOME"/gtk-2.0/gtkrc`
hledger | `~/.hledger.journal` |  | [125] | `export LEDGER_FILE="$XDG_DATA_HOME"/hledger.journal`
imapfilterAUR | `~/.imapfilter` |  |  | `export IMAPFILTER_HOME="$XDG_CONFIG_HOME/imapfilter"`
IPFS | `~/.ipfs` |  |  | `export IPFS_PATH="$XDG_DATA_HOME"/ipfs`
ipython/jupyter | `~/.ipython` |  | won't fix,won't fix | `export IPYTHONDIR="$XDG_CONFIG_HOME"/jupyter`, `export JUPYTER_CONFIG_DIR="$XDG_CONFIG_HOME"/jupyter`
irb | `~/.irbrc` |  |  |
    ~/.profile
    $ export IRBRC="$XDG_CONFIG_HOME"/irb/irbrc
    "$XDG_CONFIG_HOME"/irb/irbrc
    IRB.conf[:SAVE_HISTORY] ||= 1000
    IRB.conf[:HISTORY_FILE] ||= File.join(ENV["XDG_DATA_HOME"], "irb", "history")
irssi | `~/.irssi` |  | [126] | `irssi --config="$XDG_CONFIG_HOME"/irssi/config --home="$XDG_DATA_HOME"/irssi`
isync | `~/.mbsyncrc` |  | [127] | `mbsync -c "$XDG_CONFIG_HOME"/isync/mbsyncrc`
Java#OpenJDK | `~/.java/.userPrefs` |  | [128] | `export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java`
k9s | `~/.k9s` | 0.20.4 | [129] | `export K9SCONFIG="$XDG_CONFIG_HOME"/k9s`
KDE | `~/.kde` |  | [130] | `export KDEHOME="$XDG_CONFIG_HOME"/kde`
keychain | `~/.keychain` | [131] | [132] | `keychain --absolute --dir "$XDG_RUNTIME_DIR"/keychain`
ledger | `~/.ledgerrc`, `~/.pricedb` |  | [133] | `ledger --init-file "$XDG_CONFIG_HOME"/ledgerrc`
less | `~/.lesshst` |  |  | `mkdir -p "$XDG_CACHE_HOME"/less`, `export LESSKEY="$XDG_CONFIG_HOME"/less/lesskey`, `export LESSHISTFILE="$XDG_CACHE_HOME"/less/history` `export LESSHISTFILE=-` can be used to disable this feature.
Leiningen | `~/.lein`, `~/.m2` |  |  | `export LEIN_HOME="$XDG_DATA_HOME"/lein` to change the m2 repo location used by leiningen look here: Leiningen#m2_repo_location
libdvdcss | `~/.dvdcss` |  | [134] | `export DVDCSS_CACHE="$XDG_DATA_HOME"/dvdcss`
libice | `~/.ICEauthority` |  | [135] | `export ICEAUTHORITY="$XDG_CACHE_HOME"/ICEauthority` Make sure `XDG_CACHE_HOME` is set beforehand to directory user running Xorg has write access to. Do not use `XDG_RUNTIME_DIR` as it is available after login. Display managers that launch Xorg (like GDM) will repeatedly fail otherwise.
librewolfAUR | `~/.mozilla` `~/.librewolf` |  |  | `mkdir $XDG_DATA_HOME/librewolf && mv librewolf.AppImage $XDG_DATA_HOME/librewolf`, `$XDG_DATA_HOME/librewolf/librewolf.AppImage --appimage-portable-home`, `sudo ln -s $XDG_DATA_HOME/librewolf/librewolf.AppImage /usr/local/bin/librewolf` This is not a perfect solution - you will have to create symlinks to your downloads and other XDG directories to get the browser to use them properly. However, it is workable. Of course, you could do this in any directory, not just `$XDG_DATA_HOME`
libx11 | `~/.XCompose`, `~/.compose-cache` |  |  | `export XCOMPOSEFILE="$XDG_CONFIG_HOME"/X11/xcompose`, `export XCOMPOSECACHE="$XDG_CACHE_HOME"/X11/xcompose`
ltrace | `~/.ltrace.conf` |  |  | `ltrace -F "$XDG_CONFIG_HOME"/ltrace/ltrace.conf`
maptool-binAUR | `~/.maptool-rptools` |  | [136] |
    /opt/maptool/lib/app/MapTool.cfg
    [JavaOptions]
    -DMAPTOOL_DATADIR=.local/share/maptool-rptools
However, no way to change the location of this configuration file.
maven | `~/.m2` |  | [137] | `mvn -gs "$XDG_CONFIG_HOME"/maven/settings.xml` and set `<localRepository>` as appropriate in settings.xml
Mathematica | `~/.Mathematica` |  |  | `export MATHEMATICA_USERBASE="$XDG_CONFIG_HOME"/mathematica`
maxima | `~/.maxima` |  |  | `export MAXIMA_USERDIR="$XDG_CONFIG_HOME"/maxima`
mednafen | `~/.mednafen` |  |  | `export MEDNAFEN_HOME="$XDG_CONFIG_HOME"/mednafen`
minikube | `~/.minikube` |  | [138] | `export MINIKUBE_HOME="$XDG_DATA_HOME"/minikube` Creates a further `.minikube` directory in `MINIKUBE_HOME` for whatever reason.
mitmproxy | `~/.mitmproxy` |  |  | `alias mitmproxy="mitmproxy --set confdir=$XDG_CONFIG_HOME/mitmproxy"`, `alias mitmweb="mitmweb --set confdir=$XDG_CONFIG_HOME/mitmproxy"`
MOC | `~/.moc` |  |  | `mocp -M "$XDG_CONFIG_HOME"/moc`, `mocp -O MOCDir="$XDG_CONFIG_HOME"/moc`
monero | `~/.bitmonero` |  |  | `monerod --data-dir "$XDG_DATA_HOME"/bitmonero`
most | `~/.mostrc` |  |  | `export MOST_INITFILE="$XDG_CONFIG_HOME"/mostrc`
MPlayer | `~/.mplayer` |  |  | `export MPLAYER_HOME="$XDG_CONFIG_HOME"/mplayer`
MySQL | `~/.mysql_history`, `~/.my.cnf` , `~/.mylogin.cnf` |  |  | `export MYSQL_HISTFILE="$XDG_DATA_HOME"/mysql_history` `~/.my.cnf` only supported for mysql-server, not mysql-client [139] `~/.mylogin.cnf` unsupported
ncurses | `~/.terminfo` |  |  | Precludes system path searching: `export TERMINFO="$XDG_DATA_HOME"/terminfo`, `export TERMINFO_DIRS="$XDG_DATA_HOME"/terminfo:/usr/share/terminfo`
ncmpc | `~/.ncmpc` |  |  | `ncmpc -f "$XDG_CONFIG_HOME"/ncmpc/config`
Netbeans | `~/.netbeans` |  | [140] | `netbeans --userdir "${XDG_CONFIG_HOME}"/netbeans`
Node.js | `~/.node_repl_history` |  |  | `export NODE_REPL_HISTORY="$XDG_DATA_HOME"/node_repl_history` [141]
notmuch | `~/.notmuch-config` |  | [142] | `export NOTMUCH_CONFIG="$XDG_CONFIG_HOME"/notmuch/notmuchrc`, `export NMBGIT="$XDG_DATA_HOME"/notmuch/nmbug`
npm | `~/.npm`, `~/.npmrc` |  | [143] | `export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc`
    npmrc
    prefix=${XDG_DATA_HOME}/npm
    cache=${XDG_CACHE_HOME}/npm
    tmp=${XDG_RUNTIME_DIR}/npm
    init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js
`prefix` is unnecessary (and unsupported) if Node.js is installed by nvmAUR. If you want to configure this system-wide, the file to edit is `/usr/etc/npmrc`, not `/etc/npmrc`. You can confirm that the config is loaded by running `npm config list`
opam | `~/.opam` |  | [144] | `export OPAMROOT="$XDG_DATA_HOME/opam"` Both configuration and state data are stored in `OPAMROOT`, so this solution is not fully compliant.
pnpmAUR | `~/.pnpm-store` |  |  | Add the line `store-dir=${XDG_DATA_HOME}/pnpm-store` to your `npmrc`.
nuget | `~/.nuget/packages` |  | [145] | `export NUGET_PACKAGES="$XDG_CACHE_HOME"/NuGetPackages`
NVIDIA | `~/.nv` |  |  | Uses `XDG_CACHE_HOME` if set, otherwise improperly falls back to `~/.nv` instead of `~/.cache`.
nvidia-settings | `~/.nvidia-settings-rc` |  |  | `nvidia-settings --config="$XDG_CONFIG_HOME"/nvidia/settings`
nvmAUR | `~/.nvm` |  |  | `export NVM_DIR="$XDG_DATA_HOME"/nvm`
Octave | `~/octave`, `~/.octave_packages`, `~/.octave_hist` |  |  | `export OCTAVE_HISTFILE="$XDG_CACHE_HOME/octave-hsts"`, `export OCTAVE_SITE_INITFILE="$XDG_CONFIG_HOME/octave/octaverc"`
    $XDG_CONFIG_HOME/octave/octaverc
    source /usr/share/octave/site/m/startup/octaverc;
    pkg prefix ~/.local/share/octave/packages ~/.local/share/octave/packages;
    pkg local_list /home/<your username>/.local/share/octave/octave_packages;
The `local_list` option must be given an absolute path.
openscad | `~/.OpenSCAD` | 7c3077b0f | [146] | Does not fully honour XDG Base Directory Specification, see [147] Currently it hard-codes `~/.local/share`.
OpenSSL | `~/.rnd` |  |  | Seeding file `.rnd`'s location can be set with `RANDFILE` environment variable per FAQ.
parallel | `~/.parallel` | 20170422 |  | `export PARALLEL_HOME="$XDG_CONFIG_HOME"/parallel`
pass | `~/.password-store` |  |  | `export PASSWORD_STORE_DIR="$XDG_DATA_HOME"/pass`
Pidgin | `~/.purple` |  | [148] | `pidgin --config="$XDG_DATA_HOME"/purple`
PostgreSQL | `~/.psqlrc`, `~/.psql_history`, `~/.pgpass`, `~/.pg_service.conf` | 9.2 | [149] [150] | `export PSQLRC="$XDG_CONFIG_HOME/pg/psqlrc"`, `export PSQL_HISTORY="$XDG_CACHE_HOME/pg/psql_history"`, `export PGPASSFILE="$XDG_CONFIG_HOME/pg/pgpass"`, `export PGSERVICEFILE="$XDG_CONFIG_HOME/pg/pg_service.conf"` It is required to create both directories: `mkdir "$XDG_CONFIG_HOME/pg" && mkdir "$XDG_CACHE_HOME/pg"`
PulseAudio | `~/.esd_auth` |  |  | Very likely generated by the `module-esound-protocol-unix.so` module. It can be configured to use a different location but it makes much more sense to just comment out this module in `/etc/pulse/default.pa` or `"$XDG_CONFIG_HOME"/pulse/default.pa`.
python-azure-cliAUR | `~/.azure` |  |  | `export AZURE_CONFIG_DIR=$XDG_DATA_HOME/azure`
python-gripAUR | `~/.grip` |  |  | `export GRIPHOME="$XDG_CONFIG_HOME/grip"`
python-setuptools | `~/.python-eggs` |  |  | `export PYTHON_EGG_CACHE="$XDG_CACHE_HOME"/python-eggs`
python-pylint | `~/.pylint.d` |  | won't fix | `export PYLINTHOME="$XDG_CACHE_HOME"/pylint`
racket | `~/.racketrc`, `~/.racket` |  | [151] | `export PLTUSERHOME="$XDG_DATA_HOME"/racket`
readline | `~/.inputrc` |  |  | `export INPUTRC="$XDG_CONFIG_HOME"/readline/inputrc`
recoll | `~/.recoll` |  |  | `export RECOLL_CONFDIR="$XDG_CONFIG_HOME/recoll"`
redis | `~/.rediscli_history`, `~/.redisclirc` |  |  | `export REDISCLI_HISTFILE="$XDG_DATA_HOME"/redis/rediscli_history`, `export REDISCLI_RCFILE="$XDG_CONFIG_HOME"/redis/redisclirc`
rlwrap | `~/.*_history` |  | [152] | `export RLWRAP_HOME="$XDG_DATA_HOME"/rlwrap`
Ruby#RubyGems | `~/.gem` |  |  | `export GEM_HOME="$XDG_DATA_HOME"/gem`, `export GEM_SPEC_CACHE="$XDG_CACHE_HOME"/gem` Make sure to remove `gem: --user-install` from `/etc/gemrc`
Rust#Rustup | `~/.rustup` |  | [153] | `export RUSTUP_HOME="$XDG_DATA_HOME"/rustup`
sbt | `~/.sbt` `~/.ivy2` |  | [154] | `sbt -ivy "$XDG_DATA_HOME"/ivy2 -sbt-dir "$XDG_DATA_HOME"/sbt` (beware [155])
SageMath | `~/.sage` |  |  | `export DOT_SAGE="$XDG_CONFIG_HOME"/sage`
GNU Screen | `~/.screenrc` |  |  | `export SCREENRC="$XDG_CONFIG_HOME"/screen/screenrc`
simplescreenrecorder | `~/.ssr/` | 0.4.3 | [156] [157] | Will use `$XDG_CONFIG_HOME/simplescreenrecorder/` ONLY if it already was created otherwise defaults to `~/.ssr` `mv ~/.ssr "$XDG_CONFIG_HOME"/simplescreenrecorder`
spacemacs[dead link 2021-05-17 ⓘ] | `~/.spacemacs`, `~/.spacemacs.d` | [158] | [159] | Move the `~/.spacemacs` file. `export SPACEMACSDIR="$XDG_CONFIG_HOME"/spacemacs`, `mv ~/.spacemacs "$SPACEMACSDIR"/init.el` Other files need to be configured like Emacs.
Haskell#Stack | `~/.stack` |  | [160] | `export STACK_ROOT="$XDG_DATA_HOME"/stack`
subversion | `~/.subversion` |  | [161] [162][163] | `svn --config-dir "$XDG_CONFIG_HOME"/subversion`
sudo | `~/.sudo_as_admin_successful` | 1.9.6 | [164] [165] | Only present when activated at compile-time (default none). An admin_flag parameter can be used in /etc/sudoers since 1.9.6.
task | `~/.task`, `~/.taskrc` |  |  | Fully supported in version 2.6
Local TeX Live TeXmf tree, TeXmf caches and config | `~/texmf`, `~/.texlive/texmf-var`, `~/.texlive/texmf-config` |  |  | `export TEXMFHOME=$XDG_DATA_HOME/texmf`, `export TEXMFVAR=$XDG_CACHE_HOME/texlive/texmf-var`, `export TEXMFCONFIG=$XDG_CONFIG_HOME/texlive/texmf-config`
tiptopAUR | `~/.tiptoprc` |  |  | This will still expect the `.tiptoprc` file. `tiptop -W "$XDG_CONFIG_HOME"/tiptop`
uncrustify | `~/.uncrustify.cfg` |  |  | `export UNCRUSTIFY_CONFIG="$XDG_CONFIG_HOME"/uncrustify/uncrustify.cfg`
Unison | `~/.unison` |  |  | `export UNISON="$XDG_DATA_HOME"/unison`
units | `~/.units_history` |  |  | `units --history "$XDG_CACHE_HOME"/units_history`
urxvtd | `~/.urxvt/urxvtd-hostname` |  |  | `export RXVT_SOCKET="$XDG_RUNTIME_DIR"/urxvtd`
Vagrant | `~/.vagrant.d`, `~/.vagrant.d/aliases` |  | [166] | `export VAGRANT_HOME="$XDG_DATA_HOME"/vagrant`, `export VAGRANT_ALIAS_FILE="$XDG_DATA_HOME"/vagrant/aliases`
virtualenv | `~/.virtualenvs` |  |  | `export WORKON_HOME="$XDG_DATA_HOME/virtualenvs"`
Visual Studio Code | `~/.vscode-oss/` |  | [167] | You can use `export VSCODE_PORTABLE="$XDG_DATA_HOME"/vscode`, which is not documented and might break unexpectedly. Setting this makes the editor look for the contents of `.config/Code - OSS` in `$VSCODE_PORTABLE/user-data`.
WakaTime | `~/.wakatime.cfg`, `~/.wakatime.data`, `~/.wakatime.db`, `~/.wakatime.log` |  |  | `export WAKATIME_HOME="$XDG_CONFIG_HOME/wakatime"` The directory needs to be created manually `mkdir "$XDG_CONFIG_HOME/wakatime"`
wget | `~/.wgetrc`, `~/.wget-hsts` |  |  | `export WGETRC="$XDG_CONFIG_HOME/wgetrc"` and add the following as an alias for wget: `wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"`, or set the `hsts-file` variable with an absolute path as wgetrc does not support environment variables: `echo hsts-file \= "$XDG_CACHE_HOME"/wget-hsts >> "$XDG_CONFIG_HOME/wgetrc"`
wine | `~/.wine` |  | [168] | Winetricks uses XDG-alike location below for WINEPREFIX management: `mkdir -p "$XDG_DATA_HOME"/wineprefixes`, `export WINEPREFIX="$XDG_DATA_HOME"/wineprefixes/default`
xbindkeys | `~/.xbindkeysrc` |  |  | `xbindkeys -f "$XDG_CONFIG_HOME"/xbindkeys/config`
xorg-xauth | `~/.Xauthority` |  |  | `export XAUTHORITY="$XDG_RUNTIME_DIR"/Xauthority` Note that LightDM does not allow you to change this variable. If you change it nonetheless, you will not be able to login. Use startx instead or configure LightDM. According to [169] SLiM has `~/.Xauthority` hardcoded.
xinit | `~/.xinitrc`, `~/.xserverrc` |  | [170] | `export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc`, `export XSERVERRC="$XDG_CONFIG_HOME"/X11/xserverrc` Note that these variables are respected by xinit, but not by startx. Instead, specify the filename as an argument: `startx "$XDG_CONFIG_HOME/X11/xinitrc" -- "$XDG_CONFIG_HOME/X11/xserverrc" vt1`
xorg-xrdb | `~/.Xresources`, `~/.Xdefaults` |  |  | Ultimately you should be using `Xresources` and since these resources are loaded via `xrdb` you can specify a path such as `xrdb -load ~/.config/X11/xresources`.
Xorg | `~/.xsession`, `~/.xsessionrc`, `~/.Xsession`, `~/.xsession-errors` |  |  | These can be added as part of your Xorg init script (`~/.xinitrc`) or Xsession start script (which will often be based on `/etc/X11/Xsession`). Depending on where you have configured your `$XDG_CACHE_HOME`, you made need to expand the paths yourself.
    # xsession start script
    USERXSESSION="$XDG_CACHE_HOME/X11/xsession"
    USERXSESSIONRC="$XDG_CACHE_HOME/X11/xsessionrc"
    ALTUSERXSESSION="$XDG_CACHE_HOME/X11/Xsession"
    ERRFILE="$XDG_CACHE_HOME/X11/xsession-errors"
Unlike most other examples in this table, actual X11 init scripts will vary a lot between installations.
z | `~/.z` |  | [171] | `export _Z_DATA="$XDG_DATA_HOME/z"`
yarn | `~/.yarnrc`, `~/.yarn/`, `~/.yarncache/`, `~/.yarn-config/` | 2d454b5 | [172] [173] | `alias yarn='yarn --use-yarnrc "$XDG_CONFIG_HOME/yarn/config"'`

### Hardcoded

Application | Legacy Path | Discussion | Notes
--- | --- | --- | ---
adb & Android Studio | `~/.android/` | [174] |
alpine | `~/.pinerc`, `~/.addressbook`, `~/.pine-debug[1-4]`, `~/.newsrc`, `~/.mailcap`, `~/.mime.types`, `~/.pine-interrupted-mail` |  | `alias alpine="alpine -p $XDG_CONFIG_HOME/alpine/pinerc"` In the above config file, some locations can be customized using options like `newsrc-path=` and `address-book=`.
Ansible | `~/.ansible` | [175] [176] |
AMule | `~/.aMule` |  |
anthy | `~/.anthy` | [177] |
Apache Directory Studio | `~/.ApacheDirectoryStudio` |  |
ARandR | `~/.screenlayout` |  |
Arduino | `~/.arduino15`, `~/.jssc` | won't fix [178] |
arduino-cli | `~.arduino15/` | [179] | `mv ~/.arduino15 $XDG_CONFIG_HOME/arduino15` Specify the new directories used by Arduino CLI in arduino-cli.yaml as mentioned in the documentation here. `alias arduino-cli='arduino-cli --config-file $XDG_CONFIG_HOME/arduino15/arduino-cli.yaml'`
Audacity | `~/.audacity-data/` | [180] |
Avidemux | `~/.avidemux6` | [181] |
Bash | `~/.bashrc`, `~/.bash_history`, `~/.bash_profile`, `~/.bash_login`, `~/.bash_logout` | won't fix | `mkdir -p "$XDG_DATA_HOME"/bash` `export HISTFILE="$XDG_DATA_HOME"/bash/history` `bashrc` can be sourced from a different location in `/etc/bash.bashrc`. Specify `--init-file <file>` as an alternative to `~/.bashrc` for interactive shells.
Berkshelf | `~/.berkshelf/` |  |
chattyAUR | `~/.chatty/` | [182] |
cmake | `~/.cmake/` |  | Used for the user package registry `~/.cmake/packages/<package>`, detailed in cmake-packages(7) § User Package Registry and the Package registry wiki page. Looks like it's hardcoded, for example in cmFindPackageCommand.cxx.
Cinnamon | `~/.cinnamon/` | [183] |
conanAUR | `~/.conan/` | [184] |
cryptomatorAUR | `~/.Cryptomator` | [185] |
CUPS | `~/.cups/` | won't fix |
darcs | `~/.darcs/` | [186] |
dart | `~/.dart`, `~/.dartServer` | [187] |
dbus | `~/.dbus/` | [188] | Consider using dbus-broker, as it does not create or use this directory.
devede | `~/.devedeng` |  | Hardcoded here
Dia | `~/.dia/` |  |
dotnet-sdk | `~/.dotnet/` | [189] |
dropbox | `~/.dropbox/` |  |
Eclipse | `~/.eclipse/` | [190] | Option `-Dosgi.configuration.area=@user.home/.config/..` overrides but must be added to `"$ECLIPSE_HOME"/eclipse.ini"` rather than command line which means you must have write access to `$ECLIPSE_HOME`. (Arch Linux hard-codes `$ECLIPSE_HOME` in `/usr/bin/eclipse`)
Fetchmail | `~/.fetchmailrc` |  |
Firefox | `~/.mozilla/` | [191] [192] |
Flatpak | `~/.var/` | [193] [194] won't fix |
fltk | `~/.fltk/` | [195] |
freesweep | `~/.sweeprc` | [196] |
gftp | `~/.gftp/` | [197] | Following the XDG spec is planned for gftp.
GHC | `~/.ghc` | [198] |
ghidra |  | [199] |
GoldenDict | `~/.goldendict/` | [200] |
gramps | `~/.gramps/` | [201] |
groovy | `~/.groovy/` |  |
grsync | `~/.grsync/` | [202] |
google-cloud-sdkAUR | `~/.gsutil/` | [203] |
gtk-recordMyDesktop | `~/.gtk-recordmydesktop` |  |
kiteAUR | `~/.kite/` | [204] |
Kubernetes | `~/.kube/` | [205][206] |
hplip | `~/.hplip/` | [207] |
idris | `~/.idris` | [208] |
Java OpenJDK | `~/.java/fonts` | [209] | `export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java`
Java OpenJFX | `~/.java/webview` |  |
jgmenu | `~/.jgmenu-lockfile` | [210] [211] |
julia | `~/.juliarc.jl`, `~/.julia_history`, `~/.julia` | [212] [213] | The trailing `:$JULIA_DEPOT_PATH` is necessary. See [214] `export JULIA_DEPOT_PATH="$XDG_DATA_HOME/julia:$JULIA_DEPOT_PATH"`
kotlin | `~/.kotlinc_history` |  |
Linux PAM | `~/.pam_environment` | [215] | Hardcoded in modules/pam_env/pam_env.c
lldb | `~/.lldb`, `~/.lldbinit` |  |
LMMS | `~/.lmmsrc.xml` | [216] |
mathomatic | `~/.mathomaticrc`, `~/.matho_history` |  | History can be moved by using `rlwrap mathomatic -r` with the `RLWRAP_HOME` environment set appropriately.
Minecraft | `~/.minecraft/` | won't fix |
Minetest | `~/.minetest/` | won't fix [217] |
minicom | `~/.minirc.dfl` |  | Upstream has a TODO entry for supporting configuration files under `~/.config/minicom`. [218]
Mono | `~/.mono/` |  |
mongodb | `~/.mongorc.js`, `~/.dbshell` | [219] | This Stack Overflow thread suggests a partial workaround using command-line switch `--norc`.
Nestopia UE | `~/.nestopia/` | won't fix |
| `~/.netrc` |  | Like `~/.ssh`, many programs expect this file to be here. These include projects like curl (`CURLOPT_NETRC_FILE`), ftp (`NETRC`), s-nail (`NETRC`), etc. While some of them offer alternative configurable locations, many do not such as w3m, wget and lftp.
nmcli | `~/.nmcli-history` |  | Hardcoded to `g_get_home_dir()`[220] [221]
Networkmanager-openvpn | `~/.cert/nm-openvpn` | [222] |
OpenSSH | `~/.ssh` | won't fix | Assumed to be present by many ssh daemons and clients such as DropBear and OpenSSH.
palemoon | `~/.moonchild productions` | [223] |
parsec-binAUR | `~/.parsec` |  |
pcsxrAUR | `~/.pcsxr` |  | A `-cfg` flag exists, but can only be set relative to `~/.pcsxr`.
perf | `~/.debug` |  | Hardcoded in tools/perf/util/config.c:29.
perl | `~/.cpan` |  | Perl5's CPAN expects `~/.cpan`.
portfolio-performance-binAUR | `~/.PortfolioPerformance/` | [224] |
various shells and display managers | `~/.profile` |  |
PuTTY | `~/.putty/` |  | [225]
python | `~/.python_history` | [226] [227] | All history from interactive sessions is saved to `~/.python_history` by default since version 3.4. This can still be customized the same way as in older versions (see this example), including to use a custom path or disable history saving.
python-poetry | `~/.poetry` | [228] | `POETRY_HOME` can be used but it does not separate data and config.
python-tensorflow | `~/.keras` | [229] | The issues is for `tf.keras` module
qmmp | `~/.qmmp` | [230] |
Qt Designer | `~/.designer` |  |
RedNotebook | `~/.rednotebook` |  |
Remarkable | `~/.remarkable` |  |
renderdocAUR | `~/.renderdoc` | won't fix |
Ren'Py | `~/.renpy` | won't fix |
repo | `~/.repoconfig` | [231] |
SANE | `~/.sane/` |  | `scanimage` creates a `.cal` file there
sbcl | `~/.sbclrc` |  |
    /etc/sbclrc
    (require :asdf)
    (setf sb-ext:*userinit-pathname-function*
          (lambda () (uiop:xdg-config-home #P"sbcl/sbclrc")))
Note that this requires root privileges and will change the location of `~/.sbclrc` for all users. This can be mitigated by checking for an existing `~/.sbclrc` inside the `lambda` form.
scribus | `~/.scribus` |  |
SeaMonkey | `~/.mozilla/seamonkey` | [232] |
Snap | `~/snap/` | [233] |
Solfege | `~/.solfege`, `~/.solfegerc`, `~/lessonfiles` | [234] |
SpamAssassin | `~/.spamassassin` |  |
SQLite | `~/.sqlite_history`, `~/.sqliterc` | [235] | `export SQLITE_HISTORY=$XDG_DATA_HOME/sqlite_history`, `sqlite3 -init "$XDG_CONFIG_HOME"/sqlite3/sqliterc`
Steam | `~/.steam`, `~/.steampath`, `~/.steampid` | [236] | Many game engines (Unity 3D, Unreal) follow the specification, but then individual game publishers hardcode the paths in Steam Auto-Cloud causing game-saves to sync to the wrong directory.
TeamSpeak | `~/.ts3client` |  | `export TS3_CONFIG_DIR="$XDG_CONFIG_HOME/ts3client"`
terraform | `~/.terraform.d/` | [237] |
texinfo | `~/.infokey` |  | `info --init-file "$XDG_CONFIG_HOME/infokey"`
TeXmacs | `~/.TeXmacs` |  |
Thunderbird | `~/.thunderbird/` | [238] |
TigerVNC | `~/.vnc` | [239] |
tllocalmgr | `~/.texlive` |  |
valeAUR | `~/.vale.ini` | won't fix | `vale --config "$XDG_CONFIG_HOME/vale/config.ini"`
vim | `~/.vim`, `~/.vimrc`, `~/.viminfo` | [240] | Since 7.3.1178 vim will search for `~/.vim/vimrc` if `~/.vimrc` is not found.
    "$XDG_CONFIG_HOME"/vim/vimrc
    set runtimepath^=$XDG_CONFIG_HOME/vim
    set runtimepath+=$XDG_DATA_HOME/vim
    set runtimepath+=$XDG_CONFIG_HOME/vim/after

    set packpath^=$XDG_DATA_HOME/vim,$XDG_CONFIG_HOME/vim
    set packpath+=$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/after

    let g:netrw_home = $XDG_DATA_HOME."/vim"
    call mkdir($XDG_DATA_HOME."/vim/spell", 'p')
    set viewdir=$XDG_DATA_HOME/vim/view | call mkdir(&viewdir, 'p')

    set backupdir=$XDG_CACHE_HOME/vim/backup | call mkdir(&backupdir, 'p')
    set directory=$XDG_CACHE_HOME/vim/swap   | call mkdir(&directory, 'p')
    set undodir=$XDG_CACHE_HOME/vim/undo     | call mkdir(&undodir,   'p')

    if !has('nvim') | set viminfofile=$XDG_CACHE_HOME/vim/viminfo | endif
    ~/.profile
    export VIMINIT='source "$XDG_CONFIG_HOME/vim/vimrc"'
`VIMINIT` environment variable will also affect Neovim. If separate configs for Vim and Neovim are desired then the following will be a better choice:
    export VIMINIT='let $MYVIMRC = !has("nvim") ? "$XDG_CONFIG_HOME/vim/vimrc" : "$XDG_CONFIG_HOME/nvim/init.vim" | so $MYVIMRC'
https://tlvince.com/vim-respect-xdg https://blog.joren.ga/tools/vim-xdg
vimperator | `~/.vimperatorrc` | [241] | `export VIMPERATOR_INIT=":source $XDG_CONFIG_HOME/vimperator/vimperatorrc"` `export VIMPERATOR_RUNTIME="$XDG_CONFIG_HOME"/vimperator`
visidataAUR | `~/.visidata` | [242] |
w3m | `~/.w3m` | [243] [244] |
wpa_cli | `~/.wpa_cli_history` |  |
x2goclient | `~/.x2goclient` |  | `alias x2goclient="x2goclient --home=$HOME/.config"`
xdg-utils | `~/.gnome` | [245] [246] [247] | For some reason the script `xdg-desktop-menu` hard-codes `gnome_user_dir="$HOME/.gnome/apps"`. This is used by chromium among others. Bug discussion has moved to gitlab and PR with fix exists, however it is not merged yet.
xombrero | `~/.xombrero` | [248][dead link 2021-05-17 ⓘ] |
xournalpp | `~/.xournalpp` | [249] | XDG will be honored in the next version [250]
xpdf | `~/.xpdfrc` |  |
YARD | `~/.yard` | [251] | Would accept Pull Request if anyone want to implement it.
zenmap nmap | `~/.zenmap` | [252] [253] |
zoomAUR | `~/.zoom` |  | `export SSB_HOME="$XDG_DATA_HOME"/zoom`
zoteroAUR | `~/.zotero` `~/Zotero` | [254] |
zsh | `~/.zshrc`, `~/.zprofile`, `~/.zshenv`, `~/.zlogin`, `~/.zlogout`, `~/.histfile`, `~/.zcompdump`, `~/.zcompcache` | [255] | Consider exporting `ZDOTDIR=$HOME/.config/zsh` in `~/.zshenv` (this is hardcoded due to the bootstrap problem). You could also add this to `/etc/zsh/zshenv` and avoid the need for any dotfiles in your `HOME`. Doing this however requires root privilege which may not be viable and is system-wide. `export HISTFILE="$XDG_STATE_HOME"/zsh/history` `compinit -d $XDG_CACHE_HOME/zsh/zcompdump-$ZSH_VERSION` [256] /!\ The folder needs to exist `zstyle ':completion:*' cache-path $XDG_CACHE_HOME/zsh/zcompcache`

## Libraries

C
  libXDGdirs
  C99: Cloudef's simple implementation.

C++
  xdg-utils-cxx
  xdgpp

Go
  go-appdir

Haskell
  Officially in directory since 1.2.3.0 ab9d0810ce.
  xdg-basedir

JVM
  Java, Kotlin, Clojure, Scala, ...
  directories-jvm

Perl
  File-BaseDir

Python
  pyxdg

Ruby
  rubyworks/xdg

Rust
  directories-rs
  rust-xdg

Vala
  Builtin support via GLib.Environment.
  See `get_user_cache_dir`, `get_user_data_dir`, `get_user_config_dir`, etc.

## See also

- GNOME Goal: XDG Base Directory Specification Usage
- Rob Pike: "Dotfiles" being hidden is a UNIXv2 mistake.
- systemd-path(1)
- file-hierarchy(7)
- Grawity's notes on dotfiles.
- Grawity's notes on environment variables.
- ploum.net: Modify Your Application to use XDG Folders.
- The PCGamingWiki attempts to document whether or not Linux PC games follow the XDG Base Directory Specification.

Categories:

- Freedesktop.org
- Configuration files
- Development

Hidden categories:

- Pages with broken package links
- Pages with dead links