Skip to content
Projects

gantoreno/gfiles has 34 GitHub stars and 0 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-10 00:24 UTC. Last push 2026-11-04.

How these counts are measured

👨🏻‍💻 Gabriel's (me) personal dotfiles

Measured star growth

in 24h
0
in 7 days
Collecting history
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

README.md

Original

Gfiles icon

Gfiles

Issues Forks Stars License

My personal macOS and Linux dotfiles for a small, terminal-first development environment. The repository is intentionally focused on the configuration I actively use, with Git as the source of truth and mise installing tools and linking configuration into my home directory.

[!NOTE]

This is a personal setup, not a universal installer. The bootstrap targets Apple Silicon macOS and glibc-based Linux on x86_64 or arm64. The examples use a clone at ~/Developer/gantoreno/gfiles, but the repository can live elsewhere. Review the files before using them on another machine.

Setup

The shell activates mise and zoxide. On the hosts named forge and atlas, it also runs Fastfetch at startup and uses the Starship prompt; other hosts keep the Robby Russell theme. Mise selects the Node, Python, Go, Rust, Java, Bun, and pnpm versions; fnm, SDKMAN activation, and direnv hooks are no longer needed.

Tracked configuration

The repository mirrors the home directory: each path below is the same here and under ~.

Path Purpose
.zshenv Mise shims for non-interactive shells
.zshrc Interactive shell, PATH, plugins, and aliases
.tmux.conf tmux behavior, navigation, and theme
.config/ghostty Terminal appearance and window defaults
.config/nvim LazyVim configuration and plugin lockfile
.config/opencode OpenCode provider, model, and MCP configuration
.omp/agent/config.yml Oh My Pi appearance and preferences
.config/ollama/Modelfile.qwen3.5-4b-16k Reproducible local coding-model preset
.config/mise/config.toml Personal tool versions and mise settings
.config/herdr/config.toml herdr theme, UI, and notification settings
.claude/settings.json Claude Code permissions, plugins, hooks, and preferences
.claude/hooks Claude Code hook scripts, including the herdr session hook

Installation

Install mise 2026.10.17 or newer and Git first; it bundles updated root certificates. On macOS, brew install mise git is sufficient. On Linux, follow the mise installation instructions and install Git and the native build prerequisites for your distribution. The standard mise installer puts the executable in ~/.local/bin; add that directory to PATH before continuing.

Node's prebuilt Linux binaries also load libatomic.so.1, which minimal Debian and Ubuntu installs omit. Without it, Node fails to install, mise skips the npm-based tools that depend on it (Vercel CLI and OpenCode), and bootstrap stops before its hooks run. Install it first; other distributions package it as libatomic:

sudo apt install libatomic1

Then clone the repository and bootstrap:

git clone https://github.com/gantoreno/gfiles.git \
  "$HOME/Developer/gantoreno/gfiles"
cd "$HOME/Developer/gantoreno/gfiles"

mise trust mise.toml
mise trust .config/mise/config.toml
mise bootstrap --dry-run
mise bootstrap

Bootstrap installs the declared native packages, clones Oh My Zsh and TPM, creates the dotfile links, installs the development tools, and then runs two hooks: TPM installs the tmux plugins, and herdr installs the herdr-auto-title plugin if it is not registered. On Linux, a hook after the native packages also generates the en_US.UTF-8 locale for Homebrew's glibc. Open a new Zsh shell afterward.

On Linux, bootstrap does not change your login shell, and the Zsh it installs lives under the Linuxbrew prefix, outside the default PATH. Until Zsh is the login shell, .zshrc never runs: mise is not activated, so installed tools such as claude are not on PATH, and the cc alias falls through to the system C compiler. Register Zsh as a login shell, select it, and log in again:

echo /home/linuxbrew/.linuxbrew/bin/zsh | sudo tee -a /etc/shells
chsh -s /home/linuxbrew/.linuxbrew/bin/zsh

mise.toml declares native packages, cloned repositories, dotfile destinations, and setup hooks. .config/mise/config.toml declares personal tool defaults and is linked into ~/.config/mise/config.toml, making them available from any directory. Project-specific mise configurations can override those defaults.

The native brew: package installer is built into mise and supports both target platforms; a separate Homebrew CLI is not required on Linux. Existing Homebrew packages count as installed. Bootstrap installs missing packages without upgrading existing ones. Prefix creation on Linux may require sudo. Native packages follow their package source's available versions.

Homebrew's Linux bottles are built on Ubuntu 24.04 and can require glibc up to 2.39. On older hosts, such as Ubuntu 22.04 (glibc 2.35), they fail with version `GLIBC_2.38' not found. Homebrew adds its own glibc in that case, but mise's installer does not, so mise.toml declares brew:glibc on every Linux host. Brewed programs then load Homebrew's glibc through /home/linuxbrew/.linuxbrew/lib/ld.so. Mise skips glibc's locale setup step, so the hook generates en_US.UTF-8; without it, tmux exits with invalid LC_ALL, LC_CTYPE or LANG.

Tools and updates

The declared tools cover the terminal environment in this repository: language runtimes, pnpm, Yarn (classic), uv, lazygit, zoxide, ripgrep, fd, fzf, GitHub CLI, herdr, Vercel CLI, 1Password CLI, aws-mfa, Codex CLI, Claude Code, OpenCode, and Oh My Pi, plus Git, GCC, Zsh, Starship, Fastfetch, tmux, Neovim, and Ollama as native packages. Neovim is installed by mise bootstrap through brew:neovim, and its configuration is linked to ~/.config/nvim. Existing Neovim installations, including Homebrew HEAD builds, are preserved. OpenCode uses the same @opencode/cli npm distribution as the original setup. aws-mfa is installed with the pipx backend, which uses the declared uv. This is a curated tool list, not a snapshot of every application installed on the Mac.

The brew:gcc package uses versioned executables on both macOS and Linux, such as gcc-16 and g++-16. It does not provide an unversioned gcc command. Check with gcc-16 --version (adjust the suffix for the installed major version), and select it for builds with CC=gcc-16 CXX=g++-16. On macOS, /usr/bin/gcc is Apple Clang.

If the versioned command is also missing, open a new Zsh shell and run mise bootstrap packages status from this repository to check whether brew:gcc was installed. Run mise bootstrap to install missing packages; mise install only installs the development tools.

From the repository root:

mise install                      # Install missing development tools
mise bootstrap packages status    # Inspect native package state
mise bootstrap repos update       # Pull Oh My Zsh and TPM
mise outdated                     # See available development-tool updates
mise upgrade                      # Install them; old versions are pruned later
herdr plugin update --yes         # Rebuild herdr plugins from their latest commits
mise run check                    # Check shell syntax

Rust uses mise's built-in rustup integration and includes Cargo, rustfmt, and Clippy. rust = "latest" selects the newest installed stable release; run mise upgrade rust to install updates. Project rust-toolchain and rust-toolchain.toml files are enabled and can override that personal default. Downloading toolchains or uncached Cargo dependencies requires internet access; installed toolchains and cached dependencies work offline.

Development tools track latest, except Node (lts), Java (the jetbrains-jcef-21 runtime), and Yarn (1, classic). Mise resolves these to the newest installed match, so a machine stays on its current versions until mise upgrade runs; a fresh machine gets the newest releases available at install time, so two machines can differ. To add a tool, run mise use --path .config/mise/config.toml TOOL@latest, then review the config diff. Add system packages to [bootstrap.packages] in mise.toml.

Dotfiles

Mise creates explicit file and directory symlinks from the [dotfiles] table in mise.toml; only listed paths are linked. Whole-directory links mean files an application creates in ~/.config/nvim, ~/.config/ghostty, or ~/.config/opencode land in this repository.

mise bootstrap dotfiles apply --dry-run
mise bootstrap dotfiles apply
mise bootstrap dotfiles status

Existing real files or directories at a target cause a conflict. Back them up outside the target path before applying; the normal setup does not force replacements. Existing links pointing elsewhere are replaced. To remove a link while preserving its source, use mise bootstrap dotfiles unapply '~/.config/nvim' from the repository root. Keep the checkout in place while its links are in use.

Local coding with Oh My Pi

Install a current Ollama release and start its local service. On macOS, an existing Homebrew installation can be updated with brew upgrade ollama followed by brew services restart ollama. Then, from this repository:

mise run ollama-coder

The task downloads Qwen3.5 4B in Q4_K_M quantization (about 3.3 GB) and creates qwen3.5:4b-16k with a 16,384-token context window. Downloads require internet access; inference and local file/command tools work offline afterward. Model weights stay in Ollama's machine-local storage.

Open a new shell and run ompl, or run omp directly. The explicit command is:

omp --model ollama/qwen3.5:4b-16k

Oh My Pi discovers Ollama automatically; no custom provider configuration is needed. The only model preference is the default local Qwen model. Web tools, MCP discovery, skills, reasoning, background roles, fallback, and update checks use Oh My Pi's defaults. Qwen inference runs on the Mac with or without an internet connection; online integrations need connectivity independently.

After a session, release the model's memory immediately with:

ollama stop qwen3.5:4b-16k

Only config.yml is linked into ~/.omp/agent; sessions, databases, caches, and credentials stay machine-local. Back up an existing real configuration file before first applying the link with mise bootstrap dotfiles apply.

Machine-specific setup

  • Install Ghostty, VS Code, and other desktop applications separately for each OS. The shell uses Neovim as its editor when code is unavailable.
  • Bootstrap installs tmux plugins; inside tmux, prefix + I does the same and prefix + U updates them. LazyVim installs its plugins when Neovim starts.
  • Ollama's service and models are separate from its CLI installation. The configured qwen3:1.7b-8k model must exist on the target machine.
  • The OpenCode configuration contains a machine-specific Pencil MCP executable path. Update or disable that entry on another machine.
  • Claude Code writes ~/.claude/settings.json itself when you toggle plugins, change permissions, or choose "always allow", so those changes appear as diffs in this repository. Only that file and hooks/ are linked; sessions, history, credentials, and settings.local.json stay machine-local. Running Claude Code inside this repository also loads .claude/settings.json as project settings; .claude/settings.local.json is ignored here.
  • .claude/hooks/herdr-agent-state.sh is managed by herdr and is overwritten when the integration is reinstalled. It exits without doing anything outside a herdr pane.
  • Herdr writes ~/.config/herdr/config.toml itself when you finish onboarding or change options in Settings, so those changes appear as diffs in this repository. Its theme follows the terminal's light/dark appearance (auto_switch); choosing a theme manually in Settings turns that off. Only that file is linked; sockets, logs, sessions, and plugins stay machine-local.
  • Herdr has no declarative plugin list, so a bootstrap hook registers herdr-auto-title with herdr plugin install, which builds it with mise's Go. Herdr starts plugins only when its server starts; if a server was already running, run herdr plugin action invoke herdr.auto-title.restart, and run it again after herdr plugin update. The plugin's optional settings go in ~/.config/herdr-auto-title/config.env, which is not tracked here because the defaults are used.
  • Existing fnm, SDKMAN, and direnv installations are left on disk, but the shell no longer activates them. Language packages installed globally under old runtimes may need reinstalling for mise's runtimes.

License

Licensed under the GNU GPLv3.

Explore related projects