Compare commits

...

16 commits

Author SHA1 Message Date
Anish Lakhwara 266c981cd4 more music stuff 2025-09-16 10:47:50 -07:00
Anish Lakhwara cfdd468453 Merge branch 'main' of git.sealight.xyz:aynish/helm 2025-09-13 00:06:19 -07:00
Anish Lakhwara e585ffe73e actually fix music 2025-09-13 00:06:03 -07:00
Anish Lakhwara d67ade06c8 fix: music downloads 2025-09-12 16:48:03 -07:00
Anish Lakhwara 01c65f54af got a bunch of shit fixed 2025-09-12 00:29:37 -07:00
Anish Lakhwara 4049df5724 curve: maybe fix pinentry? 2025-07-04 21:19:39 -07:00
Anish Lakhwara 5bb9a913df fix: matrix olm marked not vulnerable 2025-07-04 21:18:59 -07:00
Anish Lakhwara 40c422e890 nvim: add zk 2025-05-24 12:44:10 -07:00
Anish Lakhwara 64f39e2fdc curve: update monitor script 2025-05-24 12:44:02 -07:00
Anish Lakhwara 237aeff312 feat: add zk to nvim 2025-05-03 22:53:18 -07:00
Anish Lakhwara 751a24a312 update to 25.05 2025-05-03 22:46:04 -07:00
Anish Lakhwara 14191e5528 misc: cuve updates 2025-05-03 22:45:53 -07:00
Anish Lakhwara ba1d3b96ed feat: music stuff 2025-05-03 22:45:42 -07:00
Anish Lakhwara da5352d5d8 fix: firefox config works with new version 2025-05-03 22:45:21 -07:00
Anish Lakhwara 8680d23d3a feat: tmux 2025-05-03 22:45:14 -07:00
Anish Lakhwara f4e53de4c4 feat: run immich 2025-05-03 22:44:48 -07:00
34 changed files with 610 additions and 263 deletions

3
.gitignore vendored
View file

@ -1 +1,4 @@
.direnv/ .direnv/
.direnv/*
.direnv/**
.envrc

View file

@ -40,7 +40,8 @@ D('sealight.xyz', REG_NONE, DnsProvider(DNS_HEDNS),
A('bin', '69.61.2.203', TTL(300)), A('bin', '69.61.2.203', TTL(300)),
A('ci', '69.61.2.203', TTL(300)), A('ci', '69.61.2.203', TTL(300)),
A('write', '69.61.2.203', TTL(300)), A('write', '69.61.2.203', TTL(300)),
// vultr -> nulled: lituus A('photos', '69.61.2.203', TTL(300)),
// vultr: lituus
A('@', '45.77.48.108', TTL(300)), A('@', '45.77.48.108', TTL(300)),
A('jitsi', '45.77.48.108', TTL(300)), A('jitsi', '45.77.48.108', TTL(300)),
A('chat', '45.77.48.108', TTL(300)), A('chat', '45.77.48.108', TTL(300)),

View file

@ -270,16 +270,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1736373539, "lastModified": 1751810233,
"narHash": "sha256-dinzAqCjenWDxuy+MqUQq0I4zUSfaCvN9rzuCmgMZJY=", "narHash": "sha256-kllkNbIqQi3VplgTMeGzuh1t8Gk8TauvkTRt93Km+tQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "bd65bc3cde04c16755955630b344bc9e35272c56", "rev": "9b0873b46c9f9e4b7aa01eb634952c206af53068",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-24.11", "ref": "release-25.05",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "type": "github"
} }
@ -354,16 +354,16 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1738277201, "lastModified": 1755274400,
"narHash": "sha256-6L+WXKCw5mqnUIExvqkD99pJQ41xgyCk6z/H9snClwk=", "narHash": "sha256-rTInmnp/xYrfcMZyFMH3kc8oko5zYfxsowaLv1LVobY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "666e1b3f09c267afd66addebe80fb05a5ef2b554", "rev": "ad7196ae55c295f53a7d1ec39e4a06d922f3b899",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-24.11", "ref": "nixos-25.05",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@ -534,11 +534,11 @@
}, },
"unstable": { "unstable": {
"locked": { "locked": {
"lastModified": 1738410390, "lastModified": 1752687322,
"narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", "narHash": "sha256-RKwfXA4OZROjBTQAl9WOZQFm7L8Bo93FQwSJpAiSRvo=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3a228057f5b619feb3186e986dbe76278d707b6e", "rev": "6e987485eb2c77e5dcc5af4e3c70843711ef9251",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -3,7 +3,7 @@
inputs = { inputs = {
# Nixpkgs # Nixpkgs
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
unstable.url = "github:nixos/nixpkgs/nixos-unstable"; unstable.url = "github:nixos/nixpkgs/nixos-unstable";
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
@ -11,7 +11,7 @@
# ngipkgs-local.url = "path:/home/anish/usr/ngipkgs"; # ngipkgs-local.url = "path:/home/anish/usr/ngipkgs";
# Home manager # Home manager
home-manager.url = "github:nix-community/home-manager/release-24.11"; home-manager.url = "github:nix-community/home-manager/release-25.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs"; home-manager.inputs.nixpkgs.follows = "nixpkgs";
hardware.url = "github:nixos/nixos-hardware"; hardware.url = "github:nixos/nixos-hardware";
@ -95,7 +95,7 @@
tidalcycles.overlays.default tidalcycles.overlays.default
agenix.overlays.default agenix.overlays.default
nur.overlay nur.overlay
nix-matrix-appservices.overlay # nix-matrix-appservices.overlay # nixpkgs has these packages and newer ones at that
unstableOverlay unstableOverlay
vimwikiOverlay vimwikiOverlay
self.overlays.additions self.overlays.additions
@ -251,7 +251,7 @@
}; };
lituus = { lituus = {
hostname = "sealight.xyz"; hostname = "sealight.xyz";
# autoRollback = false; autoRollback = false;
profiles.system = { profiles.system = {
user = "root"; user = "root";
path = deploy-rs.lib.x86_64-linux.activate.nixos path = deploy-rs.lib.x86_64-linux.activate.nixos

View file

@ -4,7 +4,7 @@
../profiles/cli ../profiles/cli
../profiles/direnv ../profiles/direnv
../profiles/git ../profiles/git
# ../profiles/tmux ../profiles/tmux
]; ];
home.stateVersion = "22.05"; home.stateVersion = "22.05";
} }

View file

@ -11,4 +11,22 @@
../profiles/ssh ../profiles/ssh
../profiles/task ../profiles/task
]; ];
# GPG configuration for user session
services.gpg-agent = {
enable = true;
pinentry.package = pkgs.pinentry-rofi; # Use rofi for consistency with desktop theme
enableSshSupport = true;
defaultCacheTtl = 28800; # 8 hours
maxCacheTtl = 86400; # 24 hours
extraConfig = ''
pinentry-program ${pkgs.writeShellScript "pinentry-rofi-themed" ''
exec ${pkgs.pinentry-rofi}/bin/pinentry-rofi -theme ~/.config/rofi/theme/passmenu.rasi "$@"
''}
'';
};
programs.gpg = {
enable = true;
};
} }

View file

@ -61,7 +61,8 @@
fontconfig fontconfig
pandoc pandoc
taskwarrior-tui taskwarrior-tui
vimwiki-cli # vimwiki-cli
zk
(pkgs.writeScriptBin "jq-repl" '' (pkgs.writeScriptBin "jq-repl" ''
#!/usr/bin/env bash #!/usr/bin/env bash
@ -95,10 +96,15 @@
# Turn it on if it was off # Turn it on if it was off
xrandr --output HDMI-2 --auto xrandr --output HDMI-2 --auto
xrandr --output HDMI-2 --same-as eDP-1 xrandr --output HDMI-2 --same-as eDP-1
xrandr --output eDP-1 --off
pkill -9 polybar
feh --bg-scale ~/Downloads/stephen-walker-onIXxjH56AA-unsplash.jpg
polybar mybar > $XDG_DATA_HOME/polybar.log 2>&1 &
} }
disconnect() { disconnect() {
xrandr --output HDMI-2 --off xrandr --output HDMI-2 --off
xrandr --output eDP-1 --auto
} }
xrandr | grep "HDMI-2 connected" &>>/dev/null && connect || disconnect xrandr | grep "HDMI-2 connected" &>>/dev/null && connect || disconnect
@ -148,7 +154,7 @@
enableCompletion = true; enableCompletion = true;
autosuggestion.enable = false; autosuggestion.enable = false;
initExtra = '' initContent = ''
bindkey -v bindkey -v
autopair-init autopair-init
''; '';

View file

@ -31,8 +31,9 @@ in
inotify-tools inotify-tools
offpunk offpunk
termpdfpy termpdfpy
libsForQt5.kontact # libsForQt5.kontact
thunderbird thunderbird
libsecret # For secret-tool to manage keyring
]; ];
# GTK4 color scheme? # GTK4 color scheme?
@ -73,7 +74,7 @@ in
#gtk4 theme #gtk4 theme
".config/gtk-4.0/settings.ini".text = '' ".config/gtk-4.0/settings.ini".text = ''
[Settings] [Settings]
gtk-application-prefer-dark-theme=1 gtk-application-prefer-dark-theme=true
''; '';
# gtk3 theme # gtk3 theme
".config/gtk-3.0/settings.ini".text = '' ".config/gtk-3.0/settings.ini".text = ''

View file

@ -8,6 +8,10 @@ open_url_with default
mouse_map left click ungrabbed mouse_click_url_or_select mouse_map left click ungrabbed mouse_click_url_or_select
confirm_os_window_close 0 confirm_os_window_close 0
enable_audio_bell no enable_audio_bell no
# Ctrl+V for paste
map ctrl+v paste_from_clipboard
-- Allows zen-mode.nvim to increase font size -- Allows zen-mode.nvim to increase font size
-- allow_remote_control socket-only -- allow_remote_control socket-only
-- listen_on unix:/tmp/kitty -- listen_on unix:/tmp/kitty

View file

@ -18,7 +18,7 @@
isDefault = true; isDefault = true;
name = "anish"; name = "anish";
userChrome = (builtins.readFile ./userChrome.css); userChrome = (builtins.readFile ./userChrome.css);
extensions = with pkgs.nur.repos.rycee.firefox-addons; [ extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [
# Find extensions: https://github.com/nix-community/nur-combined/blob/master/repos/rycee/pkgs/firefox-addons/generated-firefox-addons.nix # Find extensions: https://github.com/nix-community/nur-combined/blob/master/repos/rycee/pkgs/firefox-addons/generated-firefox-addons.nix
ublock-origin ublock-origin
# wallabagger # wallabagger

View file

@ -8,13 +8,29 @@
/*** NAV BAR ***/ /*** NAV BAR ***/
/* Hide urlbar */ /* Hide urlbar */
#nav-bar { #nav-bar {
position: relative !important; /* customize this value. */
z-index: 2 !important; --navbar-margin: -55px;
height: 2px !important;
min-height: 2px !important; margin-top: var(--navbar-margin);
margin-bottom: -2px !important; margin-bottom: 0;
opacity: 0 !important; z-index: -100;
border: none !important; transition: all 0.3s ease !important;
opacity: 0;
}
#navigator-toolbox:focus-within > #nav-bar,
#navigator-toolbox:hover > #nav-bar
{
margin-top: 0;
margin-bottom: var(--navbar-margin);
z-index: 100;
opacity: 1;
}
#main-window[chromehidden*="toolbar"] {
visibility: collapse;
height: -55px !important;
min-height: -55px !important;
} }
/* But unfocus it when we invoke it with ctrl+L */ /* But unfocus it when we invoke it with ctrl+L */
@ -37,10 +53,11 @@
height: 28px !important; height: 28px !important;
} }
/* hides the sidebar header */ /* hides the sidebar header
#sidebar-header { #sidebar-header {
display: none !important; display: none !important;
} }
*/
.tab[selected="true"] { .tab[selected="true"] {
visibility: collapse; visibility: collapse;
@ -53,73 +70,153 @@
.tabbrowser-tab[visuallyselected="true"] { .tabbrowser-tab[visuallyselected="true"] {
visibility: collapse; visibility: collapse;
} }
/* Credits to https://github.com/MrOtherGuy for hthe following snippet*/
/* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/autohide_sidebar.css made available under Mozilla Public License v. 2.0 /* Source file https://github.com/MrOtherGuy/firefox-csshacks/tree/master/chrome/autohide_sidebar.css made available under Mozilla Public License v. 2.0
See the above repository for updates as well as full license text. */ See the above repository for updates as well as full license text. */
/* Show sidebar only when the cursor is over it */ /* Show sidebar only when the cursor is over it.
/* The border controlling sidebar width will be removed so you'll need to modify these values to change width */ The border controlling sidebar width will be removed so you'll need to modify
these values to change width.
By default the internal layout of sidebar changes when hovered, but this can
be changed by setting pref "userchrome.autohide-sidebar.static-layout.enabled" to true
*/
#sidebar-box{ /* Note: If you want only *some* sidebar to be auto-hidden, then you can use [sidebarcommand] attribute selector.
--uc-sidebar-width: 44px; /* Only thing I (gale) changed */ For example, to only affect Sidebery's sidebar replace all instances of #sidebar-box with
#sidebar-box[sidebarcommand="_3c078156-979c-498b-8990-85f7987dd929_-sidebar-action"].
To find the sidebarcommand value for any other sidebar, open that sidebar and use Browser Toolbox to inspect it.
See: https://firefox-source-docs.mozilla.org/devtools-user/browser_toolbox/index.html
*/
/* The whole thing
:where(#main-window) #browser{
--uc-sidebar-width: 240px;
--uc-sidebar-hover-width: 210px; --uc-sidebar-hover-width: 210px;
}
#main-window[sizemode="fullscreen"] #browser{
--uc-sidebar-width: 1px;
}
#sidebar-box{
--uc-autohide-sidebar-delay: 600ms; /* Wait 0.6s before hiding sidebar */ --uc-autohide-sidebar-delay: 600ms; /* Wait 0.6s before hiding sidebar */
--uc-autohide-transition-duration: 115ms;
--uc-autohide-transition-type: linear;
--browser-area-z-index-sidebar: 3;
position: relative; position: relative;
min-width: var(--uc-sidebar-width) !important; min-width: var(--uc-sidebar-width) !important;
width: var(--uc-sidebar-width) !important; width: var(--uc-sidebar-width) !important;
max-width: var(--uc-sidebar-width) !important; max-width: var(--uc-sidebar-width) !important;
z-index:1; z-index: var(--browser-area-z-index-sidebar,3);
background-color: inherit;
/* This directionality flipper is played so that sidebar "grows" into the right direction */
direction: ltr;
&:is([positionend],[sidebar-positionend]):not(:-moz-locale-dir(rtl)){
direction: rtl;
}
} }
.sidebar-browser-stack{
#sidebar-box[positionend]{ direction: rtl } background: inherit;
#sidebar-box[positionend] > *{ direction: ltr } }
#main-window[sizemode="fullscreen"] #browser{ --uc-sidebar-width: 1px; }
#sidebar-box[positionend]:-moz-locale-dir(rtl){ direction: ltr }
#sidebar-box[positionend]:-moz-locale-dir(rtl) > *{ direction: rtl }
#main-window[sizemode="fullscreen"] #sidebar-box{ --uc-sidebar-width: 1px; }
#sidebar-splitter{ display: none } #sidebar-splitter{ display: none }
#sidebar-header{ overflow: hidden; /*color: var(--chrome-color, inherit) !important*/} #sidebar-header{
overflow: hidden;
#sidebar{ color: var(--chrome-color, inherit) !important;
transition: min-width 115ms linear var(--uc-autohide-sidebar-delay) !important; padding-inline: 0 !important;
min-width: var(--uc-sidebar-width) !important;
will-change: min-width;
} }
#sidebar-box:hover > #sidebar{ min-width: var(--uc-sidebar-hover-width) !important; transition-delay: 0ms !important } #sidebar-header::before,
#sidebar-header::after{
content: "";
display: flex;
padding-left: 8px;
}
#sidebar-header,
#sidebar{
transition: min-width var(--uc-autohide-transition-duration) var(--uc-autohide-transition-type) var(--uc-autohide-sidebar-delay) !important;
min-width: var(--uc-sidebar-width) !important;
will-change: min-width;
direction: ltr;
&:-moz-locale-dir(rtl){
direction: rtl;
}
}
#sidebar-box:hover > #sidebar-header,
#sidebar-box:hover > #sidebar,
#sidebar-box:hover > .sidebar-browser-stack > #sidebar{
min-width: var(--uc-sidebar-hover-width) !important;
transition-delay: 0ms !important;
}
.sidebar-panel{ .sidebar-panel{
/*background-color: transparent !important; background-color: transparent !important;
color: var(--newtab-text-primary-color) !important;*/ color: var(--newtab-text-primary-color) !important;
} }
.sidebar-panel #search-box{ .sidebar-panel #search-box{
-moz-appearance: none !important; -moz-appearance: none !important;
/*background-color: rgba(249,249,250,0.1) !important; background-color: rgba(249,249,250,0.1) !important;
color: inherit !important; color: inherit !important;
*/
} }
/* Add sidebar divider and give it background */ /* Add sidebar divider and give it background */
#sidebar, #sidebar,
#sidebar-header{ #sidebar-header{
/*background-color: inherit !important;*/ background-color: inherit !important;
border-inline: 1px solid rgb(80,80,80); border-inline: 1px solid rgb(80,80,80);
border-inline-width: 0px 1px; border-inline-width: 0px 1px;
} }
#sidebar-box:not([positionend]) > :-moz-locale-dir(rtl), #sidebar-box:not([positionend],[sidebar-positionend]) > :-moz-locale-dir(rtl),
#sidebar-box[positionend] > *{ #sidebar-box:is([positionend],[sidebar-positionend]) > *{
border-inline-width: 1px 0px; border-inline-width: 1px 0px;
} }
@media -moz-pref("sidebar.revamp") {
#sidebar, #sidebar-header{ border-style: none }
#sidebar-box{ padding: 0 !important; }
}
/* Move statuspanel to the other side when sidebar is hovered so it doesn't get covered by sidebar */ /* Move statuspanel to the other side when sidebar is hovered so it doesn't get covered by sidebar */
#sidebar-box:not([positionend]):hover ~ #appcontent #statuspanel{ inset-inline: auto 0px !important; } #sidebar-box:not([positionend],[sidebar-positionend]):hover ~ #appcontent #statuspanel{
#sidebar-box:not([positionend]):hover ~ #appcontent #statuspanel-label{ margin-inline: 0px !important; border-left-style: solid !important; } inset-inline: auto 0px !important;
}
#sidebar-box:not([positionend],[sidebar-positionend]):hover ~ #appcontent #statuspanel-label{
margin-inline: 0px !important;
border-left-style: solid !important;
}
@media -moz-pref("userchrome.autohide-sidebar.static-layout.enabled"){
#sidebar-box{
min-width: var(--uc-sidebar-width) !important;
contain: size;
box-shadow: var(--content-area-shadow);
}
#sidebar{
min-width: var(--uc-sidebar-hover-width) !important;
}
.sidebar-browser-stack{
overflow: hidden;
width: 100%;
transition: width var(--uc-autohide-transition-duration) var(--uc-autohide-transition-type) var(--uc-autohide-sidebar-delay);
direction: ltr;
&:hover{
transition-delay: 0ms;
width: var(--uc-sidebar-hover-width);
}
&:-moz-locale-dir(rtl){
transition-property: transform,width !important;
}
}
#sidebar-box[sidebar-positionend]:hover :is(#sidebar-header,#sidebar):-moz-locale-dir(ltr){
transform: translateX(0);
transition-delay: 0ms !important;
}
#sidebar-box:not([sidebar-positionend]):hover .sidebar-browser-stack:-moz-locale-dir(rtl){
transform: translateX(calc(-1 * var(--uc-sidebar-hover-width) + var(--uc-sidebar-width)));
}
#sidebar-box[sidebar-positionend]:hover > .sidebar-browser-stack:-moz-locale-dir(rtl){
transform: translateX(calc(var(--uc-sidebar-hover-width) - var(--uc-sidebar-width)));
transition-delay: 0ms !important;
}
}
*/

View file

@ -10,15 +10,7 @@ let
sha256 = "1fzKmknfVlEYwqeXgbKITbb2/PJ023iJyMz6vak3qh4="; sha256 = "1fzKmknfVlEYwqeXgbKITbb2/PJ023iJyMz6vak3qh4=";
}; };
}; };
lsp-format = pkgs.vimUtils.buildVimPlugin {
name = "lsp-format";
src = pkgs.fetchFromGitHub {
owner = "lukas-reineke";
repo = "lsp-format.nvim";
rev = "84e117b99bb2bc0d0c8122e2b256046f046f8aff";
sha256 = "rs3NTZwWdsmBGXnrgUeVxUiNjbN/ULxJHifPYJD9mT4=";
};
};
my-lspsaga = pkgs.vimUtils.buildVimPlugin { my-lspsaga = pkgs.vimUtils.buildVimPlugin {
name = "lspsaga.nvim"; name = "lspsaga.nvim";
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
@ -66,16 +58,6 @@ let
}; };
meta.homepage = "https://github.com/folke/which-key.nvim/"; meta.homepage = "https://github.com/folke/which-key.nvim/";
}; };
scnvim = pkgs.vimUtils.buildVimPlugin {
pname = "scnvim";
version = "2022-06-04";
src = pkgs.fetchFromGitHub {
owner = "davidgranstrom";
repo = "scnvim";
rev = "746cc0db820d02a9c36b8f9ba2eac9725fa73107";
sha256 = "kvSwS6FNUY2Ue84NhWLLcm0ldLMSp4WqQ7s6TUoX6Cc=";
};
};
yuck-vim = pkgs.vimUtils.buildVimPlugin { yuck-vim = pkgs.vimUtils.buildVimPlugin {
pname = "yuck.vim"; pname = "yuck.vim";
version = "2021-08-09"; version = "2021-08-09";
@ -132,11 +114,6 @@ let
tasklib tasklib
pynvim pynvim
six six
pylsp-mypy
#pyls-isort
#pyls-black
black
isort
# other python packages you want # other python packages you want
]; ];
python-with-my-packages = pkgs.python3.withPackages my-python-packages; python-with-my-packages = pkgs.python3.withPackages my-python-packages;
@ -205,7 +182,7 @@ in
set nobackup set nobackup
set nowritebackup set nowritebackup
" Better display for messages " Better display for messages
set cmdheight=2 set cmdheight=0
" You will have bad experience for diagnostic messages when it's default 4000. " You will have bad experience for diagnostic messages when it's default 4000.
set updatetime=300 set updatetime=300
" don't give |ins-completion-menu| messages. " don't give |ins-completion-menu| messages.
@ -214,6 +191,7 @@ in
set signcolumn=yes set signcolumn=yes
" highlight row " highlight row
set cursorline set cursorline
set autoread
let mapleader = "\<Space>" let mapleader = "\<Space>"
let maplocalleader = "," let maplocalleader = ","
@ -228,19 +206,7 @@ in
nmap <leader>rt :retab!<CR> nmap <leader>rt :retab!<CR>
vmap <leader>rt :retab!<CR> vmap <leader>rt :retab!<CR>
" moving splits with vim movements. " Alt+hjkl navigation now handled by Navigator.nvim plugin
:tnoremap <A-h> <C-\><C-N><C-w>h
:tnoremap <A-j> <C-\><C-N><C-w>j
:tnoremap <A-k> <C-\><C-N><C-w>k
:tnoremap <A-l> <C-\><C-N><C-w>l
:inoremap <A-h> <C-\><C-N><C-w>h
:inoremap <A-j> <C-\><C-N><C-w>j
:inoremap <A-k> <C-\><C-N><C-w>k
:inoremap <A-l> <C-\><C-N><C-w>l
:nnoremap <A-h> <leader>h
:nnoremap <A-j> <leader>j
:nnoremap <A-k> <leader>k
:nnoremap <A-l> <leader>l
:nnoremap <F5> "=strftime("%Y-%m-%d %H:%M")<CR> :nnoremap <F5> "=strftime("%Y-%m-%d %H:%M")<CR>
:inoremap <F5> <C-R>=strftime("%Y-%m-%d %H:%M")<CR> :inoremap <F5> <C-R>=strftime("%Y-%m-%d %H:%M")<CR>
:inoremap <F4> <C-R>=strftime("%H:%M")<CR> :inoremap <F4> <C-R>=strftime("%H:%M")<CR>
@ -278,11 +244,11 @@ in
autocmd BufReadPost,BufNewFile c,clj,cljs RainbowParenthesesToggleAll autocmd BufReadPost,BufNewFile c,clj,cljs RainbowParenthesesToggleAll
" general commands " general commands
map <leader>t :NERDTreeToggle<CR> map <leader>e :Neotree toggle<CR>
map <leader>s :w<CR> map <leader>s :w<CR>
map <leader>q :q<CR> map <leader>q :q<CR>
map <leader>r :RainbowParenthesesToggleAll<CR> map <leader>r :RainbowParenthesesToggleAll<CR>
nnoremap <BS> :noh<CR> nnoremap <Esc> :noh<CR>
map Q <Nop> map Q <Nop>
nnoremap Y y$ nnoremap Y y$
nnoremap <leader>n :vnew<CR> nnoremap <leader>n :vnew<CR>
@ -313,11 +279,11 @@ in
:vmap <leader>sy "*y :vmap <leader>sy "*y
:map <leader>sp :r!xclip -o<CR> :map <leader>sp :r!xclip -o<CR>
" barbar " buffer navigation (using built-in commands)
nnoremap <silent> gT :BufferPrevious<CR> nnoremap <silent> gT :bprevious<CR>
nnoremap <silent> gt :BufferNext<CR> nnoremap <silent> gt :bnext<CR>
nnoremap <silent> gj :BufferPick<CR> nnoremap <silent> gj :buffers<CR>
nnoremap <silent> gq :BufferClose<CR> nnoremap <silent> gq :bdelete<CR>
" git " git
nnoremap <leader>ga :G fetch --all nnoremap <leader>ga :G fetch --all
@ -330,14 +296,14 @@ in
nnoremap <leader>gc :G commit -v -q %:p<CR> nnoremap <leader>gc :G commit -v -q %:p<CR>
" kitaab " kitaab
map <leader>cz :VimwikiIndex<CR>:ZettelNew "map <leader>cz :VimwikiIndex<CR>:ZettelNew
map <leader>zs :ZettelSearch<CR> "map <leader>zs :ZettelSearch<CR>
map <leader>zn :ZettelNew<CR> map <leader>zn :ZettelNew<CR>
map <leader>zo :ZettelOpen<CR> "map <leader>zo :ZettelOpen<CR>
map <leader>zf :Telescope oldfiles only_cwd=true<CR> "map <leader>zf :Telescope oldfiles only_cwd=true<CR>
map <leader>wt :VimwikiMakeTomorrowDiaryNote "map <leader>wt :VimwikiMakeTomorrowDiaryNote
map <leader>wd :VimwikiMakeYesterdayDiaryNote "map <leader>wd :VimwikiMakeYesterdayDiaryNote
map <leader>zm :ZenMode<CR>:setlocal nospell<CR> "map <leader>zm :ZenMode<CR>:setlocal nospell<CR>
let g:vimwiki_list = [{ 'path': '~/kitaab/vimwiki', 'auto_tags': 1, 'auto_diary_index': 1, 'auto_generate_links': 1 }] let g:vimwiki_list = [{ 'path': '~/kitaab/vimwiki', 'auto_tags': 1, 'auto_diary_index': 1, 'auto_generate_links': 1 }]
let g:sync_taskwarrior = 0 let g:sync_taskwarrior = 0
let g:zettel_format = "%y%m%d-%H%M" let g:zettel_format = "%y%m%d-%H%M"
@ -368,7 +334,22 @@ in
nnoremap <leader>vsd :Lspsaga show_line_diagnostics<CR> nnoremap <leader>vsd :Lspsaga show_line_diagnostics<CR>
nnoremap <leader>vs :Dasht<Space> nnoremap <leader>vs :Dasht<Space>
nnoremap <leader>vn :Lspsaga diagnostic_jump_prev<CR> nnoremap <leader>vn :Lspsaga diagnostic_jump_prev<CR>
nnoremap <leader>vo :LSoutlineToggle<CR> nnoremap <leader>co :Outline<CR>
" Trouble keybindings
nnoremap <leader>xx :Trouble diagnostics<CR>
nnoremap <leader>xw :Trouble workspace_diagnostics<CR>
nnoremap <leader>xd :Trouble document_diagnostics<CR>
nnoremap <leader>xl :Trouble loclist<CR>
nnoremap <leader>xq :Trouble quickfix<CR>
nnoremap <leader>xr :Trouble lsp_references<CR>
" Yank to system clipboard (y operations only, not d)
nnoremap y "+y
vnoremap y "+y
nnoremap Y "+Y
" Note-taking keybindings
nnoremap <leader>zz :ZkNew { title = vim.fn.input('Title: ') }<CR>
" dashboard " dashboard
let g:dashboard_custom_header = [ let g:dashboard_custom_header = [
@ -427,7 +408,7 @@ in
" lua config " lua config
lua <<EOF lua <<EOF
local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " } local signs = { Error = " ", Warn = " ", Hint = "💡", Info = " " }
for type, icon in pairs(signs) do for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl }) vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
@ -487,7 +468,7 @@ in
vim.api.nvim_set_keymap('n', '<leader>vt', ':call v:lua.toggle_diagnostics()<CR>', {noremap = true, silent = true}) vim.api.nvim_set_keymap('n', '<leader>vt', ':call v:lua.toggle_diagnostics()<CR>', {noremap = true, silent = true})
-- autopairs -- autopairs
require('nvim-autopairs').setup{} require('nvim-autopairs').setup{}
@ -567,27 +548,109 @@ in
cmp.event:on( 'confirm_done', cmp_autopairs.on_confirm_done({ map_char = { tex = ' ' } })) cmp.event:on( 'confirm_done', cmp_autopairs.on_confirm_done({ map_char = { tex = ' ' } }))
require("luasnip.loaders.from_vscode").lazy_load() require("luasnip.loaders.from_vscode").lazy_load()
-- null-ls -- lsp-format removed, using conform.nvim instead
-- being very janky require("nvim-navic").setup {
local null_ls = require("null-ls") icons = {
null_ls.setup({ Constant = "π ",
sources = { Function = "ƒ "
null_ls.builtins.diagnostics.shellcheck, }
null_ls.builtins.diagnostics.proselint.with({ filetypes = { "vimwiki", "mail", }, }), }
null_ls.builtins.diagnostics.commitlint,
null_ls.builtins.diagnostics.jsonlint, -- Setup neo-tree
-- null_ls.builtins.code_actions.statix, require("neo-tree").setup {}
-- null_ls.builtins.diagnostics.clj_kondo,
-- null_ls.builtins.formatting.isort, -- Setup outline
-- null_ls.builtins.formatting.black, require("outline").setup {}
-- Setup trouble
require("trouble").setup {}
-- Setup noice for floating command palette and notifications
require("noice").setup({
cmdline = {
enabled = true,
view = "cmdline_popup",
},
messages = {
enabled = true,
},
popupmenu = {
enabled = true,
},
notify = {
enabled = true,
view = "notify",
},
lsp = {
progress = {
enabled = true,
format = "lsp_progress",
format_done = "lsp_progress_done",
throttle = 1000 / 30, -- frequency to update lsp progress message
view = "mini",
},
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.stylize_markdown"] = true,
["cmp.entry.get_documentation"] = true,
},
},
presets = {
command_palette = true,
long_message_to_split = true,
inc_rename = false,
lsp_doc_border = false,
},
views = {
cmdline_popup = {
border = {
style = "rounded",
padding = { 0, 1 },
},
filter_options = {},
win_options = {
winhighlight = "NormalFloat:NormalFloat,FloatBorder:FloatBorder",
},
},
}, },
}) })
-- Setup lspconfig -- Setup barbar (tabline with icons)
require("lsp-format").setup {} require'barbar'.setup {
require("nvim-navic").setup {} icons = {
local format = require("lsp-format") filetype = {
enabled = true,
},
},
}
local navic = require("nvim-navic") local navic = require("nvim-navic")
-- Setup conform.nvim for formatting
require("conform").setup({
formatters_by_ft = {
javascript = { "prettier", "lsp" },
typescript = { "prettier", "lsp" },
javascriptreact = { "prettier", "lsp" },
typescriptreact = { "prettier", "lsp" },
json = { "prettier", "lsp" },
html = { "prettier", "lsp" },
css = { "prettier", "lsp" },
yaml = { "prettier", "lsp" },
rust = { "lsp" },
go = { "lsp" },
lua = { "lsp" },
nix = { "nixfmt-rfc-style" },
clojure = { "lsp" },
fennel = { "lsp" },
terraform = { "lsp" },
bash = { "shfmt" },
sh = { "shfmt" },
},
format_on_save = {
timeout_ms = 500,
lsp_fallback = true,
},
})
-- lspsaga, code_action lightbulb is annoying -- lspsaga, code_action lightbulb is annoying
local saga = require('lspsaga') local saga = require('lspsaga')
@ -635,21 +698,20 @@ in
} }
} }
local servers = { 'clojure_lsp', 'terraform_lsp', 'zls', 'pyright', 'rust_analyzer', 'tsserver', 'lua_ls', 'nil_ls', 'gopls'} local servers = { 'clojure_lsp', 'terraform_lsp', 'zls', 'pyright', 'rust_analyzer', 'ts_ls', 'lua_ls', 'nil_ls', 'gopls', 'bashls'}
for _, lsp in ipairs(servers) do for _, lsp in ipairs(servers) do
lspconfig[lsp].setup { lspconfig[lsp].setup {
on_attach = function(client, bufnr) on_attach = function(client, bufnr)
format.on_attach(client)
navic.attach(client, bufnr) navic.attach(client, bufnr)
end, end,
capabilities = capabilities, capabilities = capabilities,
} }
end end
-- fennel-ls doesn't support gps -- fennel-ls doesn't support navic
lspconfig['fennel-ls'].setup { lspconfig['fennel-ls'].setup {
on_attach = function(client, bufnr) on_attach = function(client, bufnr)
format.on_attach(client) -- fennel-ls setup without navic
end, end,
capabilities = capabilities, capabilities = capabilities,
} }
@ -702,7 +764,7 @@ in
function() function()
local msg = 'No Active Lsp' local msg = 'No Active Lsp'
local buf_ft = vim.api.nvim_buf_get_option(0, 'filetype') local buf_ft = vim.api.nvim_buf_get_option(0, 'filetype')
local clients = vim.lsp.get_active_clients() local clients = vim.lsp.get_clients()
if next(clients) == nil then if next(clients) == nil then
return msg return msg
end end
@ -728,7 +790,7 @@ in
local map = vim.api.nvim_set_keymap local map = vim.api.nvim_set_keymap
local opts = { noremap = true, silent = true } local opts = { noremap = true, silent = true }
map('n', '<TAB>', '<CMD>lua require("FTerm").toggle()<CR>', opts) map('n', '<TAB>', '<CMD>lua require("FTerm").toggle()<CR>', opts)
map('t', '<A-i>', '<C-\\><C-n><CMD>lua require("FTerm").toggle()<CR>', opts) map('t', '<TAB>', '<C-\\><C-n><CMD>lua require("FTerm").toggle()<CR>', opts)
-- Custom functions -- Custom functions
function update_date() function update_date()
@ -765,11 +827,17 @@ in
) )
-- auto session -- auto session
vim.o.sessionoptions="blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal,localoptions"
require('auto-session').setup { require('auto-session').setup {
log_level = 'info', log_level = 'error',
auto_session_suppress_dirs = {'~/'} auto_session_suppress_dirs = {'~/', '/tmp', '/'},
auto_session_enable_last_session = false,
auto_session_root_dir = vim.fn.stdpath('data').."/sessions/",
auto_session_enabled = true,
auto_save_enabled = nil,
auto_restore_enabled = nil,
auto_session_create_enabled = nil,
} }
vim.o.sessionoptions="blank,buffers,curdir,folds,help,tabpages,winsize,winpos,terminal"
require("which-key").setup{} require("which-key").setup{}
require('leap').set_default_keymaps() require('leap').set_default_keymaps()
@ -800,6 +868,42 @@ in
-- You gotta run :SCNvimGenerateAssets for this first -- You gotta run :SCNvimGenerateAssets for this first
-- require("luasnip").add_snippets("supercollider", require("scnvim/utils").get_snippets()) -- require("luasnip").add_snippets("supercollider", require("scnvim/utils").get_snippets())
-- zk
require("zk").setup()
-- vim.api.nvim_set_keymap("n", "<leader>zn", "<Cmd>ZkNew { title = vim.fn.input('Title: ') }<CR>", opts)
-- Open notes.
vim.api.nvim_set_keymap("n", "<leader>zo", "<Cmd>ZkNotes { sort = { 'modified' } }<CR>", opts)
-- Open notes associated with the selected tags.
vim.api.nvim_set_keymap("n", "<leader>zt", "<Cmd>ZkTags<CR>", opts)
local map = vim.api.nvim_set_keymap
-- Search for the notes matching a given query.
vim.api.nvim_set_keymap("n", "<leader>zf", "<Cmd>ZkNotes { sort = { 'modified' }, match = { vim.fn.input('Search: ') } }<CR>", opts)
-- Search for the notes matching the current visual selection.
vim.api.nvim_set_keymap("v", "<leader>zf", ":'<,'>ZkMatch<CR>", opts)
map("n", "<CR>", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts)
-- Create a new note after asking for its title.
-- This overrides the global `<leader>zn` mapping to create the note in the same directory as the current buffer.
-- map("n", "<leader>zn", "<Cmd>ZkNew { dir = vim.fn.expand('%:p:h'), title = vim.fn.input('Title: ') }<CR>", opts)
-- Create a new note in the same directory as the current buffer, using the current selection for title.
-- map("v", "<leader>znt", ":'<,'>ZkNewFromTitleSelection { dir = vim.fn.expand('%:p:h') }<CR>", opts)
-- Create a new note in the same directory as the current buffer, using the current selection for note content and asking for its title.
map("v", "<leader>znc", ":'<,'>ZkNewFromContentSelection { dir = vim.fn.expand('%:p:h'), title = vim.fn.input('Title: ') }<CR>", opts)
-- Open notes linking to the current buffer.
map("n", "<leader>zb", "<Cmd>ZkBacklinks<CR>", opts)
-- Alternative for backlinks using pure LSP and showing the source context.
--map('n', '<leader>zb', '<Cmd>lua vim.lsp.buf.references()<CR>', opts)
-- Open notes linked by the current buffer.
map("n", "<leader>zl", "<Cmd>ZkLinks<CR>", opts)
-- Preview a linked note.
map("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts)
-- Open the code actions for a visual selection.
map("v", "<leader>za", ":'<,'>lua vim.lsp.buf.range_code_action()<CR>", opts)
-- zen mode -- zen mode
require('zen-mode').setup{ require('zen-mode').setup{
window = { window = {
@ -850,6 +954,27 @@ in
auto_display = false -- WIP automatic markdown image display, may be prone to breaking auto_display = false -- WIP automatic markdown image display, may be prone to breaking
} }
-- Setup Navigator.nvim
require('Navigator').setup {
disable_on_zoom = true,
mux = 'auto', -- auto-detect tmux
}
-- Set up Navigator.nvim keybindings
vim.keymap.set({'n', 't'}, '<M-h>', '<CMD>NavigatorLeft<CR>')
vim.keymap.set({'n', 't'}, '<M-j>', '<CMD>NavigatorDown<CR>')
vim.keymap.set({'n', 't'}, '<M-k>', '<CMD>NavigatorUp<CR>')
vim.keymap.set({'n', 't'}, '<M-l>', '<CMD>NavigatorRight<CR>')
-- Disable Ctrl+V in nvim so Kitty can handle paste
vim.keymap.set({'n', 'v', 'i'}, '<C-v>', '<Nop>', {noremap = true, silent = true})
-- Pane resizing with Alt+Shift+hjkl (to match tmux)
vim.keymap.set('n', '<M-S-h>', '<Cmd>vertical resize -2<CR>', {silent = true})
vim.keymap.set('n', '<M-S-j>', '<Cmd>resize -2<CR>', {silent = true})
vim.keymap.set('n', '<M-S-k>', '<Cmd>resize +2<CR>', {silent = true})
vim.keymap.set('n', '<M-S-l>', '<Cmd>vertical resize +2<CR>', {silent = true})
EOF EOF
''; '';
@ -872,15 +997,23 @@ in
statix statix
nodePackages.typescript nodePackages.typescript
nodePackages.typescript-language-server nodePackages.typescript-language-server
nodePackages.bash-language-server
luajitPackages.lua-lsp luajitPackages.lua-lsp
fennel-ls fennel-ls
nixfmt-rfc-style
shfmt
zk
]; ];
plugins = with pkgs.vimPlugins // customPlugins; [ plugins = with pkgs.vimPlugins // customPlugins; [
# ui # ui
lualine-nvim lualine-nvim
fzf-vim fzf-vim
nerdtree neo-tree-nvim
outline-nvim
noice-nvim
nui-nvim
trouble-nvim
neovim-ayu neovim-ayu
rainbow_parentheses-vim rainbow_parentheses-vim
vim-surround vim-surround
@ -917,10 +1050,10 @@ in
taskwiki taskwiki
vim-zettel vim-zettel
hologram-nvim hologram-nvim
zk-nvim
# lsp stuff # lsp stuff
# nvim-lint # nvim-lint
null-ls-nvim
nvim-lspconfig nvim-lspconfig
nvim-cmp nvim-cmp
cmp-nvim-lsp cmp-nvim-lsp
@ -933,7 +1066,7 @@ in
nvim-autopairs nvim-autopairs
cmp_luasnip cmp_luasnip
luasnip luasnip
lsp-format conform-nvim
friendly-snippets friendly-snippets
lspkind-nvim lspkind-nvim
@ -953,6 +1086,7 @@ in
nvim-luapad nvim-luapad
scnvim scnvim
leap leap
Navigator-nvim
vim-beancount vim-beancount
# vimtex # vimtex
# custom # custom
@ -961,7 +1095,7 @@ in
# vim-processing # vim-processing
]; ];
withPython3 = true; withPython3 = true;
extraPython3Packages = pkgs: with pkgs; [ tasklib six ]; extraPython3Packages = pkgs: with pkgs; [ tasklib six packaging ];
vimAlias = true; vimAlias = true;
}; };
} }

View file

@ -1,3 +1,3 @@
{ {
home.file.".tmux.confg".source = ./tmux.conf home.file.".tmux.conf".source = ./tmux.conf;
} }

View file

@ -57,3 +57,29 @@ setw -g window-status-bell-style 'fg=yellow bg=green bold'
# messages # messages
set -g message-style 'fg=yellow bg=green bold' set -g message-style 'fg=yellow bg=green bold'
# Unbind Ctrl+V so it passes through to Kitty for paste
unbind C-v
# Vim-aware pane navigation with Alt+hjkl
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n M-h if-shell "$is_vim" "send-keys M-h" "select-pane -L"
bind-key -n M-j if-shell "$is_vim" "send-keys M-j" "select-pane -D"
bind-key -n M-k if-shell "$is_vim" "send-keys M-k" "select-pane -U"
bind-key -n M-l if-shell "$is_vim" "send-keys M-l" "select-pane -R"
# Window navigation with Alt+n/p
bind-key -n M-n next-window
bind-key -n M-p previous-window
# Pane resizing with Alt+Shift+hjkl
bind-key -n M-S-h resize-pane -L 2
bind-key -n M-S-j resize-pane -D 2
bind-key -n M-S-k resize-pane -U 2
bind-key -n M-S-l resize-pane -R 2
# Copy mode setup
bind v copy-mode
setw -g mode-keys vi
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-pipe-and-cancel 'xclip -in -selection clipboard'

View file

@ -66,6 +66,10 @@
address = "192.168.1.240"; address = "192.168.1.240";
prefixLength = 24; prefixLength = 24;
}]; }];
ipv6.addresses = [{
address = "fd7d:587a:4300:1::240";
prefixLength = 64;
}];
ipv4.routes = [{ address = "192.168.1.0"; prefixLength = 24; via = "192.168.1.1"; }]; ipv4.routes = [{ address = "192.168.1.0"; prefixLength = 24; via = "192.168.1.1"; }];
useDHCP = false; useDHCP = false;
}; };

View file

@ -18,6 +18,7 @@
../profiles/wallabag ../profiles/wallabag
../profiles/finance ../profiles/finance
../profiles/sync/website ../profiles/sync/website
../profiles/sync/music
../profiles/grasp ../profiles/grasp
# ../profiles/archivebox # ../profiles/archivebox
# ../profiles/woodpecker-agent # ../profiles/woodpecker-agent
@ -50,21 +51,16 @@
# "/home/anish/usr/nonfiction" # syncthing # "/home/anish/usr/nonfiction" # syncthing
"/home/anish/usr/finance" # beancount "/home/anish/usr/finance" # beancount
"/mnt/two/postgres" # sealight postgres backups TODO remove once moved to capsul "/mnt/two/postgres" # sealight postgres backups TODO remove once moved to capsul
"/mnt/two/photos"
"/mnt/two/music"
]; ];
# seafile # seafile
}; };
environment.systemPackages = with pkgs; [ lm_sensors ];
services.nginx.virtualHosts."mast.mossnet.lan" = { hardware.fancontrol = {
enableACME = false; enable = false;
forceSSL = false; config = '''';
locations."/" = {
extraConfig = ''
proxy_pass http://localhost:5731/;
proxy_set_header X-Forwarded-Host $host;
'';
};
}; };
age.secrets.box-wg.file = "${self}/secrets/box-wg.age"; age.secrets.box-wg.file = "${self}/secrets/box-wg.age";

View file

@ -38,8 +38,7 @@
pkgs.lib.mkForce [ ]; # Normally ["network-online.target"] pkgs.lib.mkForce [ ]; # Normally ["network-online.target"]
}; };
programs.gnupg.agent.enable = true;
programs.gnupg.agent.pinentryPackage = pkgs.pinentry-gnome3;
fileSystems."/mnt/ftp" = { fileSystems."/mnt/ftp" = {
device = "192.168.1.240:/home/ftp"; device = "192.168.1.240:/home/ftp";
@ -70,7 +69,7 @@
# lazy enable of ports necessary for KDE connect which is installed via cli home profile (for some reason?) # lazy enable of ports necessary for KDE connect which is installed via cli home profile (for some reason?)
networking.firewall = { networking.firewall = {
allowedTCPPorts = [ 22 ]; # allow ssh allowedTCPPorts = [ 22 4173 ]; # allow ssh
allowedTCPPortRanges = [{ allowedTCPPortRanges = [{
from = 1714; from = 1714;
to = 1764; to = 1764;
@ -94,7 +93,7 @@
mossnet.backup = { mossnet.backup = {
enable = true; enable = true;
name = "curve"; name = "curve";
paths = [ "/home/anish/usr" "/home/anish/.ssh" ]; paths = [ "/home/anish/usr" "/home/anish/.ssh" "/home/anish/.password-store/" ];
}; };
# enable adb # enable adb

View file

@ -31,20 +31,20 @@
}; };
# Reverse proxy for immich # Reverse proxy for immich
services.nginx.virtualHosts."photos.sealight.xyz" = { # services.nginx.virtualHosts."photos.sealight.xyz" = {
enableACME = true; # enableACME = true;
forceSSL = true; # forceSSL = true;
locations."/" = { # locations."/" = {
extraConfig = '' # extraConfig = ''
proxy_pass http://10.0.69.4:8567; # proxy_pass http://10.0.69.4:8567;
proxy_set_header Host $host; # proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # proxy_set_header X-Forwarded-Proto $scheme;
''; # '';
}; # };
}; # };
services.postgresql.package = pkgs.postgresql_15; services.postgresql.package = pkgs.postgresql_15;
services.postgresqlBackup = { services.postgresqlBackup = {

View file

@ -32,7 +32,9 @@ in
}; };
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
pinentry-rofi
pinentry-gnome3 pinentry-gnome3
pinentry-gtk2
cached-nix-shell cached-nix-shell
]; ];

View file

@ -38,7 +38,7 @@ in {
dbus = { dbus = {
enable = true; enable = true;
packages = [ pkgs.dconf ]; packages = [ pkgs.dconf pkgs.gcr ];
}; };
}; };
programs.dconf.enable = true; programs.dconf.enable = true;
@ -60,13 +60,14 @@ in {
#unstable.sublime-music #unstable.sublime-music
# olm-3.2.16 is now insecure # olm-3.2.16 is now insecure
# some reason I can't set insecure packages that will be respected # some reason I can't set insecure packages that will be respected
# nheko nheko
unstable.signal-desktop unstable.signal-desktop
unstable.tuba unstable.tuba
unstable.newsflash unstable.newsflash
unstable.liferea unstable.liferea
unstable.gh unstable.gh
unstable.flyctl unstable.flyctl
unstable.sublime-music
kooha kooha
light light
@ -219,6 +220,8 @@ in {
siji siji
font-awesome font-awesome
proggyfonts proggyfonts
(nerdfonts.override { fonts = [ "FiraCode" "DroidSansMono" "Iosevka" ]; }) nerd-fonts.fira-code
nerd-fonts.droid-sans-mono
nerd-fonts.iosevka
]; ];
} }

View file

@ -53,9 +53,9 @@ in {
# private-address = "192.168.1.0/24"; # private-address = "192.168.1.0/24";
cache-min-ttl = 0; cache-min-ttl = 0;
serve-expired = "yes"; serve-expired = "yes";
interface = [ "0.0.0.0" ]; interface = [ "0.0.0.0" "::" ];
access-control = access-control =
[ "127.0.0.0/8 allow" "192.168.1.0/24 allow" "10.0.69.0/24 allow" ]; [ "127.0.0.0/8 allow" "192.168.1.0/24 allow" "10.0.69.0/24 allow" "::1 allow" "fd7d:587a:4300:1::/64 allow" ];
access-control-view = "10.0.69.0/24 wireguard"; access-control-view = "10.0.69.0/24 wireguard";
# so-reuseport = "yes"; # so-reuseport = "yes";
tls-upstream = "yes"; tls-upstream = "yes";

View file

@ -1,11 +1,14 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
{ {
environment.systemPackages = [ pkgs.ffmpeg ];
mossnet.gonic.enable = true; mossnet.gonic.enable = true;
mossnet.gonic.settings = '' mossnet.gonic.settings = ''
music-path /mnt/two/music/ music-path /mnt/two/music/
podcast-path /data/podcasts podcast-path /data/podcasts
cache-path /data/cache cache-path /data/cache
playlists-path /data/playlists playlists-path /data/playlists
transcode-cache-size 1000
transcode-eject-interval 1440
''; '';
mossnet.gonic.user = "gonic"; mossnet.gonic.user = "gonic";
mossnet.gonic.group = "audio"; mossnet.gonic.group = "audio";

View file

@ -1,4 +1,4 @@
{ ... }: { pkgs, config, ... }:
{ {
services.immich = { services.immich = {
enable = true; enable = true;
@ -7,16 +7,23 @@
}; };
host = "0.0.0.0"; host = "0.0.0.0";
port = 8567; port = 8567;
mediaLocation = "/data/photos"; mediaLocation = "/mnt/two/photos";
externalDomain = "https://photos.sealight.xyz"; openFirewall = true;
settings.server.externalDomain = "https://photos.sealight.xyz";
}; };
services.nginx.virtualHosts."photos.mossnet.lan" = { services.nginx.virtualHosts."photos.mossnet.lan" = {
enableACME = false; enableACME = false;
forceSSL = false; forceSSL = false;
locations."/" = { locations."/" = {
proxyPass = "http://127.0.0.1:${toString config.services.immich.port}";
proxyWebsockets = true;
recommendedProxySettings = true;
extraConfig = '' extraConfig = ''
proxy_pass http://127.0.0.1:8567/; client_max_body_size 50000M;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout 600s;
''; '';
}; };
}; };

View file

@ -2,10 +2,10 @@
{ {
services.jackett = { services.jackett = {
enable = true; enable = true;
host = "0.0.0.0";
port = 8011; port = 8011;
user = "jackett"; user = "jackett";
group = "transmission"; group = "transmission";
package = pkgs.unstable.jackett;
}; };
services.nginx.virtualHosts."jackett.mossnet.lan" = { services.nginx.virtualHosts."jackett.mossnet.lan" = {
enableACME = false; enableACME = false;
@ -19,10 +19,8 @@
}; };
services.lidarr = { services.lidarr = {
enable = true; enable = true;
host = "0.0.0.0"; user = "headphones";
port = 8012; group = "audio";
user = "lidarr";
group = "transmission";
}; };
services.nginx.virtualHosts."lidarr.mossnet.lan" = { services.nginx.virtualHosts."lidarr.mossnet.lan" = {
enableACME = false; enableACME = false;
@ -30,7 +28,7 @@
locations."/" = { locations."/" = {
extraConfig = '' extraConfig = ''
proxy_pass http://127.0.0.1:8012/; proxy_pass http://127.0.0.1:8686/;
''; '';
}; };
}; };

View file

@ -47,9 +47,9 @@
# The registration file is automatically generated after starting the appservice for the first time. # The registration file is automatically generated after starting the appservice for the first time.
# cp /var/lib/matrix-appservice-discord/discord-registration.yaml /var/lib/matrix-synapse/ # cp /var/lib/matrix-appservice-discord/discord-registration.yaml /var/lib/matrix-synapse/
# chown matrix-synapse:matrix-synapse /var/lib/matrix-synapse/discord-registration.yaml # chown matrix-synapse:matrix-synapse /var/lib/matrix-synapse/discord-registration.yaml
"/var/lib/matrix-synapse/telegram-registration.yaml" # "/var/lib/matrix-synapse/telegram-registration.yaml"
"/var/lib/matrix-synapse/signal-registration.yaml" "/var/lib/matrix-synapse/signal-registration.yaml"
"/var/lib/matrix-as-whatsapp/whatsapp-registration.yaml" #"/var/lib/matrix-as-whatsapp/whatsapp-registration.yaml"
"/var/lib/matrix-as-discord/discord-registration.yaml" "/var/lib/matrix-as-discord/discord-registration.yaml"
# "/var/lib/matrix-synapse/slack-registration.yaml" # "/var/lib/matrix-synapse/slack-registration.yaml"
# "/var/lib/matrix-synapse/discord-registration.yaml" # "/var/lib/matrix-synapse/discord-registration.yaml"

View file

@ -2,17 +2,17 @@
{ {
# Mautrix-signal settings # Mautrix-signal settings
services.signald.enable = true; # services.signald.enable = true;
systemd.services.matrix-as-signal = { # systemd.services.matrix-as-signal = {
requires = [ "signald.service" ]; # requires = [ "signald.service" ];
after = [ "signald.service" ]; # after = [ "signald.service" ];
unitConfig = { # unitConfig = {
JoinsNamespaceOf = "signald.service"; # JoinsNamespaceOf = "signald.service";
}; # };
path = [ # path = [
pkgs.ffmpeg # voice messages need `ffmpeg` # pkgs.ffmpeg # voice messages need `ffmpeg`
]; # ];
}; # };
services.matrix-appservices = { services.matrix-appservices = {
addRegistrationFiles = false; addRegistrationFiles = false;
@ -25,27 +25,27 @@
# package = pkgs.mautrix-whatsapp; # package = pkgs.mautrix-whatsapp;
# }; # };
# discord = { discord = {
# port = 29188; port = 29188;
# format = "mautrix-go"; format = "mautrix-go";
# package = pkgs.unstable.mautrix-discord; package = pkgs.mautrix-discord;
# }; };
# signal = { # signal = {
# port = 29184; # port = 29184;
# format = "mautrix-python"; # format = "mautrix-python";
# package = pkgs.unstable.mautrix-signal; # package = pkgs.mautrix-signal;
# serviceConfig = { # serviceConfig = {
# StateDirectory = [ "matrix-as-signal" "signald" ]; # # StateDirectory = [ "matrix-as-signal" "signald" ];
# SupplementaryGroups = [ "signald" ]; # # SupplementaryGroups = [ "signald" ];
# TimeoutStopSec = 1; # work around the service ignoring SIGTERM, see https://gitlab.com/coffeetables/nix-matrix-appservices/-/issues/12 # TimeoutStopSec = 1; # work around the service ignoring SIGTERM, see https://gitlab.com/coffeetables/nix-matrix-appservices/-/issues/12
# User = lib.mkForce config.services.signald.user; # # User = lib.mkForce config.services.signald.user;
# Group = lib.mkForce config.services.signald.group; # # Group = lib.mkForce config.services.signald.group;
# };
# settings.signal = {
# socket_path = config.services.signald.socketPath;
# outgoing_attachment_dir = "/var/lib/signald/tmp";
# }; # };
# # settings.signal = {
# # socket_path = config.services.signald.socketPath;
# # outgoing_attachment_dir = "/var/lib/signald/tmp";
# # };
# }; # };
}; };
}; };

View file

@ -22,7 +22,8 @@
bespokesynth bespokesynth
lsp-plugins lsp-plugins
helio-workstation helio-workstation
projectm # milkdrop visualizer # projectm # milkdrop visualizer
# i think it's projectm-sdl-cpp now
# DAWs # DAWs
# ardour # ardour
@ -30,7 +31,7 @@
# renoise # renoise
]; ];
hardware.pulseaudio.enable = lib.mkForce false; services.pulseaudio.enable = false;
security.rtkit.enable = false; security.rtkit.enable = false;
services.pipewire = { services.pipewire = {

View file

@ -5,6 +5,7 @@
package = pkgs.radicale; package = pkgs.radicale;
settings = { settings = {
server.hosts = [ "0.0.0.0:5252" ]; server.hosts = [ "0.0.0.0:5252" ];
auth.type = "none";
}; };
}; };

View file

@ -5,16 +5,19 @@
serviceConfig.Type = "oneshot"; serviceConfig.Type = "oneshot";
path = [ path = [
pkgs.coreutils pkgs.coreutils
pkgs.openssh
pkgs.gawk
pkgs.rsync pkgs.rsync
pkgs.beets
]; ];
script = builtins.readFile ./get-music.sh; script = builtins.readFile ./get-music.sh;
serviceConfig = { serviceConfig = {
User = "anish"; User = "anish";
}; };
}; };
systemd.timers.get-music-timer = { systemd.timers.get-music-sync = {
wantedBy = [ "timers.target" ]; wantedBy = [ "timers.target" ];
partOf = [ "get-music-sync.service" ]; partOf = [ "get-music-sync.service" ];
timerConfig.OnCalendar = [ "daily" ]; timerConfig.OnCalendar = [ "hourly" ];
}; };
} }

64
hosts/profiles/sync/music/get-music.sh Normal file → Executable file
View file

@ -1,9 +1,61 @@
#!/usr/bin/env bash #!/usr/bin/env bash
rsync -r --ignore-existing --log-file=/data/incoming/download-log hypercube@talos.feralhosting.com:private/transmission/data/* /data/incoming
# you need to set defaults for beets set -euo pipefail
# if already imported -> Skip
# Auto accept changes
# also install it lmao
#beet import /data/incoming
REMOTE_HOST="aynish@talos.feralhosting.com"
REMOTE_PATH="private/transmission/data/"
LOCAL_PATH="/mnt/two/incoming"
TRACKING_FILE="/mnt/two/incoming/.downloaded_albums"
LOG_FILE="/mnt/two/incoming/download-log"
# Create tracking file if it doesn't exist
touch "$TRACKING_FILE"
# Get list of albums on remote server
echo "$(date): Checking for new albums on seedbox..." >>"$LOG_FILE"
REMOTE_ALBUMS=$(rsync --dry-run --list-only "$REMOTE_HOST:$REMOTE_PATH" | grep '^d' | awk '{$1=$2=$3=$4=""; sub(/^ +/, ""); print}' | grep -v '^\.') || true
if [ -z "$REMOTE_ALBUMS" ]; then
echo "$(date): No albums found on remote server" >>"$LOG_FILE"
exit 0
fi
# Check each album against tracking file
NEW_ALBUMS=""
while IFS= read -r album; do
if [ -n "$album" ] && ! grep -qF "$album" "$TRACKING_FILE"; then
NEW_ALBUMS="$NEW_ALBUMS$album\n"
echo "$(date): Found new album: $album" >>"$LOG_FILE"
fi
done <<<"$REMOTE_ALBUMS"
if [ -z "$NEW_ALBUMS" ]; then
echo "$(date): No new albums to download" >>"$LOG_FILE"
exit 0
fi
# Download new albums only
echo "$(date): Starting download of new albums..." >>"$LOG_FILE"
while IFS= read -r album; do
if [ -n "$album" ]; then
echo "$(date): Downloading $album" >>"$LOG_FILE"
if rsync -r --log-file="$LOG_FILE" "$REMOTE_HOST:$REMOTE_PATH$album/" "$LOCAL_PATH/$album/"; then
echo "$album" >>"$TRACKING_FILE"
echo "$(date): Successfully downloaded $album" >>"$LOG_FILE"
# Import to beets
echo "$(date): Importing $album to beets..." >>"$LOG_FILE"
# Set umask to allow group read/write access
umask 002
if beet -p fetchart import -m -l /home/anish/music.log -q -g "$LOCAL_PATH/$album"; then
echo "$(date): Successfully imported $album to beets" >>"$LOG_FILE"
else
echo "$(date): Failed to import $album to beets" >>"$LOG_FILE"
fi
else
echo "$(date): Failed to download $album" >>"$LOG_FILE"
fi
fi
done <<<"$(echo -e "$NEW_ALBUMS")"
echo "$(date): Music sync completed" >>"$LOG_FILE"

View file

@ -1,5 +1,6 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
environment.systemPackages = [ pkgs.beets ];
services.transmission = { services.transmission = {
enable = true; enable = true;
settings = { settings = {
@ -9,11 +10,10 @@
script-torrent-done-enabled = true; script-torrent-done-enabled = true;
# Normally, I would write this into the homedir with home-manager # Normally, I would write this into the homedir with home-manager
# And explictly set the dir to be the output of the home-manager location # And explictly set the dir to be the output of the home-manager location
# But this seems better, if it'll work?
script-torrent-done-filename = pkgs.writeShellScript "beet-import.sh" '' script-torrent-done-filename = pkgs.writeShellScript "beet-import.sh" ''
#!/usr/bin/env bash #!/usr/bin/env bash
beet import -ql "$TR_TORRENT_DIR" beet -p fetchart import -l /home/anish/music.log -q -g "$TR_TORRENT_DIR"
''; '';
rpc-url = "/transmission/rpc/"; rpc-url = "/transmission/rpc/";
download-dir = "/mnt/two/new-music"; download-dir = "/mnt/two/new-music";

View file

@ -57,7 +57,7 @@ in {
#... #...
}; };
serviceConfig = { serviceConfig = {
ExecStart = "${pkgs.gonic}/bin/gonic -config-path /etc/gonic/config"; ExecStart = "${pkgs.gonic}/bin/gonic -config-path /etc/gonic/config -scan-watcher-enabled -scan-interval 600";
WorkingDirectory = dataFolder; WorkingDirectory = dataFolder;
TimeoutStopSec = "20"; TimeoutStopSec = "20";
KillMode = "process"; KillMode = "process";

View file

@ -11,7 +11,16 @@
propagatedBuildInputs = prevAttrs.propagatedBuildInputs ++ [ final.python3.pkgs.jsonschema ]; # allow kobo sync stuff propagatedBuildInputs = prevAttrs.propagatedBuildInputs ++ [ final.python3.pkgs.jsonschema ]; # allow kobo sync stuff
}); });
mautrix-signal = prev.mautrix-signal.overrideAttrs (prevAttrs: rec { mautrix-signal = prev.mautrix-signal.overrideAttrs (prevAttrs: rec {
buildInputs = prevAttrs.propagatedBuildInputs ++ [ final.python3.pkgs.aiosqlite ]; # We're using sqlite and upstream doesn't package this dependency buildInputs = prevAttrs.buildInputs ++ [ final.python3.pkgs.aiosqlite ]; # We're using sqlite and upstream doesn't package this dependency
withGoolm = true;
});
# headphones is not very stable...
# this is fixed in newer commits, but no release has gone out
# patching whitespace with sed is insane
headphones = prev.headphones.overrideAttrs (prevAttrs: rec {
patchPhase = ''
sed -i '1395s/^\([[:space:]]*\).*/\1"cat": "3000",/' headphones/searcher.py
'';
}); });
wallabag = prev.wallabag.overrideAttrs (attrs: { wallabag = prev.wallabag.overrideAttrs (attrs: {
@ -23,6 +32,14 @@
]; ];
}); });
olm = prev.olm.overrideAttrs (attrs: {
knownVulnerabilities = [];
});
mautrix-discord = prev.mautrix-discord.overrideAttrs (attrs: rec {
license = "";
});
# Need to do server and agent too, maybe # Need to do server and agent too, maybe
# woodpecker-cli-next = # woodpecker-cli-next =
# let # let

View file

@ -1,29 +0,0 @@
{ lib, buildGoModule, fetchFromGitHub, olm }:
buildGoModule rec {
pname = "mautrix-discord";
version = "unstable-2022-11-04";
src = fetchFromGitHub {
owner = "mautrix";
repo = "discord";
rev = "f53975cc91e3c643a722adf0d3e0dfb98d0127a2";
hash = "sha256-xUALcN5oQfwC6gmOeygCkOAXJrJzNitBxHRFAKKgFvE=";
};
buildInputs = [ olm ];
vendorHash = "sha256-yday2mSnPwuhXWkCG4XY7qoBl3DXHcSvzBoZbjgYz/c=";
ldflags = [ "-s" "-w" ]; # https://github.com/NixOS/nixpkgs/issues/177698
doCheck = false; # No tests available
meta = with lib; {
homepage = "https://go.mau.fi/mautrix-discord";
description = "Matrix to Discord hybrid puppeting/relaybot bridge";
license = licenses.agpl3Plus;
maintainers = with maintainers; [ robin ];
};
}