αβα·κκ α²αβ£βα΅ 1
A self-contained, cross-platform dotfiles management system with declarative YAML configuration and automated deployment.
This repository contains my personal configuration files (dotfiles) for macOS and Linux systems. The system is built around a custom "strap" framework that makes it easy to deploy, manage, and synchronize configurations across different machines and platforms.
Configurations for:
- Terminal: Fish shell, Ghostty
- Editor: Neovim
- macOS: Yabai (tiling WM), Skhd (hotkey daemon), Hammerspoon
- Linux: Hyprland, Waybar, Rofi, Dunst, Darkman
- Multiplexer: Zellij
- Git: Custom aliases and semantic commit tool
- No External Dependencies: Includes vendored YAML parser, works out-of-the-box with Python 3
- Platform-Specific Configs: Separate configurations for macOS and Linux
- Declarative YAML Format: Simple, readable configuration files
- Automatic Symlink Management: No manual linking required
- Git Integration: Built-in sync command with auto-commit and push
- Cron Job Management: Automated scheduling with validation and rollback
- Native Notifications: Desktop notifications on macOS and Linux
Clone the repository and run the bootstrap script:
git clone <your-repo-url> ~/.dotfiles
cd ~/.dotfiles
python3 bootstrap.pyThe bootstrap process will:
- Process all strap configuration files
- Create symlinks to your home directory
- Copy files that need customization
- Install cron jobs (if configured)
- Set up the
deytefilescommand in your PATH
After bootstrap, you can use the deytefiles command from anywhere:
deytefiles sync # Sync changes with git
deytefiles bootstrap # Re-run bootstrap processThe heart of this dotfiles system is the "strap" framework. Each component has a YAML configuration file that defines how it should be deployed.
Configuration files use platform-specific naming:
strap.yaml- Cross-platform configuration (deployed everywhere)strap@darwin.yaml- macOS-specific configurationstrap@linux.yaml- Linux-specific configuration
The bootstrap process automatically selects the appropriate files for your current platform.
Basic structure of a strap configuration file:
name: component-name
link:
- file.conf
- [source.conf, ~/.config/target.conf]
copy:
- [file.txt, ~/target.txt]
cron:
- ["0 * * * *", "~/script.sh"]The link and copy sections support multiple formats for flexibility:
link:
- config.fish
- aliases.fishThe target path is automatically inferred from the directory structure.
Example: config.fish in .config/fish/ β ~/.config/fish/config.fish
link:
- [source.conf, ~/.config/app/target.conf]
- [script.sh, ~/.local/bin/script.sh]Specify both source and target paths explicitly.
link:
- [., ~/.config/nvim]Link the entire directory containing the strap file.
Simple configuration (.config/fish/strap.yaml):
name: fish
link:
- config.fish
- aliases.fish
- functions.fishWith explicit targets (.config/darkman/strap@linux.yaml):
name: darkman
link:
- [config.yaml, ~/.config/darkman/config.yaml]
- [dark-mode.d, ~/.local/share/dark-mode.d]
- [light-mode.d, ~/.local/share/light-mode.d]Directory linking (.config/nvim/strap.yaml):
name: nvim
link:
- [., ~/.config/nvim]With copy and cron (.config/app/strap.yaml):
name: app
link:
- config.conf
copy:
- [.theme.conf, ~/.config/app/.theme.conf]
cron:
- ["0 * * * *", "~/.local/bin/hourly-sync.sh"]The deytefiles command is the main interface for managing your dotfiles.
Run the bootstrap process to deploy all configurations:
deytefiles bootstrap # Full bootstrap with notifications
deytefiles bootstrap -q # Quiet mode (no notifications)This command:
- Locates the dotfiles repository
- Processes all strap files for your platform
- Creates symlinks and copies files
- Applies cron jobs
- Sends a completion notification
Synchronize local changes with the remote git repository:
deytefiles sync # Auto-commit with timestamp
deytefiles sync -m "Custom message" # Custom commit message
deytefiles sync -f # Force push (--force-with-lease)
deytefiles sync -q # Quiet mode (no notifications)This command:
- Stages all changes (
git add -A) - Creates a commit (with timestamp or custom message)
- Pulls with rebase from origin
- Pushes changes to remote
- Handles conflicts gracefully
- Sends a notification on completion or failure
-q, --quiet- Suppress desktop notifications-m, --message MESSAGE- Custom commit message for sync-f, --force- Use--force-with-leasewhen pushing
.dotfiles/
βββ bootstrap.py # Main bootstrap script
βββ strap.yaml # Root configuration
βββ .config/ # Application configurations
β βββ fish/
β β βββ strap.yaml # Fish shell config
β β βββ config.fish
β β βββ aliases.fish
β β βββ functions.fish
β βββ nvim/
β β βββ strap.yaml # Neovim config
β βββ yabai/
β β βββ strap@darwin.yaml # macOS-only
β βββ hypr/
β βββ strap@linux.yaml # Linux-only
βββ .hammerspoon/
β βββ strap@darwin.yaml # Hammerspoon (macOS)
βββ .local/
β βββ bin/
β β βββ strap.yaml
β β βββ deytefiles # CLI command
β β βββ copy # Utility scripts
β β βββ git-semantic
β βββ share/
β βββ dotfiles/
β βββ utils.py # Core utilities
β βββ cli/ # CLI implementation
β βββ vendor/ # Vendored dependencies
β βββ yaml_parser.py
βββ README.md
This dotfiles system includes a custom, minimal YAML parser that requires no external dependencies. This means you can bootstrap on any system with Python 3 installed, without needing pip or internet access.
The parser supports all features needed for strap files:
- Key-value pairs (strings, numbers, booleans)
- Lists (block and flow style)
- Nested structures
- Comments
The system can automatically manage cron jobs through the cron section in strap files. Features:
- Validation: All cron expressions are validated before applying
- Isolated Section: Jobs are placed in a dedicated section marked with comments
- Automatic Rollback: If cron installation fails, the original crontab is restored
- Platform Support: Works on macOS and Linux
Example cron section in crontab:
# BEGIN DEYTENIT DOTFILES STRAP CRON
0 * * * * ~/.local/bin/hourly-sync.sh
*/30 * * * * ~/.local/bin/backup.sh
# END DEYTENIT DOTFILES STRAP CRONDesktop notifications use native OS facilities:
- macOS: AppleScript via
osascript - Linux:
notify-send(works with dunst, mako, notification-daemon, etc.)
Notifications can be disabled with the -q/--quiet flag.
The deytefiles command automatically determines the repository location based on its installation path, allowing it to work from any directory on your system. This is achieved through:
- The
deytefilesscript calculates the repo root from its own location - All git operations use the repo path explicitly
- Commands work regardless of your current working directory
- [1]: eng. Shell Magic (Standard Galactic Alphabet)
