Compare commits

...

374 commits

Author SHA1 Message Date
Bruno BELANYI d918bf279d modules: services: wireguard: add 'milady'
All checks were successful
continuous-integration/drone/push Build is passing
2021-10-10 17:16:29 +02:00
Bruno BELANYI 6f3bee895c modules: secrets: wireguard: add 'milady' 2021-10-10 17:16:29 +02:00
Bruno BELANYI 069987f47e pkgs: dragger: change platforms to linux
All checks were successful
continuous-integration/drone/push Build is passing
I haven't tested it on darwin, and it just so happens that some
dependency is broken on that system (breaking `nix flake check`)...

Will revisit this later in case I ever happen to use a darwin system.
2021-10-08 19:39:43 +02:00
Bruno BELANYI 971b6e9b65 profiles: wm: add 'dragger' when a WM is set up 2021-10-08 15:06:33 +02:00
Bruno BELANYI 8c103a2261 home: gammastep: fix typo 2021-10-08 15:03:45 +02:00
Bruno BELANYI 76f33fbd57 flake: use 'recurseIntoAttrs' in 'pkgs' overlay 2021-10-08 15:00:46 +02:00
Bruno BELANYI 7d787a2770 pkgs: add dragger
Some checks failed
continuous-integration/drone/push Build is failing
2021-10-08 14:59:03 +02:00
Bruno BELANYI 323e99bbb0 home: xdg: make gdb store history in XDG_DATA_HOME
All checks were successful
continuous-integration/drone/push Build is passing
2021-10-08 12:46:00 +02:00
Bruno BELANYI 8569a8eb55 home: firefox: add 'reddit-comment-collapser' 2021-10-06 09:48:20 +02:00
Bruno BELANYI 6d393fdef2 home: firefox: re-organise module 2021-10-06 09:48:20 +02:00
Bruno BELANYI a85922b3b3 home: firefox: add 'refined-github' 2021-10-06 09:48:20 +02:00
Bruno BELANYI d1cd5bfa32 overlays: add sabnzbd-fix-missing-dependencies
All checks were successful
continuous-integration/drone/push Build is passing
While waiting for my PR to fix this [1].

[1]: https://github.com/NixOS/nixpkgs/pull/140478
2021-10-04 15:01:39 +02:00
Bruno BELANYI d64a867afc flake: bump inputs 2021-10-04 14:45:41 +02:00
Bruno BELANYI cc21d84808 home: tmux: add tmux service
All checks were successful
continuous-integration/drone/push Build is passing
The service definition is pretty awful, but it deals with the secure
socket correctly...

This avoids having a small lapse when starting the very first shell of a
session, which must first launch the server.
2021-09-30 16:58:44 +02:00
Bruno BELANYI 84cdc30037 home: tmux: make history longer
We got tons of RAM!
2021-09-30 16:47:52 +02:00
Bruno BELANYI 07cf0fa4da home: wm: i3: launch tmux when starting terminal
All checks were successful
continuous-integration/drone/push Build is passing
Similarly to the `zsh` snippet, launch tmux unless I explicitly do not
want it.

The reason I also add it in `i3` is to make the launch happen sooner,
and to avoid doing double work on some shell startup shenanigans if I
can.
2021-09-30 15:38:43 +02:00
Bruno BELANYI 24de1890fc home: zsh: launch tmux when starting a shell 2021-09-30 15:34:16 +02:00
Bruno BELANYI 4055ef17f0 home: vim: switch back to gruvbox theme
All checks were successful
continuous-integration/drone/push Build is passing
Onedark is too annoying to deal with, and I still like gruvbox's colors
best.
2021-09-29 18:50:33 +02:00
Bruno BELANYI 7ce69233c1 flake: bump inputs 2021-09-29 17:37:15 +02:00
Bruno BELANYI 9f86615e77 profiles: gtk: new best practices for dconf
All checks were successful
continuous-integration/drone/push Build is passing
2021-09-27 17:07:47 +02:00
Bruno BELANYI e805496588 modules: secrets: fix permission for grafana
All checks were successful
continuous-integration/drone/push Build is passing
2021-09-26 23:09:33 +02:00
Bruno BELANYI 3201445c08 modules: secrets: fix permission of 'matrix/mail' 2021-09-26 23:09:33 +02:00
Bruno BELANYI 30eaefc1d1 modules: secrets: add 'owner' logic 2021-09-26 23:09:33 +02:00
Bruno BELANYI 5f41bb1647 modules: secrets: remove 'with lib;' 2021-09-26 23:09:33 +02:00
Bruno BELANYI fec4956063 secrets: move into 'modules' 2021-09-26 23:09:33 +02:00
Bruno BELANYI a62c0ad126 project: bootstrap: retrieve agenix key 2021-09-26 23:09:33 +02:00
Bruno BELANYI 2cc13dddb5 ci: use 'nix flake check'
Now that I am using agenix, secrets stays encrypted at rest.
2021-09-26 23:09:33 +02:00
Bruno BELANYI de92358bc0 flake: remove 'git-crypt' 2021-09-26 23:09:33 +02:00
Bruno BELANYI 167db81c6c secrets: remove git-crypt 2021-09-26 23:09:33 +02:00
Bruno BELANYI 738d1760c3 secrets: remove git-crypt secrets 2021-09-26 23:09:33 +02:00
Bruno BELANYI e962d4c574 modules: services: nginx: sso: use runtime secrets 2021-09-26 23:09:33 +02:00
Bruno BELANYI 1c0d671fff machines: porthos: services: switch to agenix
The prep-work should be done now, time to hit the switch.
2021-09-26 23:09:32 +02:00
Bruno BELANYI 3bf3980e45 modules: services: nginx: allow sso secret files
This is in preparation of the migration to agenix, which does not allow
access to the secrets at build time.
2021-09-26 23:09:32 +02:00
Bruno BELANYI f6faa11ff7 home: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 67090494e2 home: terminal: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 0d44b3b9f2 home: x: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 37c20529c1 home: wm: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 2449a96652 home: mail: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 8a9337710f home: firefox: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 7b75ea43ad profiles: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI fb6e2afe89 modules: services: drone: split into files
This is cleaner to read.
2021-09-26 23:09:32 +02:00
Bruno BELANYI 51067582e0 modules: services: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 78ade4c605 modules: hardware: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 5c2921e00d modules: system: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI 62a18cd3f6 modules: programs: put modules into folders 2021-09-26 23:09:32 +02:00
Bruno BELANYI c6cc64e156 modules: home: put into folder 2021-09-26 23:09:32 +02:00
Bruno BELANYI 875a3d8587 machines: porthos: users: use clear-text ssh key 2021-09-26 23:09:32 +02:00
Bruno BELANYI 409e0ef357 modules: system: users: use agenix secrets 2021-09-26 23:09:32 +02:00
Bruno BELANYI b6af754199 modules: services: wireguard: use agenix secrets 2021-09-26 23:09:32 +02:00
Bruno BELANYI ca5e5a53cd modules: services: nginx: use 'credentialsFile'
In preparation for the migration to agenix.
2021-09-26 23:09:32 +02:00
Bruno BELANYI ba10af0644 modules: services: matrix: use 'mailConfigFile'
In preparation of the migration to agenix.
2021-09-26 23:09:32 +02:00
Bruno BELANYI 0f2c20e51d modules: services: paperless: use 'secretKeyFile'
In preparation for the migration to agenix.
2021-09-26 23:09:32 +02:00
Bruno BELANYI ca218730ff modules: services: nextcloud: use 'credentialsfile'
In preparation for the migration to agenix.
2021-09-26 23:09:32 +02:00
Bruno BELANYI ac5fd7f472 modules: services: miniflux: use 'credentialsFiles'
In preparation for the migration to agenix.
2021-09-26 23:09:32 +02:00
Bruno BELANYI db37cea907 modules: services: transmission: secrets w/ file
In preparation for the migration to using agenix.
2021-09-26 23:09:31 +02:00
Bruno BELANYI 1cf93825b2 secrets: register agenix secrets automatically 2021-09-26 23:09:31 +02:00
Bruno BELANYI 8a2aad9b54 secrets: migrate to agenix
It is finally time to graduate to an actually secure, stateless
solution.
2021-09-26 23:09:31 +02:00
Bruno BELANYI 018394b61d secrets: import 'agenix' module 2021-09-25 13:31:43 +02:00
Bruno BELANYI 1e3c633c72 flake: add 'agenix' 2021-09-25 13:30:51 +02:00
Bruno BELANYI df302465c9 home: remove unused 'secrets' module 2021-09-25 13:27:01 +02:00
Bruno BELANYI 673ead7863 home: ssh: add missing 'mkIf cfg.enable'
All checks were successful
continuous-integration/drone/push Build is passing
2021-09-24 01:21:57 +02:00
Bruno BELANYI 3d10461a6e home: remove unused arguments 2021-09-24 01:21:57 +02:00
Bruno BELANYI 75312c747b modules: remove unused arguments 2021-09-24 01:21:57 +02:00
Bruno BELANYI 68be7743ad machines: remove unused arguments 2021-09-24 01:21:57 +02:00
Bruno BELANYI 9d362655e2 pkgs: remove unused arguments 2021-09-24 01:21:57 +02:00
Bruno BELANYI 604b99a7ac lib: remove 'with self;' 2021-09-24 01:21:57 +02:00
Bruno BELANYI 8467fda721 lib: modules: refactor 'mapModules'
Introduce the recursive version of this function, then refactor to
reduce repetition.
2021-09-24 01:21:57 +02:00
Bruno BELANYI bad9b8a06b lib: modules: document 'mapModules' 2021-09-24 00:26:28 +02:00
Bruno BELANYI 2d26b36e31 modules: services: nginx: use 'recursiveMerge'
All checks were successful
continuous-integration/drone/push Build is passing
2021-09-23 22:11:25 +02:00
Bruno BELANYI c93a9e5a98 home: wm: i3: use 'recursiveMerge' 2021-09-23 22:11:25 +02:00
Bruno BELANYI 3fa14ebe71 lib: attrs: add 'recursiveMerge' 2021-09-23 22:11:25 +02:00
Bruno BELANYI bd1a2000fe modules: system: users: use 'initialHashedPassword'
This is the better option to use in case I want to have a stateless
system.
2021-09-23 21:30:24 +02:00
Bruno BELANYI 4a0c10b897 modules: system: users: use 'ambroisie' password
Do not rely on `my.user.name` which could be changed to a value not
available in the secrets.
2021-09-23 21:28:29 +02:00
Bruno BELANYI 9f3811ea3b modules: programs: steam: respect XDG conventions
All checks were successful
continuous-integration/drone/push Build is passing
Steam wants to pollute HOME with `.steam*` files and folders, which are
useless and annoying.

We want to make sure the wrappers are preferred when installing, so use
`lib.hiPrio` to ensure they get chosen.
2021-09-15 19:23:24 +02:00
Bruno BELANYI 5c95ba1113 machines: aramis: programs: enable steam 2021-09-15 19:23:24 +02:00
Bruno BELANYI 37bb7fd625 modules: programs: add steam 2021-09-15 19:23:24 +02:00
Bruno BELANYI 45321072fc modules: add 'programs' directory 2021-09-15 16:48:10 +02:00
Bruno BELANYI ed456c999d modules: system: remove 'media'
All checks were successful
continuous-integration/drone/push Build is passing
It was not the idiomatic way to do this.
2021-09-15 16:10:06 +02:00
Bruno BELANYI ad848ef89d pkgs: make use of scoping
This is the way to make sure `callPackage` picks up my custom packages
to be used in the set.
2021-09-15 15:33:18 +02:00
Bruno BELANYI 680d0c9f37 home: gdb: add nix store to safe path
For now, the nix store path is hard-coded rather than substituted.

This is useful for pretty-printing C++ types compiled with a different
C++ library from my gdb.
2021-09-03 17:34:39 +02:00
Bruno BELANYI 9a06108603 git: remove duplicate ignore directive
All checks were successful
continuous-integration/drone/push Build is passing
2021-09-01 14:52:38 +02:00
Bruno BELANYI c8633abf6d flake: use 'nativeBuildInputs' 2021-09-01 14:51:27 +02:00
Bruno BELANYI aceb4ef901 pkgs: unified-hosts-lists: do not set 'phases'
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-31 20:11:11 +02:00
Bruno BELANYI 5937d43993 pkgs: unbound-zones-adblock: do not set 'phases' 2021-08-31 20:11:00 +02:00
Bruno BELANYI add6326fdf pkgs: matrix-notifier: do not set 'phases' 2021-08-31 20:10:41 +02:00
Bruno BELANYI b0e4475586 pkgs: i3-get-window-criteria: do not set 'phases' 2021-08-31 20:08:22 +02:00
Bruno BELANYI 5c1dd6500a pkgs: havm: use 'nativeBuildInputs'
This is the correct one to use for a compiler like 'ghc'.
2021-08-31 19:50:44 +02:00
Bruno BELANYI 60e977611c pkgs: diff-flake: do not set 'phases' 2021-08-31 19:03:33 +02:00
Bruno BELANYI 99462199bd pkgs: comma: do not set 'phases' 2021-08-31 19:03:25 +02:00
Bruno BELANYI 4fe18ff4cd pkgs: comma: give path to source directly 2021-08-31 19:03:24 +02:00
Bruno BELANYI 02ffbcf970 pkgs: bw-pass: do not set 'phases' 2021-08-31 18:59:05 +02:00
Bruno BELANYI 878c92b67e pkgs: havm: use 'checkInputs' for test dependency 2021-08-31 18:44:17 +02:00
Bruno BELANYI 8596ce8638 home: wm: i3bar: remove redundant '%' 2021-08-31 18:31:32 +02:00
Bruno BELANYI 808058d576 modules: services: paperless: proxy websockets 2021-08-31 13:52:11 +02:00
Bruno BELANYI 8ffad5d41b machines: porthos: services: enable paperless 2021-08-31 13:52:11 +02:00
Bruno BELANYI 52706ab4c4 modules: services: paperless: add admin password
This is a fallback in case SSO stops working...
2021-08-31 13:52:11 +02:00
Bruno BELANYI 5ae7b593e4 secrets: add paperless password
To be used as a fallback.
2021-08-31 13:52:11 +02:00
Bruno BELANYI 87613a9163 modules: services: add paperless 2021-08-31 13:52:11 +02:00
Bruno BELANYI 47d19e5b3f secrets: add paperless 2021-08-31 13:52:11 +02:00
Bruno BELANYI a78091c57c flake: bump inputs 2021-08-31 13:52:10 +02:00
Bruno BELANYI 9aba0d3ce0 home: pager: remove lesspipe
I don't use it anymore.
2021-08-30 21:23:13 +02:00
Bruno BELANYI 78064bb2a1 modules: services: nginx: nginx-sso verbose logs
All checks were successful
continuous-integration/drone/push Build is passing
For some reason it still doesn't appear in the systemd log...
2021-08-30 17:38:25 +02:00
Bruno BELANYI 70af0ba99a modules: services: nginx: add SSO 2021-08-30 17:36:39 +02:00
Bruno BELANYI dc2a3610a6 modules: services: nginx: enable explicitly 2021-08-30 17:36:39 +02:00
Bruno BELANYI 894b571745 secrets: add sso 2021-08-30 17:36:39 +02:00
Bruno BELANYI 2049e7a2c5 secrets: allow lists in types 2021-08-30 15:35:00 +02:00
Bruno BELANYI 7032ddef37 modules: services: use new nginx wrapper
All checks were successful
continuous-integration/drone/push Build is passing
And when not possible, document why.

Note for the future: there is some repetition in some modules to
configure the correct value of the subdomain, which I happen to know
will line up correctly thanks to the nginx wrapper. A good way to
refactor this in the future would involve avoiding this repetition,
allowing use to query the correct domain in some way...
2021-08-26 15:54:13 +02:00
Bruno BELANYI 81e12969eb modules: services: nginx: overhaul modularity
This should be all that's needed for almost all my services.
2021-08-26 15:54:13 +02:00
Bruno BELANYI b97eff2479 lib: lists: add countValues 2021-08-26 15:54:13 +02:00
Bruno BELANYI 4f742b69f2 lib: lists: add 'mapFilter' 2021-08-26 15:54:13 +02:00
Bruno BELANYI 11fbbd62eb home: zsh: clean-up blank in history
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-25 12:51:38 +02:00
Bruno BELANYI d21087ddcd home: zsh: append to history
Otherwise the file is replaced rather than appended to.
2021-08-25 12:44:42 +02:00
Bruno BELANYI 3919a87d9e home: zsh: do not share history accross shells
It's more annoying than helpful...
2021-08-25 12:22:36 +02:00
Bruno BELANYI 3fd487bbd2 home: gdb: fix configuration path
All checks were successful
continuous-integration/drone/push Build is passing
Turns out the latest version of `gdb` does not yet look for its
configuration in `XDG_CONFIG_HOME`...
2021-08-22 15:02:57 +02:00
Bruno BELANYI 5916ae631d home: gdb: add rr 2021-08-21 01:13:14 +02:00
Bruno BELANYI 1a436fd962 home: gdb: fix auto-load safe path 2021-08-20 21:22:27 +02:00
Bruno BELANYI a48303e66d home: add gdb
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-20 20:03:51 +02:00
Bruno BELANYI 30fc01b5ae modules: services: nextcloud: exclude previews
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-19 14:27:40 +02:00
Bruno BELANYI 13684ecdc4 modules: services: backup: make it verbose 2021-08-19 14:27:40 +02:00
Bruno BELANYI fe720b2de3 machines: porthos: services: enable navidrome
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-19 12:23:06 +02:00
Bruno BELANYI ec6b31f4a6 modules: services: add navidrome 2021-08-19 12:23:06 +02:00
Bruno BELANYI 1335bbfe9d flake: bump inputs
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-19 11:49:41 +02:00
Bruno BELANYI 2cc1925346 modules: services: backup: fix exclude files
All checks were successful
continuous-integration/drone/push Build is passing
I was using the wrong option... Somehow it didn't error out.
2021-08-09 20:08:43 +02:00
Bruno BELANYI eb0c5d5895 pkgs: add drone-scp
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-08 18:03:19 +02:00
Bruno BELANYI 8c298c26f9 pkgs: unified-hosts-lists: 3.6.4 -> 3.8.5
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-07 12:29:41 +02:00
Bruno BELANYI 55a04cfac3 pkgs: bw-pass: report errors to stderr
Useful in case the script can't prompt using `rofi`.
2021-07-31 20:17:37 +02:00
Bruno BELANYI 1783c2838b modules: services: tlp: add power scaling 2021-07-31 16:56:20 +02:00
Bruno BELANYI e215f7aa1d modules: services: nextcloud: upgrade version
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-29 13:42:28 +02:00
Bruno BELANYI afb683f1cf flake: bump inputs
And update package names for grafana dashboards to avoid breaking the
config.
2021-07-29 13:42:28 +02:00
Bruno BELANYI c320387746 modules: services: postgres: upgrade version 2021-07-29 13:03:10 +02:00
Bruno BELANYI bbb1231ad3 modules: services: postgres: add migration script
The process to upgrade is:

* Make sure the version number of the script is one major version over
  the service version.

* Activate the script, rebuild configuration.

* Run `upgrade-pg-cluster` as `root`. One can give arguments like
  `--link` or `--jobs 4` to speedup the process. See documentation for
  some details.

* Change package to new version once the upgrade is finished, rebuild
  configuration.

* Optionally, `ANALYZE` the new database.
2021-07-29 13:02:49 +02:00
Bruno BELANYI 9f00d8a38e modules: services: add postgresql
Enable the service itself in other modules when needed, but pin the
package in a single place.
2021-07-29 12:43:28 +02:00
Bruno BELANYI 820b52314f modules: services: monitoring: add scrape interval
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-15 18:54:07 +02:00
Bruno BELANYI a3293277d9 flake: flatten and filter packages w/ flake-utils
All checks were successful
continuous-integration/drone/push Build is passing
Instead of my home-grown solution, use one that has been upstreamed.
2021-07-14 21:49:31 +02:00
Bruno BELANYI 2ecd417a68 machines: porthos: services: enable monitoring
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-13 19:17:33 +02:00
Bruno BELANYI 4e8045716c secrets: add monitoring password 2021-07-13 19:17:33 +02:00
Bruno BELANYI e060476f32 modules: services: add monitoring dashboard 2021-07-13 19:17:33 +02:00
Bruno BELANYI 2458ddf59d modules: services: add monitoring
This includes a dashboard to monitor system ressources, using
Prometheus.
2021-07-13 19:17:33 +02:00
Bruno BELANYI 8927b3182f flake: bump inputs 2021-07-13 19:08:54 +02:00
Bruno BELANYI f2dfeeb35b home: git: use topological order in log
It is the one that makes most sense, rather than some kind of date
order...
2021-07-13 17:50:44 +02:00
Bruno BELANYI 971b610cd5 modules: services: matrix: SSL only for server
This is a requirement anyway for homeservers, and the `forceSSL` option
tried to create a redirect for non-SSL traffic, except the `listen`
option only provided SSL endpoints anyway, so this resulted in
additional rules in the nginx config looking like this:

```nginx
server {
        server_name matrix.belanyi.fr ;
        location /.well-known/acme-challenge {
                root /var/lib/acme/acme-challenge;
                auth_basic off;
        }
        location / {
                return 301 https://$host$request_uri;
        }
}
```
2021-07-13 17:43:31 +02:00
Bruno BELANYI 21f48b5f71 pkgs: bw-pass: change password prompt
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-04 11:52:07 +02:00
Bruno BELANYI a3edf2548b overlays: transgui: correctly use previous patches 2021-07-04 11:52:07 +02:00
Bruno BELANYI ea7b064546 home: direnv: update to new option name
All checks were successful
continuous-integration/drone/push Build is passing
And enable the flakes option.

I don't actually use this on my own projects, but it could be useful for
other projects that I contribute to.
2021-06-30 20:08:07 +02:00
Bruno BELANYI ff8e64d601 home: mail: add himalaya
This mail client is very KISS. I like it.
2021-06-30 20:08:06 +02:00
Bruno BELANYI 791109c3c1 flake: bump inputs 2021-06-30 20:07:55 +02:00
Bruno BELANYI 6eb3942270 home: firefox: add sponsorblock
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-27 19:51:04 +02:00
Bruno BELANYI 2232062fd9 home: secrets: use more specific type
I will amend it if I need more types, but for now this is fine.
2021-06-27 19:48:42 +02:00
Bruno BELANYI d6e9f9786d secrets: use more specific type
I will amend it if I need more types, but for now this is fine.
2021-06-27 19:48:26 +02:00
Bruno BELANYI 5abe4e929e modules: hardware: sound: refactor options
All checks were successful
continuous-integration/drone/push Build is passing
Do not enable ALSA when using pipewire. Ensure that both pulseaudio and
pipewire are not configured at the same time.
2021-06-27 01:59:07 +02:00
Bruno BELANYI 57717d70ef home: wm: i3: also toggle xss-lock 2021-06-26 18:38:11 +02:00
Bruno BELANYI 7a382368e8 modules: move home configuration from flake 2021-06-25 20:46:36 +02:00
Bruno BELANYI 0f17123d09 modules: change username configuration option
It makes more sense to have a `my.user` option.
2021-06-25 20:45:36 +02:00
Bruno BELANYI c6d21493ef home: zsh: explicitly set history save size
All checks were successful
continuous-integration/drone/push Build is passing
Turns out the `history.save` limit is for what is *loaded into memory*,
not what is written to disk.
2021-06-23 23:14:05 +02:00
Bruno BELANYI 5cebb9b54b home: zsh: explicitly opt out of extended history 2021-06-23 23:13:39 +02:00
Bruno BELANYI 92c2748747 home: wm: dunst: use rofi as 'dmenu' when enabled 2021-06-23 23:08:23 +02:00
Bruno BELANYI 4cae294cf5 home: wm: i3: enable rofi bindings when applicable 2021-06-23 23:06:15 +02:00
Bruno BELANYI 23c6093c36 home: wm: dunst: add line wrapping
All checks were successful
continuous-integration/drone/push Build is passing
Once again, trying to make them actually readable.
2021-06-22 19:48:03 +02:00
Bruno BELANYI 3fdcfb5b5f home: wm: dunst: add max icon size
All checks were successful
continuous-integration/drone/push Build is passing
Otherwise I end up with icons that are way too big...
2021-06-22 19:39:35 +02:00
Bruno BELANYI c9418cc4d3 pkgs: matrix-notifier: 0.1.2 -> 0.2.0
All checks were successful
continuous-integration/drone/push Build is passing
`pandoc` is now a dependency.
2021-06-16 21:19:09 +02:00
Bruno BELANYI cd02cbff45 pkgs: use 'lib' as first input
All checks were successful
continuous-integration/drone/push Build is passing
This is the idiomatic style in nixpkgs.
2021-06-16 20:13:25 +02:00
Bruno BELANYI daa69a54fa modules: services: indexers: limit Jackett memory
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-15 21:25:56 +02:00
Bruno BELANYI 212dd299e2 pkgs: matrix-notifier: 0.1.0 -> 0.1.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-15 18:42:13 +02:00
Bruno BELANYI cff3811cad home: wm: screen-lock: use actual assertion
All checks were successful
continuous-integration/drone/push Build is passing
Instead of hijacking the type verification, use an assertion.
2021-06-15 17:45:17 +02:00
Bruno BELANYI 8f266245ee modules: system: add boot
And enable mounting `/tmp` as tmpfs by default.
2021-06-14 16:41:28 +02:00
Bruno BELANYI b8be3d80a8 ci: migrate to 'exec' runner
All checks were successful
continuous-integration/drone/push Build is passing
Now that I have written a script to do the Matrix notification, I can do
that.
2021-06-13 18:38:09 +02:00
Bruno BELANYI b04c1b09ea pkgs: add matrix-notifier 2021-06-13 18:37:11 +02:00
Bruno BELANYI 3a471433ed home: secrets: clean-up 'default.nix'
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-12 20:35:28 +02:00
Bruno BELANYI f8325cc9c7 secrets: clean-up 'default.nix' 2021-06-12 20:35:06 +02:00
Bruno BELANYI cd1173d2f6 flake: filter 'packages' on system 2021-06-12 19:56:17 +02:00
Bruno BELANYI e319eaf09f pkgs: bw-pass: fix 'meta.platforms'
This makes use of 'keyutils' which only works on Linux.
2021-06-12 19:30:25 +02:00
Bruno BELANYI e6ba569b36 modules: system: documentation: include POSIX man
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-12 13:23:09 +02:00
Bruno BELANYI ee21de5b94 modules: services: matrix: add mail configuration
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-09 19:14:09 +02:00
Bruno BELANYI 6614b47546 secrets: matrix: add mail configuration 2021-06-09 19:14:09 +02:00
Bruno BELANYI 06c53620f8 modules: services: matrix: enable spaces 2021-06-09 18:33:54 +02:00
Bruno BELANYI d43045c6d6 modules: services: matrix: add SMS verification 2021-06-09 18:32:59 +02:00
Bruno BELANYI 6113ad154d home: firefox: tridactyl: add tabduplicate mapping
Some checks reported errors
continuous-integration/drone/push Build encountered an error
2021-06-07 17:56:46 +02:00
Bruno BELANYI e8982b8bc9 machines: aramis: profiles: enable devices 2021-06-07 17:56:46 +02:00
Bruno BELANYI 7684489c9a profiles: add devices 2021-06-07 17:56:46 +02:00
Bruno BELANYI 1994ef2b1b modules: hardware: add mx-ergo
This adds the ability to scroll using the ball, which is way better.
2021-06-07 17:56:46 +02:00
Bruno BELANYI a434016252 home: wm: i3: remove 'udiskie' and 'flameshot'
It makes more sense to activate those at the `profile` level.
2021-06-03 17:34:16 +02:00
Bruno BELANYI 1794eefd30 profiles: wm: enable 'i3' helpers
`flameshot` and `udiskie` provide some functionnality that would usually
be found in an actual DE.

It makes more sense to activate them here instead of in the home
configuration, so I will remove it in the next commit.
2021-06-03 17:33:13 +02:00
Bruno BELANYI 29437d3e3f home: wm: i3: move script generation out-of-line
This makes for a cleaner configuration file.
2021-06-03 17:18:33 +02:00
Bruno BELANYI a827a34501 git: ignore generated pre-commit configuration
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-31 23:06:37 +02:00
Bruno BELANYI 610b0f2f4b nix: evaluate shell hooks
This activates the pre-commit-hook configuration.
2021-05-31 23:06:20 +02:00
Bruno BELANYI 59cb038045 flake: add pre-commit-hooks
Instead of havin the tool manage versions, use a pinned version.
2021-05-31 23:04:08 +02:00
Bruno BELANYI 15db81eb3b flake: change format 2021-05-31 23:02:32 +02:00
Bruno BELANYI 24efa3edca machines: aramis: hardware: enable trackpoint 2021-05-31 20:30:36 +02:00
Bruno BELANYI 2fe4f1faad modules: home: use 'username' config value 2021-05-30 01:31:05 +02:00
Bruno BELANYI 4f1f687eea flake: use 'username' config value 2021-05-30 01:20:14 +02:00
Bruno BELANYI b90be0acdf home: zsh: remove trailing whitespace
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-30 00:46:09 +02:00
Bruno BELANYI ea4c699b81 modules: system: users: make it configurable
Notably, make use of my global 'username' option.
2021-05-30 00:46:09 +02:00
Bruno BELANYI 8efe75295d modules: add option to specify username
Given that I use it in plenty of places, it makes sense to place it
there for reference in other modules.
2021-05-30 00:46:09 +02:00
Bruno BELANYI 2d9b11406a modules: system: packages: make it configurable 2021-05-30 00:46:09 +02:00
Bruno BELANYI 003c08cb09 modules: system: nix: make it configurable 2021-05-30 00:46:09 +02:00
Bruno BELANYI 6728b50d3a modules: system: language: make it configurable 2021-05-30 00:46:09 +02:00
Bruno BELANYI 2eaf3bf2c7 modules: system: move 'packages' 2021-05-29 16:58:44 +02:00
Bruno BELANYI 0077ce1f94 modules: system: move 'nix' 2021-05-29 16:58:44 +02:00
Bruno BELANYI 14d9fc89f1 modules: system: move 'documentation' 2021-05-29 16:58:44 +02:00
Bruno BELANYI f660bf94e9 modules: system: move 'language' 2021-05-29 16:58:44 +02:00
Bruno BELANYI 3b9f01e780 modules: system: move 'users' 2021-05-29 16:58:44 +02:00
Bruno BELANYI 60f1e693d1 modules: system: move 'media' 2021-05-29 16:56:15 +02:00
Bruno BELANYI ce4b0b8c90 modules: add 'system' directory 2021-05-29 16:56:15 +02:00
Bruno BELANYI d2704b17fe modules: move 'services' into subfolder 2021-05-29 16:56:15 +02:00
Bruno BELANYI 31f8ec6e98 modules: hardware: move 'upower' 2021-05-29 16:56:15 +02:00
Bruno BELANYI af67d04992 modules: hardware: move 'sound' 2021-05-29 16:56:15 +02:00
Bruno BELANYI f9bcf79430 modules: hardware: move 'networking' 2021-05-29 16:56:15 +02:00
Bruno BELANYI b0cc830467 modules: hardware: move 'ergodox' 2021-05-29 16:56:15 +02:00
Bruno BELANYI 9b054d10c7 modules: hardware: move 'bluetooth' 2021-05-29 16:56:15 +02:00
Bruno BELANYI e81aaa8ebc modules: add 'hardware' directory 2021-05-29 16:56:15 +02:00
Bruno BELANYI 737b5e797b modules: ergodox: remove useless group clause
The `zsa` module already add the group itself.
2021-05-29 16:15:20 +02:00
Bruno BELANYI 6728b5b949 flake: bump inputs
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-29 12:23:01 +02:00
Bruno BELANYI 2999ba7c0b services: jellyfin: fix proxy configuration
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-28 11:38:28 +02:00
Bruno BELANYI 1ac9f0cc8c home: comma: configure custom 'nixpkgs' flake
All checks were successful
continuous-integration/drone/push Build is passing
This makes use of my pinned `pkgs` flake from the registry by default.
2021-05-27 21:50:27 +02:00
Bruno BELANYI 6074958292 home: extract 'comma' into its own module 2021-05-27 21:49:24 +02:00
Bruno BELANYI da21e7a6f2 pkgs: comma: allow override which nixpkgs is used
This is useful for me to use my pinned `pkgs` instead.
2021-05-27 21:42:41 +02:00
Bruno BELANYI 395f15f181 pkgs: add volantes-cursors 2021-05-27 19:57:31 +02:00
Bruno BELANYI 059831b532 home: x: cursor: switch to Vimix
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-27 19:15:52 +02:00
Bruno BELANYI 76d165343e pkgs: add vimix-cursors 2021-05-27 19:15:52 +02:00
Bruno BELANYI f66da6fee6 home: git: add 'pick' alias
All checks were successful
continuous-integration/drone/push Build is passing
I wanted to name it 'pickaxe' but for a curious reason, it does not seem
to be working when I use that alias...

I am trying to find a second alias name for `git log -p -S`, which only
shows commits that change the number of occurrences of its pickaxe in
the file. Whereas `-G` shows any commit involving the pickaxe in its
diff.
2021-05-25 23:13:35 +02:00
Bruno BELANYI ca1c7962ea machines: aramis: sound: switch to pipewire
The support for mSBC means I should get better audio on my QC35.
2021-05-25 23:13:35 +02:00
Bruno BELANYI 796df5475e home: wm: i3: use pamixer for audio control
This can be used with either pipewire and pulseaudio without having to
install all of pulseaudio.
2021-05-25 23:13:35 +02:00
Bruno BELANYI 414606b58e modules: bluetooth: add pipewire codecs 2021-05-25 23:13:35 +02:00
Bruno BELANYI 931b67fdb2 modules: sound: add pipewire configuration 2021-05-25 18:19:52 +02:00
Bruno BELANYI 8b4966fcbe machines: aramis: sound: use common module 2021-05-25 18:19:52 +02:00
Bruno BELANYI a508db48c9 modules: add sound
I will probably want to share this configuration between multiple
machines in the future.
2021-05-25 18:19:52 +02:00
Bruno BELANYI 406eeea9f6 services: podgrab: remove mention of merged PR
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-23 00:32:59 +02:00
Bruno BELANYI 9d3d86365c project: readme: mention manual flood config
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-23 00:14:26 +02:00
Bruno BELANYI 78d77890de machines: porthos: services: enable flood
Some checks failed
continuous-integration/drone/push Build is failing
2021-05-22 23:59:27 +02:00
Bruno BELANYI a33fbc6659 services: add flood 2021-05-22 23:59:27 +02:00
Bruno BELANYI b134aedff0 home: wm: i3bar: invert baclight icon
Because I am using an emoji font, it looks better that way.
2021-05-22 23:59:27 +02:00
Bruno BELANYI d31e293cef home: mail: add msmtp 2021-05-22 23:49:57 +02:00
Bruno BELANYI 182ec2a4db home: add mail and accounts configuration 2021-05-22 23:49:57 +02:00
Bruno BELANYI 81647c5a02 home: terminal: use 'cfg.terminal' for TERMINAL 2021-05-22 23:49:57 +02:00
Bruno BELANYI 8a8f7387f4 pkgs: add bw-pass
Until `rbw` gets support for Yubikey 2FA, I still need a decent way to
query for my passwords on the command line...

This wrapper program should be good enough for basic usage with programs
that need a password command.
2021-05-22 23:49:57 +02:00
Bruno BELANYI f2b20c65a8 modules: nix: expose pinned nixpkgs as 'pkgs'
That way if I do want to use that latest version, I can still use
`nixpkgs#<whatever>`.
2021-05-22 23:49:57 +02:00
Bruno BELANYI cc37713839 home: firefox: tridactyl: fix Reddit URL rewriter 2021-05-22 23:49:57 +02:00
Bruno BELANYI e80485018c home: firefox: add ff2mpv
This allows watching videos using mpv via a simple button.
2021-05-22 23:49:57 +02:00
Bruno BELANYI 15abb291ef machines: aramis: home: enable mpv 2021-05-22 23:49:57 +02:00
Bruno BELANYI fb56631ef3 home: add mpv 2021-05-22 23:49:57 +02:00
Bruno BELANYI 9113290161 pkgs: add ff2mpv-go 2021-05-22 23:49:57 +02:00
Bruno BELANYI 943ea20b16 services: podgrab: switch to upstream service 2021-05-22 23:49:57 +02:00
Bruno BELANYI 129fcdd42c pkgs: remove podgrab
Now that it has been merged upstream, no reason to keep it.
2021-05-22 23:49:02 +02:00
Bruno BELANYI d086af7e00 modules: nix: pin flake registry to common inputs 2021-05-22 23:47:27 +02:00
Bruno BELANYI e4d8a4d4b2 flake: inject 'inputs' into NixOS configuration 2021-05-22 23:47:27 +02:00
Bruno BELANYI 1a5dd0b91c home: wm: rofi: configure terminal 2021-05-22 23:47:27 +02:00
Bruno BELANYI 02c2a23ee5 profiles: laptop: enable TLP 2021-05-22 23:47:27 +02:00
Bruno BELANYI f6ace9d438 services: add TLP 2021-05-22 23:47:27 +02:00
Bruno BELANYI 2a0b5b7802 pkgs: add myself as maintainer to all packages 2021-05-22 23:47:27 +02:00
Bruno BELANYI 2c596395b0 home: add nix-index 2021-05-22 23:47:27 +02:00
Bruno BELANYI 986701d1c8 services: adblock: use new 'settings' option
This shows that I have not upgraded the server in a while...
2021-05-22 23:47:27 +02:00
Bruno BELANYI ee33ab11c6 flake: bump inputs 2021-05-20 17:55:45 +02:00
Bruno BELANYI 7d0a772cce home: firefox: tridactyl: fix parent URL on Reddit
All checks were successful
continuous-integration/drone/push Build is passing
2021-05-16 00:03:59 +02:00
Bruno BELANYI 97ee498405 home: packages: add 'comma' to common package set 2021-05-16 00:03:59 +02:00
Bruno BELANYI e5fdfd6c44 pkgs: add comma 2021-05-16 00:03:59 +02:00
Bruno BELANYI 76148d75b8 machines: aramis: services: remove gnupg-agent
The one configured by home-manager is more appropriate.
2021-05-16 00:03:59 +02:00
Bruno BELANYI 9e6bc604f3 home: x: add 'xsel' package
I like it better than 'xclip'.
2021-05-16 00:03:59 +02:00
Bruno BELANYI b4d3b06fbf home: zsh: make history ten times bigger 2021-05-16 00:03:59 +02:00
Bruno BELANYI 8de23feee7 profiles: laptop: enable power-alert 2021-05-16 00:03:59 +02:00
Bruno BELANYI 0fc3bf3096 home: add power-alert 2021-05-16 00:03:59 +02:00
Bruno BELANYI 7d48b0edab profiles: laptop: enable upower 2021-05-16 00:03:59 +02:00
Bruno BELANYI d23ad8f5e1 modules: add upower 2021-05-16 00:03:59 +02:00
Bruno BELANYI f3764ce20e home: pager: fix colorized man pages
Turns out that sessionVariables are not being set at the proper time for
use with `tput`.

This commit also cleans up a bit how the config was being set.
2021-05-16 00:03:59 +02:00
Bruno BELANYI f9d849c5da home: wm: i3bar: add 'backlight' block 2021-05-16 00:03:59 +02:00
Bruno BELANYI 59e833a55b home: wm: i3bar: remove gammastep block
It doesn't seem to be working well with my setup...
2021-05-16 00:03:59 +02:00
Bruno BELANYI 03130ed9ee home: wm: i3: use 'brightnessctl' 2021-05-16 00:03:59 +02:00
Bruno BELANYI ac4cf0c1a2 home: wm: i3: fix screen-related mappings 2021-05-16 00:03:59 +02:00
Bruno BELANYI fab93a5f2f modules: users: simplify 'groupsIfExist' 2021-05-16 00:03:59 +02:00
Bruno BELANYI f04368a71e machines: porthos: set timezone 2021-05-16 00:03:59 +02:00
Bruno BELANYI 30ce91557d machines: aramis: use laptop profile 2021-05-16 00:03:59 +02:00
Bruno BELANYI d46f66842f profiles: add laptop 2021-05-16 00:03:59 +02:00
Bruno BELANYI 737484dcfe machines: aramis: use X profile 2021-05-16 00:03:59 +02:00
Bruno BELANYI 125935ac0f profiles: add X 2021-05-16 00:03:59 +02:00
Bruno BELANYI e786eaddde machines: aramis: use gtk profile 2021-05-16 00:03:59 +02:00
Bruno BELANYI e211ac7d73 profiles: add gtk 2021-05-16 00:03:59 +02:00
Bruno BELANYI 3f50abcbe0 machines: aramis: use wm profile 2021-05-16 00:03:59 +02:00
Bruno BELANYI 1c2193d698 profiles: add wm 2021-05-16 00:03:59 +02:00
Bruno BELANYI 12b3397a20 modules: bluetooth: fix documentation 2021-05-16 00:03:59 +02:00
Bruno BELANYI ca620a4eb6 machines: aramis: enable bluetooth profile 2021-05-16 00:03:59 +02:00
Bruno BELANYI 885b45d39c profiles: add bluetooth 2021-05-16 00:03:59 +02:00
Bruno BELANYI 0c943d8430 flake: add profiles folder
This will be used for configurations that either consolidates multiple options
that make sens to use together, or span accross system and home configuration.
2021-05-16 00:03:59 +02:00
Bruno BELANYI 79dfb3a979 home: gtk: do not set font size
Turns out that I do not like how it interferes with Firefox's
rendering... I should probably investigate this in the future if I want
to use this option.
2021-05-16 00:03:59 +02:00
Bruno BELANYI 00a5d1b076 machines: aramis: home: enable GTK
In order to not have an error at activation, dconf must be made
available to the dbus service.
2021-05-10 00:31:01 +02:00
Bruno BELANYI 5e193b3a42 home: add gtk 2021-05-10 00:31:01 +02:00
Bruno BELANYI bf9de874ce machines: aramis: home: add transgui 2021-05-10 00:31:01 +02:00
Bruno BELANYI 5aaa497653 overlays: add transgui-fix-duplicate-status
Upstream is being slow in merging the patch...
2021-05-10 00:31:01 +02:00
Bruno BELANYI 3887a86650 flake: add overlays folder 2021-05-10 00:31:01 +02:00
Bruno BELANYI f57fd32088 machines: aramis: home: add jellyfin-media-player 2021-05-10 00:31:01 +02:00
Bruno BELANYI 1c147613e4 home: terminal: export TERMINAL when appropriate
This is used by some programs, like 'rofi' to launch terminal programs.
2021-05-10 00:31:01 +02:00
Bruno BELANYI 15190d4b50 pkgs: i3-get-window-criteria: remove whitespace 2021-05-10 00:31:01 +02:00
Bruno BELANYI 5f7d2c74bc home: wm: i3: add i3-get-window-criteria package 2021-05-10 00:31:01 +02:00
Bruno BELANYI 53dd04a0b7 pkgs: add i3-get-window-criteria 2021-05-10 00:31:01 +02:00
Bruno BELANYI 86ab6bf17a machines: aramis: home: enable feh 2021-05-10 00:31:01 +02:00
Bruno BELANYI 6008ac470c home: add feh 2021-05-10 00:31:01 +02:00
Bruno BELANYI 717c628ff1 machines: aramis: home: set up background
`i3` inherits its background from `lightdm`.
2021-05-10 00:31:01 +02:00
Bruno BELANYI 749ef9f072 home: packages: add 'file' to common package set 2021-05-10 00:31:01 +02:00
Bruno BELANYI a0c63f00f9 home: pager: add colored man page support 2021-05-10 00:31:01 +02:00
Bruno BELANYI d9734dd505 machines: aramis: add some additional packages 2021-05-10 00:31:01 +02:00
Bruno BELANYI 4225bdd103 home: packages: add option for additional packages 2021-05-10 00:31:01 +02:00
Bruno BELANYI 3a07cffa14 modules: documentation: add linux man pages option
I want to be able to read about syscalls or the C library.
2021-05-10 00:31:01 +02:00
Bruno BELANYI 06f9f423e9 modules: documentation: use 'mkDisableOption'
The documentation module already gates behind 'documentation.enable' for
the other options.
2021-05-10 00:31:01 +02:00
Bruno BELANYI ad1d907c25 home: x: add cursor
I would like to check out alternative themes. Notably Quintom [1],
Volantes [2], and Vimix [3].

[1]: https://gitlab.com/Burning_Cube/quintom-cursor-theme
[2]: https://github.com/varlesh/volantes-cursors
[3]: https://github.com/vinceliuice/Vimix-cursors
2021-05-10 00:31:01 +02:00
Bruno BELANYI ef0f4bdca5 machines: aramis: home: enable bluetooth 2021-05-10 00:31:01 +02:00
Bruno BELANYI b4d002033a home: add bluetooth 2021-05-10 00:31:01 +02:00
Bruno BELANYI 8837c7c33c home: wm: i3bar: use FontAwesome5 for icons 2021-05-10 00:31:01 +02:00
Bruno BELANYI f4cc68a650 home: wm: i3: use new 'fonts' option type 2021-05-10 00:31:01 +02:00
Bruno BELANYI 79525013b0 flake: bump inputs 2021-05-10 00:31:01 +02:00
Bruno BELANYI 2b8d01f056 machines: aramis: enable bluetooth 2021-05-10 00:31:01 +02:00
Bruno BELANYI b115d94cd6 modules: add bluetooth 2021-05-10 00:31:01 +02:00
Bruno BELANYI 1022601602 machines: aramis: networking: use wireless option 2021-05-10 00:31:01 +02:00
Bruno BELANYI 376e60d71e modules: networking: add 'wireless' option 2021-05-10 00:31:01 +02:00
Bruno BELANYI a03db294fe machines: aramis: install: exit on error 2021-05-10 00:31:01 +02:00
Bruno BELANYI f2b9040175 machines: aramis: home: enable nm-applet 2021-05-10 00:31:01 +02:00
Bruno BELANYI b1e8664e32 home: add nm-applet 2021-05-10 00:31:01 +02:00
Bruno BELANYI b61aca7def modules: users: add myself to 'networkmanager' 2021-05-08 17:14:13 +02:00
Bruno BELANYI d388a379d4 machine: aramis: networking: use networkmanager
I consider WiFi configurations to be ephemeral
2021-05-08 17:14:13 +02:00
Bruno BELANYI 3402b92784 home: gammastep: show tray icon 2021-05-08 17:14:13 +02:00
Bruno BELANYI b55466b791 home: gammastep: change default night temperature
I want the colour to be warmer, and blues even more attenuated.
2021-05-08 17:14:13 +02:00
Bruno BELANYI 036d59ec11 home: wm: i3: add mic mute media key 2021-05-08 17:14:13 +02:00
Bruno BELANYI f89e1ba3e9 home: wm: i3: fix audio media keys 2021-05-08 17:14:13 +02:00
Bruno BELANYI 8788deac5e home: wm: i3bar: extend width of music block 2021-05-08 17:14:13 +02:00
Bruno BELANYI 676cd03c9c home: wm: i3bar: show temperature block by default 2021-05-08 17:14:13 +02:00
Bruno BELANYI e329e7a59a home: zsh: enable VTE integration when appropriate 2021-05-08 17:14:13 +02:00
Bruno BELANYI 98a8e068ea machines: aramis: services: enable wireguard 2021-05-08 17:14:13 +02:00
Bruno BELANYI f5fcd2a7a6 home: wm: screen-lock: add 'notify.delay' setting 2021-05-08 17:14:13 +02:00
Bruno BELANYI 1b9b598662 home: wm: screen-lock: add corner delay setting 2021-05-08 17:14:13 +02:00
Bruno BELANYI 05e0cd4e1f modules: users: reformat 2021-05-08 17:14:13 +02:00
Bruno BELANYI 9973e0d32f home: firefox: add form-history-control extension 2021-05-08 17:14:13 +02:00
Bruno BELANYI 8231e8feaa home: wm: i3: use keycode for shutdown mapping
The motivation for using keycodes for all those mappings is to allow
switch to an actual french keyboard layout it still be able to move
through workspaces etc...
2021-05-08 17:14:13 +02:00
Bruno BELANYI 8dc89846b2 machines: aramis: home: use GTK pinentry
I do have a graphical session, I can afford to be "fancy"
2021-05-08 17:14:13 +02:00
Bruno BELANYI 5a32160954 home: gpg: make pinentry configurable 2021-05-08 17:14:13 +02:00
Bruno BELANYI 6612d0226a modules: packages: prefer user compinit to global
This should make the shell startup faster.
2021-05-08 17:14:13 +02:00
Bruno BELANYI 75e3d9bf70 project: bootstrap: unlock BW when logged in 2021-05-08 17:14:13 +02:00
Bruno BELANYI 9dbfb65c27 home: wm: i3: add display bindings 2021-05-08 17:14:13 +02:00
Bruno BELANYI f8d6447ac4 home: wm: i3: add dunst bindings 2021-05-08 17:14:13 +02:00
Bruno BELANYI 185781a4e2 home: wm: i3: add binding to toggle xautolock 2021-05-08 17:14:13 +02:00
Bruno BELANYI cdc29efafc home: wm: screen-lock: add xautolock options 2021-05-08 17:14:13 +02:00
Bruno BELANYI 9f6c614c9f home: wm: add screen-lock 2021-05-08 17:14:13 +02:00
Bruno BELANYI 54a20058fb home: wm: dunst: add configuration 2021-05-08 17:14:13 +02:00
Bruno BELANYI 6bad81a644 home: wm: add dunst 2021-05-08 17:14:13 +02:00
Bruno BELANYI 971ee359ce home: wm: use explicit 'enable' options
This is so that I can explicitly enable them if I were to use Wayland
and Sway, given that they should be compatible with both environment.

This also means that putting them in `/home/x/` would a misnomer... Will
revisit this if and when I try out Wayland and sway...
2021-05-08 17:14:13 +02:00
Bruno BELANYI c175964630 modules: users: add myself to 'video' and 'audio' 2021-05-08 17:14:13 +02:00
Bruno BELANYI 046391e26e home: wm: i3bar: hide music block when not playing 2021-05-08 17:14:13 +02:00
Bruno BELANYI b32fec2c63 home: wm: i3bar: add gammastep block if enabled 2021-05-08 17:14:13 +02:00
Bruno BELANYI 3ec448bf03 machines: aramis: home: enable gammastep 2021-05-08 17:14:13 +02:00
Bruno BELANYI c3c44bceb6 home: add gammastep 2021-05-08 17:14:13 +02:00
Bruno BELANYI e1240c188e home: firefox: add tridactyl 2021-05-08 17:14:13 +02:00
Bruno BELANYI d5b3b95827 home: firefox: use tridactyl-native when enabled 2021-05-08 17:14:13 +02:00
Bruno BELANYI c17b5f4004 machines: aramis: home: enable firefox 2021-05-08 17:14:13 +02:00
Bruno BELANYI e06edc8f47 home: add firefox 2021-05-08 17:14:13 +02:00
Bruno BELANYI 4d04dd9b9b home: wm: i3: use udiskie service 2021-05-08 17:14:13 +02:00
Bruno BELANYI e6b810b5a1 home: add udiskie 2021-05-08 17:14:13 +02:00
Bruno BELANYI 595720dcd4 home: wm: i3: use flameshot service directly
Instead of starting `flameshot` with `i3`, use the provided service.
2021-05-08 17:14:13 +02:00
Bruno BELANYI e6fb00ce9a home: add flameshot 2021-05-08 17:14:13 +02:00
Bruno BELANYI d01b7963cd machines: aramis: home: enable zathura 2021-05-08 17:14:13 +02:00
Bruno BELANYI 646768c3b7 home: add zathura 2021-05-08 17:14:13 +02:00
Bruno BELANYI b254e0f7ac machines: aramis: home: enable termite 2021-05-08 17:14:13 +02:00
Bruno BELANYI fee045d82c home: wm: i3: use 'my.home.terminal' explicitly 2021-05-08 17:14:13 +02:00
Bruno BELANYI 76b17e924a home: terminal: add termite 2021-05-08 17:14:13 +02:00
Bruno BELANYI 9fe78a5a70 home: add terminal
This module abstracts away the color configuration.
2021-05-08 17:14:13 +02:00
Bruno BELANYI 90ccf42779 home: wm: i3: add configuration 2021-05-08 17:14:13 +02:00
Bruno BELANYI cdbe16e703 home: wm: add rofi 2021-05-08 17:14:13 +02:00
Bruno BELANYI 1da8177ea2 home: wm: add i3bar 2021-05-08 17:14:13 +02:00
Bruno BELANYI fe9f468e06 machines: aramis: home: enable X & i3 2021-05-08 17:14:13 +02:00
Bruno BELANYI 45cb955433 machines: aramis: add home configuration 2021-05-08 17:14:13 +02:00
Bruno BELANYI b6fb77fc34 modules: add home
This makes setting and referring to my home-manager options easier.
2021-05-08 17:14:13 +02:00
Bruno BELANYI f57cfda767 home: wm: add i3
This is only the basic default configuration. The full configuration
will come later.

I am not a fan of `wm.windowManager`, I might rename that option at some
point.
2021-05-08 17:14:13 +02:00
Bruno BELANYI 5427f15a17 home: add X keyboard configuration 2021-05-08 17:14:13 +02:00
Bruno BELANYI 6acf9f4a19 machines: add aramis 2021-05-08 17:14:13 +02:00
Bruno BELANYI cd7c8e2172 lib: attrs: add renaming functions 2021-05-08 17:14:13 +02:00
Bruno BELANYI e0b0f44a9a lib: attrs: document functions 2021-05-08 17:14:13 +02:00
Bruno BELANYI bd53470e46 lib: attrs: add genAttrs' function 2021-05-08 17:14:13 +02:00
Bruno BELANYI f634f1b2ed flake: refactor handling of shared modules 2021-05-08 17:14:13 +02:00
Bruno BELANYI dc052386d1 machine: aramis: add installer script
This is the first time that I am setting up LVM-on-LUKS with NixOS, so a
VM came in handy to test it out.
2021-05-08 17:14:13 +02:00
239 changed files with 5514 additions and 1213 deletions

View file

@ -1,24 +1,27 @@
---
kind: pipeline
name: check config
type: exec
name: NixOS config check
steps:
- name: format check
image: nixos/nix
commands:
- nix-shell -p nixpkgs-fmt --run 'nixpkgs-fmt . --check'
- name: nix flake check
commands:
- nix flake check
- name: notify
image: plugins/matrix
settings:
homeserver:
from_secret: matrix_homeserver
roomid:
from_secret: matrix_roomid
username:
from_secret: matrix_username
password:
from_secret: matrix_password
trigger:
status:
- failure
- success
- name: notifiy
commands:
- nix run .#matrix-notifier
environment:
ADDRESS:
from_secret: matrix_homeserver
ROOM:
from_secret: matrix_roomid
USER:
from_secret: matrix_username
PASS:
from_secret: matrix_password
when:
status:
- failure
- success
...

1
.envrc
View file

@ -6,3 +6,4 @@ use_flake() {
ulimit -s unlimited # Bypass current bug in `nix` flakes evaluation
use flake
eval "$shellHooks"

View file

@ -1,4 +0,0 @@
# Do not edit this file. To specify the files to encrypt, create your own
# .gitattributes file in the directory where your files are.
* !filter !diff
*.gpg binary

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/.pre-commit-config.yaml

View file

@ -1,21 +0,0 @@
repos:
- repo: 'https://github.com/pre-commit/pre-commit-hooks'
rev: 'v2.3.0'
hooks:
- id: 'trailing-whitespace'
- id: 'end-of-file-fixer'
- id: 'check-yaml'
- id: 'check-added-large-files'
- repo: 'https://github.com/jumanjihouse/pre-commit-hooks'
rev: '2.1.4'
hooks:
- id: 'forbid-binary'
- repo: 'local'
hooks:
- id: 'nixpkgs-fmt'
name: 'nixpkgs-fmt'
description: 'Format nix code with nixpkgs-fmt'
entry: 'nixpkgs-fmt'
language: 'system'
files: '\.nix$'
always_run: true

View file

@ -21,3 +21,4 @@ Secondly, take care of a few manual steps:
* Configure Sonarr, Radarr, Bazarr
* Configure Transmission's webui port
* Configure Quassel user
* Configure Flood account

View file

@ -58,6 +58,8 @@ get_ssh() {
get_doc "SysAdmin/SSH" "shared-key-public" "$HOME/.ssh/shared_rsa.pub" 644
get_doc "SysAdmin/SSH" "shared-key-private" "$HOME/.ssh/shared_rsa" 600
get_doc "SysAdmin/SSH" "agenix-public" "$HOME/.ssh/id_ed25519.pub" 644
get_doc "SysAdmin/SSH" "agenix-private" "$HOME/.ssh/id_ed25519" 600
}
get_pgp() {
@ -78,7 +80,7 @@ get_pgp() {
}
get_creds() {
BW_SESSION="$(bw login --raw)"
BW_SESSION="$(bw login --raw || bw unlock --raw)"
export BW_SESSION
get_ssh

View file

@ -1,12 +1,33 @@
{
"nodes": {
"agenix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1631896269,
"narHash": "sha256-DAyCxJ8JacayOzGgGSfzrn7ghtsfL/EsCyk1NEUaAR8=",
"owner": "ryantm",
"repo": "agenix",
"rev": "daf1d773989ac5d949aeef03fce0fe27e583dbca",
"type": "github"
},
"original": {
"owner": "ryantm",
"ref": "master",
"repo": "agenix",
"type": "github"
}
},
"futils": {
"locked": {
"lastModified": 1619345332,
"narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=",
"lastModified": 1631561581,
"narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28",
"rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
"type": "github"
},
"original": {
@ -23,11 +44,11 @@
]
},
"locked": {
"lastModified": 1619558193,
"narHash": "sha256-DljP5/9EX0eXEPhzCUFqFEHkkcFuXJBx1PTgcv0OgyM=",
"lastModified": 1633296444,
"narHash": "sha256-DnC7yVyoYFSsvFze16AWDa5iSHgtT1MbDGgp8rSC3H4=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "18ad12d52b8cebbb57013865eec2be5125de050a",
"rev": "099cbcf13e8219f07b493980a66fe64df0e32d09",
"type": "github"
},
"original": {
@ -39,11 +60,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1619464443,
"narHash": "sha256-R7WAb8EnkIJxxaF6GTHUPytjonhB4Zm0iatyWoW169A=",
"lastModified": 1633263894,
"narHash": "sha256-InuWViZr3SL8PqRROkWhmSd3N8gGkiP7YaA7BRdjmhk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8e4fe32876ca15e3d5eb3ecd3ca0b224417f5f17",
"rev": "01f2f2842aaa7f3af957fef93439d639e6941e6c",
"type": "github"
},
"original": {
@ -55,11 +76,11 @@
},
"nur": {
"locked": {
"lastModified": 1619628114,
"narHash": "sha256-s3pQyvMfXVmbQOX224yOWQf6zi8406sShFF4u17LVQ0=",
"lastModified": 1633342505,
"narHash": "sha256-UgXnO+jX6V33mtbFgQKPLndNQid1DqOnMcsPlxqeWdk=",
"owner": "nix-community",
"repo": "NUR",
"rev": "0615e756dc14986c4968fa478c0bd080d621cb2b",
"rev": "061e44abde1dc11b10ff93fe6a388272850f473c",
"type": "github"
},
"original": {
@ -69,12 +90,38 @@
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-utils": [
"futils"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1631170176,
"narHash": "sha256-RLN/kur2Kpxt0cJp0Fms8ixuGpT8IHX0OpeQ8u8f0X4=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "3ed0e618cebc1ff291c27b749cf7568959cac028",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "master",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"agenix": "agenix",
"futils": "futils",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"nur": "nur"
"nur": "nur",
"pre-commit-hooks": "pre-commit-hooks"
}
}
},

111
flake.nix
View file

@ -1,6 +1,16 @@
{
description = "NixOS configuration with flakes";
inputs = {
agenix = {
type = "github";
owner = "ryantm";
repo = "agenix";
ref = "master";
inputs = {
nixpkgs.follows = "nixpkgs";
};
};
futils = {
type = "github";
owner = "numtide";
@ -31,9 +41,29 @@
repo = "NUR";
ref = "master";
};
pre-commit-hooks = {
type = "github";
owner = "cachix";
repo = "pre-commit-hooks.nix";
ref = "master";
inputs = {
flake-utils.follows = "futils";
nixpkgs.follows = "nixpkgs";
};
};
};
outputs = { self, futils, home-manager, nixpkgs, nur } @ inputs:
outputs =
inputs @
{ self
, agenix
, futils
, home-manager
, nixpkgs
, nur
, pre-commit-hooks
}:
let
inherit (futils.lib) eachDefaultSystem;
@ -51,58 +81,81 @@
nur.overlay
];
}
home-manager.nixosModules.home-manager
{
home-manager.users.ambroisie = import ./home;
# Nix Flakes compatibility
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
}
# Include generic settings
./modules
# Include bundles of settings
./profiles
];
buildHost = name: system: lib.nixosSystem {
inherit system;
modules = defaultModules ++ [
(./. + "/${name}.nix")
(./. + "/machines/${name}")
];
specialArgs = {
# Use my extended lib in NixOS configuration
inherit lib;
# Inject inputs to use them in global registry
inherit inputs;
};
};
in
eachDefaultSystem
(system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
rec {
apps = {
diff-flake = futils.lib.mkApp { drv = packages.diff-flake; };
let
pkgs = nixpkgs.legacyPackages.${system};
in
rec {
apps = {
diff-flake = futils.lib.mkApp { drv = packages.diff-flake; };
};
checks = {
pre-commit = pre-commit-hooks.lib.${system}.run {
src = ./.;
hooks = {
nixpkgs-fmt = {
enable = true;
};
};
};
};
defaultApp = apps.diff-flake;
defaultApp = apps.diff-flake;
devShell = pkgs.mkShell {
name = "NixOS-config";
buildInputs = with pkgs; [
git-crypt
gitAndTools.pre-commit
gnupg
nixpkgs-fmt
];
};
devShell = pkgs.mkShell {
name = "NixOS-config";
packages = import ./pkgs { inherit pkgs; };
}) // {
nativeBuildInputs = with pkgs; [
gitAndTools.pre-commit
gnupg
nixpkgs-fmt
];
inherit (self.checks.${system}.pre-commit) shellHook;
};
packages =
let
inherit (futils.lib) filterPackages flattenTree;
packages = import ./pkgs { inherit pkgs; };
flattenedPackages = flattenTree packages;
finalPackages = filterPackages system flattenedPackages;
in
finalPackages;
}) // {
overlay = self.overlays.pkgs;
overlays = {
overlays = import ./overlays // {
lib = final: prev: { inherit lib; };
pkgs = final: prev: { ambroisie = import ./pkgs { pkgs = prev; }; };
pkgs = final: prev: {
ambroisie = prev.recurseIntoAttrs (import ./pkgs { pkgs = prev; });
};
};
nixosConfigurations = lib.mapAttrs buildHost {
aramis = "x86_64-linux";
porthos = "x86_64-linux";
};
};

View file

@ -0,0 +1,19 @@
{ config, lib, ... }:
let
cfg = config.my.home.bluetooth;
in
{
options.my.home.bluetooth = with lib; {
enable = mkEnableOption "bluetooth configuration";
};
config = lib.mkIf cfg.enable {
services.blueman-applet = {
enable = true;
};
services.mpris-proxy = {
enable = true;
};
};
}

29
home/comma/default.nix Normal file
View file

@ -0,0 +1,29 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.comma;
in
{
options.my.home.comma = with lib; {
enable = my.mkDisableOption "comma configuration";
pkgsFlake = mkOption {
type = types.str;
default = "pkgs";
example = "nixpkgs";
description = ''
Which flake from the registry should be used with
<command>nix shell</command>.
'';
};
};
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
ambroisie.comma
];
home.sessionVariables = {
COMMA_PKGS_FLAKE = cfg.pkgsFlake;
};
};
}

View file

@ -1,20 +1,37 @@
{ ... }:
{
imports = [
./bat.nix
./direnv.nix
./documentation.nix
./bat
./bluetooth
./comma
./direnv
./documentation
./feh
./firefox
./flameshot
./gammastep
./gdb
./git
./gpg.nix
./htop.nix
./jq.nix
./packages.nix
./pager.nix
./secrets # Home-manager specific secrets
./ssh.nix
./tmux.nix
./gpg
./gtk
./htop
./jq
./mail
./mpv
./nix-index
./nm-applet
./packages
./pager
./power-alert
./ssh
./terminal
./tmux
./udiskie
./vim
./xdg.nix
./wm
./x
./xdg
./zathura
./zsh
];

View file

@ -9,7 +9,11 @@ in
config.programs.direnv = lib.mkIf cfg.enable {
enable = true;
# A better `use_nix`
enableNixDirenvIntegration = true;
nix-direnv = {
# A better `use_nix`
enable = true;
# And `use_flake`
enableFlakes = true;
};
};
}

13
home/feh/default.nix Normal file
View file

@ -0,0 +1,13 @@
{ config, lib, ... }:
let
cfg = config.my.home.feh;
in
{
options.my.home.feh = with lib; {
enable = mkEnableOption "feh configuration";
};
config.programs.feh = lib.mkIf cfg.enable {
enable = true;
};
}

84
home/firefox/default.nix Normal file
View file

@ -0,0 +1,84 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.firefox;
in
{
imports = [
./tridactyl
];
options.my.home.firefox = with lib; {
enable = mkEnableOption "firefox configuration";
tridactyl = {
enable = mkOption {
type = types.bool;
description = "tridactyl configuration";
example = false;
default = config.my.home.firefox.enable;
};
};
ff2mpv = {
enable = mkOption {
type = types.bool;
description = "ff2mpv configuration";
example = false;
default = config.my.home.mpv.enable;
};
};
};
config.programs.firefox = lib.mkIf cfg.enable {
enable = true;
package = pkgs.firefox.override {
cfg = {
enableTridactylNative = cfg.tridactyl.enable;
};
extraNativeMessagingHosts = with pkgs; ([ ]
# Watch videos using mpv
++ lib.optional cfg.ff2mpv.enable ambroisie.ff2mpv-go
);
};
profiles = {
default = {
id = 0;
settings = {
"browser.bookmarks.showMobileBookmarks" = true; # Mobile bookmarks
"browser.download.useDownloadDir" = false; # Ask for download location
"browser.in-content.dark-mode" = true; # Dark mode
"browser.newtabpage.activity-stream.feeds.section.topstories" = false; # Disable top stories
"browser.newtabpage.activity-stream.feeds.sections" = false;
"browser.newtabpage.activity-stream.feeds.system.topstories" = false; # Disable top stories
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false; # Disable pocket
"extensions.pocket.enabled" = false; # Disable pocket
"media.eme.enabled" = true; # Enable DRM
"media.gmp-widevinecdm.visible" = true; # Enable DRM
"media.gmp-widevinecdm.enabled" = true; # Enable DRM
"signon.autofillForms" = false; # Disable built-in form-filling
"signon.rememberSignons" = false; # Disable built-in password manager
"ui.systemUsesDarkTheme" = true; # Dark mode
};
};
};
extensions = with pkgs.nur.repos.rycee.firefox-addons; ([
bitwarden
form-history-control
https-everywhere
i-dont-care-about-cookies
reddit-comment-collapser
reddit-enhancement-suite
refined-github
sponsorblock
ublock-origin
]
++ lib.optional (cfg.tridactyl.enable) tridactyl
++ lib.optional (cfg.ff2mpv.enable) ff2mpv
);
};
}

View file

@ -0,0 +1,9 @@
{ config, lib, ... }:
let
cfg = config.my.home.firefox.tridactyl;
in
{
config = lib.mkIf cfg.enable {
xdg.configFile."tridactyl/tridactylrc".source = ./tridactylrc;
};
}

View file

@ -0,0 +1,75 @@
" Shamelessly taken from bovine3dom's example configuration file from the docs
" Basics {{{
" Use dark color scheme
colorscheme dark
" Make tridactyl open Vim in my prefered terminal
" FIXME: make it follow my prefered terminal
set editorcmd termite --class tridactyl_editor -e 'vim %f'
" }}}
" Binds {{{
" Reddit et al. {{{
" Toggle comments on Reddit, Hacker News, Lobste.rs
bind ;c hint -c [class*="expand"],[class="togg"],[class="comment_folder"]
" Make `gu` take me back to subreddit from comments
bindurl reddit.com gu urlparent 3
" Only hint search results on Google
bindurl www.google.com f hint -Jc #search div:not(.action-menu) > a
bindurl www.google.com F hint -Jbc #search div:not(.action-menu) > a
" Only hint search results on DuckDuckGo
bindurl ^https://duckduckgo.com f hint -Jc [class=result__a]
bindurl ^https://duckduckgo.com F hint -Jbc [class=result__a]
" Only hint item pages on Hacker News
bindurl news.ycombinator.com ;f hint -Jc .age > a
bindurl news.ycombinator.com ;F hint -Jtc .age > a
" }}}
" Better bindings {{{
" Handy multiwindow binds
bind gd tabdetach
bind gD composite tabduplicate; tabdetach
" Duplicate a tab without detaching window
bind <Space>d tabduplicate
" Make yy use canonical links on the few websites that support them
bind yy clipboard yankcanon
" }}}
" Search {{{
" Case insensitive only if fully lowercase
set findcase smart
" Search forward/backward
bind / fillcmdline find
bind ? fillcmdline find -?
" Go to next/previous match
bind n findnext 1
bind N findnext -1
" Because :nohls never works
bind <Space><Space> nohlsearch
" Use browser's native find when using Ctrl-F
unbind <C-f>
" }}}
" }}}
" Redirections {{{
" Always redirect Reddit to the old site
autocmd DocStart ^http(s?)://www.reddit.com js tri.excmds.urlmodify("-t", "www", "old")
" }}}
" Disabled websites {{{
blacklistadd netflix.com
blacklistadd jellyfin.belanyi.fr
" }}}
" vim: set filetype=vim foldmethod=marker:

View file

@ -0,0 +1,13 @@
{ config, lib, ... }:
let
cfg = config.my.home.flameshot;
in
{
options.my.home.flameshot = with lib; {
enable = mkEnableOption "flameshot configuration";
};
config.services.flameshot = lib.mkIf cfg.enable {
enable = true;
};
}

View file

@ -0,0 +1,44 @@
{ config, lib, ... }:
let
cfg = config.my.home.gammastep;
mkTempOption = with lib; description: default: mkOption {
inherit description default;
type = types.int;
example = 1000;
};
mkTimeOption = with lib; description: default: mkOption {
inherit description default;
type = types.str;
example = "12:00-14:00";
};
in
{
options.my.home.gammastep = with lib; {
enable = mkEnableOption "gammastep configuration";
temperature = {
day = mkTempOption "Colour temperature to use during the day" 6500;
night = mkTempOption "Colour temperature to use during the night" 2000;
};
times = {
dawn = mkTimeOption "Dawn time" "6:00-7:30";
dusk = mkTimeOption "Dusk time" "18:30-20:00";
};
};
config.services.gammastep = lib.mkIf cfg.enable {
enable = true;
tray = true;
dawnTime = cfg.times.dawn;
duskTime = cfg.times.dusk;
temperature = {
inherit (cfg.temperature) day night;
};
};
}

42
home/gdb/default.nix Normal file
View file

@ -0,0 +1,42 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.gdb;
in
{
options.my.home.gdb = with lib; {
enable = my.mkDisableOption "gdb configuration";
rr = {
enable = my.mkDisableOption "rr configuration";
package = mkOption {
type = types.package;
default = pkgs.rr;
defaultText = literalExample "pkgs.rr";
description = ''
Package providing rr
'';
};
};
};
config = lib.mkMerge [
(lib.mkIf cfg.enable {
home.packages = with pkgs; [
gdb
];
# FIXME: waiting for commit 64aaad6349d2b2c45063a5383f877ce9a3a0c354
xdg.configFile."gdb/gdbinit".source = ./gdbinit;
# FIXME: remove once `gdb` is updated from version 10.2
home.file.".gdbinit".source = ./gdbinit;
})
(lib.mkIf cfg.rr.enable {
home.packages = [
cfg.rr.package
];
})
];
}

24
home/gdb/gdbinit Normal file
View file

@ -0,0 +1,24 @@
# Keep a history of all commands in each directory
set history save on
# Enable those pretty-printers
enable pretty-printer
# Pretty formatting of structures
set print pretty on
# Show derived type based on VTable
set print object on
# Show static members
set print static-members on
# Show VTable
set print vtbl on
# Demangle types
set print demangle on
# Read python scrips in the load path
set auto-load python-scripts
# Allow autoloading project-local .gdbinit files
set auto-load safe-path ~/git/
# Allow autoloading from the Nix store
set auto-load safe-path /nix/store

View file

@ -18,11 +18,12 @@ in
package = pkgs.gitAndTools.gitFull;
aliases = {
lol = "log --graph --decorate --pretty=oneline --abbrev-commit";
lol = "log --graph --decorate --pretty=oneline --abbrev-commit --topo-order";
lola = "lol --all";
assume = "update-index --assume-unchanged";
unassume = "update-index --no-assume-unchanged";
assumed = "!git ls-files -v | grep ^h | cut -c 3-";
pick = "log -p -G";
push-new = "!git push -u origin "
+ ''"$(git branch | grep '^* ' | cut -f2- -d' ')"'';
};

View file

@ -3,8 +3,15 @@ let
cfg = config.my.home.gpg;
in
{
options.my.home.gpg = with lib.my; {
enable = mkDisableOption "gpg configuration";
options.my.home.gpg = with lib; {
enable = my.mkDisableOption "gpg configuration";
pinentry = mkOption {
type = types.str;
default = "tty";
example = "gtk2";
description = "Which pinentry interface to use";
};
};
config = lib.mkIf cfg.enable {
@ -15,7 +22,7 @@ in
services.gpg-agent = {
enable = true;
enableSshSupport = true; # One agent to rule them all
pinentryFlavor = "tty";
pinentryFlavor = cfg.pinentry;
extraConfig = ''
allow-loopback-pinentry
'';

33
home/gtk/default.nix Normal file
View file

@ -0,0 +1,33 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.gtk;
in
{
options.my.home.gtk = with lib; {
enable = mkEnableOption "GTK configuration";
};
config.gtk = lib.mkIf cfg.enable {
enable = true;
font = {
package = pkgs.dejavu_fonts;
name = "DejaVu Sans";
};
gtk2 = {
# That sweet, sweet clean home that I am always aiming for...
configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
};
iconTheme = {
package = pkgs.gnome3.gnome_themes_standard;
name = "Adwaita";
};
theme = {
package = pkgs.gnome3.gnome_themes_standard;
name = "Adwaita";
};
};
}

View file

@ -0,0 +1,105 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.mail;
mkAddress = address: domain: "${address}@${domain}";
mkConfig = { domain, address, passName, aliases ? [ ], primary ? false }: {
realName = lib.mkDefault "Bruno BELANYI";
userName = lib.mkDefault (mkAddress address domain);
passwordCommand =
lib.mkDefault [ "${pkgs.ambroisie.bw-pass}/bin/bw-pass" "Mail" passName ];
address = mkAddress address domain;
aliases = builtins.map (lib.flip mkAddress domain) aliases;
inherit primary;
himalaya = {
enable = cfg.himalaya.enable;
};
msmtp = {
enable = cfg.msmtp.enable;
};
};
migaduConfig = {
imap = {
host = "imap.migadu.com";
port = 993;
tls = {
enable = true;
};
};
smtp = {
host = "smtp.migadu.com";
port = 465;
tls = {
enable = true;
};
};
};
gmailConfig = {
flavor = "gmail.com";
folders = {
drafts = "[Gmail]/Drafts";
sent = "[Gmail]/Sent Mail";
trash = "[Gmail]/Trash";
};
};
office365Config = {
imap = {
host = "outlook.office365.com";
port = 993;
tls = {
enable = true;
};
};
smtp = {
host = "outlook.office365.com";
port = 587;
tls = {
enable = true;
useStartTls = true;
};
};
};
in
{
config.accounts.email.accounts = {
personal = lib.mkMerge [
# Common configuraton
(mkConfig {
domain = "belanyi.fr";
address = "bruno";
passName = "Migadu";
aliases = [ "admin" "postmaster" ];
primary = true; # This is my primary email
})
migaduConfig
];
gmail = lib.mkMerge [
# Common configuraton
(mkConfig {
domain = "gmail.com";
address = "brunobelanyi";
passName = "GMail";
})
gmailConfig
];
epita = lib.mkMerge [
# Common configuration
(mkConfig {
domain = "epita.fr";
address = "bruno.belanyi";
passName = "EPITA";
})
office365Config
];
};
}

31
home/mail/default.nix Normal file
View file

@ -0,0 +1,31 @@
{ config, lib, ... }:
let
cfg = config.my.home.mail;
mkRelatedOption = desc: lib.mkEnableOption desc // { default = cfg.enable; };
in
{
imports = [
./accounts
./himalaya
./msmtp
];
options.my.home.mail = with lib; {
enable = my.mkDisableOption "email configuration";
himalaya = {
enable = mkRelatedOption "himalaya configuration";
};
msmtp = {
enable = mkRelatedOption "msmtp configuration";
};
};
config = {
accounts.email = {
maildirBasePath = "mail";
};
};
}

View file

@ -0,0 +1,23 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.mail.himalaya;
in
{
config.programs.himalaya = lib.mkIf cfg.enable {
enable = true;
settings = {
notify-cmd =
let
notify-send = "${pkgs.libnotify}/bin/notify-send";
in
pkgs.writeScript "mail-notifier" ''
SENDER="$1"
SUBJECT="$2"
${notify-send} \
-c himalaya \
-- "$(printf 'Received email from %s\n\n%s' "$SENDER" "$SUBJECT")"
'';
};
};
}

View file

@ -0,0 +1,9 @@
{ config, lib, ... }:
let
cfg = config.my.home.mail.msmtp;
in
{
config.programs.msmtp = lib.mkIf cfg.enable {
enable = true;
};
}

19
home/mpv/default.nix Normal file
View file

@ -0,0 +1,19 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.mpv;
in
{
options.my.home.mpv = with lib; {
enable = mkEnableOption "mpv configuration";
};
config = lib.mkIf cfg.enable {
programs.mpv = {
enable = true;
scripts = [
pkgs.mpvScripts.mpris # Allow controlling using media keys
];
};
};
}

View file

@ -0,0 +1,13 @@
{ config, lib, ... }:
let
cfg = config.my.home.nix-index;
in
{
options.my.home.nix-index = with lib.my; {
enable = mkDisableOption "nix-index configuration";
};
config.programs.nix-index = lib.mkIf cfg.enable {
enable = true;
};
}

View file

@ -0,0 +1,13 @@
{ config, lib, ... }:
let
cfg = config.my.home.nm-applet;
in
{
options.my.home.nm-applet = with lib; {
enable = mkEnableOption "network-manager-applet configuration";
};
config.services.network-manager-applet = lib.mkIf cfg.enable {
enable = true;
};
}

View file

@ -1,20 +0,0 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.packages;
in
{
options.my.home.packages = with lib.my; {
enable = mkDisableOption "user packages";
};
config.home.packages = with pkgs; lib.mkIf cfg.enable [
# Git related
gitAndTools.git-absorb
gitAndTools.git-revise
gitAndTools.tig
# Dev work
rr
# Terminal prettiness
termite.terminfo
];
}

28
home/packages/default.nix Normal file
View file

@ -0,0 +1,28 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.packages;
in
{
options.my.home.packages = with lib; {
enable = my.mkDisableOption "user packages";
additionalPackages = mkOption {
type = with types; listOf package;
default = [ ];
example = literalExample ''
with pkgs; [
quasselClient
]
'';
};
};
config.home.packages = with pkgs; lib.mkIf cfg.enable ([
file
gitAndTools.git-absorb
gitAndTools.git-revise
gitAndTools.tig
rr
termite.terminfo
] ++ cfg.additionalPackages);
}

View file

@ -1,18 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.home.pager;
in
{
options.my.home.pager = with lib.my; {
enable = mkDisableOption "pager configuration";
};
config.programs.lesspipe.enable = cfg.enable;
config.home.sessionVariables = lib.mkIf cfg.enable {
# My default pager
PAGER = "less";
# Clear the screen on start and exit
LESS = "-R -+X -c";
};
}

36
home/pager/default.nix Normal file
View file

@ -0,0 +1,36 @@
{ config, lib, ... }:
let
cfg = config.my.home.pager;
in
{
options.my.home.pager = with lib.my; {
enable = mkDisableOption "pager configuration";
};
config = lib.mkIf cfg.enable {
home.sessionVariables = {
# My default pager
PAGER = "less";
# Clear the screen on start and exit
LESS = "-R -+X -c";
};
programs.zsh.localVariables = {
# Colored man pages
LESS_TERMCAP_mb = "$(tput bold; tput setaf 2)";
LESS_TERMCAP_md = "$(tput bold; tput setaf 6)";
LESS_TERMCAP_me = "$(tput sgr0)";
LESS_TERMCAP_so = "$(tput bold; tput setaf 3; tput setab 4)";
LESS_TERMCAP_se = "$(tput rmso; tput sgr0)";
LESS_TERMCAP_us = "$(tput bold; tput setaf 2)";
LESS_TERMCAP_ue = "$(tput rmul; tput sgr0)";
LESS_TERMCAP_mr = "$(tput rev)";
LESS_TERMCAP_mh = "$(tput dim)";
LESS_TERMCAP_ZN = "$(tput ssubm)";
LESS_TERMCAP_ZV = "$(tput rsubm)";
LESS_TERMCAP_ZO = "$(tput ssupm)";
LESS_TERMCAP_ZW = "$(tput rsupm)";
};
};
}

View file

@ -0,0 +1,15 @@
{ config, lib, ... }:
let
cfg = config.my.home.power-alert;
in
{
options.my.home.power-alert = with lib; {
enable = mkEnableOption "power-alert configuration";
};
config = lib.mkIf cfg.enable {
services.poweralertd = {
enable = true;
};
};
}

View file

@ -1,3 +0,0 @@
* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
/default.nix !filter !diff

Binary file not shown.

View file

@ -1,19 +0,0 @@
{ lib, ... }:
with lib;
let
canaryHash = builtins.hashFile "sha256" ./canary;
expectedHash =
"9df8c065663197b5a1095122d48e140d3677d860343256abd5ab6e4fb4c696ab";
in
if canaryHash != expectedHash then
abort "Secrets are not readable. Have you run `git-crypt unlock`?"
else {
options.my.secrets = mkOption {
type = types.attrs;
};
config.my.secrets = {
# Home-manager secrets go here
};
}

View file

@ -7,7 +7,7 @@ in
enable = mkDisableOption "ssh configuration";
};
config.programs.ssh = {
config.programs.ssh = lib.mkIf cfg.enable {
enable = true;
matchBlocks = {

61
home/terminal/default.nix Normal file
View file

@ -0,0 +1,61 @@
{ config, lib, ... }:
let
mkColorOption = with lib; description: default: mkOption {
inherit description default;
example = "#abcdef";
type = types.strMatching "#[0-9a-f]{6}";
};
cfg = config.my.home.terminal;
in
{
imports = [
./termite
];
options.my.home = with lib; {
terminal = {
program = mkOption {
type = with types; nullOr (enum [ "termite" ]);
default = null;
example = "termite";
description = "Which terminal to use for home session";
};
colors = {
background = mkColorOption "Background color" "#161616";
foreground = mkColorOption "Foreground color" "#ffffff";
foregroundBold = mkColorOption "Foreground bold color" "#ffffff";
cursor = mkColorOption "Cursor color" "#ffffff";
black = mkColorOption "Black" "#222222";
blackBold = mkColorOption "Black bold" "#666666";
red = mkColorOption "Red" "#e84f4f";
redBold = mkColorOption "Red bold" "#d23d3d";
green = mkColorOption "Green" "#b7ce42";
greenBold = mkColorOption "Green bold" "#bde077";
yellow = mkColorOption "Yellow" "#fea63c";
yellowBold = mkColorOption "Yellow bold" "#ffe863";
blue = mkColorOption "Blue" "#66aabb";
blueBold = mkColorOption "Blue bold" "#aaccbb";
magenta = mkColorOption "Magenta" "#b7416e";
magentaBold = mkColorOption "Magenta bold" "#e16a98";
cyan = mkColorOption "Cyan" "#6d878d";
cyanBold = mkColorOption "Cyan bold" "#42717b";
white = mkColorOption "White" "#dddddd";
whiteBold = mkColorOption "White bold" "#cccccc";
};
};
};
config.home.sessionVariables = lib.mkIf (cfg.program != null) {
TERMINAL = cfg.program;
};
}

View file

@ -0,0 +1,53 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.terminal;
in
{
config = lib.mkIf (cfg.program == "termite") {
programs.termite = {
enable = true;
# Niceties
browser = "${pkgs.xdg-utils}/bin/xdg-open";
clickableUrl = true;
dynamicTitle = true;
fullscreen = false;
mouseAutohide = true;
urgentOnBell = true;
# Look and feel
allowBold = true;
audibleBell = false;
cursorBlink = "system";
font = "Monospace 9";
scrollbar = "off";
# Colors
backgroundColor = cfg.colors.background;
cursorColor = cfg.colors.cursor;
foregroundColor = cfg.colors.foreground;
foregroundBoldColor = cfg.colors.foregroundBold;
colorsExtra = with cfg.colors; ''
# Normal colors
color0 = ${black}
color1 = ${red}
color2 = ${green}
color3 = ${yellow}
color4 = ${blue}
color5 = ${magenta}
color6 = ${cyan}
color7 = ${white}
# Bold colors
color8 = ${blackBold}
color9 = ${redBold}
color10 = ${greenBold}
color11 = ${yellowBold}
color12 = ${blueBold}
color13 = ${magentaBold}
color14 = ${cyanBold}
color15 = ${whiteBold}
'';
};
};
}

View file

@ -5,6 +5,10 @@ in
{
options.my.home.tmux = with lib.my; {
enable = mkDisableOption "tmux terminal multiplexer";
service = {
enable = mkDisableOption "tmux server service";
};
};
config.programs.tmux = lib.mkIf cfg.enable {
@ -13,7 +17,7 @@ in
keyMode = "vi"; # Home-row keys and other niceties
clock24 = true; # I'm one of those heathens
escapeTime = 0; # Let vim do its thing instead
historyLimit = 5000; # Bigger buffer
historyLimit = 50000; # Bigger buffer
terminal = "tmux-256color"; # I want accurate termcap info
plugins = with pkgs.tmuxPlugins; [
@ -44,4 +48,30 @@ in
bind-key -T copy-mode-vi 'y' send -X copy-selection-and-cancel
'';
};
config.systemd.user.services.tmux = lib.mkIf cfg.service.enable {
Unit = {
Description = "tmux server";
};
Install = {
WantedBy = [ "default.target" ];
};
Service =
let
# Wrap `tmux` in a login shell and set the socket path
tmuxCmd = "${config.programs.tmux.package}/bin/tmux";
socketExport = lib.optionalString
config.programs.tmux.secureSocket
''export TMUX_TMPDIR=''${XDG_RUNTIME_DIR:-"/run/user/\$(id -u)"};'';
mkTmuxCommand =
c: "${pkgs.runtimeShell} -l -c '${socketExport} ${tmuxCmd} ${c}'";
in
{
Type = "forking";
ExecStart = mkTmuxCommand "new -d -s ambroisie";
ExecStop = mkTmuxCommand "kill-server";
};
};
}

13
home/udiskie/default.nix Normal file
View file

@ -0,0 +1,13 @@
{ config, lib, ... }:
let
cfg = config.my.home.udiskie;
in
{
options.my.home.udiskie = with lib; {
enable = mkEnableOption "udiskie configuration";
};
config.services.udiskie = lib.mkIf cfg.enable {
enable = true;
};
}

View file

@ -31,10 +31,7 @@ in
plugins = with pkgs.vimPlugins; [
# Theming
lightline-vim # Fancy status bar
{
plugin = onedark-vim; # Nice dark theme
optional = true; # Needs to be `packadd`-ed manually...
}
vim-gruvbox8 # Nice dark theme
# tpope essentials
vim-commentary # Easy comments

View file

@ -68,10 +68,12 @@ set timeoutlen=500
" Set dark mode by default
set background=dark
" Load it manually because of autoload functions...
packadd! onedark-vim
" Use onedark
colorscheme onedark
" Include plug-in integration
let g:gruvbox_plugin_hi_groups=1
" Include filetype integration
let g:gruvbox_filetype_hi_groups=1
" Use my preferred colorscheme
colorscheme gruvbox8
" }}}
" Search parameters {{{

View file

@ -2,7 +2,7 @@
let g:lightline={}
" Use the wombat colorscheme
let g:lightline.colorscheme='onedark'
let g:lightline.colorscheme='wombat'
" Status-line for active buffer
let g:lightline.active={

87
home/wm/default.nix Normal file
View file

@ -0,0 +1,87 @@
{ config, lib, pkgs, ... }:
let
mkRelatedOption = description: relatedWMs:
let
isActivatedWm = wm: config.my.home.wm.windowManager == wm;
in
(lib.mkEnableOption description) // {
default = builtins.any isActivatedWm relatedWMs;
};
in
{
imports = [
./dunst
./i3
./i3bar
./rofi
./screen-lock
];
options.my.home.wm = with lib; {
windowManager = mkOption {
type = with types; nullOr (enum [ "i3" ]);
default = null;
example = "i3";
description = "Which window manager to use for home session";
};
dunst = {
enable = mkRelatedOption "dunst configuration" [ "i3" ];
};
i3bar = {
enable = mkRelatedOption "i3bar configuration" [ "i3" ];
};
rofi = {
enable = mkRelatedOption "rofi menu" [ "i3" ];
};
screen-lock = {
enable = mkRelatedOption "automatic X screen locker" [ "i3" ];
command = mkOption {
type = types.str;
default = "${pkgs.i3lock}/bin/i3lock -n -c 000000";
example = "\${pkgs.i3lock}/bin/i3lock -n -i lock.png";
description = "Locker command to run";
};
cornerLock = {
enable = my.mkDisableOption ''
Move mouse to upper-left corner to lock instantly, lower-right corner to
disable auto-lock.
'';
delay = mkOption {
type = types.int;
default = 5;
example = 15;
description = "How many seconds before locking this way";
};
};
notify = {
enable = my.mkDisableOption "Notify when about to lock the screen";
delay = mkOption {
type = types.int;
default = 5;
example = 15;
description = ''
How many seconds in advance should there be a notification.
This value must be at lesser than or equal to `cornerLock.delay`
when both options are enabled.
'';
};
};
timeout = mkOption {
type = types.ints.between 1 60;
default = 5;
example = 1;
description = "Inactive time interval to lock the screen automatically";
};
};
};
}

68
home/wm/dunst/default.nix Normal file
View file

@ -0,0 +1,68 @@
{ config, lib, ... }:
let
cfg = config.my.home.wm.dunst;
in
{
config = lib.mkIf cfg.enable {
services.dunst = {
enable = true;
settings = {
global = {
alignment = "center"; # Put message in the middle of the box
browser = "xdg-open"; # use default browser to open links
dmenu =
lib.mkIf
config.my.home.wm.rofi.enable
"rofi -p dunst -dmenu"; # use rofi for menu
follow = "keyboard"; # follow keyboard focus
font = "Monospace 8"; # Simple looking font
frame_width = 3; # small frame
geometry = "300x50-15+49";
markup = "full"; # subset of HTML
max_icon_size = 32; # avoid icons that are too big
padding = 6; # distance between text and bubble border
progress_bar = true; # show a progress bar in notification bubbles
separator_color = "frame"; # use frame color to separate bubbles
sort = true; # sort messages by urgency
word_wrap = true; # Break long lines to make them readable
};
urgency_low = {
background = "#191311";
foreground = "#3b7c87";
frame_color = "#3b7c87";
highlight = "#4998a6";
timeout = 10;
};
urgency_normal = {
background = "#191311";
foreground = "#5b8234";
frame_color = "#5b8234";
highlight = "#73a542";
timeout = 10;
};
urgency_critical = {
background = "#191311";
foreground = "#b7472a";
frame_color = "#b7472a";
highlight = "#d25637";
timeout = 0;
};
fullscreen_delay_everything = {
# delay notifications by default
fullscreen = "delay";
};
fullscreen_show_critical = {
# show critical notification
fullscreen = "show";
msg_urgency = "critical";
};
};
};
};
}

373
home/wm/i3/default.nix Normal file
View file

@ -0,0 +1,373 @@
{ config, lib, pkgs, ... }:
let
isEnabled = config.my.home.wm.windowManager == "i3";
terminal =
if config.my.home.terminal.program != null
then config.my.home.terminal.program
else "i3-sensible-terminal";
alt = "Mod1"; # `Alt` key
modifier = "Mod4"; # `Super` key
movementKeys = [ "Left" "Down" "Up" "Right" ];
vimMovementKeys = [ "h" "j" "k" "l" ];
shutdownMode =
"(l)ock, (e)xit, switch_(u)ser, (h)ibernate, (r)eboot, (Shift+s)hutdown";
# Takes an attrset of bindings for movement keys, transforms it to Vim keys
toVimKeyBindings =
let
toVimKeys = builtins.replaceStrings movementKeys vimMovementKeys;
in
lib.my.renameAttrs toVimKeys;
# Takes an attrset of bindings for movement keys, add equivalent Vim keys
addVimKeyBindings = bindings: bindings // (toVimKeyBindings bindings);
# Generate an attrset of movement bindings, using the mapper function
genMovementBindings = f: addVimKeyBindings (lib.my.genAttrs' movementKeys f);
# Screen backlight management
changeBacklight =
let
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
in
pkgs.writeScript "change-backlight" ''
#!/bin/sh
if [ "$1" = "up" ]; then
upDown="+$2%"
else
upDown="$2%-"
fi
newBrightness="$(${brightnessctl} -m set "$upDown" | cut -d, -f4)"
${pkgs.libnotify}/bin/notify-send -u low \
-h string:x-canonical-private-synchronous:change-backlight \
-h "int:value:''${newBrightness/\%/}" \
-- "Set brightness to $newBrightness"
'';
# Lock management
toggleXautolock =
let
systemctlUser = "${pkgs.systemd}/bin/systemctl --user";
notify-send = "${pkgs.libnotify}/bin/notify-send";
notify = "${notify-send} -u low"
+ " -h string:x-canonical-private-synchronous:xautolock-toggle";
in
pkgs.writeScript "toggle-xautolock" ''
#!/bin/sh
if ${systemctlUser} is-active xautolock-session.service; then
${systemctlUser} stop --user xautolock-session.service
xset s off
${notify} "Disabled Xautolock"
else
${systemctlUser} start xautolock-session.service
xset s on
${notify} "Enabled Xautolock"
fi
'';
in
{
config = lib.mkIf isEnabled {
home.packages = with pkgs; [
ambroisie.i3-get-window-criteria # little helper for i3 configuration
arandr # Used by a mapping
pamixer # Used by a mapping
playerctl # Used by a mapping
];
xsession.windowManager.i3 = {
enable = true;
config = {
inherit modifier;
bars =
let
barConfigPath =
config.xdg.configFile."i3status-rust/config-top.toml".target;
in
[
{
statusCommand = "i3status-rs ${barConfigPath}";
trayOutput = "primary";
position = "top";
colors = {
background = "#021215";
statusline = "#93a1a1";
separator = "#2aa198";
focusedWorkspace = {
border = "#2aa198";
background = "#073642";
text = "#eee895";
};
activeWorkspace = {
border = "#073642";
background = "#002b36";
text = "#839496";
};
inactiveWorkspace = {
border = "#002b36";
background = "#021215";
text = "#586e75";
};
urgentWorkspace = {
border = "#cb4b16";
background = "#dc322f";
text = "#fdf6e3";
};
};
fonts = {
names = [ "DejaVu Sans Mono" "FontAwesome5Free" ];
size = 8.0;
};
}
];
floating = {
inherit modifier;
criteria = [
{ class = "^tridactyl_editor$"; }
{ class = "^Blueman-.*$"; }
{ title = "^htop$"; }
{ class = "^Thunderbird$"; instance = "Mailnews"; window_role = "filterlist"; }
{ class = "^Pavucontrol.*$"; }
{ class = "^Arandr$"; }
];
};
focus = {
followMouse = true; # It is annoying sometimes, but useful enough to use
mouseWarping = true; # Let's moving around when switching screens
};
fonts = {
names = [ "DejaVu Sans Mono" ];
size = 8.0;
};
# I don't care for i3's default values, I specify them all explicitly
keybindings = lib.my.recursiveMerge [
{
# The basics
"${modifier}+Return" = "exec ${terminal} ${
lib.optionalString config.my.home.tmux.enable "-e tmux new-session"
}";
"${modifier}+Shift+Return" = "exec env TMUX=nil ${terminal}";
"${modifier}+Shift+q" = "kill";
"${modifier}+f" = "fullscreen toggle";
"${modifier}+Shift+c" = "reload";
"${modifier}+Shift+r" = "restart";
"${modifier}+Shift+e" =
"exec i3-nagbar -t warning -m 'Do you want to exit i3?' -b 'Yes' 'i3-msg exit'";
}
{
# Splits
"${modifier}+g" = "split h"; # Horizontally
"${modifier}+v" = "split v"; # Vertically
}
{
# Layouts
"${modifier}+s" = "layout stacking";
"${modifier}+w" = "layout tabbed";
"${modifier}+e" = "layout toggle split";
}
{
# Toggle tiling/floating
"${modifier}+Control+space" = "floating toggle";
# Change focus between tiling/floating
"${modifier}+space" = "focus mode_toggle";
}
{
# Focus parent container
"${modifier}+q" = "focus parent";
# Focus child container
"${modifier}+a" = "focus child";
}
(lib.optionalAttrs config.my.home.wm.rofi.enable {
# Rofi tools
"${modifier}+d" = "exec rofi -show drun -disable-history";
"${modifier}+Shift+d" = "exec rofi -show run -disable-history";
"${modifier}+p" = "exec --no-startup-id flameshot gui";
"${modifier}+Shift+p" = "exec rofi -show emoji";
})
(
# Changing container focus
genMovementBindings (
key: lib.nameValuePair
"${modifier}+${key}"
"focus ${lib.toLower key}"
)
)
(
# Changing screen focus
genMovementBindings (
key: lib.nameValuePair
"${modifier}+${alt}+${key}"
"focus output ${lib.toLower key}"
)
)
(
# Moving workspace to another screen
genMovementBindings (
key: lib.nameValuePair
"${modifier}+${alt}+Control+${key}"
"move workspace to output ${lib.toLower key}"
)
)
(
# Moving container to another screen
genMovementBindings (
key: lib.nameValuePair
"${modifier}+${alt}+Shift+${key}"
"move container to output ${lib.toLower key}"
)
)
(addVimKeyBindings {
# Scroll through workspaces on given screen
"${modifier}+Control+Left" = "workspace prev_on_output";
"${modifier}+Control+Right" = "workspace next_on_output";
# Use scratchpad
"${modifier}+Control+Up" = "move to scratchpad";
"${modifier}+Control+Down" = "scratchpad show";
})
(
# Moving floating window
genMovementBindings (
key: lib.nameValuePair
"${modifier}+Shift+${key}"
"move ${lib.toLower key} 10 px"
)
)
{
# Media keys
"XF86AudioRaiseVolume" = "exec pamixer --allow-boost -i 5";
"XF86AudioLowerVolume" = "exec pamixer --allow-boost -d 5";
"Control+XF86AudioRaiseVolume" = "exec pamixer --allow-boost -i 1";
"Control+XF86AudioLowerVolume" = "exec pamixer --allow-boost -d 1";
"XF86AudioMute" = "exec pamixer --toggle-mute";
"XF86AudioMicMute" = "exec pamixer --default-source --toggle-mute";
"XF86AudioPlay" = "exec playerctl play-pause";
"XF86AudioNext" = "exec playerctl next";
"XF86AudioPrev" = "exec playerctl previous";
}
{
# Screen management
"XF86Display" = "exec arandr";
"XF86MonBrightnessUp" = "exec ${changeBacklight} up 10";
"XF86MonBrightnessDown" = "exec ${changeBacklight} down 10";
"Control+XF86MonBrightnessUp" = "exec ${changeBacklight} up 1";
"Control+XF86MonBrightnessDown" = "exec ${changeBacklight} down 1";
}
{
# Sub-modes
"${modifier}+r" = "mode resize";
"${modifier}+Shift+space" = "mode floating";
}
(lib.optionalAttrs config.my.home.wm.screen-lock.enable {
"${modifier}+x" = "exec ${toggleXautolock}";
})
(
let
execDunstctl = "exec ${pkgs.dunst}/bin/dunstctl";
in
lib.optionalAttrs config.my.home.wm.dunst.enable {
"${modifier}+minus" = "${execDunstctl} close";
"${modifier}+Shift+minus" = "${execDunstctl} close-all";
"${modifier}+equal" = "${execDunstctl} history-pop";
}
)
];
keycodebindings =
let
toKeycode = n: if n == 0 then 19 else n + 9;
createWorkspaceBindings = mapping: command:
let
createWorkspaceBinding = num:
lib.nameValuePair
"${mapping}+${toString (toKeycode num)}"
"${command} ${toString num}";
oneToNine = builtins.genList (x: x + 1) 9;
in
lib.my.genAttrs' oneToNine createWorkspaceBinding;
in
lib.my.recursiveMerge [
(createWorkspaceBindings modifier "workspace number")
(createWorkspaceBindings "${modifier}+Shift" "move container to workspace number")
{
"${modifier}+${toString (toKeycode 0)}" = ''mode "${shutdownMode}"'';
}
];
modes =
let
makeModeBindings = attrs: (addVimKeyBindings attrs) // {
"Escape" = "mode default";
"Return" = "mode default";
};
in
{
resize = makeModeBindings {
# Normal movements
"Left" = "resize shrink width 10 px or 10 ppt";
"Down" = "resize grow height 10 px or 10 ppt";
"Up" = "resize shrink height 10 px or 10 ppt";
"Right" = "resize grow width 10 px or 10 ppt";
# Small movements
"Control+Left" = "resize shrink width 1 px or 1 ppt";
"Control+Down" = "resize grow height 1 px or 1 ppt";
"Control+Up" = "resize shrink height 1 px or 1 ppt";
"Control+Right" = "resize grow width 1 px or 1 ppt";
# Big movements
"Shift+Left" = "resize shrink width 100 px or 100 ppt";
"Shift+Down" = "resize grow height 100 px or 100 ppt";
"Shift+Up" = "resize shrink height 100 px or 100 ppt";
"Shift+Right" = "resize grow width 100 px or 100 ppt";
};
floating = makeModeBindings {
# Normal movements
"Left" = "move left 10 px";
"Down" = "move down 10 px";
"Up" = "move up 10 px";
"Right" = "move right 10 px";
# Small movements
"Control+Left" = "move left 1 px";
"Control+Down" = "move down 1 px";
"Control+Up" = "move up 1 px";
"Control+Right" = "move right 1 px";
# Big movements
"Shift+Left" = "move left 100 px";
"Shift+Down" = "move down 100 px";
"Shift+Up" = "move up 100 px";
"Shift+Right" = "move right 100 px";
};
${shutdownMode} = makeModeBindings {
"l" = "exec --no-startup-id loginctl lock-session, mode default";
"s" = "exec --no-startup-id systemctl suspend, mode default";
"u" = "exec --no-startup-id dm-tool switch-to-greeter, mode default";
"e" = "exec --no-startup-id i3-msg exit, mode default";
"h" = "exec --no-startup-id systemctl hibernate, mode default";
"r" = "exec --no-startup-id systemctl reboot, mode default";
"Shift+s" = "exec --no-startup-id systemctl poweroff, mode default";
};
};
startup = [
# FIXME
# { commdand; always; notification; }
];
};
};
};
}

62
home/wm/i3bar/default.nix Normal file
View file

@ -0,0 +1,62 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.wm.i3bar;
in
{
config = lib.mkIf cfg.enable {
home.packages = with pkgs; [
alsaUtils # Used by `sound` block
lm_sensors # Used by `temperature` block
font-awesome # Icon font
];
programs.i3status-rust = {
enable = true;
bars = {
top = {
icons = "awesome5";
blocks = builtins.filter (attr: attr != { }) [
{
block = "music";
buttons = [ "prev" "play" "next" ];
max_width = 50;
hide_when_empty = true;
}
{
block = "cpu";
}
{
block = "disk_space";
}
{
block = "net";
format = "{ssid} {ip} {signal_strength}";
}
{
block = "backlight";
invert_icons = true;
}
{
block = "battery";
format = "{percentage} ({time})";
full_format = "{percentage}";
}
{
block = "temperature";
collapsed = false;
}
{
block = "sound";
}
{
block = "time";
format = "%F %T";
}
];
};
};
};
};
}

21
home/wm/rofi/default.nix Normal file
View file

@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.wm.rofi;
in
{
config = lib.mkIf cfg.enable {
programs.rofi = {
enable = true;
terminal = config.my.home.terminal.program; # null by default
package = pkgs.rofi.override {
plugins = with pkgs; [
rofi-emoji
];
};
theme = "gruvbox-dark-hard";
};
};
}

View file

@ -0,0 +1,54 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.wm.screen-lock;
notficationCmd =
let
duration = toString (cfg.notify.delay * 1000);
notifyCmd = "${pkgs.libnotify}/bin/notify-send -u critical -t ${duration}";
in
# Needs to be surrounded by quotes for systemd to launch it correctly
''"${notifyCmd} -- 'Locking in ${toString cfg.notify.delay} seconds'"'';
in
{
config = lib.mkIf cfg.enable {
assertions = [
{
assertion =
let
inherit (cfg) cornerLock notify;
bothEnabled = cornerLock.enable && notify.enable;
cornerLockHigherThanNotify = cornerLock.delay >= notify.delay;
in
bothEnabled -> cornerLockHigherThanNotify;
message = ''
`config.my.home.wm.notify.delay` cannot have a value higher than
`config.my.home.wm.cornerLock.delay`.
'';
}
];
services.screen-locker = {
enable = true;
inactiveInterval = cfg.timeout;
lockCmd = cfg.command;
xautolockExtraOptions = lib.optionals cfg.cornerLock.enable [
# Mouse corners: instant lock on upper-left, never lock on lower-right
"-cornerdelay"
"${toString cfg.cornerLock.delay}"
"-cornerredelay"
"${toString cfg.cornerLock.delay}"
"-corners"
"+00-"
] ++ lib.optionals cfg.notify.enable [
"-notify"
"${toString cfg.notify.delay}"
"-notifier"
notficationCmd
];
};
};
}

12
home/x/cursor/default.nix Normal file
View file

@ -0,0 +1,12 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.x;
in
{
config = lib.mkIf cfg.enable {
xsession.pointerCursor = {
package = pkgs.ambroisie.vimix-cursors;
name = "Vimix-cursors";
};
};
}

22
home/x/default.nix Normal file
View file

@ -0,0 +1,22 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.home.x;
in
{
imports = [
./cursor
./keyboard
];
options.my.home.x = with lib; {
enable = mkEnableOption "X server configuration";
};
config = lib.mkIf cfg.enable {
xsession.enable = true;
home.packages = with pkgs; [
xsel
];
};
}

View file

@ -0,0 +1,12 @@
{ config, lib, ... }:
let
cfg = config.my.home.x;
in
{
config = lib.mkIf cfg.enable {
home.keyboard = {
layout = "fr";
variant = "us";
};
};
}

View file

@ -31,6 +31,7 @@ in
# A tidy home is a tidy mind
dataFile = {
"bash/.keep".text = "";
"gdb/.keep".text = "";
"tig/.keep".text = "";
};
};
@ -39,6 +40,7 @@ in
config.home.sessionVariables = with config.xdg; lib.mkIf cfg.enable {
CARGO_HOME = "${dataHome}/cargo";
DOCKER_CONFIG = "${configHome}/docker";
GDBHISTFILE = "${dataHome}/gdb/gdb_history";
HISTFILE = "${dataHome}/bash/history";
INPUTRC = "${configHome}/readline/inputrc";
LESSHISTFILE = "${dataHome}/less/history";

20
home/zathura/default.nix Normal file
View file

@ -0,0 +1,20 @@
{ config, lib, ... }:
let
cfg = config.my.home.zathura;
in
{
options.my.home.zathura = with lib; {
enable = mkEnableOption "zathura configuration";
};
config.programs.zathura = lib.mkIf cfg.enable {
enable = true;
options = {
# Show '~' instead of full path to '$HOME' in window title
"window-title-home-tilde" = true;
# Show '~' instead of full path to '$HOME' in status bar
"statusbar-home-tilde" = true;
};
};
}

View file

@ -13,10 +13,12 @@ in
enableCompletion = true;
history = {
size = 50000;
size = 500000;
save = 500000;
extended = false;
ignoreSpace = true;
ignoreDups = true;
share = true;
share = false;
path = "${config.xdg.dataHome}/zsh/zsh_history";
};
@ -44,6 +46,16 @@ in
# Modal editing is life, but CLI benefits from emacs gymnastics
defaultKeymap = "emacs";
# Make those happen early to avoid doing double the work
initExtraFirst =
lib.optionalString config.my.home.tmux.enable ''
# Launch tmux unless already inside one
if [ -z "$TMUX" ]; then
exec tmux new-session
fi
''
;
initExtra = lib.concatMapStrings builtins.readFile [
./completion-styles.zsh
./extra-mappings.zsh
@ -65,6 +77,12 @@ in
# Sometime `gpg-agent` errors out...
reset-agent = "gpg-connect-agent updatestartuptty /bye";
};
# Enable VTE integration when using one of the affected shells
enableVteIntegration =
builtins.any (name: config.my.home.terminal.program == name) [
"termite"
];
};
# Fuzzy-wuzzy

View file

@ -1,4 +1,4 @@
# Fix delete key not working
# Fix delete key not working
bindkey "\e[3~" delete-char
# Fix Ctrl+u killing from the cursor instead of the whole line

View file

@ -8,5 +8,9 @@ setopt autopushd pushdminus pushdsilent
setopt rcquotes
# Single word commands can resume an existing job
setopt autoresume
# Append commands to history as they are exectuted
setopt inc_append_history_time
# Remove useless whitespace from commands
setopt hist_reduce_blanks
# Those options aren't wanted
unsetopt beep extendedglob notify

View file

@ -1,7 +1,50 @@
{ lib, ... }:
let
inherit (lib) filterAttrs mapAttrs';
inherit (lib)
filterAttrs
foldl
listToAttrs
mapAttrs'
nameValuePair
recursiveUpdate
;
in
{
# Filter a generated set of attrs using a predicate function.
#
# mapFilterAttrs ::
# (name -> value -> bool)
# (name -> value -> { name = any; value = any; })
# attrs
mapFilterAttrs = pred: f: attrs: filterAttrs pred (mapAttrs' f attrs);
# Generate an attribute set by mapping a function over a list of values.
#
# genAttrs' ::
# [ values ]
# (value -> { name = any; value = any; })
# attrs
genAttrs' = values: f: listToAttrs (map f values);
# Merge a list of attrs recursively, later values override previous ones.
#
# recursiveMerge ::
# [ attrs ]
# attrs
recursiveMerge = foldl recursiveUpdate { };
# Rename each of the attributes in an attribute set using the mapping function
#
# renameAttrs ::
# (name -> new name)
# attrs
renameAttrs = f: mapAttrs' (name: value: nameValuePair (f name) value);
# Rename each of the attributes in an attribute set using a function which
# takes the attribute's name and value as inputs.
#
# renameAttrs' ::
# (name -> value -> new name)
# attrs
renameAttrs' = f: mapAttrs' (name: value: nameValuePair (f name value) value);
}

View file

@ -12,8 +12,7 @@ let
};
mylib = makeExtensible (self:
with self; mapModules ./.
(file: import file { inherit self lib pkgs inputs; })
mapModules ./. (file: import file { inherit self lib pkgs inputs; })
);
in
mylib.extend (self: super:

27
lib/lists.nix Normal file
View file

@ -0,0 +1,27 @@
{ lib, ... }:
let
inherit (lib) filter foldl';
in
{
# Count the number of appararitions of each value in a list.
#
# countValues ::
# [ any ] -> ({ any = int; })
countValues =
let
addToCount = acc: x:
let
v = toString x;
in
acc // { ${v} = (acc.${v} or 0) + 1; };
in
foldl' addToCount { };
# Filter a list using a predicate function after applying a map.
#
# mapFilter ::
# (value -> bool)
# (any -> value)
# [ any ]
mapFilter = pred: f: attrs: filter pred (map f attrs);
}

View file

@ -3,21 +3,48 @@ let
inherit (builtins) readDir pathExists;
inherit (lib) hasPrefix hasSuffix nameValuePair removeSuffix;
inherit (self.attrs) mapFilterAttrs;
implOptionalRecursion = recurse:
let
recurseStep =
if recurse
then (n: path: fn: nameValuePair n (impl path fn))
else (_: _: _: nameValuePair "" null);
impl = dir: fn:
mapFilterAttrs
(n: _: n != "" && !(hasPrefix "_" n))
(n: v:
let
path = "${toString dir}/${n}";
in
if v == "directory"
then
if pathExists "${path}/default.nix"
then nameValuePair n (fn path)
else recurseStep n path fn
else if v == "regular" && n != "default.nix" && hasSuffix ".nix" n
then nameValuePair (removeSuffix ".nix" n) (fn path)
else nameValuePair "" null)
(readDir dir);
in
impl;
in
{
mapModules = dir: fn:
mapFilterAttrs
(n: v:
v != null &&
!(hasPrefix "_" n))
(n: v:
let path = "${toString dir}/${n}"; in
if v == "directory" && pathExists "${path}/default.nix"
then nameValuePair n (fn path)
else if v == "regular" &&
n != "default.nix" &&
hasSuffix ".nix" n
then nameValuePair (removeSuffix ".nix" n) (fn path)
else nameValuePair "" null)
(readDir dir);
# Find all nix modules in a directory, discard any prefixed with "_",
# map a function to each resulting path, and generate an attribute set
# to associate module name to resulting value.
#
# mapModules ::
# path
# (path -> any)
# attrs
mapModules = implOptionalRecursion false;
# Recursive version of mapModules.
#
# mapModulesRec ::
# path
# (path -> any)
# attrs
mapModulesRec = implOptionalRecursion true;
}

32
machines/aramis/boot.nix Normal file
View file

@ -0,0 +1,32 @@
{ ... }:
{
boot = {
loader = {
systemd-boot.enable = true;
efi.canTouchEfiVariables = true;
};
initrd = {
availableKernelModules = [
"nvme"
"sd_mod"
"sdhci_pci"
"usb_storage"
"usbhid"
"xhci_pci"
];
kernelModules = [
"dm-snapshot"
];
luks.devices.crypt = {
device = "/dev/nvme0n1p1";
preLVM = true;
};
};
kernelModules = [
"kvm-intel"
];
extraModulePackages = [ ];
};
}

View file

@ -1,18 +1,27 @@
# Porthos self-hosted server
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help).
{ ... }:
{
imports = [
# Include generic settings
./modules
# Include porthos-specific modules
./machines/porthos
# Include my secrets
./secrets
# Include my services
./services
./boot.nix
./hardware.nix
./home.nix
./networking.nix
./profiles.nix
./programs.nix
./services.nix
./sound.nix
];
# Set your time zone.
time.timeZone = "Europe/Paris";
# Enable CUPS to print documents.
services.printing.enable = true;
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave

View file

@ -0,0 +1,34 @@
{ lib, modulesPath, ... }:
{
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
fileSystems = {
"/" = {
device = "/dev/disk/by-label/nixos";
fsType = "ext4";
};
"/boot" = {
device = "/dev/disk/by-label/boot";
fsType = "vfat";
};
};
swapDevices = [
{ device = "/dev/disk/by-label/swap"; }
];
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware = {
cpu.intel.updateMicrocode = true;
trackpoint = {
enable = true;
emulateWheel = true; # Holding middle buttons allows scrolling
};
};
}

28
machines/aramis/home.nix Normal file
View file

@ -0,0 +1,28 @@
{ pkgs, ... }:
{
my.home = {
# Image viewver
feh.enable = true;
# Firefo profile and extensions
firefox.enable = true;
# Blue light filter
gammastep.enable = true;
# Use a small popup to enter passwords
gpg.pinentry = "gtk2";
# Machine specific packages
packages.additionalPackages = with pkgs; [
jellyfin-media-player # Wraps the webui and mpv together
pavucontrol # Audio mixer GUI
quasselClient # IRC client
transgui # Transmission remote
];
# Minimal video player
mpv.enable = true;
# Network-Manager applet
nm-applet.enable = true;
# Termite terminal
terminal.program = "termite";
# Zathura document viewer
zathura.enable = true;
};
}

53
machines/aramis/install.sh Executable file
View file

@ -0,0 +1,53 @@
#!/bin/sh
set -eu
if [ "$(id -u)" -ne 0 ]; then
echo "This script must be run as root" >&2
exit 1
fi
SWAP_SIZE=16GiB
parted /dev/nvme0n1 --script -- \
mklabel gpt \
mkpart primary 512MiB 100% \
mkpart ESP fat32 1MiB 512MiB \
set 2 esp on
cryptsetup luksFormat /dev/nvme0n1p1
cryptsetup open /dev/nvme0n1p1 crypt
pvcreate /dev/mapper/crypt
vgcreate lvm /dev/mapper/crypt
lvcreate -L "$SWAP_SIZE" -n swap lvm
lvcreate -l 100%FREE -n root lvm
mkfs.ext4 -L nixos /dev/lvm/root
mkswap -L swap /dev/lvm/swap
mkfs.vfat -n boot /dev/nvme0n1p2
mount /dev/disk/by-label/nixos /mnt
mkdir /mnt/boot
mount /dev/nvme0n1p2 /mnt/boot
swapon /dev/lvm/swap
cat << EOF
# Run the following commands as setup user
nixos-generate-config --root /mnt
# Change uuids to labels
vim /mnt/etc/nixos/hardware-configuration.nix
# Install system
mkdir -p /mnt/home/ambroisie/git/nix/config
cd /mnt/home/ambroisie/git/nix/config
git clone <this-repo> .
# Assuming you set up GPG key correctly
git crypt unlock
# Setup LUKS with 'boot.initrd.luks.devices.crypt', device is /dev/nvme0n1p1, preLVM = true
# Use 'nixos-install --flake .#aramis --root /mnt --impure' because of home-manager issue
EOF

View file

@ -0,0 +1,25 @@
{ ... }:
{
networking = {
hostName = "aramis";
domain = "nodomain.local"; # FIXME: gotta fix domain handling
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
useDHCP = false;
interfaces = {
enp0s31f6.useDHCP = true;
wlp0s20f3.useDHCP = true;
};
};
my.hardware.networking = {
# Which interface is used to connect to the internet
externalInterface = "enp0s3";
# Enable WiFi integration
wireless.enable = true;
};
}

View file

@ -0,0 +1,17 @@
{ ... }:
{
my.profiles = {
# Bluetooth configuration and GUI
bluetooth.enable = true;
# Mouse and keyboard configuration
devices.enable = true;
# GTK theme configuration
gtk.enable = true;
# Laptop specific configuration
laptop.enable = true;
# i3 configuration
wm.windowManager = "i3";
# X configuration
x.enable = true;
};
}

View file

@ -0,0 +1,7 @@
{ ... }:
{
my.programs = {
# Steam configuration
steam.enable = true;
};
}

View file

@ -0,0 +1,8 @@
{ ... }:
{
config.my.services = {
wireguard = {
enable = true;
};
};
}

View file

@ -0,0 +1,8 @@
{ ... }:
{
my.hardware.sound = {
pipewire = {
enable = true;
};
};
}

View file

@ -9,4 +9,15 @@
./services.nix
./users.nix
];
# Set your time zone.
time.timeZone = "Europe/Paris";
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "20.09"; # Did you read the comment?
}

View file

@ -31,5 +31,5 @@
};
# Which interface is used to connect to the internet
my.networking.externalInterface = "eth0";
my.hardware.networking.externalInterface = "eth0";
}

View file

@ -1,7 +1,7 @@
# Deployed services
{ config, ... }:
let
my = config.my;
secrets = config.age.secrets;
in
{
# List services that you want to enable:
@ -19,11 +19,8 @@ in
OnActiveSec = "6h";
OnUnitActiveSec = "6h";
};
# Insecure, I don't care.
passwordFile =
builtins.toFile "password.txt" my.secrets.backup.password;
credentialsFile =
builtins.toFile "creds.env" my.secrets.backup.credentials;
passwordFile = secrets."backup/password".path;
credentialsFile = secrets."backup/credentials".path;
};
# My blog and related hosts
blog.enable = true;
@ -34,11 +31,12 @@ in
drone = {
enable = true;
runners = [ "docker" "exec" ];
# Insecure, I don't care.
secretFile =
builtins.toFile "gitea.env" my.secrets.drone.gitea;
sharedSecretFile =
builtins.toFile "rpc.env" my.secrets.drone.secret;
secretFile = secrets."drone/gitea".path;
sharedSecretFile = secrets."drone/secret".path;
};
# Flood UI for transmission
flood = {
enable = true;
};
# Gitea forge
gitea.enable = true;
@ -52,36 +50,66 @@ in
# Gitea mirrorig service
lohr = {
enable = true;
sharedSecretFile =
let
content = "LOHR_SECRET=${my.secrets.lohr.secret}";
in
builtins.toFile "lohr-secret.env" content;
sharedSecretFile = secrets."lohr/secret".path;
};
# Matrix backend and Element chat front-end
matrix = {
enable = true;
secret = my.secrets.matrix.secret;
mailConfigFile = secrets."matrix/mail".path;
# Only necessary when doing the initial registration
# secret = "change-me";
};
miniflux = {
enable = true;
password = my.secrets.miniflux.password;
credentialsFiles = secrets."miniflux/credentials".path;
};
# Various monitoring dashboards
monitoring = {
enable = true;
grafana = {
passwordFile = secrets."monitoring/password".path;
};
};
# FLOSS music streaming server
navidrome = {
enable = true;
musicFolder = "/data/media/music";
};
# Nextcloud self-hosted cloud
nextcloud = {
enable = true;
password = my.secrets.nextcloud.password;
passwordFile = secrets."nextcloud/password".path;
};
nginx = {
enable = true;
acme = {
credentialsFile = secrets."acme/dns-key".path;
};
sso = {
authKeyFile = secrets."sso/auth-key".path;
users = {
ambroisie = {
passwordHashFile = secrets."sso/ambroisie/password-hash".path;
totpSecretFile = secrets."sso/ambroisie/totp-secret".path;
};
};
groups = {
root = [ "ambroisie" ];
};
};
};
paperless = {
enable = true;
documentPath = "/data/media/paperless";
passwordFile = secrets."paperless/password".path;
secretKeyFile = secrets."paperless/secret-key".path;
};
# The whole *arr software suite
pirate.enable = true;
# Podcast automatic downloader
podgrab = {
enable = true;
passwordFile =
let
contents = "PASSWORD=${my.secrets.podgrab.password}";
in
builtins.toFile "podgrab.env" contents;
passwordFile = secrets."podgrab/password".path;
port = 9598;
};
# Regular backups
@ -97,8 +125,7 @@ in
# Torrent client and webui
transmission = {
enable = true;
username = "Ambroisie";
password = my.secrets.transmission.password;
credentialsFile = secrets."transmission/credentials".path;
};
# Simple, in-kernel VPN
wireguard = {
@ -106,9 +133,4 @@ in
startAtBoot = true; # Server must be started to ensure clients can connect
};
};
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
}

View file

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDWVUvOT1/triPcj7wiLAmiVkPZ71crySbReetHaGxMYYdKNFurJQsP6BqsdCAwrGbduLUDJovLtjOM7SxghjkGqh2RZucj/zqpja8YoFqYTcLutlqa1NwUqQTq21azKBDSdvkBPWWyZhOKssnag+0bZRN3vVajoDrwAU6zJLhHh9eNESTEytAnZnllXsHB1dKF1p7FWVwYTGAc1PdHHSQNMkjg9aCM+VBzTHhp8nF+GOtGzt0A0XnoZGdhn6KqhKyH7KxwPMmeD3RNeCEmQY/TXjthOx/mBkgTEa8LWOBxdy/Rs6edUenvPcQ5tK5nX0GSxxqtbORlhT+tGiqq1UHeIUhXirBUaS7pnDo+Edc0m8ruLcwHwyQ5yVn2ts3daKxb87+PyjYiRxxeQXvbF84ef7ZOkLTEn0tnftFHLqszBfOjoV1DmMNSWPDULD3krObzNbr1I0xHE7bDRXw2t8L1cwHOLHTL9KwsTCw1d25JSxINp2wAZxlGVZLXoXVMKTjfx1xSGbUuRzA1Q6+1IH9WDvSSixDzvc2Dqnj91/xardivApK+T+OxTBurwWsxzEezIAbTCpoKW9ulzu06xWGWhxATkzUmVh/qhFUHAVlmhEvn0KqlYbWteEcUxgKS1uSAoA6+pZh5NMG1u1hLEktBQbDnS0VdyKYBUHZidLuR4w== ambroisie@porthos

View file

@ -10,6 +10,6 @@ in
group = "nginx";
createHome = false; # Messes with permissions
home = "/var/www/";
openssh.authorizedKeys.keys = [ my.secrets.drone.ssh.publicKey ];
openssh.authorizedKeys.keyFiles = [ ./ssh/drone.pub ];
};
}

View file

@ -1,15 +1,28 @@
# Common modules
{ ... }:
{ lib, ... }:
{
imports = [
./documentation.nix
./ergodox.nix
./language.nix
./media.nix
./networking.nix
./nix.nix
./packages.nix
./users.nix
./hardware
./home
./programs
./secrets
./services
./system
];
options.my = with lib; {
user = {
name = mkOption {
type = types.str;
default = "ambroisie";
example = "alice";
description = "my username";
};
home = {
enable = my.mkDisableOption "home-manager configuration";
};
};
};
}

View file

@ -1,37 +0,0 @@
{ config, lib, ... }:
let
cfg = config.my.module.documentation;
# I usually want everything enabled at once, but keep it customizable
defaultToGlobal = description: lib.mkEnableOption description // {
default = cfg.enable;
};
in
{
options.my.module.documentation = with lib.my; {
enable = mkDisableOption "Documentation integration";
dev.enable = defaultToGlobal "Documentation aimed at developers";
info.enable = defaultToGlobal "Documentation aimed at developers";
man.enable = defaultToGlobal "Documentation aimed at developers";
nixos.enable = defaultToGlobal "NixOS documentation";
};
config.documentation = {
enable = cfg.enable;
dev.enable = cfg.dev.enable;
info.enable = cfg.info.enable;
man = {
enable = cfg.man.enable;
generateCaches = true;
};
nixos.enable = cfg.nixos.enable;
};
}

View file

@ -0,0 +1,75 @@
{ config, lib, pkgs, ... }:
let
cfg = config.my.hardware.bluetooth;
in
{
options.my.hardware.bluetooth = with lib; {
enable = mkEnableOption "bluetooth configuration";
enableHeadsetIntegration = my.mkDisableOption "A2DP sink configuration";
loadExtraCodecs = my.mkDisableOption "extra audio codecs";
};
config = lib.mkIf cfg.enable (lib.mkMerge [
# Enable bluetooth devices and GUI to connect to them
{
hardware.bluetooth.enable = true;
services.blueman.enable = true;
}
# Support for additional bluetooth codecs
(lib.mkIf cfg.loadExtraCodecs {
hardware.pulseaudio = {
extraModules = [ pkgs.pulseaudio-modules-bt ];
package = pkgs.pulseaudioFull;
};
services.pipewire = {
media-session.config.bluez-monitor.rules = [
{
# Matches all cards
matches = [{ "device.name" = "~bluez_card.*"; }];
actions = {
"update-props" = {
"bluez5.reconnect-profiles" = [
"hfp_hf"
"hsp_hs"
"a2dp_sink"
];
# mSBC provides better audio + microphone
"bluez5.msbc-support" = true;
# SBC XQ provides better audio
"bluez5.sbc-xq-support" = true;
};
};
}
{
matches = [
# Matches all sources
{
"node.name" = "~bluez_input.*";
}
# Matches all outputs
{
"node.name" = "~bluez_output.*";
}
];
actions = {
"node.pause-on-idle" = false;
};
}
];
};
})
# Support for A2DP audio profile
(lib.mkIf cfg.enableHeadsetIntegration {
hardware.bluetooth.settings = {
General = {
Enable = "Source,Sink,Media,Socket";
};
};
})
]);
}

View file

@ -0,0 +1,13 @@
# Hardware-related modules
{ ... }:
{
imports = [
./bluetooth
./ergodox
./mx-ergo
./networking
./sound
./upower
];
}

View file

@ -1,16 +1,14 @@
# ZSA keyboard udev rules
{ config, lib, ... }:
let
cfg = config.my.modules.ergodox;
cfg = config.my.hardware.ergodox;
in
{
options.my.modules.ergodox = with lib; {
options.my.hardware.ergodox = with lib; {
enable = mkEnableOption "ZSA udev rules and user group configuration";
};
config = lib.mkIf cfg.enable {
hardware.keyboard.zsa.enable = true;
users.extraGroups = [ "plugdev" ];
};
}

View file

@ -0,0 +1,26 @@
# Hold down the `next page` button to scroll using the ball
{ config, lib, ... }:
let
cfg = config.my.hardware.mx-ergo;
in
{
options.my.hardware.mx-ergo = with lib; {
enable = mkEnableOption "MX Ergo configuration";
};
config = lib.mkIf cfg.enable {
services.xserver = {
# This section must be *after* the one configured by `libinput`
# for the `ScrollMethod` configuration to not be overriden
inputClassSections = lib.mkAfter [
''
Identifier "MX Ergo scroll button configuration"
MatchProduct "MX Ergo"
MatchIsPointer "on"
Option "ScrollMethod" "button"
Option "ScrollButton" "9"
''
];
};
};
}

View file

@ -0,0 +1,27 @@
{ config, lib, ... }:
let
cfg = config.my.hardware.networking;
in
{
options.my.hardware.networking = with lib; {
externalInterface = mkOption {
type = types.nullOr types.str;
default = null;
example = "eth0";
description = ''
Name of the network interface that egresses to the internet. Used for
e.g. NATing internal networks.
'';
};
wireless = {
enable = mkEnableOption "wireless configuration";
};
};
config = lib.mkMerge [
(lib.mkIf cfg.wireless.enable {
networking.networkmanager.enable = true;
})
];
}

View file

@ -0,0 +1,67 @@
{ config, lib, ... }:
let
cfg = config.my.hardware.sound;
in
{
options.my.hardware.sound = with lib; {
pipewire = {
enable = mkEnableOption "pipewire configuration";
};
pulse = {
enable = mkEnableOption "pulseaudio configuration";
};
};
config = (lib.mkMerge [
# Sanity check
{
assertions = [
{
assertion = builtins.all (lib.id) [
(cfg.pipewire.enable -> !cfg.pulse.enable)
(cfg.pulse.enable -> !cfg.pipewire.enable)
];
message = ''
`config.my.hardware.sound.pipewire.enable` and
`config.my.hardware.sound.pulse.enable` are incompatible.
'';
}
];
}
(lib.mkIf cfg.pipewire.enable {
# RealtimeKit is recommended
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
pulse = {
enable = true;
};
jack = {
enable = true;
};
media-session = {
enable = true;
};
};
})
# Pulseaudio setup
(lib.mkIf cfg.pulse.enable {
# ALSA
sound.enable = true;
hardware.pulseaudio.enable = true;
})
]);
}

View file

@ -0,0 +1,44 @@
{ config, lib, ... }:
let
cfg = config.my.hardware.upower;
in
{
options.my.hardware.upower = with lib; {
enable = mkEnableOption "upower configuration";
levels = {
low = mkOption {
type = types.ints.unsigned;
default = 25;
example = 10;
description = "Low percentage";
};
critical = mkOption {
type = types.ints.unsigned;
default = 15;
example = 5;
description = "Critical percentage";
};
action = mkOption {
type = types.ints.unsigned;
default = 5;
example = 3;
description = "Percentage at which point an action must be taken";
};
};
};
config = lib.mkIf cfg.enable {
services.upower = {
enable = true;
percentageLow = cfg.levels.low;
percentageCritical = cfg.levels.critical;
percentageAction = cfg.levels.action;
};
};
}

24
modules/home/default.nix Normal file
View file

@ -0,0 +1,24 @@
{ config, inputs, lib, ... }:
let
actualPath = [ "home-manager" "users" config.my.user.name "my" "home" ];
aliasPath = [ "my" "home" ];
cfg = config.my.user.home;
in
{
imports = [
inputs.home-manager.nixosModule # enable home-manager options
(lib.mkAliasOptionModule aliasPath actualPath) # simplify setting home options
];
config = lib.mkIf cfg.enable {
home-manager = {
# Not a fan of out-of-directory imports, but this is a good exception
users.${config.my.user.name} = import ../../home;
# Nix Flakes compatibility
useGlobalPkgs = true;
useUserPackages = true;
};
};
}

View file

@ -1,7 +0,0 @@
# Language settings
{ ... }:
{
# Select internationalisation properties.
i18n.defaultLocale = "en_US.UTF-8";
}

View file

@ -1,16 +0,0 @@
# Abstracting away the need for a common 'media' group
{ config, lib, ... }:
let
mediaServices = with config.my.services; [
calibre-web
jellyfin
pirate
sabnzbd
transmission
];
needed = builtins.any (service: service.enable) mediaServices;
in
{
config.users.groups.media = lib.mkIf needed { };
}

View file

@ -1,13 +0,0 @@
{ lib, ... }:
{
options.my.networking.externalInterface = with lib; mkOption {
type = types.nullOr types.str;
default = null;
example = "eth0";
description = ''
Name of the network interface that egresses to the internet. Used for
e.g. NATing internal networks.
'';
};
}

View file

@ -1,11 +0,0 @@
# Nix related settings
{ pkgs, ... }:
{
nix = {
package = pkgs.nixFlakes;
extraOptions = ''
experimental-features = nix-command flakes
'';
};
}

View file

@ -1,19 +0,0 @@
# Common packages
{ pkgs, ... }:
{
# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
git
git-crypt
mosh
vim
wget
];
programs.vim.defaultEditor = true; # Modal editing is life
programs.zsh.enable = true; # Use integrations
nixpkgs.config.allowUnfree = true; # Because I don't care *that* much.
}

Some files were not shown because too many files have changed in this diff Show more