XDG Base Directory
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.
 
- Where user-specific configurations should be written (analogous to 
- 
XDG_CACHE_HOME- Where user-specific non-essential (cached) data should be written (analogous to /var/cache).
- Should default to $HOME/.cache.
 
- Where user-specific non-essential (cached) data should be written (analogous to 
- 
XDG_DATA_HOME- Where user-specific data files should be written (analogous to /usr/share).
- Should default to $HOME/.local/share.
 
- Where user-specific data files should be written (analogous to 
- 
XDG_STATE_HOME- Where user-specific state files should be written (analogous to /var/lib).
- Should default to $HOME/.local/state.
 
- Where user-specific state files should be written (analogous to 
- 
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 toPATH).
- Should default to /usr/local/share:/usr/share.
 
- List of directories separated by 
- 
XDG_CONFIG_DIRS- List of directories separated by :(analogous toPATH).
- Should default to /etc/xdg.
 
- List of directories separated by 
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] | 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 does not 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 | |
| antimicroxAUR | ~/.antimicro,~/.antimicrox | edba864 | [2] | |
| apvlvAUR | ~/.apvlvrc | [3] | [4] | Uses XDG_CONFIG_HOME/apvlv/apvlvrcnow if it exist. | 
| aria2 | ~/.aria2 | 8bc1d37 | [5] | 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 ⓘ] | [6][dead link 2021-05-17 ⓘ] | Uses XDG_CONFIG_HOME/asunder/asunderfor~/.asunderandXDG_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 | [7] | XDG_CONFIG_HOME/binwalk | 
| Blender | ~/.blender | 4293f47 | [8] | |
| byobu | ~/.byobu | 4.17 | [9] | 
 Legacy path takes precedence if present, or if  | 
| calcurse | ~/.calcurse | 04162d | [10] [11] | XDG_CONFIG_HOME/calcurse XDG_DATA_HOME/calcurse If the legacy path  | 
| calibre | ||||
| ccache | ~/.ccache | 4.0 | [12] | XDG_CACHE_HOME/ccache XDG_CONFIG_HOME/ccache/ccache.conf | 
| citra-gitAUR | ~/.citra-emu | f7c3193 | [13] | |
| clangd | ~/.clangd | fdf7dcc | [14] | XDG_CONFIG_HOME/clangd/config.yml
 Project specific configuration can be specified in  | 
| Composer | ~/.composer | 1.0.0-beta1 | [15] | |
| cURL | ~/.curlrc | 7.73.0 | [16] | XDG_CONFIG_HOME/.curlrc | 
| d-feet | ~/.d-feet | 7f6104b | ||
| dconf | ||||
| Dolphin emulator | ~/.dolphin-emu | a498c68 | [17] | |
| dr14_tmeterAUR | 7e777ca | [18] | XDG_CONFIG_HOME/dr14tmeter/ | |
| dunst | 78b6e2b | [19] | ||
| Emacs | ~/.emacs~/.emacs.d/init.el | [20] | XDG_CONFIG_HOME/emacs/init.elLegacy paths have precedence over XDG paths.  Emacs will never create  | |
| fish | ||||
| fontconfig | ~/.fontconfig~/.fonts | 8c255fb, [21] | Use XDG_DATA_HOME/fontsto store fonts instead. | |
| fontforge | ~/.FontForge~/.PfaEdit | e4c2cc7 | ||
| freerdp | ~/.freerdp | edf6e72 | ||
| Gajim | ~/.gajim | 3e777ea | [24] | |
| gconfAUR | ~/.gconf | fc28caa | [25] | |
| ghc | ~/.ghci | [26] | [27] | Supported upstream from 9.4.1 [28], but as of 2022-04-18 Arch package is 9.0.2 and not yet up-to-date. | 
| GDB | ~/.gdbinit,~/.gdb_history | 11.1 | XDG_CONFIG_HOME/gdb/gdbinit,export GDBHISTFILE="$XDG_DATA_HOME"/gdb/history | |
| GIMP | ~/.gimp-x.y~/.thumbnails | |||
| Git | ~/.gitconfig | 0d94427 | XDG_CONFIG_HOME/git/config | |
| gops | 71c4255 | |||
| gnuplot | ~/.gnuplot_history | a5562b1 | ||
| goobookAUR | ~/.goobookrc | 3.5 | [32] | XDG_CONFIG_HOME/goobookrc | 
| Godot Engine | ~/.godot | 73049d1 | [33] | |
| GStreamer | ~/.gstreamer-0.10 | 4e36f93 | [34] | |
| GTK 3 | ||||
| helm | ~/.helm | 3.0.0 | ||
| htop | ~/.htoprc | 93233a6 | ||
| httpie | ~/.httpie | 5af0874 | [35] | |
| i3 | ~/.i3 | 7c130fb | ||
| i3blocks, i3blocks-gitAUR | [36] | |||
| i3-gaps | [37] | |||
| i3status | ~/.i3status.conf | c3f7fc4 | ||
| i3status-rust | ||||
| imagemagick | ||||
| Inkscape | ~/.inkscape | 0.47 | [38] | |
| ipython | ~/.ipython | 8.0.0 | [39] | The default dotfile path is still $HOME but xdg directories (or ~/.config/ipython if XDG_* vars are unset) are supported and work correctly. | 
| iwd / iwctl | ~/.iwctl_history | d3e00d7f | ||
| intellij-idea-community-edition / intellij-idea-ultimate-editionAUR | ~/.IntelliJIdeaXXXX.X | 2020.1 | [40] | XDG_CONFIG_HOME/JetBrains/IntelliJIdeaXXXX.X XDG_DATA_HOME/JetBrains/IntelliJIdeaXXXX.X XDG_CACHE_HOME/JetBrains/IntelliJIdeaXXXX.X | 
| josm | ~/.josm | 11162 | [41] | |
| Kakoune | ||||
| less | ~/.lesshst,~/.lesskey | 590 full support in 600 | [42] | The environment variables XDG_CONFIG_HOMEandXDG_DATA_HOMEmust be set in version 590. This is no longer necessary when version 600 lands. | 
| latexmk (in texlive-core) | ~/.latexmkrc | 
 | ||
| lftp | ~/.lftp | 21dc400 | [43] | |
| lgogdownloaderAUR | ~/.gogdownloader | d430af6 | [44] | |
| LibreOffice | [45] | |||
| luarocks | ~/.luarocks | cd16cdd | [46] | XDG_CONFIG_HOME/luarocks XDG_CACHE_HOME/luarocks If the legacy path  | 
| NSS | ~/.pki | 3.42 | [47] | |
| Streamlink | ~/.livestreamerrc | ea80591 | [48] | |
| mc | ~/.mc | [49] | ||
| Mercurial | ~/.hgrc | 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 | [50] | |
| mozc | ~/.mozc | 91cc1e1 | [51] | |
| mpd | ~/.mpdconf | 87b7328 | ||
| mpv | ~/.mpv | cb250d4 | [52] | |
| mutt | ~/.mutt | b17cd67 | [53] | |
| mypaint | ~/.mypaint | cf723b7 | ||
| nano | ~/.nano/~/.nanorc | c16e79b | [54] | |
| ncmpcpp | ~/.ncmpcpp | ncmpcpp_directoryshould be set to avoid anerror.logfile in~/.ncmpcpp. | ||
| Neovim | ~/.nvim~/.nvimlog~/.nviminfo | 1ca5646 | ||
| Nestopia UE | ~/.nestopia/ | 610c008 1.51.0 | [59] | |
| newsbeuter | ~/.newsbeuter | 3c57824 | [60] | It is required to create both directories [61]: 
 | 
| node-gyp | ~/.node-gyp | 2b5ce52a | [62] | |
| np2kai-gitAUR | ~/.config/np2kai~/.config/xnp2kai | 56a1cc2 | [63] | |
| notmuch | ~/.notmuch-config | [64] | mkdir -p $XDG_CONFIG_HOME/notmuch/default; mv ~/.notmuch-config $XDG_CONFIG_HOME/notmuch/default/config | |
| nteract-binAUR | 4593e72 | [65] [66] | does not recognize workarounds for ipython/jupyter | |
| OfflineIMAP | ~/.offlineimaprc | 5150de5 | [67] | |
| opentyrianAUR | ~/.opentyrian | 39559c3 | [68] | |
| pandoc | ~/.pandoc/ | 0bed0ab | [69] | |
| PCManFM | ~/.thumbnails | 1.3.2 | ||
| pcsx2 | ~/.pcsx2 | [70] [71] | ||
| Pry | ~/.pryrc~/.pry_history | [72] | ||
| python-pylint | ~/.pylint.d | 2.10 | [73] | Formerly export PYLINTHOME="$XDG_CACHE_HOME"/pylint | 
| python-pip | ~/.pip | 6.0 | [74] | |
| python-poetry | ~/.poetry | [75] | [76] | Still creates ~/.poetryaccording to [77] | 
| powershellAUR | 6.0 | |||
| ppsspp | ~/.ppsspp | 132fe47 | [78] | |
| procps-ng | ~/.toprc | af53e17 | ||
| pacman | ~/.makepkg.conf | 80eca94 | [81] | |
| panda3dAUR | ~/.panda3d | 2b537d2 | ||
| poezioAUR | ||||
| PulseAudio | ~/.pulse~/.pulse-cookie | [82] | ||
| pyroomAUR | ||||
| quodlibet | ~/.quodlibet | 3.10.0 | [83] | |
| qutebrowser | ||||
| qtile | [84] | Some optional bar widgets can create files and directories in non-compliant paths, but most often these are still configurable. | ||
| rclone | ~/.rclone.conf | 9d36258 | [85] | |
| retroarch | ||||
| rrAUR | ~/.rr | 02e7d41 | [86] | |
| RSpec | ~/.rspec | 5e395e2 | [87] | |
| rTorrent | ~/.rtorrent.rc | 6a8d332 | ||
| RuboCop | ~/.rubocop.yml | 6fe5956 | [88] | |
| sandboxd | ~/.sandboxrc | [89] | [90] | XDG_CONFIG_HOME/sandboxd/sandboxrc | 
| scribus | ~/.scribus | 1.5.3 | ||
| scummvm | ~/.scummvmrc~/.scummvm/ | 7d014be | [91] | It is required to migrate data by hand. 
 | 
| sdcv | ~/.stardict/~/.sdcv_history | 958ec35 | [92] | |
| skypeforlinux-stable-binAUR | ~/.Skype | 8.0 | ||
| snes9x | ~/.snes9x | 93b5f11 | [93] | 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 | [94] | |
| sublime-text-devAUR | build 4105 | Prior to build 4105, the cache was placed in XDG_CONFIG_HOME/sublime-text-3/Cache. | ||
| surfraw | ~/.surfraw.conf~/.surfraw.bookmarks | |||
| sway | ~/.sway/config | 614393c | [95] | XDG_CONFIG_HOME/sway/config | 
| sxhkd | ||||
| systemd | ||||
| teeworlds | ~/.teeworlds | [96] | ||
| termite | ||||
| tig | ~/.tigrc,~/.tig_history | 2.2 | [97] | ~/.local/share/tigdirectory must exist, writes to~/.tig_historyotherwise. | 
| tmux | ~/.tmux.conf | 3.1 | [98] | 3.1 introduced ~/.config/tmux/tmux.confand in 3.2XDG_CONFIG_HOME/tmux/tmux.confwas added | 
| tmuxp | ~/.tmuxp | 1.5.0 | [99] | Fixed in 1.5.2 | 
| tmuxinatorAUR | ~/.tmuxinator | 2636923 | [100] | |
| Transmission | ~/.transmission | b71a298 | ||
| util-linux | 570b321 | |||
| Uzbl | c6fd63a | [101] | ||
| vimb | ||||
| VirtualBox | ~/.VirtualBox | 4.3 | [102] | |
| vis | ~/.vis | [103] | ||
| VLC | ~/.vlcrc | 16f32e1 | [104] | |
| warsow | ~/.warsow-2.x | 98ece3f | [105] | |
| WeeChat | ~/.weechat | [106] | [107] [108] | XDG_CONFIG_HOME/weechat XDG_CACHE_HOME/weechat XDG_DATA_HOME/weechat | 
| Wireshark | ~/.wireshark | b0b53fa | ||
| wxWidgets | [109] | |||
| Xsettingsd | ~/.xsettingsd | b4999f5 | ||
| xmobar | ~/.xmobarrc | 7b0d6bf | [110] | XDG_CONFIG_HOME/xmobar/xmobarrc | 
| xmonad | ~/.xmonad/ | 40fc10b | All of these must exist, otherwise it gives up and falls back to ~/.xmonad/for each:XDG_CACHE_HOME/xmonad XDG_CONFIG_HOME/xmonad XDG_DATA_HOME/xmonad Alternatively, it always respects  | |
| xournalpp | ~/.xournalpp | |||
| xsel | ~/.xsel.log | ee7b481 | [116] | |
| Zim | e42b8b0 | |||
| zoxide | ~/.zo | 0.3.0 | [117] | 
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 | [118] | export CONDARC="$XDG_CONFIG_HOME/conda/condarc" | |
| ack | ~/.ackrc | [119] | export ACKRC="$XDG_CONFIG_HOME/ack/ackrc" | |
| Anki | ~/Anki,~/Documents/Anki | [120] [121] | anki -b "$XDG_DATA_HOME"/Anki | |
| asdf-vmAUR | ~/.asdfrc,~/.asdf/ | [122] | export ASDF_CONFIG_FILE="${XDG_CONFIG_HOME}/asdf/asdfrc",export ASDF_DATA_DIR=${XDG_DATA_HOME}/asdf" | |
| aspell | ~/.aspell.conf | [123] | 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 | [124] | export ATOM_HOME="$XDG_DATA_HOME"/atom | |
| aws-cli | ~/.aws | 1.7.45 | [125] | 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 | ||
| bashdbAUR | ~/.bashdbinit, ~/.bashdb_hist | Like documented at [126], you can specify a file to run commands from. Thus, move the init file to XDG_CONFIG_HOME/bashdb/bashdbinitand create an aliasalias bashdb='bashdb -x ${XDG_CONFIG_HOME:-$HOME/.config}/bashdb/bashdbinit'. Unfortunately the history file is hardcoded [127]. | ||
| bazaar | ~/.bazaar,~/.bzr.log | 2.3.0 | [128] | Discussion in upstream bug states that bazaar will use ~/.config/bazaarif it exists. The logfile~/.bzr.logmight still be written. | 
| btpd-gitAUR | ~/.btpd/ | [129] | btpd -d "$XDG_DATA_HOME"/.btpd
 | |
| Ruby#Bundler | ~/.bundle | 2.1.0 | [130] [131] [132] | 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/ | [133] | 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. | |
| calc | ~/.calc_history | export CALCHISTFILE="$XDG_CACHE_HOME"/calc_history | ||
| Rust#Cargo | ~/.cargo | [134] [135] [136] [137] | export CARGO_HOME="$XDG_DATA_HOME"/cargo | |
| cd-bookmark | ~/.cdbookmark | [138] | export CD_BOOKMARK_FILE=$XDG_CONFIG_HOME/cd-bookmark/bookmarksor use the fork that has native XDG support: [139] | |
| cgdb | ~/.cgdb | [On master branch, but no release yet] | [140] [141] | Set export CGDB_DIR=$XDG_CONFIG_HOME/cgdband move the config file toXDG_CONFIG_HOME/cgdb/cgdbrc | 
| chez-schemeAUR | ~/.chezscheme_history | petite --eehistory "$XDG_DATA_HOME"/chezscheme/history | ||
| Chromium | ~/.chromium,~/.pki | 23057 | ||
| cinelerra | ~/.bcast5 | [145] | export CIN_CONFIG="$XDG_CONFIG_HOME"/bcast5 | |
| conky | ~/.conkyrc | 00481ee | [146] | conky --config="$XDG_CONFIG_HOME"/conky/conkyrc | 
| claws-mail | ~/.claws-mail | [147] | 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: 
 | ||
| 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  | ||
| 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 | [148] | 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 | [149] [150] | 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 | ||
| fceux | ~/.fceux/ | [151] | export FCEUX_HOME="$XDG_CONFIG_HOME"/fceux. Fceux will create.fceuxdirectory inside$FCEUX_HOME. | |
| FFmpeg | ~/.ffmpeg | export FFMPEG_DATADIR="$XDG_CONFIG_HOME"/ffmpeg | ||
| flutterAUR | ~/.flutter,~/.flutter_settings,~/.flutter_tool_state | [152] | ||
| fzf-gitAUR | ~/.fzf.bash, ~/.fzf.zsh | [153] | The shell init files will be installed to XDG_CONFIG_HOME/fzfif the installation script is called with--xdgfor example /usr/local/opt/fzf/install --xdg. | |
| emscripten | ~/.emscripten,~/.emscripten_sanity,~/.emscripten_ports,~/.emscripten_cache__last_clear | [154] | 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 | [155] | freecad -u "$XDG_CONFIG_HOME"/FreeCAD/user.cfg -s "$XDG_CONFIG_HOME"/FreeCAD/system.cfgDespite these options, freecad will still create the file  | |
| 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" | ||
| ghcup-hs-binAUR | ~/.ghcup | [156] | [157] | export GHCUP_USE_XDG_DIRS=trueThe environment variable  | 
| glivAUR | ~/.glivrc | gliv --glivrc="$XDG_CONFIG_HOME"/gliv/glivrc | ||
| gnuradio | ~/.gnuradio | [159] | ||
| GnuPG | ~/.gnupg | [160] [161] | export GNUPGHOME="$XDG_DATA_HOME"/gnupg,gpg2 --homedir "$XDG_DATA_HOME"/gnupgNote 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  | |
| Go | ~/go | [162] | export GOPATH="$XDG_DATA_HOME"/go | |
| Google Earth | ~/.googleearth | Some paths can be changed with the KMLPathandCachePathoptions 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_DIRsets the download folder.GPODDER_HOME- where config and database files are stored, downloads also ifGPODDER_DOWNLOAD_DIRis 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 | [163] | 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 | [164] | export LEDGER_FILE="$XDG_DATA_HOME"/hledger.journal | |
| Houdini | ~/houdiniMAJOR.MINOR) | [165] | export HOUDINI_USER_PREF_DIR="$XDG_CACHE_HOME"/houdini__HVER__The value of this variable must include the substring  | |
| imapfilterAUR | ~/.imapfilter | export IMAPFILTER_HOME="$XDG_CONFIG_HOME/imapfilter" | ||
| IPFS | ~/.ipfs | export IPFS_PATH="$XDG_DATA_HOME"/ipfs | ||
| 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 | [167] | irssi --config="$XDG_CONFIG_HOME"/irssi/config --home="$XDG_DATA_HOME"/irssi | |
| isync | ~/.mbsyncrc | [168] | mbsync -c "$XDG_CONFIG_HOME"/isync/mbsyncrc | |
| Java#OpenJDK | ~/.java/.userPrefs | [169] | export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java | |
| jupyter | ~/.jupyter | [170] | export JUPYTER_CONFIG_DIR="$XDG_CONFIG_HOME"/jupyter | |
| k9s | ~/.k9s | 0.20.4 | [171] | export K9SCONFIG="$XDG_CONFIG_HOME"/k9s | 
| KDE | ~/.kde,~/.kde4 | [172] | export KDEHOME="$XDG_CONFIG_HOME"/kde | |
| keychain | ~/.keychain | [173] | [174] | keychain --absolute --dir "$XDG_RUNTIME_DIR"/keychain | 
| kodi | ~/.kodi | [175] | [176] | KODI_DATA=$XDG_DATA_HOME/kodi | 
| kscriptAUR | ~/.kscript | [177] | export KSCRIPT_CACHE_DIR="$XDG_CACHE_HOME"/kscript | |
| ledger | ~/.ledgerrc,~/.pricedb | [178] | ledger --init-file "$XDG_CONFIG_HOME"/ledgerrc | |
| Leiningen | ~/.lein,~/.m2 | export LEIN_HOME="$XDG_DATA_HOME"/leinto change the m2 repo location used by leiningen look here: Leiningen#m2_repo_location | ||
| libdvdcss | ~/.dvdcss | [179] | export DVDCSS_CACHE="$XDG_DATA_HOME"/dvdcss | |
| libice | ~/.ICEauthority | [180] | export ICEAUTHORITY="$XDG_CACHE_HOME"/ICEauthorityMake sure  Do not use  | |
| 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 | ||
| lynx | /etc/lynx.cfg | export LYNX_CFG_PATH="$XDG_CONFIG_HOME"/lynx.cfg | ||
| maptool-binAUR | ~/.maptool-rptools | [181] | /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 | [182] | mvn -gs "$XDG_CONFIG_HOME"/maven/settings.xmland 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 | [183] | export MINIKUBE_HOME="$XDG_DATA_HOME"/minikubeCreates a further  | |
| 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 | ||
| mypy | ~/.mypy_cache | export MYPY_CACHE_DIR="$XDG_CACHE_HOME"/mypy | ||
| MySQL | ~/.mysql_history,~/.my.cnf ,~/.mylogin.cnf | export MYSQL_HISTFILE="$XDG_DATA_HOME"/mysql_history
 
 | ||
| mysql-workbench | ~/.mysql/workbench | You can run MySQL Workbench with the ---configdirflag, such asmysql-workbench --configdir="$XDG_DATA_HOME/mysql/workbench". The directory needs to be created manually, since MySQL Workbench default location is$HOME/.mysql/workbench. | ||
| ncurses | ~/.terminfo | Precludes system path searching: 
 | ||
| n | /usr/local/n | export N_PREFIX=$XDG_DATA_HOME/n | ||
| ncmpc | ~/.ncmpc | ncmpc -f "$XDG_CONFIG_HOME"/ncmpc/config | ||
| Netbeans | ~/.netbeans | [185] | netbeans --userdir "${XDG_CONFIG_HOME}"/netbeans | |
| Node.js | ~/.node_repl_history | [186] | export NODE_REPL_HISTORY="$XDG_DATA_HOME"/node_repl_history | |
| npm | ~/.npm,~/.npmrc | [187] | export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrcnpmrc 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
 If you want to configure this system-wide, the file to edit is  | |
| opam | ~/.opam | [188] | export OPAMROOT="$XDG_DATA_HOME/opam"Both configuration and state data are stored in  | |
| pnpmAUR | ~/.pnpm-store | Add the line store-dir=${XDG_DATA_HOME}/pnpm-storeto yournpmrc. | ||
| PuTTY | ~/.putty/ | 9952b2d | Will use $XDG_CONFIG_HOME/puttyif it already exists. Creates~/.puttyif not. Prioritises$XDG_CONFIG_HOME/puttyif both exist. Tested in 0.74 | |
| nuget | ~/.nuget/packages | [189] | export NUGET_PACKAGES="$XDG_CACHE_HOME"/NuGetPackages | |
| NVIDIA | ~/.nv | Uses XDG_CACHE_HOMEif set, otherwise improperly falls back to~/.nvinstead 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  | ||
| openscad | ~/.OpenSCAD | 7c3077b0f | [190] | Does not fully honour XDG Base Directory Specification, see [191] Currently it hard-codes  | 
| OpenSSL | ~/.rnd | Seeding file .rnd's location can be set withRANDFILEenvironment 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 | [192] | pidgin --config="$XDG_DATA_HOME"/purple | |
| PostgreSQL | ~/.psqlrc,~/.psql_history,~/.pgpass,~/.pg_service.conf | 9.2 | [193] [194] | export PSQLRC="$XDG_CONFIG_HOME/pg/psqlrc",export PSQL_HISTORY="$XDG_STATE_HOME/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:  | 
| PulseAudio | ~/.esd_auth | Very likely generated by the module-esound-protocol-unix.somodule.  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.paor"$XDG_CONFIG_HOME"/pulse/default.pa. | ||
| pyenv | ~/.pyenv | [195] [196] | export PYENV_ROOT=$XDG_DATA_HOME/pyenv | |
| 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 | ||
| racket | ~/.racketrc,~/.racket | [197] | export PLTUSERHOME="$XDG_DATA_HOME"/racket | |
| rbenvAUR | ~/.rbenv | [198] [199] | export RBENV_ROOT=XDG_DATA_HOME/rbenv | |
| 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 | ||
| ripgrep | [200] | export RIPGREP_CONFIG_PATH=$XDG_CONFIG_HOME/ripgrep/config | ||
| rlwrap | ~/.*_history | [201] | export RLWRAP_HOME="$XDG_DATA_HOME"/rlwrap | |
| Ruby#RubyGems | ~/.gem | export GEM_HOME="$XDG_DATA_HOME"/gem,export GEM_SPEC_CACHE="$XDG_CACHE_HOME"/gemMake sure to remove  | ||
| ruby-solargraphAUR | ~/.solargraph/cache/ | [202] | export SOLARGRAPH_CACHE=$XDG_CACHE_HOME/solargraph | |
| Rust#Rustup | ~/.rustup | [203] | export RUSTUP_HOME="$XDG_DATA_HOME"/rustup | |
| sbt | ~/.sbt
 | [204] | sbt -ivy "$XDG_DATA_HOME"/ivy2 -sbt-dir "$XDG_DATA_HOME"/sbt(beware [205]) | |
| SageMath | ~/.sage | export DOT_SAGE="$XDG_CONFIG_HOME"/sage | ||
| GNU Screen | ~/.screenrc | export SCREENRC="$XDG_CONFIG_HOME"/screen/screenrc | ||
| simplescreenrecorder | ~/.ssr/ | 0.4.3 | [206] | Will use $XDG_CONFIG_HOME/simplescreenrecorder/ONLY if it already was created otherwise defaults to~/.ssr
 | 
| spacemacs | ~/.spacemacs,~/.spacemacs.d | [208] | [209] | Move the ~/.spacemacsfile.
 Other files need to be configured like Emacs. | 
| Haskell#Stack | ~/.stack | [210] | export STACK_ROOT="$XDG_DATA_HOME"/stack | |
| subversion | ~/.subversion | [211] [212][213] | alias svn="svn --config-dir \"$XDG_CONFIG_HOME\"/subversion" | |
| sudo | ~/.sudo_as_admin_successful | 1.9.6 | [214] [215] | 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 (note $XDG_CONFIG_HOME/task/taskrc must exist, otherwise taskwarrior will offer to create sample config in legacy $HOME/.taskrc location, even if $XDG_CONFIG_HOME is set [216][217]) | ||
| 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 | ||
| TeXmacs | ~/.TeXmacs | export TEXMACS_HOME_PATH=$XDG_STATE_HOME/texmacs | ||
| tiptopAUR | ~/.tiptoprc | This will still expect the .tiptoprcfile.
 | ||
| ruby-travisAUR | ~/.travis/ | [218] | export TRAVIS_CONFIG_PATH=$XDG_CONFIG_HOME/travis | |
| 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 | [219] | 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/ | [220] | 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  You can also run Visual Studio with the  | |
| VSCodiumAUR | ~/.vscode-oss/ | [221] [222] | You can run VSCodium with the --extensions-dirflag, such asvscodium --extensions-dir "$XDG_DATA_HOME/vscode". This however won't prevent the creation of~/.vscode-oss/directory. | |
| wakatime | ~/.wakatime.cfg,~/.wakatime.data,~/.wakatime.db,~/.wakatime.log | export WAKATIME_HOME="$XDG_CONFIG_HOME/wakatime"The directory needs to be created manually 
 | ||
| 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 thehsts-filevariable 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 | [223] | Winetricks uses XDG-alike location below for WINEPREFIX management: 
 | |
| xbindkeys | ~/.xbindkeysrc | xbindkeys -f "$XDG_CONFIG_HOME"/xbindkeys/config | ||
| xorg-xauth | ~/.Xauthority | export XAUTHORITY="$XDG_RUNTIME_DIR"/XauthorityNote 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 [224] SLiM has  The SDDM Xauthority path can be changed in its own configuration files as shown below. Unfortunately, it is relative to the home directory. /etc/sddm.conf.d/xauth-path.conf [X11] UserAuthFile=.Xauthority | ||
| xinit | ~/.xinitrc,~/.xserverrc | [225] | export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc,export XSERVERRC="$XDG_CONFIG_HOME"/X11/xserverrcNote that these variables are respected by xinit, but not by startx. Instead, specify the filename as an argument: 
 | |
| xorg-xrdb | ~/.Xresources,~/.Xdefaults | Ultimately you should be using Xresourcesand since these resources are loaded viaxrdbyou can specify a path such asxrdb -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  # 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 | [226] | export _Z_DATA="$XDG_DATA_HOME/z" | |
| yarn | ~/.yarnrc,~/.yarn/,~/.yarncache/,~/.yarn-config/ | 2d454b5 | [227] [228] | alias yarn='yarn --use-yarnrc "$XDG_CONFIG_HOME/yarn/config"' | 
Hardcoded
| Application | Legacy Path | Discussion | Notes | 
|---|---|---|---|
| adb & Android Studio | ~/.android/ | Despite appearances otherwise, adb will always generate ~/.android/adbkeys, though it will try keys inADB_VENDOR_KEYSas well. | |
| aegisub | ~/.aegisub/ | [229] | |
| 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  | |
| Ansible | ~/.ansible | [230] [231] [232] | |
| aMule | ~/.aMule | [233] [234] [235] | |
| anthy | ~/.anthy | [236] | |
| Apache Directory Studio | ~/.ApacheDirectoryStudio | ||
| ARandR | ~/.screenlayout | [237] | |
| Arduino | ~/.arduino15,~/.jssc | won't fix | |
| arduino-cli | ~.arduino15/ | [238] | mv ~/.arduino15 $XDG_CONFIG_HOME/arduino15Specify the new directories used by Arduino CLI in arduino-cli.yaml as mentioned in the documentation here.
 | 
| Audacity | ~/.audacity-data/ | [239] | |
| Avidemux | ~/.avidemux6 | [240] | |
| Bash | ~/.bashrc,~/.bash_history,~/.bash_profile,~/.bash_login,~/.bash_logout | won't fix | mkdir -p "$XDG_STATE_HOME"/bash
 
 | 
| Berkshelf | ~/.berkshelf/ | ||
| chattyAUR | ~/.chatty/ | [241] | |
| cmake | ~/.cmake/ | [242] | 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/ | [243] | |
| conanAUR | ~/.conan/ | [244] | export CONAN_USER_HOME="$XDG_CONFIG_HOME"will set the directory in which.conan/is created. It was designed to simplify CI, but can be used here too. | 
| cryptomatorAUR | ~/.Cryptomator | [245] | |
| ctags (universial-ctags) | ~/.ctagsrc, .ctags.d | [246] | |
| CUPS | ~/.cups/ | [247] | |
| cVim | ~/.cvimrc | [248] | |
| darcs | ~/.darcs/ | [249] | |
| dart | ~/.dart,~/.dartServer | [250] | |
| dbus | ~/.dbus/ | [251] | Consider using dbus-broker, as it does not create or use this directory. | 
| devede | ~/.devedeng | Hardcoded here | |
| Dia | ~/.dia/ | ||
| dotnet-sdk | ~/.dotnet/ | [252] | |
| dropbox | ~/.dropbox/ | ||
| Eclipse | ~/.eclipse/ | [253] | 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_HOMEin/usr/bin/eclipse) | 
| Fetchmail | ~/.fetchmailrc | ||
| Firefox | ~/.mozilla/ | [254] [255] | |
| Flatpak | ~/.var/ | [256] [257] won't fix | |
| fltk | ~/.fltk/ | [258] | |
| freesweep | ~/.sweeprc | [259] | |
| gftp | ~/.gftp/ | [260] | Following the XDG spec is planned for gftp. | 
| ghidra | [261] | ||
| GoldenDict | ~/.goldendict/ | [262] | |
| gramps | ~/.gramps/ | [263] | 2022 Support XDG base directory specification (for next release Gramps 5.2 ) - Patch https://github.com/gramps-project/gramps/pull/1368 | 
| groovy | ~/.groovy/ | ||
| grsync | ~/.grsync/ | [264] | |
| google-cloud-sdkAUR | ~/.gsutil/ | [265] | |
| gtk-recordMyDesktop | ~/.gtk-recordmydesktop | ||
| hplip | ~/.hplip/ | [266] | |
| idris | ~/.idris | [267] | |
| itch-setup-binAUR | ~/.itch | won't fix | You can move the Game install location in the app settings. | 
| lbdbAUR | ~/.lbdbrc, ~/.lbdb/ | [268] | |
| llpp | ~/.config/llpp.conf | [269] | Added in 3ab86f0 but subsequently reverted in e253c9f1 | 
| Java OpenJDK | ~/.java/fonts | [270] | export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java | 
| Java OpenJFX | ~/.java/webview | ||
| jgmenu | ~/.jgmenu-lockfile | [271] [272] | |
| julia | ~/.juliarc.jl,~/.julia_history,~/.julia | [273] [274] | The trailing :$JULIA_DEPOT_PATHis necessary. See [275]
 | 
| kiteAUR | ~/.kite/ | [276] | |
| kotlin | ~/.kotlinc_history | Related Konan issue: [277] | |
| Kubernetes | ~/.kube/ | [278][279] | |
| librewolfAUR | ~/.mozilla
 | [280] | |
| Linux PAM | ~/.pam_environment | [281] | Hardcoded in modules/pam_env/pam_env.c | 
| lldb | ~/.lldb,~/.lldbinit | ||
| LMMS | ~/.lmmsrc.xml | [282] | |
| mathomatic | ~/.mathomaticrc,~/.matho_history | History can be moved by using rlwrap mathomatic -rwith theRLWRAP_HOMEenvironment set appropriately. | |
| Minecraft | ~/.minecraft/ | won't fix | |
| Minetest | ~/.minetest/ | won't fix [283] | |
| minicom | ~/.minirc.dfl | Upstream has a TODO entry for supporting configuration files under ~/.config/minicom. [284] | |
| Mono | ~/.mono/ | [285] | |
| mongodb | ~/.mongorc.js,~/.dbshell | [286] | This Stack Overflow thread suggests a partial workaround using command-line switch --norc. | 
| ~/.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 | [287] | Hardcoded to g_get_home_dir()[288] [289] | 
| Networkmanager-openvpn | ~/.cert/nm-openvpn | [290] | |
| ocaml-utopAUR | ~/.utop-history | [291] | There's an open PR to move ~/.utop-hostoryto$XDG_CACHE_HOME[292] | 
| OpenSSH | ~/.ssh | won't fix | Assumed to be present by many ssh daemons and clients such as DropBear and OpenSSH. | 
| palemoon | ~/.moonchild productions | [293] | |
| parsec-binAUR | ~/.parsec | ||
| pcsxrAUR | ~/.pcsxr | A -cfgflag exists, but can only be set relative to~/.pcsxr. | |
| perf | ~/.debug | Hardcoded in tools/perf/util/config.c. Commit: [294] | |
| perl | ~/.cpan,~/perl5 | [295] | Perl5's CPAN expects ~/.cpan | 
| portfolio-performance-binAUR | ~/.PortfolioPerformance/ | [296] | |
| various shells and display managers | ~/.profile | ||
| psensor | ~/.psensor | [297] | |
| python | ~/.python_history | [298] [299] [300] | All history from interactive sessions is saved to ~/.python_historyby 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-tensorflow | ~/.keras | [301] | The issues is for tf.kerasmodule | 
| qmmp | ~/.qmmp | [302] | |
| Qt Designer | ~/.designer | [303] | |
| RedNotebook | ~/.rednotebook | [304] | |
| Remarkable | ~/.remarkable | ||
| renderdocAUR | ~/.renderdoc | won't fix | |
| Ren'Py | ~/.renpy | won't fix | |
| repo | ~/.repoconfig | [305] | |
| SANE | ~/.sane/ | scanimagecreates a.calfile 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  | |
| SeaMonkey | ~/.mozilla/seamonkey | [306] | |
| Signal Desktop | [307] | Currently keeps messages in ~/.config/Signal | |
| Snap | ~/snap/ | [308] | |
| Solfege | ~/.solfege,~/.solfegerc,~/lessonfiles | [309] | |
| SpamAssassin | ~/.spamassassin | ||
| SQLite | ~/.sqlite_history,~/.sqliterc | [310] | export SQLITE_HISTORY=$XDG_DATA_HOME/sqlite_history,sqlite3 -init "$XDG_CONFIG_HOME"/sqlite3/sqliterc | 
| Steam | ~/.steam,~/.steampath,~/.steampid | [311] | 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/ | [312] | |
| texinfo | ~/.infokey | info --init-file "$XDG_CONFIG_HOME/infokey" | |
| Thunderbird | ~/.thunderbird/ | [313] | |
| TigerVNC | ~/.vnc | [314] | |
| tllocalmgr | ~/.texlive | ||
| urlviewAUR | ~/.urlview | Use fork urlview-xdg-gitAUR instead. The fork will use XDG_CONFIG_HOME/urlview/config | |
| valeAUR | ~/.vale.ini | won't fix | vale --config "$XDG_CONFIG_HOME/vale/config.ini" | 
| vim | ~/.vim,~/.vimrc,~/.viminfo | [315] | Since 7.3.1178 vim will search for ~/.vim/vimrcif~/.vimrcis 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 backupdir=$XDG_STATE_HOME/vim/backup | call mkdir(&backupdir, 'p')
set directory=$XDG_STATE_HOME/vim/swap   | call mkdir(&directory, 'p')
set undodir=$XDG_STATE_HOME/vim/undo     | call mkdir(&undodir,   'p')
set viewdir=$XDG_STATE_HOME/vim/view     | call mkdir(&viewdir,   'p')
if !has('nvim') | set viminfofile=$XDG_STATE_HOME/vim/viminfo | endif
~/.profile export GVIMINIT='let $MYGVIMRC="$XDG_CONFIG_HOME/vim/gvimrc" | source $MYGVIMRC' export VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | source $MYVIMRC' 
 export GVIMINIT='let $MYGVIMRC = !has("nvim") ? "$XDG_CONFIG_HOME/vim/gvimrc" : "$XDG_CONFIG_HOME/nvim/init.gvim" | so $MYGVIMRC'
export VIMINIT='let $MYVIMRC = !has("nvim") ? "$XDG_CONFIG_HOME/vim/vimrc" : "$XDG_CONFIG_HOME/nvim/init.vim" | so $MYVIMRC'
 | 
| vimperator | ~/.vimperatorrc | [316] | export VIMPERATOR_INIT=":source $XDG_CONFIG_HOME/vimperator/vimperatorrc"
 | 
| visidata | ~/.visidata | [317] | |
| w3m | ~/.w3m | [318] [319] | |
| wpa_cli | ~/.wpa_cli_history | ||
| wegoAUR | ~/.wegorc | [320] | |
| x2goclientAUR | ~/.x2goclient | alias x2goclient="x2goclient --home=$HOME/.config" | |
| xdg-utils | ~/.gnome | [321] [322] [323] | For some reason the script xdg-desktop-menuhard-codesgnome_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. | 
| xpdf | ~/.xpdfrc | ||
| xrdpAUR | ~/thinclient_drives,~/.pcsc* | For the directory ~/thinclient_drives, you may consider editing/etc/xrdp/sesman.iniand modifying the section[Chansrv]following the example config. | |
| XVim2 | ~/.xvimrc | [324] | |
| YARD | ~/.yard | [325] | Would accept Pull Request if anyone want to implement it. | 
| zenmap nmap | ~/.zenmap | [326] [327] | |
| zoomAUR | ~/.zoom | Unrecommended: setting the following variable moves the contents of .zoom but the directory itself always gets created. Moreover, it breaks some functionalities eg. being able to start a meeting. export SSB_HOME="$XDG_DATA_HOME"/zoom | |
| zotero-binAUR | ~/.zotero~/Zotero | [328] | |
| zsh | ~/.zshrc,~/.zprofile,~/.zshenv,~/.zlogin,~/.zlogout,~/.histfile,~/.zcompdump,~/.zcompcache | [329] | Consider exporting ZDOTDIR=$HOME/.config/zshin~/.zshenv(this is hardcoded due to the bootstrap problem).  You could also add this to/etc/zsh/zshenvand avoid the need for any dotfiles in yourHOME.  Doing this however requires root privilege which may not be viable and is system-wide.
 
 
 | 
Libraries
- C++
- xdg-utils-cxx
- xdgpp
- Go
- adrg/xdg
- go-appdir (deprecated, archived)
- configdir (deprecated, abandoned)
- kyoh86/xdg (deprecated, archived)
- 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
- bkuhlmann/xdg
- rubyworks/xdg (deprecated, abandoned)
- 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.
