From 0287e9d582cab56589d0d364f3f60646546b0815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20Schwarz=C3=A4ugl?= Date: Thu, 9 Oct 2025 02:39:26 +0200 Subject: [PATCH] feat[client]: add anki module --- SwarselSystems.org | 128 ++++++++++--- index.html | 170 +++++++++++++----- modules/home/common/anki-tray.nix | 8 +- modules/home/common/anki.nix | 64 +++++++ modules/home/common/packages.nix | 2 +- modules/nixos/common/home-manager-secrets.nix | 3 + profiles/home/personal/default.nix | 1 + secrets/general/secrets.yaml | 9 +- 8 files changed, 310 insertions(+), 75 deletions(-) create mode 100644 modules/home/common/anki.nix diff --git a/SwarselSystems.org b/SwarselSystems.org index 6de8c21..67399e8 100644 --- a/SwarselSystems.org +++ b/SwarselSystems.org @@ -4031,6 +4031,9 @@ in github-nixpkgs-review-token = { owner = mainUser; }; }) // (lib.optionalAttrs modules.emacs { emacs-radicale-pw = { owner = mainUser; }; + }) // (lib.optionalAttrs modules.anki { + anki-user = { owner = mainUser; }; + anki-pw = { owner = mainUser; }; }); templates = { authinfo = lib.mkIf modules.emacs { @@ -11203,7 +11206,7 @@ This holds packages that I can use as provided, or with small modifications (as # specifically needed for anki # mpv - anki-bin + # anki-bin # dirvish file previews fd @@ -13449,36 +13452,40 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi ***** anki service for tray #+begin_src nix-ts :tangle modules/home/common/anki-tray.nix - { lib, config, pkgs, ... }: - { - options.swarselmodules.anki-tray = lib.mkEnableOption "enable anki applet for tray"; - config = lib.mkIf config.swarselmodules.anki-tray { + { lib, config, ... }: + { + options.swarselmodules.anki-tray = lib.mkEnableOption "enable anki applet for tray"; + config = lib.mkIf config.swarselmodules.anki-tray { - systemd.user.services.anki-applet = { - Unit = { - Description = "Anki applet"; - Requires = [ "tray.target" ]; - After = [ - "graphical-session.target" - "tray.target" - ]; - PartOf = [ "graphical-session.target" ]; - }; + systemd.user.services.anki-applet = { + Unit = { + Description = "Anki applet"; + Requires = [ "tray.target" ]; + After = [ + "graphical-session.target" + "tray.target" + ]; + PartOf = [ "graphical-session.target" ]; + }; - Install = { - WantedBy = [ "graphical-session.target" ]; - }; + Install = { + WantedBy = [ "graphical-session.target" ]; + }; - Service = { - ExecStart = "${pkgs.anki-bin}/bin/anki-bin"; - }; - }; + Service = { + # ExecStart = "${lib.getExe config.programs.anki.package}"; + ExecStart = "/etc/profiles/per-user/swarsel/bin/anki"; + Environment = [ + "QT_QPA_PLATFORM=xcb" + ]; + }; + }; - }; - } + }; + } #+end_src -***** element service for tr +***** element service for tray #+begin_src nix-ts :tangle modules/home/common/element-tray.nix { lib, config, pkgs, ... }: @@ -14548,6 +14555,76 @@ This service changes the screen hue at night. I am not sure if that really does } #+end_src +**** Anki + + +#+begin_src nix-ts :tangle modules/home/common/anki.nix + { lib, config, pkgs, globals, nixosConfig ? config, ... }: + let + moduleName = "anki"; + inherit (config.swarselsystems) isPublic isNixos; + in + { + options.swarselmodules.${moduleName} = lib.mkEnableOption "enable ${moduleName} and settings"; + config = lib.mkIf config.swarselmodules.${moduleName} { + + sops = lib.mkIf (!isPublic && !isNixos) { + secrets = { + anki-user = { }; + anki-pw = { }; + }; + }; + + programs.anki = { + enable = true; + package = pkgs.anki; + hideBottomBar = true; + hideBottomBarMode = "always"; + hideTopBar = true; + hideTopBarMode = "always"; + reduceMotion = true; + spacebarRatesCard = true; + # videoDriver = "opengl"; + sync = { + autoSync = true; + syncMedia = true; + url = "https://${globals.services.ankisync.domain}"; + usernameFile = nixosConfig.sops.secrets.anki-user.path; + # this is not the password but the syncKey + # get it by logging in or out, saving preferences and then + # show details on the "settings wont be saved" dialog + keyFile = nixosConfig.sops.secrets.anki-pw.path; + }; + addons = + let + minimize-to-tray = pkgs.anki-utils.buildAnkiAddon + (finalAttrs: { + pname = "minimize-to-tray"; + version = "2.0.1"; + src = pkgs.fetchFromGitHub { + owner = "simgunz"; + repo = "anki21-addons_minimize-to-tray"; + rev = finalAttrs.version; + sparseCheckout = [ "src" ]; + hash = "sha256-xmvbIOfi9K0yEUtUNKtuvv2Vmqrkaa4Jie6J1s+FuqY="; + }; + sourceRoot = "${finalAttrs.src.name}/src"; + }); + in + [ + (minimize-to-tray.withConfig + { + config = { + hide_on_startup = "true"; + }; + }) + ]; + }; + }; + + } +#+end_src + *** Server :PROPERTIES: :CUSTOM_ID: h:b1a00339-6e9b-4ae4-b5dc-6fd5669a2ddb @@ -18020,6 +18097,7 @@ This holds modules that are to be used on most hosts. These are also the most im anki-tray = lib.mkDefault true; element-tray = lib.mkDefault true; vesktop-tray = lib.mkDefault true; + anki = lib.mkDefault true; }; }; diff --git a/index.html b/index.html index 11c1d62..82e30e2 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + SwarselSystems: NixOS + Emacs Configurationo @@ -443,8 +443,8 @@
  • 3.2.5.8. Hibernation
  • 3.2.5.9. BTRFS
  • 3.2.5.10. work
  • -
  • 3.2.5.11. microvm-host
  • -
  • 3.2.5.12. microvm-guest
  • +
  • 3.2.5.11. microvm-host
  • +
  • 3.2.5.12. microvm-guest
  • @@ -494,12 +494,12 @@
  • 3.3.1.30.3. Mako
  • 3.3.1.30.4. SwayOSD
  • 3.3.1.30.5. yubikey-touch-detector
  • -
  • 3.3.1.30.6. blueman-applet
  • -
  • 3.3.1.30.7. network-manager-applet
  • -
  • 3.3.1.30.8. obsidian service for tray
  • -
  • 3.3.1.30.9. anki service for tray
  • -
  • 3.3.1.30.10. element service for tr
  • -
  • 3.3.1.30.11. vesktop service for tray
  • +
  • 3.3.1.30.6. blueman-applet
  • +
  • 3.3.1.30.7. network-manager-applet
  • +
  • 3.3.1.30.8. obsidian service for tray
  • +
  • 3.3.1.30.9. anki service for tray
  • +
  • 3.3.1.30.10. element service for tray
  • +
  • 3.3.1.30.11. vesktop service for tray
  • 3.3.1.31. Sway
  • @@ -508,7 +508,8 @@
  • 3.3.1.34. gpg-agent
  • 3.3.1.35. gammastep
  • 3.3.1.36. Spicetify
  • -
  • 3.3.1.37. Obsidian
  • +
  • 3.3.1.37. Obsidian
  • +
  • 3.3.1.38. Anki
  • 3.3.2. Server @@ -573,7 +574,7 @@
  • 3.5.31. swarsel-build
  • 3.5.32. swarsel-instantiate
  • 3.5.33. sshrm
  • -
  • 3.5.34. endme
  • +
  • 3.5.34. endme
  • 3.6. Profiles @@ -582,7 +583,7 @@ @@ -2592,7 +2593,7 @@ in }; }; - swarsel-nix = final: prev: { + swarsel-nix = _: prev: { swarsel-nix = import inputs.swarsel-nix { pkgs = prev; }; @@ -5153,6 +5154,9 @@ in github-nixpkgs-review-token = { owner = mainUser; }; }) // (lib.optionalAttrs modules.emacs { emacs-radicale-pw = { owner = mainUser; }; + }) // (lib.optionalAttrs modules.anki { + anki-user = { owner = mainUser; }; + anki-pw = { owner = mainUser; }; }); templates = { authinfo = lib.mkIf modules.emacs { @@ -12099,8 +12103,8 @@ in -
    -
    3.2.5.11. microvm-host
    +
    +
    3.2.5.11. microvm-host

    Some standard options that should be set for every microvm host. @@ -12126,8 +12130,8 @@ Some standard options that should be set for every microvm host.

    -
    -
    3.2.5.12. microvm-guest
    +
    +
    3.2.5.12. microvm-guest

    Some standard options that should be set vor every microvm guest. We set the default @@ -12534,7 +12538,7 @@ This holds packages that I can use as provided, or with small modifications (as # specifically needed for anki # mpv - anki-bin + # anki-bin # dirvish file previews fd @@ -14824,8 +14828,8 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi

    -
    -
    3.3.1.30.6. blueman-applet
    +
    +
    3.3.1.30.6. blueman-applet
    { lib, config, ... }:
    @@ -14839,8 +14843,8 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
     
    -
    -
    3.3.1.30.7. network-manager-applet
    +
    +
    3.3.1.30.7. network-manager-applet
    { lib, config, ... }:
    @@ -14855,11 +14859,11 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
     
    -
    -
    3.3.1.30.8. obsidian service for tray
    +
    +
    3.3.1.30.8. obsidian service for tray
    -
    { lib, config, pkgs, ... }:
    +
    { lib, config, ... }:
     {
       options.swarselmodules.obsidian-tray = lib.mkEnableOption "enable obsidian applet for tray";
       config = lib.mkIf config.swarselmodules.obsidian-tray {
    @@ -14880,7 +14884,7 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
           };
     
           Service = {
    -        ExecStart = "${pkgs.obsidian}/bin/obsidian";
    +        ExecStart = "${lib.getExe config.programs.obsidian.package}";
           };
         };
       };
    @@ -14890,11 +14894,11 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
     
    -
    -
    3.3.1.30.9. anki service for tray
    +
    +
    3.3.1.30.9. anki service for tray
    -
    { lib, config, pkgs, ... }:
    +
    { lib, config, ... }:
     {
       options.swarselmodules.anki-tray = lib.mkEnableOption "enable anki applet for tray";
       config = lib.mkIf config.swarselmodules.anki-tray {
    @@ -14915,7 +14919,11 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
           };
     
           Service = {
    -        ExecStart = "${pkgs.anki-bin}/bin/anki-bin";
    +        # ExecStart = "${lib.getExe config.programs.anki.package}";
    +        ExecStart = "/etc/profiles/per-user/swarsel/bin/anki";
    +        Environment = [
    +          "QT_QPA_PLATFORM=xcb"
    +        ];
           };
         };
     
    @@ -14925,8 +14933,8 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
     
    -
    -
    3.3.1.30.10. element service for tr
    +
    +
    3.3.1.30.10. element service for tray
    { lib, config, pkgs, ... }:
    @@ -14960,8 +14968,8 @@ The `extraConfig` section here CANNOT be reindented. This has something to do wi
     
    -
    -
    3.3.1.30.11. vesktop service for tray
    +
    +
    3.3.1.30.11. vesktop service for tray
    { lib, config, pkgs, ... }:
    @@ -15871,11 +15879,11 @@ in
     
    -
    -
    3.3.1.37. Obsidian
    +
    +
    3.3.1.37. Obsidian
    -
    { inputs, lib, config, pkgs, nixosConfig ? config, ... }:
    +
    { lib, config, pkgs, nixosConfig ? config, ... }:
       let
         moduleName = "obsidian";
         inherit (nixosConfig.repo.secrets.common.obsidian) userIgnoreFilters;
    @@ -15889,6 +15897,7 @@ in
             in
             {
               enable = true;
    +          package = pkgs.obsidian;
               defaultSettings = {
                 app = {
                   attachmentFolderPath = "attachments";
    @@ -16010,6 +16019,78 @@ in
     
    +
    +
    3.3.1.38. Anki
    +
    +
    +
    { inputs, lib, config, pkgs, globals, nixosConfig ? config, ... }:
    +let
    +  moduleName = "anki";
    +  inherit (config.swarselsystems) isPublic isNixos;
    +in
    +{
    +  options.swarselmodules.${moduleName} = lib.mkEnableOption "enable ${moduleName} and settings";
    +  config = lib.mkIf config.swarselmodules.${moduleName} {
    +
    +    sops = lib.mkIf (!isPublic && !isNixos) {
    +      secrets = {
    +        anki-user = { };
    +        anki-pw = { };
    +      };
    +    };
    +
    +    programs.anki = {
    +      enable = true;
    +      package = pkgs.anki;
    +      hideBottomBar = true;
    +      hideBottomBarMode = "always";
    +      hideTopBar = true;
    +      hideTopBarMode = "always";
    +      reduceMotion = true;
    +      spacebarRatesCard = true;
    +      # videoDriver = "opengl";
    +      sync = {
    +        autoSync = true;
    +        syncMedia = true;
    +        url = "https://${globals.services.ankisync.domain}";
    +        usernameFile = nixosConfig.sops.secrets.anki-user.path;
    +        # this is not the password but the syncKey
    +        # get it by logging in or out, saving preferences and then
    +        # show details on the "settings wont be saved" dialog
    +        keyFile = nixosConfig.sops.secrets.anki-pw.path;
    +      };
    +      addons =
    +        let
    +          minimize-to-tray = pkgs.anki-utils.buildAnkiAddon
    +            (finalAttrs: {
    +              pname = "minimize-to-tray";
    +              version = "2.0.1";
    +              src = pkgs.fetchFromGitHub {
    +                owner = "simgunz";
    +                repo = "anki21-addons_minimize-to-tray";
    +                rev = finalAttrs.version;
    +                sparseCheckout = [ "src" ];
    +                hash = "sha256-xmvbIOfi9K0yEUtUNKtuvv2Vmqrkaa4Jie6J1s+FuqY=";
    +              };
    +              sourceRoot = "${finalAttrs.src.name}/src";
    +            });
    +        in
    +        [
    +          (minimize-to-tray.withConfig
    +          {
    +            config = {
    +              hide_on_startup = "true";
    +            };
    +          })
    +        ];
    +    };
    +  };
    +
    +}
    +
    +
    +
    +

    3.3.2. Server

    @@ -19147,8 +19228,8 @@ writeShellApplication {
    -
    -

    3.5.34. endme

    +
    +

    3.5.34. endme

    Sometimes my DE crashes after putting it to suspend - to be precise, it happens when I put it into suspend when I have multiple screens plugged in. I have never taken the time to debug the issue, but instead just switch to a different TTY and then use this script to kill the hanging session. @@ -19308,8 +19389,8 @@ in

    -
    -
    3.6.1.3. Optionals
    +
    +
    3.6.1.3. Optionals
    { lib, config, ... }:
    @@ -19585,6 +19666,7 @@ in
           anki-tray = lib.mkDefault true;
           element-tray = lib.mkDefault true;
           vesktop-tray = lib.mkDefault true;
    +      anki = lib.mkDefault true;
         };
       };
     
    @@ -26367,7 +26449,7 @@ similarly, there exists an version that starts from the right.
     

    Author: Leon Schwarzäugl

    -

    Created: 2025-10-09 Do 00:17

    +

    Created: 2025-10-09 Do 02:38

    Validate

    diff --git a/modules/home/common/anki-tray.nix b/modules/home/common/anki-tray.nix index 3cb0f64..d70fa67 100644 --- a/modules/home/common/anki-tray.nix +++ b/modules/home/common/anki-tray.nix @@ -1,4 +1,4 @@ -{ lib, config, pkgs, ... }: +{ lib, config, ... }: { options.swarselmodules.anki-tray = lib.mkEnableOption "enable anki applet for tray"; config = lib.mkIf config.swarselmodules.anki-tray { @@ -19,7 +19,11 @@ }; Service = { - ExecStart = "${pkgs.anki-bin}/bin/anki-bin"; + # ExecStart = "${lib.getExe config.programs.anki.package}"; + ExecStart = "/etc/profiles/per-user/swarsel/bin/anki"; + Environment = [ + "QT_QPA_PLATFORM=xcb" + ]; }; }; diff --git a/modules/home/common/anki.nix b/modules/home/common/anki.nix new file mode 100644 index 0000000..f91d3fb --- /dev/null +++ b/modules/home/common/anki.nix @@ -0,0 +1,64 @@ +{ lib, config, pkgs, globals, nixosConfig ? config, ... }: +let + moduleName = "anki"; + inherit (config.swarselsystems) isPublic isNixos; +in +{ + options.swarselmodules.${moduleName} = lib.mkEnableOption "enable ${moduleName} and settings"; + config = lib.mkIf config.swarselmodules.${moduleName} { + + sops = lib.mkIf (!isPublic && !isNixos) { + secrets = { + anki-user = { }; + anki-pw = { }; + }; + }; + + programs.anki = { + enable = true; + package = pkgs.anki; + hideBottomBar = true; + hideBottomBarMode = "always"; + hideTopBar = true; + hideTopBarMode = "always"; + reduceMotion = true; + spacebarRatesCard = true; + # videoDriver = "opengl"; + sync = { + autoSync = true; + syncMedia = true; + url = "https://${globals.services.ankisync.domain}"; + usernameFile = nixosConfig.sops.secrets.anki-user.path; + # this is not the password but the syncKey + # get it by logging in or out, saving preferences and then + # show details on the "settings wont be saved" dialog + keyFile = nixosConfig.sops.secrets.anki-pw.path; + }; + addons = + let + minimize-to-tray = pkgs.anki-utils.buildAnkiAddon + (finalAttrs: { + pname = "minimize-to-tray"; + version = "2.0.1"; + src = pkgs.fetchFromGitHub { + owner = "simgunz"; + repo = "anki21-addons_minimize-to-tray"; + rev = finalAttrs.version; + sparseCheckout = [ "src" ]; + hash = "sha256-xmvbIOfi9K0yEUtUNKtuvv2Vmqrkaa4Jie6J1s+FuqY="; + }; + sourceRoot = "${finalAttrs.src.name}/src"; + }); + in + [ + (minimize-to-tray.withConfig + { + config = { + hide_on_startup = "true"; + }; + }) + ]; + }; + }; + +} diff --git a/modules/home/common/packages.nix b/modules/home/common/packages.nix index 980f4af..10622dc 100644 --- a/modules/home/common/packages.nix +++ b/modules/home/common/packages.nix @@ -118,7 +118,7 @@ # specifically needed for anki # mpv - anki-bin + # anki-bin # dirvish file previews fd diff --git a/modules/nixos/common/home-manager-secrets.nix b/modules/nixos/common/home-manager-secrets.nix index f6299ef..7c2a3e1 100644 --- a/modules/nixos/common/home-manager-secrets.nix +++ b/modules/nixos/common/home-manager-secrets.nix @@ -22,6 +22,9 @@ in github-nixpkgs-review-token = { owner = mainUser; }; }) // (lib.optionalAttrs modules.emacs { emacs-radicale-pw = { owner = mainUser; }; + }) // (lib.optionalAttrs modules.anki { + anki-user = { owner = mainUser; }; + anki-pw = { owner = mainUser; }; }); templates = { authinfo = lib.mkIf modules.emacs { diff --git a/profiles/home/personal/default.nix b/profiles/home/personal/default.nix index e13700c..3ca38e1 100644 --- a/profiles/home/personal/default.nix +++ b/profiles/home/personal/default.nix @@ -49,6 +49,7 @@ anki-tray = lib.mkDefault true; element-tray = lib.mkDefault true; vesktop-tray = lib.mkDefault true; + anki = lib.mkDefault true; }; }; diff --git a/secrets/general/secrets.yaml b/secrets/general/secrets.yaml index 5e3cd83..f2d0e18 100644 --- a/secrets/general/secrets.yaml +++ b/secrets/general/secrets.yaml @@ -25,6 +25,9 @@ github-api-token: ENC[AES256_GCM,data:9AhHkmv4JUjmir77INYflGvjNWW/E17FmfoXs5IUnA emacs-radicale-pw: ENC[AES256_GCM,data:BIORG0geX8s1WOA=,iv:SeoVn8xHlqQGxZzHrm5I5LITMoutRnz3OygswDc96ew=,tag:C3S4a8IEvCjHgAyRrCaaRw==,type:str] #ENC[AES256_GCM,data:qsBNKxd3Ng==,iv:1fNMDJt7vgKFSdghYBZsuDoZ1sWvzj1Zu8NmkjX6Zh8=,tag:0D7EsgN8B1z7/y4iZS/PtQ==,type:comment] github-nixpkgs-review-token: ENC[AES256_GCM,data:/4ssZAEwEc9fZeR69GCvLMm4eRv4uabyDbGDGqfRUllO5DVSbZxO+A==,iv:mcARvAyPAB9pyCGFy2A/6qeZbSepHyWVNyusaQ5ze3I=,tag:o7AP6g8XHkPUaCnXK3CFig==,type:str] +#ENC[AES256_GCM,data:PI5MX6PgK1y0lqyoYA0=,iv:25UAvFaANHFD04GRafGlCzOc5h+15YPtSES2z2tmpXw=,tag:+XLwQ01+AtGWjtsSQhQ1AQ==,type:comment] +anki-user: ENC[AES256_GCM,data:WoGaNDAHFw==,iv:ZSjHfKMIjlgOuvGl7hVxJc1fE80nfxxXYLgsKangBCs=,tag:UP8ZI7gzOrJJjNDHovIkyg==,type:str] +anki-pw: ENC[AES256_GCM,data:z2SCsSvZIqN2/2VK1EdmcAnl42x5A15PAiK932k3n50Vj1jczGRoSw==,iv:keQCutY4vizVzu5YzPBJLgDLveYDb2VGeEnYmO7CeQw=,tag:KGplFfC5xktNAOTbIlt+Tg==,type:str] sops: age: - recipient: age1h72072slm2pthn9m2qwjsyy2dsazc6hz97kpzh4gksvv0r2jqecqul8w63 @@ -90,8 +93,8 @@ sops: SjV6L3crUkdLWTlsNFgyRHBla2FFam8KILYsNbLdCirfoC/Vex8yEYpS2G4O0EQP wa1xzPk3Ue0/g67dv5UZFhUn0ZB2XGFC3kEPWpptTj0VL+9Z/r0zKA== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-08-13T07:33:50Z" - mac: ENC[AES256_GCM,data:7RjYDh/n+j9lU6Sz3NRDi5tWX/7QL+HK43hOImCQkiHbBaO4n/Gms6hAAzkWfHpfbW9cm02mcPsmQLE85xlzD0DaJz2x4CVQ1wT26D5Sth6RP/rWGiVeoN4shncxuR0Ro0gTFFkTLYftJT2v/4LocPxIeEuOyQrX/J45UXUnhh4=,iv:309gb4TVc/uf6DOfPmSuqWTDt2Newi5rrFmBM2O0e+0=,tag:aVU9bVNTiSdeo4DkvUeJpA==,type:str] + lastmodified: "2025-10-08T23:35:53Z" + mac: ENC[AES256_GCM,data:TxbNh/NiACHx3IwOi2esAfPf/jHV9yO86PRGarL3QQDTVB+nh5in+lx06oFh3bO5aJwpG6MWH9ZpPbX+3buyr2BTNrb6vc2YctSzaQU+ap5rvHf4AoKT3rC9rjHaR0WqJIPGV7HYcnFcoznULMrHqMTKMeEhUMqNl7xxAwxfIyk=,iv:9HAgoJN4xgxevM92K9j/5I2UYyIydOe9O+Cy3oL6/mo=,tag:1sRN7mrsRkAfp0LuZ6knBg==,type:str] pgp: - created_at: "2025-07-10T23:51:26Z" enc: |- @@ -125,4 +128,4 @@ sops: -----END PGP MESSAGE----- fp: 4BE7925262289B476DBBC17B76FD3810215AE097 unencrypted_suffix: _unencrypted - version: 3.10.2 + version: 3.11.0