My setup
How I use my computers.
I have found a satisfactory directory layout for my personal data. It took surprisingly long to arrive at it by gradual iteration, which suggests it isn’t obvious and there is value in sharing it.
My directories are organized like this:
sync/
archive/
2000/
2001/
- …
2024/
- …
projects/
2000/
2001/
- …
2024/
active/
- …
sync/
is the root directory that is synchronized between computers using Syncthing. I keep it in my home directory on Linux. It has two main subdirectories: archive/
and projects/
.
Note on trailing slashes.
Depending on the context, I write directory names with a trailing slash to differentiate directories from files. I adopted the practice after trying Rebol, where paths with a trailing slash are a separate data type from paths without.Note on a kindred setup.
I have found out that Risto Saarelma has a similar kind of directory, which he has called~/hearth/
.
The projects/
directory contains my projects: mostly software, but also writing, art, audio, etc. I have found that the best way to organize my projects is by the year they were started:
- Not grouping at all projects leads to too many in one directory.
- Grouping by category doesn’t work because projects belong in more than just one category.
Simulating multiple categories (tags) with symlinks is brittle. (For example, you must update all links when you change the project name.)
I only use symlinks in the active/
subdirectory, which contains links to projects that I frequently access or work on. The symlinks are relative. For example, active/hicolor
links to ../2021/hicolor/
Project directory names are normally limited to only lower-case English letters, numbers, and dashes. They do not contain spaces. This is convenient on the command line.
One problem I had for a long time was the lack of a standard place to store and way to name things that weren’t projects, like screenshots, logs, notes, single webpages, etc. I have found that it is best to organize them “even more” chronologically than projects, preferably by year-month-day. However, deep directory structures like 2023/10/29
with only one or a few items in each leaf directory are difficult to get an overview of and to manipulate. Therefore, I organize my archive by year and prefix the month and day to the filename. For example, I could have a file archive/2023/11-27-storm.flac
. The name means the file was archived on November 27, 2023 (but not necessarily created at that time; I am not super strict about which date to use as long as it helps find and group the item).
For items created by or received from other people, I add the their name or online nickname to the prefix. For example, it could be archive/2020/08-10-someone-letter.txt
. The items in archive/
can also be topical directories with a month-day, month, or no prefix. I normally add a day or a month-day prefix to the filenames inside those directories.
The sync/
directory is an encrypted ZFS volume. It is backed-up using BorgBackup and ZFS snapshots via Sanoid. ZFS has checksums that prevent silent data corruption.
I keep photos in a separate directory hierarchy outside sync/
. This allows me to synchronize them and back them up less frequently. It also reduces the size of sync/
and its backups.
I have come up with a convention for using Rclone. To make sure I don’t accidentally send files to an unencrypted remove, I prefix the names of unencrypted remotes name with UNENCRYPTED-
in all caps then layer an Rclone-encrypted remove without the prefix over it.
My remotes are named [<prefix>-]<type>-<unique>
. For example, I could name an SFTP remote UNENCRYPTED-sftp-foo
; then sftp-foo
would be the encrypted layer. In my usage I would almost always refer to sftp-foo
. Where I don’t need encryption (for example, for backups that are already encrypted), I still prefix the remote’s name with UNENCRYPTED-
but don’t create its encrypted counterpart.
The “current” items here are listed roughly by how much I use them, items in “history” roughly in the order I started really using them. Items may be listed in “history” several times. It means I took a break from using them or my use of them changed.
- Ubuntu LTS (desktop)
- Debian GNU/Linux (laptop, servers, containers)
- Alpine Linux (containers for building static binaries)
- System 7
- Windows 95 OSR2
- MS-DOS
- Windows 98 SE
- Red Hat Linux
- SuSE Linux and other distributions and live CDs
- Windows XP
- Mac OS X “Tiger” and “Leopard”
- Debian GNU/Linux (PowerPC)
- Windows 7
- Linux Mint
- FreeBSD (servers)
- Windows 8, 8.1
- Debian GNU/Linux (servers)
- Ubuntu
- Windows 10
- Alpine Linux (containers)
- NetBSD (SDF, VM)
- OpenBSD (tilde.institute, VM)
- Intricate batch files
- Perl
- Bash
- Python 2
- POSIX shell
- Tcl
- Jim Tcl
- Bash
- Python 3
- Notepad2 (see Notepad3 for a maintained fork)
- Geany
- ne
- Sublime Text
- Vim
- Visual Studio Code
- vis
- Neovim
- Vim
- Double Commander
- Altap Salamander (Windows VMs)
- SSH (everywhere)
- About this site
- Organizing information
- “My source code root folder name”2023
- “The setup”, Risto Saarelma2024
- “Tips on how to structure your home directory”, unixdigest2023