Everything is under $HOME/Data divided in categories:

- Apps -> executable binary software
- Backup
- Code -> sourcecode of software
- Config -> dotfiles and stuff which goes to $HOME/.config or .local
- Documents -> PDF, Epub, etc. Everything which is mostly readonly
- Notes -> Plaintext-documents which are for read/write
- Pictures
- Projects -> Active Projects
- Software -> Setup-Files for binary software, roms, etc.
- Text -> Plaintext-data like logs, traces, etc. Usually readonly and generated from Software
- Vault -> Binary App-Specific Data. Some readonly, some read/write
- Video
- VirtualEnv -> Python-Environments
- VM -> Other Environments

Every categoryfolder has subfolders which contain projects/product/app-specific data.
In case of App for example each folder is one app.
In case of Code each folder is a repository.
In case of Config each folder is for one specific app, with exception of misc which contains single config-files.
Projects cotains folders with mixed data, each related to a specific shortliving task or project. Long living data go to other categoryfolders.
Readonly means I don't change those data by myself, while read/write means I work with them regulary.

Overall everything quite simple. But reality is more complicate. $HOME/Data is the store and used as base for a script which will generate several link in my home-dir. This is done with #Tags in the foldername, or some predefinend rules, or by using a list of predefinend targets from a file (mostly used for Config-Entrys).

Main targets are:

- $HOME/Archive -> Subfolders with #Done
- $HOME/Playground -> Projects without a tag which are a git-repo
- $HOME/Tasks -> All other Projects or subfolders with #Task
- $HOME/Workspace -> Subfolders with #Workspace (usually from Data/Code or Data/Config)

I have then functions in my Editor and shell to access them comfortable and can avoid crappy projects-addons.

BUT, this is not the whole of it. $HOME/Data itself is also just a linkfarm. I don't have just one hard drive, but several drives and multiple devices from which use them. $HOME/Data is just the merge from the available drives on each device. Drives are mostly Dropbox, multiple NAS, Localdrive and external Drive. The simple reason for this setup is that I have some data I sync between devices, some other data are exclusive for specific locations (work) and I'm legally obligated to not mix them with personal data. Some other data are just to big to sync and I want them on a centralized system, and because there are so many of them I have multiple of them, and sometimes also workplaces with some NAS.

So, how I use this is, I mount drives somewhere, usually /mnt, and link them to $HOME/HUB. My script then iterates through them, and updates $HOME/Data. Hierachy is HUB/$DRIVE/$NAME/$CATEGORY.
$CATEGORY are the topfolders from $HOME/Data (App, Code, Config...). $NAME is another special that I use to divide data even per drive. Normally I use it to separate personal workplace-related data which I'm allowed to mix with other data, like my own scripts or configs, or just some SFW wallpapers. but also old Projects where I could keep the sourcecode or other data.
My script then collects the folders under $CATEGORY, generates $HOME/Data/$CATEGORY if it not exists, and links the folder there. If there are multiple folders with the same name it adds also $NAME to the linkname, so nothing gets forgotten.

I developed this in the last 10-15 years, and over the years it evolved in some way or another. Biggest pain is to create new, rename or move existing folders, because I in this case I can't work on the link. For this I use scripts which in 99% works painless. Additionally I have some more scripts which move files from certain locations (mainly download-folder) to specific targets. Works fine for regulary files with structures names, not so much for random stuff.