initial commit
commit
fd07491bbd
|
@ -0,0 +1,151 @@
|
||||||
|
# Edit this configuration file to define what should be installed on
|
||||||
|
# your system. Help is available in the configuration.nix(5) man page
|
||||||
|
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||||
|
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
impermanence = builtins.fetchTarball {
|
||||||
|
url = "https://github.com/nix-community/impermanence/archive/master.tar.gz";
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
imports = [ # Include the results of the hardware scan.
|
||||||
|
./nixos/hardware-configuration/capibara.nix
|
||||||
|
./nixos/common.nix
|
||||||
|
"${impermanence}/nixos.nix"
|
||||||
|
];
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "tmpfs";
|
||||||
|
fsType = "tmpfs";
|
||||||
|
options = [ "defaults" "size=2G" "mode=755" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"/persist/system" = {
|
||||||
|
device = "/dev/mapper/system";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=persist" "compress=zstd" ];
|
||||||
|
neededForBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"/persist/user" = {
|
||||||
|
device = "/dev/mapper/user";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=persist" "compress=zstd" ];
|
||||||
|
neededForBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"/nix" = {
|
||||||
|
device = "/dev/mapper/system";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=nix" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"/boot" = {
|
||||||
|
device = "/dev/mapper/system";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=boot" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"/swap" = {
|
||||||
|
device = "/dev/mapper/system";
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = [ "subvol=swap" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [{ device = "/swap/swapfile"; }];
|
||||||
|
|
||||||
|
environment.persistence."/persist/system" = {
|
||||||
|
directories = [
|
||||||
|
"/var/log"
|
||||||
|
"/var/lib/bluetooth"
|
||||||
|
"/var/lib/systemd/coredump"
|
||||||
|
"/var/lib/docker"
|
||||||
|
];
|
||||||
|
files = [
|
||||||
|
"/etc/machine-id"
|
||||||
|
#"/etc/nix/id_rsa"
|
||||||
|
"/etc/ssh/ssh_host_ed25519_key"
|
||||||
|
"/etc/ssh/ssh_host_ed25519_key.pub"
|
||||||
|
"/etc/ssh/ssh_host_rsa_key"
|
||||||
|
"/etc/ssh/ssh_host_rsa_key.pub"
|
||||||
|
"/etc/wireguard/wg0"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.persistence."/persist/user" = {
|
||||||
|
directories = [
|
||||||
|
"/etc/NetworkManager/system-connections"
|
||||||
|
"/etc/nixos"
|
||||||
|
"/var/lib/libvirt"
|
||||||
|
];
|
||||||
|
files = [
|
||||||
|
"/etc/wireguard/wg0"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.networkmanager.wifi.macAddress = "CC:AF:78:75:29:32";
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
programs.steam.enable = true;
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
|
||||||
|
loader = {
|
||||||
|
grub = {
|
||||||
|
efiSupport = false;
|
||||||
|
efiInstallAsRemovable = false;
|
||||||
|
enable = true;
|
||||||
|
version = 2;
|
||||||
|
device = "/dev/disk/by-id/ata-KINGSTON_SKC600MS512G_50026B7783FC3D2F";
|
||||||
|
enableCryptodisk = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
initrd = {
|
||||||
|
luks.devices = {
|
||||||
|
system = {
|
||||||
|
device = "/dev/disk/by-uuid/a5837435-d55e-4506-b256-e5c707d205c3";
|
||||||
|
keyFile = "/root_keyfile.bin";
|
||||||
|
};
|
||||||
|
user = {
|
||||||
|
device = "/dev/disk/by-uuid/0fdb839e-dee8-4374-81e6-4455cfc3ae39";
|
||||||
|
keyFile = "/data_keyfile.bin";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
secrets = {
|
||||||
|
"/root_keyfile.bin" = "/boot/root_keyfile.bin";
|
||||||
|
"/data_keyfile.bin" = "/boot/data_keyfile.bin";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "capibara";
|
||||||
|
interfaces = {
|
||||||
|
eno0.useDHCP = true;
|
||||||
|
wlp2s0.useDHCP = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
# UDEV rules for Teensy USB devices
|
||||||
|
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||||
|
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1"
|
||||||
|
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666"
|
||||||
|
KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666"
|
||||||
|
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="664", GROUP="plugdev"
|
||||||
|
'';
|
||||||
|
|
||||||
|
hardware.opengl.enable = true;
|
||||||
|
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "21.05"; # Did you read the comment?
|
||||||
|
}
|
|
@ -0,0 +1,210 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
home-manager = builtins.fetchTarball {
|
||||||
|
url = "https://github.com/nix-community/home-manager/archive/master.tar.gz";
|
||||||
|
};
|
||||||
|
choose-pass =
|
||||||
|
pkgs.callPackage ./macos/choose-pass.nix { inherit config pkgs; };
|
||||||
|
in {
|
||||||
|
imports = [ "${home-manager}/nix-darwin" ];
|
||||||
|
|
||||||
|
# List packages installed in system profile. To search by name, run:
|
||||||
|
# $ nix-env -qaP | grep wget
|
||||||
|
# environment.systemPackages = [ ];
|
||||||
|
environment.systemPackages = [
|
||||||
|
choose-pass
|
||||||
|
pkgs.coreutils-full
|
||||||
|
pkgs.curl
|
||||||
|
pkgs.fzf
|
||||||
|
pkgs.gnupg
|
||||||
|
pkgs.google-cloud-sdk
|
||||||
|
pkgs.htop
|
||||||
|
pkgs.jq
|
||||||
|
pkgs.mosh
|
||||||
|
pkgs.pass
|
||||||
|
pkgs.ripgrep
|
||||||
|
pkgs.terraform
|
||||||
|
pkgs.wireguard
|
||||||
|
pkgs.yubikey-personalization
|
||||||
|
];
|
||||||
|
|
||||||
|
# Use a custom configuration.nix location.
|
||||||
|
# $ darwin-rebuild switch -I darwin-config=$HOME/.config/nixpkgs/darwin/configuration.nix
|
||||||
|
# environment.darwinConfig = "$HOME/configs/nix/darwin-configuration.nix";
|
||||||
|
|
||||||
|
# Auto upgrade nix package and the daemon service.
|
||||||
|
services.nix-daemon.enable = true;
|
||||||
|
# nix.package = pkgs.nix;
|
||||||
|
|
||||||
|
# Create /etc/bashrc that loads the nix-darwin environment.
|
||||||
|
programs.zsh.enable = true; # default shell on catalina
|
||||||
|
# programs.fish.enable = true;
|
||||||
|
|
||||||
|
# Used for backwards compatibility, please read the changelog before changing.
|
||||||
|
# $ darwin-rebuild changelog
|
||||||
|
|
||||||
|
programs.gnupg.agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSSHSupport = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
homebrew = {
|
||||||
|
enable = true;
|
||||||
|
autoUpdate = true;
|
||||||
|
cleanup = "zap";
|
||||||
|
global = {
|
||||||
|
brewfile = true;
|
||||||
|
noLock = true;
|
||||||
|
};
|
||||||
|
casks = [ "kmbmpdc" "librewolf" ];
|
||||||
|
brews = [ "mpd" "choose-gui" "vitetris" ];
|
||||||
|
taps =
|
||||||
|
[ "homebrew/bundle" "homebrew/cask" "homebrew/core" "homebrew/services" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
enableFontDir = true;
|
||||||
|
fonts = [
|
||||||
|
(pkgs.nerdfonts.override { fonts = [ "Hack" "MPlus" ]; })
|
||||||
|
pkgs.inter
|
||||||
|
pkgs.hack-font
|
||||||
|
pkgs.libertinus
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.rilla = {
|
||||||
|
name = "rilla";
|
||||||
|
home = "/Users/rilla";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.yabai = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.yabai;
|
||||||
|
# enableScriptingAddition = true;
|
||||||
|
enableScriptingAddition = false;
|
||||||
|
config = {
|
||||||
|
external_bar = "all:28:0";
|
||||||
|
layout = "bsp";
|
||||||
|
auto_balance = "off";
|
||||||
|
mouse_modifier = "fn";
|
||||||
|
mouse_action1 = "move";
|
||||||
|
mouse_action2 = "resize";
|
||||||
|
mouse_follows_focus = "on";
|
||||||
|
focus_follows_mouse = "autoraise";
|
||||||
|
window_topmost = "on"; # floating windows always on top
|
||||||
|
window_shadow = "float";
|
||||||
|
window_opacity = "on";
|
||||||
|
active_window_opacity = "1.0";
|
||||||
|
normal_window_opacity = "1.0";
|
||||||
|
window_border = "on";
|
||||||
|
window_border_width = 8;
|
||||||
|
active_window_border_color = "0xff458588";
|
||||||
|
normal_window_border_color = "0xff504945";
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
yabai -m rule --add app="^choose" manage=off
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.skhd = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.skhd;
|
||||||
|
skhdConfig = ''
|
||||||
|
# ctrl + alt - return : osascript /Users/rilla/configs/scripts/osascripts/iterm.scpt
|
||||||
|
ctrl + alt - return : ${pkgs.alacritty}/bin/alacritty
|
||||||
|
|
||||||
|
ctrl + alt - 1 : yabai -m space --focus 1
|
||||||
|
ctrl + alt - 2 : yabai -m space --focus 2
|
||||||
|
ctrl + alt - 3 : yabai -m space --focus 3
|
||||||
|
ctrl + alt - 4 : yabai -m space --focus 4
|
||||||
|
ctrl + alt - 5 : yabai -m space --focus 5
|
||||||
|
ctrl + alt - 6 : yabai -m space --focus 6
|
||||||
|
ctrl + alt - 7 : yabai -m space --focus 7
|
||||||
|
ctrl + alt - 8 : yabai -m space --focus 8
|
||||||
|
ctrl + alt - 9 : yabai -m space --focus 9
|
||||||
|
ctrl + alt - 0 : yabai -m space --focus 10
|
||||||
|
|
||||||
|
ctrl + alt - n : yabai -m window --focus next || yabai -m window --focus first
|
||||||
|
ctrl + alt - p : yabai -m window --focus prev || yabai -m window --focus last
|
||||||
|
|
||||||
|
ctrl + alt + shift - r : yabai -m space --rotate 90
|
||||||
|
|
||||||
|
ctrl + alt + shift - 1 : yabai -m window --space 1
|
||||||
|
ctrl + alt + shift - 2 : yabai -m window --space 2
|
||||||
|
ctrl + alt + shift - 3 : yabai -m window --space 3
|
||||||
|
ctrl + alt + shift - 4 : yabai -m window --space 4
|
||||||
|
ctrl + alt + shift - 5 : yabai -m window --space 5
|
||||||
|
ctrl + alt + shift - 6 : yabai -m window --space 6
|
||||||
|
ctrl + alt + shift - 7 : yabai -m window --space 7
|
||||||
|
ctrl + alt + shift - 8 : yabai -m window --space 8
|
||||||
|
ctrl + alt + shift - 9 : yabai -m window --space 9
|
||||||
|
|
||||||
|
# ctrl + alt + shift - space : yabai -m space --balance
|
||||||
|
ctrl + alt - space : yabai -m space --layout $(yabai -m query --spaces --space | jq -r 'if .["type"] == "bsp" then "float" else "bsp" end')
|
||||||
|
ctrl + alt - b : yabai -m space --balance
|
||||||
|
ctrl + alt + shift - space : yabai -m space --layout bsp
|
||||||
|
|
||||||
|
# ctrl + alt + shift - c : yabai -m window --close
|
||||||
|
|
||||||
|
ctrl + alt - right : yabai -m space --focus next || yabai -m space --focus first
|
||||||
|
ctrl + alt - left : yabai -m space --focus prev || yabai -m space --focus last
|
||||||
|
|
||||||
|
ctrl + alt - h : yabai -m window --focus west
|
||||||
|
ctrl + alt - l : yabai -m window --focus east
|
||||||
|
ctrl + alt - j : yabai -m window --focus south
|
||||||
|
ctrl + alt - k : yabai -m window --focus north
|
||||||
|
|
||||||
|
ctrl + alt + shift - h : yabai -m window --swap west
|
||||||
|
ctrl + alt + shift - l : yabai -m window --swap east
|
||||||
|
ctrl + alt + shift - j : yabai -m window --swap south
|
||||||
|
ctrl + alt + shift - k : yabai -m window --swap north
|
||||||
|
|
||||||
|
ctrl + alt - e : yabai -m display --focus 1
|
||||||
|
ctrl + alt - w : yabai -m display --focus 2
|
||||||
|
|
||||||
|
ctrl + alt - g : yabai -m space --toggle gap && yabai -m space --toggle padding
|
||||||
|
|
||||||
|
ctrl + alt - x : yabai -m space --mirror y-axis
|
||||||
|
ctrl + alt - y : yabai -m space --mirror x-axis
|
||||||
|
|
||||||
|
ctrl + alt - m : yabai -m window --toggle zoom-fullscreen
|
||||||
|
ctrl + alt - t : yabai -m window --toggle float
|
||||||
|
|
||||||
|
:: choose
|
||||||
|
ctrl + alt - a ; choose
|
||||||
|
choose < p : skhd -k 'escape'; ${choose-pass}/bin/choose-pass
|
||||||
|
choose < escape ; default
|
||||||
|
|
||||||
|
play : ${pkgs.mpc_cli}/bin/mpc toggle
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.spacebar = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.spacebar;
|
||||||
|
config = {
|
||||||
|
position = "top";
|
||||||
|
height = 28;
|
||||||
|
spacing_left = 25;
|
||||||
|
spacing_right = 25;
|
||||||
|
text_font = ''"Inter:Regular:12.0"'';
|
||||||
|
icon_font = ''"Font Awesome 5 Free:Solid:12.0"'';
|
||||||
|
background_color = "0xff282828";
|
||||||
|
foreground_color = "0xffebdbb2";
|
||||||
|
|
||||||
|
space_icon_color = "0xff83a598";
|
||||||
|
space_icon = "•";
|
||||||
|
space_icon_strip = "1 2 3 4 5 6 7 8 9 10";
|
||||||
|
|
||||||
|
power_icon_strip = " ";
|
||||||
|
|
||||||
|
clock_icon = "";
|
||||||
|
clock_format = ''"%d/%m/%y %R"'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home-manager.users.rilla = import ./home/macos.nix;
|
||||||
|
|
||||||
|
system.stateVersion = 4;
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.alacritty = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
background_opacity = 0.9;
|
||||||
|
colors = {
|
||||||
|
primary = {
|
||||||
|
background = "#282828";
|
||||||
|
foreground = "#ebdbb2";
|
||||||
|
};
|
||||||
|
normal = {
|
||||||
|
black = "#282828";
|
||||||
|
red = "#cc241d";
|
||||||
|
green = "#98971a";
|
||||||
|
yellow = "#d79921";
|
||||||
|
blue = "#458588";
|
||||||
|
magenta = "#b16286";
|
||||||
|
cyan = "#689d6a";
|
||||||
|
white = "#ebdbb2";
|
||||||
|
};
|
||||||
|
bright = {
|
||||||
|
black = "#928374";
|
||||||
|
red = "#fb4934";
|
||||||
|
green = "#b8bb26";
|
||||||
|
yellow = "#fabd2f";
|
||||||
|
blue = "#83a598";
|
||||||
|
magenta = "#d3869b";
|
||||||
|
cyan = "#8ec07c";
|
||||||
|
white = "#ebdbb2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
font = {
|
||||||
|
normal = {
|
||||||
|
family = "Hack Nerd Font";
|
||||||
|
style = "Regular";
|
||||||
|
};
|
||||||
|
bold = {
|
||||||
|
family = "Hack Nerd Font";
|
||||||
|
style = "Bold";
|
||||||
|
};
|
||||||
|
italic = {
|
||||||
|
family = "Hack Nerd Font";
|
||||||
|
style = "Italic";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
selection = { save_to_clipboard = true; };
|
||||||
|
shell = {
|
||||||
|
program = "${pkgs.tmux}/bin/tmux";
|
||||||
|
args = [ "-u" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
programs.alacritty = {
|
||||||
|
settings = {
|
||||||
|
font = {
|
||||||
|
offset = {
|
||||||
|
x = 0;
|
||||||
|
y = 0;
|
||||||
|
};
|
||||||
|
size = 7;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
programs.alacritty = {
|
||||||
|
settings = {
|
||||||
|
font = {
|
||||||
|
offset = {
|
||||||
|
x = 1;
|
||||||
|
y = 0;
|
||||||
|
};
|
||||||
|
size = 13;
|
||||||
|
|
||||||
|
};
|
||||||
|
window = {
|
||||||
|
padding = {
|
||||||
|
x = 5;
|
||||||
|
y = 5;
|
||||||
|
};
|
||||||
|
decorations = "none";
|
||||||
|
};
|
||||||
|
|
||||||
|
key_bindings = [
|
||||||
|
{key = "Key0"; mods = "Command"; action = "ResetFontSize";}
|
||||||
|
{key = "Key0"; mods = "Control"; action = "ResetFontSize";}
|
||||||
|
{key = "Equals"; mods = "Command"; action = "IncreaseFontSize";}
|
||||||
|
{key = "Equals"; mods = "Control"; action = "IncreaseFontSize";}
|
||||||
|
{key = "Minus"; mods = "Control"; action = "DecreaseFontSize";}
|
||||||
|
{key = "A"; mods = "Control"; chars = "\\x01";}
|
||||||
|
{key = "B"; mods = "Control"; chars = "\\x02";}
|
||||||
|
{key = "C"; mods = "Control"; chars = "\\x03";}
|
||||||
|
{key = "D"; mods = "Control"; chars = "\\x04";}
|
||||||
|
{key = "E"; mods = "Control"; chars = "\\x05";}
|
||||||
|
{key = "F"; mods = "Control"; chars = "\\x06";}
|
||||||
|
{key = "G"; mods = "Control"; chars = "\\x07";}
|
||||||
|
{key = "H"; mods = "Control"; chars = "\\x08";}
|
||||||
|
{key = "I"; mods = "Control"; chars = "\\x09";}
|
||||||
|
{key = "J"; mods = "Control"; chars = "\\x0A";}
|
||||||
|
{key = "K"; mods = "Control"; chars = "\\x0B";}
|
||||||
|
{key = "L"; mods = "Control"; chars = "\\x0C";}
|
||||||
|
{key = "M"; mods = "Control"; chars = "\\x0D";}
|
||||||
|
{key = "N"; mods = "Control"; chars = "\\x0E";}
|
||||||
|
{key = "O"; mods = "Control"; chars = "\\x0F";}
|
||||||
|
{key = "P"; mods = "Control"; chars = "\\x10";}
|
||||||
|
{key = "Q"; mods = "Control"; chars = "\\x11";}
|
||||||
|
{key = "R"; mods = "Control"; chars = "\\x12";}
|
||||||
|
{key = "S"; mods = "Control"; chars = "\\x13";}
|
||||||
|
{key = "T"; mods = "Control"; chars = "\\x14";}
|
||||||
|
{key = "U"; mods = "Control"; chars = "\\x15";}
|
||||||
|
{key = "V"; mods = "Control"; chars = "\\x16";}
|
||||||
|
{key = "W"; mods = "Control"; chars = "\\x17";}
|
||||||
|
{key = "X"; mods = "Control"; chars = "\\x18";}
|
||||||
|
{key = "Y"; mods = "Control"; chars = "\\x19";}
|
||||||
|
{key = "Z"; mods = "Control"; chars = "\\x1A";}
|
||||||
|
{key = "Key6"; mods = "Control|Shift"; chars = "\\x1E";} # Control + ^
|
||||||
|
{key = "Minus"; mods = "Control|Shift"; chars = "\\x1F";} # Control + _
|
||||||
|
{key = "A"; mods = "Alt"; chars = "\\x1ba";}
|
||||||
|
{key = "B"; mods = "Alt"; chars = "\\x1bb";}
|
||||||
|
{key = "C"; mods = "Alt"; chars = "\\x1bc";}
|
||||||
|
{key = "D"; mods = "Alt"; chars = "\\x1bd";}
|
||||||
|
{key = "E"; mods = "Alt"; chars = "\\x1be";}
|
||||||
|
{key = "F"; mods = "Alt"; chars = "\\x1bf";}
|
||||||
|
{key = "G"; mods = "Alt"; chars = "\\x1bg";}
|
||||||
|
{key = "H"; mods = "Alt"; chars = "\\x1bh";}
|
||||||
|
{key = "I"; mods = "Alt"; chars = "\\x1bi";}
|
||||||
|
{key = "J"; mods = "Alt"; chars = "\\x1bj";}
|
||||||
|
{key = "K"; mods = "Alt"; chars = "\\x1bk";}
|
||||||
|
{key = "L"; mods = "Alt"; chars = "\\x1bl";}
|
||||||
|
{key = "M"; mods = "Alt"; chars = "\\x1bm";}
|
||||||
|
{key = "N"; mods = "Alt"; chars = "\\x1bn";}
|
||||||
|
{key = "O"; mods = "Alt"; chars = "\\x1bo";}
|
||||||
|
{key = "P"; mods = "Alt"; chars = "\\x1bp";}
|
||||||
|
{key = "Q"; mods = "Alt"; chars = "\\x1bq";}
|
||||||
|
{key = "R"; mods = "Alt"; chars = "\\x1br";}
|
||||||
|
{key = "S"; mods = "Alt"; chars = "\\x1bs";}
|
||||||
|
{key = "T"; mods = "Alt"; chars = "\\x1bt";}
|
||||||
|
{key = "U"; mods = "Alt"; chars = "\\x1bu";}
|
||||||
|
{key = "V"; mods = "Alt"; chars = "\\x1bv";}
|
||||||
|
{key = "W"; mods = "Alt"; chars = "\\x1bw";}
|
||||||
|
{key = "X"; mods = "Alt"; chars = "\\x1bx";}
|
||||||
|
{key = "Y"; mods = "Alt"; chars = "\\x1by";}
|
||||||
|
{key = "Z"; mods = "Alt"; chars = "\\x1bz";}
|
||||||
|
{key = "A"; mods = "Alt|Shift"; chars = "\\x1bA";}
|
||||||
|
{key = "B"; mods = "Alt|Shift"; chars = "\\x1bB";}
|
||||||
|
{key = "C"; mods = "Alt|Shift"; chars = "\\x1bC";}
|
||||||
|
{key = "D"; mods = "Alt|Shift"; chars = "\\x1bD";}
|
||||||
|
{key = "E"; mods = "Alt|Shift"; chars = "\\x1bE";}
|
||||||
|
{key = "F"; mods = "Alt|Shift"; chars = "\\x1bF";}
|
||||||
|
{key = "G"; mods = "Alt|Shift"; chars = "\\x1bG";}
|
||||||
|
{key = "H"; mods = "Alt|Shift"; chars = "\\x1bH";}
|
||||||
|
{key = "I"; mods = "Alt|Shift"; chars = "\\x1bI";}
|
||||||
|
{key = "J"; mods = "Alt|Shift"; chars = "\\x1bJ";}
|
||||||
|
{key = "K"; mods = "Alt|Shift"; chars = "\\x1bK";}
|
||||||
|
{key = "L"; mods = "Alt|Shift"; chars = "\\x1bL";}
|
||||||
|
{key = "M"; mods = "Alt|Shift"; chars = "\\x1bM";}
|
||||||
|
{key = "N"; mods = "Alt|Shift"; chars = "\\x1bN";}
|
||||||
|
{key = "O"; mods = "Alt|Shift"; chars = "\\x1bO";}
|
||||||
|
{key = "P"; mods = "Alt|Shift"; chars = "\\x1bP";}
|
||||||
|
{key = "Q"; mods = "Alt|Shift"; chars = "\\x1bQ";}
|
||||||
|
{key = "R"; mods = "Alt|Shift"; chars = "\\x1bR";}
|
||||||
|
{key = "S"; mods = "Alt|Shift"; chars = "\\x1bS";}
|
||||||
|
{key = "T"; mods = "Alt|Shift"; chars = "\\x1bT";}
|
||||||
|
{key = "U"; mods = "Alt|Shift"; chars = "\\x1bU";}
|
||||||
|
{key = "V"; mods = "Alt|Shift"; chars = "\\x1bV";}
|
||||||
|
{key = "W"; mods = "Alt|Shift"; chars = "\\x1bW";}
|
||||||
|
{key = "X"; mods = "Alt|Shift"; chars = "\\x1bX";}
|
||||||
|
{key = "Y"; mods = "Alt|Shift"; chars = "\\x1bY";}
|
||||||
|
{key = "Z"; mods = "Alt|Shift"; chars = "\\x1bZ";}
|
||||||
|
{key = "Key1"; mods = "Alt"; chars = "\\x1b1";}
|
||||||
|
{key = "Key2"; mods = "Alt"; chars = "\\x1b2";}
|
||||||
|
{key = "Key3"; mods = "Alt"; chars = "\\x1b3";}
|
||||||
|
{key = "Key4"; mods = "Alt"; chars = "\\x1b4";}
|
||||||
|
{key = "Key5"; mods = "Alt"; chars = "\\x1b5";}
|
||||||
|
{key = "Key6"; mods = "Alt"; chars = "\\x1b6";}
|
||||||
|
{key = "Key7"; mods = "Alt"; chars = "\\x1b7";}
|
||||||
|
{key = "Key8"; mods = "Alt"; chars = "\\x1b8";}
|
||||||
|
{key = "Key9"; mods = "Alt"; chars = "\\x1b9";}
|
||||||
|
{key = "Key0"; mods = "Alt"; chars = "\\x1b0";}
|
||||||
|
{key = "Space"; mods = "Control"; chars = "\\x00";} # Ctrl + Space
|
||||||
|
{key = "Grave"; mods = "Alt"; chars = "\\x1b`";} # Alt + `
|
||||||
|
{key = "Grave"; mods = "Alt|Shift"; chars = "\\x1b~";} # Alt + ~
|
||||||
|
{key = "Period"; mods = "Alt"; chars = "\\x1b.";} # Alt + .
|
||||||
|
{key = "Key8"; mods = "Alt|Shift"; chars = "\\x1b*";} # Alt + *
|
||||||
|
{key = "Key3"; mods = "Alt|Shift"; chars = "\\x1b#";} # Alt + #
|
||||||
|
{key = "Period"; mods = "Alt|Shift"; chars = "\\x1b>";} # Alt + >
|
||||||
|
{key = "Comma"; mods = "Alt|Shift"; chars = "\\x1b<";} # Alt + <
|
||||||
|
{key = "Minus"; mods = "Alt|Shift"; chars = "\\x1b_";} # Alt + _
|
||||||
|
{key = "Key5"; mods = "Alt|Shift"; chars = "\\x1b%";} # Alt + %
|
||||||
|
{key = "Key6"; mods = "Alt|Shift"; chars = "\\x1b^";} # Alt + ^
|
||||||
|
{key = "Backslash"; mods = "Alt"; chars = "\\x1b";} # Alt + \
|
||||||
|
{key = "Backslash"; mods = "Alt|Shift"; chars = "\\x1b|";} # Alt + |
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [pkgs.arduino];
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
fingerprint = "CE:A0:28:27:D8:4E:43:4B:63:3A:A0:B3:00:F4:14:5B:DA:E2:17:3D";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.barrier.client = {
|
||||||
|
enable = true;
|
||||||
|
# enableDragDrop = true;
|
||||||
|
enableCrypto = true;
|
||||||
|
name = "capibara";
|
||||||
|
server = "echidna";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".local/share/barrier/SSL/Fingerprints/TrustedServers.txt".text = "${fingerprint}\n";
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./firefox ];
|
||||||
|
|
||||||
|
home.packages = [
|
||||||
|
pkgs.icecat-bin
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.chromium = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.ungoogled-chromium;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
/* 0000: disable about:config warning
|
||||||
|
* FF73-86: chrome://global/content/config.xhtml ***/
|
||||||
|
{
|
||||||
|
"general.warnOnAboutConfig" = false; # XHTML version
|
||||||
|
"browser.aboutConfig.showWarning" = false; # HTML version [FF71+]
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
# [SECTION 0100]: STARTUP
|
||||||
|
{
|
||||||
|
/* 0101: disable default browser check
|
||||||
|
* [SETTING] General>Startup>Always check if Firefox is your default browser ***/
|
||||||
|
"browser.shell.checkDefaultBrowser" = false;
|
||||||
|
/* 0102: set startup page [SETUP-CHROME]
|
||||||
|
* 0=blank, 1=home, 2=last visited page, 3=resume previous session
|
||||||
|
* [NOTE] Session Restore is not used in PB mode (0110) and is cleared with history (2803, 2804)
|
||||||
|
* [SETTING] General>Startup>Restore previous session ***/
|
||||||
|
"browser.startup.page" = 0;
|
||||||
|
/* 0103: set HOME+NEWWINDOW page
|
||||||
|
* about:home=Activity Stream (default, see 0105), custom URL, about:blank
|
||||||
|
* [SETTING] Home>New Windows and Tabs>Homepage and new windows ***/
|
||||||
|
"browser.startup.homepage" = "about:blank";
|
||||||
|
/* 0104: set NEWTAB page
|
||||||
|
* true=Activity Stream (default, see 0105), false=blank page
|
||||||
|
* [SETTING] Home>New Windows and Tabs>New tabs ***/
|
||||||
|
"browser.newtabpage.enabled" = false;
|
||||||
|
"browser.newtab.preload" = false;
|
||||||
|
/* 0105: disable Activity Stream stuff (AS)
|
||||||
|
* AS is the default homepage/newtab in FF57+, based on metadata and browsing behavior.
|
||||||
|
* **NOT LISTING ALL OF THESE: USE THE PREFERENCES UI**
|
||||||
|
* [SETTING] Home>Firefox Home Content>... to show/hide what you want ***/
|
||||||
|
/* 0105a: disable Activity Stream telemetry ***/
|
||||||
|
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
|
||||||
|
"browser.newtabpage.activity-stream.telemetry" = false;
|
||||||
|
/* 0105b: disable Activity Stream Snippets
|
||||||
|
* Runs code received from a server (aka Remote Code Execution) and sends information back to a metrics server
|
||||||
|
* [1] https://abouthome-snippets-service.readthedocs.io/ ***/
|
||||||
|
"browser.newtabpage.activity-stream.feeds.snippets" = false; # [DEFAULT: false FF89+]
|
||||||
|
/* 0105c: disable Activity Stream Top Stories, Pocket-based and/or sponsored content ***/
|
||||||
|
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
|
||||||
|
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsored" = false;
|
||||||
|
"browser.newtabpage.activity-stream.feeds.discoverystreamfeed" = false; # [FF66+]
|
||||||
|
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false; # [FF83+]
|
||||||
|
/* 0105e: clear default topsites
|
||||||
|
* [NOTE] This does not block you from adding your own ***/
|
||||||
|
"browser.newtabpage.activity-stream.default.sites" = "";
|
||||||
|
/* 0110: start Firefox in PB (Private Browsing) mode
|
||||||
|
* [NOTE] In this mode *all* windows are "private windows" and the PB mode icon is not displayed
|
||||||
|
* [WARNING] The P in PB mode is misleading: it means no "persistent" disk storage such as history,
|
||||||
|
* caches, searches, cookies, localStorage, IndexedDB etc (which you can achieve in normal mode).
|
||||||
|
* In fact, PB mode limits or removes the ability to control some of these, and you need to quit
|
||||||
|
* Firefox to clear them. PB is best used as a one off window (File>New Private Window) to provide
|
||||||
|
* a temporary self-contained new session. Close all Private Windows to clear the PB mode session.
|
||||||
|
* [SETTING] Privacy & Security>History>Custom Settings>Always use private browsing mode
|
||||||
|
* [1] https://wiki.mozilla.org/Private_Browsing
|
||||||
|
* [2] https://spreadprivacy.com/is-private-browsing-really-private/ ***/
|
||||||
|
"browser.privatebrowsing.autostart" = true;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*** [SECTION 0200]: GEOLOCATION / LANGUAGE / LOCALE ***/
|
||||||
|
{
|
||||||
|
/** GEOLOCATION ***/
|
||||||
|
/* 0201: disable Location-Aware Browsing
|
||||||
|
* [NOTE] Best left at default "true", fingerprintable, already behind a prompt (see 0202)
|
||||||
|
* [1] https://www.mozilla.org/firefox/geolocation/ ***/
|
||||||
|
# user_pref("geo.enabled", false);
|
||||||
|
/* 0202: set a default permission for Location (see 0201) [FF58+]
|
||||||
|
* 0=always ask (default), 1=allow, 2=block
|
||||||
|
* [NOTE] Best left at default "always ask", fingerprintable via Permissions API
|
||||||
|
* [SETTING] to add site exceptions: Ctrl+I>Permissions>Access Your Location
|
||||||
|
* [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Location>Settings ***/
|
||||||
|
# user_pref("permissions.default.geo", 2);
|
||||||
|
/* 0203: use Mozilla geolocation service instead of Google when geolocation is enabled [FF74+]
|
||||||
|
* Optionally enable logging to the console (defaults to false) ***/
|
||||||
|
"geo.provider.network.url" = "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%";
|
||||||
|
# user_pref("geo.provider.network.logging.enabled", true); // [HIDDEN PREF]
|
||||||
|
/* 0204: disable using the OS's geolocation service ***/
|
||||||
|
"geo.provider.ms-windows-location" = false; # [WINDOWS]
|
||||||
|
"geo.provider.use_corelocation" = false; # [MAC]
|
||||||
|
"geo.provider.use_gpsd" = false; # [LINUX]
|
||||||
|
/* 0207: disable region updates
|
||||||
|
* [1] https://firefox-source-docs.mozilla.org/toolkit/modules/toolkit_modules/Region.html ***/
|
||||||
|
"browser.region.network.url" = ""; # [FF78+]
|
||||||
|
"browser.region.update.enabled" = false; # [FF79+]
|
||||||
|
/* 0208: set search region
|
||||||
|
* [NOTE] May not be hidden if Firefox has changed your settings due to your region (see 0207) ***/
|
||||||
|
# user_pref("browser.search.region", "US"); // [HIDDEN PREF]
|
||||||
|
|
||||||
|
/** LANGUAGE / LOCALE ***/
|
||||||
|
/* 0210: set preferred language for displaying web pages
|
||||||
|
* [TEST] https://addons.mozilla.org/about ***/
|
||||||
|
"intl.accept_languages" = "en-US, en";
|
||||||
|
/* 0211: use US English locale regardless of the system locale
|
||||||
|
* [SETUP-WEB] May break some input methods e.g xim/ibus for CJK languages [1]
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=867501,1629630 ***/
|
||||||
|
"javascript.use_us_english_locale" = true; # [HIDDEN PREF]
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
/*** [SECTION 0300]: QUIET FOX
|
||||||
|
We only disable the auto-INSTALL of Firefox (app) updates. You still get prompts to update,
|
||||||
|
and it only takes one click. We highly discourage disabling auto-CHECKING for updates.
|
||||||
|
|
||||||
|
Legitimate reasons to disable auto-INSTALLS include hijacked/monetized extensions, time
|
||||||
|
constraints, legacy issues, dev/testing, and fear of breakage/bugs. It is still important
|
||||||
|
to do updates for security reasons, please do so manually if you make changes.
|
||||||
|
***/
|
||||||
|
{
|
||||||
|
/* 0301: disable auto-INSTALLING Firefox updates [NON-WINDOWS FF65+]
|
||||||
|
* [NOTE] In FF65+ on Windows this SETTING (below) is now stored in a file and the pref was removed
|
||||||
|
* [SETTING] General>Firefox Updates>Check for updates but let you choose to install them ***/
|
||||||
|
"app.update.auto" = false;
|
||||||
|
/* 0302: disable auto-INSTALLING Firefox updates via a background service [FF90+] [WINDOWS]
|
||||||
|
* [SETTING] General>Firefox Updates>Automatically install updates>When Firefox is not running
|
||||||
|
* [1] https://support.mozilla.org/kb/enable-background-updates-firefox-windows ***/
|
||||||
|
"app.update.background.scheduling.enabled" = false;
|
||||||
|
/* 0303: disable auto-CHECKING for extension and theme updates ***/
|
||||||
|
# user_pref("extensions.update.enabled", false);
|
||||||
|
/* 0304: disable auto-INSTALLING extension and theme updates (after the check in 0303)
|
||||||
|
* [SETTING] about:addons>Extensions>[cog-wheel-icon]>Update Add-ons Automatically (toggle) ***/
|
||||||
|
# user_pref("extensions.update.autoUpdateDefault", false);
|
||||||
|
/* 0306: disable extension metadata
|
||||||
|
* used when installing/updating an extension, and in daily background update checks:
|
||||||
|
* when false, extension detail tabs will have no description ***/
|
||||||
|
# user_pref("extensions.getAddons.cache.enabled", false);
|
||||||
|
/* 0308: disable search engine updates (e.g. OpenSearch)
|
||||||
|
* [NOTE] This does not affect Mozilla's built-in or Web Extension search engines ***/
|
||||||
|
"browser.search.update" = false;
|
||||||
|
/* 0320: disable about:addons' Recommendations pane (uses Google Analytics) ***/
|
||||||
|
"extensions.getAddons.showPane" = false; # [HIDDEN PREF]
|
||||||
|
/* 0321: disable recommendations in about:addons' Extensions and Themes panes [FF68+] ***/
|
||||||
|
"extensions.htmlaboutaddons.recommendations.enabled" = false;
|
||||||
|
/* 0330: disable telemetry
|
||||||
|
* the pref (.unified) affects the behaviour of the pref (.enabled)
|
||||||
|
* IF unified=false then .enabled controls the telemetry module
|
||||||
|
* IF unified=true then .enabled ONLY controls whether to record extended data
|
||||||
|
* so make sure to have both set as false
|
||||||
|
* [NOTE] FF58+ 'toolkit.telemetry.enabled' is now LOCKED to reflect prerelease
|
||||||
|
* or release builds (true and false respectively) [2]
|
||||||
|
* [1] https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/telemetry/internals/preferences.html
|
||||||
|
* [2] https://medium.com/georg-fritzsche/data-preference-changes-in-firefox-58-2d5df9c428b5 ***/
|
||||||
|
"toolkit.telemetry.unified" = false;
|
||||||
|
"toolkit.telemetry.enabled" = false; # see [NOTE]
|
||||||
|
"toolkit.telemetry.server" = "data:,";
|
||||||
|
"toolkit.telemetry.archive.enabled" = false;
|
||||||
|
"toolkit.telemetry.newProfilePing.enabled" = false; # [FF55+]
|
||||||
|
"toolkit.telemetry.shutdownPingSender.enabled" = false; # [FF55+]
|
||||||
|
"toolkit.telemetry.updatePing.enabled" = false; # [FF56+]
|
||||||
|
"toolkit.telemetry.bhrPing.enabled" = false; # [FF57+] Background Hang Reporter
|
||||||
|
"toolkit.telemetry.firstShutdownPing.enabled" = false; # [FF57+]
|
||||||
|
/* 0331: disable Telemetry Coverage
|
||||||
|
* [1] https://blog.mozilla.org/data/2018/08/20/effectively-measuring-search-in-firefox/ ***/
|
||||||
|
"toolkit.telemetry.coverage.opt-out" = true; # [HIDDEN PREF]
|
||||||
|
"toolkit.coverage.opt-out" = true; # [FF64+] [HIDDEN PREF]
|
||||||
|
"toolkit.coverage.endpoint.base" = "";
|
||||||
|
/* 0340: disable Health Reports
|
||||||
|
* [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to send technical... data ***/
|
||||||
|
"datareporting.healthreport.uploadEnabled" = false;
|
||||||
|
/* 0341: disable new data submission, master kill switch [FF41+]
|
||||||
|
* If disabled, no policy is shown or upload takes place, ever
|
||||||
|
* [1] https://bugzilla.mozilla.org/1195552 ***/
|
||||||
|
"datareporting.policy.dataSubmissionEnabled" = false;
|
||||||
|
/* 0342: disable Studies (see 0503)
|
||||||
|
* [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to install and run studies ***/
|
||||||
|
"app.shield.optoutstudies.enabled" = false;
|
||||||
|
/* 0343: disable personalized Extension Recommendations in about:addons and AMO [FF65+]
|
||||||
|
* [NOTE] This pref has no effect when Health Reports (0340) are disabled
|
||||||
|
* [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to make personalized extension recommendations
|
||||||
|
* [1] https://support.mozilla.org/kb/personalized-extension-recommendations ***/
|
||||||
|
"browser.discovery.enabled" = false;
|
||||||
|
/* 0350: disable Crash Reports ***/
|
||||||
|
"breakpad.reportURL" = "";
|
||||||
|
"browser.tabs.crashReporting.sendReport" = false; # [FF44+]
|
||||||
|
# user_pref("browser.crashReports.unsubmittedCheck.enabled", false); // [FF51+] [DEFAULT: false]
|
||||||
|
/* 0351: enforce no submission of backlogged Crash Reports [FF58+]
|
||||||
|
* [SETTING] Privacy & Security>Firefox Data Collection & Use>Allow Firefox to send backlogged crash reports ***/
|
||||||
|
"browser.crashReports.unsubmittedCheck.autoSubmit2" = false; # [DEFAULT: false]
|
||||||
|
/* 0390: disable Captive Portal detection
|
||||||
|
* [1] https://www.eff.org/deeplinks/2017/08/how-captive-portals-interfere-wireless-security-and-privacy
|
||||||
|
* [2] https://wiki.mozilla.org/Necko/CaptivePortal ***/
|
||||||
|
"captivedetect.canonicalURL" = "";
|
||||||
|
"network.captive-portal-service.enabled" = false; # [FF52+]
|
||||||
|
/* 0391: disable Network Connectivity checks [FF65+]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1460537 ***/
|
||||||
|
"network.connectivity-service.enabled" = false;
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0400]: BLOCKLISTS / SAFE BROWSING (SB) ***/
|
||||||
|
/** BLOCKLISTS ***/
|
||||||
|
/* 0401: enforce Firefox blocklist
|
||||||
|
* [NOTE] It includes updates for "revoked certificates"
|
||||||
|
* [1] https://blog.mozilla.org/security/2015/03/03/revoking-intermediate-certificates-introducing-onecrl/ ***/
|
||||||
|
"extensions.blocklist.enabled" = true; # [DEFAULT: true]
|
||||||
|
|
||||||
|
/** SAFE BROWSING (SB)
|
||||||
|
Safe Browsing has taken many steps to preserve privacy. *IF* required, a full url is never
|
||||||
|
sent to Google, only a PART-hash of the prefix, and this is hidden with noise of other real
|
||||||
|
PART-hashes. Google also swear it is anonymized and only used to flag malicious sites.
|
||||||
|
Firefox also takes measures such as striping out identifying parameters and since SBv4 (FF57+)
|
||||||
|
doesn't even use cookies. (#Turn on browser.safebrowsing.debug to monitor this activity)
|
||||||
|
|
||||||
|
[1] https://feeding.cloud.geek.nz/posts/how-safe-browsing-works-in-firefox/
|
||||||
|
[2] https://wiki.mozilla.org/Security/Safe_Browsing
|
||||||
|
[3] https://support.mozilla.org/kb/how-does-phishing-and-malware-protection-work
|
||||||
|
***/
|
||||||
|
/* 0410: disable SB (Safe Browsing)
|
||||||
|
* [WARNING] Do this at your own risk! These are the master switches.
|
||||||
|
* [SETTING] Privacy & Security>Security>... "Block dangerous and deceptive content" ***/
|
||||||
|
# // user_pref("browser.safebrowsing.malware.enabled", false);
|
||||||
|
# // user_pref("browser.safebrowsing.phishing.enabled", false);
|
||||||
|
/* 0411: disable SB checks for downloads (both local lookups + remote)
|
||||||
|
* This is the master switch for the safebrowsing.downloads* prefs (0412, 0413)
|
||||||
|
* [SETTING] Privacy & Security>Security>... "Block dangerous downloads" ***/
|
||||||
|
# // user_pref("browser.safebrowsing.downloads.enabled", false);
|
||||||
|
/* 0412: disable SB checks for downloads (remote)
|
||||||
|
* To verify the safety of certain executable files, Firefox may submit some information about the
|
||||||
|
* file, including the name, origin, size and a cryptographic hash of the contents, to the Google
|
||||||
|
* Safe Browsing service which helps Firefox determine whether or not the file should be blocked
|
||||||
|
* [SETUP-SECURITY] If you do not understand this, or you want this protection, then override it ***/
|
||||||
|
"browser.safebrowsing.downloads.remote.enabled" = false;
|
||||||
|
"browser.safebrowsing.downloads.remote.url" = "";
|
||||||
|
/* 0413: disable SB checks for unwanted software
|
||||||
|
* [SETTING] Privacy & Security>Security>... "Warn you about unwanted and uncommon software" ***/
|
||||||
|
# // user_pref("browser.safebrowsing.downloads.remote.block_potentially_unwanted", false);
|
||||||
|
# // user_pref("browser.safebrowsing.downloads.remote.block_uncommon", false);
|
||||||
|
/* 0419: disable 'ignore this warning' on SB warnings [FF45+]
|
||||||
|
* If clicked, it bypasses the block for that session. This is a means for admins to enforce SB
|
||||||
|
* [TEST] see github wiki APPENDIX A: Test Sites: Section 5
|
||||||
|
* [1] https://bugzilla.mozilla.org/1226490 ***/
|
||||||
|
# // user_pref("browser.safebrowsing.allowOverride", false);
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0500]: SYSTEM ADD-ONS / EXPERIMENTS
|
||||||
|
System Add-ons are a method for shipping extensions, considered to be
|
||||||
|
built-in features to Firefox, that are hidden from the about:addons UI.
|
||||||
|
To view your System Add-ons go to about:support, they are listed under "Firefox Features"
|
||||||
|
|
||||||
|
* Portable: "...\App\Firefox64\browser\features\" (or "App\Firefox\etc" for 32bit)
|
||||||
|
* Windows: "...\Program Files\Mozilla\browser\features" (or "Program Files (X86)\etc" for 32bit)
|
||||||
|
* Mac: "...\Applications\Firefox\Contents\Resources\browser\features\"
|
||||||
|
[NOTE] On Mac you can right-click on the application and select "Show Package Contents"
|
||||||
|
* Linux: "/usr/lib/firefox/browser/features" (or similar)
|
||||||
|
|
||||||
|
[1] https://firefox-source-docs.mozilla.org/toolkit/mozapps/extensions/addon-manager/SystemAddons.html
|
||||||
|
[2] https://searchfox.org/mozilla-central/source/browser/extensions
|
||||||
|
***/
|
||||||
|
/* 0503: disable Normandy/Shield [FF60+]
|
||||||
|
* Shield is an telemetry system (including Heartbeat) that can also push and test "recipes"
|
||||||
|
* [1] https://wiki.mozilla.org/Firefox/Shield
|
||||||
|
* [2] https://github.com/mozilla/normandy ***/
|
||||||
|
"app.normandy.enabled" = false;
|
||||||
|
"app.normandy.api_url" = "";
|
||||||
|
/* 0505: disable System Add-on updates ***/
|
||||||
|
"extensions.systemAddon.update.enabled" = false; # [FF62+]
|
||||||
|
"extensions.systemAddon.update.url" = ""; # [FF44+]
|
||||||
|
/* 0506: disable PingCentre telemetry (used in several System Add-ons) [FF57+]
|
||||||
|
* Currently blocked by 'datareporting.healthreport.uploadEnabled' (see 0340) ***/
|
||||||
|
"browser.ping-centre.telemetry" = false;
|
||||||
|
/* 0515: disable Screenshots ***/
|
||||||
|
# // user_pref("extensions.screenshots.disabled", true); // [FF55+]
|
||||||
|
/* 0517: disable Form Autofill
|
||||||
|
* [NOTE] Stored data is NOT secure (uses a JSON file)
|
||||||
|
* [NOTE] Heuristics controls Form Autofill on forms without @autocomplete attributes
|
||||||
|
* [SETTING] Privacy & Security>Forms and Autofill>Autofill addresses
|
||||||
|
* [1] https://wiki.mozilla.org/Firefox/Features/Form_Autofill ***/
|
||||||
|
"extensions.formautofill.addresses.enabled" = false; # [FF55+]
|
||||||
|
"extensions.formautofill.available" = "off"; # [FF56+]
|
||||||
|
"extensions.formautofill.creditCards.available" = false; # [FF57+]
|
||||||
|
"extensions.formautofill.creditCards.enabled" = false; # [FF56+]
|
||||||
|
"extensions.formautofill.heuristics.enabled" = false; # [FF55+]
|
||||||
|
/* 0518: enforce disabling of Web Compatibility Reporter [FF56+]
|
||||||
|
* Web Compatibility Reporter adds a "Report Site Issue" button to send data to Mozilla ***/
|
||||||
|
"extensions.webcompat-reporter.enabled" = false; # [DEFAULT: false]
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0600]: BLOCK IMPLICIT OUTBOUND [not explicitly asked for - e.g. clicked on] ***/
|
||||||
|
/* 0601: disable link prefetching
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/HTTP/Link_prefetching_FAQ ***/
|
||||||
|
"network.prefetch-next" = false;
|
||||||
|
/* 0602: disable DNS prefetching
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control ***/
|
||||||
|
"network.dns.disablePrefetch" = true;
|
||||||
|
# // user_pref("network.dns.disablePrefetchFromHTTPS", true); // [DEFAULT: true]
|
||||||
|
/* 0603: disable predictor / prefetching ***/
|
||||||
|
"network.predictor.enabled" = false;
|
||||||
|
# // user_pref("network.predictor.enable-prefetch", false); // [FF48+] [DEFAULT: false]
|
||||||
|
/* 0605: disable link-mouseover opening connection to linked server
|
||||||
|
* [1] https://news.slashdot.org/story/15/08/14/2321202/how-to-quash-firefoxs-silent-requests ***/
|
||||||
|
"network.http.speculative-parallel-limit" = 0;
|
||||||
|
/* 0606: enforce no "Hyperlink Auditing" (click tracking)
|
||||||
|
* [1] https://www.bleepingcomputer.com/news/software/major-browsers-to-prevent-disabling-of-click-tracking-privacy-risk/ ***/
|
||||||
|
# // user_pref("browser.send_pings", false); // [DEFAULT: false]
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0700]: HTTP* / TCP/IP / DNS / PROXY / SOCKS etc ***/
|
||||||
|
/* 0701: disable IPv6
|
||||||
|
* IPv6 can be abused, especially with MAC addresses, and can leak with VPNs. That's even
|
||||||
|
* assuming your ISP and/or router and/or website can handle it. Sites will fall back to IPv4
|
||||||
|
* [STATS] Firefox telemetry (July 2021) shows ~10% of all connections are IPv6
|
||||||
|
* [NOTE] This is just an application level fallback. Disabling IPv6 is best done at an
|
||||||
|
* OS/network level, and/or configured properly in VPN setups. If you are not masking your IP,
|
||||||
|
* then this won't make much difference. If you are masking your IP, then it can only help.
|
||||||
|
* [NOTE] PHP defaults to IPv6 with "localhost". Use "php -S 127.0.0.1:PORT"
|
||||||
|
* [TEST] https://ipleak.org/
|
||||||
|
* [1] https://www.internetsociety.org/tag/ipv6-security/ (see Myths 2,4,5,6) ***/
|
||||||
|
"network.dns.disableIPv6" = true;
|
||||||
|
/* 0702: disable HTTP2
|
||||||
|
* HTTP2 raises concerns with "multiplexing" and "server push", does nothing to
|
||||||
|
* enhance privacy, and opens up a number of server-side fingerprinting opportunities.
|
||||||
|
* [WARNING] Don't disable HTTP2. Don't be that one person using HTTP1.1 on HTTP2 sites
|
||||||
|
* [STATS] ~46% of sites (July 2021) [5]
|
||||||
|
* [1] https://http2.github.io/faq/
|
||||||
|
* [2] https://blog.scottlogic.com/2014/11/07/http-2-a-quick-look.html
|
||||||
|
* [3] https://http2.github.io/http2-spec/#rfc.section.10.8
|
||||||
|
* [4] https://queue.acm.org/detail.cfm?id=2716278
|
||||||
|
* [5] https://w3techs.com/technologies/details/ce-http2/all/all ***/
|
||||||
|
# // user_pref("network.http.spdy.enabled", false);
|
||||||
|
# // user_pref("network.http.spdy.enabled.deps", false);
|
||||||
|
# // user_pref("network.http.spdy.enabled.http2", false);
|
||||||
|
# // user_pref("network.http.spdy.websockets", false); // [FF65+]
|
||||||
|
/* 0703: disable HTTP Alternative Services [FF37+]
|
||||||
|
* [SETUP-PERF] Relax this if you have FPI enabled (see 4000) *AND* you understand the
|
||||||
|
* consequences. FPI isolates these, but it was designed with the Tor protocol in mind,
|
||||||
|
* and the Tor Browser has extra protection, including enhanced sanitizing per Identity.
|
||||||
|
* [1] https://tools.ietf.org/html/rfc7838#section-9
|
||||||
|
* [2] https://www.mnot.net/blog/2016/03/09/alt-svc ***/
|
||||||
|
"network.http.altsvc.enabled" = false;
|
||||||
|
"network.http.altsvc.oe" = false;
|
||||||
|
/* 0704: set the proxy server to do any DNS lookups when using SOCKS
|
||||||
|
* e.g. in Tor, this stops your local DNS server from knowing your Tor destination
|
||||||
|
* as a remote Tor node will handle the DNS request
|
||||||
|
* [1] https://trac.torproject.org/projects/tor/wiki/doc/TorifyHOWTO/WebBrowsers ***/
|
||||||
|
"network.proxy.socks_remote_dns" = true;
|
||||||
|
/* 0709: disable using UNC (Uniform Naming Convention) paths [FF61+]
|
||||||
|
* [SETUP-CHROME] Can break extensions for profiles on network shares
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/26424 ***/
|
||||||
|
"network.file.disable_unc_paths" = true; # [HIDDEN PREF]
|
||||||
|
/* 0710: disable GIO as a potential proxy bypass vector
|
||||||
|
* Gvfs/GIO has a set of supported protocols like obex, network, archive, computer, dav, cdda,
|
||||||
|
* gphoto2, trash, etc. By default only smb and sftp protocols are accepted so far (as of FF64)
|
||||||
|
* [1] https://bugzilla.mozilla.org/1433507
|
||||||
|
* [2] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/23044
|
||||||
|
* [3] https://en.wikipedia.org/wiki/GVfs
|
||||||
|
* [4] https://en.wikipedia.org/wiki/GIO_(software) ***/
|
||||||
|
"network.gio.supported-protocols" = ""; # [HIDDEN PREF]
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0800]: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
|
||||||
|
Change items 0850 and above to suit for privacy vs convenience and functionality. Consider
|
||||||
|
your environment (no unwanted eyeballs), your device (restricted access), your device's
|
||||||
|
unattended state (locked, encrypted, forensic hardened). Likewise, you may want to check
|
||||||
|
the items cleared on shutdown in section 2800.
|
||||||
|
[1] https://xkcd.com/538/
|
||||||
|
***/
|
||||||
|
/* 0801: disable location bar using search
|
||||||
|
* Don't leak URL typos to a search engine, give an error message instead.
|
||||||
|
* Examples: "secretplace,com", "secretplace/com", "secretplace com", "secret place.com"
|
||||||
|
* [NOTE] This does **not** affect explicit user action such as using search buttons in the
|
||||||
|
* dropdown, or using keyword search shortcuts you configure in options (e.g. 'd' for DuckDuckGo)
|
||||||
|
* [SETUP-CHROME] If you don't, or rarely, type URLs, or you use a default search
|
||||||
|
* engine that respects privacy, then you probably don't need this ***/
|
||||||
|
"keyword.enabled" = false;
|
||||||
|
/* 0802: disable location bar domain guessing
|
||||||
|
* domain guessing intercepts DNS "hostname not found errors" and resends a
|
||||||
|
* request (e.g. by adding www or .com). This is inconsistent use (e.g. FQDNs), does not work
|
||||||
|
* via Proxy Servers (different error), is a flawed use of DNS (TLDs: why treat .com
|
||||||
|
* as the 411 for DNS errors?), privacy issues (why connect to sites you didn't
|
||||||
|
* intend to), can leak sensitive data (e.g. query strings: e.g. Princeton attack),
|
||||||
|
* and is a security risk (e.g. common typos & malicious sites set up to exploit this) ***/
|
||||||
|
"browser.fixup.alternate.enabled" = false;
|
||||||
|
/* 0803: display all parts of the url in the location bar ***/
|
||||||
|
"browser.urlbar.trimURLs" = false;
|
||||||
|
/* 0805: disable coloring of visited links - CSS history leak
|
||||||
|
* [SETUP-HARDEN] Bulk rapid history sniffing was mitigated in 2010 [1][2]. Slower and more expensive
|
||||||
|
* redraw timing attacks were largely mitigated in FF77+ [3]. Using RFP (4501) further hampers timing
|
||||||
|
* attacks. Don't forget clearing history on close (2803). However, social engineering [2#limits][4][5]
|
||||||
|
* and advanced targeted timing attacks could still produce usable results
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/CSS/Privacy_and_the_:visited_selector
|
||||||
|
* [2] https://dbaron.org/mozilla/visited-privacy
|
||||||
|
* [3] https://bugzilla.mozilla.org/1632765
|
||||||
|
* [4] https://earthlng.github.io/testpages/visited_links.html (see github wiki APPENDIX A on how to use)
|
||||||
|
* [5] https://lcamtuf.blogspot.com/2016/08/css-mix-blend-mode-is-bad-for-keeping.html ***/
|
||||||
|
# // user_pref("layout.css.visited_links_enabled", false);
|
||||||
|
/* 0807: disable live search suggestions
|
||||||
|
/* [NOTE] Both must be true for the location bar to work
|
||||||
|
* [SETUP-CHROME] Change these if you trust and use a privacy respecting search engine
|
||||||
|
* [SETTING] Search>Provide search suggestions | Show search suggestions in address bar results ***/
|
||||||
|
"browser.search.suggest.enabled" = false;
|
||||||
|
"browser.urlbar.suggest.searches" = false;
|
||||||
|
/* 0810: disable location bar making speculative connections [FF56+]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1348275 ***/
|
||||||
|
"browser.urlbar.speculativeConnect.enabled" = false;
|
||||||
|
/* 0811: disable location bar leaking single words to a DNS provider **after searching** [FF78+]
|
||||||
|
* 0=never resolve single words, 1=heuristic (default), 2=always resolve
|
||||||
|
* [NOTE] For FF78 value 1 and 2 are the same and always resolve but that will change in future versions
|
||||||
|
* [1] https://bugzilla.mozilla.org/1642623 ***/
|
||||||
|
"browser.urlbar.dnsResolveSingleWordsAfterSearch" = 0;
|
||||||
|
/* 0850a: disable location bar suggestion types
|
||||||
|
* [SETTING] Privacy & Security>Address Bar>When using the address bar, suggest ***/
|
||||||
|
# // user_pref("browser.urlbar.suggest.history", false);
|
||||||
|
# // user_pref("browser.urlbar.suggest.bookmark", false);
|
||||||
|
# // user_pref("browser.urlbar.suggest.openpage", false);
|
||||||
|
# // user_pref("browser.urlbar.suggest.topsites", false); // [FF78+]
|
||||||
|
/* 0850b: disable tab-to-search [FF85+]
|
||||||
|
* Alternatively, you can exclude on a per-engine basis by unchecking them in Options>Search
|
||||||
|
* [SETTING] Privacy & Security>Address Bar>When using the address bar, suggest>Search engines ***/
|
||||||
|
# // user_pref("browser.urlbar.suggest.engines", false);
|
||||||
|
/* 0850c: disable location bar dropdown
|
||||||
|
* This value controls the total number of entries to appear in the location bar dropdown ***/
|
||||||
|
# // user_pref("browser.urlbar.maxRichResults", 0);
|
||||||
|
/* 0850d: disable location bar autofill
|
||||||
|
* [1] https://support.mozilla.org/kb/address-bar-autocomplete-firefox#w_url-autocomplete ***/
|
||||||
|
# // user_pref("browser.urlbar.autoFill", false);
|
||||||
|
/* 0860: disable search and form history
|
||||||
|
* [SETUP-WEB] Be aware that autocomplete form data can be read by third parties [1][2]
|
||||||
|
* [NOTE] We also clear formdata on exit (see 2803)
|
||||||
|
* [SETTING] Privacy & Security>History>Custom Settings>Remember search and form history
|
||||||
|
* [1] https://blog.mindedsecurity.com/2011/10/autocompleteagain.html
|
||||||
|
* [2] https://bugzilla.mozilla.org/381681 ***/
|
||||||
|
"browser.formfill.enable" = false;
|
||||||
|
/* 0862: disable browsing and download history
|
||||||
|
* [NOTE] We also clear history and downloads on exiting Firefox (see 2803)
|
||||||
|
* [SETTING] Privacy & Security>History>Custom Settings>Remember browsing and download history ***/
|
||||||
|
# // user_pref("places.history.enabled", false);
|
||||||
|
/* 0870: disable Windows jumplist [WINDOWS] ***/
|
||||||
|
"browser.taskbar.lists.enabled" = false;
|
||||||
|
"browser.taskbar.lists.frequent.enabled" = false;
|
||||||
|
"browser.taskbar.lists.recent.enabled" = false;
|
||||||
|
"browser.taskbar.lists.tasks.enabled" = false;
|
||||||
|
/* 0871: disable Windows taskbar preview [WINDOWS] ***/
|
||||||
|
# // user_pref("browser.taskbar.previews.enable", false); // [DEFAULT: false]
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 0900]: PASSWORDS ***/
|
||||||
|
/* 0901: disable saving passwords
|
||||||
|
* [NOTE] This does not clear any passwords already saved
|
||||||
|
* [SETTING] Privacy & Security>Logins and Passwords>Ask to save logins and passwords for websites ***/
|
||||||
|
# // user_pref("signon.rememberSignons", false);
|
||||||
|
/* 0902: use a primary password
|
||||||
|
* There are no preferences for this. It is all handled internally.
|
||||||
|
* [SETTING] Privacy & Security>Logins and Passwords>Use a Primary Password
|
||||||
|
* [1] https://support.mozilla.org/kb/use-primary-password-protect-stored-logins-and-pas ***/
|
||||||
|
/* 0903: set how often Firefox should ask for the primary password
|
||||||
|
* 0=the first time (default), 1=every time it's needed, 2=every n minutes (see 0904) ***/
|
||||||
|
"security.ask_for_password" = 2;
|
||||||
|
/* 0904: set how often in minutes Firefox should ask for the primary password (see 0903)
|
||||||
|
* in minutes, default is 30 ***/
|
||||||
|
"security.password_lifetime" = 5;
|
||||||
|
/* 0905: disable auto-filling username & password form fields
|
||||||
|
* can leak in cross-site forms *and* be spoofed
|
||||||
|
* [NOTE] Username & password is still available when you enter the field
|
||||||
|
* [SETTING] Privacy & Security>Logins and Passwords>Autofill logins and passwords
|
||||||
|
* [1] https://freedom-to-tinker.com/2017/12/27/no-boundaries-for-user-identities-web-trackers-exploit-browser-login-managers/ ***/
|
||||||
|
"signon.autofillForms" = false;
|
||||||
|
/* 0909: disable formless login capture for Password Manager [FF51+] ***/
|
||||||
|
"signon.formlessCapture.enabled" = false;
|
||||||
|
/* 0912: limit (or disable) HTTP authentication credentials dialogs triggered by sub-resources [FF41+]
|
||||||
|
* hardens against potential credentials phishing
|
||||||
|
* 0=don't allow sub-resources to open HTTP authentication credentials dialogs
|
||||||
|
* 1=don't allow cross-origin sub-resources to open HTTP authentication credentials dialogs
|
||||||
|
* 2=allow sub-resources to open HTTP authentication credentials dialogs (default) ***/
|
||||||
|
"network.auth.subresource-http-auth-allow" = 1;
|
||||||
|
/* 0913: disable automatic authentication on Microsoft sites [FF91+] [WINDOWS 10+]
|
||||||
|
* [SETTING] Privacy & Security>Logins and Passwords>Allow Windows single sign-on for...
|
||||||
|
* [1] https://support.mozilla.org/kb/windows-sso ***/
|
||||||
|
"network.http.windows-sso.enabled" = false;
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1000]: CACHE / SESSION (RE)STORE / FAVICONS
|
||||||
|
Cache tracking/fingerprinting techniques [1][2][3] require a cache. Disabling disk (1001)
|
||||||
|
*and* memory (1003) caches is one solution; but that's extreme and fingerprintable. A hardened
|
||||||
|
Temporary Containers configuration can effectively do the same thing, by isolating every tab [4].
|
||||||
|
|
||||||
|
We consider avoiding disk cache (1001) so cache is session/memory only (like Private Browsing
|
||||||
|
mode), and isolating cache to first party (4001) is sufficient and a good balance between
|
||||||
|
risk and performance. ETAGs can also be neutralized by modifying response headers [5], and
|
||||||
|
you can clear the cache manually or on a regular basis with an extension.
|
||||||
|
|
||||||
|
[1] https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags
|
||||||
|
[2] https://robertheaton.com/2014/01/20/cookieless-user-tracking-for-douchebags/
|
||||||
|
[3] https://www.grepular.com/Preventing_Web_Tracking_via_the_Browser_Cache
|
||||||
|
[4] https://medium.com/@stoically/enhance-your-privacy-in-firefox-with-temporary-containers-33925cd6cd21
|
||||||
|
[5] https://github.com/arkenfox/user.js/wiki/4.2.4-Header-Editor
|
||||||
|
***/
|
||||||
|
/** CACHE ***/
|
||||||
|
/* 1001: disable disk cache
|
||||||
|
* [SETUP-PERF] If you think disk cache may help (heavy tab user, high-res video),
|
||||||
|
* or you use a hardened Temporary Containers, then feel free to override this
|
||||||
|
* [NOTE] We also clear cache on exiting Firefox (see 2803) ***/
|
||||||
|
"browser.cache.disk.enable" = false;
|
||||||
|
/* 1003: disable memory cache
|
||||||
|
* capacity: -1=determine dynamically (default), 0=none, n=memory capacity in kibibytes ***/
|
||||||
|
# // user_pref("browser.cache.memory.enable", false);
|
||||||
|
# // user_pref("browser.cache.memory.capacity", 0);
|
||||||
|
/* 1006: disable permissions manager from writing to disk [RESTART]
|
||||||
|
* [NOTE] This means any permission changes are session only
|
||||||
|
* [1] https://bugzilla.mozilla.org/967812 ***/
|
||||||
|
# // user_pref("permissions.memory_only", true); // [HIDDEN PREF]
|
||||||
|
/* 1007: disable media cache from writing to disk in Private Browsing
|
||||||
|
* [NOTE] MSE (Media Source Extensions) are already stored in-memory in PB
|
||||||
|
* [SETUP-WEB] ESR78: playback might break on subsequent loading (1650281) ***/
|
||||||
|
"browser.privatebrowsing.forceMediaMemoryCache" = true; # [FF75+]
|
||||||
|
"media.memory_cache_max_size" = 65536;
|
||||||
|
|
||||||
|
/** SESSIONS & SESSION RESTORE ***/
|
||||||
|
/* 1020: exclude "Undo Closed Tabs" in Session Restore ***/
|
||||||
|
# // user_pref("browser.sessionstore.max_tabs_undo", 0);
|
||||||
|
/* 1021: disable storing extra session data [SETUP-CHROME]
|
||||||
|
* define on which sites to save extra session data such as form content, cookies and POST data
|
||||||
|
* 0=everywhere, 1=unencrypted sites, 2=nowhere ***/
|
||||||
|
"browser.sessionstore.privacy_level" = 2;
|
||||||
|
/* 1022: disable resuming session from crash ***/
|
||||||
|
# // user_pref("browser.sessionstore.resume_from_crash", false);
|
||||||
|
/* 1023: set the minimum interval between session save operations
|
||||||
|
* Increasing this can help on older machines and some websites, as well as reducing writes [1]
|
||||||
|
* Default is 15000 (15 secs). Try 30000 (30 secs), 60000 (1 min) etc
|
||||||
|
* [SETUP-CHROME] This can also affect entries in the "Recently Closed Tabs" feature:
|
||||||
|
* i.e. the longer the interval the more chance a quick tab open/close won't be captured.
|
||||||
|
* This longer interval *may* affect history but we cannot replicate any history not recorded
|
||||||
|
* [1] https://bugzilla.mozilla.org/1304389 ***/
|
||||||
|
"browser.sessionstore.interval" = 30000;
|
||||||
|
/* 1024: disable automatic Firefox start and session restore after reboot [FF62+] [WINDOWS]
|
||||||
|
* [1] https://bugzilla.mozilla.org/603903 ***/
|
||||||
|
"toolkit.winRegisterApplicationRestart" = false;
|
||||||
|
|
||||||
|
/** FAVICONS ***/
|
||||||
|
/* 1030: disable favicons in shortcuts
|
||||||
|
* URL shortcuts use a cached randomly named .ico file which is stored in your
|
||||||
|
* profile/shortcutCache directory. The .ico remains after the shortcut is deleted.
|
||||||
|
* If set to false then the shortcuts use a generic Firefox icon ***/
|
||||||
|
"browser.shell.shortcutFavicons" = false;
|
||||||
|
/* 1031: disable favicons in history and bookmarks
|
||||||
|
* Stored as data blobs in favicons.sqlite, these don't reveal anything that your
|
||||||
|
* actual history (and bookmarks) already do. Your history is more detailed, so
|
||||||
|
* control that instead; e.g. disable history, clear history on close, use PB mode
|
||||||
|
* [NOTE] favicons.sqlite is sanitized on Firefox close, not in-session ***/
|
||||||
|
# // user_pref("browser.chrome.site_icons", false);
|
||||||
|
/* 1032: disable favicons in web notifications ***/
|
||||||
|
# // user_pref("alerts.showFavicons", false); // [DEFAULT: false]
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1200]: HTTPS (SSL/TLS / OCSP / CERTS / HPKP / CIPHERS)
|
||||||
|
Your cipher and other settings can be used in server side fingerprinting
|
||||||
|
[TEST] https://www.ssllabs.com/ssltest/viewMyClient.html
|
||||||
|
[TEST] https://browserleaks.com/ssl
|
||||||
|
[TEST] https://ja3er.com/
|
||||||
|
[1] https://www.securityartwork.es/2017/02/02/tls-client-fingerprinting-with-bro/
|
||||||
|
***/
|
||||||
|
/** SSL (Secure Sockets Layer) / TLS (Transport Layer Security) ***/
|
||||||
|
/* 1201: require safe negotiation
|
||||||
|
* Blocks connections (SSL_ERROR_UNSAFE_NEGOTIATION) to servers that don't support RFC 5746 [2]
|
||||||
|
* as they're potentially vulnerable to a MiTM attack [3]. A server without RFC 5746 can be
|
||||||
|
* safe from the attack if it disables renegotiations but the problem is that the browser can't
|
||||||
|
* know that. Setting this pref to true is the only way for the browser to ensure there will be
|
||||||
|
* no unsafe renegotiations on the channel between the browser and the server.
|
||||||
|
* [STATS] SSL Labs (July 2021) reports over 99% of sites have secure renegotiation [4]
|
||||||
|
* [1] https://wiki.mozilla.org/Security:Renegotiation
|
||||||
|
* [2] https://tools.ietf.org/html/rfc5746
|
||||||
|
* [3] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555
|
||||||
|
* [4] https://www.ssllabs.com/ssl-pulse/ ***/
|
||||||
|
"security.ssl.require_safe_negotiation" = true;
|
||||||
|
/* 1202: control TLS versions with min and max
|
||||||
|
* 1=TLS 1.0, 2=TLS 1.1, 3=TLS 1.2, 4=TLS 1.3
|
||||||
|
* [WARNING] Leave these at default, otherwise you alter your TLS fingerprint.
|
||||||
|
* [1] https://www.ssllabs.com/ssl-pulse/ ***/
|
||||||
|
# // user_pref("security.tls.version.min", 3); // [DEFAULT: 3]
|
||||||
|
# // user_pref("security.tls.version.max", 4);
|
||||||
|
/* 1203: enforce TLS 1.0 and 1.1 downgrades as session only ***/
|
||||||
|
"security.tls.version.enable-deprecated" = false; # [DEFAULT: false]
|
||||||
|
/* 1204: disable SSL session tracking [FF36+]
|
||||||
|
* SSL Session IDs are unique and last up to 24hrs in Firefox (or longer with prolongation attacks)
|
||||||
|
* [NOTE] These are not used in PB mode. In normal windows they are isolated when using FPI (4001)
|
||||||
|
* and/or containers. In FF85+ they are isolated by default (privacy.partition.network_state)
|
||||||
|
* [WARNING] There are perf and passive fingerprinting costs, for little to no gain. Preventing
|
||||||
|
* tracking via this method does not address IPs, nor handle any sanitizing of current identifiers
|
||||||
|
* [1] https://tools.ietf.org/html/rfc5077
|
||||||
|
* [2] https://bugzilla.mozilla.org/967977
|
||||||
|
* [3] https://arxiv.org/abs/1810.07304 ***/
|
||||||
|
# // user_pref("security.ssl.disable_session_identifiers", true); // [HIDDEN PREF]
|
||||||
|
/* 1206: disable TLS1.3 0-RTT (round-trip time) [FF51+]
|
||||||
|
* [1] https://github.com/tlswg/tls13-spec/issues/1001
|
||||||
|
* [2] https://blog.cloudflare.com/tls-1-3-overview-and-q-and-a/ ***/
|
||||||
|
"security.tls.enable_0rtt_data" = false;
|
||||||
|
|
||||||
|
/** OCSP (Online Certificate Status Protocol)
|
||||||
|
[1] https://scotthelme.co.uk/revocation-is-broken/
|
||||||
|
[2] https://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
|
||||||
|
***/
|
||||||
|
/* 1211: control when to use OCSP fetching (to confirm current validity of certificates)
|
||||||
|
* 0=disabled, 1=enabled (default), 2=enabled for EV certificates only
|
||||||
|
* OCSP (non-stapled) leaks information about the sites you visit to the CA (cert authority)
|
||||||
|
* It's a trade-off between security (checking) and privacy (leaking info to the CA)
|
||||||
|
* [NOTE] This pref only controls OCSP fetching and does not affect OCSP stapling
|
||||||
|
* [1] https://en.wikipedia.org/wiki/Ocsp ***/
|
||||||
|
"security.OCSP.enabled" = 1;
|
||||||
|
/* 1212: set OCSP fetch failures (non-stapled, see 1211) to hard-fail [SETUP-WEB]
|
||||||
|
* When a CA cannot be reached to validate a cert, Firefox just continues the connection (=soft-fail)
|
||||||
|
* Setting this pref to true tells Firefox to instead terminate the connection (=hard-fail)
|
||||||
|
* It is pointless to soft-fail when an OCSP fetch fails: you cannot confirm a cert is still valid (it
|
||||||
|
* could have been revoked) and/or you could be under attack (e.g. malicious blocking of OCSP servers)
|
||||||
|
* [1] https://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
|
||||||
|
* [2] https://www.imperialviolet.org/2014/04/19/revchecking.html ***/
|
||||||
|
"security.OCSP.require" = true;
|
||||||
|
|
||||||
|
/** CERTS / HPKP (HTTP Public Key Pinning) ***/
|
||||||
|
/* 1220: disable or limit SHA-1 certificates
|
||||||
|
* 0=all SHA1 certs are allowed
|
||||||
|
* 1=all SHA1 certs are blocked
|
||||||
|
* 2=deprecated option that now maps to 1
|
||||||
|
* 3=only allowed for locally-added roots (e.g. anti-virus)
|
||||||
|
* 4=only allowed for locally-added roots or for certs in 2015 and earlier
|
||||||
|
* [SETUP-CHROME] When disabled, some man-in-the-middle devices (e.g. security scanners and
|
||||||
|
* antivirus products, may fail to connect to HTTPS sites. SHA-1 is *almost* obsolete.
|
||||||
|
* [1] https://blog.mozilla.org/security/2016/10/18/phasing-out-sha-1-on-the-public-web/ ***/
|
||||||
|
"security.pki.sha1_enforcement_level" = 1;
|
||||||
|
/* 1221: disable Windows 8.1's Microsoft Family Safety cert [FF50+] [WINDOWS]
|
||||||
|
* 0=disable detecting Family Safety mode and importing the root
|
||||||
|
* 1=only attempt to detect Family Safety mode (don't import the root)
|
||||||
|
* 2=detect Family Safety mode and import the root
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/21686 ***/
|
||||||
|
"security.family_safety.mode" = 0;
|
||||||
|
/* 1222: disable intermediate certificate caching (fingerprinting attack vector) [FF41+] [RESTART]
|
||||||
|
* [NOTE] This affects login/cert/key dbs. The effect is all credentials are session-only.
|
||||||
|
* Saved logins and passwords are not available. Reset the pref and restart to return them.
|
||||||
|
* [1] https://shiftordie.de/blog/2017/02/21/fingerprinting-firefox-users-with-cached-intermediate-ca-certificates-fiprinca/ ***/
|
||||||
|
# // user_pref("security.nocertdb", true); // [HIDDEN PREF]
|
||||||
|
/* 1223: enable strict pinning
|
||||||
|
* PKP (Public Key Pinning) 0=disabled 1=allow user MiTM (such as your antivirus), 2=strict
|
||||||
|
* [SETUP-WEB] If you rely on an AV (antivirus) to protect your web browsing
|
||||||
|
* by inspecting ALL your web traffic, then leave at current default=1
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/16206 ***/
|
||||||
|
"security.cert_pinning.enforcement_level" = 2;
|
||||||
|
/* 1224: enable CRLite [FF73+]
|
||||||
|
* In FF84+ it covers valid certs and in mode 2 doesn't fall back to OCSP
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1429800,1670985
|
||||||
|
* [2] https://blog.mozilla.org/security/tag/crlite/ ***/
|
||||||
|
"security.remote_settings.crlite_filters.enabled" = true;
|
||||||
|
"security.pki.crlite_mode" = 2;
|
||||||
|
|
||||||
|
/** MIXED CONTENT ***/
|
||||||
|
/* 1240: enforce no insecure active content on https pages
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/21323 ***/
|
||||||
|
"security.mixed_content.block_active_content" = true; # [DEFAULT: true]
|
||||||
|
/* 1241: disable insecure passive content (such as images) on https pages [SETUP-WEB] ***/
|
||||||
|
"security.mixed_content.block_display_content" = true;
|
||||||
|
/* 1244: enable HTTPS-Only mode [FF76+]
|
||||||
|
* When "https_only_mode" (all windows) is true, "https_only_mode_pbm" (private windows only) is ignored
|
||||||
|
* [SETTING] to add site exceptions: Padlock>HTTPS-Only mode>On/Off/Off temporarily
|
||||||
|
* [SETTING] Privacy & Security>HTTPS-Only Mode
|
||||||
|
* [TEST] http://example.com [upgrade]
|
||||||
|
* [TEST] http://neverssl.org/ [no upgrade]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1613063 [META] ***/
|
||||||
|
"dom.security.https_only_mode" = true; # [FF76+]
|
||||||
|
# // user_pref("dom.security.https_only_mode_pbm", true); // [FF80+]
|
||||||
|
/* 1245: enable HTTPS-Only mode for local resources [FF77+] ***/
|
||||||
|
# // user_pref("dom.security.https_only_mode.upgrade_local", true);
|
||||||
|
/* 1246: disable HTTP background requests [FF82+]
|
||||||
|
* When attempting to upgrade, if the server doesn't respond within 3 seconds, firefox
|
||||||
|
* sends HTTP requests in order to check if the server supports HTTPS or not.
|
||||||
|
* This is done to avoid waiting for a timeout which takes 90 seconds
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1642387,1660945 ***/
|
||||||
|
"dom.security.https_only_mode_send_http_background_request" = false;
|
||||||
|
/* 1247: treat .onion as a secure context [FF60+] [TOR]
|
||||||
|
* [NOTE] Firefox cannot access .onion sites by default: it is strongly recommended you just use Tor Browser
|
||||||
|
* [1] https://bugzilla.mozilla.org/1382359 ***/
|
||||||
|
# // user_pref("dom.securecontext.whitelist_onions", true);
|
||||||
|
|
||||||
|
/** CIPHERS [WARNING: do not meddle with your cipher suite: see the section 1200 intro]
|
||||||
|
* These are the ciphers listed under "Cipher Suites" [1] that are either still using SHA-1 and CBC,
|
||||||
|
* and/or are missing Perfect Forward Secrecy [3] and/or have other weaknesses like key sizes of 128
|
||||||
|
* [1] https://browserleaks.com/ssl
|
||||||
|
* [2] https://en.wikipedia.org/wiki/Key_size
|
||||||
|
* [3] https://en.wikipedia.org/wiki/Forward_secrecy
|
||||||
|
***/
|
||||||
|
/* 1261: disable 3DES (effective key size < 128 and no PFS)
|
||||||
|
* [1] https://en.wikipedia.org/wiki/3des#Security
|
||||||
|
* [2] https://en.wikipedia.org/wiki/Meet-in-the-middle_attack
|
||||||
|
* [3] https://www-archive.mozilla.org/projects/security/pki/nss/ssl/fips-ssl-ciphersuites.html ***/
|
||||||
|
# // user_pref("security.ssl3.rsa_des_ede3_sha", false);
|
||||||
|
/* 1264: disable the remaining non-modern cipher suites as of FF78 (in order of preferred by FF) ***/
|
||||||
|
# // user_pref("security.ssl3.ecdhe_ecdsa_aes_256_sha", false);
|
||||||
|
# // user_pref("security.ssl3.ecdhe_ecdsa_aes_128_sha", false);
|
||||||
|
# // user_pref("security.ssl3.ecdhe_rsa_aes_128_sha", false);
|
||||||
|
# // user_pref("security.ssl3.ecdhe_rsa_aes_256_sha", false);
|
||||||
|
# // user_pref("security.ssl3.rsa_aes_128_gcm_sha256", false); // no PFS
|
||||||
|
# // user_pref("security.ssl3.rsa_aes_256_gcm_sha384", false); // no PFS
|
||||||
|
# // user_pref("security.ssl3.rsa_aes_128_sha", false); // no PFS
|
||||||
|
# // user_pref("security.ssl3.rsa_aes_256_sha", false); // no PFS
|
||||||
|
|
||||||
|
/** UI (User Interface) ***/
|
||||||
|
/* 1270: display warning on the padlock for "broken security" (if 1201 is false)
|
||||||
|
* Bug: warning padlock not indicated for subresources on a secure page! [2]
|
||||||
|
* [1] https://wiki.mozilla.org/Security:Renegotiation
|
||||||
|
* [2] https://bugzilla.mozilla.org/1353705 ***/
|
||||||
|
"security.ssl.treat_unsafe_negotiation_as_broken" = true;
|
||||||
|
/* 1271: control "Add Security Exception" dialog on SSL warnings
|
||||||
|
* 0=do neither 1=pre-populate url 2=pre-populate url + pre-fetch cert (default)
|
||||||
|
* [1] https://github.com/pyllyukko/user.js/issues/210 ***/
|
||||||
|
"browser.ssl_override_behavior" = 1;
|
||||||
|
/* 1272: display advanced information on Insecure Connection warning pages
|
||||||
|
* only works when it's possible to add an exception
|
||||||
|
* i.e. it doesn't work for HSTS discrepancies (https://subdomain.preloaded-hsts.badssl.com/)
|
||||||
|
* [TEST] https://expired.badssl.com/ ***/
|
||||||
|
"browser.xul.error_pages.expert_bad_cert" = true;
|
||||||
|
/* 1273: display "insecure" icon and "Not Secure" text on HTTP sites ***/
|
||||||
|
# // user_pref("security.insecure_connection_icon.enabled", true); // [FF59+] [DEFAULT: true]
|
||||||
|
"security.insecure_connection_text.enabled" = true; # [FF60+]
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1400]: FONTS ***/
|
||||||
|
/* 1401: disable websites choosing fonts (0=block, 1=allow)
|
||||||
|
* This can limit most (but not all) JS font enumeration which is a high entropy fingerprinting vector
|
||||||
|
* [WARNING] DO NOT USE: in FF80+ RFP covers this, and non-RFP users should use font vis (4620)
|
||||||
|
* [SETTING] General>Language and Appearance>Fonts & Colors>Advanced>Allow pages to choose... ***/
|
||||||
|
# // user_pref("browser.display.use_document_fonts", 0);
|
||||||
|
/* 1403: disable icon fonts (glyphs) and local fallback rendering
|
||||||
|
* [1] https://bugzilla.mozilla.org/789788
|
||||||
|
* [2] https://gitlab.torproject.org/legacy/trac/-/issues/8455 ***/
|
||||||
|
# // user_pref("gfx.downloadable_fonts.enabled", false); // [FF41+]
|
||||||
|
# // user_pref("gfx.downloadable_fonts.fallback_delay", -1);
|
||||||
|
/* 1404: disable rendering of SVG OpenType fonts
|
||||||
|
* [1] https://wiki.mozilla.org/SVGOpenTypeFonts - iSECPartnersReport recommends to disable this ***/
|
||||||
|
"gfx.font_rendering.opentype_svg.enabled" = false;
|
||||||
|
/* 1408: disable graphite
|
||||||
|
* Graphite has had many critical security issues in the past [1]
|
||||||
|
* [1] https://www.mozilla.org/security/advisories/mfsa2017-15/#CVE-2017-7778
|
||||||
|
* [2] https://en.wikipedia.org/wiki/Graphite_(SIL) ***/
|
||||||
|
"gfx.font_rendering.graphite.enabled" = false;
|
||||||
|
/* 1409: limit system font exposure to a whitelist [FF52+] [RESTART]
|
||||||
|
* If the whitelist is empty, then whitelisting is considered disabled and all fonts are allowed
|
||||||
|
* [NOTE] In FF81+ the whitelist **overrides** RFP's font visibility (see 4620)
|
||||||
|
* [WARNING] DO NOT USE: in FF80+ RFP covers this, and non-RFP users should use font vis (4620)
|
||||||
|
* [1] https://bugzilla.mozilla.org/1121643 ***/
|
||||||
|
# // user_pref("font.system.whitelist", ""); // [HIDDEN PREF]
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1600]: HEADERS / REFERERS
|
||||||
|
Only *cross domain* referers need controlling: leave 1601, 1602, 1605 and 1606 alone
|
||||||
|
---
|
||||||
|
Expect some breakage: Use an extension if you need precise control
|
||||||
|
---
|
||||||
|
full URI: https://example.com:8888/foo/bar.html?id=1234
|
||||||
|
scheme+host+port+path: https://example.com:8888/foo/bar.html
|
||||||
|
scheme+host+port: https://example.com:8888
|
||||||
|
---
|
||||||
|
[1] https://feeding.cloud.geek.nz/posts/tweaking-referrer-for-privacy-in-firefox/
|
||||||
|
***/
|
||||||
|
/* 1601: ALL: control when images/links send a referer
|
||||||
|
* 0=never, 1=send only when links are clicked, 2=for links and images (default) ***/
|
||||||
|
# // user_pref("network.http.sendRefererHeader", 2);
|
||||||
|
/* 1602: ALL: control the amount of information to send
|
||||||
|
* 0=send full URI (default), 1=scheme+host+port+path, 2=scheme+host+port ***/
|
||||||
|
# // user_pref("network.http.referer.trimmingPolicy", 0);
|
||||||
|
/* 1603: CROSS ORIGIN: control when to send a referer
|
||||||
|
* 0=always (default), 1=only if base domains match, 2=only if hosts match
|
||||||
|
* [SETUP-WEB] Known to cause issues with older modems/routers and some sites e.g vimeo, icloud, instagram ***/
|
||||||
|
"network.http.referer.XOriginPolicy" = 2;
|
||||||
|
/* 1604: CROSS ORIGIN: control the amount of information to send [FF52+]
|
||||||
|
* 0=send full URI (default), 1=scheme+host+port+path, 2=scheme+host+port ***/
|
||||||
|
"network.http.referer.XOriginTrimmingPolicy" = 2;
|
||||||
|
/* 1605: ALL: disable spoofing a referer
|
||||||
|
* [WARNING] Do not set this to true, as spoofing effectively disables the anti-CSRF
|
||||||
|
* (Cross-Site Request Forgery) protections that some sites may rely on ***/
|
||||||
|
# // user_pref("network.http.referer.spoofSource", false); // [DEFAULT: false]
|
||||||
|
/* 1606: ALL: set the default Referrer Policy [FF59+]
|
||||||
|
* 0=no-referer, 1=same-origin, 2=strict-origin-when-cross-origin, 3=no-referrer-when-downgrade
|
||||||
|
* [NOTE] This is only a default, it can be overridden by a site-controlled Referrer Policy
|
||||||
|
* [1] https://www.w3.org/TR/referrer-policy/
|
||||||
|
* [2] https://developer.mozilla.org/docs/Web/HTTP/Headers/Referrer-Policy
|
||||||
|
* [3] https://blog.mozilla.org/security/2018/01/31/preventing-data-leaks-by-stripping-path-information-in-http-referrers/
|
||||||
|
* [4] https://blog.mozilla.org/security/2021/03/22/firefox-87-trims-http-referrers-by-default-to-protect-user-privacy/ ***/
|
||||||
|
# // user_pref("network.http.referer.defaultPolicy", 2); // [DEFAULT: 2 FF87+]
|
||||||
|
# // user_pref("network.http.referer.defaultPolicy.pbmode", 2); // [DEFAULT: 2]
|
||||||
|
/* 1607: hide (not spoof) referrer when leaving a .onion domain [FF54+] [TOR]
|
||||||
|
* [NOTE] Firefox cannot access .onion sites by default: it is strongly recommended you just use Tor Browser
|
||||||
|
* [1] https://bugzilla.mozilla.org/1305144 ***/
|
||||||
|
# // user_pref("network.http.referer.hideOnionSource", true);
|
||||||
|
/* 1610: ALL: enable the DNT (Do Not Track) HTTP header
|
||||||
|
* [NOTE] DNT is enforced with Enhanced Tracking Protection regardless of this pref
|
||||||
|
* [SETTING] Privacy & Security>Enhanced Tracking Protection>Send websites a "Do Not Track" signal... ***/
|
||||||
|
"privacy.donottrackheader.enabled" = true;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1700]: CONTAINERS
|
||||||
|
If you want to *really* leverage containers, we highly recommend Temporary Containers [2].
|
||||||
|
Read the article by the extension author [3], and check out the github wiki/repo [4].
|
||||||
|
[1] https://wiki.mozilla.org/Security/Contextual_Identity_Project/Containers
|
||||||
|
[2] https://addons.mozilla.org/firefox/addon/temporary-containers/
|
||||||
|
[3] https://medium.com/@stoically/enhance-your-privacy-in-firefox-with-temporary-containers-33925cd6cd21
|
||||||
|
[4] https://github.com/stoically/temporary-containers/wiki
|
||||||
|
***/
|
||||||
|
/* 1701: enable Container Tabs setting in preferences (see 1702) [FF50+]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1279029 ***/
|
||||||
|
"privacy.userContext.ui.enabled" = true;
|
||||||
|
/* 1702: enable Container Tabs [FF50+]
|
||||||
|
* [SETTING] General>Tabs>Enable Container Tabs ***/
|
||||||
|
"privacy.userContext.enabled" = true;
|
||||||
|
/* 1703: set behaviour on "+ Tab" button to display container menu on left click [FF74+]
|
||||||
|
* [NOTE] The menu is always shown on long press and right click
|
||||||
|
* [SETTING] General>Tabs>Enable Container Tabs>Settings>Select a container for each new tab ***/
|
||||||
|
# // user_pref("privacy.userContext.newTabContainerOnLeftClick.enabled", true);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 1800]: PLUGINS ***/
|
||||||
|
/* 1820: disable GMP (Gecko Media Plugins)
|
||||||
|
* [1] https://wiki.mozilla.org/GeckoMediaPlugins ***/
|
||||||
|
# // user_pref("media.gmp-provider.enabled", false);
|
||||||
|
/* 1825: disable widevine CDM (Content Decryption Module)
|
||||||
|
* [NOTE] This is covered by the EME master switch (1830) ***/
|
||||||
|
# // user_pref("media.gmp-widevinecdm.enabled", false);
|
||||||
|
/* 1830: disable all DRM content (EME: Encryption Media Extension)
|
||||||
|
* [SETUP-WEB] e.g. Netflix, Amazon Prime, Hulu, HBO, Disney+, Showtime, Starz, DirectTV
|
||||||
|
* [SETTING] General>DRM Content>Play DRM-controlled content
|
||||||
|
* [TEST] https://bitmovin.com/demos/drm
|
||||||
|
* [1] https://www.eff.org/deeplinks/2017/10/drms-dead-canary-how-we-just-lost-web-what-we-learned-it-and-what-we-need-do-next ***/
|
||||||
|
"media.eme.enabled" = false;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2000]: MEDIA / CAMERA / MIC ***/
|
||||||
|
/* 2001: disable WebRTC (Web Real-Time Communication)
|
||||||
|
* [SETUP-WEB] WebRTC can leak your IP address from behind your VPN, but if this is not
|
||||||
|
* in your threat model, and you want Real-Time Communication, this is the pref for you
|
||||||
|
* [1] https://www.privacytools.io/#webrtc ***/
|
||||||
|
"media.peerconnection.enabled" = false;
|
||||||
|
/* 2002: limit WebRTC IP leaks if using WebRTC
|
||||||
|
* In FF70+ these settings match Mode 4 (Mode 3 in older versions) [3]
|
||||||
|
* [TEST] https://browserleaks.com/webrtc
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1189041,1297416,1452713
|
||||||
|
* [2] https://wiki.mozilla.org/Media/WebRTC/Privacy
|
||||||
|
* [3] https://tools.ietf.org/html/draft-ietf-rtcweb-ip-handling-12#section-5.2 ***/
|
||||||
|
"media.peerconnection.ice.default_address_only" = true;
|
||||||
|
"media.peerconnection.ice.no_host" = true; # [FF51+]
|
||||||
|
"media.peerconnection.ice.proxy_only_if_behind_proxy" = true; # [FF70+]
|
||||||
|
/* 2022: disable screensharing ***/
|
||||||
|
"media.getusermedia.screensharing.enabled" = false;
|
||||||
|
"media.getusermedia.browser.enabled" = false;
|
||||||
|
"media.getusermedia.audiocapture.enabled" = false;
|
||||||
|
/* 2024: set a default permission for Camera/Microphone [FF58+]
|
||||||
|
* 0=always ask (default), 1=allow, 2=block
|
||||||
|
* [SETTING] to add site exceptions: Ctrl+I>Permissions>Use the Camera/Microphone
|
||||||
|
* [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Camera/Microphone>Settings ***/
|
||||||
|
# // user_pref("permissions.default.camera", 2);
|
||||||
|
# // user_pref("permissions.default.microphone", 2);
|
||||||
|
/* 2030: disable autoplay of HTML5 media [FF63+]
|
||||||
|
* 0=Allow all, 1=Block non-muted media (default in FF67+), 2=Prompt (removed in FF66), 5=Block all (FF69+)
|
||||||
|
* [NOTE] You can set exceptions under site permissions
|
||||||
|
* [SETTING] Privacy & Security>Permissions>Autoplay>Settings>Default for all websites ***/
|
||||||
|
# // user_pref("media.autoplay.default", 5);
|
||||||
|
/* 2031: disable autoplay of HTML5 media if you interacted with the site [FF78+]
|
||||||
|
* 0=sticky (default), 1=transient, 2=user
|
||||||
|
* Firefox's Autoplay Policy Documentation [PDF] is linked below via SUMO
|
||||||
|
* [NOTE] If you have trouble with some video sites, then add an exception (see 2030)
|
||||||
|
* [1] https://support.mozilla.org/questions/1293231 ***/
|
||||||
|
"media.autoplay.blocking_policy" = 2;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2200]: WINDOW MEDDLING & LEAKS / POPUPS ***/
|
||||||
|
/* 2202: prevent scripts from moving and resizing open windows ***/
|
||||||
|
"dom.disable_window_move_resize" = true;
|
||||||
|
/* 2203: open links targeting new windows in a new tab instead
|
||||||
|
* This stops malicious window sizes and some screen resolution leaks.
|
||||||
|
* You can still right-click a link and open in a new window.
|
||||||
|
* [TEST] https://arkenfox.github.io/TZP/tzp.html#screen
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/9881 ***/
|
||||||
|
"browser.link.open_newwindow" = 3; # 1=most recent window or tab 2=new window, 3=new tab
|
||||||
|
"browser.link.open_newwindow.restriction" = 0;
|
||||||
|
/* 2204: disable Fullscreen API (requires user interaction) to prevent screen-resolution leaks
|
||||||
|
* [NOTE] You can still manually toggle the browser's fullscreen state (F11),
|
||||||
|
* but this pref will disable embedded video/game fullscreen controls, e.g. youtube
|
||||||
|
* [TEST] https://arkenfox.github.io/TZP/tzp.html#screen ***/
|
||||||
|
# // user_pref("full-screen-api.enabled", false);
|
||||||
|
/* 2210: block popup windows
|
||||||
|
* [SETTING] Privacy & Security>Permissions>Block pop-up windows ***/
|
||||||
|
"dom.disable_open_during_load" = true;
|
||||||
|
/* 2212: limit events that can cause a popup [SETUP-WEB]
|
||||||
|
* default FF86+: "change click dblclick auxclick mousedown mouseup pointerdown pointerup notificationclick reset submit touchend contextmenu ***/
|
||||||
|
"dom.popup_allowed_events" = "click dblclick mousedown pointerdown";
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2300]: WEB WORKERS
|
||||||
|
A worker is a JS "background task" running in a global context, i.e. it is different from
|
||||||
|
the current window. Workers can spawn new workers (must be the same origin & scheme),
|
||||||
|
including service and shared workers. Shared workers can be utilized by multiple scripts and
|
||||||
|
communicate between browsing contexts (windows/tabs/iframes) and can even control your cache.
|
||||||
|
|
||||||
|
[1] Web Workers: https://developer.mozilla.org/docs/Web/API/Web_Workers_API
|
||||||
|
[2] Worker: https://developer.mozilla.org/docs/Web/API/Worker
|
||||||
|
[3] Service Worker: https://developer.mozilla.org/docs/Web/API/Service_Worker_API
|
||||||
|
[4] SharedWorker: https://developer.mozilla.org/docs/Web/API/SharedWorker
|
||||||
|
[5] ChromeWorker: https://developer.mozilla.org/docs/Web/API/ChromeWorker
|
||||||
|
[6] Notifications: https://support.mozilla.org/questions/1165867#answer-981820
|
||||||
|
***/
|
||||||
|
/* 2302: disable service workers [FF32, FF44-compat]
|
||||||
|
* Service workers essentially act as proxy servers that sit between web apps, and the
|
||||||
|
* browser and network, are event driven, and can control the web page/site it is associated
|
||||||
|
* with, intercepting and modifying navigation and resource requests, and caching resources.
|
||||||
|
* [NOTE] Service worker APIs are hidden (in Firefox) and cannot be used when in PB mode.
|
||||||
|
* [NOTE] Service workers only run over HTTPS. Service workers have no DOM access.
|
||||||
|
* [SETUP-WEB] Disabling service workers will break some sites. This pref is required true for
|
||||||
|
* service worker notifications (2304), push notifications (disabled, 2305) and service worker
|
||||||
|
* cache (2740). If you enable this pref, then check those settings as well ***/
|
||||||
|
"dom.serviceWorkers.enabled" = false;
|
||||||
|
/* 2304: disable Web Notifications
|
||||||
|
* [NOTE] Web Notifications can also use service workers (2302) and are behind a prompt (2306)
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/API/Notifications_API ***/
|
||||||
|
# // user_pref("dom.webnotifications.enabled", false); // [FF22+]
|
||||||
|
# // user_pref("dom.webnotifications.serviceworker.enabled", false); // [FF44+]
|
||||||
|
/* 2305: disable Push Notifications [FF44+]
|
||||||
|
* Push is an API that allows websites to send you (subscribed) messages even when the site
|
||||||
|
* isn't loaded, by pushing messages to your userAgentID through Mozilla's Push Server.
|
||||||
|
* [NOTE] Push requires service workers (2302) to subscribe to and display, and is behind
|
||||||
|
* a prompt (2306). Disabling service workers alone doesn't stop Firefox polling the
|
||||||
|
* Mozilla Push Server. To remove all subscriptions, reset your userAgentID (in about:config
|
||||||
|
* or on start), and you will get a new one within a few seconds.
|
||||||
|
* [1] https://support.mozilla.org/kb/push-notifications-firefox
|
||||||
|
* [2] https://developer.mozilla.org/docs/Web/API/Push_API ***/
|
||||||
|
"dom.push.enabled" = false;
|
||||||
|
# // user_pref("dom.push.userAgentID", "");
|
||||||
|
/* 2306: set a default permission for Notifications (both 2304 and 2305) [FF58+]
|
||||||
|
* 0=always ask (default), 1=allow, 2=block
|
||||||
|
* [NOTE] Best left at default "always ask", fingerprintable via Permissions API
|
||||||
|
* [SETTING] to add site exceptions: Ctrl+I>Permissions>Receive Notifications
|
||||||
|
* [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Notifications>Settings ***/
|
||||||
|
# // user_pref("permissions.default.desktop-notification", 2);
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2400]: DOM (DOCUMENT OBJECT MODEL) & JAVASCRIPT ***/
|
||||||
|
/* 2401: disable website control over browser right-click context menu
|
||||||
|
* [NOTE] Shift-Right-Click will always bring up the browser right-click context menu ***/
|
||||||
|
# // user_pref("dom.event.contextmenu.enabled", false);
|
||||||
|
/* 2402: disable website access to clipboard events/content [SETUP-HARDEN]
|
||||||
|
* [NOTE] This will break some sites' functionality e.g. Outlook, Twitter, Facebook, Wordpress
|
||||||
|
* This applies to onCut/onCopy/onPaste events - i.e. it requires interaction with the website
|
||||||
|
* [WARNING] In FF88 or lower, with clipboardevents enabled, if both 'middlemouse.paste' and
|
||||||
|
* 'general.autoScroll' are true (at least one is default false) then the clipboard can leak [1]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1528289 ***/
|
||||||
|
# // user_pref("dom.event.clipboardevents.enabled", false);
|
||||||
|
/* 2404: disable clipboard commands (cut/copy) from "non-privileged" content [FF41+]
|
||||||
|
* this disables document.execCommand("cut"/"copy") to protect your clipboard
|
||||||
|
* [1] https://bugzilla.mozilla.org/1170911 ***/
|
||||||
|
"dom.allow_cut_copy" = false;
|
||||||
|
/* 2405: disable "Confirm you want to leave" dialog on page close
|
||||||
|
* Does not prevent JS leaks of the page close event.
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/Events/beforeunload
|
||||||
|
* [2] https://support.mozilla.org/questions/1043508 ***/
|
||||||
|
"dom.disable_beforeunload" = true;
|
||||||
|
/* 2414: disable shaking the screen ***/
|
||||||
|
"dom.vibrator.enabled" = false;
|
||||||
|
/* 2420: disable asm.js [FF22+] [SETUP-PERF]
|
||||||
|
* [1] http://asmjs.org/
|
||||||
|
* [2] https://www.mozilla.org/security/advisories/mfsa2015-29/
|
||||||
|
* [3] https://www.mozilla.org/security/advisories/mfsa2015-50/
|
||||||
|
* [4] https://www.mozilla.org/security/advisories/mfsa2017-01/#CVE-2017-5375
|
||||||
|
* [5] https://www.mozilla.org/security/advisories/mfsa2017-05/#CVE-2017-5400
|
||||||
|
* [6] https://rh0dev.github.io/blog/2017/the-return-of-the-jit/ ***/
|
||||||
|
"javascript.options.asmjs" = false;
|
||||||
|
/* 2421: disable Ion and baseline JIT to harden against JS exploits [SETUP-HARDEN]
|
||||||
|
* [NOTE] In FF75+, when **both** Ion and JIT are disabled, **and** the new
|
||||||
|
* hidden pref is enabled, then Ion can still be used by extensions (1599226)
|
||||||
|
* [WARNING] Disabling Ion/JIT can cause some site issues and performance loss
|
||||||
|
* [1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-0817 ***/
|
||||||
|
# // user_pref("javascript.options.ion", false);
|
||||||
|
# // user_pref("javascript.options.baselinejit", false);
|
||||||
|
# // user_pref("javascript.options.jit_trustedprincipals", true); // [FF75+] [HIDDEN PREF]
|
||||||
|
/* 2422: disable WebAssembly [FF52+]
|
||||||
|
* Vulnerabilities have increasingly been found, including those known and fixed
|
||||||
|
* in native programs years ago [2]. WASM has powerful low-level access, making
|
||||||
|
* certain attacks (brute-force) and vulnerabilities more possible
|
||||||
|
* [STATS] ~0.2% of websites, about half of which are for crytopmining / malvertising [2][3]
|
||||||
|
* [1] https://developer.mozilla.org/docs/WebAssembly
|
||||||
|
* [2] https://spectrum.ieee.org/tech-talk/telecom/security/more-worries-over-the-security-of-web-assembly
|
||||||
|
* [3] https://www.zdnet.com/article/half-of-the-websites-using-webassembly-use-it-for-malicious-purposes ***/
|
||||||
|
"javascript.options.wasm" = false;
|
||||||
|
/* 2429: enable (limited but sufficient) window.opener protection [FF65+]
|
||||||
|
* Makes rel=noopener implicit for target=_blank in anchor and area elements when no rel attribute is set ***/
|
||||||
|
"dom.targetBlankNoOpener.enabled" = true; # [DEFAULT: true FF79+]
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2500]: HARDWARE FINGERPRINTING ***/
|
||||||
|
/* 2502: disable Battery Status API
|
||||||
|
* Initially a Linux issue (high precision readout) that was fixed.
|
||||||
|
* However, it is still another metric for fingerprinting, used to raise entropy.
|
||||||
|
* e.g. do you have a battery or not, current charging status, charge level, times remaining etc
|
||||||
|
* [NOTE] From FF52+ Battery Status API is only available in chrome/privileged code [1]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1313580 ***/
|
||||||
|
# // user_pref("dom.battery.enabled", false);
|
||||||
|
/* 2508: disable hardware acceleration to reduce graphics fingerprinting [SETUP-HARDEN]
|
||||||
|
* [WARNING] Affects text rendering (fonts will look different), impacts video performance,
|
||||||
|
* and parts of Quantum that utilize the GPU will also be affected as they are rolled out
|
||||||
|
* [SETTING] General>Performance>Custom>Use hardware acceleration when available
|
||||||
|
* [1] https://wiki.mozilla.org/Platform/GFX/HardwareAcceleration ***/
|
||||||
|
# // user_pref("gfx.direct2d.disabled", true); // [WINDOWS]
|
||||||
|
# // user_pref("layers.acceleration.disabled", true);
|
||||||
|
/* 2517: disable Media Capabilities API [FF63+]
|
||||||
|
* [WARNING] This *may* affect media performance if disabled, no one is sure
|
||||||
|
* [1] https://github.com/WICG/media-capabilities
|
||||||
|
* [2] https://wicg.github.io/media-capabilities/#security-privacy-considerations ***/
|
||||||
|
# // user_pref("media.media-capabilities.enabled", false);
|
||||||
|
/* 2520: disable virtual reality devices
|
||||||
|
* Optional protection depending on your connected devices
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/API/WebVR_API ***/
|
||||||
|
# // user_pref("dom.vr.enabled", false);
|
||||||
|
/* 2521: set a default permission for Virtual Reality (see 2520) [FF73+]
|
||||||
|
* 0=always ask (default), 1=allow, 2=block
|
||||||
|
* [SETTING] to add site exceptions: Ctrl+I>Permissions>Access Virtual Reality Devices
|
||||||
|
* [SETTING] to manage site exceptions: Options>Privacy & Security>Permissions>Virtual Reality>Settings ***/
|
||||||
|
# // user_pref("permissions.default.xr", 2);
|
||||||
|
/* 2522: disable/limit WebGL (Web Graphics Library)
|
||||||
|
* [SETUP-WEB] When disabled, will break some websites. When enabled, provides high entropy,
|
||||||
|
* especially with readPixels(). Some of the other entropy is lessened with RFP (see 4501)
|
||||||
|
* [1] https://www.contextis.com/resources/blog/webgl-new-dimension-browser-exploitation/
|
||||||
|
* [2] https://security.stackexchange.com/questions/13799/is-webgl-a-security-concern ***/
|
||||||
|
"webgl.disabled" = true;
|
||||||
|
"webgl.enable-webgl2" = false;
|
||||||
|
"webgl.disable-fail-if-major-performance-caveat" = true; # [DEFAULT: true FF86+]
|
||||||
|
}
|
|
@ -0,0 +1,130 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2600]: MISCELLANEOUS ***/
|
||||||
|
/* 2601: prevent accessibility services from accessing your browser [RESTART]
|
||||||
|
* [SETTING] Privacy & Security>Permissions>Prevent accessibility services from accessing your browser (FF80 or lower)
|
||||||
|
* [1] https://support.mozilla.org/kb/accessibility-services ***/
|
||||||
|
"accessibility.force_disabled" = 1;
|
||||||
|
/* 2602: disable sending additional analytics to web servers
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/API/Navigator/sendBeacon ***/
|
||||||
|
"beacon.enabled" = false;
|
||||||
|
/* 2603: remove temp files opened with an external application
|
||||||
|
* [1] https://bugzilla.mozilla.org/302433 ***/
|
||||||
|
"browser.helperApps.deleteTempFileOnExit" = true;
|
||||||
|
/* 2604: disable page thumbnail collection ***/
|
||||||
|
"browser.pagethumbnails.capturing_disabled" = true; # [HIDDEN PREF]
|
||||||
|
/* 2606: disable UITour backend so there is no chance that a remote page can use it ***/
|
||||||
|
"browser.uitour.enabled" = false;
|
||||||
|
"browser.uitour.url" = "";
|
||||||
|
/* 2607: disable various developer tools in browser context
|
||||||
|
* [SETTING] Devtools>Advanced Settings>Enable browser chrome and add-on debugging toolboxes
|
||||||
|
* [1] https://github.com/pyllyukko/user.js/issues/179#issuecomment-246468676 ***/
|
||||||
|
"devtools.chrome.enabled" = false;
|
||||||
|
/* 2608: reset remote debugging to disabled
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/16222 ***/
|
||||||
|
"devtools.debugger.remote-enabled" = false; # [DEFAULT: false]
|
||||||
|
/* 2609: disable MathML (Mathematical Markup Language) [FF51+] [SETUP-HARDEN]
|
||||||
|
* [TEST] https://arkenfox.github.io/TZP/tzp.html#misc
|
||||||
|
* [1] https://bugzilla.mozilla.org/1173199 ***/
|
||||||
|
# // user_pref("mathml.disabled", true);
|
||||||
|
/* 2610: disable in-content SVG (Scalable Vector Graphics) [FF53+]
|
||||||
|
* [WARNING] Expect breakage incl. youtube player controls. Best left for a "hardened" profile.
|
||||||
|
* [1] https://bugzilla.mozilla.org/1216893 ***/
|
||||||
|
# // user_pref("svg.disabled", true);
|
||||||
|
/* 2611: disable middle mouse click opening links from clipboard
|
||||||
|
* [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/10089 ***/
|
||||||
|
"middlemouse.contentLoadURL" = false;
|
||||||
|
/* 2615: disable websites overriding Firefox's keyboard shortcuts [FF58+]
|
||||||
|
* 0 (default) or 1=allow, 2=block
|
||||||
|
* [SETTING] to add site exceptions: Ctrl+I>Permissions>Override Keyboard Shortcuts ***/
|
||||||
|
# // user_pref("permissions.default.shortcuts", 2);
|
||||||
|
/* 2616: remove special permissions for certain mozilla domains [FF35+]
|
||||||
|
* [1] resource://app/defaults/permissions ***/
|
||||||
|
"permissions.manager.defaultsUrl" = "";
|
||||||
|
/* 2617: remove webchannel whitelist ***/
|
||||||
|
"webchannel.allowObject.urlWhitelist" = "";
|
||||||
|
/* 2619: use Punycode in Internationalized Domain Names to eliminate possible spoofing
|
||||||
|
* Firefox has *some* protections, but it is better to be safe than sorry
|
||||||
|
* [SETUP-WEB] Might be undesirable for non-latin alphabet users since legitimate IDN's are also punycoded
|
||||||
|
* [TEST] https://www.xn--80ak6aa92e.com/ (www.apple.com)
|
||||||
|
* [1] https://wiki.mozilla.org/IDN_Display_Algorithm
|
||||||
|
* [2] https://en.wikipedia.org/wiki/IDN_homograph_attack
|
||||||
|
* [3] CVE-2017-5383: https://www.mozilla.org/security/advisories/mfsa2017-02/
|
||||||
|
* [4] https://www.xudongz.com/blog/2017/idn-phishing/ ***/
|
||||||
|
"network.IDN_show_punycode" = true;
|
||||||
|
/* 2620: enforce PDFJS, disable PDFJS scripting [SETUP-CHROME]
|
||||||
|
* This setting controls if the option "Display in Firefox" is available in the setting below
|
||||||
|
* and by effect controls whether PDFs are handled in-browser or externally ("Ask" or "Open With")
|
||||||
|
* PROS: pdfjs is lightweight, open source, and as secure/vetted as any pdf reader out there (more than most)
|
||||||
|
* Exploits are rare (one serious case in seven years), treated seriously and patched quickly.
|
||||||
|
* It doesn't break "state separation" of browser content (by not sharing with OS, independent apps).
|
||||||
|
* It maintains disk avoidance and application data isolation. It's convenient. You can still save to disk.
|
||||||
|
* CONS: You may prefer a different pdf reader for security reasons
|
||||||
|
* CAVEAT: JS can still force a pdf to open in-browser by bundling its own code (rare)
|
||||||
|
* [SETTING] General>Applications>Portable Document Format (PDF) ***/
|
||||||
|
"pdfjs.disabled" = false; # [DEFAULT: false]
|
||||||
|
"pdfjs.enableScripting" = false; # [FF86+]
|
||||||
|
/* 2621: disable links launching Windows Store on Windows 8/8.1/10 [WINDOWS] ***/
|
||||||
|
"network.protocol-handler.external.ms-windows-store" = false;
|
||||||
|
/* 2622: enforce no system colors; they can be fingerprinted
|
||||||
|
* [SETTING] General>Language and Appearance>Fonts and Colors>Colors>Use system colors ***/
|
||||||
|
"browser.display.use_system_colors" = false; # [DEFAULT: false]
|
||||||
|
/* 2623: disable permissions delegation [FF73+]
|
||||||
|
* Currently applies to cross-origin geolocation, camera, mic and screen-sharing
|
||||||
|
* permissions, and fullscreen requests. Disabling delegation means any prompts
|
||||||
|
* for these will show/use their correct 3rd party origin
|
||||||
|
* [1] https://groups.google.com/forum/#!topic/mozilla.dev.platform/BdFOMAuCGW8/discussion ***/
|
||||||
|
"permissions.delegation.enabled" = false;
|
||||||
|
/* 2624: enable "window.name" protection [FF82+]
|
||||||
|
* If a new page from another domain is loaded into a tab, then window.name is set to an empty string. The original
|
||||||
|
* string is restored if the tab reverts back to the original page. This change prevents some cross-site attacks
|
||||||
|
* [TEST] https://arkenfox.github.io/TZP/tests/windownamea.html ***/
|
||||||
|
"privacy.window.name.update.enabled" = true; # [DEFAULT: true FF86+]
|
||||||
|
/* 2625: disable bypassing 3rd party extension install prompts [FF82+]
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1659530,1681331 ***/
|
||||||
|
"extensions.postDownloadThirdPartyPrompt" = false;
|
||||||
|
/* 2626: enforce non-native widget theme
|
||||||
|
* Security: removes/reduces system API calls, e.g. win32k API [1]
|
||||||
|
* Fingerprinting: provides a uniform look and feel across platforms [2]
|
||||||
|
* [1] https://bugzilla.mozilla.org/1381938
|
||||||
|
* [2] https://bugzilla.mozilla.org/1411425 ***/
|
||||||
|
"widget.non-native-theme.enabled" = true; # [DEFAULT: true FF89+]
|
||||||
|
|
||||||
|
/** DOWNLOADS ***/
|
||||||
|
/* 2650: discourage downloading to desktop
|
||||||
|
* 0=desktop, 1=downloads (default), 2=last used
|
||||||
|
* [SETTING] To set your default "downloads": General>Downloads>Save files to ***/
|
||||||
|
# // user_pref("browser.download.folderList", 2);
|
||||||
|
/* 2651: enable user interaction for security by always asking where to download
|
||||||
|
* [SETUP-CHROME] On Android this blocks longtapping and saving images
|
||||||
|
* [SETTING] General>Downloads>Always ask you where to save files ***/
|
||||||
|
"browser.download.useDownloadDir" = false;
|
||||||
|
/* 2652: disable adding downloads to the system's "recent documents" list ***/
|
||||||
|
"browser.download.manager.addToRecentDocs" = false;
|
||||||
|
/* 2654: disable "open with" in download dialog [FF50+] [SETUP-HARDEN]
|
||||||
|
* This is very useful to enable when the browser is sandboxed (e.g. via AppArmor)
|
||||||
|
* in such a way that it is forbidden to run external applications.
|
||||||
|
* [WARNING] This may interfere with some users' workflow or methods
|
||||||
|
* [1] https://bugzilla.mozilla.org/1281959 ***/
|
||||||
|
# // user_pref("browser.download.forbid_open_with", true);
|
||||||
|
|
||||||
|
/** EXTENSIONS ***/
|
||||||
|
/* 2660: lock down allowed extension directories
|
||||||
|
* [SETUP-CHROME] This will break extensions, language packs, themes and any other
|
||||||
|
* XPI files which are installed outside of profile and application directories
|
||||||
|
* [1] https://mike.kaply.com/2012/02/21/understanding-add-on-scopes/
|
||||||
|
* [1] archived: https://archive.is/DYjAM ***/
|
||||||
|
"extensions.enabledScopes" = 5; # [HIDDEN PREF]
|
||||||
|
"extensions.autoDisableScopes" = 15; # [DEFAULT: 15]
|
||||||
|
/* 2662: disable webextension restrictions on certain mozilla domains (you also need 4503) [FF60+]
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1384330,1406795,1415644,1453988 ***/
|
||||||
|
# // user_pref("extensions.webextensions.restrictedDomains", "");
|
||||||
|
|
||||||
|
/** SECURITY ***/
|
||||||
|
/* 2680: enforce CSP (Content Security Policy)
|
||||||
|
* [NOTE] CSP is a very important and widespread security feature. Don't disable it!
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/HTTP/CSP ***/
|
||||||
|
"security.csp.enable" = true; # [DEFAULT: true]
|
||||||
|
/* 2684: enforce a security delay on some confirmation dialogs such as install, open/save
|
||||||
|
* [1] https://www.squarefree.com/2004/07/01/race-conditions-in-security-dialogs/ ***/
|
||||||
|
"security.dialog_enable_delay" = 1000; # [DEFAULT: 1000]
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2700]: PERSISTENT STORAGE
|
||||||
|
Data SET by websites including
|
||||||
|
cookies : profile\cookies.sqlite
|
||||||
|
localStorage : profile\webappsstore.sqlite
|
||||||
|
indexedDB : profile\storage\default
|
||||||
|
appCache : profile\OfflineCache
|
||||||
|
serviceWorkers :
|
||||||
|
|
||||||
|
[NOTE] indexedDB and serviceWorkers are not available in Private Browsing Mode
|
||||||
|
[NOTE] Blocking cookies also blocks websites access to: localStorage (incl. sessionStorage),
|
||||||
|
indexedDB, sharedWorker, and serviceWorker (and therefore service worker cache and notifications)
|
||||||
|
If you set a site exception for cookies (either "Allow" or "Allow for Session") then they become
|
||||||
|
accessible to websites except shared/service workers where the cookie setting *must* be "Allow"
|
||||||
|
***/
|
||||||
|
/* 2701: disable or isolate 3rd-party cookies and site-data [SETUP-WEB]
|
||||||
|
* 0 = Accept cookies and site data
|
||||||
|
* 1 = (Block) All third-party cookies
|
||||||
|
* 2 = (Block) All cookies
|
||||||
|
* 3 = (Block) Cookies from unvisited websites
|
||||||
|
* 4 = (Block) Cross-site tracking cookies (default)
|
||||||
|
* 5 = (Isolate All) Cross-site cookies (TCP: Total Cookie Protection / dFPI: dynamic FPI) [1] (FF86+)
|
||||||
|
* Option 5 with FPI enabled (4001) is ignored and not shown, and option 4 used instead
|
||||||
|
* [NOTE] You can set cookie exceptions under site permissions or use an extension
|
||||||
|
* [NOTE] Enforcing category to custom ensures ETP related prefs are always honored
|
||||||
|
* [SETTING] Privacy & Security>Enhanced Tracking Protection>Custom>Cookies
|
||||||
|
* [1] https://blog.mozilla.org/security/2021/02/23/total-cookie-protection/ ***/
|
||||||
|
"network.cookie.cookieBehavior" = 1;
|
||||||
|
"browser.contentblocking.category" = "custom";
|
||||||
|
/* 2702: set third-party cookies (if enabled, see 2701) to session-only
|
||||||
|
* [NOTE] .sessionOnly overrides .nonsecureSessionOnly except when .sessionOnly=false and
|
||||||
|
* .nonsecureSessionOnly=true. This allows you to keep HTTPS cookies, but session-only HTTP ones
|
||||||
|
* [1] https://feeding.cloud.geek.nz/posts/tweaking-cookies-for-privacy-in-firefox/ ***/
|
||||||
|
"network.cookie.thirdparty.sessionOnly" = true;
|
||||||
|
"network.cookie.thirdparty.nonsecureSessionOnly" = true; # [FF58+]
|
||||||
|
/* 2703: delete cookies and site data on close
|
||||||
|
* 0=keep until they expire (default), 2=keep until you close Firefox
|
||||||
|
* [NOTE] The setting below is disabled (but not changed) if you block all cookies (2701 = 2)
|
||||||
|
* [SETTING] Privacy & Security>Cookies and Site Data>Delete cookies and site data when Firefox is closed ***/
|
||||||
|
# // user_pref("network.cookie.lifetimePolicy", 2);
|
||||||
|
/* 2710: enable Enhanced Tracking Protection (ETP) in all windows
|
||||||
|
* [SETTING] Privacy & Security>Enhanced Tracking Protection>Custom>Tracking content
|
||||||
|
* [SETTING] to add site exceptions: Urlbar>ETP Shield
|
||||||
|
* [SETTING] to manage site exceptions: Options>Privacy & Security>Enhanced Tracking Protection>Manage Exceptions ***/
|
||||||
|
"privacy.trackingprotection.enabled" = true;
|
||||||
|
/* 2711: enable various ETP lists ***/
|
||||||
|
"privacy.trackingprotection.socialtracking.enabled" = true;
|
||||||
|
# // user_pref("privacy.trackingprotection.cryptomining.enabled", true); // [DEFAULT: true]
|
||||||
|
# // user_pref("privacy.trackingprotection.fingerprinting.enabled", true); // [DEFAULT: true]
|
||||||
|
/* 2720: disable DOM (Document Object Model) Storage
|
||||||
|
* [WARNING] This will break a LOT of sites' functionality AND extensions!
|
||||||
|
* You are better off using an extension for more granular control ***/
|
||||||
|
# // user_pref("dom.storage.enabled", false);
|
||||||
|
/* 2730: disable offline cache (appCache)
|
||||||
|
* [NOTE] In FF90+ the storage capability has been removed (1694662). For FF78-89 see the 2730 deprecated pref
|
||||||
|
* [WARNING] The API is easily fingerprinted, do not disable ***/
|
||||||
|
# // user_pref("browser.cache.offline.enable", false);
|
||||||
|
/* 2740: disable service worker cache and cache storage
|
||||||
|
* [NOTE] We clear service worker cache on exiting Firefox (see 2803)
|
||||||
|
* [1] https://w3c.github.io/ServiceWorker/#privacy ***/
|
||||||
|
# // user_pref("dom.caches.enabled", false);
|
||||||
|
/* 2750: disable Storage API [FF51+]
|
||||||
|
* The API gives sites the ability to find out how much space they can use, how much
|
||||||
|
* they are already using, and even control whether or not they need to be alerted
|
||||||
|
* before the user agent disposes of site data in order to make room for other things.
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/API/StorageManager
|
||||||
|
* [2] https://developer.mozilla.org/docs/Web/API/Storage_API
|
||||||
|
* [3] https://blog.mozilla.org/l10n/2017/03/07/firefox-l10n-report-aurora-54/ ***/
|
||||||
|
# // user_pref("dom.storageManager.enabled", false);
|
||||||
|
/* 2755: disable Storage Access API [FF65+]
|
||||||
|
* [1] https://developer.mozilla.org/docs/Web/API/Storage_Access_API ***/
|
||||||
|
# // user_pref("dom.storage_access.enabled", false);
|
||||||
|
/* 2760: enable Local Storage Next Generation (LSNG) [FF65+] ***/
|
||||||
|
"dom.storage.next_gen" = true;
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 2800]: SHUTDOWN
|
||||||
|
- Sanitizing on shutdown is all or nothing. It does not use Managed Exceptions under
|
||||||
|
Privacy & Security>Delete cookies and site data when Firefox is closed (1681701)
|
||||||
|
- If you want to keep some sites' cookies (exception as "Allow") and optionally other site
|
||||||
|
data but clear all the rest on close, then you need to set the "cookie" and optionally the
|
||||||
|
"offlineApps" prefs below to false, and to set the cookie lifetime pref to 2 (2703)
|
||||||
|
- "Offline Website Data" includes appCache (2730), localStorage (2720),
|
||||||
|
service worker cache (2740), and QuotaManager (IndexedDB, asm-cache)
|
||||||
|
- In both 2803 + 2804, the 'download' and 'history' prefs are combined in the
|
||||||
|
Firefox interface as "Browsing & Download History" and their values will be synced
|
||||||
|
***/
|
||||||
|
/* 2802: enable Firefox to clear items on shutdown (see 2803)
|
||||||
|
* [SETTING] Privacy & Security>History>Custom Settings>Clear history when Firefox closes ***/
|
||||||
|
"privacy.sanitize.sanitizeOnShutdown" = true;
|
||||||
|
/* 2803: set what items to clear on shutdown (if 2802 is true) [SETUP-CHROME]
|
||||||
|
* [NOTE] If 'history' is true, downloads will also be cleared regardless of the value
|
||||||
|
* but if 'history' is false, downloads can still be cleared independently
|
||||||
|
* However, this may not always be the case. The interface combines and syncs these
|
||||||
|
* prefs when set from there, and the sanitize code may change at any time
|
||||||
|
* [SETTING] Privacy & Security>History>Custom Settings>Clear history when Firefox closes>Settings ***/
|
||||||
|
"privacy.clearOnShutdown.cache" = true;
|
||||||
|
"privacy.clearOnShutdown.cookies" = true;
|
||||||
|
"privacy.clearOnShutdown.downloads" = true; # see note above
|
||||||
|
"privacy.clearOnShutdown.formdata" = true; # Form & Search History
|
||||||
|
"privacy.clearOnShutdown.history" = true; # Browsing & Download History
|
||||||
|
"privacy.clearOnShutdown.offlineApps" = true; # Offline Website Data
|
||||||
|
"privacy.clearOnShutdown.sessions" = true; # Active Logins
|
||||||
|
"privacy.clearOnShutdown.siteSettings" = false; # Site Preferences
|
||||||
|
/* 2804: reset default items to clear with Ctrl-Shift-Del (to match 2803) [SETUP-CHROME]
|
||||||
|
* This dialog can also be accessed from the menu History>Clear Recent History
|
||||||
|
* Firefox remembers your last choices. This will reset them when you start Firefox.
|
||||||
|
* [NOTE] Regardless of what you set privacy.cpd.downloads to, as soon as the dialog
|
||||||
|
* for "Clear Recent History" is opened, it is synced to the same as 'history' ***/
|
||||||
|
"privacy.cpd.cache" = true;
|
||||||
|
"privacy.cpd.cookies" = true;
|
||||||
|
# // user_pref("privacy.cpd.downloads", true); // not used, see note above
|
||||||
|
"privacy.cpd.formdata" = true; # Form & Search History
|
||||||
|
"privacy.cpd.history" = true; # Browsing & Download History
|
||||||
|
"privacy.cpd.offlineApps" = true; # Offline Website Data
|
||||||
|
"privacy.cpd.passwords" = false; # this is not listed
|
||||||
|
"privacy.cpd.sessions" = true; # Active Logins
|
||||||
|
"privacy.cpd.siteSettings" = false; # Site Preferences
|
||||||
|
/* 2805: clear Session Restore data when sanitizing on shutdown or manually [FF34+]
|
||||||
|
* [NOTE] Not needed if Session Restore is not used (see 0102) or is already cleared with history (see 2803)
|
||||||
|
* [NOTE] privacy.clearOnShutdown.openWindows prevents resuming from crashes (see 1022)
|
||||||
|
* [NOTE] privacy.cpd.openWindows has a bug that causes an additional window to open ***/
|
||||||
|
# // user_pref("privacy.clearOnShutdown.openWindows", true);
|
||||||
|
# // user_pref("privacy.cpd.openWindows", true);
|
||||||
|
/* 2806: reset default 'Time range to clear' for 'Clear Recent History' (see 2804)
|
||||||
|
* Firefox remembers your last choice. This will reset the value when you start Firefox.
|
||||||
|
* 0=everything, 1=last hour, 2=last two hours, 3=last four hours,
|
||||||
|
* 4=today, 5=last five minutes, 6=last twenty-four hours
|
||||||
|
* [NOTE] The values 5 + 6 are not listed in the dropdown, which will display a
|
||||||
|
* blank value if they are used, but they do work as advertised ***/
|
||||||
|
"privacy.sanitize.timeSpan" = 0;
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 4000]: FPI (FIRST PARTY ISOLATION)
|
||||||
|
1278037 - indexedDB (FF51+)
|
||||||
|
1277803 - favicons (FF52+)
|
||||||
|
1264562 - OCSP cache (FF52+)
|
||||||
|
1268726 - Shared Workers (FF52+)
|
||||||
|
1316283 - SSL session cache (FF52+)
|
||||||
|
1317927 - media cache (FF53+)
|
||||||
|
1323644 - HSTS and HPKP (FF54+)
|
||||||
|
1334690 - HTTP Alternative Services (FF54+)
|
||||||
|
1334693 - SPDY/HTTP2 (FF55+)
|
||||||
|
1337893 - DNS cache (FF55+)
|
||||||
|
1344170 - blob: URI (FF55+)
|
||||||
|
1300671 - data:, about: URLs (FF55+)
|
||||||
|
1473247 - IP addresses (FF63+)
|
||||||
|
1492607 - postMessage with targetOrigin "*" (requires 4002) (FF65+)
|
||||||
|
1542309 - top-level domain URLs when host is in the public suffix list (FF68+)
|
||||||
|
1506693 - pdfjs range-based requests (FF68+)
|
||||||
|
1330467 - site permissions (FF69+)
|
||||||
|
1534339 - IPv6 (FF73+)
|
||||||
|
1721858 - WebSocket (FF92+)
|
||||||
|
***/
|
||||||
|
/* 4001: enable First Party Isolation [FF51+]
|
||||||
|
* [SETUP-WEB] May break cross-domain logins and site functionality until perfected
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1260931,1299996 ***/
|
||||||
|
"privacy.firstparty.isolate" = true;
|
||||||
|
/* 4002: enforce FPI restriction for window.opener [FF54+]
|
||||||
|
* [NOTE] Setting this to false may reduce the breakage in 4001
|
||||||
|
* FF65+ blocks postMessage with targetOrigin "*" if originAttributes don't match. But
|
||||||
|
* to reduce breakage it ignores the 1st-party domain (FPD) originAttribute [2][3]
|
||||||
|
* The 2nd pref removes that limitation and will only allow communication if FPDs also match.
|
||||||
|
* [1] https://bugzilla.mozilla.org/1319773#c22
|
||||||
|
* [2] https://bugzilla.mozilla.org/1492607
|
||||||
|
* [3] https://developer.mozilla.org/docs/Web/API/Window/postMessage ***/
|
||||||
|
# // user_pref("privacy.firstparty.isolate.restrict_opener_access", true); // [DEFAULT: true]
|
||||||
|
# // user_pref("privacy.firstparty.isolate.block_post_message", true);
|
||||||
|
/* 4003: enable scheme with FPI [FF78+]
|
||||||
|
* [NOTE] Experimental: existing data and site permissions are incompatible
|
||||||
|
* and some site exceptions may not work e.g. HTTPS-only mode (see 1244) ***/
|
||||||
|
# // user_pref("privacy.firstparty.isolate.use_site", true);
|
||||||
|
}
|
|
@ -0,0 +1,104 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 4500]: RFP (RESIST FINGERPRINTING)
|
||||||
|
RFP covers a wide range of ongoing fingerprinting solutions.
|
||||||
|
It is an all-or-nothing buy in: you cannot pick and choose what parts you want
|
||||||
|
|
||||||
|
[WARNING] DO NOT USE extensions to alter RFP protected metrics
|
||||||
|
[WARNING] DO NOT USE prefs in section 4600 with RFP as they can interfere
|
||||||
|
|
||||||
|
FF41+
|
||||||
|
418986 - limit window.screen & CSS media queries leaking identifiable info
|
||||||
|
[TEST] https://arkenfox.github.io/TZP/tzp.html#screen
|
||||||
|
FF50+
|
||||||
|
1281949 - spoof screen orientation
|
||||||
|
1281963 - hide the contents of navigator.plugins and navigator.mimeTypes (FF50+)
|
||||||
|
FF55+
|
||||||
|
1330890 - spoof timezone as UTC 0
|
||||||
|
1360039 - spoof navigator.hardwareConcurrency as 2 (see 4601)
|
||||||
|
1217238 - reduce precision of time exposed by javascript
|
||||||
|
FF56+
|
||||||
|
1369303 - spoof/disable performance API (see 4602, 4603)
|
||||||
|
1333651 - spoof User Agent & Navigator API (see section 4700)
|
||||||
|
JS: FF78+ the version is spoofed as ESR, and the OS as Windows 10, OS 10.15, Android 9 (FF91+ as 10), or Linux
|
||||||
|
HTTP Headers: spoofed as Windows or Android
|
||||||
|
1369319 - disable device sensor API (see 4604)
|
||||||
|
1369357 - disable site specific zoom (see 4605)
|
||||||
|
1337161 - hide gamepads from content (see 4606)
|
||||||
|
1372072 - spoof network information API as "unknown" when dom.netinfo.enabled = true (see 4607)
|
||||||
|
1333641 - reduce fingerprinting in WebSpeech API (see 4608)
|
||||||
|
FF57+
|
||||||
|
1369309 - spoof media statistics (see 4610)
|
||||||
|
1382499 - reduce screen co-ordinate fingerprinting in Touch API (see 4611)
|
||||||
|
1217290 & 1409677 - enable some fingerprinting resistance for WebGL
|
||||||
|
1382545 - reduce fingerprinting in Animation API
|
||||||
|
1354633 - limit MediaError.message to a whitelist
|
||||||
|
1382533 & 1697680 - enable fingerprinting resistance for Presentation API (FF57-87)
|
||||||
|
This blocks exposure of local IP Addresses via mDNS (Multicast DNS)
|
||||||
|
FF58+
|
||||||
|
967895 - spoof canvas and enable site permission prompt before allowing canvas data extraction
|
||||||
|
FF59+
|
||||||
|
1372073 - spoof/block fingerprinting in MediaDevices API
|
||||||
|
Spoof: enumerate devices reports one "Internal Camera" and one "Internal Microphone" if
|
||||||
|
media.navigator.enabled is true (see 4612)
|
||||||
|
Block: suppresses the ondevicechange event (see 4613)
|
||||||
|
1039069 - warn when language prefs are set to non en-US (see 0210, 0211)
|
||||||
|
1222285 & 1433592 - spoof keyboard events and suppress keyboard modifier events
|
||||||
|
Spoofing mimics the content language of the document. Currently it only supports en-US.
|
||||||
|
Modifier events suppressed are SHIFT and both ALT keys. Chrome is not affected.
|
||||||
|
FF60-67
|
||||||
|
1337157 - disable WebGL debug renderer info (see 4614) (FF60+)
|
||||||
|
1459089 - disable OS locale in HTTP Accept-Language headers (ANDROID) (FF62+)
|
||||||
|
1479239 - return "no-preference" with prefers-reduced-motion (see 4615) (FF63+)
|
||||||
|
1363508 - spoof/suppress Pointer Events (see 4616) (FF64+)
|
||||||
|
FF65: pointerEvent.pointerid (1492766)
|
||||||
|
1485266 - disable exposure of system colors to CSS or canvas (see 4617) (FF67+)
|
||||||
|
1407366 - enable inner window letterboxing (see 4504) (FF67+)
|
||||||
|
1494034 - return "light" with prefers-color-scheme (see 4618) (FF67+)
|
||||||
|
FF68-77
|
||||||
|
1564422 - spoof audioContext outputLatency (see 4619) (FF70+)
|
||||||
|
1595823 - return audioContext sampleRate as 44100 (see 4619) (FF72+)
|
||||||
|
1607316 - spoof pointer as coarse and hover as none (ANDROID) (FF74+)
|
||||||
|
FF78-90
|
||||||
|
1621433 - randomize canvas (previously FF58+ returned an all-white canvas) (FF78+)
|
||||||
|
1653987 - limit font visibility to bundled and "Base Fonts" (see 4620) (Windows, Mac, some Linux) (FF80+)
|
||||||
|
1461454 - spoof smooth=true and powerEfficient=false for supported media in MediaCapabilities (FF82+)
|
||||||
|
***/
|
||||||
|
/* 4501: enable privacy.resistFingerprinting [FF41+]
|
||||||
|
* [SETUP-WEB] RFP can cause the odd website to break in strange ways, and has a few side affects,
|
||||||
|
* but is largely robust nowadays. Give it a try. Your choice. Also see 4504 (letterboxing).
|
||||||
|
* [1] https://bugzilla.mozilla.org/418986 ***/
|
||||||
|
"privacy.resistFingerprinting" = true;
|
||||||
|
/* 4502: set new window sizes to round to hundreds [FF55+] [SETUP-CHROME]
|
||||||
|
* Width will round down to multiples of 200s and height to 100s, to fit your screen.
|
||||||
|
* The override values are a starting point to round from if you want some control
|
||||||
|
* [1] https://bugzilla.mozilla.org/1330882 ***/
|
||||||
|
# // user_pref("privacy.window.maxInnerWidth", 1000);
|
||||||
|
# // user_pref("privacy.window.maxInnerHeight", 1000);
|
||||||
|
/* 4503: disable mozAddonManager Web API [FF57+]
|
||||||
|
* [NOTE] To allow extensions to work on AMO, you also need 2662
|
||||||
|
* [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1384330,1406795,1415644,1453988 ***/
|
||||||
|
"privacy.resistFingerprinting.block_mozAddonManager" = true; # [HIDDEN PREF]
|
||||||
|
/* 4504: enable RFP letterboxing [FF67+]
|
||||||
|
* Dynamically resizes the inner window by applying margins in stepped ranges [2]
|
||||||
|
* If you use the dimension pref, then it will only apply those resolutions. The format is
|
||||||
|
* "width1xheight1, width2xheight2, ..." (e.g. "800x600, 1000x1000, 1600x900")
|
||||||
|
* [SETUP-WEB] This does NOT require RFP (see 4501) **for now**, so if you're not using 4501, or you are but
|
||||||
|
* dislike margins being applied, then flip this pref, keeping in mind that it is effectively fingerprintable
|
||||||
|
* [WARNING] DO NOT USE: the dimension pref is only meant for testing
|
||||||
|
* [1] https://bugzilla.mozilla.org/1407366
|
||||||
|
* [2] https://hg.mozilla.org/mozilla-central/rev/6d2d7856e468#l2.32 ***/
|
||||||
|
"privacy.resistFingerprinting.letterboxing" = true; # [HIDDEN PREF]
|
||||||
|
# // user_pref("privacy.resistFingerprinting.letterboxing.dimensions", ""); // [HIDDEN PREF]
|
||||||
|
/* 4505: experimental RFP [FF91+]
|
||||||
|
* [WARNING] DO NOT USE unless testing, see [1] comment 12
|
||||||
|
* [1] https://bugzilla.mozilla.org/1635603 ***/
|
||||||
|
# // user_pref("privacy.resistFingerprinting.exemptedDomains", "*.example.invalid");
|
||||||
|
# // user_pref("privacy.resistFingerprinting.testGranularityMask", 0);
|
||||||
|
/* 4510: disable showing about:blank as soon as possible during startup [FF60+]
|
||||||
|
* When default true this no longer masks the RFP chrome resizing activity
|
||||||
|
* [1] https://bugzilla.mozilla.org/1448423 ***/
|
||||||
|
"browser.startup.blankWindow" = false;
|
||||||
|
/* 4520: disable chrome animations [FF77+] [RESTART]
|
||||||
|
* [NOTE] pref added in FF63, but applied to chrome in FF77. RFP spoofs this for web content ***/
|
||||||
|
"ui.prefersReducedMotion" = 1; # [HIDDEN PREF]
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 4600]: RFP ALTERNATIVES
|
||||||
|
[WARNING] DO NOT USE prefs in this section with RFP as they can interfere
|
||||||
|
***/
|
||||||
|
/* [SETUP-non-RFP] Non-RFP users replace the * with a slash on this line to enable these
|
||||||
|
// FF55+
|
||||||
|
// 4601: [2514] spoof number of CPU cores [FF48+]
|
||||||
|
// [1] https://bugzilla.mozilla.org/1008453
|
||||||
|
// [2] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/21675
|
||||||
|
// [3] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/22127
|
||||||
|
// [4] https://html.spec.whatwg.org/multipage/workers.html#navigator.hardwareconcurrency
|
||||||
|
user_pref("dom.maxHardwareConcurrency", 2);
|
||||||
|
// FF56+
|
||||||
|
// 4602: [2411] disable resource/navigation timing
|
||||||
|
user_pref("dom.enable_resource_timing", false);
|
||||||
|
// 4603: [2412] disable timing attacks
|
||||||
|
// [1] https://wiki.mozilla.org/Security/Reviews/Firefox/NavigationTimingAPI
|
||||||
|
// user_pref("dom.enable_performance", false);
|
||||||
|
// 4604: [2512] disable device sensor API
|
||||||
|
// Optional protection depending on your device
|
||||||
|
// [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/15758
|
||||||
|
// [2] https://blog.lukaszolejnik.com/stealing-sensitive-browser-data-with-the-w3c-ambient-light-sensor-api/
|
||||||
|
// [3] https://bugzilla.mozilla.org/buglist.cgi?bug_id=1357733,1292751
|
||||||
|
// user_pref("device.sensors.enabled", false);
|
||||||
|
// 4605: [2515] disable site specific zoom
|
||||||
|
// Zoom levels affect screen res and are highly fingerprintable. This does not stop you using
|
||||||
|
// zoom, it will just not use/remember any site specific settings. Zoom levels on new tabs
|
||||||
|
// and new windows are reset to default and only the current tab retains the current zoom
|
||||||
|
user_pref("browser.zoom.siteSpecific", false);
|
||||||
|
// 4606: [2501] disable gamepad API - USB device ID enumeration
|
||||||
|
// Optional protection depending on your connected devices
|
||||||
|
// [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/13023
|
||||||
|
// user_pref("dom.gamepad.enabled", false);
|
||||||
|
// 4607: [2503] disable giving away network info [FF31+]
|
||||||
|
// e.g. bluetooth, cellular, ethernet, wifi, wimax, other, mixed, unknown, none
|
||||||
|
// [1] https://developer.mozilla.org/docs/Web/API/Network_Information_API
|
||||||
|
// [2] https://wicg.github.io/netinfo/
|
||||||
|
// [3] https://bugzilla.mozilla.org/960426
|
||||||
|
user_pref("dom.netinfo.enabled", false); // [DEFAULT: true on Android]
|
||||||
|
// 4608: [2021] disable the SpeechSynthesis (Text-to-Speech) part of the Web Speech API
|
||||||
|
// [1] https://developer.mozilla.org/docs/Web/API/Web_Speech_API
|
||||||
|
// [2] https://developer.mozilla.org/docs/Web/API/SpeechSynthesis
|
||||||
|
// [3] https://wiki.mozilla.org/HTML5_Speech_API
|
||||||
|
user_pref("media.webspeech.synth.enabled", false);
|
||||||
|
// FF57+
|
||||||
|
// 4610: [2506] disable video statistics - JS performance fingerprinting [FF25+]
|
||||||
|
// [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/15757
|
||||||
|
// [2] https://bugzilla.mozilla.org/654550
|
||||||
|
user_pref("media.video_stats.enabled", false);
|
||||||
|
// 4611: [2509] disable touch events
|
||||||
|
// fingerprinting attack vector - leaks screen res & actual screen coordinates
|
||||||
|
// 0=disabled, 1=enabled, 2=autodetect
|
||||||
|
// Optional protection depending on your device
|
||||||
|
// [1] https://developer.mozilla.org/docs/Web/API/Touch_events
|
||||||
|
// [2] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/10286
|
||||||
|
// user_pref("dom.w3c_touch_events.enabled", 0);
|
||||||
|
// FF59+
|
||||||
|
// 4612: [2505] disable media device enumeration [FF29+]
|
||||||
|
// [1] https://wiki.mozilla.org/Media/getUserMedia
|
||||||
|
// [2] https://developer.mozilla.org/docs/Web/API/MediaDevices/enumerateDevices
|
||||||
|
user_pref("media.navigator.enabled", false);
|
||||||
|
// 4613: [2511] disable MediaDevices change detection [FF51+]
|
||||||
|
// [1] https://developer.mozilla.org/docs/Web/Events/devicechange
|
||||||
|
// [2] https://developer.mozilla.org/docs/Web/API/MediaDevices/ondevicechange
|
||||||
|
user_pref("media.ondevicechange.enabled", false);
|
||||||
|
// FF60+
|
||||||
|
// 4614: [2522] disable WebGL debug info being available to websites
|
||||||
|
// [1] https://bugzilla.mozilla.org/1171228
|
||||||
|
// [2] https://developer.mozilla.org/docs/Web/API/WEBGL_debug_renderer_info
|
||||||
|
user_pref("webgl.enable-debug-renderer-info", false);
|
||||||
|
// FF63+
|
||||||
|
// 4615: enforce prefers-reduced-motion as no-preference [FF63+] [RESTART]
|
||||||
|
// 0=no-preference, 1=reduce
|
||||||
|
user_pref("ui.prefersReducedMotion", 0); // [HIDDEN PREF]
|
||||||
|
// FF64+
|
||||||
|
// 4616: [2516] disable PointerEvents [FF86 or lower]
|
||||||
|
// [1] https://developer.mozilla.org/docs/Web/API/PointerEvent
|
||||||
|
// [-] https://bugzilla.mozilla.org/1688105
|
||||||
|
user_pref("dom.w3c_pointer_events.enabled", false);
|
||||||
|
// FF67+
|
||||||
|
// 4617: [2618] disable exposure of system colors to CSS or canvas [FF44+]
|
||||||
|
// [NOTE] See second listed bug: may cause black on black for elements with undefined colors
|
||||||
|
// [SETUP-CHROME] Might affect CSS in themes and extensions
|
||||||
|
// [1] https://bugzilla.mozilla.org/buglist.cgi?bug_id=232227,1330876
|
||||||
|
user_pref("ui.use_standins_for_native_colors", true);
|
||||||
|
// 4618: enforce prefers-color-scheme as light [FF67+]
|
||||||
|
// 0=light, 1=dark : This overrides your OS value
|
||||||
|
user_pref("ui.systemUsesDarkTheme", 0); // [HIDDEN PREF]
|
||||||
|
// FF72+
|
||||||
|
// 4619: [2510] disable Web Audio API [FF51+]
|
||||||
|
// [1] https://bugzilla.mozilla.org/1288359
|
||||||
|
// user_pref("dom.webaudio.enabled", false);
|
||||||
|
// FF80+
|
||||||
|
// 4620: limit font visibility (Windows, Mac, some Linux) [FF79+]
|
||||||
|
// Uses hardcoded lists with two parts: kBaseFonts + kLangPackFonts [1]
|
||||||
|
// 1=only base system fonts, 2=also fonts from optional language packs, 3=also user-installed fonts
|
||||||
|
// [NOTE] Bundled fonts are auto-allowed
|
||||||
|
// [1] https://searchfox.org/mozilla-central/search?path=StandardFonts*.inc
|
||||||
|
user_pref("layout.css.font-visibility.level", 1);
|
||||||
|
// ***/
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 4700]: RFP ALTERNATIVES (USER AGENT SPOOFING)
|
||||||
|
These prefs are insufficient and leak. Use RFP and **nothing else**
|
||||||
|
- Many of the user agent components can be derived by other means. When those
|
||||||
|
values differ, you provide more bits and raise entropy. Examples include
|
||||||
|
workers, iframes, headers, tcp/ip attributes, feature detection, and many more
|
||||||
|
- Web extensions also lack APIs to fully protect spoofing
|
||||||
|
***/
|
||||||
|
/* 4701: navigator DOM object overrides
|
||||||
|
* [WARNING] DO NOT USE ***/
|
||||||
|
# // user_pref("general.appname.override", ""); // [HIDDEN PREF]
|
||||||
|
# // user_pref("general.appversion.override", ""); // [HIDDEN PREF]
|
||||||
|
# // user_pref("general.buildID.override", ""); // [HIDDEN PREF]
|
||||||
|
# // user_pref("general.oscpu.override", ""); // [HIDDEN PREF]
|
||||||
|
# // user_pref("general.platform.override", ""); // [HIDDEN PREF]
|
||||||
|
# // user_pref("general.useragent.override", ""); // [HIDDEN PREF]
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 5000]: PERSONAL
|
||||||
|
Non-project related but useful. If any of these interest you, add them to your overrides
|
||||||
|
To save some overrides, we've made a few active as they seem to be universally used ***/
|
||||||
|
/* WELCOME & WHAT's NEW NOTICES ***/
|
||||||
|
"browser.startup.homepage_override.mstone" = "ignore"; # master switch
|
||||||
|
# // user_pref("startup.homepage_welcome_url", "");
|
||||||
|
# // user_pref("startup.homepage_welcome_url.additional", "");
|
||||||
|
# // user_pref("startup.homepage_override_url", ""); // What's New page after updates
|
||||||
|
/* WARNINGS ***/
|
||||||
|
# // user_pref("browser.tabs.warnOnClose", false);
|
||||||
|
# // user_pref("browser.tabs.warnOnCloseOtherTabs", false);
|
||||||
|
# // user_pref("browser.tabs.warnOnOpen", false);
|
||||||
|
# // user_pref("full-screen-api.warning.delay", 0);
|
||||||
|
# // user_pref("full-screen-api.warning.timeout", 0);
|
||||||
|
/* APPEARANCE ***/
|
||||||
|
# // user_pref("browser.download.autohideButton", false); // [FF57+]
|
||||||
|
# // user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); // [FF68+] allow userChrome/userContent
|
||||||
|
/* CONTENT BEHAVIOR ***/
|
||||||
|
# // user_pref("accessibility.typeaheadfind", true); // enable "Find As You Type"
|
||||||
|
# // user_pref("clipboard.autocopy", false); // disable autocopy default [LINUX]
|
||||||
|
# // user_pref("layout.spellcheckDefault", 2); // 0=none, 1-multi-line, 2=multi-line & single-line
|
||||||
|
/* UX BEHAVIOR ***/
|
||||||
|
# // user_pref("browser.backspace_action", 2); // 0=previous page, 1=scroll up, 2=do nothing
|
||||||
|
# // user_pref("browser.quitShortcut.disabled", true); // disable Ctrl-Q quit shortcut [LINUX] [MAC] [FF87+]
|
||||||
|
# // user_pref("browser.tabs.closeWindowWithLastTab", false);
|
||||||
|
# // user_pref("browser.tabs.loadBookmarksInTabs", true); // open bookmarks in a new tab [FF57+]
|
||||||
|
# // user_pref("browser.urlbar.decodeURLsOnCopy", true); // see bugzilla 1320061 [FF53+]
|
||||||
|
# // user_pref("general.autoScroll", false); // middle-click enabling auto-scrolling [DEFAULT: false on Linux]
|
||||||
|
# // user_pref("ui.key.menuAccessKey", 0); // disable alt key toggling the menu bar [RESTART]
|
||||||
|
# // user_pref("view_source.tab", false); // view "page/selection source" in a new window [FF68+, FF59 and under]
|
||||||
|
/* UX FEATURES: disable and hide the icons and menus ***/
|
||||||
|
"browser.messaging-system.whatsNewPanel.enabled" = false; # What's New toolbar icon [FF69+]
|
||||||
|
# // user_pref("extensions.pocket.enabled", false); // Pocket Account [FF46+]
|
||||||
|
# // user_pref("identity.fxaccounts.enabled", false); // Firefox Accounts & Sync [FF60+] [RESTART]
|
||||||
|
# // user_pref("reader.parse-on-load.enabled", false); // Reader View
|
||||||
|
/* OTHER ***/
|
||||||
|
# // user_pref("browser.bookmarks.max_backups", 2);
|
||||||
|
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false; # disable CFR [FF67+]
|
||||||
|
# // [SETTING] General>Browsing>Recommend extensions as you browse
|
||||||
|
"browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false; # disable CFR [FF67+]
|
||||||
|
# // [SETTING] General>Browsing>Recommend features as you browse
|
||||||
|
# // user_pref("network.manage-offline-status", false); // see bugzilla 620472
|
||||||
|
# // user_pref("xpinstall.signatures.required", false); // enforced extension signing (Nightly/ESR)
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
{
|
||||||
|
/*** [SECTION 9999]: DEPRECATED / REMOVED / LEGACY / RENAMED
|
||||||
|
Documentation denoted as [-]. Items deprecated in FF78 or earlier have been archived at [1],
|
||||||
|
which also provides a link-clickable, viewer-friendly version of the deprecated bugzilla tickets
|
||||||
|
[1] https://github.com/arkenfox/user.js/issues/123
|
||||||
|
***/
|
||||||
|
/* ESR78.x still uses all the following prefs
|
||||||
|
// [NOTE] replace the * with a slash in the line above to re-enable them
|
||||||
|
// FF79
|
||||||
|
// 0212: enforce fallback text encoding to match en-US
|
||||||
|
// When the content or server doesn't declare a charset the browser will
|
||||||
|
// fallback to the "Current locale" based on your application language
|
||||||
|
// [TEST] https://hsivonen.com/test/moz/check-charset.htm
|
||||||
|
// [1] https://gitlab.torproject.org/tpo/applications/tor-browser/-/issues/20025
|
||||||
|
// [-] https://bugzilla.mozilla.org/1603712
|
||||||
|
user_pref("intl.charset.fallback.override", "windows-1252");
|
||||||
|
// FF82
|
||||||
|
// 0206: disable geographically specific results/search engines e.g. "browser.search.*.US"
|
||||||
|
// i.e. ignore all of Mozilla's various search engines in multiple locales
|
||||||
|
// [-] https://bugzilla.mozilla.org/1619926
|
||||||
|
user_pref("browser.search.geoSpecificDefaults", false);
|
||||||
|
user_pref("browser.search.geoSpecificDefaults.url", "");
|
||||||
|
// FF86
|
||||||
|
// 1205: disable SSL Error Reporting
|
||||||
|
// [1] https://firefox-source-docs.mozilla.org/browser/base/sslerrorreport/preferences.html
|
||||||
|
// [-] https://bugzilla.mozilla.org/1681839
|
||||||
|
user_pref("security.ssl.errorReporting.automatic", false);
|
||||||
|
user_pref("security.ssl.errorReporting.enabled", false);
|
||||||
|
user_pref("security.ssl.errorReporting.url", "");
|
||||||
|
// 2653: disable hiding mime types (Options>General>Applications) not associated with a plugin
|
||||||
|
// [-] https://bugzilla.mozilla.org/1581678
|
||||||
|
user_pref("browser.download.hide_plugins_without_extensions", false);
|
||||||
|
// FF87
|
||||||
|
// 0105d: disable Activity Stream recent Highlights in the Library [FF57+]
|
||||||
|
// [-] https://bugzilla.mozilla.org/1689405
|
||||||
|
// user_pref("browser.library.activity-stream.enabled", false);
|
||||||
|
// FF89
|
||||||
|
// 0309: disable sending Flash crash reports
|
||||||
|
// [-] https://bugzilla.mozilla.org/1682030 [underlying NPAPI code removed]
|
||||||
|
user_pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
|
||||||
|
// 0310: disable sending the URL of the website where a plugin crashed
|
||||||
|
// [-] https://bugzilla.mozilla.org/1682030 [underlying NPAPI code removed]
|
||||||
|
user_pref("dom.ipc.plugins.reportCrashURL", false);
|
||||||
|
// 1243: block unencrypted requests from Flash on encrypted pages to mitigate MitM attacks [FF59+]
|
||||||
|
// [1] https://bugzilla.mozilla.org/1190623
|
||||||
|
// [-] https://bugzilla.mozilla.org/1682030 [underlying NPAPI code removed]
|
||||||
|
user_pref("security.mixed_content.block_object_subrequest", true);
|
||||||
|
// 1803: disable Flash plugin
|
||||||
|
// 0=deactivated, 1=ask, 2=enabled
|
||||||
|
// ESR52.x is the last branch to *fully* support NPAPI, FF52+ stable only supports Flash
|
||||||
|
// [NOTE] You can still override individual sites via site permissions
|
||||||
|
// [-] https://bugzilla.mozilla.org/1682030 [underlying NPAPI code removed]
|
||||||
|
user_pref("plugin.state.flash", 0); // [DEFAULT: 1]
|
||||||
|
// FF90
|
||||||
|
// 0708: disable FTP [FF60+]
|
||||||
|
// [-] https://bugzilla.mozilla.org/1574475
|
||||||
|
// user_pref("network.ftp.enabled", false); // [DEFAULT: false FF88+]
|
||||||
|
// 2730: enforce no offline cache storage (appCache) [FF71+]
|
||||||
|
// [-] https://bugzilla.mozilla.org/1694662
|
||||||
|
user_pref("browser.cache.offline.storage.enable", false); // [DEFAULT: false FF84+]
|
||||||
|
// ***/
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
/******
|
||||||
|
* name: arkenfox user.js
|
||||||
|
* date: 30 July 2021
|
||||||
|
* version 91-alpha
|
||||||
|
* url: https://github.com/arkenfox/user.js
|
||||||
|
* license: MIT: https://github.com/arkenfox/user.js/blob/master/LICENSE.txt
|
||||||
|
|
||||||
|
* README:
|
||||||
|
|
||||||
|
1. Consider using Tor Browser if it meets your needs or fits your threat model better
|
||||||
|
* https://www.torproject.org/about/torusers.html.en
|
||||||
|
2. Required reading: Overview, Backing Up, Implementing, and Maintenance entries
|
||||||
|
* https://github.com/arkenfox/user.js/wiki
|
||||||
|
3. If you skipped step 2, return to step 2
|
||||||
|
4. Make changes
|
||||||
|
* There are often trade-offs and conflicts between security vs privacy vs anti-fingerprinting
|
||||||
|
and these need to be balanced against functionality & convenience & breakage
|
||||||
|
* Some site breakage and unintended consequences will happen. Everyone's experience will differ
|
||||||
|
e.g. some user data is erased on close (section 2800), change this to suit your needs
|
||||||
|
* While not 100% definitive, search for "[SETUP" tags
|
||||||
|
e.g. third party images/videos not loading on some sites? check 1603
|
||||||
|
* Take the wiki link in step 2 and read the Troubleshooting entry
|
||||||
|
5. Some tag info
|
||||||
|
[SETUP-SECURITY] it's one item, read it
|
||||||
|
[SETUP-WEB] can cause some websites to break
|
||||||
|
[SETUP-CHROME] changes how Firefox itself behaves (i.e. not directly website related)
|
||||||
|
[SETUP-PERF] may impact performance
|
||||||
|
[WARNING] used on some commented out items, heed them
|
||||||
|
6. Override Recipes: https://github.com/arkenfox/user.js/issues/1080
|
||||||
|
|
||||||
|
* RELEASES: https://github.com/arkenfox/user.js/releases
|
||||||
|
|
||||||
|
* It is best to use the arkenfox release that is optimized for and matches your Firefox version
|
||||||
|
* EVERYONE: each release
|
||||||
|
- run prefsCleaner or reset deprecated prefs (9999s) and prefs made redundant by RPF (4600s)
|
||||||
|
- re-enable section 4600 if you don't use RFP
|
||||||
|
ESR78
|
||||||
|
- If you are not using arkenfox v78... (not a definitive list)
|
||||||
|
- 1244: HTTPS-Only mode is enabled
|
||||||
|
- 1401: document fonts is inactive as it is now covered by RFP in FF80+
|
||||||
|
- 2626: non-native widget theme is enforced
|
||||||
|
- 4600: some prefs may apply even if you use RFP
|
||||||
|
- 9999: switch the appropriate deprecated section(s) back on
|
||||||
|
|
||||||
|
* INDEX:
|
||||||
|
|
||||||
|
0100: STARTUP
|
||||||
|
0200: GEOLOCATION / LANGUAGE / LOCALE
|
||||||
|
0300: QUIET FOX
|
||||||
|
0400: BLOCKLISTS / SAFE BROWSING
|
||||||
|
0500: SYSTEM ADD-ONS / EXPERIMENTS
|
||||||
|
0600: BLOCK IMPLICIT OUTBOUND
|
||||||
|
0700: HTTP* / TCP/IP / DNS / PROXY / SOCKS etc
|
||||||
|
0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
|
||||||
|
0900: PASSWORDS
|
||||||
|
1000: CACHE / SESSION (RE)STORE / FAVICONS
|
||||||
|
1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP / CIPHERS)
|
||||||
|
1400: FONTS
|
||||||
|
1600: HEADERS / REFERERS
|
||||||
|
1700: CONTAINERS
|
||||||
|
1800: PLUGINS
|
||||||
|
2000: MEDIA / CAMERA / MIC
|
||||||
|
2200: WINDOW MEDDLING & LEAKS / POPUPS
|
||||||
|
2300: WEB WORKERS
|
||||||
|
2400: DOM (DOCUMENT OBJECT MODEL) & JAVASCRIPT
|
||||||
|
2500: HARDWARE FINGERPRINTING
|
||||||
|
2600: MISCELLANEOUS
|
||||||
|
2700: PERSISTENT STORAGE
|
||||||
|
2800: SHUTDOWN
|
||||||
|
4000: FPI (FIRST PARTY ISOLATION)
|
||||||
|
4500: RFP (RESIST FINGERPRINTING)
|
||||||
|
4600: RFP ALTERNATIVES
|
||||||
|
4700: RFP ALTERNATIVES (USER AGENT SPOOFING)
|
||||||
|
5000: PERSONAL
|
||||||
|
9999: DEPRECATED / REMOVED / LEGACY / RENAMED
|
||||||
|
|
||||||
|
******/
|
||||||
|
|
||||||
|
import ./0000.nix //
|
||||||
|
import ./0100.nix //
|
||||||
|
import ./0200.nix //
|
||||||
|
import ./0300.nix //
|
||||||
|
import ./0400.nix //
|
||||||
|
import ./0500.nix //
|
||||||
|
import ./0600.nix //
|
||||||
|
import ./0700.nix //
|
||||||
|
import ./0800.nix //
|
||||||
|
import ./0900.nix //
|
||||||
|
import ./1000.nix //
|
||||||
|
import ./1400.nix //
|
||||||
|
import ./1600.nix //
|
||||||
|
import ./1700.nix //
|
||||||
|
import ./1800.nix //
|
||||||
|
import ./2000.nix //
|
||||||
|
import ./2200.nix //
|
||||||
|
import ./2300.nix //
|
||||||
|
import ./2400.nix //
|
||||||
|
import ./2500.nix //
|
||||||
|
import ./2600.nix //
|
||||||
|
import ./2700.nix //
|
||||||
|
import ./2800.nix //
|
||||||
|
import ./4000.nix //
|
||||||
|
# import ./4500.nix //
|
||||||
|
import ./4600.nix //
|
||||||
|
import ./4700.nix //
|
||||||
|
import ./5000.nix //
|
||||||
|
import ./9999.nix
|
|
@ -0,0 +1,71 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
nixpkgs.config = {
|
||||||
|
packageOverrides = pkgs: {
|
||||||
|
nur = import (builtins.fetchTarball "https://github.com/nix-community/NUR/archive/master.tar.gz") {
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# nix-env -f '<nixpkgs>' -qaP -A nur.repos.rycee.firefox-addons
|
||||||
|
programs.firefox = {
|
||||||
|
enable = true;
|
||||||
|
# maybe enable tridactyl?
|
||||||
|
# nix-env -f '<nixpkgs>' -qaP -A nur.repos.rycee.firefox-addons
|
||||||
|
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
|
||||||
|
browserpass
|
||||||
|
canvasblocker
|
||||||
|
clearurls
|
||||||
|
cookie-autodelete
|
||||||
|
darkreader
|
||||||
|
floccus
|
||||||
|
foxyproxy-standard
|
||||||
|
https-everywhere
|
||||||
|
i-dont-care-about-cookies
|
||||||
|
localcdn
|
||||||
|
noscript
|
||||||
|
privacy-possum
|
||||||
|
privacy-redirect
|
||||||
|
ublock-origin
|
||||||
|
vimium
|
||||||
|
# todo: AdNauseam, wallabagger, DownThemAll! Wayback Machine
|
||||||
|
];
|
||||||
|
profiles = {
|
||||||
|
default = {
|
||||||
|
id = 0;
|
||||||
|
name = "default";
|
||||||
|
isDefault = true;
|
||||||
|
# settings = import ./arkenfox // {
|
||||||
|
settings = {
|
||||||
|
# change some values from arkenfox's defaults
|
||||||
|
"privacy.resistFingerprinting" = false; # if true, this would the window size to rounded dimensions, which is too annoying on a tiling window manager
|
||||||
|
"extensions.pocket.enabled" = false;
|
||||||
|
"identity.fxaccounts.enabled" = false;
|
||||||
|
"browser.search.suggest.enabled" = true;
|
||||||
|
"browser.urlbar.suggest.searches" = true;
|
||||||
|
"keyword.enable" = true;
|
||||||
|
|
||||||
|
# for Firefox-UI-Fix
|
||||||
|
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||||
|
"browser.proton.enabled" = true;
|
||||||
|
"svg.context-properties.content.enabled" = true;
|
||||||
|
"layout.css.backdrop-filter.enabled" = true;
|
||||||
|
"browser.compactmode.show" = true;
|
||||||
|
"browser.urlbar.suggest.calculator" = true;
|
||||||
|
|
||||||
|
"browser.uidensity" = 1;
|
||||||
|
|
||||||
|
# "browser.search.region" = "GB";
|
||||||
|
# "browser.search.isUS" = false;
|
||||||
|
# "distribution.searchplugins.defaultLocale" = "en-GB";
|
||||||
|
# "general.useragent.locale" = "en-GB";
|
||||||
|
# "browser.bookmarks.showMobileBookmarks" = true;
|
||||||
|
};
|
||||||
|
# userChrome = builtins.readFile ./lepton/userChrome.css;
|
||||||
|
# userContent = builtins.readFile ./lepton/userContent.css;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,239 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
calendars = "${config.home.homeDirectory}/Calendars";
|
||||||
|
contacts = "${config.home.homeDirectory}/Contacts";
|
||||||
|
addressbook = "${config.home.homeDirectory}/.abook/addressbook";
|
||||||
|
pass = "${pkgs.pass}/bin/pass";
|
||||||
|
tokens = "${config.home.homeDirectory}/.vdirsyncer/tokens/";
|
||||||
|
in {
|
||||||
|
home.file.".config/vdirsyncer/config".text = ''
|
||||||
|
[general]
|
||||||
|
status_path = "${config.home.homeDirectory}/.vdirsyncer/status/"
|
||||||
|
|
||||||
|
|
||||||
|
#############
|
||||||
|
# nextcloud #
|
||||||
|
#############
|
||||||
|
|
||||||
|
## calendar
|
||||||
|
|
||||||
|
[pair nextcloud_calendar]
|
||||||
|
a = "nextcloud_calendar_local"
|
||||||
|
b = "nextcloud_calendar_remote"
|
||||||
|
collections = ["personal", "contact_birthdays", "yoga", "events"]
|
||||||
|
metadata = ["color"]
|
||||||
|
|
||||||
|
[storage nextcloud_calendar_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${calendars}/nextcloud/"
|
||||||
|
fileext = ".ics"
|
||||||
|
|
||||||
|
[storage nextcloud_calendar_remote]
|
||||||
|
type = "caldav"
|
||||||
|
url = "https://nextcloud.monotremata.xyz/"
|
||||||
|
username = "rilla"
|
||||||
|
password.fetch = ["command", "${pass}", "narwhal/nextcloud.monotremata.xyz/rilla"]
|
||||||
|
|
||||||
|
## contacts
|
||||||
|
|
||||||
|
[pair nextcloud_contacts]
|
||||||
|
a = "nextcloud_contacts_local"
|
||||||
|
b = "nextcloud_contacts_remote"
|
||||||
|
collections = ["contacts"]
|
||||||
|
|
||||||
|
[storage nextcloud_contacts_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${contacts}/nextcloud/"
|
||||||
|
fileext = ".vcf"
|
||||||
|
|
||||||
|
[storage nextcloud_contacts_remote]
|
||||||
|
type = "carddav"
|
||||||
|
url = "https://nextcloud.monotremata.xyz/"
|
||||||
|
username = "rilla"
|
||||||
|
password.fetch = ["command", "${pass}", "narwhal/nextcloud.monotremata.xyz/rilla"]
|
||||||
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# google #
|
||||||
|
##########
|
||||||
|
|
||||||
|
## calendar
|
||||||
|
|
||||||
|
[pair google_calendar_sync]
|
||||||
|
a = "google_calendar_remote"
|
||||||
|
b = "google_calendar_local"
|
||||||
|
collections = [["gcal", "r.illa.pujagut@gmail.com", "r.illa.pujagut@gmail.com"]]
|
||||||
|
|
||||||
|
[storage google_calendar_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${calendars}/google/"
|
||||||
|
fileext = ".ics"
|
||||||
|
|
||||||
|
[storage google_calendar_remote]
|
||||||
|
type = "google_calendar"
|
||||||
|
token_file = "${tokens}/goole_calendar"
|
||||||
|
client_id.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_id"]
|
||||||
|
client_secret.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_secret"]
|
||||||
|
|
||||||
|
## contacts
|
||||||
|
|
||||||
|
[pair google_contacts]
|
||||||
|
a = "google_contacts_local"
|
||||||
|
b = "google_contacts_remote"
|
||||||
|
collections = [["gcontacts", "default", "default"]]
|
||||||
|
|
||||||
|
[storage google_contacts_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${contacts}/google/"
|
||||||
|
fileext = ".vcf"
|
||||||
|
|
||||||
|
[storage google_contacts_remote]
|
||||||
|
type = "google_contacts"
|
||||||
|
token_file = "${tokens}/google_contacts"
|
||||||
|
client_id.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_id"]
|
||||||
|
client_secret.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_secret"]
|
||||||
|
|
||||||
|
|
||||||
|
###########
|
||||||
|
# trakken #
|
||||||
|
###########
|
||||||
|
|
||||||
|
## calendar
|
||||||
|
|
||||||
|
[pair trakken_calendar_sync]
|
||||||
|
a = "trakken_calendar_remote"
|
||||||
|
b = "trakken_calendar_local"
|
||||||
|
collections = [["trakken_cal", "ricard@trkkn.com", "ricard@trkkn.com"]]
|
||||||
|
|
||||||
|
[storage trakken_calendar_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${calendars}/trakken/"
|
||||||
|
fileext = ".ics"
|
||||||
|
|
||||||
|
[storage trakken_calendar_remote]
|
||||||
|
type = "google_calendar"
|
||||||
|
token_file = "${tokens}/trakken_calendar"
|
||||||
|
client_id.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_id"]
|
||||||
|
client_secret.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_secret"]
|
||||||
|
|
||||||
|
## contacts
|
||||||
|
|
||||||
|
[pair trakken_contacts]
|
||||||
|
a = "trakken_contacts_local"
|
||||||
|
b = "trakken_contacts_remote"
|
||||||
|
collections = [["trakken_contacts", "default", "default"]]
|
||||||
|
|
||||||
|
[storage trakken_contacts_local]
|
||||||
|
type = "filesystem"
|
||||||
|
path = "${contacts}/trakken"
|
||||||
|
fileext = ".vcf"
|
||||||
|
|
||||||
|
[storage trakken_contacts_remote]
|
||||||
|
type = "google_contacts"
|
||||||
|
token_file = "${tokens}/trakken_contacts"
|
||||||
|
client_id.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_id"]
|
||||||
|
client_secret.fetch = ["command", "${pass}", "google.com/vdirsyncer/client_secret"]
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".config/khal/config".text = ''
|
||||||
|
[calendars]
|
||||||
|
|
||||||
|
[[default]]
|
||||||
|
path = ${calendars}/nextcloud/personal/
|
||||||
|
color = dark green
|
||||||
|
|
||||||
|
[[birthdays]]
|
||||||
|
path = ${calendars}/nextcloud/contact_birthdays/
|
||||||
|
color = dark green
|
||||||
|
|
||||||
|
[[google]]
|
||||||
|
path = ${calendars}/google/r.illa.pujagut@gmail.com/
|
||||||
|
color = dark blue
|
||||||
|
|
||||||
|
[[trakken]]
|
||||||
|
path = ${calendars}/trakken/ricard@trkkn.com/
|
||||||
|
color = dark red
|
||||||
|
|
||||||
|
[[yoga]]
|
||||||
|
path = ${calendars}/nextcloud/yoga/
|
||||||
|
color = dark magenta
|
||||||
|
|
||||||
|
[[events]]
|
||||||
|
path = ${calendars}/nextcloud/events
|
||||||
|
color = brown
|
||||||
|
|
||||||
|
# supported colors:
|
||||||
|
# black, white, brown, yellow, dark gray, dark green, dark blue,
|
||||||
|
# light gray, light green, light blue, dark magenta, dark cyan, dark red,
|
||||||
|
# light magenta, light cyan, light red.
|
||||||
|
|
||||||
|
[view]
|
||||||
|
dynamic_days = True
|
||||||
|
frame = color
|
||||||
|
theme = dark
|
||||||
|
|
||||||
|
[locale]
|
||||||
|
default_timezone = Europe/Madrid
|
||||||
|
local_timezone = Europe/Madrid
|
||||||
|
timeformat = %H:%M
|
||||||
|
dateformat= %m-%d
|
||||||
|
longdateformat= %Y-%m-%d
|
||||||
|
datetimeformat= %m-%d %H:%M
|
||||||
|
longdatetimeformat= %Y-%m-%d %H:%M
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".config/khard/khard.conf".text = ''
|
||||||
|
[addressbooks]
|
||||||
|
[[default]]
|
||||||
|
path = ${contacts}/nextcloud/contacts/
|
||||||
|
[[google]]
|
||||||
|
path = ${contacts}/google/default/
|
||||||
|
[[trakken]]
|
||||||
|
path = ${contacts}/trakken/default/
|
||||||
|
|
||||||
|
[general]
|
||||||
|
debug = no
|
||||||
|
default_action = list
|
||||||
|
# These are either strings or comma seperated lists
|
||||||
|
editor = vim, -i, NONE
|
||||||
|
merge_editor = vimdiff
|
||||||
|
|
||||||
|
[contact table]
|
||||||
|
# display names by first or last name: first_name / last_name / formatted_name
|
||||||
|
display = first_name
|
||||||
|
# group by address book: yes / no
|
||||||
|
group_by_addressbook = no
|
||||||
|
# reverse table ordering: yes / no
|
||||||
|
reverse = no
|
||||||
|
# append nicknames to name column: yes / no
|
||||||
|
show_nicknames = no
|
||||||
|
# show uid table column: yes / no
|
||||||
|
show_uids = yes
|
||||||
|
# sort by first or last name: first_name / last_name / formatted_name
|
||||||
|
sort = last_name
|
||||||
|
# localize dates: yes / no
|
||||||
|
localize_dates = yes
|
||||||
|
# set a comma separated list of preferred phone number types in descending priority
|
||||||
|
# or nothing for non-filtered alphabetical order
|
||||||
|
preferred_phone_number_type = pref, cell, home
|
||||||
|
# set a comma separated list of preferred email address types in descending priority
|
||||||
|
# or nothing for non-filtered alphabetical order
|
||||||
|
preferred_email_address_type = pref, work, home
|
||||||
|
|
||||||
|
[vcard]
|
||||||
|
# extend contacts with your own private objects
|
||||||
|
# these objects are stored with a leading "X-" before the object name in the vcard files
|
||||||
|
# every object label may only contain letters, digits and the - character
|
||||||
|
# example:
|
||||||
|
# private_objects = Jabber, Skype, Twitter
|
||||||
|
# default: , (the empty list)
|
||||||
|
private_objects = Jabber, Skype, Twitter
|
||||||
|
# preferred vcard version: 3.0 / 4.0
|
||||||
|
preferred_version = 3.0
|
||||||
|
# Look into source vcf files to speed up search queries: yes / no
|
||||||
|
search_in_source_files = no
|
||||||
|
# skip unparsable vcard files: yes / no
|
||||||
|
skip_unparsable = no
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{ config, pkgs, contacts, addressbook, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
shell = "${pkgs.dash}/bin/dash";
|
||||||
|
vdirsyncer = "${pkgs.vdirsyncer}/bin/vdirsyncer";
|
||||||
|
mkdir = "${pkgs.coreutils}/bin/mkdir";
|
||||||
|
cat = "${pkgs.coreutils}/bin/cat";
|
||||||
|
abook = "${pkgs.abook}/bin/abook";
|
||||||
|
dirname = "${pkgs.coreutils}/bin/dirname";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "davsync" ''
|
||||||
|
#!${shell}
|
||||||
|
${vdirsyncer} discover && \
|
||||||
|
${vdirsyncer} sync && \
|
||||||
|
${mkdir} -p "$(${dirname} ${addressbook})" && \
|
||||||
|
${cat} "${contacts}"/*/*/* | \
|
||||||
|
${abook} \
|
||||||
|
--convert \
|
||||||
|
--informat vcard \
|
||||||
|
--outformat abook > \
|
||||||
|
"${config.home.homeDirectory}/.abook/adressbook"
|
||||||
|
''
|
|
@ -0,0 +1,14 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
shell = "${pkgs.dash}/bin/dash";
|
||||||
|
vdirsyncer = "${pkgs.vdirsyncer}/bin/vdirsyncer";
|
||||||
|
mkdir = "${pkgs.coreutils}/bin/mkdir";
|
||||||
|
cat = "${pkgs.coreutils}/bin/cat";
|
||||||
|
dirname = "${pkgs.coreutils}/bin/dirname";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "davsync" ''
|
||||||
|
#!${shell}
|
||||||
|
${vdirsyncer} discover && \
|
||||||
|
${vdirsyncer} sync
|
||||||
|
''
|
|
@ -0,0 +1,11 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
contacts = "${config.home.homeDirectory}/Contacts";
|
||||||
|
davsync = pkgs.callPackage ./davsync.nix {
|
||||||
|
inherit config pkgs contacts addressbook;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ davsync pkgs.vdirsyncer pkgs.khal pkgs.khard pkgs.abook ];
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
davsync =
|
||||||
|
pkgs.callPackage ./davsync_macos.nix { inherit config pkgs; };
|
||||||
|
in {
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ davsync pkgs.vdirsyncer pkgs.khal pkgs.khard ];
|
||||||
|
}
|
|
@ -0,0 +1,212 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
impermanence = builtins.fetchTarball {
|
||||||
|
url = "https://github.com/nix-community/impermanence/archive/master.tar.gz";
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
# Let Home Manager install and manage itself.
|
||||||
|
# programs.home-manager.enable = true;
|
||||||
|
|
||||||
|
# Home Manager needs a bit of information about you and the
|
||||||
|
# paths it should manage.
|
||||||
|
home.username = "rilla";
|
||||||
|
home.homeDirectory = "/home/rilla";
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
"${impermanence}/home-manager.nix"
|
||||||
|
# ./desktop-sway
|
||||||
|
./alacritty
|
||||||
|
./arduino
|
||||||
|
./barrier
|
||||||
|
./browsers
|
||||||
|
./dav
|
||||||
|
./desktop-xmonad
|
||||||
|
./fonts
|
||||||
|
./git
|
||||||
|
./gotify
|
||||||
|
./gpg
|
||||||
|
./idasen
|
||||||
|
./mail
|
||||||
|
./minidisc
|
||||||
|
./mpd
|
||||||
|
./msg
|
||||||
|
./music
|
||||||
|
./neovim
|
||||||
|
./pass
|
||||||
|
./rss
|
||||||
|
./scripts
|
||||||
|
./snapcast
|
||||||
|
./sound
|
||||||
|
./ssh
|
||||||
|
./theming
|
||||||
|
./tmux
|
||||||
|
./vitetris
|
||||||
|
./wallets
|
||||||
|
./zsh
|
||||||
|
];
|
||||||
|
|
||||||
|
home.persistence."/persist/system/${config.home.homeDirectory}" = {
|
||||||
|
directories = [
|
||||||
|
".abook"
|
||||||
|
".bitmonero"
|
||||||
|
".cache"
|
||||||
|
".config/Nextcloud"
|
||||||
|
".config/chromium"
|
||||||
|
".config/whatsapp-for-linux"
|
||||||
|
".gnupg/private-keys-v1.d"
|
||||||
|
".local/share/keyrings"
|
||||||
|
".local/share/mpd"
|
||||||
|
".local/share/webkitgtk"
|
||||||
|
".mozilla"
|
||||||
|
".newsboat"
|
||||||
|
".vdirsyncer"
|
||||||
|
];
|
||||||
|
files = [
|
||||||
|
".gnupg/pubring.kbx"
|
||||||
|
".gnupg/trustdb.gpg"
|
||||||
|
".mailsynclastrun"
|
||||||
|
".ssh/known_hosts"
|
||||||
|
".zsh_history"
|
||||||
|
];
|
||||||
|
allowOther = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.persistence."/persist/user/${config.home.homeDirectory}" = {
|
||||||
|
directories = [
|
||||||
|
".config/Signal"
|
||||||
|
".config/Element"
|
||||||
|
".local/share/TelegramDesktop"
|
||||||
|
".local/share/dino"
|
||||||
|
".local/share/Bisq"
|
||||||
|
".password-store"
|
||||||
|
".walletwasabi"
|
||||||
|
"Calendars"
|
||||||
|
"Contacts"
|
||||||
|
"Documents"
|
||||||
|
"Downloads"
|
||||||
|
"Images"
|
||||||
|
"Maildir"
|
||||||
|
"Monero"
|
||||||
|
"Nextcloud"
|
||||||
|
"code"
|
||||||
|
"configs"
|
||||||
|
"misc"
|
||||||
|
"workspace"
|
||||||
|
];
|
||||||
|
files = [ ];
|
||||||
|
allowOther = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
EDITOR = "${pkgs.neovim}/bin/nvim";
|
||||||
|
VISUAL = "${pkgs.neovim}/bin/nvim";
|
||||||
|
BROWSER = "${pkgs.firefox}/bin/firefox";
|
||||||
|
# OPENER = "todo"; # todo
|
||||||
|
TERMINAL = "${pkgs.alacritty}/bin/alacritty";
|
||||||
|
CM_LAUNCHER = "rofi"; # for clipmenu
|
||||||
|
LEDGER_FILE = "${config.home.homeDirectory}/finance/2021.journal";
|
||||||
|
QT_QPA_PLATFORMTHEME = "qt5ct";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
R
|
||||||
|
acpi
|
||||||
|
android-tools
|
||||||
|
ansible
|
||||||
|
bind.dnsutils
|
||||||
|
calibre
|
||||||
|
docker-compose
|
||||||
|
file
|
||||||
|
gimp
|
||||||
|
gnumake
|
||||||
|
htop
|
||||||
|
jq
|
||||||
|
killall
|
||||||
|
lbry
|
||||||
|
libnotify
|
||||||
|
libreoffice
|
||||||
|
lxqt.pcmanfm-qt
|
||||||
|
mosh
|
||||||
|
mpv
|
||||||
|
neofetch
|
||||||
|
networkmanagerapplet
|
||||||
|
nextcloud-client
|
||||||
|
pandoc
|
||||||
|
pv
|
||||||
|
ripgrep
|
||||||
|
signify
|
||||||
|
sxiv
|
||||||
|
telnet
|
||||||
|
virt-manager
|
||||||
|
wget
|
||||||
|
];
|
||||||
|
|
||||||
|
services.syncthing.enable = true;
|
||||||
|
|
||||||
|
services.kdeconnect.enable = true;
|
||||||
|
|
||||||
|
programs.bat = {
|
||||||
|
enable = true;
|
||||||
|
config = { theme = "gruvbox-dark"; };
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fzf = {
|
||||||
|
enable = true;
|
||||||
|
enableZshIntegration = true;
|
||||||
|
# defaultOptions = [
|
||||||
|
# "--preview --preview 'bat --color=always --style=header,grid --line-range :300 {}'"
|
||||||
|
# ];
|
||||||
|
tmux.enableShellIntegration = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.gnome-keyring = {
|
||||||
|
enable = true;
|
||||||
|
components = [ "secrets" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nextcloud-client = {
|
||||||
|
enable = true;
|
||||||
|
startInBackground = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"x-scheme-handler/http" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/https" = " firefox.desktop";
|
||||||
|
"x-scheme-handler/chrome" = " firefox.desktop";
|
||||||
|
"text/html" = "firefox.desktop";
|
||||||
|
"application/x-extension-htm" = "firefox.desktop";
|
||||||
|
"application/x-extension-html" = "firefox.desktop";
|
||||||
|
"application/x-extension-shtml" = "firefox.desktop";
|
||||||
|
"application/xhtml+xml" = "firefox.desktop";
|
||||||
|
"application/x-extension-xhtml" = "firefox.desktop";
|
||||||
|
"application/x-extension-xht" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/tg" = "userapp-Telegram Desktop.desktop";
|
||||||
|
};
|
||||||
|
associations.added = {
|
||||||
|
"x-scheme-handler/http" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/https" = " firefox.desktop";
|
||||||
|
"x-scheme-handler/chrome" = " firefox.desktop";
|
||||||
|
"text/html" = "firefox.desktop";
|
||||||
|
"application/x-extension-htm" = "firefox.desktop";
|
||||||
|
"application/x-extension-html" = "firefox.desktop";
|
||||||
|
"application/x-extension-shtml" = "firefox.desktop";
|
||||||
|
"application/xhtml+xml" = "firefox.desktop";
|
||||||
|
"application/x-extension-xhtml" = "firefox.desktop";
|
||||||
|
"application/x-extension-xht" = "firefox.desktop";
|
||||||
|
"x-scheme-handler/tg" = "userapp-Telegram Desktop.desktop";
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dconf.settings = {
|
||||||
|
"org/virt-manager/virt-manager/connections" = {
|
||||||
|
"autoconnect" = [ "qemu:///system" ];
|
||||||
|
"uris" = [ "qemu:///system" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.stateVersion = "21.11";
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./sway.nix ./waybar.nix ./wofi.nix ];
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
swaylock
|
||||||
|
swayidle
|
||||||
|
wl-clipboard
|
||||||
|
wtype
|
||||||
|
brightnessctl
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.mako = {
|
||||||
|
enable = true;
|
||||||
|
actions = true;
|
||||||
|
anchor = "top-right";
|
||||||
|
backgroundColor = "#282828E6";
|
||||||
|
borderColor = "#458588";
|
||||||
|
borderRadius = 0;
|
||||||
|
borderSize = 1;
|
||||||
|
font = "Inter 10";
|
||||||
|
icons = true;
|
||||||
|
textColor = "#ebdbb2";
|
||||||
|
defaultTimeout = 5000;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".config/swaylock/config".text = ''
|
||||||
|
ignore-empty-password
|
||||||
|
font=Inter
|
||||||
|
|
||||||
|
color=282828E6
|
||||||
|
inside-color=504945
|
||||||
|
ring-color=504945
|
||||||
|
line-color=504945
|
||||||
|
separator-color=504945
|
||||||
|
|
||||||
|
inside-clear-color=FE8019
|
||||||
|
line-clear-color=FE8019
|
||||||
|
ring-clear-color=FE8019
|
||||||
|
|
||||||
|
inside-ver-color=458588
|
||||||
|
line-ver-color=458588
|
||||||
|
ring-ver-color=458588
|
||||||
|
|
||||||
|
inside-wrong-color=CC241D
|
||||||
|
line-wrong-color=CC241D
|
||||||
|
ring-wrong-color=CC241D
|
||||||
|
|
||||||
|
key-hl-color=B8BB26
|
||||||
|
bs-hl-color=FB4934
|
||||||
|
|
||||||
|
text-color=282828
|
||||||
|
text-clear-color=282828
|
||||||
|
text-ver-color=282828
|
||||||
|
text-wrong-color=282828
|
||||||
|
'';
|
||||||
|
|
||||||
|
programs.zsh.loginExtra = ''
|
||||||
|
[[ -z "''${DISPLAY}" ]] && [[ "$(tty)" = "/dev/tty1" ]] && \
|
||||||
|
exec ${pkgs.sway}/bin/sway 1> "${config.home.homeDirectory}/.sway-errors" 2>&1
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,146 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.wayland.windowManager.sway.config;
|
||||||
|
wofi_pass = pkgs.callPackage ./wofi-pass.nix { inherit config pkgs; };
|
||||||
|
pactl = "${pkgs.pulseaudio}/bin/pactl";
|
||||||
|
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
|
||||||
|
playerctl = "${pkgs.playerctl}/bin/playerctl";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
wayland.windowManager.sway = {
|
||||||
|
enable = true;
|
||||||
|
wrapperFeatures.gtk = true;
|
||||||
|
config = {
|
||||||
|
modifier = "Mod4";
|
||||||
|
terminal = "alacritty";
|
||||||
|
menu = "${pkgs.wofi}/bin/wofi --show run";
|
||||||
|
|
||||||
|
left = "h";
|
||||||
|
down = "j";
|
||||||
|
up = "k";
|
||||||
|
right = "l";
|
||||||
|
|
||||||
|
output = {
|
||||||
|
"LVDS-1" = {
|
||||||
|
resolution = "1366x768";
|
||||||
|
bg = "~/Images/wallpapers/times_of_grace.jpg fill";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
input = {
|
||||||
|
"type:keyboard" = {
|
||||||
|
xkb_layout = "us";
|
||||||
|
xkb_variant = "altgr-intl";
|
||||||
|
xkb_options = "caps:escape";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keybindings = {
|
||||||
|
"${cfg.modifier}+Return" = "exec ${cfg.terminal}";
|
||||||
|
"${cfg.modifier}+Shift+c" = "kill";
|
||||||
|
"${cfg.modifier}+r" = "exec ${cfg.menu}";
|
||||||
|
"${cfg.modifier}+Shift+r" = "reload";
|
||||||
|
"${cfg.modifier}+Shift+Escape" = "exec ${pkgs.sway}/bin/swaymsg exit";
|
||||||
|
"${cfg.modifier}+Escape" = "exec ${pkgs.swaylock}/bin/swaylock";
|
||||||
|
|
||||||
|
"${cfg.modifier}+${cfg.left}" = "focus left";
|
||||||
|
"${cfg.modifier}+${cfg.down}" = "focus down";
|
||||||
|
"${cfg.modifier}+${cfg.up}" = "focus up";
|
||||||
|
"${cfg.modifier}+${cfg.right}" = "focus right";
|
||||||
|
|
||||||
|
"${cfg.modifier}+Shift+${cfg.left}" = "move left";
|
||||||
|
"${cfg.modifier}+Shift+${cfg.down}" = "move down";
|
||||||
|
"${cfg.modifier}+Shift+${cfg.up}" = "move up";
|
||||||
|
"${cfg.modifier}+Shift+${cfg.right}" = "move right";
|
||||||
|
|
||||||
|
"${cfg.modifier}+Control+${cfg.left}" = "move workspace to output left";
|
||||||
|
"${cfg.modifier}+Control+${cfg.down}" = "move workspace to output down";
|
||||||
|
"${cfg.modifier}+Control+${cfg.up}" = "move workspace to output up";
|
||||||
|
"${cfg.modifier}+Control+${cfg.right}" = "move workspace to output right";
|
||||||
|
|
||||||
|
"${cfg.modifier}+Shift+w" = "move window to output left";
|
||||||
|
"${cfg.modifier}+Shift+e" = "move window to output right";
|
||||||
|
"${cfg.modifier}+w" = "focus output left";
|
||||||
|
"${cfg.modifier}+e" = "focus output right";
|
||||||
|
|
||||||
|
"${cfg.modifier}+1" = "workspace number 1";
|
||||||
|
"${cfg.modifier}+2" = "workspace number 2";
|
||||||
|
"${cfg.modifier}+3" = "workspace number 3";
|
||||||
|
"${cfg.modifier}+4" = "workspace number 4";
|
||||||
|
"${cfg.modifier}+5" = "workspace number 5";
|
||||||
|
"${cfg.modifier}+6" = "workspace number 6";
|
||||||
|
"${cfg.modifier}+7" = "workspace number 7";
|
||||||
|
"${cfg.modifier}+8" = "workspace number 8";
|
||||||
|
"${cfg.modifier}+9" = "workspace number 9";
|
||||||
|
|
||||||
|
"${cfg.modifier}+Shift+1" = "move container to workspace number 1";
|
||||||
|
"${cfg.modifier}+Shift+2" = "move container to workspace number 2";
|
||||||
|
"${cfg.modifier}+Shift+3" = "move container to workspace number 3";
|
||||||
|
"${cfg.modifier}+Shift+4" = "move container to workspace number 4";
|
||||||
|
"${cfg.modifier}+Shift+5" = "move container to workspace number 5";
|
||||||
|
"${cfg.modifier}+Shift+6" = "move container to workspace number 6";
|
||||||
|
"${cfg.modifier}+Shift+7" = "move container to workspace number 7";
|
||||||
|
"${cfg.modifier}+Shift+8" = "move container to workspace number 8";
|
||||||
|
"${cfg.modifier}+Shift+9" = "move container to workspace number 9";
|
||||||
|
|
||||||
|
"${cfg.modifier}+b" = "splith";
|
||||||
|
"${cfg.modifier}+v" = "splitv";
|
||||||
|
|
||||||
|
"${cfg.modifier}+s" = "layout stacking";
|
||||||
|
"${cfg.modifier}+t" = "layout tabbed";
|
||||||
|
# "${cfg.modifier}+e" = "layout toggle split";
|
||||||
|
|
||||||
|
"${cfg.modifier}+m" = "fullscreen toggle";
|
||||||
|
|
||||||
|
"${cfg.modifier}+a" = "focus parent";
|
||||||
|
"${cfg.modifier}+f" = "floating toggle";
|
||||||
|
# "${cfg.modifier}+space" = "focus mode_toggle";
|
||||||
|
"${cfg.modifier}+d" = "mode resize";
|
||||||
|
|
||||||
|
"${cfg.modifier}+space" = "layout toggle all";
|
||||||
|
"${cfg.modifier}+Shift+space" = "layout default";
|
||||||
|
|
||||||
|
"${cfg.modifier}+p" = "exec ${wofi_pass}/bin/wofi-pass";
|
||||||
|
|
||||||
|
"XF86AudioRaiseVolume" = "exec ${pactl} set-sink-volume @DEFAULT_SINK@ +5%";
|
||||||
|
"XF86AudioLowerVolume" = "exec ${pactl} set-sink-volume @DEFAULT_SINK@ -5%";
|
||||||
|
"XF86AudioMute" = "exec ${pactl} set-sink-mute @DEFAULT_SINK@ toggle";
|
||||||
|
"XF86AudioMicMute" = "exec ${pactl} set-source-mute @DEFAULT_SOURCE@ toggle";
|
||||||
|
"XF86MonBrightnessDown" = "exec ${brightnessctl} set 5%-";
|
||||||
|
"XF86MonBrightnessUp" = "exec ${brightnessctl} set +5%";
|
||||||
|
"XF86AudioPlay" = "exec ${playerctl} play-pause";
|
||||||
|
"XF86AudioNext" = "exec ${playerctl} next";
|
||||||
|
"XF86AudioPrev" = "exec ${playerctl} previous";
|
||||||
|
"XF86Search" = "exec ${cfg.menu}";
|
||||||
|
};
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
|
||||||
|
focused = rec {
|
||||||
|
childBorder = "#458588";
|
||||||
|
background = "#282828";
|
||||||
|
text = "#fbf1c7";
|
||||||
|
indicator = "#3c3836";
|
||||||
|
border = "#83a598";
|
||||||
|
};
|
||||||
|
|
||||||
|
unfocused = rec {
|
||||||
|
childBorder = "#504945";
|
||||||
|
background = "#282828";
|
||||||
|
text = "#ebdbb2";
|
||||||
|
indicator = "#3c3836";
|
||||||
|
border = "#bdae93";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
focus.followMouse = true;
|
||||||
|
window.border = 3;
|
||||||
|
workspaceAutoBackAndForth = true;
|
||||||
|
|
||||||
|
bars = [];
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,150 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.waybar = {
|
||||||
|
enable = true;
|
||||||
|
settings = [
|
||||||
|
{
|
||||||
|
modules-left = [ "sway/workspaces" ];
|
||||||
|
modules-center = [ "sway/window" ];
|
||||||
|
modules-right = [ "tray" "pulseaudio" "battery" "network" "clock" ];
|
||||||
|
modules = {
|
||||||
|
clock.format = "{: %m/%d <span color=\"#a89984\">|</span> %H:%M}";
|
||||||
|
network = {
|
||||||
|
format-icons = [
|
||||||
|
"<span color=\"#fb4944\">直</span>"
|
||||||
|
"<span color=\"#fabd2f\">直</span>"
|
||||||
|
"<span color=\"#b8bb26\">直</span>"
|
||||||
|
];
|
||||||
|
format = "({ifname})";
|
||||||
|
format-wifi = "{icon} {signalStrength}";
|
||||||
|
format-disconnected = "<span color=\"#a89974\">睊</span>";
|
||||||
|
format-ethernet = "";
|
||||||
|
};
|
||||||
|
battery = {
|
||||||
|
states = {
|
||||||
|
good = 95;
|
||||||
|
warning = 50;
|
||||||
|
critical = 20;
|
||||||
|
};
|
||||||
|
format-icons = {
|
||||||
|
discharging = [
|
||||||
|
"<span color=\"#fb4944\"></span>"
|
||||||
|
"<span color=\"#fb4944\"></span>"
|
||||||
|
"<span color=\"#fb4944\"></span>"
|
||||||
|
"<span color=\"#fabd2f\"></span>"
|
||||||
|
"<span color=\"#fabd2f\"></span>"
|
||||||
|
"<span color=\"#fabd2f\"></span>"
|
||||||
|
"<span color=\"#b8bb26\"></span>"
|
||||||
|
"<span color=\"#b8bb26\"></span>"
|
||||||
|
"<span color=\"#b8bb26\"></span>"
|
||||||
|
]; #
|
||||||
|
charging = [
|
||||||
|
"<span color=\"#fb4944\"></span>"
|
||||||
|
"<span color=\"#fb4944\"></span>"
|
||||||
|
"<span color=\"#fabd2f\"></span>"
|
||||||
|
"<span color=\"#fabd2f\"></span>"
|
||||||
|
"<span color=\"#b8bb26\"></span>"
|
||||||
|
"<span color=\"#b8bb26\"></span>"
|
||||||
|
]; #
|
||||||
|
};
|
||||||
|
format = " {capacity}";
|
||||||
|
format-full = "";
|
||||||
|
format-good-charging = "";
|
||||||
|
format-plugged = "";
|
||||||
|
format-charging = "{icon} {capacity}";
|
||||||
|
format-discharging = "{icon} {capacity} ({time})";
|
||||||
|
interval = 5;
|
||||||
|
};
|
||||||
|
pulseaudio = {
|
||||||
|
states = {
|
||||||
|
high = 101;
|
||||||
|
very_high = 111;
|
||||||
|
};
|
||||||
|
format-icons = [
|
||||||
|
"<span color=\"#a89974\">奄</span>"
|
||||||
|
"<span color=\"#83a587\">奔</span>"
|
||||||
|
"<span color=\"#b8bb26\">墳</span>"
|
||||||
|
];
|
||||||
|
format = "{icon} {volume}";
|
||||||
|
format-bluetooth = "{icon} {volume}";
|
||||||
|
format-muted = "ﱝ";
|
||||||
|
};
|
||||||
|
|
||||||
|
tray.icon-size = 10;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
style = ''
|
||||||
|
* {
|
||||||
|
border-radius: 0px;
|
||||||
|
border: none;
|
||||||
|
font-family: Inter, "mplus Nerd Font";
|
||||||
|
font-size: 13px;
|
||||||
|
min-height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
background-color: #282828;
|
||||||
|
color: #ebdbb2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#window {
|
||||||
|
color: #fbf1c7;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused {
|
||||||
|
background-color: #458588;
|
||||||
|
color: #fbf1c7;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray,
|
||||||
|
#pulseaudio,
|
||||||
|
#battery,
|
||||||
|
#network,
|
||||||
|
#cpu,
|
||||||
|
#memory,
|
||||||
|
#clock {
|
||||||
|
color: #fbf1c7;
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray,
|
||||||
|
#pulseaudio,
|
||||||
|
#battery,
|
||||||
|
#cpu,
|
||||||
|
#memory,
|
||||||
|
#network {
|
||||||
|
border-right: 1px solid #a89984;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.high {
|
||||||
|
color: #fabd2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.very_high {
|
||||||
|
color: #fb4944;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.muted {
|
||||||
|
color: #a8997a;
|
||||||
|
}
|
||||||
|
|
||||||
|
'';
|
||||||
|
systemd.enable = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
bash = "${pkgs.bash}/bin/bash";
|
||||||
|
wofi = "${pkgs.wofi}/bin/wofi";
|
||||||
|
pass = "${pkgs.pass}/bin/pass";
|
||||||
|
wtype = "${pkgs.wtype}/bin/wtype";
|
||||||
|
xargs = "${pkgs.findutils}/bin/xargs";
|
||||||
|
wl-copy = "${pkgs.wl-clipboard}/bin/wl-copy";
|
||||||
|
prefix = "${config.home.homeDirectory}/.password-store";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "wofi-pass" ''
|
||||||
|
#!${bash}
|
||||||
|
|
||||||
|
password_files=( "${prefix}"/**/*.gpg )
|
||||||
|
password_files=( "''${password_files[@]#"${prefix}"/}" )
|
||||||
|
password_files=( "''${password_files[@]%.gpg}" )
|
||||||
|
|
||||||
|
sel=$(
|
||||||
|
printf '%s\n' "''${password_files[@]}" | \
|
||||||
|
${wofi} --dmenu "$@"
|
||||||
|
)
|
||||||
|
|
||||||
|
#[ -n "''${sel}" ] && \
|
||||||
|
# ${pass} show "''${sel}" | \
|
||||||
|
# ${xargs} ${wtype}
|
||||||
|
|
||||||
|
[ -n "''${sel}" ] && \
|
||||||
|
${pass} show "''${sel}" | ${wl-copy}
|
||||||
|
''
|
|
@ -0,0 +1,57 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
wofi_pass = pkgs.callPackage ./wofi-pass.nix { inherit config pkgs; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
home.packages = [ pkgs.wofi wofi_pass ];
|
||||||
|
|
||||||
|
home.file.".config/wofi/style.css".text = ''
|
||||||
|
* {
|
||||||
|
font-family: Inter;
|
||||||
|
}
|
||||||
|
|
||||||
|
#outer-box {
|
||||||
|
border: 2px solid #458588;
|
||||||
|
padding: 5px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: rgba(40, 40, 40, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry {
|
||||||
|
border-radius: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#input {
|
||||||
|
border-radius: 0px;
|
||||||
|
background-color: #282828;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 1px solid #928374;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry:selected {
|
||||||
|
background-color: rgba(69, 133, 136, 0.9);
|
||||||
|
}
|
||||||
|
|
||||||
|
#text {
|
||||||
|
color: #ebdbb2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#text:selected {
|
||||||
|
background-color: transparent;
|
||||||
|
color: #fbf1c7;
|
||||||
|
}
|
||||||
|
|
||||||
|
#scroll {
|
||||||
|
margin: 0px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
lvds_fingerprint = {
|
||||||
|
"LVDS-1" = "00ffffffffffff0030e4d8020000000000160103801c1078ea8855995b558f261d505400000001010101010101010101010101010101601d56d85000183030404700159c1000001b000000000000000000000000000000000000000000fe004c4720446973706c61790a2020000000fe004c503132355748322d534c42330059";
|
||||||
|
};
|
||||||
|
hdmi_fingerprint = {
|
||||||
|
"HDMI-2" = "00ffffffffffff0009d1e67845540000261d0103803c22782e4825a756529c270f5054a56b80d1c0b300a9c08180810081c001010101023a801871382d40582c450056502100001e000000ff004c394b30303333313031510a20000000fd00324c1e5311000a202020202020000000fc0042656e51204757323738300a200117020322f14f901f04130312021101140607151605230907078301000065030c001000023a801871382d40582c450056502100001f011d8018711c1620582c250056502100009f011d007251d01e206e28550056502100001e8c0ad08a20e02d10103e960056502100001800000000000000000000000000000000000000000047";
|
||||||
|
};
|
||||||
|
lvds_config = {
|
||||||
|
"LVDS-1" = {
|
||||||
|
enable = true;
|
||||||
|
crtc = 0;
|
||||||
|
mode = "1366x768";
|
||||||
|
position = "1920x0";
|
||||||
|
rate = "60.00";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
hdmi_config = {
|
||||||
|
"HDMI-2" = {
|
||||||
|
enable = true;
|
||||||
|
primary = true;
|
||||||
|
crtc = 0;
|
||||||
|
mode = "1920x1080";
|
||||||
|
position = "0x0";
|
||||||
|
rate = "60.00";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.autorandr = {
|
||||||
|
enable = true;
|
||||||
|
hooks.postswitch = {
|
||||||
|
"change-background" = "/run/current-system/sw/bin/systemctl --user restart random-background.service";
|
||||||
|
"restart-xmonad" = "${pkgs.xmonad-with-packages}/bin/xmonad --restart";
|
||||||
|
};
|
||||||
|
profiles = {
|
||||||
|
"default" = {
|
||||||
|
fingerprint = lvds_fingerprint;
|
||||||
|
config = lvds_config;
|
||||||
|
};
|
||||||
|
"docked-open" = {
|
||||||
|
fingerprint = pkgs.lib.mkMerge [ hdmi_fingerprint lvds_fingerprint ];
|
||||||
|
config = pkgs.lib.mkMerge [ hdmi_config lvds_config ];
|
||||||
|
};
|
||||||
|
"docked-closed" = {
|
||||||
|
fingerprint = hdmi_fingerprint;
|
||||||
|
config = hdmi_config;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,388 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
gruvbox-dark = {
|
||||||
|
bg = "#282828";
|
||||||
|
bg1 = "#3c3836";
|
||||||
|
bg2 = "#504945";
|
||||||
|
|
||||||
|
fg = "#ebdbb2";
|
||||||
|
fg0 = "#fbf1c7";
|
||||||
|
fg3 = "#bdae93";
|
||||||
|
|
||||||
|
red = "#cc241d";
|
||||||
|
green = "#98971a";
|
||||||
|
yellow = "#d79921";
|
||||||
|
blue = "#458588";
|
||||||
|
purple = "#b16286";
|
||||||
|
aqua = "#689d6a";
|
||||||
|
gray = "#a89984";
|
||||||
|
|
||||||
|
gray2 = "#928374";
|
||||||
|
red-light = "#fb4934";
|
||||||
|
green-light = "#b8bb26";
|
||||||
|
yellow-light = "#fabd2f";
|
||||||
|
blue-light = "#83a598";
|
||||||
|
purple-light = "#d3869b";
|
||||||
|
aqua-light = "#8ec07c";
|
||||||
|
|
||||||
|
};
|
||||||
|
colors = {
|
||||||
|
fg = gruvbox-dark.fg;
|
||||||
|
selFg = gruvbox-dark.fg0;
|
||||||
|
bg = gruvbox-dark.bg;
|
||||||
|
sel = gruvbox-dark.blue;
|
||||||
|
inactive = gruvbox-dark.gray;
|
||||||
|
inactiveBorder = gruvbox-dark.bg2;
|
||||||
|
urgent = gruvbox-dark.red;
|
||||||
|
};
|
||||||
|
rofiTransparency = "96";
|
||||||
|
font = {
|
||||||
|
name = "Inter";
|
||||||
|
size = "10";
|
||||||
|
};
|
||||||
|
monoFont = {
|
||||||
|
name = "Hack";
|
||||||
|
size = "9";
|
||||||
|
};
|
||||||
|
hmonitors = pkgs.haskellPackages.callPackage ./hmonitors.nix {};
|
||||||
|
obtoxmd = pkgs.callPackage ./obtoxmd.nix { inherit config pkgs; };
|
||||||
|
|
||||||
|
hmonitorsQuery = "${hmonitors}/bin/hmonitors-query";
|
||||||
|
acpi = "${pkgs.acpi}/bin/acpi";
|
||||||
|
nmcli = "${pkgs.networkmanager}/bin/nmcli";
|
||||||
|
pamixer = "${pkgs.pamixer}/bin/pamixer";
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ ./autorandr.nix ./misc.nix ];
|
||||||
|
home = {
|
||||||
|
keyboard = {
|
||||||
|
layout = "us";
|
||||||
|
options = ["caps:escape"];
|
||||||
|
variant = "altgr-intl";
|
||||||
|
};
|
||||||
|
packages = [hmonitors obtoxmd pkgs.acpi pkgs.pamixer pkgs.openbox];
|
||||||
|
file = {
|
||||||
|
".xinitrc".text = "exec ${config.home.homeDirectory}/.xsession";
|
||||||
|
".xmonad/icons/3cols.xpm".source = ./icons/3cols.xpm;
|
||||||
|
".xmonad/icons/float.xpm".source = ./icons/float.xpm;
|
||||||
|
".xmonad/icons/full.xpm".source = ./icons/full.xpm;
|
||||||
|
".xmonad/icons/grid.xpm".source = ./icons/grid.xpm;
|
||||||
|
".xmonad/icons/mtall.xpm".source = ./icons/mtall.xpm;
|
||||||
|
".xmonad/icons/tabs.xpm".source = ./icons/tabs.xpm;
|
||||||
|
".xmonad/icons/tall.xpm".source = ./icons/tall.xpm;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xsession = {
|
||||||
|
enable = true;
|
||||||
|
initExtra = ''
|
||||||
|
xset s off -dpms
|
||||||
|
${pkgs.autorandr}/bin/autorandr --change --default default
|
||||||
|
export WINIT_X11_SCALE_FACTOR=1.33
|
||||||
|
'';
|
||||||
|
windowManager.xmonad = {
|
||||||
|
enable = true;
|
||||||
|
enableContribAndExtras = true;
|
||||||
|
extraPackages = haskellPackages : [
|
||||||
|
haskellPackages.monad-logger
|
||||||
|
haskellPackages.dbus
|
||||||
|
];
|
||||||
|
config = ./xmonad/xmonad.hs;
|
||||||
|
libFiles = {
|
||||||
|
"Bindings.hs" = ./xmonad/lib/Bindings.hs;
|
||||||
|
"DefaultConfig.hs" = ./xmonad/lib/DefaultConfig.hs;
|
||||||
|
"Layouts.hs" = ./xmonad/lib/Layouts.hs;
|
||||||
|
"ManageHook.hs" = ./xmonad/lib/ManageHook.hs;
|
||||||
|
"Prompts.hs" = ./xmonad/lib/Prompts.hs;
|
||||||
|
"Utils.hs" = ./xmonad/lib/Utils.hs;
|
||||||
|
"Xmobar.hs" = ./xmonad/lib/Xmobar.hs;
|
||||||
|
"HostConfig.hs" = pkgs.writeText "HostConfig.hs" ''
|
||||||
|
module HostConfig
|
||||||
|
( fontConfig
|
||||||
|
, colorConfig
|
||||||
|
, FontConfig (FontConfig)
|
||||||
|
, fontSize
|
||||||
|
, fontName
|
||||||
|
, ColorConfig (ColorConfig)
|
||||||
|
, fgColor
|
||||||
|
, selFgColor
|
||||||
|
, bgColor
|
||||||
|
, selColor
|
||||||
|
, inactiveColor
|
||||||
|
, inactiveBorderColor
|
||||||
|
, urgentColor
|
||||||
|
) where
|
||||||
|
|
||||||
|
fontConfig :: FontConfig
|
||||||
|
fontConfig = FontConfig
|
||||||
|
{ fontSize = ${font.size}
|
||||||
|
, fontName = "${font.name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
colorConfig :: ColorConfig
|
||||||
|
colorConfig = ColorConfig
|
||||||
|
{ fgColor = "${colors.fg}"
|
||||||
|
, selFgColor = "${colors.selFg}"
|
||||||
|
, bgColor = "${colors.bg}"
|
||||||
|
, selColor = "${colors.sel}"
|
||||||
|
, inactiveColor = "${colors.inactive}"
|
||||||
|
, inactiveBorderColor = "${colors.inactiveBorder}"
|
||||||
|
, urgentColor = "${colors.urgent}"
|
||||||
|
}
|
||||||
|
|
||||||
|
data FontConfig = FontConfig
|
||||||
|
{ fontSize :: Int
|
||||||
|
, fontName :: String
|
||||||
|
} deriving Show
|
||||||
|
|
||||||
|
data ColorConfig = ColorConfig
|
||||||
|
{ fgColor :: String
|
||||||
|
, selFgColor :: String
|
||||||
|
, bgColor :: String
|
||||||
|
, selColor :: String
|
||||||
|
, inactiveColor :: String
|
||||||
|
, inactiveBorderColor :: String
|
||||||
|
, urgentColor :: String
|
||||||
|
} deriving Show
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.xmobar = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
Config
|
||||||
|
{ font = "xft:${font.name}:style=Regular:size=${font.size}"
|
||||||
|
, additionalFonts = ["xft:mplus Nerd Font:size=12"]
|
||||||
|
, bgColor = "${colors.bg}"
|
||||||
|
, fgColor = "${colors.fg}"
|
||||||
|
, alignSep = "}{"
|
||||||
|
, sepChar = "%"
|
||||||
|
, template = "%StdinReader% }{ %vol%%bat%%net%%date%"
|
||||||
|
, lowerOnStart = True
|
||||||
|
, hideOnStart = False
|
||||||
|
, persistent = True
|
||||||
|
, allDesktops = True
|
||||||
|
, position = TopW L 100
|
||||||
|
, commands =
|
||||||
|
[ Run Com "${hmonitorsQuery}" ["date" ] "date" 10
|
||||||
|
, Run Com "${hmonitorsQuery}" ["bat", "${acpi}" ] "bat" 10
|
||||||
|
, Run Com "${hmonitorsQuery}" ["net", "${nmcli}" ] "net" 20
|
||||||
|
, Run Com "${hmonitorsQuery}" ["vol", "${pamixer}"] "vol" 5
|
||||||
|
, Run StdinReader
|
||||||
|
]
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
font = "${font.name} ${font.size}";
|
||||||
|
extraConfig = {
|
||||||
|
display-run = " ";
|
||||||
|
# display-drun = " ";
|
||||||
|
display-window = " ";
|
||||||
|
drun-display-format = "{name}";
|
||||||
|
modi = "window,run,drun,ssh";
|
||||||
|
show-icons = false;
|
||||||
|
};
|
||||||
|
theme = let
|
||||||
|
inherit (config.lib.formats.rasi) mkLiteral;
|
||||||
|
in {
|
||||||
|
"*" = {
|
||||||
|
background-color = mkLiteral "transparent";
|
||||||
|
border = 0;
|
||||||
|
margin = 0;
|
||||||
|
padding = 0;
|
||||||
|
spacing = 0;
|
||||||
|
};
|
||||||
|
element = {
|
||||||
|
padding = 2;
|
||||||
|
orientation = "vertical";
|
||||||
|
};
|
||||||
|
"element-text" = {
|
||||||
|
text-color = mkLiteral colors.fg;
|
||||||
|
};
|
||||||
|
|
||||||
|
"element selected" = {
|
||||||
|
text-color = mkLiteral colors.selFg;
|
||||||
|
background-color = mkLiteral "${colors.sel}A0";
|
||||||
|
};
|
||||||
|
entry = {
|
||||||
|
padding = mkLiteral "0 0 6 3";
|
||||||
|
text-color = mkLiteral colors.fg;
|
||||||
|
};
|
||||||
|
inputbar = {
|
||||||
|
children = map mkLiteral ["prompt" "entry"];
|
||||||
|
border = mkLiteral "0 0 1 0";
|
||||||
|
border-color = mkLiteral gruvbox-dark.gray2;
|
||||||
|
margin = mkLiteral "0 0 5 0";
|
||||||
|
};
|
||||||
|
listview = {
|
||||||
|
columns = 1;
|
||||||
|
fixed-height = false;
|
||||||
|
};
|
||||||
|
mainbox = {
|
||||||
|
children = map mkLiteral ["inputbar" "listview"];
|
||||||
|
margin = 6;
|
||||||
|
};
|
||||||
|
prompt = {
|
||||||
|
padding = mkLiteral "0 0 0 6";
|
||||||
|
text-color = mkLiteral colors.fg;
|
||||||
|
background-color = mkLiteral "transparent";
|
||||||
|
};
|
||||||
|
window = {
|
||||||
|
transparency = "real";
|
||||||
|
background-color = mkLiteral "${colors.bg}D0";
|
||||||
|
y-offset = mkLiteral "-25%";
|
||||||
|
border = 2;
|
||||||
|
border-color = mkLiteral colors.sel;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
terminal = "${pkgs.alacritty}/bin/alacritty";
|
||||||
|
pass = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
URL_field='url'
|
||||||
|
USERNAME_field='user'
|
||||||
|
AUTOTYPE_field='autotype'
|
||||||
|
delay=2
|
||||||
|
wait=0.2
|
||||||
|
xdotool_delay=12
|
||||||
|
EDITOR='gvim -f'
|
||||||
|
BROWSER='xdg-open'
|
||||||
|
default_do='typePass' # menu, autotype, copyPass, typeUser, typePass, copyUser, copyUrl, viewEntry, typeMenu, actionMenu, copyMenu, openUrl
|
||||||
|
auto_enter='false'
|
||||||
|
notify='false'
|
||||||
|
default_autotype='user :tab pass'
|
||||||
|
help_color="${gruvbox-dark.blue-light}"
|
||||||
|
clip=primary
|
||||||
|
clip_clear=45
|
||||||
|
edit_new_pass="true"
|
||||||
|
default_user=":filename"
|
||||||
|
autotype="Alt+1"
|
||||||
|
type_user="Alt+u"
|
||||||
|
type_pass="Alt+p"
|
||||||
|
copy_name=""
|
||||||
|
copy_pass=""
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.dunst = {
|
||||||
|
enable = true;
|
||||||
|
iconTheme = {
|
||||||
|
name = "Papirus-Dark";
|
||||||
|
package = pkgs.papirus-icon-theme;
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
global = {
|
||||||
|
font = "${font.name} ${font.size}";
|
||||||
|
format = ''<b>%s</b>\n%b'';
|
||||||
|
sort = "yes";
|
||||||
|
indicate_hidden = "yes";
|
||||||
|
alignment = "left";
|
||||||
|
bounce_freq = 0;
|
||||||
|
show_age_threshold = 60;
|
||||||
|
word_wrap = "yes";
|
||||||
|
ignore_newline = "no";
|
||||||
|
geometry = "300x5-30+20";
|
||||||
|
shrink = "yes";
|
||||||
|
transparency = 0;
|
||||||
|
idle_threshold = 10;
|
||||||
|
monitor = 0;
|
||||||
|
follow = "mouse";
|
||||||
|
sticky_history = "yes";
|
||||||
|
history_length = 20;
|
||||||
|
show_indicators = "yes";
|
||||||
|
line_height = 0;
|
||||||
|
separator_height = 2;
|
||||||
|
padding = 8;
|
||||||
|
horizontal_padding = 8;
|
||||||
|
separator_color = "frame";
|
||||||
|
startup_notification = false;
|
||||||
|
dmenu = "${pkgs.rofi}/bin/rofi -dmenu -p dunst:";
|
||||||
|
browser = "${pkgs.firefox}/bin/firefox";
|
||||||
|
icon_position = "left";
|
||||||
|
frame_width = 0;
|
||||||
|
frame_color = colors.inactive;
|
||||||
|
};
|
||||||
|
shortcuts = {
|
||||||
|
close = "ctrl+space";
|
||||||
|
close_all = "ctrl+shift+space";
|
||||||
|
context = "ctrl+shift+period";
|
||||||
|
};
|
||||||
|
urgency_low = {
|
||||||
|
background = "${colors.bg}${rofiTransparency}";
|
||||||
|
foreground = colors.fg;
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
urgency_normal = {
|
||||||
|
background = "${colors.sel}${rofiTransparency}";
|
||||||
|
foreground = colors.selFg;
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
urgency_critical = {
|
||||||
|
background = "${colors.urgent}${rofiTransparency}";
|
||||||
|
foreground = colors.selFg;
|
||||||
|
timeout = 10;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.stalonetray = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
icon_size = 20;
|
||||||
|
background = colors.bg;
|
||||||
|
sticky = true;
|
||||||
|
geometry = "3x1-350+0";
|
||||||
|
icon_gravity = "E";
|
||||||
|
grow_gravity = "E";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xresources.properties = {
|
||||||
|
"Sxiv.foreground" = colors.fg;
|
||||||
|
"Sxiv.background" = colors.bg;
|
||||||
|
"Sxiv.font" = "${monoFont.name}:size=${monoFont.size}";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.zathura = {
|
||||||
|
enable = true;
|
||||||
|
options = {
|
||||||
|
font = "${monoFont.name} ${monoFont.size}";
|
||||||
|
default-bg = colors.bg;
|
||||||
|
default-fg = gruvbox-dark.bg1;
|
||||||
|
statusbar-fg = gruvbox-dark.fg3;
|
||||||
|
statusbar-bg = gruvbox-dark.bg2;
|
||||||
|
inputbar-bg = colors.bg;
|
||||||
|
inputbar-fg = colors.sel;
|
||||||
|
notification-bg = colors.bg;
|
||||||
|
notification-fg = colors.sel;
|
||||||
|
notification-error-bg = colors.bg;
|
||||||
|
notification-error-fg = gruvbox-dark.red-light;
|
||||||
|
notification-warning-bg = colors.bg;
|
||||||
|
notification-warning-fg = gruvbox-dark.red-light;
|
||||||
|
highlight-color = gruvbox-dark.yellow-light;
|
||||||
|
highlight-active-color = gruvbox-dark.blue-light;
|
||||||
|
completion-bg = gruvbox-dark.bg1;
|
||||||
|
completion-fg = gruvbox-dark.blue-light;
|
||||||
|
completion-highlight-fg = colors.selFg;
|
||||||
|
completion-highlight-bg = gruvbox-dark.blue-light;
|
||||||
|
recolor-lightcolor = colors.bg;
|
||||||
|
recolor-darkcolor = colors.fg;
|
||||||
|
recolor = false;
|
||||||
|
recolor-keephue = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.zsh.loginExtra = ''
|
||||||
|
[[ -z "''${DISPLAY}" ]] && [[ "$(tty)" = "/dev/tty1" ]] && \
|
||||||
|
exec "${pkgs.xorg.xinit}/bin/startx" 1> "${config.home.homeDirectory}/.xsession-errors" 2>&1
|
||||||
|
'';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
{ mkDerivation, base, containers, lib, process, regex-compat, split
|
||||||
|
, time
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "hmonitors";
|
||||||
|
version = "0.1.0.0";
|
||||||
|
src = builtins.fetchGit {
|
||||||
|
name = "hmonitors";
|
||||||
|
url = "https://git.monotremata.xyz/rilla/hmonitors.git";
|
||||||
|
ref = "master";
|
||||||
|
# rev = "165195cd964969c744120997850954c9371690a4";
|
||||||
|
rev = "24a52ffb02b068135d736006fecccfe955099da7";
|
||||||
|
};
|
||||||
|
isLibrary = true;
|
||||||
|
isExecutable = true;
|
||||||
|
libraryHaskellDepends = [
|
||||||
|
base containers process regex-compat split time
|
||||||
|
];
|
||||||
|
executableHaskellDepends = [ base ];
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *_cols[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. "
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *float[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
".. ",
|
||||||
|
"......... ",
|
||||||
|
"......... ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .........",
|
||||||
|
" ........."
|
||||||
|
};
|
|
@ -0,0 +1,23 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *full[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 1 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
/* pixels */
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *grid[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
"................",
|
||||||
|
"................",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. "
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *mtall[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
"................",
|
||||||
|
"................",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. ",
|
||||||
|
" .. .. "
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *tabs[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
" ",
|
||||||
|
" .............. ",
|
||||||
|
" ",
|
||||||
|
"................",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* XPM */
|
||||||
|
static char *tall[] = {
|
||||||
|
/* columns rows colors chars-per-pixel */
|
||||||
|
"16 16 2 1 ",
|
||||||
|
" c #EBDBB2",
|
||||||
|
". c None",
|
||||||
|
/* pixels */
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .........",
|
||||||
|
" .........",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .........",
|
||||||
|
" .........",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. ",
|
||||||
|
" .. "
|
||||||
|
};
|
|
@ -0,0 +1,36 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
wallpapers = "${config.home.homeDirectory}/Images/wallpapers/enabled";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.picom = {
|
||||||
|
enable = true;
|
||||||
|
blur = true;
|
||||||
|
fade = false;
|
||||||
|
shadow = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.random-background = {
|
||||||
|
enable = true;
|
||||||
|
enableXinerama = true;
|
||||||
|
display = "fill";
|
||||||
|
imageDirectory = wallpapers;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.services.xbanish = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Xbanish";
|
||||||
|
After = [ "graphical-session-pre.target" ];
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${pkgs.xbanish}/bin/xbanish";
|
||||||
|
};
|
||||||
|
Install = {
|
||||||
|
WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ config, pkgs, ...}:
|
||||||
|
|
||||||
|
let
|
||||||
|
shell = "${pkgs.dash}/bin/dash";
|
||||||
|
xmonad = "${pkgs.haskellPackages.xmonad}/bin/xmonad";
|
||||||
|
openbox = "${pkgs.openbox}/bin/openbox";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "obtoxmd" ''
|
||||||
|
#!${shell}
|
||||||
|
${openbox}
|
||||||
|
${xmonad}
|
||||||
|
''
|
|
@ -0,0 +1,366 @@
|
||||||
|
module Bindings
|
||||||
|
( keybinds
|
||||||
|
, mousebinds
|
||||||
|
) where
|
||||||
|
|
||||||
|
--
|
||||||
|
-- q , w , e : screen naviagation
|
||||||
|
-- h , j , k , l : vim-style 2D navitgation
|
||||||
|
-- n , p : next/previous
|
||||||
|
-- r : run
|
||||||
|
-- t : tile
|
||||||
|
-- g : toggle spacing (gaps)
|
||||||
|
-- b " toggle bar
|
||||||
|
-- x , y : reflect
|
||||||
|
-- z : minimize
|
||||||
|
-- [ , ] : tab navigation
|
||||||
|
|
||||||
|
import System.Exit (exitSuccess)
|
||||||
|
|
||||||
|
import Data.Monoid ( appEndo )
|
||||||
|
import Data.Ratio ( (%) )
|
||||||
|
import qualified Data.Map as M
|
||||||
|
|
||||||
|
import XMonad ( (.|.) , gets )
|
||||||
|
import XMonad.Util.Types ( Direction2D (U, D, L, R) )
|
||||||
|
import XMonad.Hooks.ManageDocks ( ToggleStruts (ToggleStruts) )
|
||||||
|
import XMonad.Util.Run ( safeSpawn )
|
||||||
|
import XMonad.Util.Paste ( pasteSelection )
|
||||||
|
import XMonad.Layout.ResizableTile ( MirrorResize (MirrorShrink, MirrorExpand) )
|
||||||
|
import XMonad.Layout.Reflect ( REFLECTX (REFLECTX) , REFLECTY (REFLECTY) )
|
||||||
|
import XMonad.Layout.MultiToggle ( Toggle (Toggle) )
|
||||||
|
import XMonad.Layout.BoringWindows ( focusUp , focusDown )
|
||||||
|
import XMonad.Layout.Maximize ( maximizeRestore )
|
||||||
|
import XMonad.Actions.CopyWindow ( kill1 )
|
||||||
|
import XMonad.Actions.FloatKeys ( keysResizeWindow, keysMoveWindow )
|
||||||
|
import XMonad.Actions.Navigation2D ( switchLayer , windowGo , windowSwap )
|
||||||
|
import XMonad.Hooks.ManageHelpers ( doRectFloat )
|
||||||
|
|
||||||
|
import XMonad.Core
|
||||||
|
( Layout
|
||||||
|
, X
|
||||||
|
, terminal
|
||||||
|
, modMask
|
||||||
|
, layoutHook
|
||||||
|
, XConfig (XConfig)
|
||||||
|
, whenJust
|
||||||
|
, runQuery
|
||||||
|
, windowset
|
||||||
|
, io
|
||||||
|
, ScreenId
|
||||||
|
, WindowSpace
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Layout.IndependentScreens
|
||||||
|
( workspaces'
|
||||||
|
, onCurrentScreen
|
||||||
|
, unmarshallS
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Layout.SubLayouts
|
||||||
|
( onGroup
|
||||||
|
, pushGroup
|
||||||
|
, GroupMsg (MergeAll, UnMerge)
|
||||||
|
)
|
||||||
|
|
||||||
|
import Graphics.X11.Types
|
||||||
|
( Window , ButtonMask , KeyMask , KeySym , Button
|
||||||
|
, button1 , button2 , button3
|
||||||
|
, shiftMask , controlMask
|
||||||
|
, xK_Return , xK_Escape , xK_Insert , xK_Right , xK_Left
|
||||||
|
, xK_space , xK_plus , xK_minus , xK_comma , xK_period
|
||||||
|
, xK_bracketleft , xK_bracketright
|
||||||
|
, xK_1 , xK_9 , xK_0
|
||||||
|
, xK_b , xK_c , xK_e , xK_g , xK_h , xK_j , xK_k , xK_l , xK_m
|
||||||
|
, xK_n , xK_o , xK_p , xK_q , xK_r , xK_t , xK_u , xK_w , xK_x
|
||||||
|
, xK_y , xK_z
|
||||||
|
, xK_KP_End , xK_KP_Down , xK_KP_Next
|
||||||
|
, xK_KP_Add, xK_KP_Subtract, xK_KP_Insert, xK_KP_Enter
|
||||||
|
)
|
||||||
|
|
||||||
|
import Graphics.X11.ExtraTypes.XF86
|
||||||
|
( xF86XK_AudioMute
|
||||||
|
, xF86XK_AudioLowerVolume , xF86XK_AudioRaiseVolume
|
||||||
|
, xF86XK_AudioPlay , xF86XK_AudioStop
|
||||||
|
, xF86XK_AudioPrev , xF86XK_AudioNext
|
||||||
|
, xF86XK_RotateWindows
|
||||||
|
, xF86XK_MonBrightnessUp , xF86XK_MonBrightnessDown
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Layout
|
||||||
|
( IncMasterN (..)
|
||||||
|
, Resize (Shrink, Expand)
|
||||||
|
, ChangeLayout (NextLayout)
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Operations
|
||||||
|
( windows
|
||||||
|
, sendMessage
|
||||||
|
, setLayout
|
||||||
|
, withFocused
|
||||||
|
, screenWorkspace
|
||||||
|
, restart
|
||||||
|
, mouseResizeWindow
|
||||||
|
, mouseMoveWindow
|
||||||
|
, focus
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.StackSet
|
||||||
|
( StackSet (..)
|
||||||
|
, RationalRect (..)
|
||||||
|
, Workspace (..)
|
||||||
|
, shift
|
||||||
|
, greedyView
|
||||||
|
, swapUp
|
||||||
|
, swapDown
|
||||||
|
, sink
|
||||||
|
, view
|
||||||
|
, floating
|
||||||
|
, screen
|
||||||
|
, shiftMaster
|
||||||
|
, focusDown'
|
||||||
|
, focusUp'
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Layout.Spacing
|
||||||
|
( toggleScreenSpacingEnabled
|
||||||
|
, toggleWindowSpacingEnabled
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Actions.Minimize
|
||||||
|
( minimizeWindow
|
||||||
|
, withLastMinimized
|
||||||
|
, maximizeWindowAndFocus
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Actions.CycleWS
|
||||||
|
( toggleWS'
|
||||||
|
, WSType (WSIs)
|
||||||
|
, shiftTo
|
||||||
|
, moveTo
|
||||||
|
, Direction1D (Next, Prev)
|
||||||
|
)
|
||||||
|
|
||||||
|
import ManageHook ( scratchpadKeybinds )
|
||||||
|
import Prompts ( promptKeybinds )
|
||||||
|
import Utils ( mkSubmap )
|
||||||
|
|
||||||
|
mousebinds :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ())
|
||||||
|
mousebinds XConfig {modMask = modm} = M.fromList bindings
|
||||||
|
where
|
||||||
|
bindings =
|
||||||
|
[ ((modm, button1), move)
|
||||||
|
, ((modm, button2), toMaster)
|
||||||
|
, ((modm, button3), resize)
|
||||||
|
]
|
||||||
|
move = mouseDo mouseMoveWindow
|
||||||
|
resize = mouseDo mouseResizeWindow
|
||||||
|
toMaster = mouseDo return
|
||||||
|
mouseDo f w = focus w >> f w >> windows shiftMaster
|
||||||
|
|
||||||
|
keybinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
keybinds = foldr1 keyComb
|
||||||
|
[ wmBinds
|
||||||
|
, spawnBinds
|
||||||
|
, promptKeybinds
|
||||||
|
, scratchpadKeybinds
|
||||||
|
, workspaceBinds
|
||||||
|
, screenBinds
|
||||||
|
]
|
||||||
|
where
|
||||||
|
keyComb f g conf = M.union (f conf) (g conf)
|
||||||
|
|
||||||
|
spawnBinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
spawnBinds conf = M.fromList . map mkSpawn $ bindList
|
||||||
|
where
|
||||||
|
bindList = singles ++ playerctl ++ xbacklight ++ pamixer
|
||||||
|
singles =
|
||||||
|
[ ((modm, xK_Return), terminal conf, [])
|
||||||
|
, ((0, xF86XK_RotateWindows), "thinkpad-rotate", [])
|
||||||
|
, ((modm, xK_Escape), "slock", [])
|
||||||
|
]
|
||||||
|
-- mpc = withCmd "mpc"
|
||||||
|
-- [ ((0, xK_KP_End), ["prev"])
|
||||||
|
-- , ((0, xK_KP_Down), ["toggle"])
|
||||||
|
-- , ((0, xK_KP_Next), ["next"])
|
||||||
|
-- , ((0, xF86XK_AudioPlay), ["toggle"])
|
||||||
|
-- , ((0, xF86XK_AudioStop), ["stop"])
|
||||||
|
-- , ((0, xF86XK_AudioPrev), ["prev"])
|
||||||
|
-- , ((0, xF86XK_AudioNext), ["next"])
|
||||||
|
-- ]
|
||||||
|
playerctl = withCmd "playerctl"
|
||||||
|
[ ((0, xK_KP_End), ["previous"])
|
||||||
|
, ((0, xK_KP_Down), ["play-pause"])
|
||||||
|
, ((0, xK_KP_Next), ["next"])
|
||||||
|
, ((0, xF86XK_AudioPlay), ["play-pause"])
|
||||||
|
, ((0, xF86XK_AudioStop), ["stop"])
|
||||||
|
, ((0, xF86XK_AudioPrev), ["previous"])
|
||||||
|
, ((0, xF86XK_AudioNext), ["next"])
|
||||||
|
]
|
||||||
|
xbacklight = withCmd "xbacklight"
|
||||||
|
[ ((0, xF86XK_MonBrightnessUp), ["-inc", "10"])
|
||||||
|
, ((0, xF86XK_MonBrightnessDown), ["-dec", "10"])
|
||||||
|
]
|
||||||
|
pamixer = withCmd "pamixer"
|
||||||
|
[ ((0, xK_KP_Subtract), ["--decrease", "5"])
|
||||||
|
, ((0, xK_KP_Add), ["--increase", "5", "--allow-boost"])
|
||||||
|
, ((0, xK_KP_Enter), ["--set-volume", "100"])
|
||||||
|
, ((0, xK_KP_Insert), ["--togle-mute"])
|
||||||
|
, ((0, xF86XK_AudioLowerVolume), ["--decrease", "5"])
|
||||||
|
, ((0, xF86XK_AudioRaiseVolume), ["--increase", "5", "--allow-boost"])
|
||||||
|
, ((0, xF86XK_AudioMute), ["--toggle-mute"])
|
||||||
|
]
|
||||||
|
mkSpawn (comb,cmd,args) = (comb, safeSpawn cmd args)
|
||||||
|
withCmd cmd = map (\(comb,args) -> (comb,cmd,args))
|
||||||
|
modm = modMask conf
|
||||||
|
|
||||||
|
wmBinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
wmBinds conf@XConfig {modMask = modm} = M.fromList
|
||||||
|
[ ((0, xK_Insert), pasteSelection)
|
||||||
|
|
||||||
|
, ((modm .|. shiftMask, xK_o), restart "obtoxmd" True)
|
||||||
|
, ((modm .|. shiftMask, xK_r), restart "xmonad" True)
|
||||||
|
, ((modm .|. shiftMask, xK_Escape), io exitSuccess)
|
||||||
|
|
||||||
|
-- navigating windows
|
||||||
|
, ((modm, xK_j), windowGo D False)
|
||||||
|
, ((modm, xK_k), windowGo U False)
|
||||||
|
, ((modm, xK_h), windowGo L False)
|
||||||
|
, ((modm, xK_l), windowGo R False)
|
||||||
|
, ((modm, xK_n), focusDown)
|
||||||
|
, ((modm, xK_p), focusUp)
|
||||||
|
|
||||||
|
-- sublayout things
|
||||||
|
, ((modm .|. controlMask, xK_m), withFocused (sendMessage . MergeAll))
|
||||||
|
, ((modm .|. controlMask, xK_u), withFocused (sendMessage . UnMerge))
|
||||||
|
, ((modm .|. controlMask, xK_h), sendMessage $ pushGroup L)
|
||||||
|
, ((modm .|. controlMask, xK_l), sendMessage $ pushGroup R)
|
||||||
|
, ((modm .|. controlMask, xK_k), sendMessage $ pushGroup U)
|
||||||
|
, ((modm .|. controlMask, xK_j), sendMessage $ pushGroup D)
|
||||||
|
, ((modm, xK_bracketleft), onGroup focusUp')
|
||||||
|
, ((modm, xK_bracketright), onGroup focusDown')
|
||||||
|
|
||||||
|
-- moving windows
|
||||||
|
, ((modm .|. shiftMask, xK_j), move M.! "D")
|
||||||
|
, ((modm .|. shiftMask, xK_k), move M.! "U")
|
||||||
|
, ((modm .|. shiftMask, xK_h), move M.! "L")
|
||||||
|
, ((modm .|. shiftMask, xK_l), move M.! "R")
|
||||||
|
, ((modm .|. shiftMask, xK_n), windows swapDown)
|
||||||
|
, ((modm .|. shiftMask, xK_p), windows swapUp)
|
||||||
|
|
||||||
|
-- resizing windows
|
||||||
|
, ((modm, xK_plus ), resize M.! "+")
|
||||||
|
, ((modm, xK_minus), resize M.! "-")
|
||||||
|
, ((modm .|. shiftMask .|. controlMask, xK_h), resize M.! "L")
|
||||||
|
, ((modm .|. shiftMask .|. controlMask, xK_l), resize M.! "R")
|
||||||
|
, ((modm .|. shiftMask .|. controlMask, xK_j), resize M.! "D")
|
||||||
|
, ((modm .|. shiftMask .|. controlMask, xK_k), resize M.! "U")
|
||||||
|
|
||||||
|
, ((modm .|. controlMask, xK_space), switchLayer)
|
||||||
|
|
||||||
|
, ((modm .|. shiftMask, xK_c ), kill1)
|
||||||
|
, ((modm, xK_space ), sendMessage NextLayout)
|
||||||
|
, ((modm .|. shiftMask, xK_space ), setLayout $ layoutHook conf)
|
||||||
|
, ((modm, xK_x ), sendMessage $ Toggle REFLECTX)
|
||||||
|
, ((modm, xK_y ), sendMessage $ Toggle REFLECTY)
|
||||||
|
, ((modm, xK_z ), withFocused minimizeWindow)
|
||||||
|
, ((modm .|. shiftMask, xK_z ), unminimize)
|
||||||
|
, ((modm, xK_m ), toggleMax)
|
||||||
|
|
||||||
|
, ((modm, xK_t ), withFocused $ windows . sink)
|
||||||
|
, ((modm .|. shiftMask, xK_t ), untile)
|
||||||
|
|
||||||
|
, ((modm, xK_comma ), sendMessage (IncMasterN 1))
|
||||||
|
, ((modm, xK_period), sendMessage (IncMasterN (-1)))
|
||||||
|
, ((modm, xK_g ), toggleSpacing)
|
||||||
|
, ((modm, xK_b ), sendMessage ToggleStruts)
|
||||||
|
|
||||||
|
, ((modm, xK_Right ), moveTo Next spacesOnCurrentScreen)
|
||||||
|
, ((modm, xK_Left ), moveTo Prev spacesOnCurrentScreen)
|
||||||
|
, ((modm .|. shiftMask, xK_Right ), shiftTo Next spacesOnCurrentScreen)
|
||||||
|
, ((modm .|. shiftMask, xK_Left ), shiftTo Prev spacesOnCurrentScreen)
|
||||||
|
|
||||||
|
, ((modm, xK_0), toggleWS' ["NSP"])
|
||||||
|
]
|
||||||
|
|
||||||
|
where
|
||||||
|
toggleSpacing = toggleWindowSpacingEnabled >> toggleScreenSpacingEnabled
|
||||||
|
toggleMax = withFocused (sendMessage . maximizeRestore)
|
||||||
|
unminimize = withLastMinimized maximizeWindowAndFocus
|
||||||
|
|
||||||
|
untile = withFocused rectFloatFocused
|
||||||
|
where
|
||||||
|
rectFloatFocused focused = action focused >>= windows
|
||||||
|
action = fmap appEndo . doIt
|
||||||
|
doIt = runQuery $ doRectFloat rect
|
||||||
|
rect = RationalRect 0.05 0.05 0.9 0.9
|
||||||
|
|
||||||
|
floatResize = M.fromList
|
||||||
|
[ ("L", (-n, 0))
|
||||||
|
, ("R", (n, 0))
|
||||||
|
, ("D", (0, n))
|
||||||
|
, ("U", (0, -n))
|
||||||
|
]
|
||||||
|
tillingResize = M.fromList
|
||||||
|
[ ("L", sendMessage Shrink)
|
||||||
|
, ("R", sendMessage Expand)
|
||||||
|
, ("D", sendMessage MirrorShrink)
|
||||||
|
, ("U", sendMessage MirrorExpand)
|
||||||
|
]
|
||||||
|
tillingMove = M.fromList
|
||||||
|
[ ("L", L)
|
||||||
|
, ("R", R)
|
||||||
|
, ("D", D)
|
||||||
|
, ("U", U)
|
||||||
|
]
|
||||||
|
incDec = M.fromList
|
||||||
|
[ ("+", (n,n))
|
||||||
|
, ("-", (-n,-n))
|
||||||
|
]
|
||||||
|
n = 10
|
||||||
|
|
||||||
|
resize = M.union lrdu chSize
|
||||||
|
where
|
||||||
|
flt = fmap (\x -> keysResizeWindow x (0,0)) floatResize
|
||||||
|
lrdu = M.intersectionWith onFloat flt tillingResize
|
||||||
|
chSize = fmap (g . f) incDec
|
||||||
|
where
|
||||||
|
f x = keysResizeWindow x (1%2,1%2)
|
||||||
|
g x = onFloat x $ return ()
|
||||||
|
|
||||||
|
move = M.intersectionWith onFloat flt tilling
|
||||||
|
where
|
||||||
|
flt = fmap keysMoveWindow floatResize
|
||||||
|
tilling = fmap (`windowSwap` False) tillingMove
|
||||||
|
|
||||||
|
onFloat a b = withFocused $ ifFloat a (const b)
|
||||||
|
where
|
||||||
|
ifFloat x y w = isFloat w >>= picker x y w
|
||||||
|
|
||||||
|
picker x _ w True = x w
|
||||||
|
picker _ y w False = y w
|
||||||
|
|
||||||
|
isFloat :: Window -> X Bool
|
||||||
|
isFloat w = M.member w . floating <$> gets windowset
|
||||||
|
|
||||||
|
spacesOnCurrentScreen :: WSType
|
||||||
|
spacesOnCurrentScreen = WSIs $ isOnScreen <$> currentScreen
|
||||||
|
where
|
||||||
|
|
||||||
|
isOnScreen :: ScreenId -> WindowSpace -> Bool
|
||||||
|
isOnScreen s = (s ==) . unmarshallS . tag
|
||||||
|
|
||||||
|
currentScreen :: X ScreenId
|
||||||
|
currentScreen = gets $ screen . current . windowset
|
||||||
|
|
||||||
|
workspaceBinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
workspaceBinds conf@ XConfig {modMask = modm} = M.fromList $
|
||||||
|
[((m .|. modm, k), windows $ onCurrentScreen f i)
|
||||||
|
| (i, k) <- zip (workspaces' conf) [xK_1 .. xK_9]
|
||||||
|
, (f, m) <- [(greedyView, 0), (shift, shiftMask)]]
|
||||||
|
|
||||||
|
screenBinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
screenBinds XConfig {modMask = modm} = M.fromList $
|
||||||
|
[((m .|. modm, k), screenWorkspace i >>= flip whenJust (windows . f))
|
||||||
|
| (i, k) <- zip [0,1] [xK_w, xK_e]
|
||||||
|
, (f, m) <- [(view, 0), (shift, shiftMask)]]
|
|
@ -0,0 +1,85 @@
|
||||||
|
module DefaultConfig
|
||||||
|
( mkPP
|
||||||
|
, wsNamer
|
||||||
|
, defaultPP
|
||||||
|
) where
|
||||||
|
|
||||||
|
import MyConfig
|
||||||
|
( workspaceLog
|
||||||
|
, layoutLog
|
||||||
|
, taskbar
|
||||||
|
)
|
||||||
|
|
||||||
|
import Theme
|
||||||
|
( inactiveColor
|
||||||
|
, urgentColor
|
||||||
|
, selFg
|
||||||
|
, selectionColor
|
||||||
|
)
|
||||||
|
|
||||||
|
import GHC.IO.Handle.Types (Handle)
|
||||||
|
|
||||||
|
import XMonad.Hooks.DynamicLog
|
||||||
|
( ppCurrent
|
||||||
|
, ppOutput
|
||||||
|
, ppExtras
|
||||||
|
, ppVisible
|
||||||
|
, ppHidden
|
||||||
|
, ppHiddenNoWindows
|
||||||
|
, ppUrgent
|
||||||
|
, ppOrder
|
||||||
|
, ppTitle
|
||||||
|
, ppSep
|
||||||
|
, ppLayout
|
||||||
|
, PP
|
||||||
|
, xmobarColor
|
||||||
|
, wrap
|
||||||
|
, shorten
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Config (def)
|
||||||
|
|
||||||
|
import XMonad.Util.Run (hPutStrLn)
|
||||||
|
|
||||||
|
|
||||||
|
mkPP :: (String -> String) -> Bool -> Handle -> Int -> PP
|
||||||
|
mkPP workspaceNamer complete bar screen = common
|
||||||
|
{ ppOutput = hPutStrLn bar
|
||||||
|
, ppExtras = extras complete
|
||||||
|
}
|
||||||
|
where
|
||||||
|
common = def
|
||||||
|
{ ppCurrent = const ""
|
||||||
|
, ppVisible = const ""
|
||||||
|
, ppHidden = const ""
|
||||||
|
, ppHiddenNoWindows = const ""
|
||||||
|
, ppUrgent = xmobarColor urgentColor ""
|
||||||
|
, ppOrder = order complete
|
||||||
|
, ppTitle = title complete
|
||||||
|
, ppSep = xmobarColor inactiveColor "" "|"
|
||||||
|
, ppLayout = const ""
|
||||||
|
}
|
||||||
|
|
||||||
|
extras True =
|
||||||
|
[ workspaceLog workspaceNamer screen
|
||||||
|
, layoutLog screen
|
||||||
|
, taskbar screen
|
||||||
|
]
|
||||||
|
extras False =
|
||||||
|
[ workspaceLog workspaceNamer screen
|
||||||
|
, layoutLog screen
|
||||||
|
]
|
||||||
|
|
||||||
|
order True (_:_:_:xs) = xs
|
||||||
|
order False (_:_:t:ws:l:_) = [ws, l, t]
|
||||||
|
order _ _ = []
|
||||||
|
|
||||||
|
title True = const ""
|
||||||
|
title False = wrap " " "" . xmobarColor selFg selectionColor . wrap " " " " . shorten 80
|
||||||
|
|
||||||
|
wsNamer :: String -> String
|
||||||
|
wsNamer "NSP" = ""
|
||||||
|
wsNamer x = x
|
||||||
|
|
||||||
|
defaultPP :: Handle -> Int -> PP
|
||||||
|
defaultPP = mkPP wsNamer True
|
|
@ -0,0 +1,124 @@
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
|
||||||
|
|
||||||
|
module Layouts (myLayoutHook) where
|
||||||
|
|
||||||
|
import Text.Printf (printf)
|
||||||
|
|
||||||
|
import XMonad.Config (def)
|
||||||
|
import XMonad.Core ( LayoutClass )
|
||||||
|
import XMonad.Hooks.ManageDocks (avoidStruts)
|
||||||
|
|
||||||
|
import XMonad.Layout ( Mirror (Mirror) , (|||) )
|
||||||
|
import XMonad.Layout.PerWorkspace ( onWorkspaces )
|
||||||
|
import XMonad.Layout.LayoutModifier ( ModifiedLayout , LayoutModifier )
|
||||||
|
import XMonad.Layout.BoringWindows ( boringWindows )
|
||||||
|
import XMonad.Layout.Decoration ( Theme , DefaultShrinker , Decoration )
|
||||||
|
import XMonad.Layout.Maximize ( maximizeWithPadding )
|
||||||
|
import XMonad.Layout.Minimize ( minimize )
|
||||||
|
import XMonad.Layout.MultiToggle ( mkToggle , single )
|
||||||
|
import XMonad.Layout.Renamed ( renamed, Rename (Replace) )
|
||||||
|
import XMonad.Layout.NoBorders ( smartBorders )
|
||||||
|
import XMonad.Layout.ResizableTile ( ResizableTall (..) )
|
||||||
|
import XMonad.Layout.Spacing ( Spacing , spacingRaw , Border (..) )
|
||||||
|
import XMonad.Layout.WindowNavigation ( windowNavigation )
|
||||||
|
import XMonad.Layout.SubLayouts ( subLayout , Sublayout )
|
||||||
|
import XMonad.Layout.Simplest ( Simplest(Simplest) )
|
||||||
|
import XMonad.Layout.Grid ( Grid(Grid) )
|
||||||
|
import XMonad.Layout.Reflect
|
||||||
|
( REFLECTX (REFLECTX)
|
||||||
|
, REFLECTY (REFLECTY)
|
||||||
|
)
|
||||||
|
import XMonad.Layout.Tabbed
|
||||||
|
( shrinkText
|
||||||
|
, addTabs
|
||||||
|
, TabbedDecoration
|
||||||
|
)
|
||||||
|
import qualified XMonad.Layout.Tabbed as T
|
||||||
|
( activeColor
|
||||||
|
, inactiveColor
|
||||||
|
, activeBorderColor
|
||||||
|
, inactiveBorderColor
|
||||||
|
, urgentColor
|
||||||
|
, activeTextColor
|
||||||
|
, inactiveTextColor
|
||||||
|
, urgentTextColor
|
||||||
|
, fontName
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Layout.PositionStoreFloat (positionStoreFloat)
|
||||||
|
import XMonad.Layout.NoFrillsDecoration (noFrillsDeco)
|
||||||
|
import XMonad.Layout.BorderResize (borderResize)
|
||||||
|
|
||||||
|
import HostConfig
|
||||||
|
( FontConfig
|
||||||
|
, fontName
|
||||||
|
, fontSize
|
||||||
|
, ColorConfig
|
||||||
|
, fgColor
|
||||||
|
, selFgColor
|
||||||
|
, bgColor
|
||||||
|
, selColor
|
||||||
|
, inactiveColor
|
||||||
|
, inactiveBorderColor
|
||||||
|
, urgentColor
|
||||||
|
, colorConfig
|
||||||
|
, fontConfig
|
||||||
|
)
|
||||||
|
|
||||||
|
named :: String -> l a -> ModifiedLayout Rename l a
|
||||||
|
named x = renamed [Replace x]
|
||||||
|
|
||||||
|
myLayoutHook = commonMods mainLayouts
|
||||||
|
where
|
||||||
|
tileMods = mkToggle (single REFLECTX) . mkToggle (single REFLECTY)
|
||||||
|
. smartBorders
|
||||||
|
. windowNavigation . mySubTabbed theme
|
||||||
|
. spaces
|
||||||
|
commonMods = avoidStruts
|
||||||
|
. maximizeWithPadding 0
|
||||||
|
. minimize
|
||||||
|
. boringWindows
|
||||||
|
tLayouts = tileMods $ named "tall" tall ||| named "mtall" mtall
|
||||||
|
mainLayouts = tLayouts ||| floating theme
|
||||||
|
|
||||||
|
floating theme = named "float" . floatingDeco . borderResize $ positionStoreFloat
|
||||||
|
where
|
||||||
|
floatingDeco = noFrillsDeco shrinkText theme
|
||||||
|
|
||||||
|
mySubTabbed
|
||||||
|
:: (Eq a, LayoutModifier (Sublayout Simplest) a, LayoutClass l a)
|
||||||
|
=> Theme
|
||||||
|
-> l a
|
||||||
|
-> ModifiedLayout
|
||||||
|
(Decoration TabbedDecoration DefaultShrinker)
|
||||||
|
(ModifiedLayout (Sublayout Simplest) l)
|
||||||
|
a
|
||||||
|
mySubTabbed theme x = addTabs shrinkText theme $ subLayout [] Simplest x
|
||||||
|
|
||||||
|
spaces :: l a -> ModifiedLayout Spacing l a
|
||||||
|
spaces = spacingRaw False b False b False
|
||||||
|
where
|
||||||
|
b = Border defSpacing defSpacing defSpacing defSpacing
|
||||||
|
defSpacing = 5
|
||||||
|
|
||||||
|
tall :: ResizableTall a
|
||||||
|
tall = ResizableTall 1 (3/100) (1/2) []
|
||||||
|
|
||||||
|
mtall :: Mirror ResizableTall a
|
||||||
|
mtall = Mirror tall
|
||||||
|
|
||||||
|
theme :: Theme
|
||||||
|
theme = def
|
||||||
|
{ T.activeColor = selColor colorConfig
|
||||||
|
, T.activeBorderColor = inactiveColor colorConfig
|
||||||
|
, T.activeTextColor = selFgColor colorConfig
|
||||||
|
|
||||||
|
, T.inactiveColor = bgColor colorConfig
|
||||||
|
, T.inactiveBorderColor = inactiveBorderColor colorConfig
|
||||||
|
, T.inactiveTextColor = fgColor colorConfig
|
||||||
|
|
||||||
|
, T.urgentColor = urgentColor colorConfig
|
||||||
|
, T.urgentTextColor = urgentColor colorConfig
|
||||||
|
, T.fontName = printf "xft:%s:size=%d" (fontName fontConfig) (fontSize fontConfig)
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
module ManageHook
|
||||||
|
( myManageHook
|
||||||
|
, scratchpadKeybinds
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Text.Printf (printf)
|
||||||
|
import qualified Data.Map as M
|
||||||
|
|
||||||
|
import XMonad.Core
|
||||||
|
( ManageHook
|
||||||
|
, X
|
||||||
|
, XConfig(XConfig)
|
||||||
|
, modMask
|
||||||
|
, Layout
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.StackSet (RationalRect (RationalRect))
|
||||||
|
import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat)
|
||||||
|
|
||||||
|
import Graphics.X11.Types
|
||||||
|
( KeySym , ButtonMask
|
||||||
|
, xK_s , xK_t , xK_m
|
||||||
|
, xK_Return
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.ManageHook
|
||||||
|
( className
|
||||||
|
, (=?)
|
||||||
|
, resource
|
||||||
|
, composeAll
|
||||||
|
, (-->)
|
||||||
|
, doFloat
|
||||||
|
, doShift
|
||||||
|
, stringProperty
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad.Util.NamedScratchpad
|
||||||
|
( NamedScratchpad (NS)
|
||||||
|
, customFloating
|
||||||
|
, namedScratchpadManageHook
|
||||||
|
, namedScratchpadAction
|
||||||
|
)
|
||||||
|
|
||||||
|
import Utils ( mkSubmap )
|
||||||
|
|
||||||
|
scratchpadKeybinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
scratchpadKeybinds XConfig {modMask = modm} = M.fromList
|
||||||
|
[ ((modm, xK_s), mkSubmap modm . map buildSubmap $
|
||||||
|
[ (xK_Return, "scratchpad")
|
||||||
|
, (xK_m, "mixer")
|
||||||
|
-- , (xK_p, "player")
|
||||||
|
, (xK_t, "top")
|
||||||
|
-- , (xK_w, "whatsapp")
|
||||||
|
-- , (xK_g, "hangouts")
|
||||||
|
])
|
||||||
|
]
|
||||||
|
where
|
||||||
|
buildSubmap (key,name) = ((0,key), namedScratchpadAction myScratchpads name)
|
||||||
|
|
||||||
|
myScratchpads :: [NamedScratchpad]
|
||||||
|
myScratchpads =
|
||||||
|
[ termApp "scratchpad" "zsh" mngTopScratch
|
||||||
|
, termApp "top" "top" mngBigFloat
|
||||||
|
--, termApp "player" "ncmpcpp" mngBiggerFloat
|
||||||
|
|
||||||
|
--, NS "mixer" "pavucontrol" (className =? "Pavucontrol") mngSmallerFloat
|
||||||
|
|
||||||
|
-- , chromiumApp "whatsapp" "web.whatsapp.com" mngSmallFloat
|
||||||
|
-- , chromiumApp "hangouts" "hangouts.google.com" mngSmallFloat
|
||||||
|
]
|
||||||
|
|
||||||
|
myManageHook :: ManageHook
|
||||||
|
myManageHook = mkManageHook myScratchpads
|
||||||
|
|
||||||
|
termApp :: String -> String -> ManageHook -> NamedScratchpad
|
||||||
|
termApp name app = NS name cmd findIt
|
||||||
|
where
|
||||||
|
cmd = printf fmt name name app
|
||||||
|
fmt = "alacritty --class %s --command tmux new -A -s %s %s"
|
||||||
|
findIt = resource =? name
|
||||||
|
|
||||||
|
--chromiumApp :: String -> String -> ManageHook -> NamedScratchpad
|
||||||
|
--chromiumApp name url = NS name cmd findIt
|
||||||
|
-- where
|
||||||
|
-- cmd = printf "chromium --app=https://%s" url
|
||||||
|
-- findIt = resource =? url
|
||||||
|
|
||||||
|
--mngSmallerFloat :: ManageHook
|
||||||
|
--mngSmallerFloat = centeredFloat 0.6
|
||||||
|
|
||||||
|
--mngSmallFloat :: ManageHook
|
||||||
|
--mngSmallFloat = centeredFloat 0.7
|
||||||
|
|
||||||
|
mngBigFloat :: ManageHook
|
||||||
|
mngBigFloat = centeredFloat 0.8
|
||||||
|
|
||||||
|
--mngBiggerFloat :: ManageHook
|
||||||
|
--mngBiggerFloat = centeredFloat 0.9
|
||||||
|
|
||||||
|
centeredFloat :: Rational -> ManageHook
|
||||||
|
centeredFloat s = customFloating $ RationalRect p p s s
|
||||||
|
where
|
||||||
|
p = (1-s) / 2
|
||||||
|
|
||||||
|
mngTopScratch :: ManageHook
|
||||||
|
mngTopScratch = customFloating $ RationalRect l t w h
|
||||||
|
where
|
||||||
|
h = 0.3 -- height, 30%
|
||||||
|
w = 1 -- width, 100%
|
||||||
|
t = 0 -- distance from top edge, 0%
|
||||||
|
l = 1 - w -- distance from left edge, 0%
|
||||||
|
|
||||||
|
mkManageHook :: [NamedScratchpad] -> ManageHook
|
||||||
|
mkManageHook scratchpads = composeAll
|
||||||
|
[ isFullscreen --> doFullFloat
|
||||||
|
, className =? "MPlayer" --> doFloat
|
||||||
|
, className =? "VirtualBox" --> doFloat
|
||||||
|
, className =? "Pinentry" --> doFloat
|
||||||
|
, className =? "qjackctl" --> doFloat
|
||||||
|
, className =? "Xmessage" --> doFloat
|
||||||
|
, className =? "SuperCollider" --> doFloat
|
||||||
|
, role =? "gimp-dock" --> doFloat
|
||||||
|
, role =? "GtkFileChooserDialog" --> doFloat
|
||||||
|
|
||||||
|
--, className =? "Signal" --> doShift "msg"
|
||||||
|
--, className =? "Slack" --> doShift "msg"
|
||||||
|
--, className =? "Element" --> doShift "msg"
|
||||||
|
--, className =? "TelegramDesktop" --> doShift "msg"
|
||||||
|
--, resource =? "hangouts.google.com" --> doShift "msg"
|
||||||
|
--, resource =? "web.whatsapp.com" --> doShift "msg"
|
||||||
|
|
||||||
|
, namedScratchpadManageHook scratchpads
|
||||||
|
]
|
||||||
|
where
|
||||||
|
role = stringProperty "WM_WINDOW_ROLE"
|
|
@ -0,0 +1,60 @@
|
||||||
|
module Polybar (polybarLogHook, mkDbusClient) where
|
||||||
|
|
||||||
|
import XMonad.Hooks.DynamicLog
|
||||||
|
|
||||||
|
import Text.Printf (printf)
|
||||||
|
|
||||||
|
import XMonad.Layout.IndependentScreens (marshallPP)
|
||||||
|
|
||||||
|
import qualified DBus as D
|
||||||
|
import qualified DBus.Client as D
|
||||||
|
import qualified Codec.Binary.UTF8.String as UTF8
|
||||||
|
|
||||||
|
|
||||||
|
mkDbusClient :: IO D.Client
|
||||||
|
mkDbusClient = do
|
||||||
|
dbus <- D.connectSession
|
||||||
|
D.requestName dbus (D.busName_ "org.xmonad.log") opts
|
||||||
|
return dbus
|
||||||
|
where
|
||||||
|
opts = [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue]
|
||||||
|
|
||||||
|
monitorMsg :: Int -> String -> String
|
||||||
|
monitorMsg = printf "{\"%d\": \"%s\"}"
|
||||||
|
|
||||||
|
-- Emit a DBus signal on log updates
|
||||||
|
dbusOutput :: D.Client -> String -> IO ()
|
||||||
|
dbusOutput dbus str =
|
||||||
|
let opath = D.objectPath_ "/org/xmonad/Log"
|
||||||
|
iname = D.interfaceName_ "org.xmonad.Log"
|
||||||
|
mname = D.memberName_ "Update"
|
||||||
|
signal = D.signal opath iname mname
|
||||||
|
body = [D.toVariant $ UTF8.decodeString $ monitorMsg 0 str]
|
||||||
|
in D.emit dbus $ signal { D.signalBody = body }
|
||||||
|
|
||||||
|
polybarFmt :: String -> String -> String -> String
|
||||||
|
polybarFmt var color elem = "%{" ++ var ++ color ++ "}" ++ elem ++ "%{" ++ var ++ "-}"
|
||||||
|
|
||||||
|
polybarFg :: String -> String -> String
|
||||||
|
polybarFg = polybarFmt "F"
|
||||||
|
|
||||||
|
polybarBg :: String -> String -> String
|
||||||
|
polybarBg = polybarFmt "B"
|
||||||
|
|
||||||
|
polybarBgFg :: String -> String -> String -> String
|
||||||
|
polybarBgFg bg fg = polybarBg bg . polybarFg fg
|
||||||
|
|
||||||
|
polybarHook :: D.Client -> PP
|
||||||
|
polybarHook dbus = def
|
||||||
|
{ ppOutput = dbusOutput dbus
|
||||||
|
, ppCurrent = polybarBgFg "#458588" "#fbf1c7"
|
||||||
|
, ppVisible = polybarFg "#ebdbb2"
|
||||||
|
, ppUrgent = polybarBgFg "#cc241d" "#fbf1c7"
|
||||||
|
, ppHidden = polybarFg "#ebdbb2"
|
||||||
|
, ppLayout = const ""
|
||||||
|
, ppHiddenNoWindows = const ""
|
||||||
|
, ppTitle = shorten 100 . polybarFg "#fbf1c7"
|
||||||
|
, ppSep = polybarFg "#a89974" " | "
|
||||||
|
}
|
||||||
|
|
||||||
|
polybarLogHook dbus = dynamicLogWithPP $ (marshallPP 0 . polybarHook) dbus
|
|
@ -0,0 +1,92 @@
|
||||||
|
module Prompts ( promptKeybinds ) where
|
||||||
|
|
||||||
|
import Text.Printf (printf)
|
||||||
|
import qualified Data.Map as M ( Map , fromList )
|
||||||
|
|
||||||
|
import Graphics.X11.Types
|
||||||
|
( KeySym , ButtonMask
|
||||||
|
, xK_Tab
|
||||||
|
, xK_a , xK_b , xK_c , xK_p , xK_r , xK_s , xK_u , xK_t
|
||||||
|
)
|
||||||
|
import Graphics.X11.ExtraTypes.XF86 ( xF86XK_Launch1 )
|
||||||
|
|
||||||
|
import XMonad.Core ( X , modMask , XConfig(XConfig) , Layout )
|
||||||
|
import XMonad.Util.Run ( safeSpawn )
|
||||||
|
|
||||||
|
import qualified XMonad.Prompt as P
|
||||||
|
( XPConfig
|
||||||
|
, def
|
||||||
|
, font
|
||||||
|
, bgColor
|
||||||
|
, fgColor
|
||||||
|
, bgHLight
|
||||||
|
, fgHLight
|
||||||
|
, bgColor
|
||||||
|
, borderColor
|
||||||
|
, promptBorderWidth
|
||||||
|
, alwaysHighlight
|
||||||
|
, defaultPrompter
|
||||||
|
)
|
||||||
|
|
||||||
|
import HostConfig
|
||||||
|
( ColorConfig
|
||||||
|
, FontConfig
|
||||||
|
, fontConfig
|
||||||
|
, colorConfig
|
||||||
|
, fontName
|
||||||
|
, fontSize
|
||||||
|
, bgColor
|
||||||
|
, fgColor
|
||||||
|
, selColor
|
||||||
|
, selFgColor
|
||||||
|
)
|
||||||
|
|
||||||
|
import Utils ( mkSubmap )
|
||||||
|
|
||||||
|
promptKeybinds :: XConfig Layout -> M.Map (ButtonMask, KeySym) (X ())
|
||||||
|
promptKeybinds XConfig {modMask = modm} = M.fromList
|
||||||
|
[ ((0, xF86XK_Launch1), run)
|
||||||
|
, ((modm, xK_r), run)
|
||||||
|
, ((modm, xK_a) , subMapMaker
|
||||||
|
[ ( xK_r , drun )
|
||||||
|
, ( xK_p , pass )
|
||||||
|
, ( xK_Tab , window )
|
||||||
|
, ( xK_t , todo )
|
||||||
|
, ( xK_c , clipmenu )
|
||||||
|
, ( xK_b , buku )
|
||||||
|
, ( xK_s , ssh )
|
||||||
|
])
|
||||||
|
]
|
||||||
|
where
|
||||||
|
run = safeSpawn "rofi" ["-show", "run"]
|
||||||
|
drun = safeSpawn "rofi" ["-show", "drun"]
|
||||||
|
pass = safeSpawn "rofi-pass" []
|
||||||
|
buku = safeSpawn "rofi-buku" []
|
||||||
|
ssh = safeSpawn "rofi" ["-show", "ssh"]
|
||||||
|
window = safeSpawn "rofi" ["-show", "window"]
|
||||||
|
clipmenu = safeSpawn "clipmenu" dmenuArgs
|
||||||
|
todo = safeSpawn "todo-rofi" []
|
||||||
|
subMapMaker = mkSubmap modm . map (\(key,action) -> ((0,key),action))
|
||||||
|
|
||||||
|
dmenuArgs :: [String]
|
||||||
|
dmenuArgs =
|
||||||
|
[ "-b" -- bottom
|
||||||
|
, "-fn", printf "%s:size=%d" (fontName fontConfig) (fontSize fontConfig)
|
||||||
|
, "-nb", bgColor colorConfig -- normal background
|
||||||
|
, "-nf", fgColor colorConfig -- normal foreground
|
||||||
|
, "-sb", selColor colorConfig -- selected background
|
||||||
|
, "-sf", selFgColor colorConfig -- selected foreground
|
||||||
|
]
|
||||||
|
|
||||||
|
theme :: P.XPConfig
|
||||||
|
theme = P.def
|
||||||
|
{ P.font = printf "xft:%s:size=%d" (fontName fontConfig) (fontSize fontConfig)
|
||||||
|
, P.bgColor = bgColor colorConfig
|
||||||
|
, P.fgColor = fgColor colorConfig
|
||||||
|
, P.bgHLight = selColor colorConfig
|
||||||
|
, P.fgHLight = selFgColor colorConfig
|
||||||
|
, P.borderColor = bgColor colorConfig
|
||||||
|
, P.promptBorderWidth = 0
|
||||||
|
, P.alwaysHighlight = True
|
||||||
|
, P.defaultPrompter = const ""
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
module Utils ( mkSubmap ) where
|
||||||
|
|
||||||
|
import qualified Data.Map as M ( fromList )
|
||||||
|
|
||||||
|
import XMonad ( (.|.) )
|
||||||
|
import Graphics.X11.Types ( KeyMask , KeySym , ButtonMask )
|
||||||
|
|
||||||
|
import XMonad.Core ( X )
|
||||||
|
import XMonad.Actions.Submap ( submap )
|
||||||
|
|
||||||
|
mkSubmap :: ButtonMask -> [((KeyMask, KeySym), X ())] -> X ()
|
||||||
|
mkSubmap modm = submap . M.fromList . concatMap buildSubmaps
|
||||||
|
where
|
||||||
|
buildSubmaps x = map (buildSubmap x) [0,modm]
|
||||||
|
buildSubmap ((modKey,key),action) m = ((modKey .|. m,key),action)
|
|
@ -0,0 +1,119 @@
|
||||||
|
module Xmobar (mkBars) where
|
||||||
|
|
||||||
|
import XMonad.Layout.IndependentScreens (marshallPP)
|
||||||
|
|
||||||
|
import GHC.IO.Handle.Types (Handle)
|
||||||
|
import Text.Printf (printf)
|
||||||
|
|
||||||
|
import Data.List (intercalate, isPrefixOf)
|
||||||
|
import Graphics.X11.Types (Window)
|
||||||
|
|
||||||
|
import XMonad.Core
|
||||||
|
( Layout
|
||||||
|
, ScreenDetail
|
||||||
|
, ScreenId (S)
|
||||||
|
, withWindowSet
|
||||||
|
, WorkspaceId
|
||||||
|
, WindowSet
|
||||||
|
, description
|
||||||
|
, X
|
||||||
|
)
|
||||||
|
|
||||||
|
import XMonad (MonadIO)
|
||||||
|
import XMonad.Config (def)
|
||||||
|
import XMonad.Util.Run (hPutStrLn, spawnPipe)
|
||||||
|
import XMonad.Util.NamedWindows (getName)
|
||||||
|
import XMonad.Util.Loggers (Logger)
|
||||||
|
|
||||||
|
import XMonad.StackSet ( Workspace (..) , screen , workspace , current )
|
||||||
|
import qualified XMonad.StackSet as S
|
||||||
|
|
||||||
|
import XMonad.Hooks.DynamicLog
|
||||||
|
( PP
|
||||||
|
, ppCurrent
|
||||||
|
, ppExtras
|
||||||
|
, ppHidden
|
||||||
|
, ppHiddenNoWindows
|
||||||
|
, ppLayout
|
||||||
|
, ppOrder
|
||||||
|
, ppOutput
|
||||||
|
, ppSep
|
||||||
|
, ppTitle
|
||||||
|
, ppUrgent
|
||||||
|
, ppVisible
|
||||||
|
, shorten
|
||||||
|
, wrap
|
||||||
|
, xmobarAction
|
||||||
|
, xmobarColor
|
||||||
|
, dynamicLogWithPP
|
||||||
|
)
|
||||||
|
|
||||||
|
import HostConfig
|
||||||
|
( colorConfig
|
||||||
|
, fontConfig
|
||||||
|
, FontConfig
|
||||||
|
, fontName
|
||||||
|
, fontSize
|
||||||
|
|
||||||
|
, ColorConfig
|
||||||
|
, bgColor
|
||||||
|
, fgColor
|
||||||
|
, selFgColor
|
||||||
|
, selColor
|
||||||
|
, inactiveColor
|
||||||
|
, urgentColor
|
||||||
|
)
|
||||||
|
|
||||||
|
mkBars :: MonadIO m => [Int] -> m (X ())
|
||||||
|
mkBars screens = do
|
||||||
|
xmprocs <- mkXmprocs screens
|
||||||
|
return $ mapM_ dynamicLogWithPP $ zipWith mkPP xmprocs screens
|
||||||
|
|
||||||
|
mkXmprocs :: MonadIO m => [Int] -> m [Handle]
|
||||||
|
mkXmprocs = mapM (spawnPipe . printf "xmobar --screen='%d'")
|
||||||
|
|
||||||
|
mkPP :: Handle -> Int -> PP
|
||||||
|
mkPP bar nscreen = marshallPP (S nscreen) $ def
|
||||||
|
{ ppOutput = hPutStrLn bar
|
||||||
|
, ppCurrent = xmobarColor (selFgColor colorConfig) (selColor colorConfig)
|
||||||
|
, ppVisible = xmobarColor (fgColor colorConfig) ""
|
||||||
|
, ppHidden = xmobarColor (fgColor colorConfig) ""
|
||||||
|
, ppHiddenNoWindows = const ""
|
||||||
|
, ppUrgent = xmobarColor (urgentColor colorConfig) ""
|
||||||
|
, ppLayout = getLayoutIcon . layoutNameCleaner
|
||||||
|
, ppTitle = xmobarColor (selFgColor colorConfig) "" . shorten 100
|
||||||
|
, ppSep = xmobarColor (inactiveColor colorConfig) "" " | "
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutNameCleaner = unwords . filter (not . (`elem` toClean)) . words
|
||||||
|
where
|
||||||
|
toClean =
|
||||||
|
[ "Simple"
|
||||||
|
, "Simplest"
|
||||||
|
, "Minimize"
|
||||||
|
, "Maximize"
|
||||||
|
, "ImageButtonDeco"
|
||||||
|
, "DefaultDecoration"
|
||||||
|
, "Spacing"
|
||||||
|
, "ReflectX"
|
||||||
|
, "ReflectY"
|
||||||
|
, "Tabbed"
|
||||||
|
, "0"
|
||||||
|
]
|
||||||
|
|
||||||
|
getLayoutIcon :: String -> String
|
||||||
|
getLayoutIcon "empty" = ""
|
||||||
|
getLayoutIcon x
|
||||||
|
| x `elem` icons = printf "<icon=%s/%s.xpm/>" iconsDir x
|
||||||
|
| otherwise = x
|
||||||
|
where
|
||||||
|
iconsDir = "/home/rilla/.xmonad/icons"
|
||||||
|
icons =
|
||||||
|
[ "3cols"
|
||||||
|
, "float"
|
||||||
|
, "full"
|
||||||
|
, "grid"
|
||||||
|
, "mtall"
|
||||||
|
, "tabs"
|
||||||
|
, "tall"
|
||||||
|
]
|
|
@ -0,0 +1,92 @@
|
||||||
|
import XMonad ( xmonad )
|
||||||
|
import XMonad.Core
|
||||||
|
( ScreenId (S)
|
||||||
|
, terminal
|
||||||
|
, modMask
|
||||||
|
, borderWidth
|
||||||
|
, normalBorderColor
|
||||||
|
, focusedBorderColor
|
||||||
|
, workspaces
|
||||||
|
, keys
|
||||||
|
, mouseBindings
|
||||||
|
, layoutHook
|
||||||
|
, manageHook
|
||||||
|
, XConfig
|
||||||
|
( logHook
|
||||||
|
, focusFollowsMouse
|
||||||
|
, startupHook
|
||||||
|
, handleEventHook
|
||||||
|
)
|
||||||
|
)
|
||||||
|
import XMonad.Config ( def )
|
||||||
|
|
||||||
|
import XMonad.Hooks.ServerMode ( serverModeEventHook )
|
||||||
|
import XMonad.Hooks.EwmhDesktops ( ewmh )
|
||||||
|
import XMonad.Hooks.ManageDocks ( docks )
|
||||||
|
import XMonad.Hooks.SetWMName ( setWMName )
|
||||||
|
|
||||||
|
import XMonad.Layout.IndependentScreens ( countScreens , withScreens )
|
||||||
|
import XMonad.Util.Replace ( replace )
|
||||||
|
|
||||||
|
import XMonad.Actions.UpdatePointer ( updatePointer )
|
||||||
|
import XMonad.Actions.Navigation2D
|
||||||
|
( withNavigation2DConfig
|
||||||
|
, Navigation2DConfig
|
||||||
|
, centerNavigation
|
||||||
|
, singleWindowRect
|
||||||
|
, defaultTiledNavigation
|
||||||
|
, layoutNavigation
|
||||||
|
, unmappedWindowRect
|
||||||
|
)
|
||||||
|
|
||||||
|
import Graphics.X11.Types ( mod4Mask )
|
||||||
|
|
||||||
|
import HostConfig
|
||||||
|
( colorConfig
|
||||||
|
, selColor
|
||||||
|
, inactiveBorderColor
|
||||||
|
)
|
||||||
|
import ManageHook ( myManageHook )
|
||||||
|
import Xmobar ( mkBars )
|
||||||
|
import Bindings ( keybinds, mousebinds )
|
||||||
|
import Layouts ( myLayoutHook )
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
replace
|
||||||
|
nscreens <- countScreens
|
||||||
|
let
|
||||||
|
myScreens = [0 .. nscreens-1]
|
||||||
|
wsLs = withScreens (S nscreens) myWorkspaces
|
||||||
|
bars <- mkBars myScreens
|
||||||
|
xmonad $ opts def
|
||||||
|
{ terminal = "alacritty"
|
||||||
|
, modMask = mod4Mask
|
||||||
|
, borderWidth = 4
|
||||||
|
, normalBorderColor = inactiveBorderColor colorConfig
|
||||||
|
, focusedBorderColor = selColor colorConfig
|
||||||
|
, workspaces = wsLs
|
||||||
|
, keys = keybinds
|
||||||
|
, mouseBindings = mousebinds
|
||||||
|
, layoutHook = myLayoutHook
|
||||||
|
, manageHook = myManageHook
|
||||||
|
, logHook = bars >> updatePtr
|
||||||
|
, focusFollowsMouse = True
|
||||||
|
, handleEventHook = serverModeEventHook
|
||||||
|
, startupHook = setWMName "LG3D"
|
||||||
|
}
|
||||||
|
where
|
||||||
|
opts = docks . ewmh . withNavigation2DConfig myNav2DConf
|
||||||
|
updatePtr = updatePointer (0.9, 0.9) (0, 0)
|
||||||
|
|
||||||
|
myNav2DConf :: Navigation2DConfig
|
||||||
|
myNav2DConf = def
|
||||||
|
{ defaultTiledNavigation = centerNavigation
|
||||||
|
, layoutNavigation = [("Full", centerNavigation)]
|
||||||
|
, unmappedWindowRect = [("Full", singleWindowRect)]
|
||||||
|
}
|
||||||
|
|
||||||
|
myWorkspaces :: [String]
|
||||||
|
myWorkspaces = map show ids
|
||||||
|
where ids :: [Int]
|
||||||
|
ids = [1..9]
|
|
@ -0,0 +1,18 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(nerdfonts.override {
|
||||||
|
fonts = [
|
||||||
|
"Hack" # my default monospace font
|
||||||
|
"MPlus" # to display symbols on xmobar
|
||||||
|
"InconsolataGo" # sometimes I use it as a change from Hack
|
||||||
|
"CascadiaCode" # used by rofi; todo: set fontconfig to use MPlus instead
|
||||||
|
];
|
||||||
|
})
|
||||||
|
inter # Inter is my default sans-serif font
|
||||||
|
hack-font # Hack is my default monospace font
|
||||||
|
libertinus # Libertinus Serif is my default serif font
|
||||||
|
];
|
||||||
|
#fonts.fontconfig.enable = true;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [ pkgs.diff-so-fancy pkgs.tig ];
|
||||||
|
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
userName = "Ricard Illa";
|
||||||
|
signing = {
|
||||||
|
key = "0x8333CFB0B9D3244D";
|
||||||
|
signByDefault = true;
|
||||||
|
};
|
||||||
|
# delta = maybe?
|
||||||
|
extraConfig = {
|
||||||
|
core = {
|
||||||
|
editor = "${pkgs.neovim}/bin/nvim";
|
||||||
|
pager =
|
||||||
|
"${pkgs.diff-so-fancy}/bin/diff-so-fancy | ${pkgs.less}/bin/less --tabs=4 -RFX";
|
||||||
|
};
|
||||||
|
color.ui = true;
|
||||||
|
pull.rebase = false;
|
||||||
|
init.defaultBranch = "master";
|
||||||
|
diff-so-fancy.stripLeadingSymbols = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
programs.git.userEmail = "rilla@monotremata.xyz";
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
programs.git.userEmail = "ricard@trkkn.com";
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
server_url = "gotify.monotremata.xyz";
|
||||||
|
server_port = "443";
|
||||||
|
client_token = "CToaKlqyMrBKJcp";
|
||||||
|
app_token = "AsMyhbR5h5ZlNXb";
|
||||||
|
default_priority = "5";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
pkgs.gotify-desktop
|
||||||
|
pkgs.gotify-cli
|
||||||
|
];
|
||||||
|
|
||||||
|
home.file.".config/gotify-desktop/config.toml".text = ''
|
||||||
|
[gotify]
|
||||||
|
url = "wss://${server_url}:${server_port}"
|
||||||
|
token = "${client_token}"
|
||||||
|
auto_delete = true
|
||||||
|
|
||||||
|
[notification]
|
||||||
|
min_priority = 1
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".config/gotify/cli.json".text = ''
|
||||||
|
{
|
||||||
|
"token": "${app_token}",
|
||||||
|
"url": "https://${server_url}",
|
||||||
|
"defaultPriority": ${default_priority}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.user.services.gotify = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Gotify desktop";
|
||||||
|
After = [ "graphical-session-pre.target" ];
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${pkgs.gotify-desktop}/bin/gotify-desktop";
|
||||||
|
};
|
||||||
|
Install = {
|
||||||
|
WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs.gpg = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
personal-cipher-preferences = "AES256 AES192 AES";
|
||||||
|
personal-digest-preferences = "SHA512 SHA384 SHA256";
|
||||||
|
personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
default-preference-list = "SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed";
|
||||||
|
cert-digest-algo = "SHA512";
|
||||||
|
s2k-digest-algo = "SHA512";
|
||||||
|
s2k-cipher-algo = "AES256";
|
||||||
|
charset = "utf-8";
|
||||||
|
fixed-list-mode = true;
|
||||||
|
no-comments = true;
|
||||||
|
no-emit-version = true;
|
||||||
|
keyid-format = "0xlong";
|
||||||
|
list-options = "show-uid-validity";
|
||||||
|
verify-options = "show-uid-validity";
|
||||||
|
with-fingerprint = true;
|
||||||
|
require-cross-certification = true;
|
||||||
|
use-agent = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSshSupport = true;
|
||||||
|
pinentryFlavor = "gtk2";
|
||||||
|
defaultCacheTtl = 60;
|
||||||
|
maxCacheTtl = 120;
|
||||||
|
# extraConfig = "log-file ${config.home.homeDirectory}/gpg-agent.log";
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
pinentry =
|
||||||
|
"${pkgs.pinentry_mac}/Applications/pinentry-mac.app/Contents/MacOS/pinentry-mac";
|
||||||
|
|
||||||
|
in {
|
||||||
|
home.packages = [ pkgs.gnupg pkgs.pinentry_mac ];
|
||||||
|
|
||||||
|
home.file.".gnupg/gpg-agent.conf".text = ''
|
||||||
|
enable-ssh-support
|
||||||
|
default-cache-ttl 60
|
||||||
|
max-cache-ttl 120
|
||||||
|
display :0
|
||||||
|
pinentry-program ${pinentry}
|
||||||
|
log-file ${config.home.homeDirectory}/.local/var/log/gpg-agent.log
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".gnupg/gpg.conf".text = ''
|
||||||
|
personal-cipher-preferences AES256 AES192 AES
|
||||||
|
personal-digest-preferences SHA512 SHA384 SHA256
|
||||||
|
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
|
||||||
|
default-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed
|
||||||
|
cert-digest-algo SHA512
|
||||||
|
s2k-digest-algo SHA512
|
||||||
|
s2k-cipher-algo AES256
|
||||||
|
charset utf-8
|
||||||
|
fixed-list-mode
|
||||||
|
no-comments
|
||||||
|
no-emit-version
|
||||||
|
keyid-format 0xlong
|
||||||
|
list-options show-uid-validity
|
||||||
|
verify-options show-uid-validity
|
||||||
|
with-fingerprint
|
||||||
|
require-cross-certification
|
||||||
|
use-agent
|
||||||
|
'';
|
||||||
|
|
||||||
|
home.file.".gnupg/scdaemon.conf".text = ''
|
||||||
|
disable-ccid
|
||||||
|
reader-port "Yubico YubiKey OTP+FIDO+CCID"
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home = {
|
||||||
|
packages = [pkgs.idasen];
|
||||||
|
file.".config/idasen/idasen.yaml".text = pkgs.lib.generators.toYAML {} {
|
||||||
|
mac_address = "F8:3E:14:A6:42:DB";
|
||||||
|
positions = {
|
||||||
|
sit = 0.684;
|
||||||
|
stand = 1.068;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.username = "rilla";
|
||||||
|
home.homeDirectory = "/Users/rilla";
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
./alacritty/macos.nix
|
||||||
|
./dav/macos.nix
|
||||||
|
./git/macos.nix
|
||||||
|
./gpg/macos.nix
|
||||||
|
./mail/macos.nix
|
||||||
|
./mpd/macos.nix
|
||||||
|
./neovim/macos.nix
|
||||||
|
./pass/macos.nix
|
||||||
|
./rss # done
|
||||||
|
./ssh # done
|
||||||
|
./tmux # done
|
||||||
|
./vitetris/macos.nix
|
||||||
|
./zsh/macos.nix
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,535 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
gpgKey = "B51D4548A4846E3C8D115C808333CFB0B9D3244D";
|
||||||
|
|
||||||
|
personalSignature = ''
|
||||||
|
Ricard Illa
|
||||||
|
https://monotremata.xyz
|
||||||
|
http://zswm576cm7wgmgcwluy4l4ixkfasj25taqbn2r5pnrrj552l263ff2qd.onion
|
||||||
|
public key fingerprint: B51D4548A4846E3C8D115C808333CFB0B9D3244D
|
||||||
|
'';
|
||||||
|
|
||||||
|
workSignature = ''
|
||||||
|
Ricard Illa
|
||||||
|
Data Engineer
|
||||||
|
|
||||||
|
Trakken GmbH
|
||||||
|
- Sucursal en España
|
||||||
|
Carrer de Sardenya 229
|
||||||
|
08013 Barcelona
|
||||||
|
|
||||||
|
|
||||||
|
E-mail:ricard@trkkn.com
|
||||||
|
Web:www.trkkn.com
|
||||||
|
|
||||||
|
___________________________________________________________
|
||||||
|
|
||||||
|
HRB 104862, Amtsgericht Hamburg
|
||||||
|
Managing Directors: Timo Aden, Lennart Paulsen
|
||||||
|
___________________________________________________________
|
||||||
|
'';
|
||||||
|
|
||||||
|
accountSignature = { showSignature ? "append", text ? "" }: {
|
||||||
|
showSignature = showSignature;
|
||||||
|
text = text;
|
||||||
|
};
|
||||||
|
|
||||||
|
pwCmd = x: "${pkgs.pass}/bin/pass ${x}";
|
||||||
|
|
||||||
|
defaultAccountSettings = { accountEmail
|
||||||
|
, mailboxes ? ''"=Inbox" "=Archive" "=Drafts" "=Junk" "=Sent" "=Trash"''
|
||||||
|
, smtpHost ? "mail.monotremata.xyz", imapHost ? "mail.monotremata.xyz" }: {
|
||||||
|
primary = false;
|
||||||
|
realName = "Ricard Illa";
|
||||||
|
|
||||||
|
aliases = [ accountEmail ];
|
||||||
|
address = accountEmail;
|
||||||
|
userName = accountEmail;
|
||||||
|
neomutt = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
unmailboxes *
|
||||||
|
mailboxes ${mailboxes}
|
||||||
|
set status_format = "[ ${accountEmail} ] [ %f ] [%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]%>─%?p?( %p postponed )?"
|
||||||
|
'';
|
||||||
|
sendMailCommand = "msmtp -a ${accountEmail}";
|
||||||
|
};
|
||||||
|
signature = accountSignature { text = personalSignature; };
|
||||||
|
mbsync = {
|
||||||
|
enable = true;
|
||||||
|
create = "both";
|
||||||
|
expunge = "both";
|
||||||
|
flatten = ".";
|
||||||
|
patterns = [ "*" ];
|
||||||
|
remove = "both";
|
||||||
|
};
|
||||||
|
gpg = {
|
||||||
|
encryptByDefault = false;
|
||||||
|
signByDefault = true;
|
||||||
|
key = gpgKey;
|
||||||
|
};
|
||||||
|
msmtp.enable = true;
|
||||||
|
|
||||||
|
smtp = {
|
||||||
|
host = smtpHost;
|
||||||
|
tls = {
|
||||||
|
enable = true;
|
||||||
|
useStartTls = true;
|
||||||
|
};
|
||||||
|
port = 587;
|
||||||
|
};
|
||||||
|
|
||||||
|
imap = {
|
||||||
|
host = imapHost;
|
||||||
|
tls.enable = true;
|
||||||
|
port = 993;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
switchAccountMacro = i: x: {
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "i${i}";
|
||||||
|
action =
|
||||||
|
"<enter-command>source ${config.xdg.configHome}/neomutt/${x}<enter><change-folder>!<enter><check-stats>";
|
||||||
|
};
|
||||||
|
|
||||||
|
in {
|
||||||
|
accounts.email.accounts = {
|
||||||
|
|
||||||
|
"rilla@monotremata.xyz" =
|
||||||
|
defaultAccountSettings { accountEmail = "rilla@monotremata.xyz"; } // {
|
||||||
|
primary = true;
|
||||||
|
passwordCommand = pwCmd "mail.monotremata.xyz/rilla@monotremata.xyz";
|
||||||
|
};
|
||||||
|
|
||||||
|
"r.illa.pujagut@gmail.com" = defaultAccountSettings {
|
||||||
|
accountEmail = "r.illa.pujagut@gmail.com";
|
||||||
|
mailboxes = ''
|
||||||
|
"=INBOX" "=[Gmail].Drafts" "=[Gmail].Sent Mail" "=[Gmail].Trash" "=[Gmail].Spam" "=[Gmail].All Mail"'';
|
||||||
|
smtpHost = "smtp.gmail.com";
|
||||||
|
imapHost = "imap.gmail.com";
|
||||||
|
} // {
|
||||||
|
passwordCommand = pwCmd "google.com/mutt/r.illa.pujagut@gmail.com";
|
||||||
|
};
|
||||||
|
|
||||||
|
"ricard@trkkn.com" = defaultAccountSettings {
|
||||||
|
accountEmail = "ricard@trkkn.com";
|
||||||
|
mailboxes = ''
|
||||||
|
"=INBOX" "=[Gmail].Drafts" "=[Gmail].Sent Mail" "=[Gmail].Trash" "=[Gmail].Spam" "=[Gmail].All Mail"'';
|
||||||
|
smtpHost = "smtp.gmail.com";
|
||||||
|
imapHost = "imap.gmail.com";
|
||||||
|
} // {
|
||||||
|
signature = accountSignature { text = workSignature; };
|
||||||
|
aliases = [ "ricard@trkkn.com" "ricard@trakken.es" ];
|
||||||
|
passwordCommand = pwCmd "trakken/google.com/mutt/ricard@trkkn.com";
|
||||||
|
};
|
||||||
|
|
||||||
|
"accounts@monotremata.xyz" =
|
||||||
|
defaultAccountSettings { accountEmail = "accounts@monotremata.xyz"; } // {
|
||||||
|
realName = "monotremata.xyz";
|
||||||
|
signature = accountSignature { showSignature = "none"; };
|
||||||
|
passwordCommand = pwCmd "mail.monotremata.xyz/accounts@monotremata.xyz";
|
||||||
|
};
|
||||||
|
|
||||||
|
"admin@monotremata.xyz" =
|
||||||
|
defaultAccountSettings { accountEmail = "admin@monotremata.xyz"; } // {
|
||||||
|
aliases = [
|
||||||
|
"admin@monotremata.xyz"
|
||||||
|
"postmaster@monotremata.xyz"
|
||||||
|
"hostmaster@monotremata.xyz"
|
||||||
|
"webmaster@monotremata.xyz"
|
||||||
|
"abuse@monotremata.xyz"
|
||||||
|
];
|
||||||
|
realName = "monotremata.xyz";
|
||||||
|
signature = accountSignature { text = "admin@monotremata.xyz"; };
|
||||||
|
passwordCommand = pwCmd "mail.monotremata.xyz/admin@monotremata.xyz";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.neomutt = {
|
||||||
|
enable = true;
|
||||||
|
editor = "nvim";
|
||||||
|
sort = "threads";
|
||||||
|
# vimKeys = true;
|
||||||
|
sidebar = {
|
||||||
|
enable = true;
|
||||||
|
shortPath = true;
|
||||||
|
width = 20;
|
||||||
|
format = "%D%?F? [%F]?%* %?N?%N/? %?S?%S?";
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
alternative_order text/html text/plain text/enriched text/*
|
||||||
|
auto_view text/html application/gpg-encrypted text/calendar application/ics
|
||||||
|
|
||||||
|
# Default index colors:
|
||||||
|
color index yellow default '.*'
|
||||||
|
color index_author red default '.*'
|
||||||
|
color index_number blue default
|
||||||
|
color index_subject cyan default '.*'
|
||||||
|
|
||||||
|
# New mail is boldened:
|
||||||
|
color index brightyellow black "~N"
|
||||||
|
color index_author brightred black "~N"
|
||||||
|
color index_subject brightcyan black "~N"
|
||||||
|
|
||||||
|
# Tagged mail is highlighted:
|
||||||
|
color index brightyellow blue "~T"
|
||||||
|
color index_author brightred blue "~T"
|
||||||
|
color index_subject brightcyan blue "~T"
|
||||||
|
|
||||||
|
# Other colors and aesthetic settings:
|
||||||
|
mono bold bold
|
||||||
|
mono underline underline
|
||||||
|
mono indicator reverse
|
||||||
|
mono error bold
|
||||||
|
color normal default default
|
||||||
|
color indicator brightblack white
|
||||||
|
color sidebar_highlight red default
|
||||||
|
color sidebar_divider brightblack black
|
||||||
|
color sidebar_flagged red black
|
||||||
|
color sidebar_new green black
|
||||||
|
color normal brightyellow default
|
||||||
|
color error red default
|
||||||
|
color tilde black default
|
||||||
|
color message cyan default
|
||||||
|
color markers red white
|
||||||
|
color attachment white default
|
||||||
|
color search brightmagenta default
|
||||||
|
color status brightyellow black
|
||||||
|
color hdrdefault brightgreen default
|
||||||
|
color quoted green default
|
||||||
|
color quoted1 blue default
|
||||||
|
color quoted2 cyan default
|
||||||
|
color quoted3 yellow default
|
||||||
|
color quoted4 red default
|
||||||
|
color quoted5 brightred default
|
||||||
|
color signature brightgreen default
|
||||||
|
color bold black default
|
||||||
|
color underline black default
|
||||||
|
color normal default default
|
||||||
|
|
||||||
|
# Regex highlighting:
|
||||||
|
color header blue default ".*"
|
||||||
|
color header brightmagenta default "^(From)"
|
||||||
|
color header brightcyan default "^(Subject)"
|
||||||
|
color header brightwhite default "^(CC|BCC)"
|
||||||
|
color body brightred default "[\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+" # Email addresses
|
||||||
|
color body brightblue default "(https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+" # URL
|
||||||
|
color body green default "\`[^\`]*\`" # Green text between ` and `
|
||||||
|
color body brightblue default "^# \.*" # Headings as bold blue
|
||||||
|
color body brightcyan default "^## \.*" # Subheadings as bold cyan
|
||||||
|
color body brightgreen default "^### \.*" # Subsubheadings as bold green
|
||||||
|
color body yellow default "^(\t| )*(-|\\*) \.*" # List items as yellow
|
||||||
|
color body brightcyan default "[;:][-o][)/(|]" # emoticons
|
||||||
|
color body brightcyan default "[;:][)(|]" # emoticons
|
||||||
|
color body brightcyan default "[ ][*][^*]*[*][ ]?" # more emoticon?
|
||||||
|
color body brightcyan default "[ ]?[*][^*]*[*][ ]" # more emoticon?
|
||||||
|
color body red default "(BAD signature)"
|
||||||
|
color body cyan default "(Good signature)"
|
||||||
|
color body brightblack default "^gpg: Good signature .*"
|
||||||
|
color body brightyellow default "^gpg: "
|
||||||
|
color body brightyellow red "^gpg: BAD signature from.*"
|
||||||
|
mono body bold "^gpg: Good signature"
|
||||||
|
mono body bold "^gpg: BAD signature from.*"
|
||||||
|
color body red default "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
|
||||||
|
|
||||||
|
set fast_reply # skip to compose when replying
|
||||||
|
set fcc_attach # save attachments with the body
|
||||||
|
set forward_quote # include message in forwards
|
||||||
|
set reverse_name # reply as whomever it was to
|
||||||
|
set include # include message in replies
|
||||||
|
set uncollapse_jump
|
||||||
|
set sort_re
|
||||||
|
set quit
|
||||||
|
set beep_new
|
||||||
|
'';
|
||||||
|
settings = {
|
||||||
|
# set mailcap_path = /usr/local/share/mutt-wizard/mailcap:$mailcap_path # todo
|
||||||
|
mime_type_query_command = ''"${pkgs.file}/bin/file --mime-type -b %s"'';
|
||||||
|
date_format = ''"%d.%m.%Y %H:%M"'';
|
||||||
|
index_format = ''"%2C %Z %?X?A& ? %D %-15.15F %s (%-4.4c)"'';
|
||||||
|
rfc2047_parameters = "yes";
|
||||||
|
sleep_time = "0"; # Pause 0 seconds for informational messages
|
||||||
|
markers = "no"; # Disables the `+` displayed at line wraps
|
||||||
|
mark_old = "no"; # Unread mail stay unread until read
|
||||||
|
mime_forward = "yes"; # attachments are forwarded with mail
|
||||||
|
wait_key = "no"; # mutt won't ask "press key to continue"
|
||||||
|
forward_format = ''"Fwd: %s"''; # format of subject when forwarding
|
||||||
|
status_chars = ''" *%A"'';
|
||||||
|
sort_aux = "reverse-last-date-received";
|
||||||
|
reply_regexp = ''"^(([Rr][Ee]?(\[[0-9]+\])?: *)?(\[[^]]+\] *)?)*"'';
|
||||||
|
quote_regexp = ''"^( {0,4}[>|:#%]| {0,4}[a-z0-9]+[>|]+)+"'';
|
||||||
|
send_charset = "utf-8:iso-8859-1:us-ascii";
|
||||||
|
charset = "utf-8";
|
||||||
|
arrow_cursor = "no"; # Change `color indicator` depending
|
||||||
|
};
|
||||||
|
binds = [
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "h";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "\\Cf";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "r";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "editor" ];
|
||||||
|
key = "<space>";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "i";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "g";
|
||||||
|
action = "noop";
|
||||||
|
}
|
||||||
|
|
||||||
|
# general rebindings
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "j";
|
||||||
|
action = "next-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "k";
|
||||||
|
action = "previous-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "G";
|
||||||
|
action = "last-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "gg";
|
||||||
|
action = "first-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "D";
|
||||||
|
action = "delete-message";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "U";
|
||||||
|
action = "undelete-message";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "L";
|
||||||
|
action = "limit";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "l";
|
||||||
|
action = "display-message";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "\\031";
|
||||||
|
action = "previous-undeleted";
|
||||||
|
} # Mouse wheel
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "\\005";
|
||||||
|
action = "next-undeleted";
|
||||||
|
} # Mouse wheel
|
||||||
|
{
|
||||||
|
map = [ "attach" ];
|
||||||
|
key = "<return>";
|
||||||
|
action = "view-mailcap";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "attach" ];
|
||||||
|
key = "l";
|
||||||
|
action = "view-mailcap";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "j";
|
||||||
|
action = "next-line";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "k";
|
||||||
|
action = "previous-line";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "l";
|
||||||
|
action = "view-attachments";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "\\031";
|
||||||
|
action = "previous-line";
|
||||||
|
} # Mouse wheel
|
||||||
|
{
|
||||||
|
map = [ "pager" ];
|
||||||
|
key = "\\005";
|
||||||
|
action = "next-line";
|
||||||
|
} # Mouse wheel
|
||||||
|
{
|
||||||
|
map = [ "editor" ];
|
||||||
|
key = "<Tab>";
|
||||||
|
action = "complete-query";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "browser" ];
|
||||||
|
key = "l";
|
||||||
|
action = "select-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "H";
|
||||||
|
action = "view-raw-message";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "S";
|
||||||
|
action = "sync-mailbox";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "R";
|
||||||
|
action = "group-reply";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "rg";
|
||||||
|
action = "group-reply";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "rr";
|
||||||
|
action = "reply";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "query" ];
|
||||||
|
key = "<space>";
|
||||||
|
action = "tag-entry";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" "browser" ];
|
||||||
|
key = "gg";
|
||||||
|
action = "top-page";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" "browser" ];
|
||||||
|
key = "G";
|
||||||
|
action = "bottom-page";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "pager" "attach" ];
|
||||||
|
key = "h";
|
||||||
|
action = "exit";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" "browser" ];
|
||||||
|
key = "d";
|
||||||
|
action = "half-down";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" "browser" ];
|
||||||
|
key = "u";
|
||||||
|
action = "half-up";
|
||||||
|
}
|
||||||
|
|
||||||
|
# sidebar mappings
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\Ck";
|
||||||
|
action = "sidebar-prev";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\Cj";
|
||||||
|
action = "sidebar-next";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\Co";
|
||||||
|
action = "sidebar-open";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\Cp";
|
||||||
|
action = "sidebar-prev-new";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\Cn";
|
||||||
|
action = "sidebar-next-new";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "B";
|
||||||
|
action = "sidebar-toggle-visible";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
macros = [
|
||||||
|
{
|
||||||
|
map = [ "browser" ];
|
||||||
|
key = "h";
|
||||||
|
action = "<change-dir><kill-line>..<enter>";
|
||||||
|
} # go to parent folder
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "\\Cr";
|
||||||
|
action = "T~U<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>";
|
||||||
|
} # mark all messages as read
|
||||||
|
{
|
||||||
|
map = [ "index" ];
|
||||||
|
key = "A";
|
||||||
|
action = "<limit>all\\n";
|
||||||
|
} # show all messages (undo limit)
|
||||||
|
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "\\cb";
|
||||||
|
action = "<pipe-message> ${pkgs.urlscan}/bin/urlscan<Enter>";
|
||||||
|
} # call urlscan to extract URLs out of a message"
|
||||||
|
{
|
||||||
|
map = [ "attach" "compose" ];
|
||||||
|
key = "\\cb";
|
||||||
|
action = "<pipe-entry> ${pkgs.urlscan}/bin/urlscan<Enter>";
|
||||||
|
} # call urlscan to extract URLs out of a message
|
||||||
|
{
|
||||||
|
map = [ "index" "pager" ];
|
||||||
|
key = "A";
|
||||||
|
action = "<pipe-message>${pkgs.khard}/bin/khard add-email<return>";
|
||||||
|
} # add the sender email address to khard
|
||||||
|
|
||||||
|
] ++ [
|
||||||
|
(switchAccountMacro "1" "rilla@monotremata.xyz")
|
||||||
|
(switchAccountMacro "2" "r.illa.pujagut@gmail.com")
|
||||||
|
(switchAccountMacro "3" "ricard@trkkn.com")
|
||||||
|
(switchAccountMacro "4" "accounts@monotremata.xyz")
|
||||||
|
(switchAccountMacro "5" "admin@monotremata.xyz")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
#programs.notmuch = {
|
||||||
|
# enable = true;
|
||||||
|
# new = {
|
||||||
|
# tags = ["unread" "inbox"];
|
||||||
|
# };
|
||||||
|
#};
|
||||||
|
|
||||||
|
programs.mbsync.enable = true;
|
||||||
|
programs.msmtp.enable = true;
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let mailsync = pkgs.callPackage ./mailsync.nix { inherit config pkgs; };
|
||||||
|
in {
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ mailsync pkgs.urlscan pkgs.abook ];
|
||||||
|
programs.neomutt.settings.query_command =
|
||||||
|
''"${pkgs.abook}/bin/abook --mutt-query '%s'"'';
|
||||||
|
programs.alot.enable = true;
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let mailsync = pkgs.callPackage ./mailsync_macos.nix { inherit config pkgs; };
|
||||||
|
in {
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ mailsync pkgs.urlscan ];
|
||||||
|
programs.alot.enable = false;
|
||||||
|
}
|
|
@ -0,0 +1,132 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
shell = "${pkgs.dash}/bin/dash";
|
||||||
|
pidof = "${pkgs.procps}/bin/pidof";
|
||||||
|
pgrep = "${pkgs.procps}/bin/pgrep";
|
||||||
|
grep = "${pkgs.gnugrep}/bin/grep";
|
||||||
|
sed = "${pkgs.gnused}/bin/sed";
|
||||||
|
awk = "${pkgs.gawk}/bin/awk";
|
||||||
|
perl = "${pkgs.perl}/bin/perl";
|
||||||
|
find = "${pkgs.findutils}/bin/find";
|
||||||
|
notifySend = "${pkgs.libnotify}/bin/notify-send";
|
||||||
|
notmuch = "${pkgs.notmuch}/bin/notmuch";
|
||||||
|
head = "${pkgs.coreutils}/bin/head";
|
||||||
|
touch = "${pkgs.coreutils}/bin/touch";
|
||||||
|
tr = "${pkgs.coreutils}/bin/tr";
|
||||||
|
|
||||||
|
mbsyncrc = "${config.home.homeDirectory}/.mbsyncrc";
|
||||||
|
mbsync = "${pkgs.isync}/bin/mbsync -c ${mbsyncrc}";
|
||||||
|
|
||||||
|
maildir = "${config.home.homeDirectory}/Maildir";
|
||||||
|
passwordStoreDir = "${config.home.homeDirectory}/.password-store";
|
||||||
|
notmuchConfig = "${config.home.homeDirectory}/.notmuch-config";
|
||||||
|
gnupghome = "${config.home.homeDirectory}/.gnupg";
|
||||||
|
lastrun = "${config.home.homeDirectory}/.mailsynclastrun";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "mailsync" ''
|
||||||
|
#!${shell}
|
||||||
|
|
||||||
|
# Run only if not already running in other instance
|
||||||
|
${pidof} mbsync >/dev/null && {
|
||||||
|
echo "mbsync is already running."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
export PASSWORD_STORE_DIR="${passwordStoreDir}"
|
||||||
|
export NOTMUCH_CONFIG="${notmuchConfig}"
|
||||||
|
export GNUPGHOME="${gnupghome}"
|
||||||
|
export GPG_TTY=$TTY
|
||||||
|
|
||||||
|
notify() {
|
||||||
|
pgrepoutput="$(${pgrep} -a X\(org\|wayland\))"
|
||||||
|
displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)"
|
||||||
|
[ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do
|
||||||
|
export DISPLAY=$x
|
||||||
|
${notifySend} \
|
||||||
|
--app-name="email" \
|
||||||
|
"email" \
|
||||||
|
"📬 $2 new mail(s) in \`$1\` account."
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
messageinfo() {
|
||||||
|
from="$1"
|
||||||
|
subject="$2"
|
||||||
|
pgrepoutput="$(${pgrep} -a X\(org\|wayland\))"
|
||||||
|
displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)"
|
||||||
|
[ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do
|
||||||
|
export DISPLAY=$x
|
||||||
|
${notifySend} \
|
||||||
|
--app-name="email" \
|
||||||
|
"📧$from:" \
|
||||||
|
"$subject"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check account for new mail. Notify if there is new content.
|
||||||
|
syncandnotify() {
|
||||||
|
accounts="$1"
|
||||||
|
acc="$(echo "$account" | ${sed} "s/.*\///")"
|
||||||
|
if [ -z "$opts" ]; then
|
||||||
|
${mbsync} "$acc"
|
||||||
|
else
|
||||||
|
${mbsync} "$opts" "$acc"
|
||||||
|
fi
|
||||||
|
new=$(
|
||||||
|
${find} \
|
||||||
|
"${maildir}/$acc/INBOX/new/" \
|
||||||
|
"${maildir}/$acc/Inbox/new/" \
|
||||||
|
"${maildir}/mail/$acc/inbox/new/" \
|
||||||
|
-type f \
|
||||||
|
-newer "${lastrun}" \
|
||||||
|
2> /dev/null
|
||||||
|
)
|
||||||
|
newcount=$(echo "$new" | ${sed} '/^\s*$/d' | wc -l)
|
||||||
|
if [ "$newcount" -gt 5 ]; then
|
||||||
|
notify "$acc" "$newcount"
|
||||||
|
elif [ "$newcount" -gt 0 ]; then
|
||||||
|
for file in $new; do
|
||||||
|
# Extract subject and sender from mail.
|
||||||
|
from=$(
|
||||||
|
${awk} '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | \
|
||||||
|
${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \
|
||||||
|
${awk} '{ $1=""; if (NF>=3)$NF=""; print $0 }' | \
|
||||||
|
${sed} 's/^[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//'
|
||||||
|
)
|
||||||
|
subject=$(
|
||||||
|
${awk} '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | \
|
||||||
|
${head} -n 1 | ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \
|
||||||
|
${sed} 's/^Subject: //' | \
|
||||||
|
${sed} 's/^{[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//' | \
|
||||||
|
${tr} -d '\n'
|
||||||
|
)
|
||||||
|
messageinfo "$from" "$subject" &
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sync accounts passed as argument or all.
|
||||||
|
if [ "$#" -eq "0" ]; then
|
||||||
|
accounts="$(${awk} '/^Channel/ {print $2}' "${mbsyncrc}")"
|
||||||
|
else
|
||||||
|
for arg in "$@"; do
|
||||||
|
[ "''${arg%''${arg#?}}" = '-' ] && \
|
||||||
|
opts="''${opts:+''${opts} }''${arg}" && \
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
accounts=$*
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parallelize multiple accounts
|
||||||
|
for account in $accounts; do
|
||||||
|
syncandnotify "''${account}" &
|
||||||
|
done
|
||||||
|
|
||||||
|
wait
|
||||||
|
|
||||||
|
${notmuch} new 2>/dev/null
|
||||||
|
|
||||||
|
#Create a touch file that indicates the time of the last run of mailsync
|
||||||
|
${touch} "${lastrun}"
|
||||||
|
''
|
|
@ -0,0 +1,132 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
shell = "${pkgs.dash}/bin/dash";
|
||||||
|
pidof = "${pkgs.procps}/bin/pidof";
|
||||||
|
pgrep = "${pkgs.procps}/bin/pgrep";
|
||||||
|
grep = "${pkgs.gnugrep}/bin/grep";
|
||||||
|
sed = "${pkgs.gnused}/bin/sed";
|
||||||
|
awk = "${pkgs.gawk}/bin/awk";
|
||||||
|
perl = "${pkgs.perl}/bin/perl";
|
||||||
|
find = "${pkgs.findutils}/bin/find";
|
||||||
|
notifySend = "${pkgs.libnotify}/bin/notify-send";
|
||||||
|
notmuch = "${pkgs.notmuch}/bin/notmuch";
|
||||||
|
head = "${pkgs.coreutils}/bin/head";
|
||||||
|
touch = "${pkgs.coreutils}/bin/touch";
|
||||||
|
tr = "${pkgs.coreutils}/bin/tr";
|
||||||
|
|
||||||
|
mbsyncrc = "${config.home.homeDirectory}/.mbsyncrc";
|
||||||
|
mbsync = "${pkgs.isync}/bin/mbsync -c ${mbsyncrc}";
|
||||||
|
|
||||||
|
maildir = "${config.home.homeDirectory}/Maildir";
|
||||||
|
passwordStoreDir = "${config.home.homeDirectory}/.password-store";
|
||||||
|
notmuchConfig = "${config.home.homeDirectory}/.notmuch-config";
|
||||||
|
gnupghome = "${config.home.homeDirectory}/.gnupg";
|
||||||
|
lastrun = "${config.home.homeDirectory}/.mailsynclastrun";
|
||||||
|
in
|
||||||
|
pkgs.writeScriptBin "mailsync" ''
|
||||||
|
#!${shell}
|
||||||
|
|
||||||
|
# Run only if not already running in other instance
|
||||||
|
${pidof} mbsync >/dev/null && {
|
||||||
|
echo "mbsync is already running."
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
export PASSWORD_STORE_DIR="${passwordStoreDir}"
|
||||||
|
export NOTMUCH_CONFIG="${notmuchConfig}"
|
||||||
|
export GNUPGHOME="${gnupghome}"
|
||||||
|
export GPG_TTY=$TTY
|
||||||
|
|
||||||
|
notify() {
|
||||||
|
pgrepoutput="$(${pgrep} -a X\(org\|wayland\))"
|
||||||
|
displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)"
|
||||||
|
[ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do
|
||||||
|
export DISPLAY=$x
|
||||||
|
${notifySend} \
|
||||||
|
--app-name="email" \
|
||||||
|
"email" \
|
||||||
|
"📬 $2 new mail(s) in \`$1\` account."
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
messageinfo() {
|
||||||
|
from="$1"
|
||||||
|
subject="$2"
|
||||||
|
pgrepoutput="$(${pgrep} -a X\(org\|wayland\))"
|
||||||
|
displays="$(echo "$pgrepoutput" | ${grep} -wo "[0-9]*:[0-9]\+" | sort -u)"
|
||||||
|
[ -n "$pgrepoutput" ] && for x in ''${displays:-0:}; do
|
||||||
|
export DISPLAY=$x
|
||||||
|
${notifySend} \
|
||||||
|
--app-name="email" \
|
||||||
|
"📧$from:" \
|
||||||
|
"$subject"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check account for new mail. Notify if there is new content.
|
||||||
|
syncandnotify() {
|
||||||
|
accounts="$1"
|
||||||
|
acc="$(echo "$account" | ${sed} "s/.*\///")"
|
||||||
|
if [ -z "$opts" ]; then
|
||||||
|
${mbsync} "$acc"
|
||||||
|
else
|
||||||
|
${mbsync} "$opts" "$acc"
|
||||||
|
fi
|
||||||
|
new=$(
|
||||||
|
${find} \
|
||||||
|
"${maildir}/$acc/INBOX/new/" \
|
||||||
|
"${maildir}/$acc/Inbox/new/" \
|
||||||
|
"${maildir}/mail/$acc/inbox/new/" \
|
||||||
|
-type f \
|
||||||
|
-newer "${lastrun}" \
|
||||||
|
2> /dev/null
|
||||||
|
)
|
||||||
|
newcount=$(echo "$new" | ${sed} '/^\s*$/d' | wc -l)
|
||||||
|
if [ "$newcount" -gt 5 ]; then
|
||||||
|
notify "$acc" "$newcount"
|
||||||
|
elif [ "$newcount" -gt 0 ]; then
|
||||||
|
for file in $new; do
|
||||||
|
# Extract subject and sender from mail.
|
||||||
|
from=$(
|
||||||
|
${awk} '/^From: / && ++n ==1,/^\<.*\>:/' "$file" | \
|
||||||
|
${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \
|
||||||
|
${awk} '{ $1=""; if (NF>=3)$NF=""; print $0 }' | \
|
||||||
|
${sed} 's/^[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//'
|
||||||
|
)
|
||||||
|
subject=$(
|
||||||
|
${awk} '/^Subject: / && ++n == 1,/^\<.*\>: / && ++i == 2' "$file" | \
|
||||||
|
${head} -n 1 | ${perl} -CS -MEncode -ne 'print decode("MIME-Header", $_)' | \
|
||||||
|
${sed} 's/^Subject: //' | \
|
||||||
|
${sed} 's/^{[[:blank:]]*[\"'\''\'''\'\<]*//;s/[\"'\''\'''\'\>]*[[:blank:]]*$//' | \
|
||||||
|
${tr} -d '\n'
|
||||||
|
)
|
||||||
|
messageinfo "$from" "$subject" &
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sync accounts passed as argument or all.
|
||||||
|
if [ "$#" -eq "0" ]; then
|
||||||
|
accounts="$(${awk} '/^Channel/ {print $2}' "${mbsyncrc}")"
|
||||||
|
else
|
||||||
|
for arg in "$@"; do
|
||||||
|
[ "''${arg%''${arg#?}}" = '-' ] && \
|
||||||
|
opts="''${opts:+''${opts} }''${arg}" && \
|
||||||
|
shift 1
|
||||||
|
done
|
||||||
|
accounts=$*
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parallelize multiple accounts
|
||||||
|
for account in $accounts; do
|
||||||
|
syncandnotify "''${account}" &
|
||||||
|
done
|
||||||
|
|
||||||
|
wait
|
||||||
|
|
||||||
|
${notmuch} new 2>/dev/null
|
||||||
|
|
||||||
|
#Create a touch file that indicates the time of the last run of mailsync
|
||||||
|
${touch} "${lastrun}"
|
||||||
|
''
|
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
pkgs ? import <nixpkgs> {},
|
||||||
|
stdenv ? pkgs.stdenv,
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "atracdenc";
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "dcherednik";
|
||||||
|
repo = "atracdenc";
|
||||||
|
rev = "62ced878b526d49e5ef6ad42ca2eb7efc874867a";
|
||||||
|
sha256 = "1azjs0sbd5yc505ky2rf7l9m0lci6fkixazd85rdb8n678da5dfz";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.gnumake
|
||||||
|
pkgs.cmake
|
||||||
|
pkgs.libsndfile
|
||||||
|
];
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
mkdir src/build
|
||||||
|
cd src/build
|
||||||
|
cmake ../
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
make
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
mv atracdenc $out/bin
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
atracdenc = pkgs.callPackage ./atracdenc.nix {};
|
||||||
|
linux-minidisc = pkgs.libsForQt5.callPackage ./linux-minidisc.nix {};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
pkgs.ffmpeg
|
||||||
|
atracdenc
|
||||||
|
linux-minidisc
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
{ pkgs, stdenv, lib, qtbase, wrapQtAppsHook }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "linux-minidisc";
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "linux-minidisc";
|
||||||
|
repo = "linux-minidisc";
|
||||||
|
rev = "0aa2c4eeb2c3f136f1cd039e2818837812cf8891";
|
||||||
|
sha256 = "140hvg55hdwp5j3qcrsazy4vf29qb3k4lnkm453bmykspn8ylbv2";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ wrapQtAppsHook ];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.glib
|
||||||
|
pkgs.libgcrypt
|
||||||
|
pkgs.libid3tag
|
||||||
|
pkgs.libmad
|
||||||
|
pkgs.libsForQt5.full
|
||||||
|
pkgs.libusb1
|
||||||
|
pkgs.pkg-config
|
||||||
|
pkgs.taglib
|
||||||
|
];
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
qmake
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
make
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p "$out/bin"
|
||||||
|
mv netmdcli/netmdcli "$out/bin"
|
||||||
|
mv himdcli/himdcli "$out/bin"
|
||||||
|
mv qhimdtransfer/qhimdtransfer "$out/bin"
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [ pkgs.mpc_cli ];
|
||||||
|
|
||||||
|
programs.ncmpcpp = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.ncmpcpp.override { visualizerSupport = true; };
|
||||||
|
bindings = [
|
||||||
|
{ key = "+"; command = "show_clock"; }
|
||||||
|
{ key = "="; command = "volume_up"; }
|
||||||
|
{ key = "j"; command = "scroll_down"; }
|
||||||
|
{ key = "k"; command = "scroll_up"; }
|
||||||
|
{ key = "h"; command = "previous_column"; }
|
||||||
|
{ key = "l"; command = "next_column"; }
|
||||||
|
{ key = "."; command = "show_lyrics"; }
|
||||||
|
{ key = "n"; command = "next_found_item"; }
|
||||||
|
{ key = "N"; command = "previous_found_item"; }
|
||||||
|
{ key = "J"; command = "move_sort_order_down"; }
|
||||||
|
{ key = "K"; command = "move_sort_order_up"; }
|
||||||
|
{ key = "ctrl-u"; command = "page_up"; }
|
||||||
|
{ key = "ctrl-d"; command = "page_down"; }
|
||||||
|
];
|
||||||
|
mpdMusicDir = "${config.home.homeDirectory}/music";
|
||||||
|
settings = {
|
||||||
|
autocenter_mode = "yes";
|
||||||
|
follow_now_playing_lyrics = "yes";
|
||||||
|
ignore_leading_the = "yes";
|
||||||
|
ignore_diacritics = "yes";
|
||||||
|
default_place_to_search_in = "database";
|
||||||
|
|
||||||
|
user_interface = "alternative";
|
||||||
|
alternative_header_first_line_format = "$0$aqqu$/a {$6%a$9 - }{$3%t$9}|{$3%f$9} $0$atqq$/a$9";
|
||||||
|
alternative_header_second_line_format = "{{$4%b$9}{ [$8%y$9]}}|{$4%D$9}";
|
||||||
|
|
||||||
|
song_status_format = " $6%a $7| $3%t $7| $4%b ";
|
||||||
|
|
||||||
|
colors_enabled = "yes";
|
||||||
|
main_window_color = "white";
|
||||||
|
header_window_color = "cyan";
|
||||||
|
volume_color = "green";
|
||||||
|
statusbar_color = "white";
|
||||||
|
progressbar_color = "cyan";
|
||||||
|
progressbar_elapsed_color = "white";
|
||||||
|
|
||||||
|
playlist_editor_display_mode = "columns";
|
||||||
|
search_engine_display_mode = "columns";
|
||||||
|
browser_display_mode = "columns";
|
||||||
|
playlist_display_mode = "columns";
|
||||||
|
|
||||||
|
song_columns_list_format = "(10)[blue]{l} (30)[green]{t} (30)[magenta]{a} (30)[yellow]{b}";
|
||||||
|
song_list_format = "{$7%a - $9}{$5%t$9}|{$5%f$9}$R{$6%b $9}{$3%l$9}";
|
||||||
|
|
||||||
|
progressbar_look = "═❯─";
|
||||||
|
|
||||||
|
current_item_prefix = "$(blue)$r";
|
||||||
|
current_item_suffix = "$/r$(end)";
|
||||||
|
current_item_inactive_column_prefix = "$(cyan)$r";
|
||||||
|
|
||||||
|
now_playing_prefix = "❯ ";
|
||||||
|
centered_cursor = "yes";
|
||||||
|
|
||||||
|
selected_item_prefix = "* ";
|
||||||
|
discard_colors_if_item_is_selected = "yes";
|
||||||
|
|
||||||
|
display_bitrate = "yes";
|
||||||
|
enable_window_title = "yes";
|
||||||
|
empty_tag_marker = "";
|
||||||
|
|
||||||
|
visualizer_data_source = "/tmp/mpd.fifo";
|
||||||
|
visualizer_output_name = "my_fifo";
|
||||||
|
visualizer_type = "spectrum";
|
||||||
|
visualizer_in_stereo = "yes";
|
||||||
|
visualizer_look = "◆▋";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ pkgs.mpc_cli ];
|
||||||
|
services.mpd = {
|
||||||
|
enable = true;
|
||||||
|
musicDirectory = "${config.home.homeDirectory}/music";
|
||||||
|
network = {
|
||||||
|
listenAddress = "any";
|
||||||
|
port = 6600;
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
audio_output {
|
||||||
|
type "pipewire"
|
||||||
|
name "pipewire audio"
|
||||||
|
}
|
||||||
|
audio_output {
|
||||||
|
type "fifo"
|
||||||
|
name "my_fifo"
|
||||||
|
path "/tmp/mpd.fifo"
|
||||||
|
format "44100:16:2"
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
musicDir = "${config.home.homeDirectory}/shared/music";
|
||||||
|
mpdDir = "${config.home.homeDirectory}/.mpd";
|
||||||
|
in {
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
home.packages = [ pkgs.mpc_cli ];
|
||||||
|
home.file.".mpd/mpd.conf".text = ''
|
||||||
|
music_directory "${musicDir}"
|
||||||
|
playlist_directory "${mpdDir}/playlists"
|
||||||
|
db_file "${mpdDir}/mpd.db"
|
||||||
|
log_file "${mpdDir}/mpd.log"
|
||||||
|
pid_file "${mpdDir}/mpd.pid"
|
||||||
|
state_file "${mpdDir}/mpdstate"
|
||||||
|
auto_update "yes"
|
||||||
|
auto_update_depth "2"
|
||||||
|
follow_outside_symlinks "yes"
|
||||||
|
follow_inside_symlinks "yes"
|
||||||
|
|
||||||
|
audio_output {
|
||||||
|
type "osx"
|
||||||
|
name "CoreAudio"
|
||||||
|
mixer_type "software"
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder {
|
||||||
|
plugin "mp4ff"
|
||||||
|
enabled "no"
|
||||||
|
}
|
||||||
|
|
||||||
|
bind_to_address "0.0.0.0"
|
||||||
|
port "6600"
|
||||||
|
user "rilla"
|
||||||
|
|
||||||
|
# Visualizer
|
||||||
|
audio_output {
|
||||||
|
type "fifo"
|
||||||
|
name "my_fifo"
|
||||||
|
path "/tmp/mpd.fifo"
|
||||||
|
format "44100:16:2"
|
||||||
|
auto_resample "no"
|
||||||
|
use_mmap "yes"
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
pkgs.dino
|
||||||
|
pkgs.element-desktop
|
||||||
|
pkgs.ferdi
|
||||||
|
pkgs.profanity
|
||||||
|
pkgs.signal-desktop
|
||||||
|
pkgs.tdesktop
|
||||||
|
pkgs.whatsapp-for-linux
|
||||||
|
];
|
||||||
|
home.file.".local/share/applications/userapp-Telegram Desktop.desktop".text =
|
||||||
|
''
|
||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Version=1.0
|
||||||
|
Type=Application
|
||||||
|
NoDisplay=true
|
||||||
|
Exec=${pkgs.tdesktop}/bin/bin/.telegram-desktop-wrapped -workdir ${config.home.homeDirectory}/.local/share/TelegramDesktop/ -- %u
|
||||||
|
Name=Telegram Desktop
|
||||||
|
Comment=Custom definition for Telegram Desktop
|
||||||
|
'';
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = [
|
||||||
|
pkgs.ardour
|
||||||
|
pkgs.hydrogen
|
||||||
|
pkgs.lmms
|
||||||
|
pkgs.tenacity
|
||||||
|
];
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [ black jq sqlfluff nixfmt shfmt ];
|
||||||
|
programs.neovim = {
|
||||||
|
enable = true;
|
||||||
|
viAlias = true;
|
||||||
|
vimAlias = true;
|
||||||
|
vimdiffAlias = true;
|
||||||
|
withPython3 = true;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [ ./common.nix ];
|
||||||
|
programs.neovim = {
|
||||||
|
plugins = with pkgs.vimPlugins;
|
||||||
|
# find sha256 with:
|
||||||
|
# nix-prefetch-url --unpack https://github.com/${owner}/${repo}/archive/${rev}.tar.gz
|
||||||
|
let
|
||||||
|
nerdfont-vim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "nerdfont-vim";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "nerdfont.vim";
|
||||||
|
rev = "5f484cf638ca31fc9db95b33b92bf5aa4b2d1270";
|
||||||
|
sha256 = "01lfqlsbs1192v0kydz98qypbvl6h3vkjjj5cl6zcadq52macl5s";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/lambdalisue/nerdfont.vim";
|
||||||
|
};
|
||||||
|
fern-renderer-nerdfont = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "fern-renderer-nerdfont";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "fern-renderer-nerdfont.vim";
|
||||||
|
rev = "942be10bda577ba4840c4a939200f05024b8603c";
|
||||||
|
sha256 = "0nz5ycs9r9w0in3jjmcm121ik3jggj4mj3r88fmk8bw1jwl1hffm";
|
||||||
|
};
|
||||||
|
meta.homepage =
|
||||||
|
"https://github.com/lambdalisue/fern-renderer-nerdfont.vim";
|
||||||
|
};
|
||||||
|
glyph-palette = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "glyph-palette";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "glyph-palette.vim";
|
||||||
|
rev = "a8ecb59733d8b4a2f45fdbcabf5174fdee18c4ec";
|
||||||
|
sha256 = "0pzlwiyvrp994f5d9sw2vymdi1s5x7ywvwm0n4vmv3i9q9yyhxja";
|
||||||
|
};
|
||||||
|
meta.homepage =
|
||||||
|
"https://github.com/lambdalisue/fern-renderer-nerdfont.vim";
|
||||||
|
};
|
||||||
|
fern-git-status = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "fern-git-status";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "fern-git-status.vim";
|
||||||
|
rev = "151336335d3b6975153dad77e60049ca7111da8e";
|
||||||
|
sha256 = "1iqd035psn953v162didqd72cb7f0n7w34c2qsf15qkyq3y97pzl";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/lambdalisue/fern-git-status.vim";
|
||||||
|
};
|
||||||
|
fern-mapping-git = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "fern-mapping-git";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "fern-mapping-git.vim";
|
||||||
|
rev = "df5e7466df8596c95dd355d49a72893018919cf1";
|
||||||
|
sha256 = "1lhppbydg9wlc520042k6bqvwblvmr7xx0w44s2xwbwbffj6hjz3";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/lambdalisue/fern-mapping-git.vim";
|
||||||
|
};
|
||||||
|
fern-hijack = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "fern-hijack";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "lambdalisue";
|
||||||
|
repo = "fern-hijack.vim";
|
||||||
|
rev = "24daa61d69b878947946e84a7711f8b58eae0f50";
|
||||||
|
sha256 = "1z8zracqk52rar6wra7n1hlvfa1xqks1x0np7rs1aq9g7d02d6wg";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/lambdalisue/fern-hijack.vim";
|
||||||
|
};
|
||||||
|
black-vim = pkgs.vimUtils.buildVimPlugin {
|
||||||
|
pname = "black-vim";
|
||||||
|
version = "git";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "psf";
|
||||||
|
repo = "black";
|
||||||
|
rev = "f1d4e742c91dd5179d742b0db9293c4472b765f8";
|
||||||
|
sha256 = "124a76cpl3xx9v2kbcprsajr149f93nib4hgacqii798m3mzm1x9";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/psf/black";
|
||||||
|
};
|
||||||
|
|
||||||
|
in [ # nix-env -f '<nixpkgs>' -qaP -A vimPlugins
|
||||||
|
gitgutter
|
||||||
|
fugitive
|
||||||
|
vim-markdown
|
||||||
|
sensible
|
||||||
|
vim-unimpaired
|
||||||
|
vim-css-color
|
||||||
|
easymotion
|
||||||
|
vim-slime
|
||||||
|
rainbow
|
||||||
|
vim-jinja
|
||||||
|
gruvbox-community
|
||||||
|
deoplete-nvim
|
||||||
|
nerdcommenter
|
||||||
|
goyo
|
||||||
|
limelight-vim
|
||||||
|
fzf-vim
|
||||||
|
todo-txt-vim
|
||||||
|
airline
|
||||||
|
vim-airline-themes
|
||||||
|
vimwiki
|
||||||
|
vim-ledger
|
||||||
|
fern-vim
|
||||||
|
FixCursorHold-nvim
|
||||||
|
indentLine
|
||||||
|
tmux-navigator
|
||||||
|
neomake
|
||||||
|
ale
|
||||||
|
neoformat
|
||||||
|
vim-smoothie
|
||||||
|
ultisnips
|
||||||
|
vim-snippets
|
||||||
|
vim-nix
|
||||||
|
vim-terraform
|
||||||
|
|
||||||
|
nerdfont-vim
|
||||||
|
fern-renderer-nerdfont
|
||||||
|
glyph-palette
|
||||||
|
fern-git-status
|
||||||
|
fern-mapping-git
|
||||||
|
fern-hijack
|
||||||
|
black-vim
|
||||||
|
];
|
||||||
|
extraConfig = builtins.readFile ./init.vim;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,230 @@
|
||||||
|
set nowrap
|
||||||
|
set nocompatible
|
||||||
|
syntax enable
|
||||||
|
filetype plugin on
|
||||||
|
set number
|
||||||
|
set mouse=a " mouse support
|
||||||
|
set showcmd " show incomplete cmds down the bottom
|
||||||
|
set showmode " show current mode
|
||||||
|
set visualbell " no sounds
|
||||||
|
set autoread " reload files changed outside vim
|
||||||
|
"set gcr=a:blinkon0 " disable cursor blink
|
||||||
|
set backspace=indent,eol,start " allow backspacing over everything in insert
|
||||||
|
mode
|
||||||
|
set shiftround " use multiple of shiftwidth when indenting with '<' and '>'
|
||||||
|
set showmatch " set show matching parenthesis
|
||||||
|
set ignorecase " ignore case when searching
|
||||||
|
set smartcase " ignore case if search pattern is all lowercase, case-sensitive otherwise
|
||||||
|
set smarttab " insert tabs on the start of a line according to shiftwidth, not tabstop
|
||||||
|
set hlsearch " highlight search terms
|
||||||
|
set incsearch " show search matches as you type
|
||||||
|
set hidden
|
||||||
|
set ruler
|
||||||
|
set clipboard=unnamed " system clipboard
|
||||||
|
set list listchars=tab:\ \ ,trail:· " display tabs and trailing spaces visually
|
||||||
|
set colorcolumn=80
|
||||||
|
|
||||||
|
set splitbelow
|
||||||
|
set splitright
|
||||||
|
nmap <A-r> <C-w>r
|
||||||
|
|
||||||
|
let mapleader=","
|
||||||
|
let maplocalleader="\\"
|
||||||
|
|
||||||
|
" use alt-x to go to a specific tab
|
||||||
|
nnoremap <A-1> 1gt
|
||||||
|
nnoremap <A-2> 2gt
|
||||||
|
nnoremap <A-3> 3gt
|
||||||
|
nnoremap <A-4> 4gt
|
||||||
|
nnoremap <A-5> 5gt
|
||||||
|
nnoremap <A-6> 6gt
|
||||||
|
nnoremap <A-7> 7gt
|
||||||
|
nnoremap <A-8> 8gt
|
||||||
|
nnoremap <A-9> :tablast<cr>
|
||||||
|
|
||||||
|
" clean highlights when C-l
|
||||||
|
nnoremap <silent> <C-l> :nohl<CR><C-l>
|
||||||
|
|
||||||
|
" HIGHLIGHT LINE WHEN IN INSERT MODE
|
||||||
|
hi CursorLine cterm=NONE,underline ctermbg=NONE
|
||||||
|
set timeoutlen=1000 ttimeoutlen=0 " eliminate annoying delay
|
||||||
|
autocmd InsertEnter * :set cursorline
|
||||||
|
autocmd InsertLeave * :set nocursorline
|
||||||
|
|
||||||
|
" INDENTATION:
|
||||||
|
filetype indent on
|
||||||
|
set softtabstop=4
|
||||||
|
set expandtab
|
||||||
|
set shiftwidth=4 " number of spaces to use for autoindenting
|
||||||
|
set tabstop=4 " a tab is four spaces
|
||||||
|
set autoindent " always set autoindenting on
|
||||||
|
set copyindent " copy the previous indentation on autoindenting
|
||||||
|
|
||||||
|
" TAG JUMPING:
|
||||||
|
command! MakeTags !ctags -R .
|
||||||
|
" - ^] to jump to tag under cursor
|
||||||
|
" - g^] for ambiguous tags
|
||||||
|
" - ^t to jump back up the tag stack
|
||||||
|
|
||||||
|
" TURN OF SWAP FILES:
|
||||||
|
set noswapfile
|
||||||
|
set nobackup
|
||||||
|
set nowb
|
||||||
|
|
||||||
|
"FOLDS:
|
||||||
|
set foldmethod=indent " fold based on indent
|
||||||
|
set foldnestmax=3 " deepest fold is 3 levels
|
||||||
|
set nofoldenable " don't fold by default
|
||||||
|
|
||||||
|
" FINDING FILES:
|
||||||
|
set path+=**
|
||||||
|
set wildmenu
|
||||||
|
" - Hit tab to find for partial match
|
||||||
|
" - Use * to make it fuzzy
|
||||||
|
|
||||||
|
let g:markdown_syntax_conceal = 0
|
||||||
|
|
||||||
|
set updatetime=100 " reduce vim update time so magke gitgutter more responsive
|
||||||
|
|
||||||
|
set termguicolors
|
||||||
|
|
||||||
|
"set fillchars+=vert:\ " cleaner vertical line
|
||||||
|
|
||||||
|
"let g:gruvbox_contrast_dark="hard"
|
||||||
|
"let g:gruvbox_contrast_light="hard"
|
||||||
|
"let g:gruvbox_italic=1
|
||||||
|
"let g:gruvbox_invert_indent_guides=1
|
||||||
|
"let g:gruvbox_vert_split='bg1'
|
||||||
|
|
||||||
|
let g:gruvbox_contrast_dark="hard"
|
||||||
|
set background=dark
|
||||||
|
colorscheme gruvbox
|
||||||
|
|
||||||
|
let g:fern#renderer = "nerdfont"
|
||||||
|
|
||||||
|
function! s:init_fern() abort
|
||||||
|
nmap <buffer> T <Plug>(fern-action-open:tab)
|
||||||
|
nmap <buffer> S <Plug>(fern-action-open:split)
|
||||||
|
nmap <buffer> V <Plug>(fern-action-open:vsplit)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
augroup fern-custom
|
||||||
|
autocmd! *
|
||||||
|
autocmd FileType fern call s:init_fern()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
augroup my-glyph-palette
|
||||||
|
autocmd! *
|
||||||
|
autocmd FileType fern call glyph_palette#apply()
|
||||||
|
autocmd FileType nerdtree,startify call glyph_palette#apply()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
nnoremap <leader>t :Fern . -drawer -toggle<cr>
|
||||||
|
nnoremap <leader>f :Files<cr>
|
||||||
|
nnoremap <leader>rg :Rg<cr>
|
||||||
|
nnoremap <leader><Bs> :cd ..<cr>
|
||||||
|
nnoremap <Leader>b :Buffers<cr>
|
||||||
|
|
||||||
|
"let g:NERDTreeIndicatorMapCustom = {
|
||||||
|
"\ "Modified" : "✹",
|
||||||
|
"\ "Staged" : "✚",
|
||||||
|
"\ "Untracked" : "✭",
|
||||||
|
"\ "Renamed" : "➜",
|
||||||
|
"\ "Unmerged" : "═",
|
||||||
|
"\ "Deleted" : "✖",
|
||||||
|
"\ "Dirty" : "✗",
|
||||||
|
"\ "Clean" : "✔︎",
|
||||||
|
"\ 'Ignored' : '☒',
|
||||||
|
"\ "Unknown" : "?"
|
||||||
|
"\ }
|
||||||
|
|
||||||
|
let g:indentLine_char = '▏'
|
||||||
|
"let g:indentLine_color_term = 2854
|
||||||
|
|
||||||
|
let g:indentLine_setConceal = 0
|
||||||
|
"let g:indentLine_concealcursor=""
|
||||||
|
|
||||||
|
let g:slime_target="tmux"
|
||||||
|
let g:slime_python_ipython=1
|
||||||
|
|
||||||
|
let g:tmux_navigator_no_mappings = 1
|
||||||
|
|
||||||
|
nnoremap <silent> <A-h> :TmuxNavigateLeft<cr>
|
||||||
|
nnoremap <silent> <A-j> :TmuxNavigateDown<cr>
|
||||||
|
nnoremap <silent> <A-k> :TmuxNavigateUp<cr>
|
||||||
|
nnoremap <silent> <A-l> :TmuxNavigateRight<cr>
|
||||||
|
|
||||||
|
"let g:lightline = {'colorscheme': 'gruvbox'}
|
||||||
|
let g:limelight_conceal_ctermfg = 'DarkGray'
|
||||||
|
|
||||||
|
" let g:vim_json_syntax_conceal = 0
|
||||||
|
|
||||||
|
let g:airline_theme='base16_gruvbox_dark_hard'
|
||||||
|
let g:airline#extensions#tabline#enabled = 1
|
||||||
|
let g:airline#extensions#ale#enabled = 1
|
||||||
|
|
||||||
|
let g:ale_linters ={
|
||||||
|
\ 'haskell': ['hlint', 'hdevtools', 'hfmt'],
|
||||||
|
\}
|
||||||
|
let g:ale_python_auto_pipenv=1 " see ale-integrations-local-executables
|
||||||
|
"let g:ale_python_pylint_auto_pipenv=1
|
||||||
|
let g:ale_python_pylint_executable="pipenv"
|
||||||
|
let g:ale_python_pylint_change_directory=1
|
||||||
|
|
||||||
|
autocmd! User GoyoEnter Limelight
|
||||||
|
autocmd! User GoyoLeave Limelight!!
|
||||||
|
|
||||||
|
" function LoadBraces (except)
|
||||||
|
" if (&ft != a:except)
|
||||||
|
" RainbowParenthesesLoadBraces
|
||||||
|
" endif
|
||||||
|
" endfunction
|
||||||
|
"
|
||||||
|
" " For rainbow parenhteses
|
||||||
|
" au VimEnter * RainbowParenthesesToggle
|
||||||
|
" au Syntax * RainbowParenthesesLoadRound
|
||||||
|
" au Syntax * RainbowParenthesesLoadSquare
|
||||||
|
" au Syntax * call LoadBraces('haskell')
|
||||||
|
|
||||||
|
"autocmd! BufWritePost,BufEnter * Neomake
|
||||||
|
|
||||||
|
let g:deoplete#enable_at_startup = 1
|
||||||
|
|
||||||
|
let g:rainbow_active = 1
|
||||||
|
|
||||||
|
let g:black_linelength=79
|
||||||
|
|
||||||
|
let g:NERDDefaultAlign = 'left'
|
||||||
|
|
||||||
|
nnoremap <silent> <F6> i
|
||||||
|
inoremap <silent> <F6> <Nop>
|
||||||
|
nnoremap <silent> <F18> a
|
||||||
|
inoremap <silent> <F18> <Nop>
|
||||||
|
|
||||||
|
nnoremap <leader>p "=system('xsel')<cr>p
|
||||||
|
nnoremap <leader>m :!make<cr>
|
||||||
|
|
||||||
|
" CLOJURE
|
||||||
|
let g:clj_fmt_autosave = 0
|
||||||
|
"autocmd FileType clojure nnoremap <c-t> :hi Normal ctermbg=none<cr>
|
||||||
|
autocmd FileType clojure nnoremap <F5> :Eval<cr>
|
||||||
|
autocmd FileType clojure vnoremap <F5> :Eval<cr>
|
||||||
|
autocmd FileType clojure nnoremap <F12> :Eval (stop)<cr>
|
||||||
|
autocmd FileType clojure nnoremap <c-f> :Cljfmt<cr>
|
||||||
|
|
||||||
|
"set formatoptions+=w
|
||||||
|
"set tw=80
|
||||||
|
"nnoremap Q gqip
|
||||||
|
|
||||||
|
" au BufNewFile,BufRead *.go setlocal noet ts=4 sw=4 sts=4
|
||||||
|
|
||||||
|
let g:UltiSnipsExpandTrigger="<tab>"
|
||||||
|
let g:UltiSnipsJumpForwardTrigger="<c-b>"
|
||||||
|
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
|
||||||
|
|
||||||
|
autocmd FileType python nnoremap <buffer> <C-f> :Black<CR>
|
||||||
|
autocmd FileType sql nnoremap <buffer> <C-f> :%!sqlfluff fix -<CR>
|
||||||
|
autocmd FileType sh nnoremap <buffer> <C-f> :Shfmt<CR>
|
||||||
|
autocmd FileType json nnoremap <buffer> <C-f> :%!jq --indent 4 .<CR>
|
||||||
|
autocmd FileType terraform nnoremap <buffer> <C-f> :TerraformFmt<CR>
|
||||||
|
autocmd FileType nix nnoremap <buffer> <C-f> :%!nixfmt < %<CR>
|
|
@ -0,0 +1,269 @@
|
||||||
|
set nowrap
|
||||||
|
set nocompatible
|
||||||
|
syntax on
|
||||||
|
filetype plugin on
|
||||||
|
set number
|
||||||
|
set mouse=a " mouse support
|
||||||
|
set showcmd " show incomplete cmds down the bottom
|
||||||
|
set showmode " show current mode
|
||||||
|
set visualbell " no sounds
|
||||||
|
set autoread " reload files changed outside vim
|
||||||
|
"set gcr=a:blinkon0 " disable cursor blink
|
||||||
|
set backspace=indent,eol,start " allow backspacing over everything in insert
|
||||||
|
mode
|
||||||
|
set shiftround " use multiple of shiftwidth when indenting with '<' and '>'
|
||||||
|
set showmatch " set show matching parenthesis
|
||||||
|
set ignorecase " ignore case when searching
|
||||||
|
set smartcase " ignore case if search pattern is all lowercase, case-sensitive otherwise
|
||||||
|
set smarttab " insert tabs on the start of a line according to shiftwidth, not tabstop
|
||||||
|
set hlsearch " highlight search terms
|
||||||
|
set incsearch " show search matches as you type
|
||||||
|
set hidden
|
||||||
|
set ruler
|
||||||
|
set clipboard=unnamed " system clipboard
|
||||||
|
set list listchars=tab:\ \ ,trail:· " display tabs and trailing spaces visually
|
||||||
|
set colorcolumn=80
|
||||||
|
|
||||||
|
set splitbelow
|
||||||
|
set splitright
|
||||||
|
nmap <A-r> <C-w>r
|
||||||
|
|
||||||
|
"let g:python_host_prog = '/usr/bin/python2'
|
||||||
|
"let g:python3_host_prog = '/usr/local/bin/python3'
|
||||||
|
|
||||||
|
let mapleader=","
|
||||||
|
let maplocalleader="\\"
|
||||||
|
|
||||||
|
" use alt-x to go to a specific tab
|
||||||
|
nnoremap <A-1> 1gt
|
||||||
|
nnoremap <A-2> 2gt
|
||||||
|
nnoremap <A-3> 3gt
|
||||||
|
nnoremap <A-4> 4gt
|
||||||
|
nnoremap <A-5> 5gt
|
||||||
|
nnoremap <A-6> 6gt
|
||||||
|
nnoremap <A-7> 7gt
|
||||||
|
nnoremap <A-8> 8gt
|
||||||
|
nnoremap <A-9> :tablast<cr>
|
||||||
|
|
||||||
|
" clean highlights when C-l
|
||||||
|
nnoremap <silent> <C-l> :nohl<CR><C-l>
|
||||||
|
|
||||||
|
highlight Comment cterm=italic gui=italic
|
||||||
|
|
||||||
|
" HIGHLIGHT LINE WHEN IN INSERT MODE
|
||||||
|
hi CursorLine cterm=NONE,underline ctermbg=NONE
|
||||||
|
set timeoutlen=1000 ttimeoutlen=0 " eliminate annoying delay
|
||||||
|
autocmd InsertEnter * :set cursorline
|
||||||
|
autocmd InsertLeave * :set nocursorline
|
||||||
|
|
||||||
|
" INDENTATION:
|
||||||
|
filetype indent on
|
||||||
|
set softtabstop=4
|
||||||
|
set expandtab
|
||||||
|
set shiftwidth=4 " number of spaces to use for autoindenting
|
||||||
|
set tabstop=4 " a tab is four spaces
|
||||||
|
set autoindent " always set autoindenting on
|
||||||
|
set copyindent " copy the previous indentation on autoindenting
|
||||||
|
|
||||||
|
" TAG JUMPING:
|
||||||
|
command! MakeTags !ctags -R .
|
||||||
|
" - ^] to jump to tag under cursor
|
||||||
|
" - g^] for ambiguous tags
|
||||||
|
" - ^t to jump back up the tag stack
|
||||||
|
|
||||||
|
" TURN OF SWAP FILES:
|
||||||
|
set noswapfile
|
||||||
|
set nobackup
|
||||||
|
set nowb
|
||||||
|
|
||||||
|
"FOLDS:
|
||||||
|
set foldmethod=indent " fold based on indent
|
||||||
|
set foldnestmax=3 " deepest fold is 3 levels
|
||||||
|
set nofoldenable " don't fold by default
|
||||||
|
|
||||||
|
" FINDING FILES:
|
||||||
|
set path+=**
|
||||||
|
set wildmenu
|
||||||
|
" - Hit tab to find for partial match
|
||||||
|
" - Use * to make it fuzzy
|
||||||
|
|
||||||
|
call plug#begin('~/.config/nvim/plugged')
|
||||||
|
Plug 'LaTeX-Box-Team/LaTeX-Box'
|
||||||
|
Plug 'APZelos/blamer.nvim'
|
||||||
|
Plug 'vito-c/jq.vim'
|
||||||
|
Plug 'tpope/vim-haml'
|
||||||
|
Plug 'tpope/vim-surround'
|
||||||
|
Plug 'junegunn/goyo.vim'
|
||||||
|
" Plug 'vim-pandoc/vim-pandoc'
|
||||||
|
" Plug 'vim-pandoc/vim-pandoc-syntax'
|
||||||
|
Plug 'lambdalisue/nerdfont.vim'
|
||||||
|
Plug 'lambdalisue/fern-renderer-nerdfont.vim'
|
||||||
|
Plug 'lambdalisue/glyph-palette.vim'
|
||||||
|
Plug 'lambdalisue/fern-git-status.vim'
|
||||||
|
Plug 'lambdalisue/fern-mapping-git.vim' " to check
|
||||||
|
Plug 'lambdalisue/fern-hijack.vim'
|
||||||
|
" Plug 'voldikss/vim-floaterm'
|
||||||
|
" Plug 'camspiers/animate.vim'
|
||||||
|
" Plug 'camspiers/lens.vim'
|
||||||
|
Plug 'psf/black', { 'branch': 'stable' }
|
||||||
|
Plug 'elzr/vim-json'
|
||||||
|
Plug 'https://tildegit.org/sloum/gemini-vim-syntax.git'
|
||||||
|
Plug 'maksimr/vim-jsbeautify'
|
||||||
|
Plug 'glacambre/firenvim'
|
||||||
|
Plug 'hashivim/vim-terraform'
|
||||||
|
Plug 'martinda/Jenkinsfile-vim-syntax'
|
||||||
|
Plug 'z0mbix/vim-shfmt', { 'for': 'sh' }
|
||||||
|
Plug 'LnL7/vim-nix'
|
||||||
|
call plug#end()
|
||||||
|
|
||||||
|
let g:markdown_syntax_conceal = 0
|
||||||
|
|
||||||
|
|
||||||
|
set updatetime=100 " reduce vim update time so magke gitgutter more responsive
|
||||||
|
|
||||||
|
set termguicolors
|
||||||
|
|
||||||
|
"set fillchars+=vert:\ " cleaner vertical line
|
||||||
|
|
||||||
|
let g:gruvbox_contrast_dark="hard"
|
||||||
|
let g:gruvbox_contrast_light="hard"
|
||||||
|
let g:gruvbox_italic=1
|
||||||
|
let g:gruvbox_invert_indent_guides=1
|
||||||
|
let g:gruvbox_vert_split='bg1'
|
||||||
|
colorscheme gruvbox
|
||||||
|
|
||||||
|
" colorscheme gruvbox8_hard
|
||||||
|
|
||||||
|
set background=dark
|
||||||
|
|
||||||
|
let g:fern#renderer = "nerdfont"
|
||||||
|
|
||||||
|
function! s:init_fern() abort
|
||||||
|
nmap <buffer> T <Plug>(fern-action-open:tab)
|
||||||
|
nmap <buffer> S <Plug>(fern-action-open:split)
|
||||||
|
nmap <buffer> V <Plug>(fern-action-open:vsplit)
|
||||||
|
nmap <buffer> <Space> <Plug>(fern-action-mark:toggle)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
augroup fern-custom
|
||||||
|
autocmd! *
|
||||||
|
autocmd FileType fern call s:init_fern()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
augroup my-glyph-palette
|
||||||
|
autocmd! *
|
||||||
|
autocmd FileType fern call glyph_palette#apply()
|
||||||
|
autocmd FileType nerdtree,startify call glyph_palette#apply()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
nnoremap <leader>t :Fern . -drawer -toggle<cr>
|
||||||
|
nnoremap <leader>f :Files<cr>
|
||||||
|
nnoremap <leader>rg :Rg<cr>
|
||||||
|
nnoremap <leader><Bs> :cd ..<cr>
|
||||||
|
nnoremap <Leader>b :Buffers<cr>
|
||||||
|
|
||||||
|
"let g:NERDTreeIndicatorMapCustom = {
|
||||||
|
"\ "Modified" : "✹",
|
||||||
|
"\ "Staged" : "✚",
|
||||||
|
"\ "Untracked" : "✭",
|
||||||
|
"\ "Renamed" : "➜",
|
||||||
|
"\ "Unmerged" : "═",
|
||||||
|
"\ "Deleted" : "✖",
|
||||||
|
"\ "Dirty" : "✗",
|
||||||
|
"\ "Clean" : "✔︎",
|
||||||
|
"\ 'Ignored' : '☒',
|
||||||
|
"\ "Unknown" : "?"
|
||||||
|
"\ }
|
||||||
|
|
||||||
|
let g:indentLine_char = '▏'
|
||||||
|
"let g:indentLine_color_term = 2854
|
||||||
|
|
||||||
|
let g:indentLine_setConceal = 0
|
||||||
|
"let g:indentLine_concealcursor=""
|
||||||
|
|
||||||
|
let g:slime_target="tmux"
|
||||||
|
let g:slime_python_ipython=1
|
||||||
|
|
||||||
|
let g:tmux_navigator_no_mappings = 1
|
||||||
|
|
||||||
|
nnoremap <silent> <A-h> :TmuxNavigateLeft<cr>
|
||||||
|
nnoremap <silent> <A-j> :TmuxNavigateDown<cr>
|
||||||
|
nnoremap <silent> <A-k> :TmuxNavigateUp<cr>
|
||||||
|
nnoremap <silent> <A-l> :TmuxNavigateRight<cr>
|
||||||
|
|
||||||
|
"let g:lightline = {'colorscheme': 'gruvbox'}
|
||||||
|
" let g:limelight_conceal_ctermfg = 'DarkGray'
|
||||||
|
|
||||||
|
" let g:vim_json_syntax_conceal = 0
|
||||||
|
|
||||||
|
let g:airline_theme='base16_gruvbox_dark_hard'
|
||||||
|
let g:airline#extensions#tabline#enabled = 1
|
||||||
|
let g:airline#extensions#ale#enabled = 1
|
||||||
|
|
||||||
|
let g:ale_linters ={
|
||||||
|
\ 'haskell': ['hlint', 'hdevtools', 'hfmt'],
|
||||||
|
\}
|
||||||
|
let g:ale_python_auto_pipenv=1 " see ale-integrations-local-executables
|
||||||
|
"let g:ale_python_pylint_auto_pipenv=1
|
||||||
|
let g:ale_python_pylint_executable="pipenv"
|
||||||
|
let g:ale_python_pylint_change_directory=1
|
||||||
|
|
||||||
|
let g:ale_lint_on_text_changed = 'never'
|
||||||
|
let g:ale_lint_on_insert_leave = 0
|
||||||
|
let g:ale_lint_on_enter = 0
|
||||||
|
|
||||||
|
autocmd! User GoyoEnter Limelight
|
||||||
|
autocmd! User GoyoLeave Limelight!!
|
||||||
|
|
||||||
|
" function LoadBraces (except)
|
||||||
|
" if (&ft != a:except)
|
||||||
|
" RainbowParenthesesLoadBraces
|
||||||
|
" endif
|
||||||
|
" endfunction
|
||||||
|
"
|
||||||
|
" " For rainbow parenhteses
|
||||||
|
" au VimEnter * RainbowParenthesesToggle
|
||||||
|
" au Syntax * RainbowParenthesesLoadRound
|
||||||
|
" au Syntax * RainbowParenthesesLoadSquare
|
||||||
|
" au Syntax * call LoadBraces('haskell')
|
||||||
|
|
||||||
|
"autocmd! BufWritePost,BufEnter * Neomake
|
||||||
|
|
||||||
|
" let g:deoplete#enable_at_startup = 1
|
||||||
|
|
||||||
|
" let g:black_linelength=79
|
||||||
|
|
||||||
|
let g:shfmt_extra_args = '-i 4'
|
||||||
|
|
||||||
|
let g:NERDDefaultAlign = 'left'
|
||||||
|
|
||||||
|
nnoremap <silent> <F6> i
|
||||||
|
inoremap <silent> <F6> <Nop>
|
||||||
|
nnoremap <silent> <F18> a
|
||||||
|
inoremap <silent> <F18> <Nop>
|
||||||
|
|
||||||
|
nnoremap <leader>p "=system('xsel')<cr>p
|
||||||
|
nnoremap <leader>m :!make<cr>
|
||||||
|
|
||||||
|
"set formatoptions+=w
|
||||||
|
"set tw=80
|
||||||
|
"nnoremap Q gqip
|
||||||
|
"set textwidth=79
|
||||||
|
" set wrap linebreak
|
||||||
|
|
||||||
|
" au BufNewFile,BufRead *.go setlocal noet ts=4 sw=4 sts=4
|
||||||
|
|
||||||
|
let g:UltiSnipsExpandTrigger="<tab>"
|
||||||
|
let g:UltiSnipsJumpForwardTrigger="<c-b>"
|
||||||
|
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
|
||||||
|
|
||||||
|
" autocmd FileType sql nnoremap <buffer> <C-f> :%!sqlformat --reindent --keywords upper --identifiers lower -<CR>
|
||||||
|
" autocmd FileType sql nnoremap <buffer> <C-f> :%!sqlformat --reindent --keywords upper -<CR>
|
||||||
|
autocmd FileType sql nnoremap <buffer> <C-f> :%!sqlfluff fix -<CR>
|
||||||
|
autocmd FileType python nnoremap <buffer> <C-f> :Black<CR>
|
||||||
|
autocmd FileType sh nnoremap <buffer> <C-f> :Shfmt<CR>
|
||||||
|
autocmd FileType json nnoremap <buffer> <C-f> :%!jq --indent 4 .<CR>
|
||||||
|
autocmd FileType terraform nnoremap <buffer> <C-f> :TerraformFmt<CR>
|
||||||
|
autocmd FileType nix nnoremap <buffer> <C-f> :%!nixfmt < %<CR>
|
||||||
|
|
||||||
|
let g:vimwiki_list = [{'path': '~/notes/', 'syntax': 'markdown', 'ext': '.md'}]
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue