{"id":16589835,"url":"https://github.com/tjex/dotf","last_synced_at":"2026-05-08T09:33:09.092Z","repository":{"id":333437140,"uuid":"1134423760","full_name":"tjex/dotf","owner":"tjex","description":"A CLI implementing the bare git repository strategy of dotfile tracking, but with sprinkles on top.","archived":false,"fork":false,"pushed_at":"2026-02-13T19:02:02.000Z","size":2337,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-14T02:08:48.998Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","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/tjex.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2026-01-14T17:42:56.000Z","updated_at":"2026-02-13T19:00:49.000Z","dependencies_parsed_at":"2026-02-13T21:07:58.475Z","dependency_job_id":null,"html_url":"https://github.com/tjex/dotf","commit_stats":null,"previous_names":["tjex/dotf"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/tjex/dotf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tjex%2Fdotf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tjex%2Fdotf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tjex%2Fdotf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tjex%2Fdotf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tjex","download_url":"https://codeload.github.com/tjex/dotf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tjex%2Fdotf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32774881,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"ssl_error","status_checked_at":"2026-05-08T08:22:45.650Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["cli","dotfiles","git","go","golang"],"created_at":"2024-10-11T23:10:02.159Z","updated_at":"2026-05-08T09:33:09.084Z","avatar_url":"https://github.com/tjex.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dotf\n\nA `git` wrapper to make tracking dotfiles with a bare git repository even more\nconvenient.\n\n## Config\n\n`dotf` expects to find a config file at `${XDG_CONFIG_HOME}/dotf/config.toml`.\n\nThe below settings are for demonstration in keeping with the\n[bare repo dotfiles tutorial on Atlassian](https://www.atlassian.com/git/tutorials/dotfiles).\n\nGo through the tutorial first, if the concept of tracking system configurations\nwith a bare git repostiory is new to you.\n\n```toml\nenv = \"example\" # or `export DOTF_ENV=example` in shell config.\nworktree = \"${HOME}\" # the bare repo's root directory (all files deeper can be tracked).\ngitdir = \"~/.cfg/\" # the location of the bare repo git directory (i.e, git config, hooks, etc).\norigin = \"\u003cread+write url for origin\u003e\" # eg, git@yourhost.com:user/dotfiles.\nbatch-commit-message = \"batch dotf update\" # used by `dotf m --prime` for module commit message.\n\n[modules.default]\npaths = [\"~/path/to/repo1\", \"~/path/to/repo2\"]\n```\n\nFor example, my config\n[is here](https://git.sr.ht/~tjex/dotfiles/tree/mac/item/.config/dotf/config.toml).\n\n## Installation\n\n1. Clone this repo\n   1. To install with the latest changes: `go install`\n   2. To install with a stable version:\n      `git checkout tags/\u003cversion\u003e \u0026\u0026 go install`\n\nTo get version tags, first fetch all tags with `git fetch --all --tags` and then\nrun `git tag`.\n\n## Modules\n\nModules are a replacement for Git's submodules feature. I found that adding\nextra repositories to my bare repo to be frustrating at times as it requires the\n`git submodules for each ...` way of working.\n\nAdding submodules also creates strict relationships between the submodule and\nthe bare repository. Once this broke my config an was very difficult to fix.\nThis is a little scary when the bare repository is in control of a large portion\nof your systems configuration.\n\nInstead `modules` are regular git repositories, in the sense that they have no\nrelationship to your bare dotfiles respository. You can clone a repo somewhere\non your system, add its path to the `modules` array in the `config.toml` and\nthen list, edit, pull, commit and push with the `m` command: `dotf m --list`.\n\nThe `modules.default` group will _always_ be included. You can use this as a\nbase group of modules used across systems. Any repos specific to certain systems\n(e.g., work and personal) can be included in their own groups.\n\nA non-default grouped module will only be included if the `DOTF_ENV` shell\nvariable or the `env` key in the `config.toml` are set. This allows you your\n`dotf` config to be portable across systems while still enabling alternate\nmodule setups.\n\nIf you do not want to have any modules included by default, simply don't use the\n`modules.default` group.\n\n```bash\nexport DOTF_ENV=work\n```\n\n```toml\n[modules.default] # present on all systems you work on\npaths = [\"~/path/to/repo1\", \"~/path/to/repo2\"]\n\n[modules.work]\npaths = [\"~/path/to/work/repo1\"]\n\n[modules.personal] # will not be included on work computer\npaths = [\"~/path/to/personal/repo1\"]\n```\n\nSubmodules are still available for you to use as normal if you prefer:\n`dotf submodule add ...`, etc. As all Git commands apart from those intercepted\nin this program are _passed to your bare dotfiles Git repository_.\n\n## Usage\n\nAll `git` commands are passed as normal. Some are intercepted and handled\ndifferently, some are unique. `dotf m ...` commands range over module paths in\nyour `config.toml`, and run as goroutines:\n\n\n### Modules\n\n```bash\n# List all tracked modules\ndotf m --list\n\n# Search module directories using fzf, open selected in $EDITOR (default: vim)\ndotf m --edit\n\n# Check status of modules `git status -s`\ndotf m --status\n\n# Pull upstream changes from all modules\ndotf m --pull\n\n# Stage all changes (`git add -A`) and commit them for all modules\n# Commit message is defined in config.toml\ndotf m --prime\n\n# Push local changes of all modules\ndotf m --push\n```\n\n### Bare Repo\n\n```bash\n# Pull bare dotfiles repository from origin\ndotf pull\n\n# Push bare dotfiles repository to origin\ndotf push\n```\n\n### Sync\n\n```bash\n# Sync bare repository: pull and push\ndotf sync --bare\n\n# Sync all modules: pull and push\ndotf sync --modules\n\n# Sync both bare repo and modules\ndotf sync\n```\n\n### Misc\n\n```bash\n# Run commands quietly (errors only)\ndotf ... -q\n\n# Show interactive help for dotf or git\ndotf --help\n\n# All other commands will be passed as-is to Git (operating on the bare repo).\n\ndotf status\ndotf log --oneline\ndotf rebase -i HEAD~2\n...\n```\n\n## Author\n\nTillman Jex\\\n[www.tjex.net](https://tjex.net)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftjex%2Fdotf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftjex%2Fdotf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftjex%2Fdotf/lists"}