Compare commits

...

8 commits

8 changed files with 209 additions and 163 deletions

View file

@ -788,10 +788,29 @@ This is meant to be an helper to be called from the window manager."
"Return the org datestring when a node was created (obtained from the filename)" "Return the org datestring when a node was created (obtained from the filename)"
(format "<%s>" (file-name-sans-extension (file-name-nondirectory (org-roam-node-file node))))) (format "<%s>" (file-name-sans-extension (file-name-nondirectory (org-roam-node-file node)))))
(defun ccr/org-roam-spent-hours (client) (org-roam-ql-defpred
'date-range
"Check if node was created in given time range"
#'org-roam-node-date
#'(lambda (node-date start-date end-date)
(let ((node-date (condition-case nil
;; if the entry is not from the journal (i.e. the filename is not something like "2024-10-10.org")
;; then it's always discarded (the epoch time is given to it)
(encode-time (org-parse-time-string node-date))
(error (encode-time (org-parse-time-string "<1970-01-01>")))))
(start-date (encode-time (org-parse-time-string start-date)))
(end-date (encode-time (org-parse-time-string end-date))))
(and (time-less-p start-date node-date)
(time-less-p node-date end-date)))
))
(defun ccr/org-roam-spent-hours (client &optional date-start date-end)
"Return the total spent hours on something (usually a client)" "Return the total spent hours on something (usually a client)"
(apply #'+(mapcar #'org-roam-node-spent (org-roam-ql-nodes `(tags ,client "billable"))))) (let* ((query-tags `(tags ,client "billable"))
) (query (if (and date-start date-end)
`(and ,query-tags (date-range ,date-start ,date-end))
query-tags)))
(apply #'+(mapcar #'org-roam-node-spent (org-roam-ql-nodes query))))))
(use-package org-roam-ql (use-package org-roam-ql
:after org-roam :after org-roam

View file

@ -22,183 +22,183 @@
); );
}; };
home.file.".config/aerc/stylesets" = # home.file.".config/aerc/stylesets" =
let # let
catppuccin-aerc = pkgs.fetchFromGitHub { # catppuccin-aerc = pkgs.fetchFromGitHub {
owner = "catppuccin"; # owner = "catppuccin";
repo = "aerc"; # repo = "aerc";
rev = "ca404a9f2d125ef12db40db663d43c9d94116a05"; # rev = "ca404a9f2d125ef12db40db663d43c9d94116a05";
hash = "sha256-OWIkHsKFts/zkrDUtbBPXHVSrHL/F0v3LB1rnlFAKmE="; # hash = "sha256-OWIkHsKFts/zkrDUtbBPXHVSrHL/F0v3LB1rnlFAKmE=";
}; # };
in # in
{ # {
source = "${catppuccin-aerc}/dist"; # source = "${catppuccin-aerc}/dist";
recursive = true; # recursive = true;
}; # };
programs.aerc = { # programs.aerc = {
enable = true; # enable = true;
extraBinds = { # extraBinds = {
global = { # global = {
"<C-p>" = ":prev-tab<Enter>"; # "<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>"; # "<C-n>" = ":next-tab<Enter>";
"?" = ":help keys<Enter>"; # "?" = ":help keys<Enter>";
}; # };
messages = { # messages = {
"h" = ":prev-tab<Enter>"; # "h" = ":prev-tab<Enter>";
"l" = ":next-tab<Enter>"; # "l" = ":next-tab<Enter>";
"j" = ":next<Enter>"; # "j" = ":next<Enter>";
"<Down>" = ":next<Enter>"; # "<Down>" = ":next<Enter>";
"<C-d>" = ":next 50%<Enter>"; # "<C-d>" = ":next 50%<Enter>";
"<C-f>" = ":next 100%<Enter>"; # "<C-f>" = ":next 100%<Enter>";
"<PgDn>" = ":next 100%<Enter>"; # "<PgDn>" = ":next 100%<Enter>";
"k" = ":prev<Enter>"; # "k" = ":prev<Enter>";
"<Up>" = ":prev<Enter>"; # "<Up>" = ":prev<Enter>";
"<C-u>" = ":prev 50%<Enter>"; # "<C-u>" = ":prev 50%<Enter>";
"<C-b>" = ":prev 100%<Enter>"; # "<C-b>" = ":prev 100%<Enter>";
"<PgUp>" = ":prev 100%<Enter>"; # "<PgUp>" = ":prev 100%<Enter>";
"g" = ":select 0<Enter>"; # "g" = ":select 0<Enter>";
"G" = ":select -1<Enter>"; # "G" = ":select -1<Enter>";
"J" = ":next-folder<Enter>"; # "J" = ":next-folder<Enter>";
"K" = ":prev-folder<Enter>"; # "K" = ":prev-folder<Enter>";
"H" = ":collapse-folder<Enter>"; # "H" = ":collapse-folder<Enter>";
"L" = ":expand-folder<Enter>"; # "L" = ":expand-folder<Enter>";
"v" = ":mark -t<Enter>"; # "v" = ":mark -t<Enter>";
"x" = ":mark -t<Enter>:next<Enter>"; # "x" = ":mark -t<Enter>:next<Enter>";
"V" = ":mark -v<Enter>"; # "V" = ":mark -v<Enter>";
"T" = ":toggle-threads<Enter>"; # "T" = ":toggle-threads<Enter>";
"<Enter>" = ":view<Enter>"; # "<Enter>" = ":view<Enter>";
"d" = ":prompt 'Really delete this message?' 'delete-message'<Enter>"; # "d" = ":prompt 'Really delete this message?' 'delete-message'<Enter>";
"D" = ":delete<Enter>"; # "D" = ":delete<Enter>";
"A" = ":archive flat<Enter>"; # "A" = ":archive flat<Enter>";
"C" = ":compose<Enter>"; # "C" = ":compose<Enter>";
"rr" = ":reply -a<Enter>"; # "rr" = ":reply -a<Enter>";
"rq" = ":reply -aq<Enter>"; # "rq" = ":reply -aq<Enter>";
"Rr" = ":reply<Enter>"; # "Rr" = ":reply<Enter>";
"Rq" = ":reply -q<Enter>"; # "Rq" = ":reply -q<Enter>";
"c" = ":cf<space>"; # "c" = ":cf<space>";
"$" = ":term<space>"; # "$" = ":term<space>";
"!" = ":term<space>"; # "!" = ":term<space>";
"|" = ":pipe<space>"; # "|" = ":pipe<space>";
"/" = ":search<space>"; # "/" = ":search<space>";
"\\" = ":filter<space>"; # "\\" = ":filter<space>";
"n" = ":next-result<Enter>"; # "n" = ":next-result<Enter>";
"N" = ":prev-result<Enter>"; # "N" = ":prev-result<Enter>";
"<Esc>" = ":clear<Enter>"; # "<Esc>" = ":clear<Enter>";
}; # };
"messages:folder=Drafts" = { # "messages:folder=Drafts" = {
"<Enter>" = ":recall<Enter>"; # "<Enter>" = ":recall<Enter>";
}; # };
view = { # view = {
"/" = ":toggle-key-passthrough<Enter>/"; # "/" = ":toggle-key-passthrough<Enter>/";
"q" = ":close<Enter>"; # "q" = ":close<Enter>";
"O" = ":open<Enter>"; # "O" = ":open<Enter>";
"S" = ":save<space>"; # "S" = ":save<space>";
"|" = ":pipe<space>"; # "|" = ":pipe<space>";
"D" = ":delete<Enter>"; # "D" = ":delete<Enter>";
"A" = ":archive flat<Enter>"; # "A" = ":archive flat<Enter>";
"<C-l>" = ":open-link <space>"; # "<C-l>" = ":open-link <space>";
"f" = ":forward<Enter>"; # "f" = ":forward<Enter>";
"rr" = ":reply -a<Enter>"; # "rr" = ":reply -a<Enter>";
"rq" = ":reply -aq<Enter>"; # "rq" = ":reply -aq<Enter>";
"Rr" = ":reply<Enter>"; # "Rr" = ":reply<Enter>";
"Rq" = ":reply -q<Enter>"; # "Rq" = ":reply -q<Enter>";
"H" = ":toggle-headers<Enter>"; # "H" = ":toggle-headers<Enter>";
"<C-k>" = ":prev-part<Enter>"; # "<C-k>" = ":prev-part<Enter>";
"<C-j>" = ":next-part<Enter>"; # "<C-j>" = ":next-part<Enter>";
"J" = ":next<Enter>"; # "J" = ":next<Enter>";
"K" = ":prev<Enter>"; # "K" = ":prev<Enter>";
}; # };
"view::passthrough" = { # "view::passthrough" = {
"$noinherit" = true; # "$noinherit" = true;
"$ex" = "<C-x>"; # "$ex" = "<C-x>";
"<Esc>" = ":toggle-key-passthrough<Enter>"; # "<Esc>" = ":toggle-key-passthrough<Enter>";
}; # };
compose = { # compose = {
"$noinherit" = "true"; # "$noinherit" = "true";
"$ex" = "<C-x>"; # "$ex" = "<C-x>";
"<C-k>" = ":prev-field<Enter>"; # "<C-k>" = ":prev-field<Enter>";
"<C-j>" = ":next-field<Enter>"; # "<C-j>" = ":next-field<Enter>";
"<A-p>" = ":switch-account -p<Enter>"; # "<A-p>" = ":switch-account -p<Enter>";
"<A-n>" = ":switch-account -n<Enter>"; # "<A-n>" = ":switch-account -n<Enter>";
"<tab>" = ":next-field<Enter>"; # "<tab>" = ":next-field<Enter>";
"<C-p>" = ":prev-tab<Enter>"; # "<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>"; # "<C-n>" = ":next-tab<Enter>";
}; # };
"compose::editor" = { # "compose::editor" = {
"$noinherit" = "true"; # "$noinherit" = "true";
"$ex" = "<C-x>"; # "$ex" = "<C-x>";
"<C-k>" = ":prev-field<Enter>"; # "<C-k>" = ":prev-field<Enter>";
"<C-j>" = ":next-field<Enter>"; # "<C-j>" = ":next-field<Enter>";
"<C-p>" = ":prev-tab<Enter>"; # "<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>"; # "<C-n>" = ":next-tab<Enter>";
}; # };
"compose::review" = { # "compose::review" = {
"y" = ":send<Enter>"; # "y" = ":send<Enter>";
"n" = ":abort<Enter>"; # "n" = ":abort<Enter>";
"p" = ":postpone<Enter>"; # "p" = ":postpone<Enter>";
"q" = ":choose -o d discard abort -o p postpone postpone<Enter>"; # "q" = ":choose -o d discard abort -o p postpone postpone<Enter>";
"e" = ":edit<Enter>"; # "e" = ":edit<Enter>";
"a" = ":attach<space>"; # "a" = ":attach<space>";
"d" = ":detach<space>"; # "d" = ":detach<space>";
}; # };
terminal = { # terminal = {
"$noinherit" = "true"; # "$noinherit" = "true";
"$ex" = "<C-x>"; # "$ex" = "<C-x>";
"<C-p>" = ":prev-tab<Enter>"; # "<C-p>" = ":prev-tab<Enter>";
"<C-n>" = ":next-tab<Enter>"; # "<C-n>" = ":next-tab<Enter>";
}; # };
}; # };
extraConfig = { # extraConfig = {
general.unsafe-accounts-conf = true; # general.unsafe-accounts-conf = true;
ui = { # ui = {
styleset-name = "catppuccin-mocha"; # styleset-name = "catppuccin-mocha";
this-day-time-format = ''" 15:04"''; # this-day-time-format = ''" 15:04"'';
this-year-time-format = "Mon Jan 02 15:04"; # this-year-time-format = "Mon Jan 02 15:04";
timestamp-format = "2006-01-02 15:04"; # timestamp-format = "2006-01-02 15:04";
spinner = "[ ],[ ],[ ],[ ],[ ],[ ],[ ],[ ]"; # spinner = "[ ⡿ ],[ ⣟ ],[ ⣯ ],[ ⣷ ],[ ⣾ ],[ ⣽ ],[ ⣻ ],[ ⢿ ]";
border-char-vertical = ""; # border-char-vertical = "┃";
border-char-horizontal = ""; # border-char-horizontal = "━";
}; # };
viewer = { # viewer = {
always-show-mime = true; # always-show-mime = true;
}; # };
compose = { # compose = {
no-attachment-warning = "^[^>]*attach(ed|ment)"; # no-attachment-warning = "^[^>]*attach(ed|ment)";
}; # };
filters = { # filters = {
"text/plain" = "colorize"; # "text/plain" = "colorize";
"text/html" = "html"; # "text/html" = "html";
"text/calendar" = "calendar"; # "text/calendar" = "calendar";
"message/delivery-status" = "colorize"; # "message/delivery-status" = "colorize";
"message/rfc822" = "colorize"; # "message/rfc822" = "colorize";
"image/*" = "${pkgs.catimg}/bin/catimg -"; # "image/*" = "${pkgs.catimg}/bin/catimg -";
}; # };
}; # };
}; # };
programs.notmuch = { programs.notmuch = {
enable = true; enable = true;

View file

@ -10,7 +10,7 @@ lib.mkMerge [
server.enable = true; server.enable = true;
settings = { settings = {
main = { main = {
term = "xterm-256color"; term = "xterm-direct";
login-shell = "yes"; login-shell = "yes";
dpi-aware = "no"; dpi-aware = "no";
horizontal-letter-offset = "1"; horizontal-letter-offset = "1";

View file

@ -3,6 +3,7 @@
pkgs, pkgs,
age, age,
hostname, hostname,
config,
... ...
}: }:
{ {
@ -47,13 +48,19 @@
Install = { Install = {
WantedBy = [ "default.target" ]; WantedBy = [ "default.target" ];
}; };
Service.ExecStart = "${lib.getExe pkgs.atuin} daemon"; Service = {
# ExecStartPre = "${lib.getExe' pkgs.toybox "rm"} -f ${config.programs.atuin.settings.daemon.socket_path}";
ExecStart = "${lib.getExe pkgs.atuin} daemon";
};
}; };
programs.atuin = { programs.atuin = {
enable = true; enable = true;
settings = { settings = {
daemon.enabled = true; daemon = {
enabled = true;
socket_path = "/home/ccr/.local/share/atuin/atuin.sock"; # FIXME using ~ or $HOME doesn't work: https://github.com/atuinsh/atuin/issues/2289
};
auto_sync = true; auto_sync = true;
sync_frequency = "5m"; sync_frequency = "5m";
sync_address = "http://sisko.fleet:8889"; sync_address = "http://sisko.fleet:8889";

View file

@ -115,7 +115,6 @@
owner = "grafana"; owner = "grafana";
group = "forgejo"; group = "forgejo";
}; };
"garmin-collector-environment".owner = "garmin-collector";
}; };
}; };
}; };

View file

@ -25,7 +25,6 @@
"prometheus-exporters" "prometheus-exporters"
"loki" "loki"
"promtail" "promtail"
"garmin-collector"
"restic" "restic"
"atuin" "atuin"
"immich" "immich"
@ -63,10 +62,18 @@
]; ];
boot.kernelParams = [ boot.kernelParams = [
"earlycon"
"consoleblank=0"
"console=tty1" "console=tty1"
"console=ttyS0,1500000" "console=ttyS2,1500000"
]; ];
systemd.services."serial-getty@ttyS2" = {
enable = true;
wantedBy = [ "getty.target" ];
serviceConfig.restart = "always";
};
environment.persistence."/persist" = { environment.persistence."/persist" = {
hideMounts = true; hideMounts = true;
directories = [ directories = [

View file

@ -55,5 +55,19 @@ in
]; ];
timerConfig.OnCalendar = "daily"; timerConfig.OnCalendar = "daily";
timerConfig.RandomizedDelaySec = "1h"; timerConfig.RandomizedDelaySec = "1h";
backupPrepareCommand = ''
${pkgs.systemd}/bin/systemctl stop podman-*
${pkgs.systemd}/bin/systemctl stop syncthing
${pkgs.systemd}/bin/systemctl stop paperless-*
${pkgs.systemd}/bin/systemctl stop forgejo
${pkgs.systemd}/bin/systemctl stop home-assistant
'';
backupCleanupCommand = ''
${pkgs.systemd}/bin/systemctl start --no-block --all "podman-*"
${pkgs.systemd}/bin/systemctl start syncthing
${pkgs.systemd}/bin/systemctl start --no-block --all "paperless-*"
${pkgs.systemd}/bin/systemctl start forgejo
${pkgs.systemd}/bin/systemctl start home-assistant
'';
}; };
} }

View file

@ -20,7 +20,7 @@
]; ];
}; };
sisko = { sisko = {
id = "5JYQLMP-KNBMSOE-I452UDU-UTKPXJI-K27X2DI-MSCSRCG-6V54Q6U-NVGXPQA"; id = "TOC7QXZ-JLB4LYP-VNIJAV5-DCKVGFN-UE45SPX-PPFJHSG-O3UHFCK-2PEMAQ6";
addresses = [ addresses = [
"tcp://sisko.fleet" "tcp://sisko.fleet"
]; ];