#+title: dotfiles management #+PROPERTY: header-args :mkdirp yes #+auto_tangle: t * git #+begin_src conf :tangle ~/.gitconfig [user] name = cashmere email = cashmere@autistici.org useConfigOnly = true signingkey = B877C0AC3B080FBB! [init] defaultBranch = master [commit] gpgsign = true [gpg] format = openpgp program = gpg [pull] rebase = true [push] autoSetupRemote = true default = current [fetch] prune = true pruneTags = true [diff] algorithm = histogram [merge] conflictstyle = zdiff3 [alias] dft = -c diff.external=difft diff dlog = -c diff.external=difft log -p --ext-diff dshow = -c diff.external=difft show --ext-diff [rebase] autosquash = true autostash = true [core] autocrlf = input [remote "origin"] gcrypt-participants = B877C0AC3B080FBB gcrypt-signingkey = B877C0AC3B080FBB [wt] basedir = .git/wt copyignored = true copymodified = true #+end_src * .env #+begin_src sh :tangle ~/.env # Common environment for login shells and X session EDITOR=vi PAGER=less export EDITOR PAGER PASSWORD_STORE_DIR=$HOME/pass export PASSWORD_STORE_DIR DISTDIR=$HOME/ports/distfiles WRKDIRPREFIX=$HOME/ports/work PORTSDIR=/usr/local/poudriere/ports/base export DISTDIR WRKDIRPREFIX PORTSDIR XDG_RUNTIME_DIR=$HOME/.run export XDG_RUNTIME_DIR gpgconf --launch gpg-agent export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) #+end_src * .profile #+begin_src sh :tangle ~/.profile # # .profile - POSIX Shell startup script for login shells # # see also sh(1), environ(7). # # set ENV to a file invoked each time sh is started for interactive use. ENV=$HOME/.shrc; export ENV # Let sh(1) know it's at home, despite /home being a symlink. if [ "$PWD" != "$HOME" ] && [ "$PWD" -ef "$HOME" ] ; then cd ; fi # Query terminal size; useful for serial lines. if [ -x /usr/bin/resizewin ] ; then /usr/bin/resizewin -z ; fi # Display a random cookie on each login. if [ -x /usr/bin/fortune ] ; then /usr/bin/fortune freebsd-tips ; fi # Shared environment (GPG, editor, password-store) . "$HOME/.env" # Start xonsh for interactive login shells on a tty if [ -n "$PS1" ] && [ -x /usr/local/bin/xonsh ]; then exec /usr/local/bin/xonsh fi #+end_src * .xinitrc #+begin_src sh :tangle ~/.xinitrc . "$HOME/.env" export GPG_TTY=$(tty) exec i3 #+end_src * .xonshrc #+begin_src python :tangle ~/.xonshrc import subprocess, shutil $PATH.insert(0, $HOME + '/.cargo/bin') $PATH.insert(0, $HOME + '/.local/bin') $GPG_TTY = $(tty).strip() if shutil.which("gpg-agent"): subprocess.run(["gpgconf", "--launch", "gpg-agent"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) $SSH_AUTH_SOCK = $(gpgconf --list-dirs agent-ssh-socket).strip() subprocess.run(["gpg-connect-agent", "updatestartuptty", "/bye"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) if shutil.which("atuin"): running = subprocess.run(["pgrep", "-x", "atuin"], capture_output=True).returncode == 0 if not running: subprocess.Popen(["atuin", "daemon", "start"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True) def _jail_connect(args): if args: name = args[0] else: print("running jails:") jls name = input("jail: ").strip() if not name: return doas jexec -U cashmere @(name) env HOME=/home/cashmere USER=cashmere LOGNAME=cashmere xonsh -l aliases['jail'] = _jail_connect execx($(atuin init xonsh)) execx($(zoxide init xonsh), 'exec', __xonsh__.ctx, filename='zoxide') #+end_src * atuin #+begin_src toml :tangle ~/.config/atuin/config.toml auto_sync = true sync_address = "https://atuin.cashmere.rs" sync_frequency = "1m" [daemon] enabled = false systemd_socket = false [dotfiles] enabled = true #+end_src * ssh ** =authorized_keys= #+begin_src conf :tangle ~/.ssh/authorized_keys ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILOwBidfdZzcSEIPSRT0C8U9U55WSES1ugqAKE+nvgQ9 (none) #+end_src * gpg setup ** gpg-agent.conf #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf enable-ssh-support default-cache-ttl 600 max-cache-ttl 7200 pinentry-program /usr/local/bin/pinentry-emacs #+end_src ** sshcontrol :crypt: -----BEGIN PGP MESSAGE----- hQIMA0fZrn09GBJoAQ/8CNgrMmtje3ID2JbpQ3s3hwm32kQYQaApv9oVlYxs3v0B e9p2lXV8VtihnnaSOwnZl3QRUZFPYuV6qTvhyY8XMtlpyRfBOjnAaR8JdnuGyQXf Xsy+gaMARQlU2kR76s9wmjrVxuJIdUFPP8yVz1rxB7RvNsaLU3D0M/ZopcovbBhJ DIQJkQ1H1QQM7OBnGmvBVrL21zaSwKuVkb6Or0CZLF8QoO25OYfRlM5w2r2y2rRj dX0E6NhDd+n0/06ly4oo01wO3MnQiqdTs1ov+JtZf5s7S5ahhPC5BJOAlVxtll9b RRR8n/pWueLNdbK/SAUnbPSUsKJiOFRAv5mQa+SGby28kMNIyDR9chIL+0+dFfvc OxKgL6c21yAiMzXKmunTnYG2aqLF9UpPa0pSXHR80kr0vfX7pmz99uMAUjHSduM0 akZajlLuoOzQI60mh6urSbPxghtVfTLJi25hgxFj1XiZ6A24GvhmcMeRkxlG0yWE 7biF+oZeWN1IFb4hWOx0fyiYZ6j3kbqPicts4Ytd3aTPP14LTbcq6pqg0UQ1BLXm 9x1oiSeCySdDM68JGvA6KwYzyh70DTDRXD8lTfxooeDdTMmw6ghaoF81spFO3Vi6 jVAgE1ecSgCUO6K7YwFFRhJujOBGrCbl+bEl+AOnlu4itSuwohEIGuWWNscRsn6F AQwDHE1EcNNBM3MBB/9pKBWGDZkkE9EDmmzWgDLlUYZLxZECr5PJC9vamoiYqJwb dRBqh4G4RM60Qtz9AeEZ9CpaMnUiXtpzXpMPz574PLXZYm2IDSpANUv+Fp+ge9LL SBB9+02sA9aIR+xTV63sLHxAxN8GSKZT4kPl1aKBRUHEsh8oi77SQBqqwUIvmwYI IOaMA5k9EpW5aEakWqEgo9gFj9k+TA8biUl7EW2qmex8jvZjCSUr8dHQfCDwWHPh k49zvAu9EUjOM8s+00elJ+p0rW2Ab8PmRVLQPxsGxOkK5NQp2V7heSLz1b494n1m OBL+dHDxn2lwPnuVbigohOEyGTc+qiQQM6oLovaFhF4DvHPnD0odxDQSAQdA+vH4 fhdVx37ZqHdp2BsN1S/QeQgr7AWS5SBUAxf3pEow3OScsbIInSkLJ9bFZ8nQJOBI Bv3HO/doPyga8IFpGwsDKhG5InzMvG+md11F5K6j0psBklLzDd8KbYOIPYjbBvSS Plc0i5QPFpy/FnI0/2zSJYu08WbPitbHem57Tk6a3V1xkXVavziV8kc5eygdTfxt jBbQe5Lt9tDbPd8Fe7yNIhGJ8OFdKzzliqCCSzzga8AKzJ6AyixHsl3scpU9n8Jb Br3gms1smZVfUdn9NwAmOOZgcgGGvPQz+kruWcOKOoBKOFSQWrqx1bqEuw== =XEf0 -----END PGP MESSAGE----- * mail ** mbsync #+begin_src conf :tangle ~/.mbsyncrc IMAPAccount autistici Host mail.autistici.org Port 993 User cashmeresamurai@autistici.org PassCmd "pass show autistici" TLSType IMAPS IMAPStore autistici-remote Account autistici MaildirStore autistici-local Path ~/Mails/autistici/ Inbox ~/Mails/autistici/Inbox SubFolders Verbatim Channel autistici Far :autistici-remote: Near :autistici-local: Patterns * Create Near SyncState * IMAPAccount migadu Host imap.migadu.com Port 993 User cashmere@cashmere.rs PassCmd "pass show migadu/cashmere" TLSType IMAPS IMAPStore migadu-remote Account migadu MaildirStore migadu-local Path ~/Mails/migadu/ Inbox ~/Mails/migadu/Inbox SubFolders Verbatim Channel migadu Far :migadu-remote: Near :migadu-local: Patterns * Create Near Expunge Both SyncState * #+end_src ** msmtp #+begin_src conf :tangle ~/.msmtprc defaults auth on tls on tls_trust_file /usr/local/share/certs/ca-root-nss.crt logfile ~/.msmtp.log account autistici host smtp.autistici.org port 587 tls_starttls on from cashmeresamurai@autistici.org user cashmeresamurai@autistici.org passwordeval "pass show autistici" account migadu host smtp.migadu.com port 465 tls_starttls off from cashmere@cashmere.rs user cashmere@cashmere.rs passwordeval "pass show migadu/cashmere" account default : autistici #+end_src ** mu init #+begin_src sh mu init --maildir=$HOME/Mails --my-address=cashmeresamurai@autistici.org --my-address=cashmere@cashmere.rs #+end_src * mangowm #+begin_src conf :tangle ~/.config/mango/config.conf env=LIBVA_DRIVER_NAME,nvidia env=GBM_BACKEND,nvidia-drm env=__GLX_VENDOR_LIBRARY_NAME,nvidia syncobj_enable=1 monitorrule=name:HEADLESS-.*,width:1920,height:1080,refresh:144,x:0,y:0,scale:1,rr:0,vrr:0 exec-once=sh -c 'mmsg dispatch create_virtual_output && sleep 0.5 && wayvnc -g -f 60 -o HEADLESS-1 0.0.0.0 5900' exec-once=emacs --fg-daemon exec-once=sh -c "while true; do sunshine-nvenc; sleep 2; done" exec-once=pipewire exec-once=wireplumber exec-once=pipewire-pulse exec-once=wl-paste --watch cliphist store exec-once=i3bar-river # Window effect blur=0 blur_layer=0 blur_optimized=1 blur_params_num_passes = 2 blur_params_radius = 5 blur_params_noise = 0.02 blur_params_brightness = 0.9 blur_params_contrast = 0.9 blur_params_saturation = 1.2 shadows = 0 layer_shadows = 0 shadow_only_floating = 1 shadows_size = 10 shadows_blur = 15 shadows_position_x = 0 shadows_position_y = 0 shadowscolor= 0x000000ff border_radius=6 no_radius_when_single=0 focused_opacity=1.0 unfocused_opacity=1.0 # Animation Configuration(support type:zoom,slide) # tag_animation_direction: 1-horizontal,0-vertical animations=1 layer_animations=1 animation_type_open=slide animation_type_close=slide animation_fade_in=1 animation_fade_out=1 tag_animation_direction=1 zoom_initial_ratio=0.4 zoom_end_ratio=0.8 fadein_begin_opacity=0.5 fadeout_begin_opacity=0.8 animation_duration_move=500 animation_duration_open=400 animation_duration_tag=350 animation_duration_close=800 animation_duration_focus=0 animation_curve_open=0.46,1.0,0.29,1 animation_curve_move=0.46,1.0,0.29,1 animation_curve_tag=0.46,1.0,0.29,1 animation_curve_close=0.08,0.92,0,1 animation_curve_focus=0.46,1.0,0.29,1 animation_curve_opafadeout=0.5,0.5,0.5,0.5 animation_curve_opafadein=0.46,1.0,0.29,1 # Scroller Layout Setting scroller_structs=20 scroller_default_proportion=0.8 scroller_focus_center=0 scroller_prefer_center=0 edge_scroller_pointer_focus=1 scroller_default_proportion_single=1.0 scroller_proportion_preset=0.5,0.8,1.0 # Master-Stack Layout Setting new_is_master=1 default_mfact=0.55 default_nmaster=1 smartgaps=0 # Overview Setting hotarea_size=10 enable_hotarea=1 ov_tab_mode=0 overviewgappi=5 overviewgappo=30 # Misc no_border_when_single=0 axis_bind_apply_timeout=100 focus_on_activate=1 idleinhibit_ignore_visible=0 sloppyfocus=1 warpcursor=1 focus_cross_monitor=0 focus_cross_tag=0 enable_floating_snap=0 snap_distance=30 cursor_size=24 drag_tile_to_tile=1 # keyboard repeat_rate=25 repeat_delay=600 numlockon=0 xkb_rules_layout=us # Trackpad # need relogin to make it apply disable_trackpad=0 tap_to_click=1 tap_and_drag=1 drag_lock=1 trackpad_natural_scrolling=0 disable_while_typing=1 left_handed=0 middle_button_emulation=0 swipe_min_threshold=1 # mouse # need relogin to make it apply mouse_natural_scrolling=0 # Appearance gappih=5 gappiv=5 gappoh=10 gappov=10 scratchpad_width_ratio=0.8 scratchpad_height_ratio=0.9 borderpx=4 rootcolor=0x201b14ff bordercolor=0x444444ff focuscolor=0xc9b890ff maximizescreencolor=0x89aa61ff urgentcolor=0xad401fff scratchpadcolor=0x516c93ff globalcolor=0xb153a7ff overlaycolor=0x14a57cff # layout support: # tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller tagrule=id:1,layout_name:tile tagrule=id:2,layout_name:tile tagrule=id:3,layout_name:tile tagrule=id:4,layout_name:tile tagrule=id:5,layout_name:tile tagrule=id:6,layout_name:tile tagrule=id:7,layout_name:tile tagrule=id:8,layout_name:tile tagrule=id:9,layout_name:tile # Key Bindings # key name refer to `xev` or `wev` command output, # mod keys name: super,ctrl,alt,shift,none # reload config bind=super,r,reload_config # menu and terminal bind=super,space,spawn,wmenu-run -f "Maple Mono NF 18" bind=SUPER,b,spawn,helium bind=SUPER,i,spawn,halloy bind=SUPER,p,spawn,passmenu bind=SUPER,s,spawn,powermenu bind=SUPER,v,spawn_shell,cliphist list | wmenu -f "Maple Mono NF 18" | cliphist decode | wl-copy bind=SUPER,Print,spawn_shell,grim -g "$(slurp)" - | wl-copy bind=super,Return,spawn,emacsclient -c # exit bind=SUPER,m,quit bind=SUPER,q,killclient, # swap window bind=SUPER+SHIFT,Up,exchange_client,up bind=SUPER+SHIFT,Down,exchange_client,down bind=SUPER+SHIFT,Left,exchange_client,left bind=SUPER+SHIFT,Right,exchange_client,right bind=super,1,view,1,0 bind=super,2,view,2,0 bind=super,3,view,3,0 bind=super,4,view,4,0 bind=super,5,view,5,0 bind=super,6,view,6,0 bind=super,7,view,7,0 bind=super,8,view,8,0 bind=super,9,view,9,0 # tag: move client to the tag and focus it # tagsilent: move client to the tag and not focus it # bind=Alt,1,tagsilent,1 bind=Alt,1,tag,1,0 bind=Alt,2,tag,2,0 bind=Alt,3,tag,3,0 bind=Alt,4,tag,4,0 bind=Alt,5,tag,5,0 bind=Alt,6,tag,6,0 bind=Alt,7,tag,7,0 bind=Alt,8,tag,8,0 bind=Alt,9,tag,9,0 # monitor switch bind=alt+shift,Left,focusmon,left bind=alt+shift,Right,focusmon,right bind=SUPER+Alt,Left,tagmon,left bind=SUPER+Alt,Right,tagmon,right # gaps bind=ALT+SHIFT,X,incgaps,1 bind=ALT+SHIFT,Z,incgaps,-1 bind=ALT+SHIFT,R,togglegaps # md layout bind=SUPER+SHIFT,r,reload_config bind=SUPER+SHIFT,e,quit bind=SUPER,h,focusdir,left bind=SUPER,j,focusstack,next bind=SUPER,k,focusstack,prev bind=SUPER,l,focusdir,right bind=SUPER+SHIFT,h,spawn,/home/cashmere/.config/mango/smart-move.sh left bind=SUPER+SHIFT,j,exchange_client,down bind=SUPER+SHIFT,k,exchange_client,up bind=SUPER+SHIFT,l,spawn,/home/cashmere/.config/mango/smart-move.sh right bind=SUPER,Tab,spawn,/home/cashmere/.config/mango/smart-cycle.sh next bind=SUPER+SHIFT,Tab,spawn,/home/cashmere/.config/mango/smart-cycle.sh prev bind=SUPER,t,spawn,/home/cashmere/.config/mango/tabbed-toggle.sh bind=SUPER,g,groupjoin,right bind=SUPER+SHIFT,g,groupleave, bind=SUPER+CTRL,g,groupfocus,next bind=SUPER+CTRL+SHIFT,g,groupfocus,prev bind=SUPER,Escape,switch_layout, bind=SUPER,o,toggleoverview bind=SUPER,f,togglefullscreen, bind=SUPER+SHIFT,f,togglefloating, bind=SUPER,grave,focuslast bind=SUPER,comma,viewtoleft_have_client bind=SUPER,period,viewtoright_have_client bind=SUPER+SHIFT,comma,tagtoleft bind=SUPER+SHIFT,period,tagtoright bind=SUPER+SHIFT,0,tag,0,0 bind=SUPER+SHIFT,1,tag,1,0 bind=SUPER+SHIFT,2,tag,2,0 bind=SUPER+SHIFT,3,tag,3,0 bind=SUPER+SHIFT,4,tag,4,0 bind=SUPER+SHIFT,5,tag,5,0 bind=SUPER+SHIFT,6,tag,6,0 bind=SUPER+SHIFT,7,tag,7,0 bind=SUPER+SHIFT,8,tag,8,0 bind=SUPER+SHIFT,9,tag,9,0 bind=SUPER,x,spawn,emacsclient -e '(my/org-capture-float) bind=NONE,XF86AudioLowerVolume,spawn,wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- bind=NONE,XF86AudioRaiseVolume,spawn,wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ bind=NONE,XF86AudioMute,spawn,wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle bind=NONE,XF86AudioPlay,spawn,playerctl play-pause bind=NONE,XF86AudioNext,spawn,playerctl next bind=NONE,XF86AudioPrev,spawn,playerctl previous circle_layout=tile,monocle # movewin bind=CTRL+SHIFT,Up,movewin,+0,-50 bind=CTRL+SHIFT,Down,movewin,+0,+50 bind=CTRL+SHIFT,Left,movewin,-50,+0 bind=CTRL+SHIFT,Right,movewin,+50,+0 # resizewin bind=CTRL+ALT,Up,resizewin,+0,-50 bind=CTRL+ALT,Down,resizewin,+0,+50 bind=CTRL+ALT,Left,resizewin,-50,+0 bind=CTRL+ALT,Right,resizewin,+50,+0 # Mouse Button Bindings # btn_left and btn_right can't bind none mod key mousebind=SUPER,btn_left,moveresize,curmove mousebind=NONE,btn_middle,togglemaximizescreen,0 mousebind=SUPER,btn_right,moveresize,curresize # Axis Bindings axisbind=SUPER,UP,viewtoleft_have_client axisbind=SUPER,DOWN,viewtoright_have_client # layer rule layerrule=animation_type_open:zoom,layer_name:rofi layerrule=animation_type_close:zoom,layer_name:rofi #+end_src ** display command command when connecting with x12 #+begin_src sh wlr-randr --output HEADLESS-1 --custom-mode 1920x1280@60Hz --scale 1.5 #+end_src * Tasks ** Services *** CANCELLED [#C] Unlock disk encryption over SSH CLOSED: [2026-07-17 Fri 21:57] :LOGBOOK: - State "CANCELLED" from "DONE" [2026-07-17 Fri 21:57] \\ not needed - State "DONE" from "TODO" [2026-07-17 Fri 21:57] :END: *** CANCELLED Navidrome CLOSED: [2026-07-17 Fri 21:57] :LOGBOOK: - State "CANCELLED" from "TODO" [2026-07-17 Fri 21:57] \\ someday maybe :END: *** DONE yggdrasil CLOSED: [2026-07-12 Sun 17:08] :LOGBOOK: - State "DONE" from "NEXT" [2026-07-12 Sun 17:08] :END: ** Ports *** DONE [#A] poudriere CLOSED: [2026-07-12 Sun 17:07] :LOGBOOK: - State "DONE" from [2026-07-12 Sun 17:07] :END: *** poudriere.conf #+begin_src conf # /usr/local/etc/poudriere.conf PACKAGE_FETCH_BRANCH=quarterly PACKAGE_FETCH_URL=pkg+https://pkg.FreeBSD.org/FreeBSD:15:amd64 # Use the existing ZFS pool ZPOOL=zroot # Poudriere root filesystem on ZFS ZROOTFS=/poudriere # FreeBSD mirror for jail creation FREEBSD_HOST=https://download.FreeBSD.org # Copy host resolv.conf into the jail for network access RESOLV_CONF=/etc/resolv.conf # Where poudriere keeps jails and ports trees BASEFS=/usr/local/poudriere # Share distfiles with the custom ports tree to avoid re-fetching DISTFILES_CACHE=/home/cashmere/ports/distfiles # Speed up builds with tmpfs USE_TMPFS=yes # Optional: ccache to speed up repeated Rust/C builds # Install devel/ccache first, then uncomment: # CCACHE_DIR=/var/cache/ccache # Sanity checks USE_PORTLINT=no #+end_src ** Documentation *** TODO document nvidia and mangowm setup