Skip to content

Repository files navigation

dotfiles

Configuration and automation for a single macOS machine.

Shell utilities, a modular Neovim configuration, editor and browser settings, and Finder quick actions.

Platform Shell Neovim Editor License

Tested on an M4 MacBook Air. Each directory is independent and can be adopted separately.


Contents

Stow packages

Each directory below mirrors its destination relative to $HOME, so GNU Stow symlinks it into place. Editing the file in the repository and editing it on the machine are the same act — these cannot drift.

Package Contents Links into
zsh/ Shell configuration and fzf bindings ~/, ~/.config/fzf/
ghostty/ Terminal configuration ~/.config/ghostty/
starship/ Prompt — minimal left side, context on the right ~/.config/
atuin/ SQLite-backed shell history, shared by zsh and nushell ~/.config/atuin/
nushell/ Structured-data shell, kept alongside zsh ~/Library/Application Support/nushell/
nvim/ Modular configuration — native LSP, Treesitter, lazy.nvim ~/.config/nvim/
cd ~/Documents/portfolio/dotfile
stow --no-folding -t ~ zsh ghostty starship atuin nushell nvim

--no-folding creates real directories containing symlinked files, rather than symlinking whole directories. Files a tool writes for itself — lazy-lock.json, atuin's databases, nushell's generated init files — then land outside the repository instead of silently inside it.

stow -D -t ~ <package> removes a package's links; stow -R -t ~ <package> restows after adding files.

Not stowed

Directory Contents Why not Installs to
scripts/ Five zsh utilities Already on $PATH directly from this repository $PATH, via ~/.zshenv
vscode/ Settings and 20 recommended extensions VS Code rewrites its own settings file ~/Library/Application Support/Code/User/
zen/ Zen Browser user.js, chrome CSS, theme exports Profile directory name is a random per-install UUID Profile root and chrome/
macos/ A LaunchAgent and an Automator workflow Install-once bundles that never drift ~/Library/LaunchAgents/, ~/Library/Services/
services/ Finder quick actions Same ~/Library/Services/

These are copied into place, so a pull does not update the machine.

No credentials are committed. zsh/.zshrc sources ~/.secrets.zsh if it exists and starts cleanly if it does not. Copy zsh/secrets.zsh.example (excluded from stow via zsh/.stow-local-ignore) to ~/.secrets.zsh, fill it in, and chmod 600 it.

The generated shell-integration files under nushell/ are deliberately absent — regenerate them on a new machine rather than tracking them:

starship init nu      | save -f ($nu.default-config-dir | path join autoload starship.nu)
zoxide   init nushell | save -f ($nu.default-config-dir | path join zoxide.nu)
atuin    init nu      | save -f ($nu.default-config-dir | path join atuin.nu)

Scripts

Script Description
clean Updates brew, mas, npm, and pip; purges system, VS Code, Zen, and Xcode DerivedData caches; clears logs and trash; flushes DNS; and reports space recovered. --dry-run previews without modifying anything. --node additionally prunes node_modules — opt-in, and destructive
netinfo Reports local IP, public IP, gateway, DNS servers, and the current Wi-Fi network
git-clean-branches Scans one level deep for repositories and deletes local branches merged into main or master, or whose remote-tracking branch is gone. Defaults to preview mode
repo-sync Scans one level deep for repositories under a base directory and fast-forward pulls those behind their upstream. Repositories that are ahead, diverged, or without an upstream are reported and skipped
send-to-ollama Summarises a file through a local Ollama model, writing <name>-summary.md alongside the original

Installation

git clone https://github.com/chakri192/dotfile ~/Documents/portfolio/dotfile
cd ~/Documents/portfolio/dotfile
chmod +x scripts/*

Add to ~/.zshenv:

export PATH="$HOME/Documents/portfolio/dotfile/scripts:$PATH"

Usage

clean                           # full cleanup and updates
clean --dry-run                 # report what would be removed
clean --node                    # additionally prune node_modules
netinfo                         # network summary
git-clean-branches              # preview stale branches under the current directory
git-clean-branches ~/dev -y     # delete them
repo-sync                       # fast-forward pull repositories under the base directory

Dependencies

zsh is required. curl is used by netinfo for public IP lookup. Homebrew, mas, npm, and pip3 are each optional and skipped by clean when absent. clean requires sudo for periodic maintenance and DNS flushing.


macOS integration

Caps Lock remapping

macos/launchagents/com.user.capslock-remap.plist remaps Caps Lock to Right Command using the native hidutil interface, with no third-party remapping software.

cp macos/launchagents/com.user.capslock-remap.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.user.capslock-remap.plist

Finder quick actions

Action Description
New Item Creates an empty file from the right-click menu
Send to Gmail Sends selected files as attachments through Mail.app via AppleScript
Send to Ollama Runs selected files through scripts/send-to-ollama and writes a summary alongside each original
cp -R "services/finder-new-item/New Item.workflow" ~/Library/Services/
cp -R "macos/automator/Send to Gmail.workflow" ~/Library/Services/
cp -R "services/send-to-ollama/Send to Ollama.workflow" ~/Library/Services/

Send to Ollama requires scripts/send-to-ollama on $PATH and bat for content extraction. Its Run Shell Script step invokes the script at the literal path $HOME/Documents/portfolio/dotfile/scripts/send-to-ollama, so the repository must be cloned to that location or the workflow edited. See services/README.md.

Quick Action Demonstration
New Item new item
Send to Gmail send to gmail send to gmail
Send to Ollama send to ollama

Neovim

A modular configuration targeting Neovim 0.11 or later, built on lazy.nvim with the native LSP API (vim.lsp.config and vim.lsp.enable), Treesitter from the main branch, and blink.cmp completion.

Layout

Path Contents
nvim/.config/nvim/init.lua Leader keys, PATH shim for spawned jobs, module loader
nvim/.config/nvim/lua/config/ options, keymaps, autocmds, lazy bootstrap
nvim/.config/nvim/lua/plugins/ One file per concern — LSP, completion, Treesitter, Telescope, git, UI, editor, DAP, linting
nvim/stylua.toml · nvim/ruff.toml · nvim/clang-format Formatter and linter configuration referenced by conform and ruff

Configuration

Area Detail
LSP Native, without the lspconfig framework: pyright, ruff, clangd, lua_ls, bashls, ts_ls, rust_analyzer, gopls, jsonls, yamlls, taplo, marksman, html, cssls, installed through mason
Completion blink.cmp with LSP, snippet, path, buffer, and lazydev sources
Syntax Treesitter main branch — highlighting, indentation, folds, sticky context, textobjects
Fuzzy finding Telescope with fzf-native
Git gitsigns for hunks; Neogit and diffview for staging and commits
Formatting conform on save — stylua, ruff, clang-format, shfmt, prettier, rustfmt, goimports, taplo
Linting ruff and clang-tidy, plus nvim-lint for shellcheck, yamllint, markdownlint, and hadolint
Debugging nvim-dap with dap-ui — Python through debugpy, C/C++/Rust through codelldb
Quality of life flash, oil, todo-comments, render-markdown, which-key, trouble, toggleterm, tokyonight

Installation

[ -e ~/.config/nvim ] && mv ~/.config/nvim ~/.config/nvim.bak
stow --no-folding -d ~/Documents/portfolio/dotfile -t ~ nvim
nvim   # lazy.nvim bootstraps and installs plugins on first launch

Then install the external tool binaries through mason:

:MasonInstall prettierd shfmt stylua taplo goimports yamlfmt \
  shellcheck markdownlint-cli2 yamllint hadolint debugpy codelldb

Dependencies

Neovim 0.11 or later is required for the native LSP API. The Treesitter main branch invokes the tree-sitter CLI to compile parsers (brew install tree-sitter), which in turn requires a C compiler. ripgrep backs Telescope live-grep and :grep. A Nerd Font provides the icons used in the statusline, file tree, and completion menu. Per-language toolchains — go, cargo, node — are required for the corresponding servers and formatters.


VS Code

Settings tuned for Python, JavaScript and TypeScript, C and C++, and web development.

Area Configuration
Performance Accessibility support and telemetry disabled, smooth scrolling, reduced minimap
Typography JetBrains Mono with ligatures at 13.5px
File management Smart nesting for related files — .ts with .js, .h with .c
Formatting Prettier for JS and JSON, Ruff for Python, both on save
Editing Bracket pair colourisation, sticky scroll, linked editing, indentation guides
Language overrides Python (Ruff with import organisation), Markdown (word wrap, no formatting), JSON
cp vscode/settings.json ~/Library/Application\ Support/Code/User/settings.json
jq -r '.recommendations[]' vscode/extensions.json | xargs -n1 code --install-extension

Twenty extensions spanning Python, C and C++, web, git, and AI tooling. The complete list is in vscode/extensions.json.


Zen Browser

Performance and privacy configuration for Zen Browser, tuned for Apple Silicon.

File Location in profile Purpose
zen/user.js Profile root about:config overrides applied on every launch
zen/userChrome.css chrome/ Browser interface customisation
zen/userContent.css chrome/ Page-level style overrides
zen/zen-themes.css chrome/ Zen-specific theme overrides
zen/zen-themes/ chrome/zen-themes/ Exported Zen Theme Store themes

user.js covers four areas: performance (WebRender and Metal compositor, 60fps frame rate, HTTP/3, DNS prefetch, enlarged caches), memory (incremental garbage collection, background tab unloading after three minutes, reduced session I/O), privacy (social, fingerprinting, and cryptomining tracker blocking; all telemetry disabled), and Apple Silicon (Metal GPU API, hardware video decoding, asynchronous scrolling, zero paint delay).

# Locate the profile: Zen → about:support → Profile Folder
PROFILE="$HOME/Library/Application Support/zen/Profiles/<your-profile>"

cp zen/user.js "$PROFILE/"
cp zen/userChrome.css zen/userContent.css zen/zen-themes.css "$PROFILE/chrome/"
cp -R zen/zen-themes "$PROFILE/chrome/"

Restart Zen. user.js values are applied on every launch and override prefs.js.


Environment

macOS on Apple Silicon, zsh, VS Code, and Zen Browser. Tested on an M4 MacBook Air.

License

MIT © V Chakradhar

Contributors

chakri192 Author
aider AI pair programmer

Documentation assisted by aider using local models through Ollama: qwen2.5-coder:7b for code and llama3.1:8b for prose.

About

Personal macOS scripts for system cleanup, network info, and terminal automation.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages