Compare commits

...
21 Commits
Author SHA1 Message Date
AquaMorph 897746b703 feat(orcaslicer): share profile directory 2026-10-18 10:36:24 -04:00
AquaMorph b94863cef8 feat(packages): install OrcaSlicer 2026-10-18 10:20:52 -04:00
AquaMorph 87312f9099 docs(readme): clarify setup instructions 2026-10-17 21:47:02 -04:00
AquaMorph aacee17255 feat(homebrew): install steam 2026-10-17 21:43:31 -04:00
AquaMorph e71962c89f feat(macos): configure system preferences 2026-10-17 21:19:38 -04:00
AquaMorph bbc7509810 feat(homebrew): install logitech options 2026-10-17 20:40:08 -04:00
AquaMorph a601ceb4de feat(brew): include nextcloud sync client 2026-10-15 21:36:28 -04:00
AquaMorph 6ec72b77c7 feat(chezmoi): configure encrypted ssh secrets 2026-10-15 20:39:17 -04:00
AquaMorph 50dcca10c9 feat(git): configure lfs filters 2026-10-15 18:58:53 -04:00
AquaMorph b942953365 fix(autorause): focus windows without intentional delay 2026-10-14 07:19:27 -04:00
AquaMorph 38fb8d8448 feat(macos): configure hover window focus 2026-10-14 07:16:15 -04:00
AquaMorph 05da23ca10 feat(keyboard): configure model m macos keybindings 2026-10-13 21:20:41 -04:00
AquaMorph 67c81eea85 feat(shell): improve history and path handling 2026-10-11 14:55:29 -04:00
AquaMorph ed99088c87 fix(updater): continue after individual failures 2026-10-11 14:53:41 -04:00
AquaMorph 891ba27000 feat(dotfiles): document macos setup and secure secrets 2026-10-11 12:55:19 -04:00
AquaMorph 8d80823b37 feat(chezmoi): ignore linux configuration on macos 2026-10-11 12:44:24 -04:00
AquaMorph 021dcf7010 chore(zsh): use configured model for commit agent 2026-10-11 12:31:28 -04:00
AquaMorph 8fb6eb5f82 fix(zsh): correct commit command argument order 2026-10-11 12:28:53 -04:00
AquaMorph 585818041a fix(models): use stable luna model 2026-10-11 12:26:44 -04:00
AquaMorph 525f55487f feat(zsh): support cross-platform shell setup 2026-10-11 12:24:19 -04:00
AquaMorph f47e69f438 fix(quickshell): detect wayland when session type is unset 2026-09-27 16:08:50 -04:00
20 changed files with 1922 additions and 51 deletions
+91 -2
View File
@@ -1,10 +1,99 @@
# Dotfiles
A collection of config files and scripts for Fedora GNU/Linux.
A collection of config files and scripts for Fedora GNU/Linux and macOS.
## Installation
## Linux installation
```bash
chezmoi init --apply git@github.com:AquaMorph/dotfiles.git
```
## macOS installation
1. Install the Xcode Command Line Tools with `xcode-select --install`, then
install [Homebrew](https://brew.sh/) and follow its `brew shellenv`
instructions.
2. Download the dotfiles without applying them, then install dependencies:
```bash
brew install chezmoi
chezmoi init git@github.com:AquaMorph/dotfiles.git
brew bundle --file="$(chezmoi source-path ~/.brewfile)"
```
3. Restore your password store to `~/.password-store` and import its GPG private
key from a secure backup before applying the dotfiles:
```bash
gpg --import /path/to/private-key-backup.asc
```
If the store is kept in Git, clone it to `~/.password-store` using your
password-store repository URL. Verify that all required secrets can be
decrypted without printing their values:
```bash
pass show self-host/token/audible-activation-bytes >/dev/null
pass show self-host/token/aquaai >/dev/null
pass show self-host/token/todoist >/dev/null
```
`settings.conf` is rendered using `pass`, so applying it requires these
entries and the matching private key. Never commit keys or plaintext tokens.
4. Review and apply the dotfiles, then open a new terminal:
```bash
chezmoi diff
chezmoi apply
```
Linux-only configuration and scripts are automatically ignored on macOS.
To install newly added macOS dependencies later:
```bash
brew bundle --file="$(chezmoi source-path ~/.brewfile)"
```
### System preferences
Close System Settings, then review and run the optional setup script as your
normal user (not with `sudo`):
```bash
~/bin/setup-macos.sh --dry-run
~/bin/setup-macos.sh
```
It enables dark mode and Dock auto-hide, disables natural scrolling and
swipe-to-navigate, and removes window-tiling margins (macOS Sequoia and later).
Animation settings and machine-specific state, such as Dock contents and
monitor/Spaces layouts, are left unchanged.
The script is safe to rerun but does not back up previous values or run
automatically during `chezmoi apply`. Log out and back in if changes are not
visible.
### Hover window focus
AutoRaise focuses and raises windows on hover. Its settings are managed in
`~/.config/AutoRaise/config`.
After installing dependencies and applying the dotfiles, enable it at login:
```bash
brew services start dimentium/autoraise/autoraise
```
Grant AutoRaise access in **System Settings → Privacy & Security → Accessibility**.
If it is not listed, use **+**, press **Cmd+Shift+G**, and enter the path printed by
`echo "$(brew --prefix autoraise)/bin/AutoRaise"`. Then restart it with
`brew services restart dimentium/autoraise/autoraise`.
Hold **Control** to temporarily suspend hover focus. To turn it off entirely:
```bash
brew services stop dimentium/autoraise/autoraise
```
+4
View File
@@ -0,0 +1,4 @@
encryption = "gpg"
[gpg]
recipient = "02C20A131365D6EF3CC4A023B9BDD0975CF5592D"
+61
View File
@@ -0,0 +1,61 @@
{{ if eq .chezmoi.os "darwin" -}}
# Linux desktop configuration
.config/g13
.config/gtk-3.0
.config/gtk-4.0
.config/hypr
.config/i3
.config/mako
.config/polybar
.config/quickshell
.config/rofi
.config/waybar
# Linux services and PipeWire configuration
.config/systemd
.config/wireplumber
.local/share/wireplumber
user/*.service
# Linux package installers and desktop startup scripts
bin/installers
bin/desktop
bin/system
bin/i3-mouse.py
bin/i3wm-config-gen.sh
bin/i3wm-for-window-gen.sh
bin/launch-stocks-tracker.py
bin/start-firefox.py
bin/start-brave.sh
# Linux hardware, screen locking, and NAS mounting
bin/get-mouse-battery.sh
bin/lock.sh
bin/toggle-graphics.sh
bin/trackpad-toggle.sh
bin/connect-nas.sh
# ALSA/PipeWire routing and Rofi prompts; keep portable audio utilities
bin/audio/audio-lib.sh
bin/audio/aquamix.sh
bin/audio/es8start.sh
bin/audio/es9start.sh
bin/audio/es9stop.sh
bin/audio/system-start-audio.sh
bin/audio/synth-power-prompt.sh
# Wine-based Adobe DNG conversion with GNU date
bin/video/cr3todng.sh
{{ else -}}
# Homebrew dependencies are only managed on macOS.
.brewfile
# macOS OrcaSlicer uses a symlink to the shared Linux-style profile directory.
Library/Application Support/OrcaSlicer
{{ end -}}
{{ if ne .chezmoi.os "darwin" -}}
.config/karabiner
.config/AutoRaise
bin/setup-macos.sh
{{ end -}}
+1 -1
View File
@@ -1 +1 @@
openai/gpt-5.6-luna-fast
openai/gpt-5.6-luna
@@ -0,0 +1 @@
{{ .chezmoi.homeDir }}/.config/OrcaSlicer/user/default
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
# Apply curated macOS preferences without copying machine-specific state.
set -euo pipefail
function usage {
echo "Usage: ${0##*/} [--dry-run]"
echo "Apply macOS preferences for the current user. Do not run with sudo."
}
dry_run=false
case "${1:-}" in
--dry-run) dry_run=true ;;
--help|-h) usage; exit 0 ;;
"") ;;
*) usage >&2; exit 1 ;;
esac
if [[ $# -gt 1 ]]; then
usage >&2
exit 1
fi
if [[ "$(uname -s)" != "Darwin" ]]; then
echo "This script only supports macOS." >&2
exit 1
fi
if [[ "$EUID" -eq 0 ]]; then
echo "Run this script as your normal user, not with sudo." >&2
exit 1
fi
function write_preference {
if [[ "$dry_run" == true ]]; then
printf '%q ' defaults write "$@"
printf '\n'
elif ! defaults write "$@"; then
echo "Could not write preference: $1 $2" >&2
exit 1
fi
}
# Existing preferences observed on this Mac. This is not a full defaults export:
# macOS also stores stock values, histories, and hardware-specific state there.
# Use dark appearance and automatically hide the Dock.
write_preference NSGlobalDomain AppleInterfaceStyle -string Dark
write_preference com.apple.dock autohide -bool true
# Use traditional scrolling and disable swipe-based back/forward navigation.
write_preference NSGlobalDomain com.apple.swipescrolldirection -bool false
write_preference NSGlobalDomain AppleEnableSwipeNavigateWithScrolls -bool false
# Remove the gaps around tiled windows (macOS Sequoia and later).
write_preference com.apple.WindowManager EnableTiledWindowMargins -bool false
if [[ "$dry_run" == false ]]; then
echo "Preferences saved. Log out and back in if changes are not visible."
fi
+38 -18
View File
@@ -22,8 +22,7 @@ function dnfUpdate {
function aptUpdate {
if command -v apt &> /dev/null; then
echo Updating APT...
sudo apt update
sudo apt upgrade
sudo apt update && sudo apt upgrade
fi
}
@@ -31,22 +30,31 @@ function aptUpdate {
function flatpakUpdate {
if command -v flatpak &> /dev/null; then
echo Updating Flatpak...
flatpak uninstall --unused
flatpak update
flatpak uninstall --unused && flatpak update
fi
}
# Appimage Updater
function appimageUpdate {
if command -v am &> /dev/null; then
echo Updating AppImages...
am update
fi
}
# Homebrew Updater
function brewUpdate {
if command -v brew &> /dev/null; then
echo Updating Homebrew...
brew update && brew upgrade
fi
}
# Pass Repository Updater
function passUpdate {
if [ -d "$HOME/.password-store/.git" ] && [ -d "$HOME/.password-store" ]; then
echo Updating pass repository...
cd "$HOME/.password-store"
git pull
git -C "$HOME/.password-store" pull
fi
}
@@ -72,16 +80,28 @@ function manualUpdate {
fi
}
chezmoiUpdate
echo ''
dnfUpdate
aptUpdate
echo ''
flatpakUpdate
echo ''
appimageUpdate
echo ''
manualUpdate
echo ''
passUpdate
update_failed=0
# Report failures while allowing the remaining updaters to run.
function run_updater {
if ! "$1"; then
echo "Updater failed: $1" >&2
update_failed=1
fi
}
run_updater chezmoiUpdate
echo ''
run_updater brewUpdate
run_updater dnfUpdate
run_updater aptUpdate
echo ''
run_updater flatpakUpdate
echo ''
run_updater appimageUpdate
echo ''
run_updater manualUpdate
echo ''
run_updater passUpdate
exit "$update_failed"
+2 -1
View File
@@ -7,6 +7,7 @@ import datetime as dt
import re
import operator
import os
import shlex
import sys
import tbapy
from todoist_api_python.api import TodoistAPI
@@ -105,7 +106,7 @@ configParser.read_string(configString)
# Load needed credentials
tbaKey = configParser.get('Settings', 'TBAKey')
todoistToken = configParser.get('Settings', 'TodoistToken')
todoistToken = shlex.split(configParser.get('Settings', 'TodoistToken'))[0]
# Setup Todoist
api = TodoistAPI(todoistToken)
+37
View File
@@ -0,0 +1,37 @@
# Shared command-line tools
brew "chezmoi"
brew "git"
brew "emacs"
brew "python"
brew "jq"
# Password-store secrets used by chezmoi templates
brew "pass"
brew "gnupg"
# Web browser
cask "brave-browser"
# Nextcloud file sync
cask "nextcloud"
# Gaming
cask "steam"
# 3D printing
cask "orcaslicer"
# Logitech mouse configuration
cask "logi-options+"
# Terminal and font used by the shared Alacritty configuration
cask "alacritty"
cask "font-inconsolata"
# Focus and raise windows when hovering
tap "dimentium/autoraise"
brew "dimentium/autoraise/autoraise"
# Optional tools for audio conversion and local AI
# brew "ffmpeg"
# brew "ollama"
+10
View File
@@ -0,0 +1,10 @@
# Focus and raise on hover without an intentional delay; never warp the cursor.
pollMillis=50
delay=1
requireMouseStop=true
warpX=0
warpY=0
# Hold Control to temporarily suspend hover focus.
disableKey=control
# Do not steal focus during authentication or screenshot selection.
stayFocusedBundleIds="com.apple.SecurityAgent,com.apple.screencaptureui"
@@ -0,0 +1,5 @@
# Single-quote values and escape embedded single quotes without changing backslashes.
computer='{{ .chezmoi.hostname | replace "'" "'\\''" }}'
activation_bytes='{{ pass "self-host/token/audible-activation-bytes" | replace "'" "'\\''" }}'
AQUAAI_KEY='{{ pass "self-host/token/aquaai" | replace "'" "'\\''" }}'
TodoistToken='{{ pass "self-host/token/todoist" | replace "'" "'\\''" }}'
+1 -1
View File
@@ -11,7 +11,7 @@ PanelWindow {
property var battery: UPower.displayDevice
property var hardware
property bool isWayland: Quickshell.env("XDG_SESSION_TYPE") === "wayland"
|| Quickshell.env("WAYLAND_DISPLAY") !== ""
|| (!Quickshell.env("XDG_SESSION_TYPE") && !!Quickshell.env("WAYLAND_DISPLAY"))
anchors {
top: true
-4
View File
@@ -1,4 +0,0 @@
computer={{ .chezmoi.hostname }}
activation_bytes={{ pass "self-host/token/audible-activation-bytes" }}
AQUAAI_KEY={{ pass "self-host/token/aquaai" }}
TodoistToken={{ pass "self-host/token/todoist" }}
+5
View File
@@ -12,3 +12,8 @@
sort = -committerdate
[push]
autoSetupRemote = true
[filter "lfs"]
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
-10
View File
@@ -1,10 +0,0 @@
sh ~/.config/scripts/setup.sh -nr
# Load user settings from config file.
. ~/.config/settings.conf
if [[ $computer == 'w530' ]]; then
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
exec startx
fi
fi
+25
View File
@@ -0,0 +1,25 @@
{{ if eq .chezmoi.os "darwin" -}}
# Initialize Homebrew on Apple Silicon or Intel Macs.
if [[ -x /opt/homebrew/bin/brew ]]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
elif [[ -x /usr/local/bin/brew ]]; then
eval "$(/usr/local/bin/brew shellenv)"
fi
{{ else if eq .chezmoi.os "linux" -}}
if [[ -f "$HOME/.config/scripts/setup.sh" ]]; then
sh "$HOME/.config/scripts/setup.sh" -nr
fi
{{ end }}
# Load user settings from config file.
if [[ -f "$HOME/.config/settings.conf" ]]; then
source "$HOME/.config/settings.conf"
fi
{{ if eq .chezmoi.os "linux" -}}
if [[ $computer == 'w530' ]]; then
if [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
exec startx
fi
fi
{{ end -}}
+42 -13
View File
@@ -5,24 +5,45 @@ setopt PROMPT_SUBST
PROMPT='%F{white}%n% @%m%f %F{blue}%~%f %F{red}${vcs_info_msg_0_}%f$ '
setopt appendhistory autocd extendedglob nomatch notify
setopt hist_ignore_all_dups hist_save_no_dups hist_find_no_dups
unsetopt beep
bindkey -e
zstyle :compinstall filename '~/.zshrc'
# Keep PATH entries unique when shell configuration is sourced again.
typeset -U path PATH
{{ if eq .chezmoi.os "darwin" -}}
# Load Homebrew completions before initializing completion support.
typeset -U fpath
if [[ -n "$HOMEBREW_PREFIX" && -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
fpath=("$HOMEBREW_PREFIX/share/zsh/site-functions" $fpath)
elif [[ -d /opt/homebrew/share/zsh/site-functions ]]; then
fpath=(/opt/homebrew/share/zsh/site-functions $fpath)
elif [[ -d /usr/local/share/zsh/site-functions ]]; then
fpath=(/usr/local/share/zsh/site-functions $fpath)
fi
{{ end -}}
autoload -Uz compinit
compinit
HISTFILE=~/.zsh_history
HISTSIZE=99999999
SAVEHIST=99999999
HISTSIZE=100000
SAVEHIST=50000
source "$HOME/.config/settings.conf"
if [[ -f "$HOME/.config/settings.conf" ]]; then
source "$HOME/.config/settings.conf"
fi
# User scripts
path=("$HOME/bin" $path)
export PATH
# Text Editor
export EDITOR='emacs -nw'
alias emacs="${EDITOR}"
alias e="${EDITOR}"
export TERM=xterm
# Search
alias g='grep -Irn'
@@ -36,16 +57,21 @@ alias dote="${DOT_PROGRAM} edit --apply"
alias dotu="${DOT_PROGRAM} update"
# Other
{{ if eq .chezmoi.os "darwin" -}}
alias i='brew install'
alias d='brew'
{{ else -}}
alias i='sudo dnf install'
alias d='sudo dnf'
alias u='sh ~/bin/update.sh'
{{ end -}}
alias u='bash ~/bin/update.sh'
alias h='cd ~/git/cacolglazier.com/ && hugo server'
# OpenCode
export PATH="$HOME/.opencode/bin:$PATH"
path=("$HOME/.opencode/bin" $path)
OPENCODE='opencode'
alias o="${OPENCODE}"
alias oc="${OPENCODE} --agent commit run 'Create a commit.'"
alias oc="${OPENCODE} run --agent commit --model '{{ includeTemplate ".chezmoitemplates/models/small-brain" | trim }}' 'Create a commit.'"
alias ocr="${OPENCODE} --agent review --prompt 'Code review staged changes.'"
alias or="${OPENCODE} --continue"
@@ -76,11 +102,14 @@ export AQUAAI_RICH_FORMAT_MODE=false
export AQUAAI_KEY
# Daisy build toolkit
GCC_PATH=~/dev/gcc-arm-none-eabi-10-2020-q4-major/bin
export PATH=$GCC_PATH:$PATH
GCC_PATH="$HOME/dev/gcc-arm-none-eabi-10-2020-q4-major/bin"
if [[ -d "$GCC_PATH" ]]; then
path=("$GCC_PATH" $path)
fi
# AM auto complete
autoload bashcompinit
bashcompinit
source "/home/aqua/.local/share/bash-completion/completions/am"
if [[ -f "$HOME/.local/share/bash-completion/completions/am" ]]; then
autoload bashcompinit
bashcompinit
source "$HOME/.local/share/bash-completion/completions/am"
fi
@@ -0,0 +1,19 @@
-----BEGIN PGP MESSAGE-----
hQGMA4qZwZB4gWrxAQv+IYT0PC4dEdl85V1geFnz+xd7nSSpOdyJ1/0QQQ23zOUw
c3sqMRNzzMcSQwHbBOk69QPbF2kW/2W3XsU7qCGnbownr/vaBSrnvx1UxDepd8E3
j1XO0n0o24xBXGZi3xnQBPIJCtjlgNvtREslFz3fgBT8M69gDGynuytn3ZlAM4ni
BmZjnZsz6JKZ76H+mNJ3n6jYZjCbqPVjKyWBiYDRkpVLHntz/OHQCcHfsHpr8CZ2
JgRlqMcwTJGtLVxxZx9eQ6KSkizQvPmy1weqC85NkKkuAENBCUCyh+IJSEpifSyF
ewvOljGDSZOjDL553x+POjVGbtK/U/n162La0kLBQQVJwDSRIIJyTu5/ZLWde12F
mZNObOq4JJzUBbKJtYqRFl51Po3hcWhcXxaDcay7i/MWEesEnsFaKnbCEhJ7FMUa
1+VUQySgU5j9ULxfeaqLYZ2LClA7AGatHt0q1J6UhFSHkBFcmZTjFrlQFjkL2XVu
qvptke90iaepRuMHqTUR0sBpAQT4/pqbDep1npJf11hOwf5ICOPRkJ2Y/iIjZKc7
+d8akX4RlCUfROqsXykZ+W5a+e8gWcsvLGAaeQxUHZ3goNAutrzux2ye9FcQRI3d
pTvu9m/PvoRpYRmx0YgB4VkWVX9Qd9ezderBZIfAcdBfWY8Z1BHPLFyOS/kYoqrv
U/yVkFsXGgOfxRAc+r8HhcCHfMLWXwCoLDmKCMYBPca4psl/oVec4KTkG3nNbaXf
sZ6zxnXv0WuazEIBZSRKSuaN8iQ50LUKh8oxoyzjqg0U/0LshYruanDVk28YXtnx
LTh3jlTAAx6s2VN/ZhJSbnyL2faLfnqwo50GeJQsAt1aI1PZmdbXSB5fthU+XTaW
RWjjMOZELZxkibUtlMchSnZP1gMYBP+rNuFy
=BfV6
-----END PGP MESSAGE-----
+2
View File
@@ -0,0 +1,2 @@
# Host entries are managed in a separately encrypted file.
Include ~/.ssh/config.private