···
109
109
},
110
110
"crane_2": {
111
111
"locked": {
112
112
-
"lastModified": 1771438068,
113
113
-
"narHash": "sha256-nGBbXvEZVe/egCPVPFcu89RFtd8Rf6J+4RFoVCFec0A=",
112
112
+
"lastModified": 1777242778,
113
113
+
"narHash": "sha256-VWTeqWeb8Sel/QiWyaPvCa9luAbcGawR+Rw09FJoHz0=",
114
114
"owner": "ipetkov",
115
115
"repo": "crane",
116
116
-
"rev": "b5090e53e9d68c523a4bb9ad42b4737ee6747597",
116
116
+
"rev": "ad8b31ad0ba8448bd958d7a5d50d811dc5d271c0",
117
117
"type": "github"
118
118
},
119
119
"original": {
···
221
221
"rust-analyzer-src": "rust-analyzer-src_4"
222
222
},
223
223
"locked": {
224
224
-
"lastModified": 1757400094,
225
225
-
"narHash": "sha256-5Rcs6juMoMTaMJSR1glravl4QB9yLAFBD8s7KLi4kdQ=",
224
224
+
"lastModified": 1777190237,
225
225
+
"narHash": "sha256-XbNSZv/fi6U8r8r8J/rljY91wf2jxyM6AwNLBeeM5SA=",
226
226
"owner": "nix-community",
227
227
"repo": "fenix",
228
228
-
"rev": "0682b9b518792c9428865c511a4c40c9ad85c243",
228
228
+
"rev": "82fcabb6d9819f34170877fb1848b92e9350ec57",
229
229
"type": "github"
230
230
},
231
231
"original": {
···
711
711
},
712
712
"nixpkgs-stable_2": {
713
713
"locked": {
714
714
-
"lastModified": 1757408970,
715
715
-
"narHash": "sha256-aSgK4BLNFFGvDTNKPeB28lVXYqVn8RdyXDNAvgGq+k0=",
714
714
+
"lastModified": 1767313136,
715
715
+
"narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=",
716
716
"owner": "NixOS",
717
717
"repo": "nixpkgs",
718
718
-
"rev": "d179d77c139e0a3f5c416477f7747e9d6b7ec315",
718
718
+
"rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d",
719
719
"type": "github"
720
720
},
721
721
"original": {
···
933
933
"rust-analyzer-src_4": {
934
934
"flake": false,
935
935
"locked": {
936
936
-
"lastModified": 1757362324,
937
937
-
"narHash": "sha256-/PAhxheUq4WBrW5i/JHzcCqK5fGWwLKdH6/Lu1tyS18=",
936
936
+
"lastModified": 1776800521,
937
937
+
"narHash": "sha256-f8YJfwAOsLFpIoqZuX3yF69UvMLrkx7iVzMH1pJU7cM=",
938
938
"owner": "rust-lang",
939
939
"repo": "rust-analyzer",
940
940
-
"rev": "9edc9cbe5d8e832b5864e09854fa94861697d2fd",
940
940
+
"rev": "8954b66d43225e62c92e8bbcc8500191b5cceb1e",
941
941
"type": "github"
942
942
},
943
943
"original": {
···
1054
1054
"nixpkgs-stable": "nixpkgs-stable_2"
1055
1055
},
1056
1056
"locked": {
1057
1057
-
"lastModified": 1777250125,
1058
1058
-
"narHash": "sha256-DNpwCxfPKddbM0b5to/nq080pILPJPuHMaQsqXyW9hg=",
1057
1057
+
"lastModified": 1777256726,
1058
1058
+
"narHash": "sha256-Vtn/Yfw17gXgnE0Gm/ylKtMUJqKPKP6JBoo6YbeYirU=",
1059
1059
"owner": "seanaye",
1060
1060
"repo": "trmnl-rs",
1061
1061
-
"rev": "ab539b83b55e85cbb7357050241ba1e7c6cc5c1f",
1061
1061
+
"rev": "8c1fea4287a6ee585821b367cd8e1f2b00b33bcc",
1062
1062
"type": "github"
1063
1063
},
1064
1064
"original": {
···
35
35
flyctl
36
36
rainfrog
37
37
sqlitebrowser
38
38
+
cachix
38
39
39
40
# System tools
40
41
nautilus
···
103
104
thinking = "high";
104
105
};
105
106
enabledPlugins = {
106
106
-
"rust-analyzer-lsp@claude-plugins-official" = true;
107
107
-
"typescript-lsp@claude-plugins-official" = true;
108
107
"caveman@caveman" = true;
109
108
};
110
109
hooks = {
···
80
80
];
81
81
env = {
82
82
STEAM_DESKTOP_SESSION = "niri";
83
83
-
ENABLE_GAMESCOPE_WSI = "0";
83
83
+
ENABLE_GAMESCOPE_WSI = "1";
84
84
};
85
85
};
86
86
extraCompatPackages = with pkgs; [
···
99
99
environment.systemPackages = [
100
100
steamos-session-select
101
101
];
102
102
+
103
103
+
boot.kernelParams = [ "split_lock_mitigate=0" ];
102
104
103
105
security.pam.loginLimits = [
104
106
{
···
41
41
# Kodi Pi 5 specific settings
42
42
(
43
43
{ pkgs, lib, ... }:
44
44
+
let
45
45
+
patchedInvidious = pkgs.kodiPackages.invidious.overrideAttrs (old: {
46
46
+
postPatch = (old.postPatch or "") + ''
47
47
+
substituteInPlace resources/lib/invidious_plugin.py \
48
48
+
--replace-fail \
49
49
+
'url = video_info["dashUrl"]' \
50
50
+
'url = video_info["dashUrl"]; url = self.api_client.instance_url + url if url.startswith("/") else url' \
51
51
+
--replace-fail \
52
52
+
'url = video_info["formatStreams"][-1]["url"]' \
53
53
+
'url = video_info["formatStreams"][-1]["url"]; url = self.api_client.instance_url + url if url.startswith("/") else url'
54
54
+
'';
55
55
+
});
56
56
+
57
57
+
myKodi = pkgs.kodi-gbm.withPackages (kodiPkgs: with kodiPkgs; [
58
58
+
jellyfin
59
59
+
patchedInvidious
60
60
+
]);
61
61
+
62
62
+
kodiAdvancedSettings = pkgs.writeText "advancedsettings.xml" ''
63
63
+
<advancedsettings version="1.0">
64
64
+
<videoplayer>
65
65
+
<useprimedecoder>true</useprimedecoder>
66
66
+
<useprimedecoderforhw>true</useprimedecoderforhw>
67
67
+
</videoplayer>
68
68
+
</advancedsettings>
69
69
+
'';
70
70
+
in
44
71
{
45
72
networking.hostName = "kodi-pi";
46
73
···
68
95
hardware.raspberry-pi.config.all.options = {
69
96
gpu_mem = {
70
97
enable = true;
71
71
-
value = 512;
98
98
+
value = 256;
72
99
};
73
100
hdmi_force_hotplug = {
74
101
enable = true;
···
76
103
};
77
104
};
78
105
79
79
-
services.pipewire = {
80
80
-
enable = true;
81
81
-
alsa.enable = true;
82
82
-
pulse.enable = true;
83
83
-
};
106
106
+
# ALSA only for HDMI passthrough
107
107
+
services.pipewire.enable = false;
108
108
+
services.pulseaudio.enable = false;
84
109
85
85
-
services.cage = {
86
86
-
enable = true;
87
87
-
user = "kiosk";
88
88
-
program = "${pkgs.jellyfin-media-player}/bin/jellyfinmediaplayer --tv";
110
110
+
systemd.services.kodi = {
111
111
+
description = "Kodi media center";
112
112
+
wantedBy = [ "multi-user.target" ];
113
113
+
after = [ "network-online.target" "sound.target" "systemd-user-sessions.service" ];
114
114
+
wants = [ "network-online.target" ];
115
115
+
serviceConfig = {
116
116
+
Type = "simple";
117
117
+
User = "kodi";
118
118
+
ExecStartPre = pkgs.writeShellScript "kodi-setup" ''
119
119
+
mkdir -p /home/kodi/.kodi/userdata
120
120
+
cp -f ${kodiAdvancedSettings} /home/kodi/.kodi/userdata/advancedsettings.xml
121
121
+
122
122
+
JFSETTINGS=/home/kodi/.kodi/userdata/addon_data/plugin.video.jellyfin/settings.xml
123
123
+
if [ -f "$JFSETTINGS" ]; then
124
124
+
${pkgs.gnused}/bin/sed -i \
125
125
+
-e 's|"transcode_h265">true|"transcode_h265">false|' \
126
126
+
-e 's|"transcodeHi10P">true|"transcodeHi10P">false|' \
127
127
+
-e 's|"kodiCompanion">false|"kodiCompanion">true|' \
128
128
+
"$JFSETTINGS"
129
129
+
fi
130
130
+
131
131
+
INVSETTINGS=/home/kodi/.kodi/userdata/addon_data/plugin.video.invidious/settings.xml
132
132
+
if [ -f "$INVSETTINGS" ]; then
133
133
+
${pkgs.gnused}/bin/sed -i \
134
134
+
-e 's|"auto_instance">true|"auto_instance">false|' \
135
135
+
-e 's|"instance_url"[^<]*<|"instance_url">http://mira:3001<|' \
136
136
+
-e 's|"disable_dash"[^>]*>[^<]*<|"disable_dash">false<|' \
137
137
+
"$INVSETTINGS"
138
138
+
else
139
139
+
mkdir -p /home/kodi/.kodi/userdata/addon_data/plugin.video.invidious
140
140
+
cat > "$INVSETTINGS" <<'INVEOF'
141
141
+
<settings version="2">
142
142
+
<setting id="auto_instance">false</setting>
143
143
+
<setting id="instance_url">http://mira:3001</setting>
144
144
+
<setting id="disable_dash">false</setting>
145
145
+
</settings>
146
146
+
INVEOF
147
147
+
fi
148
148
+
'';
149
149
+
ExecStart = "${myKodi}/bin/kodi-standalone";
150
150
+
Restart = "always";
151
151
+
TimeoutStopSec = "15s";
152
152
+
TimeoutStopFailureMode = "kill";
153
153
+
};
89
154
};
90
155
91
91
-
users.users.kiosk = {
156
156
+
users.users.kodi = {
92
157
isNormalUser = true;
93
158
extraGroups = [
94
159
"video"
···
128
193
networking.useDHCP = true;
129
194
security.sudo.wheelNeedsPassword = false;
130
195
131
131
-
networking.firewall.allowedTCPPorts = [ 22 ];
196
196
+
networking.firewall.allowedTCPPorts = [
197
197
+
22
198
198
+
8080 # Kodi web remote
199
199
+
];
132
200
133
133
-
environment.systemPackages = [ pkgs.jellyfin-media-player ];
201
201
+
environment.systemPackages = [ myKodi ];
134
202
135
203
system.stateVersion = "24.11";
136
204
}
···
29
29
30
30
# Mira-specific aspects
31
31
nm.nvidia
32
32
+
nm.ollama
32
33
nm.media-server
33
34
nm.home-automation
34
35
nm.gaming
···
1
1
+
{ ... }: {
2
2
+
flake.modules.nixos.ollama =
3
3
+
{ pkgs, ... }:
4
4
+
{
5
5
+
services.ollama = {
6
6
+
enable = true;
7
7
+
package = pkgs.ollama-cuda;
8
8
+
};
9
9
+
};
10
10
+
}