jessfraz/dotfiles: A Make-Driven Symlink Setup With a Built-In Escape Hatch
Project brief: My dotfiles. Buyer beware ;). Customizing Save env vars, etc in a .extra file, that looks something like this: Resources .vim For my .vimrc and .vim dotfiles see github.com/jessfraz/.vim.
At a glance
- What is it?
- A minimal dotfiles manager that turns `make` into an installer and `.extra` into a personal override file. It is a starting point, not a framework.
- Who is it for?
- Adopt jessfraz/dotfiles if you want a bare-bones, MIT-licensed starting point for your own dotfiles and you are comfortable editing a Makefile and a .extra file. Skip it if you need multi-machine profiles, secret management, or declarative state.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Shell, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.
Star history
- jessfraz/dotfiles3,565 ★ · +6
| Repository | 2026-07-30 | 2026-11-14 |
|---|---|---|
| jessfraz/dotfiles | 3.6k | 3.6k |
6 Stars in the last 107 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
What This Repo Actually Solves
jessfraz/dotfiles is a personal dotfiles collection that doubles as a template for anyone who wants a no-frills setup. The README is clear about its scope: run `make` to create symlinks from the repo to your home folder. That is the entire installer. The target user is a developer who wants version-controlled config files without adopting a heavy tool like Ansible or a dedicated dotfile manager. The repo solves the problem of manually copying files across machines, but it does not solve secrets, per-host differences, or rollback. The author's own warning, "Buyer beware ;)", is the honest summary.
The Mechanism: Symlinks and a Makefile
The core mechanism is a Makefile that creates symlinks. The README does not list the exact targets, but the implication is that every dotfile in the repo gets linked to `$HOME`. This is a common pattern: keep files in a git repo, then link them into place. The advantage is that edits happen in the repo, so changes are tracked. The trade-off is that the Makefile must know the home directory and the file names. If a file is added to the repo but not to the Makefile, it will not be installed. The README gives no mention of a `clean` target or an uninstall command, so removing the setup likely means deleting symlinks manually.
Getting Started: The Make Command and Tests
Installation is one command: `make`. The README shows this as the only step. Customization happens through a `.extra` file. The example in the README sets Git author and committer names, email, and the GitHub username, then runs `git config --global` commands. It also exports Gmail-related environment variables for mutt. The tests run with `make test`, which uses shellcheck. The README says you do not need to install anything because the tests run in a container. That is a concrete, reproducible way to validate shell syntax. For a dotfiles repo, having a test target is unusual and useful, because a broken `.bashrc` can break your shell.
The .extra File: A Deliberate Escape Hatch
The `.extra` file is the most interesting design choice. It is a plain shell script that you create, and it is presumably sourced by the main shell config. The README shows it holding environment variables and executing `git config` commands. This is a pragmatic way to keep personal credentials out of the main repo. But it is also a footgun: the file runs arbitrary shell code at shell startup. If you put a command that fails or prints output, it will affect every interactive shell. The README gives no guidance on how `.extra` is loaded or whether it is optional. The assumption is that the main dotfiles check for its existence. This is a common pattern, but the documentation leaves the loading mechanism to the reader's inference.
A Real Limitation: It Is a Snapshot, Not a System
This repo is not a dotfile manager. It has no concept of per-host overrides, no encryption, no dependency resolution. If you use it on a new machine, you must clone the repo and run `make`, but the `.extra` file is not in the repo by design, so you have to recreate it or copy it over. That is fine for one user, but it breaks down for a team or for multiple machines with different needs. The README does not mention how to handle a machine that lacks certain tools, like mutt. The Makefile will link files regardless of whether the target software is installed. This is a limitation, not a bug. It is the trade-off for a minimal setup.
Alternative: A Declarative Dotfile Manager
A common alternative is a tool like GNU Stow or a dedicated dotfile manager such as chezmoi. Stow uses symlinks but requires you to organise files into a package directory and run `stow` to create links. chezmoi goes further: it templates files per machine, manages secrets through external tools, and supports a `chezmoi apply` command. The difference in approach is that jessfraz/dotfiles is imperative: you write a Makefile and run it. chezmoi is declarative: you define the desired state and the tool figures out what to link, template, or encrypt. If you need to manage different configs for work and personal machines, or if you want to keep secrets out of git entirely, a declarative tool is a better fit. jessfraz/dotfiles is for the person who wants to read and understand every line of their setup.
Maintenance and Licence Considerations
The repo is licensed under MIT, which means you can copy it, modify it, and use it in commercial projects without restriction, as long as you keep the copyright notice. The maintenance cost is low because the project is small and does not depend on external packages. The only dependency is `make` and a shell, which are present on most Unix-like systems. The test target requires Docker or a container runtime, but that is optional. The README does not mention a versioning scheme or release process, so you should expect occasional breaking changes if you pull upstream. The author is known for active open source work, but this repo is a personal tool, so updates may be sporadic. You should treat it as a reference, not a maintained product.
Editorial conclusion
Adopt jessfraz/dotfiles if you want a bare-bones, MIT-licensed starting point for your own dotfiles and you are comfortable editing a Makefile and a .extra file. Skip it if you need multi-machine profiles, secret management, or declarative state. Before adopting, verify that the Makefile's symlink targets match your home directory layout and that the .extra file is sourced only in interactive shells, since it executes arbitrary shell commands at login. The project's value is its simplicity: run `make`, edit `.extra`, and you are done.
Frequently asked questions
What does running make in jessfraz/dotfiles actually do?
It runs the all target, which depends on bin, usr, dotfiles and etc. The dotfiles target symlinks every dotfile it finds into your home folder, the bin target links scripts from bin/ into /usr/local/bin with sudo, and the etc target creates /etc/docker/seccomp, links files under etc/ into the filesystem root with sudo, then enables systemd-networkd and systemd-resolved and runs systemctl start systemd.
How do you install jessfraz/dotfiles with Nix?
Import homeManagerModules.default from the flake through Home Manager. The host configuration supplies the username, home directory and state version, and the separate global-nix repository enables Bash completion and installs the Zoo and rustup completion files used by the .nixbash startup fragment.
Where do I set my git identity for jessfraz/dotfiles?
In a .extra file, following the README example that sets GIT_AUTHOR_NAME, GIT_COMMITTER_NAME, GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAIL and GH_USER, then calls git config --global user.name, user.email and github.user. The Makefile also marks the checkout's own .gitconfig with git update-index --skip-worktree.
How do you check that jessfraz/dotfiles still works?
Two lanes. nix flake check --no-update-lock-file runs the native Nix checks, including a complete Home Manager fixture and an editor smoke test, and CI builds them on x86-64 Linux, ARM Linux and ARM macOS. make test runs shellcheck in a container. The homeConfigurations outputs are fixtures and the README says not to activate them.
Which window manager does jessfraz/dotfiles assume?
The Makefile links the repository's .i3 directory to $(HOME)/.config/sway, so the install writes i3 configuration into the sway config path. The repository also carries .nixbash, .urxvt/, .irssi/, .codex/ and a set of X11 files at the top level.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/jessfraz-dotfiles)Star history chart for your README
[](https://hysenlabs.com/projects/jessfraz-dotfiles)Was this useful?