Cross-platform dotfiles — one setup, every machine: Ubuntu (native and WSL2), macOS (Intel / Apple Silicon), Windows, and QNAP NAS. Most dotfiles repos stop at macOS.
install.sh / install.ps1 sets up shell, editor, git, and prompt configuration across Ubuntu (native and WSL2), macOS (Intel and Apple Silicon), Windows, and even QNAP NAS. A single ~/.profile_common drives all Unix variants; OS detection branches automatically with no hardcoded platform paths.
nirecom/agents is a standalone Claude Code framework that pairs naturally with this repo:
- Hook-enforced workflow — encodes research → plan → write-tests → code → run-tests → security-review → docs → user-verification as a per-session state machine; a PreToolUse hook physically blocks
git commituntil every step completes. - Cross-machine session continuity — normalizes project paths to drive-root form and syncs
~/.claude/projects/through a private GitHub repo, so a conversation started on Windows resumes on macOS/Linux. - Standards-backed testing and security — concrete test categories (Normal, Error, Edge, Idempotency, Security) with explicit OWASP ASVS V8, CWE Top 25, OWASP LLM Top 10 citations; test-layer selection follows Martin Fowler's narrow/broad integration distinction.
- TDD via subagent isolation — test writing runs in an autonomous
mode: "auto"subagent restricted to test files only; confirmations drop from O(N) edits to two. - Private information scanning — dual-checkpoint (pre-commit hook + Claude Code PreToolUse hook) scanning for IP addresses, secrets, local paths, and Trojan Source Unicode.
When the agents repo is cloned as a sibling of the dotfiles repo (e.g. ~/git/dotfiles and ~/git/agents), the dotfiles installer wires it in automatically. The dotfiles-private repo follows the same sibling convention.
- Ubuntu (native or WSL2)
- macOS (Intel / Apple Silicon)
- Windows (native, for git config and editorconfig)
- QNAP NAS (minimal set via Entware)
| Tool | Purpose |
|---|---|
bash |
install.sh and all install/linux/*.sh scripts |
git |
Repo clone; symlinks reference repo paths |
curl |
Bootstrap fetches (nvm, uv, starship, awscli installers) |
sudo access is required for apt/Homebrew installs (
--baseand above).
| Tool | Purpose |
|---|---|
| PowerShell 5+ (7+ recommended) | install.ps1 and all install/win/*.ps1 |
winget |
All Windows package installs (fnm, pwsh, starship, uv, vscode, …) |
Symlink creation requires Developer Mode (Settings → System → For developers) or Administrator privileges.
| Tool | Purpose |
|---|---|
Entware (opkg) |
Install git, bash, vim-full, curl before clone (see Install § QNAP) |
| Linux | Windows | Adds |
|---|---|---|
--base |
-Base |
zsh, vim, tmux, starship, source-highlight, AWS CLI v2, Google Japanese Input, AutoHotkey v2, PowerToys |
--develop |
-Develop |
uv (Python), VS Code + extensions, Claude Tabs, Claude Usage Widget |
--full |
-Full |
All of the above + Visual Studio C++ build tools (Windows) |
Note: no-flag install also sets up Node.js (nvm on Linux/macOS, fnm on Windows). nvm is pinned to v0.40.4 (install/linux/nvm.sh).
# Clone anywhere (e.g. ~/dotfiles, ~/git/dotfiles, ~/work/dotfiles).
# The `agents` and `dotfiles-private` repos must be siblings of this one.
git clone git@github.com:nirecom/dotfiles.git ~/git/dotfiles
cd ~/git/dotfiles
./install.sh # Symlinks only
./install.sh --base # Symlinks + base packages
./install.sh --develop # Symlinks + dev tools
./install.sh --full # Symlinks + base + dev toolsinstall.sh resolves its own location and writes ~/.dotfiles_env so login shells (.bash_profile, .zshrc) can find the repo regardless of where it was cloned.
git clone https://github.com/nirecom/dotfiles.git $HOME\dotfiles
cd $HOME\dotfiles
.\install.ps1 # Symlinks only
.\install.ps1 -Base # Symlinks + base packages
.\install.ps1 -Develop # Symlinks + dev tools
.\install.ps1 -Full # Symlinks + base + dev toolsRequires Developer Mode (Settings > System > For developers) or Administrator privileges. On PowerShell 5, the execution policy is automatically set to RemoteSigned via the registry.
Initial setup:
- Install Entware from QNAP App Center
- Install required packages:
opkg install git git-http bash vim-full curl - Clone and install (any location works; QNAP defaults to
~/dotfiles):QNAP is auto-detected — only the minimal symlink set is deployed.git clone git@github.com:nirecom/dotfiles.git ~/dotfiles cd ~/dotfiles ./install.sh
- Enable the Entware QPKG:
sudo /sbin/setcfg Entware Enable TRUE -f /etc/config/qpkg.conf
Post-reboot auto-recovery: QTS automatically runs the Entware startup script (Entware.sh start) for enabled QPKGs, which creates the /opt symlink to the Entware installation on the storage volume. Packages persist across reboots.
autorun.sh fallback: dotfileslink.sh deploys autorun.sh to the flash config partition via hal_app. Enable "Run user defined startup processes" in QNAP Control Panel > Hardware > General (one-time manual step, required on QTS 4.3.3+). This handles auto-recovery if Entware is removed by a firmware update.
dotfiles/
├── .config/
│ ├── git/ # Git config and global gitignore
│ ├── starship.toml # Starship prompt (Linux/macOS)
│ └── starship-powershell.toml # Starship prompt (Windows)
├── .emacs.d/ # Emacs config
├── bin/ # OS detection, tmux launch, VS Code window utilities
├── config/
│ └── vscode-extensions.txt # VS Code extensions (shared across platforms)
├── docs/ # Architecture and history documentation
├── source-highlight/ # GNU source-highlight config
├── install/
│ ├── linux/ # Linux/macOS install scripts
│ ├── win/ # Windows install scripts
│ └── qnap/ # QNAP NAS install scripts
├── install.sh # Unified installer (Linux/macOS)
├── install.ps1 # Unified installer (Windows)
├── .bash_profile
├── .editorconfig
├── .inputrc
├── .profile_common # Shared shell config (aliases, PATH, tools)
├── .profile_qnap # QNAP sh-to-bash bootstrap
├── .tmux.conf
├── .vimrc
└── .zshrc