Why Steam Deck Internal Storage Fills Up Rapidly
On SteamOS (Arch Linux-based), every installed Windows game creates two hidden directories inside the internal eMMC/NVMe SSD: compatdata/[AppID] (a dedicated Proton WINE prefix containing virtual Windows registry hives and dependencies) and shadercache/[AppID] (pre-compiled Vulkan and DXVK shader binaries). Even when large game libraries are installed directly onto external MicroSD cards, these companion caches remain on internal storage by default, consuming 30GB to 60GB of non-game storage.
| Directory Name | File Contents | Average Size per Game | Safe to Delete Directly? |
|---|---|---|---|
compatdata/[AppID] | Virtual C: drive, local game saves, DirectX runtimes | 500 MB - 3.5 GB | No; local saves not synced to cloud will be lost forever |
shadercache/[AppID] | Pre-compiled DXVK / VKD3D shader binaries | 1 GB - 8 GB | Yes; Steam will re-download, but causes launch stutter |
| Orphaned AppIDs | Leftover prefixes of uninstalled titles | Variable (can exceed 20GB) | Yes; completely safe to prune using zshader or Decky |
Step 1: Identifying Cache Hogs via Desktop Mode Terminal
Switch to Desktop Mode (Power > Switch to Desktop) and open Konsole terminal to audit cache space:
du -sh ~/.local/share/Steam/steamapps/shadercache/* | sort -h
du -sh ~/.local/share/Steam/steamapps/compatdata/* | sort -h
Cross-reference suspicious AppID folder numbers against SteamDB (e.g., 1091500 for Cyberpunk 2077) to determine which specific games are consuming internal drive capacity.
Step 2: Creating External Storage Directory Structure
To relocate caches to your formatted MicroSD card (mounted under /run/media/mmcblk0p1/ or similar):
- Create target directories on the MicroSD card:
mkdir -p /run/media/mmcblk0p1/SteamDeck_ExternalCaches/shadercache
mkdir -p /run/media/mmcblk0p1/SteamDeck_ExternalCaches/compatdata
- Move target game folder to MicroSD (example using AppID 1091500):
mv ~/.local/share/Steam/steamapps/shadercache/1091500 /run/media/mmcblk0p1/SteamDeck_ExternalCaches/shadercache/
mv ~/.local/share/Steam/steamapps/compatdata/1091500 /run/media/mmcblk0p1/SteamDeck_ExternalCaches/compatdata/
Step 3: Creating Linux Symbolic Links (Symlinks)
Link the external MicroSD directory back to the internal path expected by Proton and Steam:
ln -s /run/media/mmcblk0p1/SteamDeck_ExternalCaches/shadercache/1091500 ~/.local/share/Steam/steamapps/shadercache/1091500
ln -s /run/media/mmcblk0p1/SteamDeck_ExternalCaches/compatdata/1091500 ~/.local/share/Steam/steamapps/compatdata/1091500
Verify the symlink creation:
ls -ld ~/.local/share/Steam/steamapps/shadercache/1091500
The terminal should output a link pointer arrow indicating that the internal path resolves seamlessly to the MicroSD mount point.
Step 4: Automating with Decky Loader Storage Cleaner
For users who prefer avoiding manual terminal scripts:
- Install Decky Loader in Desktop Mode via the official curl installer.
- Return to Gaming Mode and open the Decky plugin store.
- Install
Storage Cleaner. - Scan internal storage: it automatically identifies orphaned prefixes belonging to games no longer installed, allowing single-click reclamation of gigabytes of disk space without risking cloud-synced game configurations.