Compare commits

...

80 Commits

Author SHA1 Message Date
262f6779b1 wip: fix(copypary): zotero webdav
All checks were successful
build / build (push) Successful in 1m36s
2026-03-29 19:05:29 -06:00
9ffa14e536 fix(jellyfin-rpc): systemd unit dependencies
All checks were successful
build / build (push) Successful in 2m44s
2026-03-29 19:05:17 -06:00
8c41e3b8df feat(gitea): set default merge style
All checks were successful
build / build (push) Successful in 6s
2026-03-28 14:21:40 -06:00
a9ac5ae964 feat(gitea): 도기 보나와 한국어 2026-03-28 14:21:40 -06:00
258c3edeab fix(emacs): o kepeken ilo Syd/handle
All checks were successful
build / build (push) Successful in 1m14s
2026-03-26 10:31:37 -06:00
5d5036a83c feat(emacs): eshell aliases from home.shellAliases
All checks were successful
build / build (push) Successful in 1m52s
2026-03-26 10:22:23 -06:00
da60eaa936 feat(bash): alias completions 2026-03-26 09:19:52 -06:00
c551e8f86e refactor: move crumb bash to msyds 2026-03-26 08:22:27 -06:00
de5b56d1b1 feat: markdown prose mode
All checks were successful
build / build (push) Successful in 3m4s
2026-03-24 20:00:08 -06:00
cbb7f3c7a7 fix: mark compilation buffer as popup 2026-03-24 19:59:42 -06:00
d0b5b42dca fix(fruitbook): disable bluetooth (since DMS provides it)
Some checks failed
build / build (push) Failing after 22m33s
2026-03-23 11:36:43 -06:00
7ea2a79aca fix(kdeconnect): o awen e ijo Kde-connect State
All checks were successful
build / build (push) Successful in 1m43s
closes #18
2026-03-22 02:27:45 -06:00
182198230a feat(gitea): 이메일 더함
All checks were successful
build / build (push) Successful in 6s
2026-03-22 02:23:34 -06:00
36be01d80e fix(emacs): o lon e fcitx-remote-command
All checks were successful
build / build (push) Successful in 1m23s
2026-03-22 01:31:22 -06:00
148597d593 refactor(fruitbook): niri 대신에 dms로 잠금
All checks were successful
build / build (push) Successful in 1m47s
2026-03-22 01:27:45 -06:00
087f015340 fix(fruitbook): 전지 그림을 보임
그런데 한 거만 해야 돼: upower을 켰어.
2026-03-22 01:18:52 -06:00
ab7d28ac0f fix(fruitbook): 노트북 닫을 때 화면을 잠금
All checks were successful
build / build (push) Successful in 1m37s
2026-03-22 00:50:51 -06:00
a913e4f5c7 fix(toki-pona): nasin pini la kepeken e sitelen pona 2026-03-22 00:45:46 -06:00
b31bcae064 fix(ci): o ante e pali mute kama pali lili
All checks were successful
build / build (push) Successful in 1m14s
2026-03-22 00:15:01 -06:00
2146717898 chore: sydpc밖에 steam, slippi, openutau를 끔
All checks were successful
build / build-sydpc (push) Successful in 2m10s
build / build-fruitbook (push) Successful in 36s
build / build-deertopia (push) Successful in 41s
2026-03-21 23:55:41 -06:00
584489c853 fix(fruitbook): nixos-modules를 빠른 선풍기 없이 켬 2026-03-21 23:55:22 -06:00
a3ead883fe fix(emacs): clojure-refactor mode hook
All checks were successful
build / build-sydpc (push) Successful in 2m4s
build / build-fruitbook (push) Successful in 24s
build / build-deertopia (push) Successful in 33s
2026-03-20 18:17:49 -06:00
86b80e887c feat(emacs): fcitx
All checks were successful
build / build-sydpc (push) Successful in 27s
build / build-fruitbook (push) Successful in 22s
build / build-deertopia (push) Successful in 25s
2026-03-17 12:45:20 -06:00
178f3b9c31 feat(toki-pona): apply in ghostty
All checks were successful
build / build-sydpc (push) Successful in 2m5s
build / build-fruitbook (push) Successful in 29s
build / build-deertopia (push) Successful in 42s
2026-03-17 11:43:54 -06:00
425f502bba fix(emacs): EXPAND TABS 2026-03-17 11:43:32 -06:00
077a709f65 fix(fruitbook): temporarily disable nixos-hardware
my laptop fans were going wild
2026-03-17 11:42:54 -06:00
989aaa37da feat(fruitbook): nixos-hardware
All checks were successful
build / build-sydpc (push) Successful in 4s
build / build-fruitbook (push) Successful in 3s
build / build-deertopia (push) Successful in 3s
2026-03-16 18:31:32 -06:00
02a3702e8e fix(bepasty): workaround for nixpkgs#500538
All checks were successful
build / build-sydpc (push) Successful in 34s
build / build-fruitbook (push) Successful in 24s
build / build-deertopia (push) Successful in 36s
https://github.com/NixOS/nixpkgs/pull/500538
2026-03-16 18:11:58 -06:00
2905839509 refactor(bepasty): no with lib 2026-03-16 16:50:32 -06:00
df0062f89b feat(toki-pona): spellcheck
Some checks failed
build / build-sydpc (push) Successful in 2m5s
build / build-fruitbook (push) Successful in 43s
build / build-deertopia (push) Failing after 43s
2026-03-15 18:09:56 -06:00
b13a985d87 refactor(toki-pona): all in one module 2026-03-15 18:09:38 -06:00
dc1a34de65 chore: bump nixpkgs, hm 2026-03-15 18:07:13 -06:00
8010658111 fix(emacs): don't replace roam: links
Some checks failed
build / build-sydpc (push) Successful in 31s
build / build-fruitbook (push) Successful in 25s
build / build-deertopia (push) Failing after 34s
2026-03-14 17:29:35 -06:00
ef03e80d2c feat(emacs): clj-refactor
Some checks failed
build / build-sydpc (push) Successful in 29s
build / build-deertopia (push) Has been cancelled
build / build-fruitbook (push) Has been cancelled
2026-03-14 17:26:03 -06:00
3788f7027e feat(emacs): toki pona fonts
Some checks failed
build / build-deertopia (push) Failing after 38s
build / build-sydpc (push) Successful in 43s
build / build-fruitbook (push) Successful in 29s
2026-03-14 17:25:45 -06:00
56f8f48e2b feat(toki-pona): add sitelen seli kiwen 2026-03-14 17:25:30 -06:00
69484833c8 feat(discord): voice message plugin
Some checks failed
build / build-sydpc (push) Successful in 1m56s
build / build-fruitbook (push) Successful in 29s
build / build-deertopia (push) Failing after 36s
2026-03-14 13:37:03 -06:00
c52bd6ae85 feat(toki-pona): init
Some checks failed
build / build-sydpc (push) Successful in 4s
build / build-fruitbook (push) Successful in 3s
build / build-deertopia (push) Failing after 5s
2026-03-12 08:41:24 -06:00
ca6fd41f35 chore(sioyek): don't use smooth movement (cause it sucks)
Some checks failed
build / build-sydpc (push) Successful in 1m39s
build / build-fruitbook (push) Successful in 22s
build / build-deertopia (push) Failing after 46s
2026-03-08 14:35:28 -06:00
f0841fdd0d fix(discord): fix jellyfin-rpc dependencies
Some checks failed
build / build-sydpc (push) Successful in 1m48s
build / build-fruitbook (push) Successful in 29s
build / build-deertopia (push) Failing after 51s
- use a systemd oneshot service again lol.
- fix dependencies to run jellyfin-rpc-configure ONCE, and not
  repeatedly each time jellyfin-rpc starts.
2026-03-08 12:04:06 -06:00
d5a2f4026a feat(documentation): init
Some checks failed
build / build-sydpc (push) Successful in 43s
build / build-fruitbook (push) Successful in 31s
build / build-deertopia (push) Failing after 41s
2026-03-07 21:00:00 -07:00
8684c3b92c fix(discord): configure jellyfin-rpc on activation rather than before service 2026-03-07 20:59:59 -07:00
a44b435a5e bump home-manager 2026-03-07 19:41:50 -07:00
24d6a52f4f feat(emacs): auctex
Some checks failed
build / build-sydpc (push) Failing after 3s
build / build-fruitbook (push) Failing after 4s
build / build-deertopia (push) Failing after 4s
2026-03-07 15:58:36 -07:00
e7c17a948a fix(emacs): make default application
Some checks failed
build / build-sydpc (push) Failing after 3s
build / build-fruitbook (push) Failing after 3s
build / build-deertopia (push) Failing after 3s
2026-03-07 15:58:01 -07:00
fbeed753e9 chore(sioyek): binds
Some checks failed
build / build-sydpc (push) Failing after 5s
build / build-fruitbook (push) Failing after 4s
build / build-deertopia (push) Failing after 6s
2026-03-07 15:56:19 -07:00
89eb11f635 feat(sioyek): init 2026-03-07 15:56:19 -07:00
31f362aa45 fix(fruitbook): disable user crumb
Some checks failed
build / build-sydpc (push) Successful in 2m17s
build / build-fruitbook (push) Successful in 46s
build / build-deertopia (push) Failing after 53s
2026-03-07 14:44:43 -07:00
2360bd01e9 fix(discord): don't announce anything but music
Some checks failed
build / build-sydpc (push) Successful in 39s
build / build-fruitbook (push) Failing after 4s
build / build-deertopia (push) Failing after 39s
2026-03-06 19:26:31 -07:00
bdeba55f0f chore: oops this shouldn't be here
Some checks failed
build / build-sydpc (push) Successful in 30s
build / build-fruitbook (push) Failing after 3s
build / build-deertopia (push) Failing after 35s
2026-03-06 16:10:34 -07:00
af9db3867e Merge pull request 'feat(discord): jellyfin-rpc' (#6) from jellyfin-rpc into main
Some checks failed
build / build-sydpc (push) Successful in 30s
build / build-fruitbook (push) Failing after 4s
build / build-deertopia (push) Failing after 37s
Reviewed-on: #6
2026-03-06 15:30:51 -07:00
550da5a27c feat(discord): jellyfin-rpc
Some checks failed
build / build-sydpc (push) Successful in 42s
build / build-fruitbook (push) Failing after 3s
build / build-deertopia (push) Failing after 41s
2026-03-06 15:28:57 -07:00
0cb3d69fd4 chore: bumpies 2
Some checks failed
build / build-sydpc (push) Successful in 2m23s
build / build-fruitbook (push) Failing after 4s
build / build-deertopia (push) Failing after 1m10s
2026-03-06 13:06:21 -07:00
1158dad1f1 chore: bumpies
Some checks failed
build / build-deertopia (push) Waiting to run
build / build-sydpc (push) Successful in 2m2s
build / build-fruitbook (push) Failing after 4s
2026-03-06 13:05:14 -07:00
f15efb661e refactor(gitea-actions-runner): config
All checks were successful
build / build-sydpc (push) Successful in 2m0s
build / build-fruitbook (push) Successful in 24s
build / build-deertopia (push) Successful in 44s
2026-03-05 10:16:12 -07:00
70068bf0d9 feat(vaultwarden): init
All checks were successful
build / build-sydpc (push) Successful in 1m52s
build / build-fruitbook (push) Successful in 23s
build / build-deertopia (push) Successful in 49s
2026-03-03 21:42:02 -07:00
165806ba2c feat: build action
All checks were successful
build / build-sydpc (push) Successful in 51s
build / build-fruitbook (push) Successful in 47s
build / build-deertopia (push) Successful in 55s
2026-03-01 02:54:00 -07:00
76605c04b9 fix(gitea-actions-runner): add nix to path 2026-03-01 02:42:40 -07:00
e0506fc3e0 feat(gitea-actions-runner): init 2026-03-01 02:11:40 -07:00
93e801c332 chore(fcitx5): bump syd-fcitx5-tables 2026-02-20 12:23:30 -07:00
2b85764f11 chore(fruitbook): enable kdeconnect 2026-02-18 16:43:42 -07:00
f22ccc40a0 fix(lldap): warning 2026-02-18 16:43:42 -07:00
f1e239b13b fix(emacs): keep custom out of init.el 2026-02-18 16:43:42 -07:00
6c7c1f1b17 fix(emacs): keep bookmarks and transient out of vc 2026-02-18 16:43:02 -07:00
8c083dfc17 fix: typo io'm such a fat fucking chud god i know no words at all 2026-02-16 19:40:53 -07:00
aea4a3da97 fix(emacs): load lsp 2026-02-14 10:22:24 -07:00
f0ff7b5c51 feat(emacs): korean irregularity class template 2026-02-11 14:00:17 -07:00
ba794c28dd doc(gitea): cole*: i expect full credit somewhere
}:3 ♥
2026-02-08 22:00:38 -07:00
070bbe575b chore(gitea): gupHub now 2026-02-08 21:49:18 -07:00
e4fdd52d51 bring readme up to date 2026-02-08 21:46:41 -07:00
ca8f14118b feat(gitea): init 2026-02-08 21:45:30 -07:00
c790ebec29 feat(www,copyparty): vault msyds public 2026-02-08 19:05:38 -07:00
096dd77726 feat(copyparty,authelia): personal storage & webDAV 2026-02-08 17:46:27 -07:00
7b5a43954c feat(gc): init 2026-02-08 15:55:46 -07:00
77a2249a71 feat(msyds): enable qalc 2026-02-07 13:21:37 -07:00
e9ea2d48ad feat(emacs): more cider binds 2026-02-07 13:20:03 -07:00
3ca8359834 feat(kdeconnect): init 2026-02-07 13:19:35 -07:00
bd2964f894 feat(emacs): bind C-o in cider inspector 2026-02-02 16:34:01 -07:00
81aa3fb89f fix: persist terraria 2026-01-31 16:23:16 -07:00
785d78660f fix(emacs): no :ensure eshell 2026-01-30 14:13:54 -07:00
62 changed files with 1321 additions and 377 deletions

View File

@@ -0,0 +1,17 @@
name: build
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
build:
runs-on: nixos
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: build sydpc
run: nix build -L .#nixosConfigurations.sydpc.config.system.build.toplevel
- name: build fruitbook
run: nix build -L .#nixosConfigurations.fruitbook.config.system.build.toplevel
- name: build deertopia
run: nix build -L .#nixosConfigurations.deertopia.config.system.build.toplevel

View File

@@ -1,20 +1,4 @@
#+title: Sydnix
#+author: Madeleine Sydney Ślaga
Hello! These are my dotfiles for all my software and Nix machines. My TODO lists and READMEs tend to share a file, so I've moved it out of version-control. A link will be here soon enough.
* Overview
** Modules
Nix modules are Sydnix's primary mode of organisation. The modules in this repository are categorised by the scope of their applicability, be it user-specific, machine-specific, Sydnix-specific, or releasable. These sum of these categories resembles a hierarchy wherein modules become less generally-applicable as they build off one another. This all goes to say, in a very roundabout fashion, that we are using the [[https://www.nayuki.io/pe/designing-better-file-organization-around-tags-not-hierarchies][accursed]] hierarchical file-system as god intended:
#+begin_example
«TODO: Annotated diagram explaining the structore of modules/»
#+end_example
User modules may be configurations using a host-specific module, which itself may be a configuration of a Sydnix-specific module.
# Local Variables:
# jinx-local-words: "dotfiles"
# End:
these are my disgusting undocumented dotfiles. someday they'll be documented. maybe. }:)

231
flake.lock generated
View File

@@ -21,28 +21,28 @@
"base16-fish": {
"flake": false,
"locked": {
"lastModified": 1754405784,
"narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
"lastModified": 1765809053,
"narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=",
"owner": "tomyun",
"repo": "base16-fish",
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github"
},
"original": {
"owner": "tomyun",
"repo": "base16-fish",
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github"
}
},
"base16-helix": {
"flake": false,
"locked": {
"lastModified": 1752979451,
"narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
"lastModified": 1760703920,
"narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
"owner": "tinted-theming",
"repo": "base16-helix",
"rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
"rev": "d646af9b7d14bff08824538164af99d0c521b185",
"type": "github"
},
"original": {
@@ -76,11 +76,11 @@
]
},
"locked": {
"lastModified": 1762095388,
"narHash": "sha256-7Q8LtcvKWHbP8znARRTOY2tpU5WoV6FHwp5TZJOI8Us=",
"lastModified": 1774411715,
"narHash": "sha256-mceIHtVMXpLAfr1W0VK9ceTBX5yKu4gGWpVbThWTsAA=",
"owner": "9001",
"repo": "copyparty",
"rev": "ac085b8149ff50e03d260128596dd130ed1c7cae",
"rev": "26e663d111e39ca96c63702ad27a05b6736607cf",
"type": "github"
},
"original": {
@@ -129,11 +129,11 @@
"firefox-gnome-theme": {
"flake": false,
"locked": {
"lastModified": 1758112371,
"narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
"lastModified": 1764873433,
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
"owner": "rafaelmardojai",
"repo": "firefox-gnome-theme",
"rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
"type": "github"
},
"original": {
@@ -149,7 +149,7 @@
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"revCount": 69,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz?rev=ff81ac966bb2cae68946d5ed5fc4994f96d0ffec&revCount=69"
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
},
"original": {
"type": "tarball",
@@ -161,11 +161,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1754091436,
"narHash": "sha256-XKqDMN1/Qj1DKivQvscI4vmHfDfvYR2pfuFOJiCeewM=",
"lastModified": 1772408722,
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "67df8c627c2c39c41dbec76a1f201929929ab0bd",
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
"type": "github"
},
"original": {
@@ -203,11 +203,11 @@
]
},
"locked": {
"lastModified": 1756770412,
"narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
"lastModified": 1767609335,
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "4524271976b625a4a605beefd893f270620fd751",
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
"type": "github"
},
"original": {
@@ -287,11 +287,11 @@
"flake": false,
"locked": {
"host": "gitlab.gnome.org",
"lastModified": 1762869044,
"narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=",
"lastModified": 1767737596,
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
"owner": "GNOME",
"repo": "gnome-shell",
"rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad",
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
"type": "gitlab"
},
"original": {
@@ -307,11 +307,11 @@
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1768325819,
"narHash": "sha256-mBKqOJkxCRwEhIXfq93WTcDXsBlJ/f1Dfv9thJxrDPs=",
"lastModified": 1773608492,
"narHash": "sha256-QZteyExJYSQzgxqdsesDPbQgjctGG7iKV/6ooyQPITk=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "b1fa714d6cd656e3105d1965637be6ab7541d7d7",
"rev": "9a40ec3b78fc688d0908485887d355caa5666d18",
"type": "github"
},
"original": {
@@ -345,11 +345,11 @@
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
},
"locked": {
"lastModified": 1768306584,
"narHash": "sha256-GWLONqOKcsWKFYqoEIFbIv6Ti/xoSvsYC9LzZzB1oj4=",
"lastModified": 1772698812,
"narHash": "sha256-7+K/VaZ7TXUeUGSYshg8wC3UsRZHB+M4x6r38Q1B79c=",
"owner": "sodiboo",
"repo": "niri-flake",
"rev": "1b8c8ba473cf336d74ffb05ee453c8fe6a05bbbc",
"rev": "5641625ef950f024e3e0e3f38bb91f876290c0be",
"type": "github"
},
"original": {
@@ -378,11 +378,11 @@
"niri-unstable": {
"flake": false,
"locked": {
"lastModified": 1768196703,
"narHash": "sha256-mttBQdVnVFO3mn+M+oqCsZZOtS2HvXYy+VaHxb8YuMw=",
"lastModified": 1772207631,
"narHash": "sha256-Jkkg+KqshFO3CbTszVVpkKN2AOObYz+wMsM3ONo1z5g=",
"owner": "YaLTeR",
"repo": "niri",
"rev": "3672e79369d72297abda8878245ea4ec327062c6",
"rev": "e708f546153f74acf33eb183b3b2992587a701e5",
"type": "github"
},
"original": {
@@ -423,11 +423,11 @@
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1764576281,
"narHash": "sha256-f6vfwmIb9C3brI4/KJ9MFUDWt6FsKQ0dbMO6AuFc7E0=",
"lastModified": 1772813986,
"narHash": "sha256-x0fD+LL+O99p36c2UnjnHvVq4/7TvGH/8G5lTNIJBCo=",
"owner": "KaylorBen",
"repo": "nixcord",
"rev": "c8f47894134a4984acd319e66c4384eb1ff886e2",
"rev": "e433a2919eb9b3a8c85ab3017c08685816e63a66",
"type": "github"
},
"original": {
@@ -436,6 +436,21 @@
"type": "github"
}
},
"nixos-hardware": {
"locked": {
"lastModified": 1773533765,
"narHash": "sha256-qonGfS2lzCgCl59Zl63jF6dIRRpvW3AJooBGMaXjHiY=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "f8e82243fd601afb9f59ad230958bd073795cbfe",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixos-hardware",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1741402956,
@@ -454,11 +469,11 @@
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1753579242,
"narHash": "sha256-zvaMGVn14/Zz8hnp4VWT9xVnhc8vuL3TStRqwk22biA=",
"lastModified": 1772328832,
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "0f36c44e01a6129be94e3ade315a5883f0228a6e",
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
"type": "github"
},
"original": {
@@ -485,11 +500,11 @@
},
"nixpkgs-stable_2": {
"locked": {
"lastModified": 1768242861,
"narHash": "sha256-F4IIxa5xDHjtrmMcayM8lHctUq1oGltfBQu2+oqDWP4=",
"lastModified": 1772598333,
"narHash": "sha256-YaHht/C35INEX3DeJQNWjNaTcPjYmBwwjFJ2jdtr+5U=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1327e798cb055f96f92685df444e9a2c326ab5ed",
"rev": "fabb8c9deee281e50b1065002c9828f2cf7b2239",
"type": "github"
},
"original": {
@@ -500,22 +515,6 @@
}
},
"nixpkgs_10": {
"locked": {
"lastModified": 1750386251,
"narHash": "sha256-1ovgdmuDYVo5OUC5NzdF+V4zx2uT8RtsgZahxidBTyw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "076e8c6678d8c54204abcb4b1b14c366835a58bb",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_11": {
"locked": {
"lastModified": 1743568003,
"narHash": "sha256-ZID5T65E8ruHqWRcdvZLsczWDOAWIE7om+vQOREwiX0=",
@@ -549,11 +548,11 @@
},
"nixpkgs_3": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-dhhvQY67aboBk8b0/u0XB6vwHdgbROZT3fJAjyNh5Ww=",
"lastModified": 1773389992,
"narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"rev": "c06b4ae3d6599a672a6210b7021d699c351eebda",
"type": "github"
},
"original": {
@@ -565,11 +564,11 @@
},
"nixpkgs_4": {
"locked": {
"lastModified": 1768127708,
"narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=",
"lastModified": 1772624091,
"narHash": "sha256-QKyJ0QGWBn6r0invrMAK8dmJoBYWoOWy7lN+UHzW1jc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38",
"rev": "80bdc1e5ce51f56b19791b52b2901187931f5353",
"type": "github"
},
"original": {
@@ -581,32 +580,32 @@
},
"nixpkgs_5": {
"locked": {
"lastModified": 1754028485,
"narHash": "sha256-IiiXB3BDTi6UqzAZcf2S797hWEPCRZOwyNThJIYhUfk=",
"lastModified": 1772465433,
"narHash": "sha256-ywy9troNEfpgh0Ee+zaV1UTgU8kYBVKtvPSxh6clYGU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "59e69648d345d6e8fef86158c555730fa12af9de",
"rev": "c581273b8d5bdf1c6ce7e0a54da9841e6a763913",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-25.05",
"ref": "nixos-25.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_6": {
"locked": {
"lastModified": 1768178648,
"narHash": "sha256-kz/F6mhESPvU1diB7tOM3nLcBfQe7GU7GQCymRlTi/s=",
"owner": "NixOS",
"lastModified": 1773700673,
"narHash": "sha256-RLidgpn3mN3cVkIiiYehcmM2ImBnPudwISFLy71zN0o=",
"owner": "msyds",
"repo": "nixpkgs",
"rev": "3fbab70c6e69c87ea2b6e48aa6629da2aa6a23b0",
"rev": "2595b5f0592534492bce3cb61c2c9bf5ba03ffbe",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"owner": "msyds",
"ref": "fix-bepasty",
"repo": "nixpkgs",
"type": "github"
}
@@ -629,11 +628,11 @@
},
"nixpkgs_8": {
"locked": {
"lastModified": 1762977756,
"narHash": "sha256-4PqRErxfe+2toFJFgcRKZ0UI9NSIOJa+7RXVtBhy4KE=",
"lastModified": 1767767207,
"narHash": "sha256-Mj3d3PfwltLmukFal5i3fFt27L6NiKXdBezC1EBuZs4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c5ae371f1a6a7fd27823bc500d9390b38c05fa55",
"rev": "5912c1772a44e31bf1c63c0390b90501e5026886",
"type": "github"
},
"original": {
@@ -693,11 +692,11 @@
]
},
"locked": {
"lastModified": 1758998580,
"narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
"lastModified": 1767810917,
"narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
"owner": "nix-community",
"repo": "NUR",
"rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
"rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
"type": "github"
},
"original": {
@@ -716,6 +715,7 @@
"niri": "niri",
"nixarr": "nixarr",
"nixcord": "nixcord",
"nixos-hardware": "nixos-hardware",
"nixpkgs": "nixpkgs_6",
"nur": "nur",
"sops-nix": "sops-nix",
@@ -763,11 +763,11 @@
"tinted-zed": "tinted-zed"
},
"locked": {
"lastModified": 1764550443,
"narHash": "sha256-ArO2V1YEHmEILilTj4KPtqF4gqc1q2HBrrrmygQ/UyU=",
"lastModified": 1772296853,
"narHash": "sha256-pAtzPsgHRKw/2Kv8HgAjSJg450FDldHPWsP3AKG/Xj0=",
"owner": "danth",
"repo": "stylix",
"rev": "794b6e1fa75177ebfeb32967f135858a1ab1ba15",
"rev": "c4b8e80a1020e09a1f081ad0f98ce804a6e85acf",
"type": "github"
},
"original": {
@@ -782,35 +782,38 @@
"nixpkgs": "nixpkgs_9"
},
"locked": {
"lastModified": 1762339715,
"narHash": "sha256-rzEJjyZat0juOF133YPSJMgOSeuBlk92PTOu22W1B6w=",
"owner": "msyds",
"repo": "syd-fcitx5-tables",
"rev": "2b66c43dcc524030a45ab6fdd5aab69c229dd290",
"type": "gitlab"
"lastModified": 1771615370,
"narHash": "sha256-UD/9fs1GYuwDGqrpKunrwOPrvkahLQ/6eeRy/0ejHNA=",
"ref": "refs/heads/main",
"rev": "41111bead687315ca1f55a826509234ca2f0e0ce",
"revCount": 8,
"type": "git",
"url": "https://git.deertopia.net/msyds/syd-fcitx5-tables"
},
"original": {
"owner": "msyds",
"repo": "syd-fcitx5-tables",
"type": "gitlab"
"type": "git",
"url": "https://git.deertopia.net/msyds/syd-fcitx5-tables"
}
},
"sydpkgs": {
"inputs": {
"nixpkgs": "nixpkgs_10"
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1767975357,
"narHash": "sha256-MDVh3/aVhkD1bh/r8c0gs9DL4e78CrUbUxOZHWlCwLM=",
"owner": "msyds",
"repo": "sydpkgs",
"rev": "233479ab277d47b1dbda202eafca50e61c659151",
"type": "github"
"lastModified": 1773275674,
"narHash": "sha256-kULSjFWDoDatz31aIses5q51ESUi0ASUc3MKmBYLnRY=",
"ref": "fcitx5-toki-pona",
"rev": "03f6a67a0a3b3c00ff4566147eddb0123cfe3d14",
"revCount": 38,
"type": "git",
"url": "https://git.deertopia.net/msyds/sydpkgs"
},
"original": {
"owner": "msyds",
"repo": "sydpkgs",
"type": "github"
"ref": "fcitx5-toki-pona",
"type": "git",
"url": "https://git.deertopia.net/msyds/sydpkgs"
}
},
"systems": {
@@ -861,7 +864,7 @@
"tf2-nix": {
"inputs": {
"flake-utils": "flake-utils_3",
"nixpkgs": "nixpkgs_11"
"nixpkgs": "nixpkgs_10"
},
"locked": {
"lastModified": 1761467191,
@@ -913,11 +916,11 @@
"tinted-schemes": {
"flake": false,
"locked": {
"lastModified": 1757716333,
"narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
"lastModified": 1767710407,
"narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
"owner": "tinted-theming",
"repo": "schemes",
"rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
"rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
"type": "github"
},
"original": {
@@ -929,11 +932,11 @@
"tinted-tmux": {
"flake": false,
"locked": {
"lastModified": 1757811970,
"narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
"lastModified": 1767489635,
"narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
"owner": "tinted-theming",
"repo": "tinted-tmux",
"rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
"rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
"type": "github"
},
"original": {
@@ -945,11 +948,11 @@
"tinted-zed": {
"flake": false,
"locked": {
"lastModified": 1757811247,
"narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
"lastModified": 1767488740,
"narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
"owner": "tinted-theming",
"repo": "base16-zed",
"rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
"rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
"type": "github"
},
"original": {
@@ -1035,11 +1038,11 @@
"xwayland-satellite-unstable": {
"flake": false,
"locked": {
"lastModified": 1768106915,
"narHash": "sha256-HlLo9zH4ULRXlmlIK948cHmdVhxyHgTHxGaoCRlW4k8=",
"lastModified": 1772429643,
"narHash": "sha256-M+bAeCCcjBnVk6w/4dIVvXvpJwOKnXjwi/lDbaN6Yws=",
"owner": "Supreeeme",
"repo": "xwayland-satellite",
"rev": "72245e108f3b03c3c4474d2de9de2d1830849603",
"rev": "10f985b84cdbcc3bbf35b3e7e43d1b2a84fa9ce2",
"type": "github"
},
"original": {

View File

@@ -3,7 +3,9 @@
inputs = {
disko.url = "github:nix-community/disko";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
# nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
# Waiting on https://github.com/NixOS/nixpkgs/pull/500538
nixpkgs.url = "github:msyds/nixpkgs/fix-bepasty";
impermanence.url = "github:nix-community/impermanence";
home-manager.url = "github:nix-community/home-manager";
sops-nix.url = "github:Mic92/sops-nix";
@@ -21,14 +23,19 @@
inputs.nixpkgs.follows = "nixpkgs";
inputs.vpnconfinement.follows = "vpn-confinement";
};
nixos-hardware.url = "github:NixOS/nixos-hardware";
# Used for Firefox extensions/addons.
nur = {
url = "github:nix-community/NUR";
inputs.nixpkgs.follows = "nixpkgs";
};
tf2-nix.url = "gitlab:msyds/tf2-nix";
syd-fcitx5-tables.url = "gitlab:msyds/syd-fcitx5-tables";
sydpkgs.url = "github:msyds/sydpkgs";
syd-fcitx5-tables.url =
"git+https://git.deertopia.net/msyds/syd-fcitx5-tables";
sydpkgs = {
url = "git+https://git.deertopia.net/msyds/sydpkgs?ref=fcitx5-toki-pona";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, nixpkgs, ... }@inputs:

View File

@@ -10,6 +10,7 @@
filesystemType = "btrfs";
stylix.enable = true;
gc.enable = true;
openssh.enable = true;
sydpkgs.overlay.enable = true;
@@ -48,6 +49,7 @@
deertopia = {
authelia.enable = true;
gitea.enable = true;
quiver.enable = true;
www.enable = true;
bepasty.enable = true;
@@ -56,7 +58,7 @@
lldap.pam.enable = true;
nginx.enable = true;
slskd.enable = true;
webdav.enable = true;
# webdav.enable = true;
copyparty.enable = true;
syncthing.enable = true;
cache.enable = true;
@@ -64,6 +66,7 @@
# umurmur.enable = true;
murmur.enable = true;
anki-sync-server.enable = true;
vaultwarden.enable = true;
servarr = {
enable = true;
prowlarr.enable = true;

View File

@@ -1,25 +1,30 @@
{ config, pkgs, lib, disko, ... }:
{ config, pkgs, lib, disko, nixos-hardware, ... }:
{
imports = [
./hardware.nix
./filesystems.nix
nixos-hardware.nixosModules.apple-macbook-pro-12-1
];
# Enabled by default by Nixos-hardware.
services.mbpfan.enable = false;
sydnix = {
filesystemType = "btrfs";
wifi.enable = true;
stylix.enable = true;
niri.enable = true;
steam.enable = true;
bluetooth.enable = true;
# gdm.enable = true;
# blueman.enable = true;
openssh.enable = true;
sydpkgs.overlay.enable = true;
dank-material-shell.enable = true;
kdeconnect.enable = true;
upower.enable = true;
users.users = [
"crumb"
# "crumb"
"msyds"
];

View File

@@ -25,14 +25,24 @@
openssh.enable = true;
sydpkgs.overlay.enable = true;
dank-material-shell.enable = true;
kdeconnect.enable = true;
gitea-actions-runner.enable = true;
sops = {
enable = true;
keyFile = "/persist/private-keys/age/deertopia";
};
steam = {
enable = true;
impermanenceUsers = ["crumb" "msyds"];
impermanenceUsers = [
# "crumb"
"msyds"
];
};
users.users = [
"crumb"
# "crumb"
"msyds"
];

16
modules/home/bash.nix Normal file
View File

@@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.bash;
in {
options.sydnix.bash = {
enable = lib.mkEnableOption "Bash";
};
imports = [
./bash/complete-alias.nix
];
config = lib.mkIf cfg.enable {
programs.bash.enable = true;
};
}

View File

@@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.bash.complete-alias;
in {
options.sydnix.bash.complete-alias = {
enable = lib.mkEnableOption "Alias completion";
};
config = lib.mkIf cfg.enable {
programs.bash.initExtra = lib.mkAfter ''
. ${lib.getExe pkgs.complete-alias}
complete -F _complete_alias "''${!BASH_ALIASES[@]}"
'';
};
}

View File

@@ -13,51 +13,36 @@ in {
};
};
config = lib.mkIf cfg.enable
(let
# Fixes flickering and platform detection on Wayland.
vesktop-wayland-wrapper =
pkgs.symlinkJoin {
name = "vesktop-wayland-wrapper";
paths = [ pkgs.callPackage pkgs.vesktop ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/vesktop \
--add-flags "--disable-gpu-compositing"
# --add-flags "--disable-gpu-compositing --ozone-platform-hint=auto"
'';
};
in {
sydnix.impermanence.directories =
let xdg-config-home =
config.home.confighome
or "${config.home.homeDirectory}/.config";
in [
# This directory should really be written in terms of
# `config.programs.nixcord.vesktopConfigDir`, but it defaults to null
# for unknown reasons. This is in conflict with the docs, which claim
# it should be the path used here.
(lib.removePrefix
config.home.homeDirectory
"${xdg-config-home}/vesktop")
];
imports = [
./discord/jellyfin-rpc.nix
];
programs.nixcord = {
enable = true;
discord = {
# Install Vesktop without Discord.
enable = false;
# openASAR.enable = true;
vencord.enable = false;
vencord.package = pkgs.vencord;
};
vesktop = {
enable = true;
# package =
# if cfg.fixWayland
# then vesktop-wayland-wrapper
# else pkgs.vesktop;
};
config = lib.mkIf cfg.enable {
sydnix.impermanence.directories =
let xdg-config-home =
config.home.confighome
or "${config.home.homeDirectory}/.config";
in [
# This directory should really be written in terms of
# `config.programs.nixcord.vesktopConfigDir`, but it
# defaults to null for unknown reasons. This is in conflict
# with the docs, which claim it should be the path used
# here.
(lib.removePrefix
config.home.homeDirectory
"${xdg-config-home}/vesktop")
];
programs.nixcord = {
enable = true;
discord = {
enable = false;
vencord.enable = false;
vencord.package = pkgs.vencord;
};
});
vesktop = {
enable = true;
};
};
};
}

View File

@@ -0,0 +1,95 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.discord.jellyfin-rpc;
vesktop-wrapper =
pkgs.vesktop.overrideAttrs (finalAttrs: prevAttrs: {
postFixup = ''
${prevAttrs.postFixup or ""}
if [[ -e $out/bin/.vesktop-wrapped ]]; then
echo ".vesktop-wrapped already exists..."
exit 1
fi
mv $out/bin/vesktop $out/bin/.vesktop-wrapped
tee $out/bin/vesktop <<EOF
#!/usr/bin/env bash
systemctl start --user jellyfin-rpc
$out/bin/.vesktop-wrapped "\$@"
systemctl stop --user jellyfin-rpc
EOF
chmod +x $out/bin/vesktop
'';
});
jellyfin-rpc-config-template =
pkgs.writeText "jellyfin-rpc-config-template"
(lib.toJSON {
jellyfin = {
url = "https://watch.deertopia.net";
username = ["lain" "msyds"];
music = {
display = ["year" "album" "genres"];
separator = "";
};
blacklist.libraries = [
"episode"
"movie"
"book"
"audiobook"
"livetv"
];
};
images = {
enable_images = true;
imgur_images = false;
};
});
in {
options.sydnix.discord.jellyfin-rpc = {
enable = lib.mkEnableOption "Jellyfin rich presence";
};
config = lib.mkIf cfg.enable {
systemd.user.services.jellyfin-rpc-configure =
let api-key-file = config.sops.secrets.jellyfin-rpc-api-key.path;
in {
Unit = {
After = [ "sops-nix.service" ];
Requires = [ "sops-nix.service" ];
X-Restart-Triggers = [ api-key-file ];
};
Install.WantedBy = [ "default.target" ];
Service = {
Type = "oneshot";
ExecStart =
pkgs.writeShellScript "jellyfin-rpc-configure" ''
dest=''${XDG_CONFIG_HOME:-$HOME/.config}/jellyfin-rpc/main.json
mkdir -p "$(dirname "$dest")"
umask 177
[[ -f "$dest" ]] && chmod 600 "$dest"
${lib.getExe pkgs.jq} \
< ${jellyfin-rpc-config-template} \
> "$dest" \
--rawfile api_key ${api-key-file} \
'.jellyfin.api_key = $api_key'
'';
};
};
systemd.user.services.jellyfin-rpc = {
Unit.Requires = [ "jellyfin-rpc-configure.service" ];
Unit.After = [ "jellyfin-rpc-configure.service" ];
Install.WantedBy = [ "default.target" ];
Service.ExecStart = lib.getExe pkgs.jellyfin-rpc;
};
sydnix.sops.secrets.jellyfin-rpc-api-key = {};
programs.nixcord.vesktop.package = vesktop-wrapper;
assertions = [{
assertion = config.programs.nixcord.vesktop.enable;
message = "Jellyfin RPC requires Vesktop.";
}];
};
}

View File

@@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.documentation;
in {
options.sydnix.documentation = {
enable = lib.mkEnableOption "Docs";
};
config = lib.mkIf cfg.enable {
home.extraOutputsToInstall = [
"doc"
"info"
"man"
];
};
}

View File

@@ -128,6 +128,13 @@ in {
version = cfg.package.version;
};
in {
xdg.mimeApps = {
enable = true;
defaultApplicationPackages = [
sydmacs
];
};
# Set emacsclient as the default editor for the time being.
home.sessionVariables = {

View File

@@ -0,0 +1,24 @@
{ config, lib, pkgs, osConfig, ... }:
let cfg = config.sydnix.kdeconnect;
in {
options.sydnix.kdeconnect = {
enable = lib.mkEnableOption "KDE Connect";
};
config = lib.mkIf cfg.enable {
sydnix.impermanence.directories = [
".config/kdeconnect"
];
services.kdeconnect = {
enable = true;
indicator = true;
};
warnings = lib.optional (!osConfig.sydnix.kdeconnect.openFirewall) ''
The KDE Connect ports were not opened in the NixOS config. Make
sure someone's allowing these ports!!!
'';
};
}

View File

@@ -0,0 +1,18 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.prism-launcher;
in {
options.sydnix.prism-launcher = {
enable = lib.mkEnableOption "Prism Launcher";
};
config = lib.mkIf cfg.enable {
home.packages = [
pkgs.prismlauncher
];
sydnix.impermanence.directories = [
".local/share/PrismLauncher"
];
};
}

14
modules/home/terraria.nix Normal file
View File

@@ -0,0 +1,14 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.terraria;
in {
options.sydnix.terraria = {
enable = lib.mkEnableOption "Terraria";
};
config = lib.mkIf cfg.enable {
sydnix.impermanence.directories = [
".local/share/Terraria"
];
};
}

View File

@@ -0,0 +1,33 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.toki-pona;
in {
options.sydnix.toki-pona = {
enable = lib.mkEnableOption "Toki Pona fonts, input, and spell-check";
};
config = lib.mkIf cfg.enable {
i18n.inputMethod.fcitx5.addons = [
(pkgs.fcitx5-toki-pona.overrideAttrs (final: prev: {
patches = prev.patches or [] ++ [
./toki-pona/punctuation.patch
];
}))
];
programs.ghostty.settings.font-family = lib.mkAfter [
"sitelen seli kiwen mono juniko"
];
sydnix.hunspell.dictionaries = ds: with ds; [
tok
];
home.packages = with pkgs; [
# nasin-nanpa-ucsur
nasin-nanpa
nasin-nanpa-helvetica
sitelen-seli-kiwen
];
};
}

View File

@@ -0,0 +1,22 @@
diff --git a/static_tables/toki_pona_ucsur.txt b/static_tables/toki_pona_ucsur.txt
index 1bacd3a..53f5c8e 100644
--- a/static_tables/toki_pona_ucsur.txt
+++ b/static_tables/toki_pona_ucsur.txt
@@ -1,4 +1,4 @@
-KeyCode=mnptkswljiueoa()[]{}^*.:"-_
+KeyCode=mnptkswljiueoa()[]{}^*.:"-_<>,
Length=16
Prompt=
ConstructPhrase=
@@ -13,8 +13,11 @@ _  
^ 󱦕
* 󱦖
. 󱦜
+, 。
: 󱦝 
-
+< 「
+> 」
a 󱤀
akesi 󱤁
ala 󱤂

View File

@@ -1,34 +0,0 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.crumb.bash;
in {
options.sydnix.users.crumb.bash.enable = lib.mkEnableOption "Bash, à la crumb";
config = lib.mkIf cfg.enable {
programs.bash = {
enable = true;
shellOptions = [
# Correct minor typos in cd commands.
"cdspell"
"autocd"
# Extra glob power.
"extglob"
# Recursive glob w/ **.
"globstar"
# Append to history file.
"histappend"
# Require user confirmation for commands using expansion.
"histverify"
# Re-edit failed history substitutions.
"histreedit"
];
};
home.shellAliases = {
nix2json = "nix eval --impure --json --file -";
"..." = "cd ../..";
"...." = "cd ../../..";
};
};
}

View File

@@ -71,9 +71,11 @@ the unwritable tidbits."
(setq-local register-alist
(cl-remove-if-not #'savehist-printable register-alist)))))
(with-eval-after-load 'bookmark
;; Stay out of my config dir!
(setq bookmark-default-file (file-name-concat syd-data-dir "bookmarks")))
;; Stay out of my config dir!
(setq bookmark-default-file
(file-name-concat syd-data-dir "bookmarks")
transient-history-file
(file-name-concat syd-data-dir "transient/history.el"))
(provide 'syd-autosave)

View File

@@ -26,8 +26,8 @@ in {
};
globalOptions = {
# Disable shift to toggle. I accidentally press it all the time.
# 날 미치게 만들어요.
# Disable shift to toggle. I accidentally press it all
# the time. 날 미치게 만들어요.
Hotkey.AltTriggerKeys = "";
};

View File

@@ -0,0 +1,36 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.users.msyds.bash;
in {
options.sydnix.users.msyds.bash.enable =
lib.mkEnableOption "Bash, à la msyds";
config = lib.mkIf cfg.enable {
sydnix.bash.enable = true;
sydnix.bash.complete-alias.enable = true;
programs.bash.shellOptions = [
# Correct minor typos in cd commands.
"cdspell"
# Implicitly prepend `cd` to directory names.
"autocd"
# Extra glob power.
"extglob"
# Recursive glob w/ **.
"globstar"
# Append to history file.
"histappend"
# Require user confirmation for commands using expansion.
"histverify"
# Re-edit failed history substitutions.
"histreedit"
];
home.shellAliases = {
nix2json = "nix eval --impure --json --file -";
"..." = "cd ../..";
"...." = "cd ../../..";
};
};
}

View File

@@ -1,6 +1,11 @@
{ config, lib, pkgs, ... }:
{ config, lib, pkgs, host, ... }:
let cfg = config.sydnix.users.msyds.dank-material-shell;
let
cfg = config.sydnix.users.msyds.dank-material-shell;
on = hosts:
if builtins.isString hosts
then hosts == host
else builtins.elem host hosts;
in {
options.sydnix.users.msyds.dank-material-shell = {
enable = lib.mkEnableOption "Dank Material Shell";
@@ -167,7 +172,7 @@ in {
showControlCenterButton = true;
showCapsLockIndicator = true;
controlCenterShowNetworkIcon = true;
controlCenterShowBluetoothIcon = true;
controlCenterShowBluetoothIcon = on ["fruitbook"];
controlCenterShowAudioIcon = true;
controlCenterShowVpnIcon = true;
controlCenterShowBrightnessIcon = false;
@@ -286,9 +291,9 @@ in {
batterySuspendTimeout = 0;
batterySuspendBehavior = 0;
batteryProfileName = "";
lockBeforeSuspend = false;
lockBeforeSuspend = true;
loginctlLockIntegration = true;
fadeToLockEnabled = false;
fadeToLockEnabled = true;
fadeToLockGracePeriod = 5;
launchPrefix = "";
brightnessDevicePins = {};

View File

@@ -1,15 +1,16 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.users.crumb.discord;
let cfg = config.sydnix.users.msyds.discord;
in {
options.sydnix.users.crumb.discord = {
options.sydnix.users.msyds.discord = {
enable = lib.mkEnableOption "Discord";
};
config = lib.mkIf cfg.enable {
sydnix.discord.enable = true;
sydnix.discord.jellyfin-rpc.enable = true;
stylix.targets.nixcord.enable = true;
stylix.targets.nixcord.enable = false;
programs.nixcord = {
quickCss = ''
@@ -29,6 +30,11 @@ in {
];
plugins = {
ircColors.enable = true;
voiceMessages = {
enable = true;
echoCancellation = false;
noiseSuppression = false;
};
};
};
vesktop = {

View File

@@ -31,6 +31,17 @@ in {
treesit.enable = true;
};
home.sessionVariables = {
ESHELL_ALIASES_FILE = pkgs.writeText "eshell-aliases" ''
alias cdp syd-project-cd
alias jj jj --no-pager $*
${lib.concatMapAttrsStringSep
"\n"
(alias: value: "alias ${alias} ${value} $*")
config.home.shellAliases}
'';
};
sydnix.emacs = {
enable = true;
defaultEditor = true;

View File

@@ -0,0 +1,11 @@
;;;; Emacs Bookmark Format Version 1;;;; -*- coding: utf-8-emacs; mode: lisp-data -*-
;;; This format is meant to be slightly human-readable;
;;; nevertheless, you probably don't want to edit it.
;;; -*- End Of Bookmark File Format Version Stamp -*-
(("org-capture-last-stored"
(filename . "~/org/daily/2026-03-26.org")
(front-context-string . "* The significan")
(rear-context-string . "le: 2026-03-26\n\n")
(position . 89)
(last-modified 27077 32462 617656 528000))
)

View File

@@ -3,6 +3,7 @@
(syd-require-features
'(syd/base
syd/constants
syd/fcitx
syd/dash
syd/disable-package
syd/straight
@@ -49,6 +50,7 @@
syd/direnv
syd/ligature
syd/clojure
syd/auctex
syd/lisp
syd/minibuffer
syd/auto-save
@@ -62,4 +64,7 @@
syd/agda
syd/eshell
syd/treesit
syd/grammatical-framework))
syd/grammatical-framework
syd/tabs
syd/lsp
syd/custom))

View File

@@ -0,0 +1,11 @@
;;; -*- lexical-binding: t; -*-
(require 'syd/base)
(use-package auctex
:config
(add-to-list 'TeX-view-program-selection '(output-pdf "Sioyek")))
(use-package auctex-latexmk)
(provide 'syd/auctex)

View File

@@ -1,6 +1,7 @@
;;; -*- lexical-binding: t; -*-
(require 'syd/base)
(require 'syd/handle)
(require 'syd/popups)
(require 'syd/leader)
@@ -26,58 +27,62 @@
cider-doc-buffer)
(defun syd-clojure-eval-region (beg end)
(cider-eval-region beg end))
(syd-handle '(clojure-mode clojurescript-mode cider-repl-mode)
(syd-handle '(clojure-mode clojurescript-mode cider-repl-mode
cider-clojure-interaction-mode)
:docs #'cider-doc
:eval-region #'syd-clojure-eval-region
:load-buffer #'cider-load-buffer)
(add-hook 'cider-repl-mode-hook #'syd-lisp-mode)
(syd-push shackle-rules
`("*cider-doc*" ,@syd-help-popup-options)
'("*cider-test-report*")
'("*cider-error*")))
`("*cider-doc*" ,@syd-help-popup-options)
'("*cider-test-report*")
'("*cider-error*")))
(use-package cider-mode
:straight nil ; Part of `cider'.
:straight nil ; Part of `cider'.
:hook (clojure-mode-local-vars . cider-mode)
:custom ((cider-show-error-buffer nil)
;; Download Java source archives for local Javadoc and jump-to-def
;; functionality.
(cider-download-java-sources t))
;; Download Java source archives for local Javadoc and jump-to-def
;; functionality.
(cider-download-java-sources t))
:general
;; DEPRECATED: Remove once a `map!' equivalent is implemented.
(:keymaps 'cider-repl-mode-map
:states '(normal insert)
"C-k" #'cider-repl-backward-input
"C-j" #'cider-repl-forward-input
"C-s" #'consult-history)
;; DEPRECATED: Remove once a `map!' equivalent is implemented.
:states '(normal insert)
"C-k" #'cider-repl-backward-input
"C-j" #'cider-repl-forward-input
"C-s" #'consult-history)
(:keymaps '(cider-repl-mode-map clojure-mode-map)
:states '(normal visual motion emacs insert)
:major-modes t
:prefix syd-localleader-key
:non-normal-prefix syd-alt-localleader-key
"\"" #'cider-jack-in-cljs
"'" #'cider-jack-in-clj
"c" #'cider-connect-clj
"C" #'cider-connect-cljs
"r l" #'cider-load-buffer
"r n" #'cider-repl-set-ns
"r r" #'cider-ns-refresh
"r R" #'cider-restart
"r q" #'cider-quit
"d d" #'cider-debug-defun-at-point
"M-:" #'cider-read-and-eval
"h d" #'cider-doc
"h c" #'cider-cheatsheet
"h j" #'cider-javadoc
"h n" #'cider-browse-ns
"T n" #'cider-test-run-ns-tests
"T r" #'cider-test-rerun-failed-tests
"T R" #'cider-test-rerun-test
"x" #'cider-scratch)
:states '(normal visual motion emacs insert)
:major-modes t
:prefix syd-localleader-key
:non-normal-prefix syd-alt-localleader-key
"\"" #'cider-jack-in-cljs
"'" #'cider-jack-in-clj
"c" #'cider-connect-clj
"C" #'cider-connect-cljs
"r l" #'cider-load-buffer
"r n" #'cider-repl-set-ns
"r r" #'cider-ns-refresh
"r R" #'cider-restart
"r q" #'cider-quit
"d d" #'cider-debug-defun-at-point
"M-:" #'cider-read-and-eval
"h d" #'cider-doc
"h c" #'cider-cheatsheet
"h j" #'cider-javadoc
"h n" #'cider-browse-ns
"T n" #'cider-test-run-ns-tests
"T r" #'cider-test-rerun-failed-tests
"T R" #'cider-test-rerun-test
"x" #'cider-scratch
"i" #'cider-inspect-last-result)
(:keymaps 'cider-repl-mode-map
:states 'insert
"S-<return>" #'cider-repl-newline-and-indent)
:states 'insert
"S-<return>" #'cider-repl-newline-and-indent)
(:keymaps 'cider-inspector-mode-map
:states '(motion insert)
"C-o" #'cider-inspector-pop
"C-i" #'cider-inspector-push)
:config
(add-hook 'cider-mode-hook #'eldoc-mode)
(with-eval-after-load 'consult
@@ -90,19 +95,28 @@
(syd-add-hook 'cider-repl-preoutput-hook
(defun syd-clojure--render-graphviz-h (s)
(if (string-match (rx bol "!!!graph:"
(group (* anychar) ".svg"))
s)
(let ((beg (match-beginning 0))
(end (match-end 0))
(file (match-string 1 s)))
(message "%d %d %s" beg end file)
(add-display-text-property
beg end
'display
`(image :type svg
:file ,file)
s)
s)
s))))
(group (* anychar) ".svg"))
s)
(let ((beg (match-beginning 0))
(end (match-end 0))
(file (match-string 1 s)))
(message "%d %d %s" beg end file)
(add-display-text-property
beg end
'display
`(image :type svg
:file ,file)
s)
s)
s))))
(defun syd-clojure--setup-clj-refactor ()
(clj-refactor-mode 1)
(yas-minor-mode 1)
(cljr-add-keybindings-with-prefix "C-c r"))
(use-package clj-refactor
:config
(add-hook 'clojure-mode-hook #'syd-clojure--setup-clj-refactor))
(provide 'syd/clojure)

View File

@@ -1,4 +1,7 @@
;;; -*- lexical-binding: t -*-
;; -*- lexical-binding: t -*-
(require 'syd/base)
(require 'syd/popups)
(setq
;; Log native-compiler warnings, but don't display the buffer. Most of the
@@ -8,4 +11,7 @@
;; Scroll compilation buffer to follow output.
compilation-scroll-output t)
(syd-push shackle-rules
'("*compilation*" :select nil :size 0.42 :popup t :align bottom))
(provide 'syd/compilation)

View File

@@ -0,0 +1,8 @@
;;; -*- lexical-binding: t -*-
(require 'syd/base)
;; Stay out of version-control!!!!!
(setq custom-file (file-name-concat syd-data-dir "custom.el"))
(provide 'syd/custom)

View File

@@ -127,7 +127,6 @@ if FILE-NAME has no TRAMP prefix."
(cons nil file-name)))
(use-package eshell
:ensure nil
:defer t
:init
(defvar syd-eshell-data-dir
@@ -151,7 +150,9 @@ if FILE-NAME has no TRAMP prefix."
(eshell-last-dir-ring-file-name (file-name-concat
syd-eshell-data-dir "lastdir"))
(eshell-prompt-function #'syd-eshell--prompt-fn)
(eshell-prompt-regexp syd-eshell--prompt-regexp))
(eshell-prompt-regexp syd-eshell--prompt-regexp)
(eshell-aliases-file (or (getenv "ESHELL_ALIASES_FILE")
eshell-aliases-file)))
:general
(:keymaps 'syd-leader-open-map
"e" #'syd-toggle-eshell)

View File

@@ -0,0 +1,10 @@
;;; -*- lexical-binding: t; -*-
(require 'syd/base)
(use-package fcitx
:custom ((fcitx-remote-command "fcitx5-remote"))
:config
(fcitx-aggressive-setup))
(provide 'syd/fcitx)

View File

@@ -12,15 +12,21 @@
(font-spec :family "JuliaMono" :size 16)
"A monospace font secondary to `syd-fixed-pitch-font'.")
(defvar syd-sitelen-pona-font
(font-spec :family "sitelen seli kiwen mono juniko"))
(defun syd-init-fonts-h ()
"Loads `syd-fixed-pitch-font' and `syd-variable-pitch-font'."
(dolist (map `((default . ,syd-fixed-pitch-font)
(fixed-pitch . ,syd-fixed-pitch-font)
(variable-pitch . ,syd-variable-pitch-font)))
(fixed-pitch . ,syd-fixed-pitch-font)
(variable-pitch . ,syd-variable-pitch-font)))
(pcase-let ((`(,face . ,font) map))
(set-face-attribute face nil
:width 'normal :weight 'normal
:slant 'normal :font font))))
:width 'normal :weight 'normal
:slant 'normal :font font)))
(set-fontset-font
t '(#xF1900 . #xF19FF)
syd-sitelen-pona-font))
(let ((hook-point (if (daemonp)
'server-after-make-frame-hook

View File

@@ -5,22 +5,28 @@
(use-package ligature
:config
(ligature-set-ligatures 'prog-mode
'("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||="
"||>" ":::" "::=" "=:=" "===" "==>" "=!=" "=>>"
"=<<" "=/=" "!==" "!!." ">=>" ">>=" ">>>" ">>-"
">->" "->>" "-->" "---" "-<<" "<~~" "<~>" "<*>"
"<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" "<--"
"<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_("
"..<" "..." "+++" "/==" "///" "_|_" "www" "&&" "^="
"~~" "~@" "~=" "~>" "~-" "**" "*>" "*/" "||" "|}"
"|]" "|=" "|>" "|-" "{|" "[|" "]#" "::" ":=" ":>"
":<" "$>" "==" "=>" "!=" "!!" ">:" ">=" ">>" ">-"
"-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" "<$"
"<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#="
"#!" "##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?"
"+>" "++" "?:" "?=" "?." "??" ";;" ";;;"
"/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
"\\\\" "://"))
'("|||>" "<|||" "<==>" "<!--" "####" "~~>" "***" "||="
"||>" ":::" "::=" "=:=" "===" "==>" "=!=" "=>>"
"=<<" "=/=" "!==" "!!." ">=>" ">>=" ">>>" ">>-"
">->" "->>" "-->" "---" "-<<" "<~~" "<~>" "<*>"
"<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" "<--"
"<-<" "<<=" "<<-" "<<<" "<+>" "</>" "###" "#_("
"..<" "..." "+++" "/==" "///" "_|_" "www" "&&" "^="
"~~" "~@" "~=" "~>" "~-" "**" "*>" "*/" "||" "|}"
"|]" "|=" "|>" "|-" "{|" "[|" "]#" "::" ":=" ":>"
":<" "$>" "==" "=>" "!=" "!!" ">:" ">=" ">>" ">-"
"-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" "<$"
"<=" "<>" "<-" "<<" "<+" "</" "#{" "#[" "#:" "#="
"#!" "##" "#(" "#?" "#_" "%%" ".=" ".-" ".." ".?"
"+>" "++" "?:" "?=" "?." "??" ";;" ";;;"
"/*" "/=" "/>" "//" "__" "~~" "(*" "*)"
"\\\\" "://"))
;; Sitelen pona glyphs.
(rx-let ((ideograph (any (#xF1900 . #xF198C))))
(ligature-set-ligatures
'fundamental-mode
`(("󱦐" ,(rx (* ideograph)))
("󱥍" ,(rx "󱦗" (* ideograph))))))
(global-ligature-mode 1))
(provide 'syd/ligature)

View File

@@ -0,0 +1,9 @@
;; -*- lexical-binding: t; -*-
(require 'syd/base)
(use-package markdown-mode
:config
(add-hook 'markdown-mode-hook #'syd-prose-mode))
(provide 'syd/markdown)

View File

@@ -77,7 +77,11 @@
:target (file ,default-target-file-name))
("K" "Today's Korean" plain
(file ,(syd-emacs-file "lisp/syd/org/roam/todays-korean.org"))
:target (file "todays-korean/%<%Y-%m-%d>.org"))))))
:target (file "todays-korean/%<%Y-%m-%d>.org"))
("I" "Korean irregularity class" plain
(file ,(syd-emacs-file "lisp/syd/org/roam/irregularity-class.org"))
:target (file ,default-target-file-name)))))
(org-roam-link-auto-replace nil))
:config
(add-to-list 'org-agenda-files org-roam-directory)
(with-eval-after-load 'org-roam-dailies

View File

@@ -0,0 +1,12 @@
:PROPERTIES:
:ROAM_ALIASES: "%^{Irregular ending: } 불규칙"
:END:
#+title: %\1-irregularity
In [[id:e4ae4140-b842-4f16-b4da-9306eb3c2c1a][Korean morphology]], a *%\1-irregular verb* (ko: *%\1 불규칙 동사*) is a type of [[id:764f5ddf-472a-4142-9f76-cfb19f462be4][irregular verb]] whose stem ends in %\1.
* Inflection
* Examples
** Non-examples

View File

@@ -0,0 +1,7 @@
;;; -*- lexical-binding: t -*-
(require 'syd/base)
;; Disable tabs by default.
(setq-default indent-tabs-mode nil)
(provide 'syd/tabs)

View File

@@ -0,0 +1 @@
nil

View File

@@ -0,0 +1,20 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.users.msyds.sioyek;
in {
options.sydnix.users.msyds.sioyek = {
enable = lib.mkEnableOption "Sioyek";
};
config = lib.mkIf cfg.enable {
programs.sioyek = {
enable = true;
bindings = {
"move_down" = "j";
"move_up" = "k";
"screen_down" = [ "d" "<C-d>" ];
"screen_up" = [ "u" "<C-u>" ];
};
};
};
}

12
modules/nixos/blueman.nix Normal file
View File

@@ -0,0 +1,12 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.blueman;
in {
options.sydnix.blueman = {
enable = lib.mkEnableOption "Blueman BlueTooth manager";
};
config = lib.mkIf cfg.enable {
services.blueman.enable = true;
};
}

View File

@@ -7,8 +7,6 @@ in {
};
config = lib.mkIf cfg.enable {
services.blueman.enable = true;
hardware.bluetooth = {
enable = true;
powerOnBoot = true;

View File

@@ -65,9 +65,22 @@ in {
server = {
address = "tcp://:${builtins.toString cfg.httpPort}";
# asset_path = "${authelia-state-dir}/assets";
# Necessary for Nginx integration. No, I do not understand what it
# does.
endpoints.authz.auth-request.implementation = "AuthRequest";
endpoints.authz = {
# Necessary for Nginx integration. No, I do not understand what it
# does.
auth-request = {
implementation = "AuthRequest";
authn_strategies = [
{
name = "HeaderAuthorization";
schemes = [ "Basic" ];
}
{
name = "CookieSession";
}
];
};
};
};
authentication_backend =
let base-dn = config.services.lldap.settings.ldap_base_dn;

View File

@@ -1,12 +1,10 @@
{ config, lib, pkgs, ... }:
with lib;
let cfg = config.sydnix.deertopia.bepasty;
in {
options = {
sydnix.deertopia.bepasty = {
enable = mkEnableOption "Bepasty";
enable = lib.mkEnableOption "Bepasty";
port = lib.mkOption {
default = 22018;
@@ -19,7 +17,7 @@ in {
};
};
config = mkIf cfg.enable {
config = lib.mkIf cfg.enable {
sydnix.sops.secrets.bepasty-secret-key = {};
sydnix.sops.secrets.bepasty-secret-config = {};

View File

@@ -13,8 +13,17 @@ in {
};
};
imports = [
./copyparty/vault.nix
./copyparty/webdav.nix
];
config = lib.mkIf cfg.enable {
sydnix.deertopia.copyparty.vault.enable = true;
sydnix.deertopia.copyparty.webdav.enable = true;
sydnix.impermanence.directories = [
"/var/lib/copyparty"
];
nixpkgs.overlays = [ inputs.copyparty.overlays.default ];
@@ -24,8 +33,8 @@ in {
"media"
];
# HACK: Make files created by copyparty.service initialise with the mode
# 775.
# HACK: Make files created by copyparty.service initialise with
# the mode 775.
systemd.services.copyparty.serviceConfig.UMask = lib.mkForce "002";
services.copyparty = {
@@ -51,7 +60,7 @@ in {
"/Media library" = {
path = "/media/library";
# View and upload, but no deleting.
access.rw = "*";
access.r = "*";
access.rwmd = "@jellyfin-admin";
};
"/Torrents" = {

View File

@@ -0,0 +1,52 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.deertopia.copyparty.vault;
in {
options.sydnix.deertopia.copyparty.vault = {
enable = lib.mkEnableOption "personal storage under Copyparty";
};
config = lib.mkIf cfg.enable {
sydnix.impermanence.directories = [ "/vault" ];
# HACK: Ad-hoc permissions, as typical.
users.groups.vault = {};
users.users.copyparty.extraGroups = [ "vault" ];
systemd.tmpfiles.settings."50-vault" =
let e = {
z.group = "vault";
z.mode = "2775";
v.group = "vault";
v.mode = "2775";
};
in {
"/vault" = e;
"/vault/~msyds" = e;
};
services.copyparty.volumes = {
"/~msyds" = {
path = "/vault/~msyds";
access.A = [ "msyds" ];
};
"/~msyds/zotero" = {
path = "/vault/~msyds/zotero";
flags.daw = true;
access.A = [ "msyds" ];
access.rwmd = [ "zotero" ];
};
"/msyds/zotero-root" = {
path = "/vault/msyds/zotero-root";
flags.daw = true;
access.A = [ "msyds" ];
access.rwmd = [ "zotero" ];
};
"/~msyds/public" = {
path = "/vault/~msyds/public";
access.A = [ "msyds" ];
access.r = [ "*" ];
};
};
};
}

View File

@@ -0,0 +1,57 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.deertopia.copyparty.webdav;
in {
options.sydnix.deertopia.copyparty.webdav = {
enable = lib.mkEnableOption "WebDAV via copyparty";
port = lib.mkOption {
type = lib.types.port;
description = ''
Port on which Copyparty shall listen for WebDAV traffic.
'';
default = 3924;
};
};
# https://github.com/9001/copyparty/issues/1142
config = lib.mkIf cfg.enable {
services.copyparty.settings = {
rproxy = -1;
xff-src = "lan";
daw = true;
dav-auth = true;
ihead = "*";
ohead = "*";
dav-port = cfg.port;
};
services.authelia.instances.deertopia.settings =
lib.mkIf config.sydnix.deertopia.authelia.enable {
access_control.rules = lib.mkBefore [
{
domain = "dav.deertopia.net";
policy = "bypass";
methods = [ "OPTIONS" "PROPFIND" ];
}
];
};
sydnix.deertopia.nginx.vhosts."dav" = {
directory = null;
vhost = {
forceSSL = true;
enableACME = true;
extraConfig = ''
include ${../authelia/authelia-location.conf};
# Increase limit of upload sizes.
client_max_body_size 20G;
'';
locations."/".extraConfig = ''
include ${../authelia/authelia-authrequest.conf};
include ${../authelia/proxy.conf};
proxy_pass http://localhost:${builtins.toString cfg.port};
'';
};
};
};
}

View File

@@ -0,0 +1,110 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.deertopia.gitea;
commas = lib.concatStringsSep ",";
in {
options.sydnix.deertopia.gitea = {
enable = lib.mkEnableOption "Gitea";
};
config = lib.mkIf cfg.enable {
sydnix.impermanence.directories = [
{
directory = config.services.gitea.stateDir;
inherit (config.services.gitea) user group;
}
];
sydnix.deertopia.nginx.vhosts."git" = {
directory = null;
vhost = {
forceSSL = true;
enableACME = true;
locations."/".extraConfig =
let port = builtins.toString config.services.gitea
.settings.server.HTTP_PORT;
in ''
proxy_pass http://127.0.0.1:${port}/;
'';
};
};
users.users.git = {
description = "Gitea Service";
home = config.services.gitea.stateDir;
useDefaultShell = true;
group = config.services.gitea.group;
isSystemUser = true;
};
users.groups.git = { };
# sudo -u git gitea admin auth add-ldap --name gitea --port 3890 --bind-dn 'uid=gitea,ou=people,dc=deertopia,dc=net' --bind-password «password» --user-search-base 'ou=people,dc=deertopia,dc=net' --user-filter '(&(memberof=cn=git,ou=groups,dc=deertopia,dc=net)(|(uid=%[1]s)(mail=%[1]s)))' --username-attribute uid --firstname-attribute givenName --surname-attribute sn --email-attribute mail --avatar-attribute jpegPhoto --security-protocol unencrypted --host 127.0.0.1 --config /var/lib/gitea/custom/conf/app.ini --synchronize-users
sydnix.sops.secrets.gitea-mailer-password = {
mode = "0440";
owner = "git";
group = "git";
};
services.gitea = {
enable = true;
user = "git";
group = "git";
appName = "GupHub"; # Name per my dear Astrid ♥!!!!!
mailerPasswordFile = config.sops.secrets.gitea-mailer-password.path;
settings = {
server = {
ROOT_URL = "https://git.deertopia.net/";
HTTP_PORT = 3000;
DOMAIN = "deertopia.net";
};
service = {
DISABLE_REGISTRATION = true;
ENABLE_NOTIFY_MAIL = true;
};
"repository.pull-request" = {
CLOSE_KEYWORDS = commas [
# en
"close" "closes" "closed" "fix" "fixes" "fixed" "resolve"
"resolves" "resolved"
# tok
"pini e"
# ko
"" "" ""
"" "" "" "" ""
"" "" "" "" ""
];
REOPEN_KEYWORDS = commas [
# en
"reopen" "reopens" "reopened"
# tok
"open sin e" "pakala sin e"
"li pakala sin" "li pakalan sin"
# ko
"" "" " " " " " "
" "
];
WORK_IN_PROGRESS_PREFIXES = commas [
# en
"WIP:" "[WIP]"
# tok
"pini ala:" "awen pali:"
# ko
" :" ":" ":" "[]" ":" "[]"
];
DEFAULT_MERGE_STYLE = "rebase";
};
mailer = {
ENABLED = true;
FROM = "Gitea <no-reply@deertopia.net>";
PROTOCOL = "smtps";
SMTP_ADDR = "smtp.fastmail.com";
SMTP_PORT = 465;
USER = "msyds@deertopia.net";
};
};
};
};
}

View File

@@ -62,6 +62,7 @@ in {
ldap_base_dn = cfg.baseDN;
ldap_user_dn = "lain";
ldap_user_email = "lain@deertopia.net";
force_ldap_user_pass_reset = "always";
ldaps_options = {
enabled = true;
port = 6360;

View File

@@ -0,0 +1,45 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.deertopia.vaultwarden;
in {
options.sydnix.deertopia.vaultwarden = {
enable = lib.mkEnableOption "Vaultwarden";
};
config = lib.mkIf cfg.enable {
services.vaultwarden = {
enable = true;
config = {
ROCKET_ADDRESS = "127.0.0.1";
ROCKET_PORT = 8222;
DOMAIN = "https://vault.deertopia.net";
};
};
sydnix.impermanence.directories = [
"/var/backup/vaultwarden"
];
services.nginx.upstreams.vaultwarden.servers =
let port = toString config.services.vaultwarden.config.ROCKET_PORT;
in {
"127.0.0.1:${port}" = { };
};
sydnix.deertopia.nginx.vhosts."vault".vhost = {
forceSSL = true;
enableACME = true;
locations = {
"/".proxyPass = "http://vaultwarden";
"= /notifications/anonymous-hub" = {
proxyPass = "http://vaultwarden";
proxyWebsockets = true;
};
"= /notifications/hub" = {
proxyPass = "http://vaultwarden";
proxyWebsockets = true;
};
};
};
};
}

View File

@@ -29,6 +29,8 @@ in {
};
};
imports = [ ./copyparty/vault.nix ];
config = mkIf cfg.enable {
users.users.${cfg.user} = {
isSystemUser = true;

View File

@@ -34,6 +34,7 @@ in {
extraConfig = ''
location /~msyds/ {
index index.html;
alias /vault/~msyds/public/;
}
location /~liv/ {
index index.html;

16
modules/nixos/gc.nix Normal file
View File

@@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.gc;
in {
options.sydnix.gc = {
enable = lib.mkEnableOption "the automatic Nix garbage collector";
};
config = lib.mkIf cfg.enable {
nix.gc = {
automatic = true;
randomizedDelaySec = "14m";
options = "--delete-older-than 30d";
};
};
}

View File

@@ -0,0 +1,149 @@
# Stolen from https://git.neet.dev/zuckerberg/nix-config/src/branch/master/common/server/gitea-actions-runner.nix
{ config, lib, pkgs, ... }:
let
cfg = config.sydnix.gitea-actions-runner;
token-file = config.sops.secrets.gitea-actions-runner-token.path;
in {
options.sydnix.gitea-actions-runner = {
enable = lib.mkEnableOption "Gitea actions runner";
instance-name = lib.mkOption {
type = lib.types.str;
default = config.networking.hostName;
description = ''
The name of the runner instance name.
'';
};
user.name = lib.mkOption {
type = lib.types.str;
default = "gitea-actions-runner";
description = ''
The name of the user gitea-actions-runner should run under.
'';
};
user.uid = lib.mkOption {
type = lib.types.int;
default = 991;
description = ''
The UID of the user gitea-actions-runner should run under.
This must be known at evaluation time so that the same UID can
be used both on the host and in the container, allowing the
container to access the host's nix-daemon.
'';
};
group.name = lib.mkOption {
type = lib.types.str;
default = "gitea-actions-runner";
description = ''
The name of the group gitea-actions-runner should run under.
'';
};
group.gid = lib.mkOption {
type = lib.types.int;
default = 989;
description = ''
The GID of the group gitea-actions-runner should run under.
This must be known at evaluation time so that the same GID can
be used both on the host and in the container, allowing the
container to access the host's nix-daemon.
'';
};
};
config = lib.mkIf cfg.enable {
sydnix.sops.secrets.gitea-actions-runner-token = {};
sydnix.impermanence.directories = [ "/var/lib/gitea-actions-runner" ];
containers."gitea-actions-runner" = {
autoStart = true;
ephemeral = true;
bindMounts = {
${token-file} = {
hostPath = token-file;
isReadOnly = true;
};
"/var/lib/gitea-actions-runner" = {
hostPath = "/var/lib/gitea-actions-runner";
isReadOnly = false;
};
};
config = { config, lib, pkgs, ... }: {
system.stateVersion = "25.11";
services.gitea-actions-runner.instances.${cfg.instance-name} = {
enable = true;
name = cfg.instance-name;
url = "https://git.deertopia.net/";
tokenFile = token-file;
labels = [ "nixos:host" ];
hostPackages = with pkgs; [
bash
coreutils
curl
gawk
gitMinimal
gnused
nodejs
wget
nix
];
};
# Disable dynamic user so runner state persists via bind mount
assertions = [{
assertion =
config.systemd.services.gitea-actions-runner-sydpc.enable;
message = ''
Expected systemd service 'gitea-actions-runner-sydpc' is
not enabled the gitea-actions-runner NixOS module may
have changed its naming scheme.
'';
}];
systemd.services.gitea-actions-runner-sydpc.serviceConfig.DynamicUser
= lib.mkForce false;
users.users.${cfg.user.name} = {
uid = cfg.user.uid;
home = "/var/lib/gitea-actions-runner";
group = cfg.group.name;
isSystemUser = true;
createHome = true;
};
users.groups.gitea-actions-runner.gid = cfg.group.gid;
nix.settings.experimental-features = [ "nix-command" "flakes" ];
environment.systemPackages = with pkgs; [
git
nodejs
jq
attic-client
omnix
];
};
};
# Needs to be outside of the container because container uses's
# the host's nix-daemon
nix.settings.trusted-users = [
cfg.user.name
];
# Matching user on host — the container's gitea-actions-runner UID
# must be recognized by the host's nix-daemon as trusted (shared
# UID namespace)
users.users.${cfg.user.name} = {
uid = cfg.user.uid;
home = "/var/lib/gitea-actions-runner";
group = cfg.group.name;
isSystemUser = true;
createHome = true;
};
users.groups.${cfg.group.name}.gid = cfg.group.gid;
};
}

View File

@@ -29,7 +29,7 @@ in {
mkdir -p /btrfs-tmp
mount -t btrfs "${cfg.device}" /btrfs-tmp
# If the moribound subvolume exists, send it do 'death row' (old-roots),
# If the moribund subvolume exists, send it do 'death row' (old-roots),
# where live for about three days before its eventual deletion.
if [[ -e "/btrfs-tmp/${cfg.subvolume}" ]]; then
mkdir -p /btrfs-tmp/old-roots

View File

@@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.kdeconnect;
in {
options.sydnix.kdeconnect = {
enable = lib.mkEnableOption "KDE Connect";
openFirewall = lib.mkOption {
description = ''Open required ports for KDE Connect'';
type = lib.types.bool;
default = true;
};
};
config = lib.mkIf cfg.enable
(let
port-range = lib.optional cfg.openFirewall { from = 1714; to = 1764; };
in {
networking.firewall.allowedTCPPortRanges = port-range;
networking.firewall.allowedUDPPortRanges = port-range;
});
}

12
modules/nixos/upower.nix Normal file
View File

@@ -0,0 +1,12 @@
{ config, lib, pkgs, ... }:
let cfg = config.sydnix.upower;
in {
options.sydnix.upower = {
enable = lib.mkEnableOption "UPower";
};
config = lib.mkIf cfg.enable {
services.upower.enable = true;
};
}

View File

@@ -59,6 +59,7 @@ let
pkgs = nixpkgs;
};
inherit inputs system;
host = hostName;
};
})
];

View File

@@ -29,6 +29,8 @@ webdav-htpasswd: ENC[AES256_GCM,data:vHm47SS3ksHeoU5U1pSQxffb3pGpVxIc9ZtMUNw0igg
anki-username: ENC[AES256_GCM,data:584uxjwyodM=,iv:/6HLSLzHgc77U1iN5JDLR9F+o8Nfe+cYGE+F8sQCW7g=,tag:yHVdfhRN6OpHDwpk4Ju6zA==,type:str]
anki-password: ENC[AES256_GCM,data:plSKMTeeilKt6weAnzw/jMo65A==,iv:lzuPUt1+2Iwi9sHbaFj0OuBLd1p+Do2N5aCYXd45MFQ=,tag:WIABFp1T6NuIGpqqQFHmrg==,type:str]
anki-sync-key: ENC[AES256_GCM,data:Ka4sPghPwmWQvdXw40ZRLogoMVTBjLnaSyHT9lTfn2XWHHqFAkANAg==,iv:bFkb/k7UUL8t26LjmQwiDYJpvq93NWuqUU/jNYkr7GQ=,tag:Mx5JdqjI3MDk7hsvOlPYIw==,type:str]
gitea-actions-runner-token: ENC[AES256_GCM,data:JglbJ2hgXl1wV2bCkcged+D3UrpWMMBuX+ri6YeIqwLIlscvK/wVCdsxQZtDGw==,iv:BYhgfoIa/wHQkd4c7kU8AWAJQfpTfUvSamFXDBqQXTE=,tag:sIK1XxVPIU+uBGaJY3AmTQ==,type:str]
gitea-mailer-password: ENC[AES256_GCM,data:bgFAhAzYcDhHi4Brg7x8CQ==,iv:hj8+YbcE+Jfhtu8g//Y8EiNw1CejTtMgstB/knbgOls=,tag:CYX3Pr4ErzvHGVfhpvfruw==,type:str]
sops:
age:
- recipient: age10fqh0td67alzpyjyhdex5ncj9thvaty506r0t63vs2nz4ldafgaqadl8mg
@@ -49,7 +51,7 @@ sops:
TXFLY2l0UHJ3Z0NGZjVpbTQ2UC8yaTQKA7wTmW9Ha6T2KmCr/nkXdizgv8+V6SAp
ZhDO+uDQ1evIh2wLWMOXNJ3d/zplLCOTzR2xkqBIUp5V7MXj45RUIA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-11-23T15:12:17Z"
mac: ENC[AES256_GCM,data:vlp56uZgxZwiA6Qri55egCNfCwsRJDlo3Vu2PfgLy5VHrI2rA5lZOiW59qKqceoGmRPZQ1XZdIuYk8DjW29G22R4x1KTgPZuJ26jK6UP2SLE1cw7Bf18pd064kE5PsjKhxKOUEuA37Ep+NsMuOtT3hmkwIIz0u4KiiQkuvmxW4U=,iv:w41pRF10xrEpt7fGyyZ9bEvA4OXL/rAaOH9rk24jm7Q=,tag:tK2VurAAwNnNXE/mgbLNyA==,type:str]
lastmodified: "2026-03-22T07:49:51Z"
mac: ENC[AES256_GCM,data:Y/7XSZtPlVPDV3eToYQ9MoAGF9nGq0sd0KU1VaR5duK1xbETULioQcpPvVk6HL1kPlUjnmR8RXfCKBC7EJ9P/UAMV2ySulLtD6daogCzF3qa2JSyXPuOyMuXMSjwCNcCyHgpaOrWz+7Zf9FU/1wQwVHeCDTf0sFHaX0xttFfHkg=,iv:7+zXPjeslh+z9hWhYXoUphpbg3Tpe4OHQEcUmetuiMM=,tag:LB0GuN+5TJxXyuvrrqOi7g==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0
version: 3.12.1

View File

@@ -18,56 +18,68 @@
];
};
homeConfiguration = { config, lib, pkgs, ... }: {
home.file.".ssh/id_ed25519".source =
config.lib.file.mkOutOfStoreSymlink
"/persist/private-keys/ssh/msyds@sydpc";
homeConfiguration = { config, lib, pkgs, host, ... }:
let on = hosts:
if builtins.isString hosts
then hosts == host
else builtins.elem host hosts;
in {
home.file.".ssh/id_ed25519".source =
config.lib.file.mkOutOfStoreSymlink
"/persist/private-keys/ssh/msyds@sydpc";
home.file.".face".source = ./avatar.jpg;
home.file.".face".source = ./avatar.jpg;
home.file.".ssh/id_ed25519.pub".source =
../../public-keys/ssh/${"msyds@sydpc.pub"};
home.file.".ssh/id_ed25519.pub".source =
../../public-keys/ssh/${"msyds@sydpc.pub"};
sydnix = {
xdg.enable = true;
steam.enable = true;
zotero.enable = true;
openutau.enable = true;
slippi.enable = true;
desktop-environment.enable = true;
clojure.enable = true;
capitaine-cursors.enable = true;
sops = {
enable = true;
keyFile = "/persist/private-keys/age/crumb";
};
# Personal configurations.
users.crumb = {
bash.enable = true;
direnv.enable = true;
git.enable = true;
nvim.enable = true;
readline.enable = true;
niri.enable = true;
firefox.enable = true;
ghostty.enable = true;
# waybar.enable = true;
tf2.enable = true;
fcitx5.enable = true;
anki.enable = true;
mumble.enable = true;
};
users.msyds = {
hunspell.enable = true;
emacs.enable = true;
impermanence.enable = true;
syncthing.enable = true;
fonts.enable = true;
dank-material-shell.enable = true;
sydnix = {
documentation.enable = true;
xdg.enable = true;
steam.enable = on "sydpc";
zotero.enable = true;
slippi.enable = on "sydpc";
desktop-environment.enable = true;
clojure.enable = true;
capitaine-cursors.enable = true;
terraria.enable = on "sydpc";
kdeconnect.enable = true;
qalculate.enable = true;
toki-pona.enable = true;
prism-launcher.enable = true;
sops = {
enable = true;
keyFile = "/persist/private-keys/age/crumb";
};
# Personal configurations.
users.crumb = {
direnv.enable = true;
git.enable = true;
nvim.enable = true;
readline.enable = true;
niri.enable = true;
firefox.enable = true;
ghostty.enable = true;
# waybar.enable = true;
tf2.enable = true;
fcitx5.enable = true;
anki.enable = true;
mumble.enable = true;
};
users.msyds = {
discord.enable = true;
bash.enable = true;
hunspell.enable = true;
emacs.enable = true;
impermanence.enable = true;
syncthing.enable = true;
fonts.enable = true;
dank-material-shell.enable = true;
sioyek.enable = true;
};
};
# Don't touch!
home.stateVersion = "18.09";
};
# Don't touch!
home.stateVersion = "18.09";
};
}

View File

@@ -17,6 +17,7 @@ gitlab-oauth: ENC[AES256_GCM,data:1THznoGRZmq7BkisZoGa0ZiPG7aSmkV06SY=,iv:Gq6UPH
anki-username: ENC[AES256_GCM,data:cUWaxIc=,iv:I2wy54406Xe4tVHIhIFZqbezepc2wtp2M15T7ES9zGQ=,tag:FiU2CscHDcNv+6S5pODG7w==,type:str]
anki-password: ENC[AES256_GCM,data:kXQq1JPjTRpQ4f6/BOFj/gBhUA==,iv:P8MVsmCfyOoEJmyAjBfMSRT6mpkwDUBIzr2UjZmjHOA=,tag:D7KWEpldP/H6CUH7y+5/7Q==,type:str]
anki-sync-key: ENC[AES256_GCM,data:wvAo92t6oR8PxE5EId/OC+J4GKs/Rp21PSp+uDt72JWFzeWHO6a1KA==,iv:2yU4skxlDuH6smSr5PnPe8ZkWf4gdxKBXQfzPFiZXoA=,tag:7KXl5A4vzRdkWO++LbMb9A==,type:str]
jellyfin-rpc-api-key: ENC[AES256_GCM,data:srElaGG1JVWwDb+xA4iG9ew6oFUEHSd6AlLUXN8iA3c=,iv:z1UQshfWW6Q7GK8Ff8GK3OD7z0Aa5kePVRPLlUsDmF0=,tag:+csa3asD+0qthO05uZqK0A==,type:str]
sops:
age:
- recipient: age1qayk0d0f765v57pedm7mtau6qkmv8rh6jtaqm40g5g9armaty4jqc0v0y2
@@ -28,7 +29,7 @@ sops:
VVBqSEM2bVFBU0M5YzZBQWIwUmVXUXMKvWb57Rc+rO5M8Pf7lvbSjuZB4FrHgT3A
uBQHH3wpv0BVVzL8tucPnwNxDnwpWvFxxwNVy/rtfs6y6HPu6fuOsA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-11-30T00:32:08Z"
mac: ENC[AES256_GCM,data:9c3xcwnGSoi/IpDHBJ922kd9Xh4EodOL/1B1epdCIB/N3Pu07wVMGSGm97e2uqczbFgebXc/Oz1Gpr9hdxNpvxlldXQgqPhZIlk6Pfelf6E0WcC5+QOE1ZQ6MTsgAE5RjFy2fctphXJi/Z9VuTcSgakSYuy+0QbPCfuwL5CaTVk=,iv:8qwCqjVALlaxJCAfZURpt7c6/3b9KKar7mtsYb3/rlw=,tag:utHZLe3FojSmyvBBIzfY2A==,type:str]
lastmodified: "2026-03-06T21:55:34Z"
mac: ENC[AES256_GCM,data:kkEZI0Of8KUpGJRoGAD3gXCtNz44Sucki4Fk2lQ55o+IcBYtxJwwpoQH3usihSigaPquee4XAxhdlWyHt7S46Q9dTFXjT9IUpnxrlG0ZQOnTRbdRlT2qcxLSlghdDWRuezhjT5KWFqlq4Av85KmL7kiB7LAkPVk6EERHJuFsWR8=,iv:Y3wd4hP1ui3rtXe++3j1oAKYbd8V4cc0SBLOlcyl5Zc=,tag:/FK8R28WAWDhWImMnm6wQg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0
version: 3.12.1