{"id":50325267,"url":"https://github.com/xx4h/nixconf","last_synced_at":"2026-05-29T05:30:50.745Z","repository":{"id":357434511,"uuid":"1236931865","full_name":"xx4h/nixconf","owner":"xx4h","description":"❄️ 🗂️ A tool to manage a multi-repo NixOS configuration","archived":false,"fork":false,"pushed_at":"2026-05-24T10:22:47.000Z","size":81,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T12:18:05.117Z","etag":null,"topics":["cli","comman","configuration-management","dotfiles","home-manager","multi-repo","nix","nix-flakes","nixos","nixos-configuration"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xx4h.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-12T17:59:08.000Z","updated_at":"2026-05-24T10:22:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/xx4h/nixconf","commit_stats":null,"previous_names":["xx4h/nixconf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xx4h/nixconf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xx4h%2Fnixconf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xx4h%2Fnixconf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xx4h%2Fnixconf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xx4h%2Fnixconf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xx4h","download_url":"https://codeload.github.com/xx4h/nixconf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xx4h%2Fnixconf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33639050,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","comman","configuration-management","dotfiles","home-manager","multi-repo","nix","nix-flakes","nixos","nixos-configuration"],"created_at":"2026-05-29T05:30:50.577Z","updated_at":"2026-05-29T05:30:50.739Z","avatar_url":"https://github.com/xx4h.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nixconf\n\n\u003c!-- markdownlint-disable no-empty-links --\u003e\n\n[![Lint Code Base](https://github.com/xx4h/nixconf/actions/workflows/linter-full.yml/badge.svg)](https://github.com/xx4h/nixconf/actions/workflows/linter-full.yml)\n[![Test Code Base](https://github.com/xx4h/nixconf/actions/workflows/test-full.yml/badge.svg)](https://github.com/xx4h/nixconf/actions/workflows/test-full.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/xx4h/nixconf?)](https://goreportcard.com/report/github.com/xx4h/nixconf)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)\n[![Latest tag](https://img.shields.io/github/v/tag/xx4h/nixconf)](https://github.com/xx4h/nixconf/tags)\n\n\u003c!-- markdownlint-enable no-empty-links --\u003e\n\nRepository manager for a multi-repo NixOS configuration: one shared\n`nixos-common`, one `nixos-\u003chost\u003e` per machine, and one `nixos-\u003cuser\u003e` per user.\n`nixconf` keeps the sub-repos in sync — cloning them, running `nix flake update`\nacross all of them, verifying that consumers track the latest `nixos-common`,\nand forwarding arbitrary `git` commands into each working tree.\n\n## Install\n\n### Pre-built binaries\n\nGrab a tarball for your platform from the\n[releases page](https://github.com/xx4h/nixconf/releases) and place the\n`nixconf` binary on your `$PATH`.\n\n### Nix flake\n\n```bash\nnix run github:xx4h/nixconf\n# or, in a flake:\ninputs.nixconf.url = \"github:xx4h/nixconf\";\n```\n\nThe package installs Bash/Zsh/Fish completion files into the standard\n`share/` paths, so shells that auto-load vendor completions pick them up\nwithout further configuration.\n\n### Home Manager\n\nA Home Manager module is exposed at `homeManagerModules.default`:\n\n```nix\n{\n  inputs.nixconf.url = \"github:xx4h/nixconf\";\n}\n```\n\n```nix\n# in your Home Manager config\n{ inputs, ... }: {\n  imports = [ inputs.nixconf.homeManagerModules.default ];\n\n  programs.nixconf = {\n    enable = true;\n    # All three default to true; toggle off to skip the shell init hook.\n    # enableBashIntegration = true;\n    # enableZshIntegration  = true;\n    # enableFishIntegration = true;\n  };\n}\n```\n\n### Homebrew\n\n```bash\nbrew install xx4h/tap/nixconf\n```\n\n### From source\n\n```bash\ngit clone https://github.com/xx4h/nixconf.git\ncd nixconf\ntask build               # → ./bin/nixconf\ntask local-install       # → ~/.local/bin/nixconf\n```\n\n## Configuration\n\n`nixconf` reads `nixconf.yaml` from the first match in this order:\n\n1. The path passed to `-c, --config \u003cpath\u003e`\n2. The first `nixconf.yaml` found walking up from the current directory\n3. `$XDG_CONFIG_HOME/nixconf.yaml` (or `~/.config/nixconf.yaml`)\n\nRun `nixconf init` to create a starter file at\n`$XDG_CONFIG_HOME/nixconf.yaml`, or `nixconf init \u003cpath\u003e` to write it\nelsewhere.\n\nThe file lists the repos to manage, grouped into `common`, `hosts`, and\n`users`:\n\n```yaml\ngit_base: \"git@github.com:\u003cuser\u003e\"\n\n# Optional. Repos are cloned under this directory. Defaults to\n# $XDG_DATA_HOME/nixconf (or ~/.local/share/nixconf). Relative values\n# are resolved against the directory holding this file.\n# data_dir: \"\"\n\n# Optional. Controls how `nixconf update` commits the bumped flake.lock.\n# Defaults shown.\nupdate:\n  # `{{inputs}}` is replaced with \" \u003cinput1\u003e \u003cinput2\u003e\" when INPUTs are\n  # passed on the command line, and with \"\" otherwise.\n  commit_message: \"chore(deps): flake update{{inputs}}\"\n  # Extra args appended to `git commit`. An explicit empty list disables\n  # signing (`commit_flags: []`).\n  commit_flags: [\"-v\", \"-s\", \"-S\"]\n\nrepos:\n  common:\n    - name: nixos-common\n      path: nixos-common\n  hosts:\n    - name: nixos-desktop\n      path: hosts/nixos-desktop\n    - name: nixos-laptop\n      path: hosts/nixos-laptop\n    # Per-repo `url` overrides git_base entirely.\n    - name: nixos-other\n      path: hosts/nixos-other\n      url: \"https://git.example.com/team/nixos-other.git\"\n    # Disabled entries are skipped by clone/update/verify/git.\n    - name: nixos-archive\n      path: hosts/nixos-archive\n      disabled: true\n  users:\n    - name: nixos-\u003cuser\u003e\n      path: users/nixos-\u003cuser\u003e\n```\n\n`git_base` is optional if every repository provides its own `url`.\n\n## Commands\n\n| Command                                | What it does                                                              |\n| -------------------------------------- | ------------------------------------------------------------------------- |\n| `nixconf init [path]`                  | Create a starter `nixconf.yaml` (default: `$XDG_CONFIG_HOME`)             |\n| `nixconf clone`                        | Clone every repository in `nixconf.yaml` into its `path` under `data_dir` |\n| `nixconf update [INPUT ...]`           | `nix flake update` + commit `flake.lock` + push, in every repository      |\n| `nixconf verify`                       | Check host/user `flake.lock`s point at the latest `nixos-common`          |\n| `nixconf git \u003cargs\u003e`                   | Run `git -C \u003crepo\u003e \u003cargs\u003e` in every selected repository                   |\n| `nixconf config add \u003ckind\u003e \u003cname\u003e`     | Add a `host` or `user` entry (flags: `--path`, `--url`)                   |\n| `nixconf config edit \u003ckind\u003e \u003cname\u003e`    | Edit an entry (flags: `--name`, `--path`, `--url`)                        |\n| `nixconf config delete \u003ckind\u003e \u003cname\u003e`  | Remove an entry (aliases: `rm`, `remove`)                                 |\n| `nixconf config disable \u003ckind\u003e \u003cname\u003e` | Mark an entry as disabled — skipped by other commands                     |\n| `nixconf config enable \u003ckind\u003e \u003cname\u003e`  | Re-enable a previously disabled entry                                     |\n| `nixconf version`                      | Print version / commit / build date                                       |\n| `nixconf completion \u003cshell\u003e`           | Print shell completion (Bash/Zsh/Fish/PowerShell)                         |\n\nArbitrary Git commands are run only via the explicit `nixconf git`\nsubcommand; unknown subcommands are no longer auto-forwarded.\n\n**Selectors** (combine with any command):\n\n| Flag                  | Effect                              |\n| --------------------- | ----------------------------------- |\n| `--common`            | only common repos                   |\n| `--consumers`         | only consumer repos (hosts + users) |\n| `--hosts`             | only host config repos              |\n| `--users`             | only user config repos              |\n| `-r, --repo \u003cname\u003e`   | only the named repository           |\n| `-n, --dry-run`       | show what would be done; no changes |\n| `-c, --config \u003cpath\u003e` | override the `nixconf.yaml` lookup  |\n\n### Examples\n\n```bash\n# create a starter config in $XDG_CONFIG_HOME/nixconf.yaml\nnixconf init\n\n# add a host, then clone everything\nnixconf config add host nixos-desktop\nnixconf clone\n\n# bump nixpkgs across all repos, commit + push the lockfile in each\nnixconf update nixpkgs\n\n# bump everything, only in host repos\nnixconf --hosts update\n\n# check that every host/user flake.lock pins the latest nixos-common\nnixconf verify\n\n# git in every repo (use the explicit `git` subcommand)\nnixconf git status\nnixconf --hosts git pull\nnixconf -r nixos-common git log --oneline -5\n```\n\n## Shell completion\n\n```bash\n# zsh — one-time setup\nnixconf completion zsh \u003e \"${fpath[1]}/_nixconf\"\n\n# bash\nnixconf completion bash \u003e /etc/bash_completion.d/nixconf\n```\n\n## License\n\nApache-2.0. See [LICENSE](./LICENSE) and [NOTICE](./NOTICE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxx4h%2Fnixconf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxx4h%2Fnixconf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxx4h%2Fnixconf/lists"}