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}