{"id":18427858,"url":"https://github.com/eliasnorrby/dotfiles","last_synced_at":"2025-10-13T14:18:54.515Z","repository":{"id":50250411,"uuid":"156838247","full_name":"eliasnorrby/dotfiles","owner":"eliasnorrby","description":":computer: Dotfiles for development on MacOS and Manjaro","archived":false,"fork":false,"pushed_at":"2025-02-13T15:51:15.000Z","size":2268,"stargazers_count":9,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-04-06T11:06:23.198Z","etag":null,"topics":["alacritty","ansible","arch-linux","bspwm","dotfiles","dotfiles-macos","dotfiles-manager","emacs","hammerspoon","karabiner","sxhkd","tmux","vim","zsh"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/eliasnorrby.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}},"created_at":"2018-11-09T09:16:42.000Z","updated_at":"2025-02-13T15:51:20.000Z","dependencies_parsed_at":"2023-02-10T16:01:17.949Z","dependency_job_id":"d8b95fd2-7fd0-4219-a190-041fa21145ee","html_url":"https://github.com/eliasnorrby/dotfiles","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliasnorrby%2Fdotfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliasnorrby%2Fdotfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliasnorrby%2Fdotfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eliasnorrby%2Fdotfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eliasnorrby","download_url":"https://codeload.github.com/eliasnorrby/dotfiles/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247688482,"owners_count":20979678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["alacritty","ansible","arch-linux","bspwm","dotfiles","dotfiles-macos","dotfiles-manager","emacs","hammerspoon","karabiner","sxhkd","tmux","vim","zsh"],"created_at":"2024-11-06T05:12:04.174Z","updated_at":"2025-10-13T14:18:49.484Z","avatar_url":"https://github.com/eliasnorrby.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# .DOTFILES\n\n[![github-actions][github-actions-badge]][github-actions-link]\n[![semantic-release][semantic-release-badge]][semantic-release-link]\n[![Conventional Commits][conventional-commits-badge]][conventional-commits-link]\n\nDeclarative dotfiles for development on MacOS and Manjaro.\n\n## Bootstrap\n\nTo provision a new workstation from scratch, use the `setup.sh` (or `setup-linux.sh`) script.\n\nRun\n\n```bash\nbash \u003c(curl -sL https://raw.githubusercontent.com/eliasnorrby/dotfiles/develop/setup.sh)\n```\n\nPrepare to input your password a couple of times.\n\nThis setup script will:\n\n- Install homebrew\n- Install `python3` and `openssl` (using `brew`)\n- Download a snapshot version of this repo\n- Install `ansible` (using `brew`)\n- Install `ansible` role dependencies\n- Run the downloaded playbook (`_provision/playbook.yml`), wherein:\n  - This repo is cloned to `~/.dotfiles`\n  - Symlinks are created\n  - xcode command line tools are installed (or verified to have been installed)\n  - Dependencies are downloaded (using `homebrew`, `pip`, `ruby` and `npm`)\n- Run the post-install script, wherein:\n\n  - `zsh` plugins are installed\n  - `vim` plugins are installed\n  - `coc-nvim` extensions are installed\n  - `vscode` plugins are installed\n  - `doom-emacs` packages are installed\n\n:clock1: Estimated duration: ~45 minutes\n\nDependencies:\n\n- [geerlingguy/homebrew][geerlingguy-homebrew-link]\n- [geerlingguy/git][geerlingguy-git-link]\n- [kewlfft/aur][kewlfft-aur-link]\n\n## Directory structure\n\nConfiguration is divided into `topics` (inspired by\n[hlissner][hlissner-dotfiles-link]).\n\nExample topics:\n\n- `shell/zsh`\n- `shell/tmux`\n- `editor/vim`\n\nTopics are grouped by category (`editor`, `shell`, etc). Each topic must contain\na `topic.config.yml`, and can optionally include a `topic.tasks.yml`, an\n`aliases.zsh`, an `env.zsh`, as well as any other files relevant to its\nconfiguration.\n\nAnsible tasks defined in `topic.tasks.yml` will be run during provisioning.\n\nEnvironment variables defined in `env.zsh` will be sourced during shell startup\nif the topic is enabled. The same is true for aliases defined in `aliases.zsh`.\n\n```\n.dotfiles\n└── group\n    ├── topic\n    │   ├── aliases.zsh\n    │   ├── env.zsh\n    │   ├── topic.config.yml\n    │   └── topic.tasks.yml\n    └── another-topic\n```\n\n_Minimal example of a topic directory layout_\n\n\u003cdetails\u003e\n  \u003csummary\u003eExtended directory layout example\u003c/summary\u003e\n\n```\n.dotfiles\n├── editor\n│   ├── editorconfig\n│   │   └── topic.config.yml\n│   ├── emacs\n│   │   ├── aliases.zsh\n│   │   ├── topic.config.yml\n│   │   ├── doom\n│   │   │   ├── config.el\n│   │   │   ├── init.el\n│   │   │   └── packages.el\n│   │   └── env.zsh\n│   └── vim\n│       ├── aliases.zsh\n│       ├── env.zsh\n│       ├── gvimrc.vim\n│       └── topic.config.yml\n└── shell\n   ├── alacritty\n   │   ├── alacritty.yml\n   │   ├── aliases.zsh\n   │   └── topic.config.yml\n   ├── git\n   │   ├── aliases.zsh\n   │   └── topic.config.yml\n   ├── tmux\n   │   ├── aliases.zsh\n   │   ├── env.zsh\n   │   ├── scripts\n   │   │   └── uptime-tmux-status.sh\n   │   ├── tmux-cheatsheet.md\n   │   ├── tmux.conf\n   │   ├── tmux.remote.conf\n   │   ├── tmux.theme.conf\n   │   └── topic.config.yml\n   └── zsh\n       ├── aliases.zsh\n       ├── completion.zsh\n       ├── config.zsh\n       ├── fzf.zsh\n       ├── keybinds.zsh\n       ├── macos.zsh\n       ├── plugins.zsh\n       ├── prompt.zsh\n       ├── remote.zsh\n       ├── utilities.zsh\n       ├── topic.config.yml\n       └── topic.tasks.yml\n```\n\n\u003c/details\u003e\n\nEach topic declares its configuration (brew dependencies, symlinks, etc) in a\n`topic.config.yml` within its coresponding directory.\n\n```yaml\nvim_config:\n  path: editor/vim\n  links:\n    - .vimrc\n  brew_formulas:\n    - vim\n```\n\n_Topic configuration example_\n\nPossible fields in `topic.config.yml`:\n\n- `path` (required)\n- `links`\n- `become`\n- `brew_formulas`\n- `brew_casks`\n- `brew_taps`\n- `pacman_packages`\n- `aur_packages`\n- `osx_defaults`\n- `npm_packages`\n- `pip_packages`\n- `gem_packages`\n- `mas_apps`\n\n:bangbang: **TODO**: Describe topic config api in detail.\n\nEach topic configuration is mapped to `root.config.yml`:\n\n```yaml\ntopics:\n  editor:\n    - name: vim\n      state: present\n      config: \"{{ vim_config }}\"\n    - name: emacs\n      state: present\n      config: \"{{ emacs_config }}\"\n    - name: editorconfig\n      state: disabled\n      config: \"{{ editorconfig_config }}\"\n  keyboard:\n    - name: hammerspoon\n      state: present\n      config: \"{{ hammerspoon_config }}\"\n    - name: karabiner\n      state: present\n      config: \"{{ karabiner_config }}\"\n  shell:\n    - name: tmux\n      state: present\n      config: \"{{ tmux_config }}\"\n    - name: zsh\n      state: present\n      config: \"{{ zsh_config }}\"\n  lang:\n    - name: java\n      state: present\n      config: \"{{ java_config }}\"\n    - name: go\n      state: absent\n      config: \"{{ go_config }}\"\n```\n\n_Root dotfile configuration example_\n\nIn `root.config.yml`, topics can be enabled/disabled/removed by setting\ntheir `state` to one of `present`, `disabled` or `absent`. Upon running,\n\n- `present` topics will have their symlinks created (if they don't exist\n  already) and their dependencies installed\n- `disabled` topics will have their symlinks removed (if they exist), but their\n  dependencies left alone (if they are installed)\n- `absent` topics will have their symlinks removed (if they exist) and their\n  dependencies uninstalled (if they are installed)\n\n## CLI\n\n\u003e :wrench: [eliasnorrby/dotfiles-cli][dotfiles-cli-link]\n\nThe CLI provides a simpler way to edit, view and apply configurations.\n\n## Leftovers\n\nAfter running the provisioning script, there are a few things that need to be\nconfigured manually.\n\n### General\n\n- Set the computer name\n  - (MacOS) Preferences \u003ckbd\u003e→\u003c/kbd\u003e Sharing\n  - (Linux) `sudo scutil --set HostName \u003cname-you-want\u003e`\n- Generate ssh keys\n  ```bash\n  ssh-keygen -t ed25519 -C \"your_email@example.com\"\n  gh auth login\n  ```\n  - Docs: [Generate][ssh-github-generate], [Add][ssh-github-add]\n\n### MacOS\n\n- Start all apps and prepare to grant lots of privileges\n  - Start with Karabiner and Hammerspoon to enable app shortcuts\n- Set main Alfred hotkey to \u003ckbd\u003e⌥\u003c/kbd\u003e + \u003ckbd\u003eSPACE\u003c/kbd\u003e\n- Set desktop background (assets available in Dropbox)\n- Add additional desktops\n- Enable shortcuts for desktop navigation (Preferences \u003ckbd\u003e→\u003c/kbd\u003e Keyboard \u003ckbd\u003e→\u003c/kbd\u003e Shortcuts \u003ckbd\u003e→\u003c/kbd\u003e Mission Control)\n- Remap layout switching shortcuts (Preferences \u003ckbd\u003e→\u003c/kbd\u003e Keyboard \u003ckbd\u003e→\u003c/kbd\u003e Shortcuts \u003ckbd\u003e→\u003c/kbd\u003e Input Sources)\n- Add Amethyst padding (`2 px` window margin, `5 px` screen padding)\n- Start Amethyst on Login (menubar configuration)\n- Configure Bartender to hide the appropriate icons, supply license\n- Import iStatMenus settings from `assets/istatmenus`, supply license\n- Some apps may require Rosetta to run\n  - `/usr/sbin/softwareupdate --install-rosetta --agree-to-license`\n- Add Workman-P layout (?)\n\n### Optional\n\n- Download the [Dank Mono font](https://dank.sh)\n\n## Troubleshooting\n\n### zsh: compinit complains about insecure directories\n\nIt's probably mentioning `/usr/local/share/zsh`. Resolve it by running e.g:\n\n```bash\nsudo chown -R eliasnorrby:admin /usr/local/share/zsh\nsudo chmod -R 755 /usr/local/share/zsh\n```\n\n[github-actions-badge]: https://github.com/eliasnorrby/dotfiles/actions/workflows/ci.yml/badge.svg\n[github-actions-link]: https://github.com/eliasnorrby/dotfiles/actions/workflows/ci.yml\n[semantic-release-badge]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\n[semantic-release-link]: https://github.com/semantic-release/semantic-release\n[conventional-commits-badge]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg\n[conventional-commits-link]: https://conventionalcommits.org\n[geerlingguy-homebrew-link]: https://homebrewhub.com/geerlingguy/ansible-role-homebrew\n[geerlingguy-git-link]: https://github.com/geerlingguy/ansible-role-git\n[kewlfft-aur-link]: https://github.com/kewlfft/ansible-aur\n[hlissner-dotfiles-link]: https://github.com/hlissner/dotfiles\n[dotfiles-cli-link]: https://github.com/eliasnorrby/dotfiles-cli\n[ssh-github-generate]: https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent\n[ssh-github-add]: https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feliasnorrby%2Fdotfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feliasnorrby%2Fdotfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feliasnorrby%2Fdotfiles/lists"}