A fish shell plugin for managing date-based workspace directories.
Organizes your work into Y{year}/M{month}/D{day}/ directories, providing quick navigation, browsing, and glob search across workspaces.
- macOS (uses
date -vfor date arithmetic) - fish shell 4.x+
- bash (used internally by
wsgfor glob expansion)
Linux is not officially supported. If you're on Linux, you'll need to replace date -v-{N}d with the GNU equivalent (date -d "-N days") yourself.
# Symlink into fish config
ln -sf /path/to/workspace.fish ~/.config/fish/conf.d/workspace.fishNew fish sessions will auto-load the plugin. Run source ~/.config/fish/conf.d/workspace.fish to load in the current session.
Set WS_ROOT to change the root directory (defaults to $HOME):
set -Ux WS_ROOT ~/projectsThis makes all commands operate under ~/projects/Y{year}/M{month}/D{day}/.
Jump to today's workspace. Creates the directory hierarchy if it doesn't exist.
ws # cd to ~/Y2026/M04/D11/
ws myproject # cd to ~/Y2026/M04/D11/myproject/
ws --dry-run # print the path without creating or changing directoryList projects in today's workspace.
wsl
# workspace-extensionsBrowse workspaces from the past 15 days.
wsl2 # reverse chronological (default)
wsl2 --asc # chronologicalBrowse this month's workspaces.
wsl3Browse longer ranges: 30 days / 90 days / 365 days.
wsl4 # past 30 days
wsl5 --asc # past 90 days, chronological
wsl6 # past yearAll wsl* commands output reverse chronological by default. Pass --asc for chronological order.
Glob search across all workspaces. Outputs ls -lhd for each match.
The pattern matches against the project level. Missing directory levels are auto-filled with wildcards. The Y/M/D levels are strictly validated (Y[0-9]{4}/M[0-9]{2}/D[0-9]{2}).
wsg '*.git' # all git repos
wsg 'claude*' # projects starting with "claude"
wsg 'Y2026/M03/*/claude*' # March 2026 only
wsg '*/M04/D01/*' # every April 1st across years
wsg '*.rkt' --asc # all racket projects, chronological