{"id":26550388,"url":"https://github.com/fluxxfield/dotfiles","last_synced_at":"2026-04-11T10:32:44.395Z","repository":{"id":314764494,"uuid":"1056433314","full_name":"FluxxField/dotfiles","owner":"FluxxField","description":"Dotfiles for Linux/macOS/WSL: Stow-managed configs, mise runtimes \u0026 globals, Neovim via releases (stable/nightly), startup checks, Windows Terminal sync, fonts via manifest.","archived":false,"fork":false,"pushed_at":"2025-09-22T14:17:33.000Z","size":139,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-03T14:32:10.983Z","etag":null,"topics":["bootstrap","developer-environment","dotfiles","fonts","gnu-stow","lazygit","linux","macos","mise","neovim","nerd-fonts","nvim","setup-scripts","starship","stow","terminal","version-manager","windows-terminal","wsl","zsh"],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FluxxField.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-14T04:42:05.000Z","updated_at":"2025-09-22T14:17:37.000Z","dependencies_parsed_at":"2025-09-14T17:38:36.605Z","dependency_job_id":"655777e0-2995-4cfc-804d-04d9603a926b","html_url":"https://github.com/FluxxField/dotfiles","commit_stats":null,"previous_names":["fluxxfield/dotfiles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/FluxxField/dotfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluxxField%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluxxField%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluxxField%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluxxField%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FluxxField","download_url":"https://codeload.github.com/FluxxField/dotfiles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FluxxField%2Fdotfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31677813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T08:18:19.405Z","status":"ssl_error","status_checked_at":"2026-04-11T08:17:08.892Z","response_time":54,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bootstrap","developer-environment","dotfiles","fonts","gnu-stow","lazygit","linux","macos","mise","neovim","nerd-fonts","nvim","setup-scripts","starship","stow","terminal","version-manager","windows-terminal","wsl","zsh"],"created_at":"2025-03-22T07:34:40.677Z","updated_at":"2026-04-11T10:32:44.387Z","avatar_url":"https://github.com/FluxxField.png","language":"Lua","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dotfiles (Stow + mise + smart installers)\n\nManage a full dev environment across Linux, macOS, and WSL2 using:\n\n* **GNU Stow** for clean, reversible symlinks\n* **mise** for versioned runtimes and global packages (Node, Go, Rust + `npm:` and `cargo:` backends)\n* **Neovim** installed from GitHub releases (stable/nightly) with easy switching\n* Linux install policy: **apt → mise → fallback**\n* Optional **Neovim config via git subtree** (keep your nvim repo separate but vendor it here)\n* **Startup checks/upgrades** (apt/brew/mise) + `fastfetch`, with safe caching\n* Shared **fonts manifest** for Windows \u0026 Linux installs\n* WSL niceties, host overlays, and idempotent bootstrap\n\n---\n\n## Quick start (fresh machine)\n\n\u003e If you clone to a different path than `~/.dotfiles`, update the `.zshrc` startup hook accordingly.\n\n```bash\ncd ~\ngit clone git@github.com:YOURUSER/dotfiles.git .dotfiles\ncd .dotfiles\n\n# (Optional, one-time per repo) vendor your Neovim config via subtree\n# scripts/nvim-subtree.sh init git@github.com:YOURUSER/your-nvim-repo.git main\n\n# Install tooling, mise, global toolchains \u0026 packages, fonts (by default), Neovim stable, etc.\nbash bootstrap.sh\n\n# Symlink all configs (zsh, git, nvim, starship, env, etc.)\n./stow-all.sh\n\n# Open a NEW terminal so mise activation \u0026 PATH apply\n```\n\n**Smoke test**\n\n```bash\nnvim --version | head -n1\nnode -v \u0026\u0026 npm -v \u0026\u0026 go version\nlazygit --version\n```\n\n---\n\n## Migrating an existing machine (safe adoption)\n\nImport your current dotfiles into this repo without losing anything:\n\n```bash\ncd ~ \u0026\u0026 git clone git@github.com:YOURUSER/dotfiles.git .dotfiles \u0026\u0026 cd .dotfiles\n\n# See what would change\nmake adopt-dry              # or: scripts/adopt-existing.sh --dry-run zsh nvim git\n\n# Adopt: backs up conflicts to ./.migration_backups/, moves files into packages, then symlinks\nmake adopt                  # or: scripts/adopt-existing.sh zsh nvim git\n\ngit add -A \u0026\u0026 git commit -m \"adopt: import existing dotfiles\"\n\n# Install/refresh tooling and stow\nbash bootstrap.sh\n./stow-all.sh\n```\n\n### Merge your existing files with repo versions\n\nAfter `make adopt`, compare your repo files with the backups and merge differences:\n\n```bash\n# Use nvimdiff (default):\nmake adopt-merge\n\n# Or explicitly choose a tool:\nMERGE_TOOL=meld make adopt-merge\nMERGE_TOOL=code make adopt-merge\n```\n\nWhat it does:\n\n* Uses the **latest** `.migration_backups/\u003ctimestamp\u003e/` snapshot.\n* For each package, opens a 2-way diff: **repo** vs **backup**.\n* Save your reconciled file in the repo; it auto-stages. Commit when done:\n\n  ```bash\n  git commit -m \"merge: reconcile adopted configs\"\n  ```\n\n\u003e `make adopt-dry` / `make adopt` will **auto-install GNU Stow** if missing (apt on Linux, Homebrew on macOS) and require a build with `--adopt`.\n\n---\n\n## What this repo sets up\n\n* **Shell \u0026 CLI**\n\n  * `zsh` + **Starship** prompt\n  * `ripgrep`, `fzf`, `fd`, `bat`, `lazygit` (via smart installer)\n  * `fastfetch` summary on shell start (opt-in auto-upgrades)\n\n* **Runtimes \u0026 globals (via mise)**\n\n  * `rust@latest`, `node@lts`, `go@latest`\n  * `npm:npm@latest`, `npm:prettier`\n  * `cargo:ripgrep-all` (example; extend as you like)\n\n* **Neovim**\n\n  * Installed from GitHub release tarballs on Linux (stable/nightly channels)\n  * Easy switching via symlink (`~/.local/bin/nvim`)\n  * On macOS, uses Homebrew stable or `--HEAD` for nightly\n\n* **Config management**\n\n  * Stowed packages under `stow/` (`zsh`, `nvim`, `git`, `starship`, `env`, etc.)\n  * Host overlays: `stow/hosts/@common`, `stow/hosts/$(hostname)`, `stow/hosts/wsl`\n\n* **Fonts**\n\n  * Shared manifest at `fonts/manifest.json` drives installs on both Windows \u0026 Linux\n\n---\n\n## Fonts (shared manifest for Windows \u0026 Linux)\n\nConfigure once in `fonts/manifest.json`:\n\n```json\n{\n  \"nerd_fonts\": [\"JetBrainsMono\", \"FiraCode\"],\n  \"include_symbols\": false,\n  \"extra_urls\": [],\n  \"local_dir\": \"fonts/local\"\n}\n```\n\n**Windows (per-user fonts)**\n\n```powershell\npwsh -NoProfile -ExecutionPolicy Bypass -File (Join-Path $HOME '.dotfiles/scripts/win/install-fonts.ps1')\n```\n\nThen set your Windows Terminal profile:\n\n```json\n\"fontFace\": \"JetBrainsMono Nerd Font\"\n```\n\n**Linux / WSL (for WSLg GUI apps \u0026 Linux terminals)**\n\n```bash\nscripts/install-fonts-linux.sh\n```\n\nInstalls into `~/.local/share/fonts/NerdFonts/...` and refreshes with `fc-cache`.\n\n**Fonts during bootstrap**\n\n* By default, `bootstrap.sh` installs fonts from `fonts/manifest.json`.\n* **Linux/WSL:** installs to `~/.local/share/fonts` and refreshes cache.\n* **WSL2:** also calls the Windows installer via PowerShell.\n* Skip on a machine:\n\n  ```bash\n  DOTFILES_INSTALL_FONTS=0 bash bootstrap.sh\n  # or set in ~/.config/dotfiles/env.sh:\n  # export DOTFILES_INSTALL_FONTS=0\n  ```\n\n---\n\n## Repo layout\n\n```\n.dotfiles/\n├── README.md\n├── Makefile\n├── bootstrap.sh\n├── stow-all.sh\n├── fonts/\n│   ├── manifest.json          # shared list of fonts for both OSes\n│   └── local/                 # optional: extra .ttf/.otf you track\n├── packages/\n│   ├── apt.txt                # safe defaults on Linux; avoid version-critical stuff here\n│   └── brew-Brewfile          # optional; brew bundle if you want\n├── scripts/\n│   ├── detect-os.sh\n│   ├── install-apt.sh\n│   ├── install-brew.sh\n│   ├── install-mise.sh\n│   ├── mise-setup-globals.sh\n│   ├── nvim-manager.sh\n│   ├── nvim-subtree.sh\n│   ├── set-default-shell-zsh.sh\n│   ├── wsl-post.sh\n│   ├── smart-install.sh\n│   ├── startup.sh\n│   ├── merge-from-backup.sh\n│   ├── install-fonts-linux.sh\n│   └── win/\n│       ├── install-fonts.ps1\n│       └── sync-windows-terminal.ps1\n└── stow/\n    ├── zsh/                   # .zshrc (sources ~/.config/dotfiles/env.sh, runs startup hook)\n    ├── git/                   # .gitconfig, .gitignore_global, aliases\n    ├── nvim/                  # .config/nvim (can be a subtree of your separate nvim repo)\n    ├── starship/              # .config/starship.toml\n    ├── env/                   # .config/dotfiles/env.sh (env vars; stowed and sourced by .zshrc)\n    └── hosts/\n        ├── @common/           # overlay on all machines\n        ├── $(hostname)/       # machine-specific overlay\n        └── wsl/               # WSL overlay\n```\n\n---\n\n## Makefile targets\n\n```text\nbootstrap              Install base tooling, fonts (configurable), mise + globals, Neovim, etc.\nlink / unlink / restow Stow, unstow, or restow all packages\nadopt-dry / adopt      Dry-run or adopt existing files into repo (backs up conflicts)\nadopt-merge            Interactively merge repo files with latest backup snapshot\nmise-globals           Re-apply global mise toolchains and packages\nnvim-stable            Install + switch to Neovim stable\nnvim-nightly           Install + switch to Neovim nightly\nnvim-switch-stable     Switch symlink to stable (Linux)\nnvim-switch-nightly    Switch symlink to nightly (Linux)\nnvim-subtree-pull      Pull latest nvim config from upstream subtree remote\nnvim-subtree-push      Push changes in subtree back to upstream\nfonts-linux            Install fonts per manifest on Linux/WSL\nfonts-windows          Install fonts per manifest on Windows\ndoctor                 Quick tool presence checks\n```\n\n---\n\n## Neovim: binary + config\n\n### Binary install/switch\n\n* **Linux:** tarballs installed to `~/.local/nvim/{stable,nightly}`, with `~/.local/bin/nvim` symlink\n* **macOS:** Homebrew stable; nightly via `brew install --HEAD neovim`\n\n```bash\n# Install/switch stable\nmake nvim-stable\n# Install/switch nightly\nmake nvim-nightly\n# Switch back and forth (Linux)\nmake nvim-switch-stable\nmake nvim-switch-nightly\n```\n\n### Config via git subtree (keep your nvim repo separate)\n\nOne-time setup (run once in the dotfiles repo):\n\n```bash\nscripts/nvim-subtree.sh init git@github.com:YOURUSER/your-nvim-repo.git main\ngit push\n```\n\nAuto-update on bootstrap: `bootstrap.sh` runs `scripts/nvim-subtree.sh pull --auto` (no-op if unconfigured).\nManual:\n\n```bash\nmake nvim-subtree-pull   # update vendored config from upstream\nmake nvim-subtree-push   # publish local changes back to upstream\n```\n\n---\n\n## Startup checks / upgrades (and `fastfetch`)\n\nEvery interactive shell runs:\n\n```\n~/.dotfiles/scripts/startup.sh --auto\n```\n\nDefault behavior (safe/fast):\n\n* APT/Homebrew/mise checked on a **24h** cache (tweak via `DOTFILES_STARTUP_INTERVAL_HOURS`)\n* No password prompts (skips upgrades if sudo isn’t cached)\n* Prints a brief status and then runs **fastfetch** (or **neofetch**, or a tip to install)\n\nEnable auto-upgrades on login (noninteractive) in `~/.config/dotfiles/env.sh`:\n\n```bash\nexport DOTFILES_STARTUP_AUTO_UPGRADE=1\nexport DOTFILES_STARTUP_INTERVAL_HOURS=8   # optional, default 24\n```\n\nManual full run (allows sudo prompts):\n\n```bash\nDOTFILES_STARTUP_AUTO_UPGRADE=1 ~/.dotfiles/scripts/startup.sh\n```\n\n---\n\n## Linux install policy: **apt → mise → fallback**\n\n* **apt first** for stable, non-version-critical packages (e.g., ripgrep, fzf, starship, lazygit if new enough).\n* **mise** for version-controlled toolchains and **backends**:\n\n  * Toolchains: `rust@latest`, `node@lts`, `go@latest`\n  * Global packages: `npm:prettier`, `npm:npm@latest`, `cargo:ripgrep-all`, etc.\n* **Fallback** for:\n\n  * Official scripts/binaries (e.g., Starship, lazygit releases) when needed\n  * `go install ...@latest` if appropriate\n\nThe helper script `scripts/smart-install.sh` applies this policy and exposes flags like `--min-version`.\n\n---\n\n## Environment variables\n\nCreate or edit `~/.config/dotfiles/env.sh` (stowed from `stow/env`), e.g.:\n\n```bash\n# Auto-upgrade on login (apt/brew/mise) – default is 0 (off)\nexport DOTFILES_STARTUP_AUTO_UPGRADE=0\n\n# Cache window for startup checks (hours)\nexport DOTFILES_STARTUP_INTERVAL_HOURS=24\n\n# Fonts during bootstrap (Linux + Windows via WSL): 1=install, 0=skip\nexport DOTFILES_INSTALL_FONTS=1\n\n# Add anything else global you want here:\n# export EDITOR=\"nvim\"\n```\n\n`.zshrc` sources this file **before** running the startup hook, and also runs:\n\n```zsh\nif [ -t 1 ] \u0026\u0026 [ -x \"$HOME/.dotfiles/scripts/startup.sh\" ]; then\n  \"$HOME/.dotfiles/scripts/startup.sh\" --auto || true\nfi\n```\n\n---\n\n## Windows Terminal settings\n\nKeep your Windows Terminal JSONs in the repo and sync them:\n\n```\nwin/windows-terminal/\n  settings.json\n  schemes.json\nscripts/win/sync-windows-terminal.ps1\n```\n\nRun:\n\n```powershell\npwsh -NoProfile -ExecutionPolicy Bypass -File (Join-Path $HOME '.dotfiles/scripts/win/sync-windows-terminal.ps1')\n# add -Mode Symlink if you prefer live-linking (requires Dev Mode or admin)\n```\n\n---\n\n## Script reference\n\n### `bootstrap.sh`\n\nIdempotent setup: installs Stow, runs `install-apt.sh` (Linux), **installs fonts** (Linux + Windows via WSL by default), installs mise \u0026 globals, pulls Neovim subtree (if configured), installs Neovim stable, runs smart installers (starship/lazygit), and prints next steps.\n\n### `stow-all.sh`\n\nStows all packages under `stow/`, then overlays `hosts/@common`, `hosts/$(hostname)`, and `hosts/wsl` (if detected).\n\n### `scripts/install-apt.sh`\n\nInstalls safe defaults from `packages/apt.txt` (includes `fontconfig` and `unzip` for fonts). Adds QoL aliases (e.g., `batcat`→`bat`, `fdfind`→`fd`) if needed.\n\n### `scripts/install-brew.sh`\n\nInstalls Homebrew on macOS if missing and wires shell env. Use `brew bundle` with `packages/brew-Brewfile` if you want.\n\n### `scripts/install-mise.sh`\n\nOfficial installer (adds activation to your `~/.zshrc`):\n\n```bash\ncurl -fsSL https://mise.run/zsh | sh\n```\n\n### `scripts/mise-setup-globals.sh`\n\nApplies global toolchains and packages:\n\n```bash\nmise use -g -y rust@latest\nmise use -g -y node@lts\nmise use -g -y go@latest\nmise use -g -y npm:npm@latest\nmise use -g -y npm:prettier\nmise use -g -y cargo:ripgrep-all\nmise reshim\n```\n\n### `scripts/nvim-manager.sh`\n\nInstall/switch Neovim channels.\n\n```\nUsage: nvim-manager.sh {install|switch|current} {stable|nightly}\n\nLinux:\n  install stable   # download tarball to ~/.local/nvim/stable\n  install nightly  # download tarball to ~/.local/nvim/nightly\n  switch stable    # symlink ~/.local/bin/nvim -\u003e stable\n  switch nightly   # symlink ~/.local/bin/nvim -\u003e nightly\n  current          # show current symlink target\n\nmacOS:\n  install stable   # brew install neovim\n  install nightly  # brew install --HEAD neovim\n  switch ...       # (advisory) PATH determines which brew nvim wins\n  current          # prints nvim version\n```\n\n### `scripts/nvim-subtree.sh`\n\nManage your separate Neovim repo as a subtree under `stow/nvim/.config/nvim`.\n\n```\nUsage:\n  nvim-subtree.sh init \u003crepo-url\u003e [branch]  # one-time add\n  nvim-subtree.sh pull [--auto]             # update subtree from upstream\n  nvim-subtree.sh push                      # publish changes upstream\n\nRepo-local config:\n  subtree.nvim.remote (default: nvim-origin)\n  subtree.nvim.url\n  subtree.nvim.branch (default: main)\n```\n\n### `scripts/adopt-existing.sh`\n\nSafely import legacy dotfiles into this repo. **Auto-installs Stow** if missing.\n\n```\nUsage:\n  adopt-existing.sh             # adopt all packages\n  adopt-existing.sh zsh nvim    # adopt selected packages\n  adopt-existing.sh --dry-run   # show changes only\n\nBehavior:\n  - Backs up real files that would be replaced to ./.migration_backups/\u003cts\u003e/\u003cpkg\u003e/\n  - Uses `stow --adopt` to move your existing files into package dirs\n  - Restows to create symlinks\n```\n\n### `scripts/merge-from-backup.sh`\n\nInteractively merge repo files with the latest backup snapshot from adoption.\n\n```\nUsage:\n  MERGE_TOOL=nvimdiff|meld|code scripts/merge-from-backup.sh [pkg...]\n```\n\n### `scripts/smart-install.sh`\n\nImplements **apt → mise → fallback** installation policy.\n\n```\nUsage examples:\n  smart-install.sh starship\n  smart-install.sh lazygit --min-version 0.41.0\n  smart-install.sh \"npm:prettier\"\n  smart-install.sh \"cargo:ripgrep-all\"\n```\n\n### `scripts/startup.sh`\n\nCached checks/upgrades + `fastfetch`. **Won’t block your prompt** in `--auto`.\n\n```\nUsage:\n  startup.sh [--auto]\n\nEnv:\n  DOTFILES_STARTUP_INTERVAL_HOURS=24\n  DOTFILES_STARTUP_AUTO_UPGRADE=0|1\n```\n\n### `scripts/install-fonts-linux.sh`\n\nInstalls fonts listed in `fonts/manifest.json` into `~/.local/share/fonts`, then runs `fc-cache`.\n\n### `scripts/win/install-fonts.ps1`\n\nInstalls fonts listed in `fonts/manifest.json` into the per-user Windows fonts folder and refreshes font cache.\n\n### `scripts/win/sync-windows-terminal.ps1`\n\nCopies or symlinks `win/windows-terminal/settings.json` into the correct Windows Terminal directory.\n\n### `scripts/detect-os.sh`\n\nExports `OS` (`linux`|`mac`) and `WSL` (`1` if WSL detected).\n\n### `scripts/set-default-shell-zsh.sh`\n\nIf `zsh` exists, sets it as the login shell via `chsh` (best-effort; safe to fail).\n\n### `scripts/wsl-post.sh`\n\nWSL niceties: clipboard tool, Git line endings (`core.autocrlf=input`), and optional `win32yank.exe` shim for Neovim clipboard.\n\n---\n\n## Host overlays\n\n* `stow/hosts/@common/` stows after your base packages\n* `stow/hosts/$(hostname)/` stows after `@common`\n* `stow/hosts/wsl/` stows last on WSL\n\nPut machine-specific tweaks (aliases, term settings, etc.) into the appropriate overlay and re-run `./stow-all.sh`.\n\n---\n\n## Troubleshooting\n\n* **`nvim` wrong binary** → Ensure `~/.local/bin` is early in `PATH` (set in `.zshrc`).\n* **`mise` not recognized after bootstrap** → Open a new shell (installer adds activation to your `~/.zshrc`) or `source ~/.zshrc`.\n* **`git subtree` missing** → Linux: `sudo apt install git-subtree` (in `packages/apt.txt`). macOS: `brew install git`.\n* **Startup upgrades blocking prompt** → They won’t in `--auto`. To do real upgrades, set `DOTFILES_STARTUP_AUTO_UPGRADE=1`. For immediate full upgrades with prompts, run `~/.dotfiles/scripts/startup.sh` without `--auto`.\n* **Nightly Neovim download fails** → Check CPU arch handling in `nvim-manager.sh`; open an issue to add your arch if needed.\n\n---\n\n## Contributing / customizing\n\n* Add more stow packages under `stow/\u003cname\u003e/` mirroring `$HOME` paths.\n* Extend `mise-setup-globals.sh` with more `npm:` or `cargo:` globals and tool pins.\n* Layer host-specific overrides in `stow/hosts/`.\n* Tweak `packages/apt.txt` as you like; keep version-critical stuff out (we use mise for that).\n\n---\n\nHappy dotfiling ✨\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluxxfield%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluxxfield%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluxxfield%2Fdotfiles/lists"}