NixOS/zen.nix
2026-03-30 13:10:42 +07:00

322 lines
10 KiB
Nix

{ config, lib, pkgs-unstable, inputs, ... }:
{
# Workaround for https://github.com/0xc000022070/zen-browser-flake/issues/285
# The twilight module generates profiles.ini as a read-only nix store symlink,
# which Zen can't write to, so it ignores it and creates a random-prefix profile.
# This replaces the symlink with a mutable copy.
home.activation.fixZenProfiles = lib.hm.dag.entryAfter ["linkGeneration"] ''
ZEN_DIR="$HOME/.zen"
if [ -L "$ZEN_DIR/profiles.ini" ]; then
REAL=$(readlink -f "$ZEN_DIR/profiles.ini")
rm "$ZEN_DIR/profiles.ini"
cp "$REAL" "$ZEN_DIR/profiles.ini"
chmod u+w "$ZEN_DIR/profiles.ini"
fi
'';
# Tell Stylix which Zen profiles to theme
stylix.targets.zen-browser.profileNames = [ "default" ];
imports = [
inputs.zen-browser.homeModules.twilight
];
# Set Zen as default browser for all relevant MIME types
xdg.mimeApps = let
associations = builtins.listToAttrs (map (name: {
inherit name;
value = let
zen-browser = config.programs.zen-browser.package;
in
zen-browser.meta.desktopFileName;
}) [
"application/x-extension-shtml"
"application/x-extension-xhtml"
"application/x-extension-html"
"application/x-extension-xht"
"application/x-extension-htm"
"x-scheme-handler/unknown"
"x-scheme-handler/mailto"
"x-scheme-handler/chrome"
"x-scheme-handler/about"
"x-scheme-handler/https"
"x-scheme-handler/http"
"application/xhtml+xml"
"application/json"
"text/plain"
"text/html"
]);
in {
associations.added = associations;
defaultApplications = associations;
};
programs.zen-browser = {
enable = true;
# Native Messaging Hosts - required for KeePassXC browser integration
nativeMessagingHosts = [ pkgs-unstable.keepassxc ];
policies = let
# Helper to lock preferences
mkLockedAttrs = builtins.mapAttrs (_: value: {
Value = value;
Status = "locked";
});
# Helper to create extension install URL
mkPluginUrl = id: "https://addons.mozilla.org/firefox/downloads/latest/${id}/latest.xpi";
# Helper to create extension entry with options
mkExtensionEntry = {
id,
pinned ? false,
private_browsing ? true,
}: let
base = {
install_url = mkPluginUrl id;
installation_mode = "force_installed";
inherit private_browsing;
};
in
if pinned
then base // { default_area = "navbar"; }
else base;
# Helper to process extension settings
mkExtensionSettings = builtins.mapAttrs (_: entry:
if builtins.isAttrs entry
then entry
else mkExtensionEntry { id = entry; });
in {
# App behavior
DisableAppUpdate = true;
DontCheckDefaultBrowser = true;
DisableFeedbackCommands = true;
# Privacy & Telemetry
DisableTelemetry = true;
DisableFirefoxStudies = true;
DisablePocket = true;
# Autofill
AutofillAddressEnabled = true;
AutofillCreditCardEnabled = false;
OfferToSaveLogins = false;
# Tracking Protection
EnableTrackingProtection = {
Value = true;
Locked = true;
Cryptomining = true;
Fingerprinting = true;
};
# Clean up on shutdown (fresh instance)
SanitizeOnShutdown = {
Cache = true;
Cookies = false; # Keep logins
Downloads = true;
FormData = true;
History = false; # Keep history
Sessions = false; # Keep tabs on restart
SiteSettings = false;
OfflineApps = true;
Locked = true;
};
# Extensions
ExtensionSettings = mkExtensionSettings {
# uBlock Origin - ad blocker (pinned to navbar)
"uBlock0@raymondhill.net" = mkExtensionEntry {
id = "ublock-origin";
pinned = true;
private_browsing = true;
};
# KeePassXC - password manager (pinned to navbar)
"keepassxc-browser@keepassxc.org" = mkExtensionEntry {
id = "keepassxc-browser";
pinned = true;
private_browsing = true;
};
# --- Privacy & Security ---
"{74145f27-f039-47ce-a470-a662b129930a}" = "clearurls"; # Remove tracking from URLs
"jid1-BoFifL9Vbdl2zQ@jetpack" = "decentraleyes"; # Local CDN emulation
"{3579f63b-d8ee-424f-bbb6-6d0ce3285e6a}" = "chameleon-ext"; # Spoof browser profile
# --- GitHub ---
"{a4c4eda4-fb84-4a84-b4a1-f7c1cbf2a1ad}" = "refined-github-"; # GitHub enhancements
"{85860b32-02a8-431a-b2b1-40fbd64c9c69}" = "github-file-icons"; # File icons in GitHub
"github-repository-size@pranavmangal" = "gh-repo-size"; # Show repo size
# --- YouTube ---
"{762f9885-5a13-4abd-9c77-433dcd38b8fd}" = "return-youtube-dislikes";
};
# Locked preferences
Preferences = mkLockedAttrs {
"browser.aboutConfig.showWarning" = false;
"browser.tabs.warnOnClose" = false;
"media.videocontrols.picture-in-picture.video-toggle.enabled" = true;
# Translation (auto-translate all languages except en/fr)
"browser.translations.enable" = true;
"browser.translations.panelShown" = true;
"browser.translations.automaticallyPopup" = true;
"browser.translations.alwaysTranslateLanguages" = "ar,bg,cs,da,de,el,es,et,fi,hu,id,it,ja,ko,lt,lv,nl,no,pl,pt,ro,ru,sk,sl,sv,th,tr,uk,vi,zh";
"browser.translations.neverTranslateLanguages" = "en,fr";
# Privacy (balanced - removed slow options)
"privacy.spoof_english" = 1;
"network.cookie.cookieBehavior" = 5;
"dom.battery.enabled" = false;
# Performance & Speed
"gfx.webrender.all" = true;
"layers.acceleration.force-enabled" = true;
"network.http.http3.enabled" = true;
"network.dns.disablePrefetch" = false;
"network.prefetch-next" = true;
"browser.sessionstore.interval" = 60000; # Less frequent session saves (60s)
"browser.cache.memory.enable" = true;
"browser.cache.memory.capacity" = 524288; # 512MB memory cache
"content.notify.interval" = 100000;
"ui.submenuDelay" = 0; # Instant submenus
# Disable animations for snappiness
"toolkit.cosmeticAnimations.enabled" = false;
"browser.fullscreen.animate" = false;
};
};
profiles.default = {
# Zen-specific settings
settings = {
"zen.workspaces.continue-where-left-off" = true; # Restore tabs
"zen.workspaces.natural-scroll" = true;
"zen.view.compact.hide-tabbar" = true;
"zen.view.compact.hide-toolbar" = true;
"zen.view.compact.animate-sidebar" = false;
"zen.welcome-screen.seen" = true;
"zen.urlbar.behavior" = "float";
# Restore previous session
"browser.startup.page" = 3; # Restore previous session
"browser.sessionstore.resume_from_crash" = true;
};
# --- Bookmarks ---
bookmarks = {
force = true;
settings = [
{
name = "Dev";
toolbar = true;
bookmarks = [
{ name = "GitHub"; url = "https://github.com"; }
{ name = "NixOS Wiki"; url = "https://wiki.nixos.org/"; }
];
}
];
};
# --- Containers ---
# containersForce = true;
# containers = {
# Personal = { color = "blue"; icon = "fingerprint"; id = 1; };
# Work = { color = "orange"; icon = "briefcase"; id = 2; };
# Shopping = { color = "yellow"; icon = "dollar"; id = 3; };
# Banking = { color = "green"; icon = "dollar"; id = 4; };
# };
# --- Workspaces/Spaces ---
# spacesForce = true;
# spaces = {
# "Default" = {
# id = "generate-your-own-uuid"; # Use: uuidgen
# icon = "🏠";
# position = 1000;
# };
# "Work" = {
# id = "generate-your-own-uuid";
# icon = "💼";
# position = 1001;
# # container = containers."Work".id; # Link to container
# theme = {
# type = "gradient";
# colors = [
# {
# red = 100;
# green = 150;
# blue = 200;
# algorithm = "floating";
# type = "explicit-lightness";
# }
# ];
# opacity = 0.5;
# texture = 0.3;
# };
# };
# };
# --- Pinned tabs ---
# pinsForce = true;
# pins = {
# "GitHub" = {
# id = "generate-your-own-uuid";
# # workspace = spaces."Work".id;
# url = "https://github.com";
# position = 100;
# isEssential = false;
# };
# };
# --- Search engines ---
search = {
force = true;
default = "google";
engines = let
nixIcon = "${pkgs-unstable.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
in {
"Nix Packages" = {
urls = [{
template = "https://search.nixos.org/packages";
params = [
{ name = "type"; value = "packages"; }
{ name = "channel"; value = "unstable"; }
{ name = "query"; value = "{searchTerms}"; }
];
}];
icon = nixIcon;
definedAliases = [ "np" ];
};
"Nix Options" = {
urls = [{
template = "https://search.nixos.org/options";
params = [
{ name = "channel"; value = "unstable"; }
{ name = "query"; value = "{searchTerms}"; }
];
}];
icon = nixIcon;
definedAliases = [ "no" ];
};
"Home Manager Options" = {
urls = [{
template = "https://home-manager-options.extranix.com/";
params = [
{ name = "query"; value = "{searchTerms}"; }
{ name = "release"; value = "master"; }
];
}];
icon = nixIcon;
definedAliases = [ "hm" ];
};
# Hide unwanted default engines
"bing".metaData.hidden = true;
};
};
};
};
}