main
  1{lib, ...}: {
  2  flake.modules.homeManager.desktop = {
  3    pkgs,
  4    osConfig,
  5    ...
  6  }: {
  7    stylix.targets.floorp = {
  8      profileNames = ["default"];
  9      colorTheme.enable = true;
 10    };
 11
 12    programs.floorp = let
 13      isPlasma =
 14        pkgs.stdenv.hostPlatform.isLinux
 15        && osConfig.services.desktopManager.plasma6.enable;
 16    in {
 17      enable = true;
 18      package = pkgs.floorp-bin;
 19      languagePacks = ["zh-CN" "en-US"];
 20      nativeMessagingHosts = lib.mkIf isPlasma (with pkgs; [
 21        kdePackages.plasma-browser-integration
 22      ]);
 23
 24      policies = {
 25        DisableAppUpdate = true;
 26        DisablePocket = true;
 27        DisableSetDesktopBackground = true;
 28        DisableTelemetry = true;
 29        DontCheckDefaultBrowser = true;
 30        ExtensionUpdate = false;
 31        NoDefaultBookmarks = true;
 32        OfferToSaveLogins = false;
 33        PasswordManagerEnabled = false;
 34      };
 35
 36      profiles.default = {
 37        id = 0;
 38        isDefault = true;
 39
 40        search = {
 41          force = true;
 42          default = "kagi";
 43          privateDefault = "kagi";
 44          order = [
 45            "kagi"
 46            "bing"
 47            "google"
 48            "ddg"
 49          ];
 50          engines = {
 51            kagi = {
 52              name = "Kagi";
 53              description = "A privacy-focused, user-centric search engine.";
 54              urls = [
 55                {template = "https://kagi.com/search?q={searchTerms}";}
 56                {
 57                  type = "application/x-suggestions+json";
 58                  template = "https://kagisuggest.com/api/autosuggest?q={searchTerms}";
 59                }
 60              ];
 61              iconMapObj = {
 62                "16" = "https://kagi.com/favicon-16x16.png";
 63                "32" = "https://kagi.com/favicon-32x32.png";
 64              };
 65              definedAliases = ["@kagi"];
 66            };
 67
 68            baidu.metaData.hidden = true;
 69            startpage.metaData.hidden = true;
 70            "you.com".metaData.hidden = true;
 71          };
 72        };
 73
 74        extensions.force = true;
 75        extensions.packages =
 76          (with pkgs.nur.repos.rycee.firefox-addons; [
 77            ublock-origin
 78            bitwarden
 79            tampermonkey
 80            kiss-translator
 81            libredirect
 82          ])
 83          ++ (lib.optional isPlasma pkgs.nur.repos.rycee.firefox-addons.plasma-integration);
 84
 85        settings = {
 86          # == General ==
 87          "browser.startup.page" = 3; # Open prev session pages
 88          "browser.tabs.unloadOnLowMemory" = true;
 89          "widget.use-xdg-desktop-portal.file-picker" = 1;
 90          # No first run
 91          "app.normandy.first_run" = false;
 92          "doh-rollout.doneFirstRun" = true;
 93          "toolkit.telemetry.reportingpolicy.firstRun" = false;
 94          "trailhead.firstrun.didSeeAboutWelcome" = true;
 95          "browser.toolbarbuttons.introduced.sidebar-button" = true;
 96          "sidebar.old-sidebar.has-used" = true;
 97          "sidebar.new-sidebar.has-used" = true;
 98          "floorp.browser.welcome.page.shown" = true;
 99          # Language
100          "general.useragent.locale" = "zh-CN";
101          "intl.locale.requested" = "zh-CN,en-US";
102          "browser.translations.mostRecentTargetLanguages" = "zh-Hans";
103          # No ads
104          "browser.urlbar.suggest.topsites" = false;
105          "browser.urlbar.suggest.trending" = false;
106          "browser.newtabpage.pinned" = [];
107          "browser.newtabpage.activity-stream.showSponsored" = false;
108          "browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
109          # == Telemetry ==
110          "toolkit.telemetry.unified" = false;
111          "toolkit.telemetry.enabled" = false;
112          "toolkit.telemetry.server" = "data:,";
113          "toolkit.telemetry.archive.enabled" = false;
114          "toolkit.telemetry.newProfilePing.enabled" = false;
115          "toolkit.telemetry.shutdownPingSender.enabled" = false;
116          "toolkit.telemetry.updatePing.enabled" = false;
117          "toolkit.telemetry.bhrPing.enabled" = false;
118          "toolkit.telemetry.firstShutdownPing.enabled" = false;
119          "toolkit.telemetry.shutdownPingSender.enabledFirstsession" = false;
120          "browser.ping-centre.telemetry" = false;
121          "browser.newtabpage.activity-stream.feeds.telemetry" = false;
122          "browser.newtabpage.activity-stream.telemetry" = false;
123          # == Apperance ==
124          "browser.newtabpage.activity-stream.feeds.topsites" = false;
125          "browser.newtabpage.activity-stream.default.sites" = "";
126          "browser.toolbars.bookmarks.visibility" = "always";
127          "sidebar.verticalTabs" = true;
128          "sidebar.main.tools" = "syncedtabs";
129          "sidebar.visibility" = "expand-on-hover";
130          # Floorp's new tab page
131          "floorp.newtab.configs" = {
132            "components" = {
133              "topSites" = false;
134              "clock" = false;
135              "searchBar" = true;
136              "firefoxLayout" = true;
137            };
138            "background" = let
139              image = osConfig.stylix.image;
140              processed-image = pkgs.runCommand "dimmed-wallpaper" {} ''
141                ${lib.getExe' pkgs.imagemagick "convert"} "${image}" -blur 0x8 -modulate 80,60,100 -fill "gray(20%)" -colorize 20% $out
142              '';
143            in {
144              "type" = "custom";
145              "customImage" = "file://${processed-image}";
146              "fileName" = builtins.baseNameOf processed-image;
147            };
148            "searchBar" = {"searchEngine" = "default";};
149            "topSites" = {
150              "pinned" = [];
151              "blocked" = [];
152            };
153          };
154          # panelSideBar
155          "floorp.panelSidebar.enabled" = true;
156          "floorp.panelSidebar.config" = {
157            "autoUnload" = false;
158            "position_start" = true;
159            "globalWidth" = 400;
160            "displayed" = true;
161            "webExtensionRunningEnabled" = false;
162          };
163          "floorp.panelSidebar.data"."data" =
164            (lib.map (x: {
165              "id" = "default-panel-${x}";
166              "url" = "floorp//${x}";
167              "width" = 0;
168              "type" = "static";
169            }) ["bookmarks" "history" "downloads"])
170            ++ (lib.map (url: let
171                id = lib.pipe url [
172                  (x: lib.removePrefix "http://" x)
173                  (x: lib.removePrefix "https://" x)
174                  (x: lib.splitString "?" x)
175                  (x: lib.elemAt x 0)
176                  (x: lib.replaceStrings ["/" "."] ["-" "-"] x)
177                  (x: lib.removeSuffix "-" x)
178                  (x: "panel-${x}")
179                ];
180              in {
181                inherit id url;
182                "width" = 0;
183                "userContextId" = 0;
184                "zoomLevel" = null;
185                "type" = "web";
186              }) [
187                "https://translate.google.com"
188                "https://squoosh.app"
189              ]);
190          # Workspace
191          "floorp.workspaces.enabled" = true;
192          "floorp.workspaces.v4.config" = {
193            "manageOnBms" = true;
194            "showWorkspaceNameOnToolbar" = true;
195          };
196          # Top toolbar
197          "browser.uiCustomization.state" = {
198            "placements" = {
199              "widget-overflow-fixed-list" = [];
200              "unified-extensions-area" =
201                [
202                  "firefox_tampermonkey_net-browser-action" # Tampermonkey
203                  "_e2488817-3d73-4013-850d-b66c5e42d505_-browser-action" # Aria2 Integration
204                  "ublock0_raymondhill_net-browser-action" # uBlock Origin
205                  "firefoxcolor_mozilla_com-browser-action" # Firefox Color
206                  "plasma-browser-integration_kde_org-browser-action" # Plasma Integration
207                ]
208                # Plasma Integration
209                ++ (lib.optional isPlasma "plasma-browser-integration_kde_org-browser-action");
210              "nav-bar" = [
211                "sidebar-button"
212                "back-button"
213                "forward-button"
214                "stop-reload-button"
215                "vertical-spacer"
216                "urlbar-container"
217                "_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action" # Bitwarden
218                "unified-extensions-button"
219                "fxa-toolbar-menu-button"
220              ];
221              "toolbar-menubar" = ["menubar-items"];
222              "TabsToolbar" = [];
223              "vertical-tabs" = ["tabbrowser-tabs"];
224              "PersonalToolbar" = ["personal-bookmarks"];
225              "nora-statusbar" = [
226                "screenshot-button"
227                "fullscreen-button"
228                "status-text"
229              ];
230            };
231            "seen" = ["developer-button"];
232            "dirtyAreaCache" = [];
233          };
234        };
235      };
236    };
237  };
238}