Files
ndots/hosts/writter-deck/home.nix
jpporta 726681e5c2 Squashed commit of the following:
commit 19ed08c375be6d6a0b344ab1b9d3f76f3c29514b
Author: João Porta <jpedro.porta@gmail.com>
Date:   Fri Jul 17 23:12:12 2026 +0000

    zsh

commit 19df08188fa07b40b9b28a4665b015c4fa525dff
Merge: 577d753 4e4cc38
Author: João Porta <jpedro.porta@gmail.com>
Date:   Thu Jul 16 22:29:29 2026 +0000

    Merge remote-tracking branch 'refs/remotes/origin/tailscale' into tailscale

commit 577d753475be867146ebcacc79330a1e227043a5
Author: João Porta <jpedro.porta@gmail.com>
Date:   Thu Jul 16 15:29:53 2026 +0000

    tailscale

commit 4e4cc381b9e333592184490ea9f749fe87ebbbb9
Author: João Porta <jpedro.porta@gmail.com>
Date:   Thu Jul 16 15:29:53 2026 +0000

    tailscale
2026-07-17 23:15:07 +00:00

235 lines
6.1 KiB
Nix

{ config
, pkgs
, lib
, ...
}:
let
mainFont = "Berkeley Mono Nerd Font Mono";
fontSize = 14;
# Cage has no IPC for querying its active XKB group. This deck-only build
# writes that group to CAGE_XKB_STATE_FILE for the tmux indicator below.
cageWithLayoutState = pkgs.cage.overrideAttrs (oldAttrs: {
patches = (oldAttrs.patches or [ ]) ++ [ ./cage-xkb-state.patch ];
});
keyboardLayout = pkgs.writeShellApplication {
name = "keyboard-layout";
runtimeInputs = [ pkgs.coreutils ];
text = ''
runtime_dir="''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
state_file="''${CAGE_XKB_STATE_FILE:-$runtime_dir/writter-deck-keyboard-layout}"
layout=0
if [[ -r "$state_file" ]]; then
IFS= read -r layout < "$state_file" || true
fi
case "$layout" in
0) printf 'US' ;;
1) printf 'PT' ;;
*) printf '?' ;;
esac
'';
};
in
{
imports = [
../../modules/home-manager/oh-my-posh
../../modules/home-manager/zshrc
../../modules/home-manager/bat
../../modules/home-manager/cedilla
../../modules/home-manager/opencode
../../modules/home-manager/nvim
../../modules/home-manager/pi
../../modules/home-manager/tmux
../../modules/home-manager/eza
../../modules/home-manager/zoxide
../../modules/home-manager/tailscale-daemon
];
home = {
username = "jpporta";
homeDirectory = "/home/jpporta";
stateVersion = "26.11";
sessionVariables = {
EDITOR = "nvim";
};
};
nixpkgs.config.allowUnfree = true;
custom = {
zsh = {
enable = true;
fastfetch = false;
};
tmux = {
enable = true;
extraConfig = ''
# Cage does not expose the XKB group through Wayland. The deck-only
# Cage patch updates the state file consumed by this status segment.
set -g status-interval 1
set -ag status-right "#[fg=#89b4fa] KBD:#(${keyboardLayout}/bin/keyboard-layout)"
'';
};
cedilla = {
enable = true;
# Foot/libxkbcommon handles ~/.XCompose directly; the deck has no NixOS
# fcitx5 service at /run/current-system/sw.
startFcitx5 = false;
};
oh-my-posh.enable = true;
pi.enable = true;
nvim.enable = true;
eza.enable = true;
bat.enable = true;
zoxide.enable = true;
tailscale-daemon = {
enable = true;
acceptRoutes = true;
};
};
home.packages = with pkgs; [
cageWithLayoutState
keyboardLayout
foot
wlr-randr
git
ripgrep
fd
mosh
fastfetch
lazygit
stow
bluetuith
];
# `tailscale`/`ts` shell helpers come from the tailscale-daemon module.
# Non-NixOS host: fixes locales, ld paths, XDG desktop entries
targets.genericLinux.enable = true;
# ---- fonts ----
fonts.fontconfig.enable = true;
home.file."my-fonts" = {
source = ./fonts;
target = ".local/share/fonts/custom";
recursive = true;
};
programs = {
home-manager.enable = true;
foot = {
enable = true;
server.enable = false;
settings = {
main = {
shell = "${pkgs.zsh}/bin/zsh --login";
term = "xterm-256color";
font = "${mainFont}:size=${toString fontSize}";
font-bold = "${mainFont}:size=${toString fontSize}";
pad = "12x12";
};
mouse = {
hide-when-typing = "yes";
};
scrollback.lines = 10000;
cursor.style = "block";
colors-dark = {
alpha = 1.0;
background = "282828";
foreground = "ebdbb2";
regular0 = "282828";
regular1 = "cc241d";
regular2 = "98971a";
regular3 = "d79921";
regular4 = "458588";
regular5 = "b16286";
regular6 = "689d6a";
regular7 = "a89984";
bright0 = "928374";
bright1 = "fb4934";
bright2 = "b8bb26";
bright3 = "fabd2f";
bright4 = "83a598";
bright5 = "d3869b";
bright6 = "8ec07c";
bright7 = "ebdbb2";
};
key-bindings = {
font-increase = "Control+plus Control+equal";
font-decrease = "Control+minus";
font-reset = "Control+0";
};
};
};
bash = {
enable = true;
profileExtra = ''
# Auto-launch cage + foot when logging in on tty1 (skip over SSH).
# If cage exits, you drop back to the login shell on tty1 instead
# of being stuck in a restart loop.
if [ "$(tty 2>/dev/null)" = "/dev/tty1" ] \
&& [ -z "$WAYLAND_DISPLAY" ] \
&& [ -z "$CAGE_RUNNING" ]; then
export CAGE_RUNNING=1
export WLR_RENDERER=pixman
export XDG_RUNTIME_DIR=''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}
export XKB_DEFAULT_LAYOUT="us,us"
export XKB_DEFAULT_VARIANT=",intl"
export XKB_DEFAULT_OPTIONS="grp:alt_shift_toggle"
export CAGE_XKB_STATE_FILE="$XDG_RUNTIME_DIR/writter-deck-keyboard-layout"
rm -f "$CAGE_XKB_STATE_FILE"
exec ${cageWithLayoutState}/bin/cage -- ${pkgs.foot}/bin/foot
fi
'';
};
ssh = {
enable = true;
enableDefaultConfig = false;
settings = {
"*" = {
forwardAgent = false;
addKeysToAgent = "no";
compression = false;
serverAliveInterval = 0;
serverAliveCountMax = 3;
hashKnownHosts = false;
userKnownHostsFile = "~/.ssh/known_hosts";
controlMaster = "no";
controlPath = "~/.ssh/master-%r@%n:%p";
controlPersist = "no";
};
"pc" = {
hostname = "jpporta-nixos";
user = "jpporta";
serverAliveInterval = 30;
};
"pc-lan" = {
hostname = "192.168.0.100";
user = "jpporta";
serverAliveInterval = 30;
};
"pc-ts" = {
hostname = "jpporta-nixos.taild23e4.ts.net";
user = "jpporta";
serverAliveInterval = 30;
};
};
};
};
services.syncthing.enable = true;
services.tailscale-systray.enable = true;
home.sessionVariables.TERMINAL = "foot";
}