NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #38 most downloaded on PyPI
A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.
Last release today
03 Oct 2026
Ships fairly regularly
a new release about every 3 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
84 releases · first in 2021
One column per quarter.
Place root config and data files in the first site directory by @PDGGK in #607
Place files from place_config_file and place_data_file in the first site directory for root on Unix with use_site_for_root=True and multipath=True , where find_config_file and find_data_file look for them. PR #607
🐛 fix(api): build site paths from site lists by @9Kun in #604
Full Changelog: 4.12.1...4.12.2
Keep os.pathsep in site_applications_path under multipath=True on platforms with one applications directory. PR #604
fix(pytest): allow import before pytest startup by @gaborbernat in #602
Full Changelog: 4.12.0...4.12.1
Avoid PytestAssertRewriteWarning when importing platformdirs before invoking pytest. PR #601
📝 docs(unix): fix site_applications_dir default by @gaborbernat in #594
Full Changelog: 4.11.15...4.12.0
Add place_*_file methods that return a file path under a user directory and create its missing parents with mode 0o700 . PR #585
Add find_<kind>file and find<kind>files to look up an existing file across the user and site directories of each kind that has an iter<kind>_paths method. PR #586
Add platformdirs.testing.isolated_dirs() and the platformdirs_isolated pytest fixture to resolve every directory under one test root. PR #590
Emit RuntimeDirWarning when the Unix user_runtime_dir() falls back from XDG_RUNTIME_DIR . PR #599
Read user_templates_dir , user_publicshare_dir and user_bin_dir on Windows from their known folders. PR #587
Create missing user app directories and their parents with mode 0700 under ensure_exists on POSIX platforms. PR #588
Raise RuntimeError for a Unix or macOS directory under the home when no home resolves, and read the password database for an empty HOME . PR #589
Skip an XDG_RUNTIME_DIR or /run/user/<uid> that is not a private directory of the user, and reject a symlink or file as the runtime-<uid> fallback. PR #599
Use the app container layout on iOS, such as ~/Library/Application Support for data. PR #600
Document that a Homebrew Python puts the Homebrew prefix first in the macOS shared directories, with or without multipath . PR #591
Document that the macOS media directories honor the XDG_*_DIR variables. PR #592
Document the WIN_PD_OVERRIDE_COMMON_PROGRAMS variable. PR #593
Document /usr/local/share/applications as the Linux site_applications_dir default. PR #594
Correct the BSD user_runtime_dir defaults and describe the temporary directory fallback. PR #595
Describe how platformdirs detects Android, finds the app folder and places the shared folders. PR #596
Document that Microsoft Store Python redirects only new files and folders under AppData . PR #597
Show how to load a font on Windows after copying it into user_fonts_dir . PR #598
🐛 fix(android): detect Android builds without ANDROID_* variables by @gaborbernat in #581
Full Changelog: 4.11.14...4.11.15
Fix the pyjnius lookup of the Android app folder and media directories, which always failed. PR #580
Detect Android from sys.getandroidapilevel when ANDROID_DATA and ANDROID_ROOT are unset. PR #581
Put Android shared-storage directories under the current user’s /storage/emulated/<user id>, not user 0’s. PR #582
Move Android videos to Movies and the five non-standard media folders, such as Desktop , into Documents . PR #583
🐛 fix(dirs): only create configured media dirs by @gaborbernat in #561
Full Changelog: 4.11.13...4.11.14
With ensure_exists , create a media directory such as user_documents_dir only when the user set it through an XDG_*_DIR variable or user-dirs.dirs , and return a dangling symlink there instead of raising FileExistsError . 4.11.13 also created the platform defaults, which filled headless home directories with folders such as ~/Templates and made a literal ~ directory when HOME was unset. PR #561
Ignore $XDG_RUNTIME_DIR in user_runtime_dir when use_site_for_root redirects root. PR #562
Return /storage/emulated/0/Download from the Android user_downloads_dir() fallback. PR #563
Ignore WIN_PD_OVERRIDE_* values that lack a drive or a root. PR #564
Find the Android app folder for package names that start with files . PR #565
Reject an appname , appauthor or version that leaves the base directory when set after construction. PR #566
Apply a changed use_site_for_root on the next read. PR #567
Stop raising UnicodeDecodeError on user-dirs.dirs bytes the locale encoding cannot decode. PR #568
Drop a trailing # comment from unquoted user-dirs.dirs values. PR #569
Treat empty Windows folder variables, such as PUBLIC or LOCALAPPDATA , as unset. PR #571
Accept roaming in user_log_dir() and user_log_path() . PR #572
Detect Homebrew Python on macOS by its opt/python*/Frameworks layout. PR #573
Keep colons in the Unix site_cache_path under multipath . PR #574
Return long Windows folder paths in place of 8.3 short names. PR #575
Create the Unix runtime-<uid> temporary fallback with mode 0700 and reject one another user owns. PR #576
Raise RuntimeError in place of creating a literal ~ directory when ensure_exists finds no home. PR #578
Fix the Windows user_preference_dir path in the platform docs. PR #577
Document that the macOS user_state_dir and site_state_dir ignore the XDG_DATA_* variables. PR #579
🐛 fix(dirs): create media dirs when ensure_exists is set by @gaborbernat in #560
Full Changelog: 4.11.12...4.11.13
With ensure_exists , the media directories such as user_documents_dir are created on Unix, and on macOS when an XDG variable sets them - by @ekanshul . PR #560
docs: preserve nested directories in the migration recipe by @agammann in #553
Full Changelog: 4.11.11...4.11.12
Ignore relative paths in the XDG user directory environment variables, so XDG_DOCUMENTS_DIR=Documents no longer makes user_documents_dir() and the other media directories return a path relative to the working directory. They now fall back to the platform default like the XDG Base Directory variables, and like the same keys read from user-dirs.dirs - by @darrenhuai . PR #554
Copy nested directories in the versioned data migration recipe. PR #553
Exclude sphinx-llm 1.1.0 from documentation dependencies because its Markdown builder emits unknown-node warnings. PR #556
fix: reject app arguments that leave the base directory by @Pitchfork-and-Torch in #552
Full Changelog: 4.11.10...4.11.11
Reject appname , appauthor and version values that leave the platform base directory (a .. segment, a leading separator, a drive or a UNC share) with ValueError , so ensure_exists cannot create directories outside it - by @Pitchfork-and-Torch . PR #552
Reject appname, appauthor and version values that leave the platform base directory (a .. segment, a leading separator, a drive or a UNC share) with ValueError, so ensure_exists cannot create directories outside it - by Pitchfork-and-Torch. 552
👷 ci(release): docstrfmt the changelog before committing it by @gaborbernat in #551
Full Changelog: 4.11.9...4.11.10
With ensure_exists , the site_dir and sitepath properties and the iter*_dirs iterators only create the site directories they return or yield, instead of every entry in the site list - by @darrenhuai . PR #550
fix: read user-dirs.dirs as shell assignments, not INI by @darrenhuai in #545
Full Changelog: 4.11.8...4.11.9
Accept multipath in site_cache_dir() and site_cache_path() . Without it, the function API could not return the Homebrew cache prefix that site_cache_dir adds under multipath - by @darrenhuai . PR #544
Parse Unix user-dirs.dirs line by line like xdg-user-dir . The INI parser raised on a repeated key or a line without = , and returned trailing comments and backslash escapes inside user_documents_dir() and the other media directories. The last valid assignment now wins, and platformdirs unescapes the quoted value and ignores text after the closing quote - by @darrenhuai . PR #545
Read PUBLIC before the home directory in user_publicshare_dir() on Windows, so it no longer raises RuntimeError when PUBLIC is set and the home directory cannot be determined - by @emme1t . PR #546
Raise RuntimeError from Android directories when the app folder cannot be found, instead of TypeError: expected str, bytes or os.PathLike object, not NoneType - by @Str0k . PR #547
Accept multipath in ~platformdirs.site_cache_dir and ~platformdirs.site_cache_path. Without it, the function API could not return the Homebrew cache prefix that ~platformdirs.macos.MacOS.site_cache_dir adds under multipath - by darrenhuai. 544
Parse Unix user-dirs.dirs line by line like xdg-user-dir. The INI parser raised on a repeated key or a line without =, and returned trailing comments and backslash escapes inside ~platformdirs.user_documents_dir and the other media directories. The last valid assignment now wins, and platformdirs unescapes the quoted value and ignores text after the closing quote - by darrenhuai. 545
Read PUBLIC before the home directory in ~platformdirs.user_publicshare_dir on Windows, so it no longer raises RuntimeError when PUBLIC is set and the home directory cannot be determined - by emme1t. 546
Raise RuntimeError from ~platformdirs.android.Android directories when the app folder cannot be found, instead of TypeError: expected str, bytes or os.PathLike object, not NoneType - by Str0k. 547
fix: ignore relative XDG base directory paths by @lakshayxi in #540
Full Changelog: 4.11.7...4.11.8
Make user_data_path() , user_config_path() , user_preference_path() and user_applications_path() return the first site entry when root is redirected by use_site_for_root under multipath , matching their site_*_path twins. They passed the whole joined list to Path , giving one unusable path such as /xdg/a/foo:/xdg/b/foo - by @darrenhuai . PR #538
Ignore relative paths in XDG Base Directory environment variables and use the existing platform fallback. Relative entries in $XDG_DATA_DIRS and $XDG_CONFIG_DIRS are skipped. PR #540
Preserve literal percent signs in Unix user-dirs.dirs paths, including 100% complete , 100%% and %(XDG_DESKTOP_DIR)s . Continue to expand $HOME . PR #542
Use the base Python installation to locate Homebrew site directories on macOS, preserving shared data, config, cache and state paths inside virtual environments. PR #543
Make ~platformdirs.user_data_path, ~platformdirs.user_config_path, ~platformdirs.user_preference_path and ~platformdirs.user_applications_path return the first site entry when root is redirected by use_site_for_root under multipath, matching their site_*_path twins. They passed the whole joined list to ~pathlib.Path, giving one unusable path such as /xdg/a/foo:/xdg/b/foo - by darrenhuai. 538
Ignore relative paths in XDG Base Directory environment variables and use the existing platform fallback. Relative entries in $XDG_DATA_DIRS and $XDG_CONFIG_DIRS are skipped. 540
Preserve literal percent signs in Unix user-dirs.dirs paths, including 100% complete, 100%% and %(XDG_DESKTOP_DIR)s. Continue to expand $HOME. 542
Use the base Python installation to locate Homebrew site directories on macOS, preserving shared data, config, cache and state paths inside virtual environments. 543
Full Changelog : 4.11.6...4.11.7
fix: accept use_site_for_root in the bin functions by @darrenhuai in #537
Full Changelog: 4.11.5...4.11.6
Give user_bin_dir() and user_bin_path() the use_site_for_root argument. They took none, so neither could reach the Unix redirect of root to site_bin_dir() . PR #537
Give ~platformdirs.user_bin_dir and ~platformdirs.user_bin_path the use_site_for_root argument. They took none, so neither could reach the Unix redirect of root to ~platformdirs.site_bin_dir. 537
docs: fix the iterator order claim in api.rst by @gaborbernat in #533
Full Changelog: 4.11.4...4.11.5
Give user_preference_dir() and user_preference_path() the same arguments as user_config_dir() . Added without arguments in PR #491 , they could only return the unscoped base directory even though the property they wrap appends the app name and version. PR #531
Make site_applications_path() return the first entry when multipath=True , matching site_data_path() . On Unix and macOS it passed the whole $XDG_DATA_DIRS list to Path , giving one unusable path such as /first/applications:/second/applications . PR #532
Give user_applications_dir() , user_applications_path() , site_applications_dir() and site_applications_path() the app arguments. Android scopes both applications directories to the app, so without them the functions could only return the unscoped base directory there. On the two site functions they are keyword-only, keeping multipath first positional as it has been since 4.9.0; the two user functions take their boolean options keyword-only. PR #534
Correct the ordering note on the iterator methods. use_site_for_root drops the user directory entirely, so the iterators are documented as yielding the most specific directory first rather than always yielding the user one. PR #533
Give ~platformdirs.user_preference_dir and ~platformdirs.user_preference_path the same arguments as ~platformdirs.user_config_dir. Added without arguments in 491, they could only return the unscoped base directory even though the property they wrap appends the app name and version. 531
Make ~platformdirs.site_applications_path return the first entry when multipath=True, matching ~platformdirs.site_data_path. On Unix and macOS it passed the whole $XDG_DATA_DIRS list to ~pathlib.Path, giving one unusable path such as /first/applications:/second/applications. 532
Give ~platformdirs.user_applications_dir, ~platformdirs.user_applications_path, ~platformdirs.site_applications_dir and ~platformdirs.site_applications_path the app arguments. Android scopes both applications directories to the app, so without them the functions could only return the unscoped base directory there. On the two site functions they are keyword-only, keeping multipath first positional as it has been since 4.9.0; the two user functions take their boolean options keyword-only. 534
Correct the ordering note on the iterator methods. use_site_for_root drops the user directory entirely, so the iterators are documented as yielding the most specific directory first rather than always yielding the user one. 533
🔧 chore: batch dependency updates weekly on Tuesday by @gaborbernat in #528
Full Changelog: 4.11.3...4.11.4
Stop the iter_*_dirs methods yielding the same directory twice when a site directory resolves to its user equivalent - PR #520 covered only Unix with use_site_for_root . It also hit iter_runtime_dirs() on Unix with $XDG_RUNTIME_DIR set, on Windows and macOS, and all six iterators on Android. PR #524
Fix the config merging example in the how-to guide. iter_config_paths yields the user directory first, so the config.update loop let the site defaults override the user’s config instead of the other way round. PR #529
📄 docs: publish llms.txt from the docs build by @gaborbernat in #522
Full Changelog: 4.11.2...4.11.3
python -m platformdirs now lists user_desktop_dir() , which was missing from the properties it prints. PR #523
Stop site_data_dir() , site_config_dir() and site_applications_dir() raising IndexError on Unix and macOS when $XDG_DATA_DIRS or $XDG_CONFIG_DIRS holds only separators and whitespace, such as ":" . These values now fall back to the platform defaults, and each entry is stripped of surrounding whitespace. PR #523
python -m platformdirs now lists ~platformdirs.user_desktop_dir, which was missing from the properties it prints. 523
Stop ~platformdirs.site_data_dir, ~platformdirs.site_config_dir and ~platformdirs.site_applications_dir raising IndexError on Unix and macOS when $XDG_DATA_DIRS or $XDG_CONFIG_DIRS holds only separators and whitespace, such as ":". These values now fall back to the platform defaults, and each entry is stripped of surrounding whitespace. 523
fix: stop the remaining iter_*_dirs yielding duplicate or joined paths by @darrenhuai in #520
Full Changelog: 4.11.1...4.11.2
Stop iter_cache_dirs() , iter_state_dirs() , iter_log_dirs() and iter_runtime_dirs() yielding the same directory twice on Unix when use_site_for_root is active - PR #469 fixed this for the config and data iterators only. On macOS, iter_cache_dirs() now yields the Homebrew and /Library/Caches entries separately rather than one os.pathsep -joined string when multipath is set. PR #520
Stop ~platformdirs.PlatformDirs.iter_cache_dirs, ~platformdirs.PlatformDirs.iter_state_dirs, ~platformdirs.PlatformDirs.iter_log_dirs and ~platformdirs.PlatformDirs.iter_runtime_dirs yielding the same directory twice on Unix when use_site_for_root is active - 469 fixed this for the config and data iterators only. On macOS, ~platformdirs.PlatformDirs.iter_cache_dirs now yields the Homebrew and /Library/Caches entries separately rather than one os.pathsep-joined string when multipath is set. 520
Let the non-ctypes resolvers find the desktop folder by @darrenhuai in #519
Full Changelog: 4.11.0...4.11.1
Fix user_desktop_dir() on Windows builds without ctypes . CSIDL_DESKTOPDIRECTORY appeared only in the ctypes lookup table, so the registry and environment variable resolvers raised ValueError for it. PR #519
👷 ci: run the test suite against Python 3.15 by @gaborbernat in #512
Full Changelog: 4.10.1...4.11.0
Declare support for Python 3.15 and run the test suite against it, currently in beta. PR #512
🐛 fix(windows): stop leaking memory on repeated folder lookups by @gaborbernat in #507
Full Changelog: 4.10.0...4.10.1
Stop leaking memory on repeated Windows folder lookups. get_win_folder_via_ctypes defined a fresh ctypes structure on every call, and each one registered a pointer type that was never released; the resolver is now built once and reused. PR #507
chore: improve platformdirs maintenance path by @lphuc2250gma in #488
Full Changelog: 4.9.6...4.10.0
Add user_publicshare_dir() , user_templates_dir() , user_fonts_dir() , and user_preference_dir() PR #491
Add user_projects_dir() backed by $XDG_PROJECTS_DIR PR #490
Return only the first path from site_config_path() on macOS when multipath is set PR #488 - by @lphuc2250gma
Add ~platformdirs.user_publicshare_dir, ~platformdirs.user_templates_dir, ~platformdirs.user_fonts_dir, and ~platformdirs.user_preference_dir 491
Add ~platformdirs.user_projects_dir backed by $XDG_PROJECTS_DIR 490
Return only the first path from ~platformdirs.site_config_path on macOS when multipath is set 488 - by lphuc2250gma
🐛 fix(release): use double quotes for tag variable expansion by @gaborbernat in #477
Full Changelog: 4.9.5...4.9.6
Fix macOS XDG variables leaking across user_config_dir() , user_data_dir() , and user_state_dir() when only some are set PR #473 - by @Goddesen
Avoid duplicate site directories in Unix iter_config_dirs() and iter_data_dirs() when use_site_for_root is active PR #469 - by @viccie30
Fix macOS XDG variables leaking across ~platformdirs.user_config_dir, ~platformdirs.user_data_dir, and ~platformdirs.user_state_dir when only some are set 473 - by Goddesen
Avoid duplicate site directories in Unix ~platformdirs.PlatformDirs.iter_config_dirs and ~platformdirs.PlatformDirs.iter_data_dirs when use_site_for_root is active 469 - by viccie30
Add permissions to workflows by @gaborbernat in #455
Full Changelog: 4.9.3...4.9.4
Respect XDG_CONFIG_HOME when reading the user-dirs configuration PR #453 - by @bysiber
Create the directory in Android user_log_dir() and user_runtime_dir() when ensure_exists is set PR #452 - by @bysiber
Respect XDG_CONFIG_HOME when reading the user-dirs configuration 453 - by bysiber
Create the directory in Android ~platformdirs.user_log_dir and ~platformdirs.user_runtime_dir when ensure_exists is set 452 - by bysiber
<!-- Release notes generated using configuration in .github/release.yml at 4.9.2 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.9.2 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.9.1...4.9.2
<!-- Release notes generated using configuration in .github/release.yml at 4.9.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.9.1 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.9.0...4.9.1
<!-- Release notes generated using configuration in .github/release.yml at 4.9.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.9.0 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.8.0...4.9.0
Add site_bin_dir() PR #443
Add site_applications_dir() PR #442
Use the correct runtime directory path on OpenBSD PR #440
Add ~platformdirs.site_bin_dir 443
Add ~platformdirs.site_applications_dir 442
Use the correct runtime directory path on OpenBSD 440
<!-- Release notes generated using configuration in .github/release.yml at 4.8.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.8.0 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.7.1...4.8.0
Add use_site_for_root to redirect user_dir to site_dir for root on Unix PR #426
Add site_state_dir() for system-wide state PR #425
Add site_log_dir() PR #424
Add user_applications_dir() PR #432
Add user_bin_dir() PR #430
Add PLATFORMDIRS_* environment variable overrides for Windows folder resolution PR #427
Add WIN_PD_OVERRIDE_* environment variable overrides for Windows folder resolution PR #428
Yield individual site directories from iter_data_dirs() and iter_config_dirs() on macOS PR #429
Add use_site_for_root to redirect user_*_dir to site_*_dir for root on Unix 426
Add ~platformdirs.site_state_dir for system-wide state 425
Add ~platformdirs.site_log_dir 424
Add ~platformdirs.user_applications_dir 432
Add ~platformdirs.user_bin_dir 430
Add PLATFORMDIRS_* environment variable overrides for Windows folder resolution 427
Add WIN_PD_OVERRIDE_* environment variable overrides for Windows folder resolution 428
Yield individual site directories from ~platformdirs.PlatformDirs.iter_data_dirs and ~platformdirs.PlatformDirs.iter_config_dirs on macOS 429
<!-- Release notes generated using configuration in .github/release.yml at 4.7.1 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.7.1 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.7.0...4.7.1
Avoid FileNotFoundError on Windows in sandboxed environments PR #422
<!-- Release notes generated using configuration in .github/release.yml at 4.7.0 -->
<!-- Release notes generated using configuration in .github/release.yml at 4.7.0 -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.6.0...4.7.0
Fall back to a temp directory when the Unix runtime dir is not writable PR #369 - by @lengau
Use SHGetKnownFolderPath instead of the deprecated SHGetFolderPathW on Windows PR #380 - by @moi15moi
Fall back to a temp directory when the Unix runtime dir is not writable 369 - by lengau
Use SHGetKnownFolderPath instead of the deprecated SHGetFolderPathW on Windows 380 - by moi15moi
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
site_cache_dir by @brianhelba in https://github.com/tox-dev/platformdirs/pull/402XDG_* environment variables by @Czaki in https://github.com/tox-dev/platformdirs/pull/375Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.5.1...4.6.0
Honor XDG environment variables on macOS PR #375 - by @Czaki
Fix site_cache_dir() documentation PR #402 - by @brianhelba
Fix an outdated link and correct a function docstring PR #398 - by @joclement
Honor XDG environment variables on macOS 375 - by Czaki
Fix ~platformdirs.site_cache_dir documentation 402 - by brianhelba
Fix an outdated link and correct a function docstring 398 - by joclement
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.5.0...4.5.1
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.4.0...4.5.0
Add support for Python 3.14 PR #382 - by @hugovk
Drop support for Python 3.9 PR #389
Update Windows file paths in README PR #385 - by @ParadaCarleton
Add support for Python 3.14 382 - by hugovk
Drop support for Python 3.9 389
Update Windows file paths in README 385 - by ParadaCarleton
feat: improve homebrew path detection by @daeho-ro in https://github.com/tox-dev/platformdirs/pull/370
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.8...4.4.0
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.7...4.3.8
Add missing examples and fix example order in README PR #355 - by @gene1wood
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.6...4.3.7
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.5...4.3.6
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.4...4.3.5
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.3...4.3.4
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.2...4.3.3
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
_path methods on MacOS by @matthewhughes934 in https://github.com/tox-dev/platformdirs/pull/299Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.1...4.3.2
Fix multi-path returned from _path methods on macOS PR #299 - by @matthewhughes934
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.3.0...4.3.1
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
include-hidden-files: true to upload coverage artifacts by @edgarrmondragon in https://github.com/tox-dev/platformdirs/pull/298Full Changelog: https://github.com/tox-dev/platformdirs/compare/4.2.2...4.3.0
Make PlatformDirs usable as a mypy superclass without breaking other type checkers PR #295 - by @Avasam
Add support for Python 3.13 PR #289 - by @edgarrmondragon
Make ~platformdirs.PlatformDirs usable as a mypy superclass without breaking other type checkers 295 - by Avasam
Add support for Python 3.13 289 - by edgarrmondragon
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/4.2.1...4.2.2
Fix Android detection when python-for-android is present PR #277 - by @tmolitor-stud-tu
Fix Android detection when python-for-android is present 277 - by tmolitor-stud-tu
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/4.2.0...4.2.1
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
PlatformDirsAPI that allow iterating over both user and site dirs/paths. by @SpaceshipOperations in https://github.com/platformdirs/platformdirs/pull/258Full Changelog: https://github.com/platformdirs/platformdirs/compare/4.1.0...4.2.0
Add convenience methods to iterate over both user and site dirs and paths PR #258 - by @SpaceshipOperations
Fix two typos referencing XDG_DATA_DIR PR #256 - by @Freed-Wu
Add convenience methods to iterate over both user and site dirs and paths 258 - by SpaceshipOperations
Fix two typos referencing XDG_DATA_DIR 256 - by Freed-Wu
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/4.0.0...4.1.0
Drop support for EOL Python 3.7 PR #246 - by @hugovk
Fix Linux user_log_dir() example in README PR #245 - by @dbohdan
Drop support for EOL Python 3.7 246 - by hugovk
Fix Linux ~platformdirs.user_log_dir example in README 245 - by dbohdan
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
/var/cache again instead of /var/tmp on UNIX by @andersk in https://github.com/platformdirs/platformdirs/pull/239Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.11.0...4.0.0
Revert site_cache_dir() on UNIX to /var/cache instead of /var/tmp PR #239 - by @andersk
Revert ~platformdirs.site_cache_dir on UNIX to /var/cache instead of /var/tmp 239 - by andersk
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.10.0...3.11.0
Detect Homebrew-installed software on macOS PR #232 - by @singingwolfboy
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
site_runtime_dir by @kemzeb in https://github.com/platformdirs/platformdirs/pull/212Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.9.1...3.10.0
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
user_log_dir() by @kemzeb in https://github.com/platformdirs/platformdirs/pull/208Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.9.0...3.9.1
Optionally create the opinionated log subdirectory in user_log_dir() on Unix PR #208 - by @kemzeb
Optionally create the opinionated log subdirectory in ~platformdirs.user_log_dir on Unix 208 - by kemzeb
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.8.1...3.9.0
Add user_desktop_dir() and user_desktop_path() PR #200 - by @lukacat10
Add ~platformdirs.user_desktop_dir and ~platformdirs.user_desktop_path 200 - by lukacat10
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.8.0...3.8.1
Provide a fallback for user_runtime_dir() on BSD PR #201 - by @RayyanAnsari
Provide a fallback for ~platformdirs.user_runtime_dir on BSD 201 - by RayyanAnsari
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.7.0...3.8.0
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.6.0...3.7.0
Return /var/run/user/$uid from user_runtime_dir() on *BSD PR #194 - by @kemzeb
Return /var/run/user/$uid from ~platformdirs.user_runtime_dir on *BSD 194 - by kemzeb
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.5.3...3.6.0
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.5.2...3.5.3
<!-- Release notes generated using configuration in .github/release.yml at 3.5.2 -->
<!-- Release notes generated using configuration in .github/release.yml at 3.5.2 -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.5.1...3.5.2
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.5.0...3.5.1
Define getuid on all non-Windows platforms so user_runtime_dir() works beyond Linux PR #183
Define getuid on all non-Windows platforms so ~platformdirs.user_runtime_dir works beyond Linux 183
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
user_music_dir() by @kemzeb in https://github.com/platformdirs/platformdirs/pull/173Full Changelog: https://github.com/platformdirs/platformdirs/compare/3.4.0...3.5.0
Your coding agent can read these notes before it upgrades. Set up the MCP server →