aboutsummaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
Diffstat (limited to 'etc')
-rw-r--r--etc/afew/config6
-rw-r--r--etc/bash/inputrc2
-rw-r--r--etc/git/config25
-rw-r--r--etc/git/ignore3
-rw-r--r--etc/gnupg/gpg-agent.conf.tmpl6
-rw-r--r--etc/gnupg/gpg.conf1
-rw-r--r--etc/gnupg/sshcontrol1
-rw-r--r--etc/guile/init.scm6
-rw-r--r--etc/guix/channels.scm20
-rw-r--r--etc/guix/home.scm625
-rw-r--r--etc/guix/system.scm209
-rw-r--r--etc/hg/hgrc2
-rw-r--r--etc/i3/config185
-rw-r--r--etc/i3status/config31
-rw-r--r--etc/info/infokey7
-rw-r--r--etc/khal/config16
-rw-r--r--etc/khard/khard.conf13
-rw-r--r--etc/lisp-cli/init.lisp33
-rw-r--r--etc/mailcaps/config1
-rw-r--r--etc/newsboat/config1
l---------etc/newsboat/urls1
-rw-r--r--etc/python/pythonrc.py15
-rw-r--r--etc/ranger/rc.conf4
-rw-r--r--etc/remhind/config.tmpl4
-rwxr-xr-xetc/sh/cronjob.sh74
l---------etc/sh/privrc.sh1
-rw-r--r--etc/sh/rc364
-rw-r--r--etc/sh/root-rc87
-rw-r--r--etc/ssh/config.tmpl6
-rw-r--r--etc/ssh/known_hosts84
-rw-r--r--etc/tmux/tmux.conf96
l---------etc/weechat/irc.conf1
32 files changed, 1930 insertions, 0 deletions
diff --git a/etc/afew/config b/etc/afew/config
new file mode 100644
index 0000000..94341e9
--- /dev/null
+++ b/etc/afew/config
@@ -0,0 +1,6 @@
+[SpamFilter]
+[KillThreadsFilter]
+[ListMailsFilter]
+[ArchiveSentMailsFilter]
+[MeFilter]
+[InboxFilter]
diff --git a/etc/bash/inputrc b/etc/bash/inputrc
new file mode 100644
index 0000000..f5c7095
--- /dev/null
+++ b/etc/bash/inputrc
@@ -0,0 +1,2 @@
+"\e[B": history-search-forward
+"\e[A": history-search-backward
diff --git a/etc/git/config b/etc/git/config
new file mode 100644
index 0000000..0ff1257
--- /dev/null
+++ b/etc/git/config
@@ -0,0 +1,25 @@
+[user]
+ email = eu@euandre.org
+ name = EuAndreh
+ signingkey = 81F90EC3CD356060
+[transfer]
+ fsckobjects = true
+[push]
+ default = current
+[commit]
+ gpgsign = true
+ verbose = true
+[init]
+ defaultBranch = main
+[sendemail]
+ assume8bitEncoding = UTF-8
+ smtpserveroption = -a
+ smtpserveroption = EuAndreh
+ annotate = yes
+ confirm = never
+[remote "origin"]
+ fetch = +refs/notes/*:refs/notes/*
+[format]
+ useAutoBase = whenAble
+[include]
+ path = config-extra
diff --git a/etc/git/ignore b/etc/git/ignore
new file mode 100644
index 0000000..9103c3d
--- /dev/null
+++ b/etc/git/ignore
@@ -0,0 +1,3 @@
+/tmp/
+/FIXME
+/vendor/
diff --git a/etc/gnupg/gpg-agent.conf.tmpl b/etc/gnupg/gpg-agent.conf.tmpl
new file mode 100644
index 0000000..e772820
--- /dev/null
+++ b/etc/gnupg/gpg-agent.conf.tmpl
@@ -0,0 +1,6 @@
+# 2592000 = 60 * 60 * 24 * 30
+default-cache-ttl 172800
+default-cache-ttl-ssh 172800
+max-cache-ttl 2592000
+max-cache-ttl-ssh 2592000
+enable-ssh-support
diff --git a/etc/gnupg/gpg.conf b/etc/gnupg/gpg.conf
new file mode 100644
index 0000000..d4498fe
--- /dev/null
+++ b/etc/gnupg/gpg.conf
@@ -0,0 +1 @@
+keyserver pool.sks-keyservers.net
diff --git a/etc/gnupg/sshcontrol b/etc/gnupg/sshcontrol
new file mode 100644
index 0000000..1ae03ed
--- /dev/null
+++ b/etc/gnupg/sshcontrol
@@ -0,0 +1 @@
+750154E135FD7B11FDDF0107CC0904F92EBD2AE4
diff --git a/etc/guile/init.scm b/etc/guile/init.scm
new file mode 100644
index 0000000..9e962e8
--- /dev/null
+++ b/etc/guile/init.scm
@@ -0,0 +1,6 @@
+(use-modules
+ (ice-9 colorized)
+ (ice-9 readline))
+
+(activate-colorized)
+(activate-readline)
diff --git a/etc/guix/channels.scm b/etc/guix/channels.scm
new file mode 100644
index 0000000..f2da084
--- /dev/null
+++ b/etc/guix/channels.scm
@@ -0,0 +1,20 @@
+(append
+ (list
+ (channel
+ (name 'xyz-euandreh)
+ (url "git://euandreh.xyz/package-repository")
+ (branch "main")
+ (introduction
+ (make-channel-introduction
+ "d749e053e6db365069cb9b2ef47a78b06f9e7361"
+ (openpgp-fingerprint
+ "5BDA E9B8 B2F6 C6BC BB0D 6CE5 81F9 0EC3 CD35 6060"))))
+ (channel
+ (name 'nonguix)
+ (url "https://gitlab.com/nonguix/nonguix")
+ (introduction
+ (make-channel-introduction
+ "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
+ (openpgp-fingerprint
+ "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5")))))
+ %default-channels)
diff --git a/etc/guix/home.scm b/etc/guix/home.scm
new file mode 100644
index 0000000..fc9f2b5
--- /dev/null
+++ b/etc/guix/home.scm
@@ -0,0 +1,625 @@
+(use-modules
+ ((ice-9 textual-ports) #:prefix textual-ports:)
+ ((guix licenses) #:prefix licenses:)
+ ((xyz euandreh heredoc) #:prefix heredoc:)
+ (gnu home)
+ (gnu home services)
+ (gnu home services mcron)
+ (gnu home services shells)
+ (gnu home services shepherd)
+ (gnu home services xdg)
+ (gnu packages)
+ (gnu packages base)
+ (gnu packages dunst)
+ (gnu packages freedesktop)
+ (gnu packages gnupg)
+ (gnu packages gpodder)
+ (gnu packages libreoffice)
+ (gnu packages mail)
+ (gnu packages music)
+ (gnu packages wget)
+ (gnu packages lisp)
+ (gnu packages ssh)
+ (gnu packages texinfo)
+ (gnu packages tmux)
+ (gnu packages version-control)
+ (gnu packages video)
+ (gnu packages xdisorg)
+ (gnu services)
+ (guix build-system trivial)
+ (guix download)
+ (guix gexp)
+ (guix git-download)
+ (guix modules)
+ (guix packages)
+ (guix utils))
+(heredoc:enable-syntax)
+
+(define-public hunspell-iconv
+ (package
+ (inherit hunspell)
+ (name "hunspell-iconv")
+ (inputs
+ `(("libiconv" ,libiconv)
+ ,@(package-inputs hunspell)))))
+
+(define (hunspell-dictionary-utf8 dict-name)
+ (package
+ (name (string-append "hunspell-dict-" dict-name "-utf8"))
+ (version "630b34e6f8f3cbe7aa7b27b6d8ab118e27252fd1")
+ (source
+ (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://github.com/wooorm/dictionaries")
+ (commit version)))
+ (file-name
+ (git-file-name "hunspell-dictionary-utf8" version))
+ (sha256
+ (base32 "1iknwzh5h04m067ddw9hlzc1qqj4mr9mdkcfapsnay304laaiyn5"))))
+ (build-system trivial-build-system)
+ (arguments
+ `(#:modules ((guix build utils))
+ #:builder
+ (begin
+ (use-modules (guix build utils))
+ (let ((source-prefix (string-append (assoc-ref %build-inputs "source")
+ "/dictionaries/"
+ ,dict-name
+ "/index"))
+ (install-prefix (string-append %output "/share/hunspell/")))
+ (mkdir-p install-prefix)
+ (copy-file (string-append source-prefix ".aff")
+ (string-append install-prefix ,dict-name ".aff"))
+ (copy-file (string-append source-prefix ".dic")
+ (string-append install-prefix ,dict-name ".dic"))))))
+ (synopsis (string-append "Hunspell " dict-name " dictionary in UTF-8"))
+ (description (string-append "Hunspell " dict-name " dictionary in UTF-8"))
+ (license licenses:expat)
+ (home-page "https://github.com/wooorm/dictionaries")))
+
+(define cmucl
+ (package
+ (name "cmucl-binary")
+ (version "21b")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (string-append "https://common-lisp.net/project/cmucl/downloads/release/"
+ version
+ "/cmucl-"
+ version
+ "-x86-linux.tar.bz2"))
+ (sha256
+ (base32 "13k3b5ygnbsq6n2i3r5i4ljw3r1qlskn2p5f4x9hrx6vfvbb3k7a"))))
+ (build-system trivial-build-system)
+ (arguments
+ `(#:modules ((guix build utils))
+ #:builder
+ (begin
+ (use-modules (guix build utils))
+ (let ((source (assoc-ref %build-inputs "source"))
+ (bin (string-append %output "/bin")))
+ (mkdir-p bin)
+ (copy-file (string-append source "/bin/lisp")
+ (string-append bin "/lisp"))))))
+ (home-page "https://www.cons.org/cmucl/")
+ (synopsis "The CMU implementation of Common Lisp")
+ (description #"-
+ CMUCL is a free implementation of the Common Lisp programming language
+ which runs on most major Unix platforms. It mainly conforms to the
+ ANSI Common Lisp standard."#)
+ (license licenses:public-domain)))
+
+(define msmtp-non-hardcoded
+ (package
+ (inherit msmtp)
+ (name "msmtp-non-hardcoded")
+ (arguments
+ (substitute-keyword-arguments (package-arguments msmtp)
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'install-additional-files 'patch-hardcoded-paths
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out")))
+ (substitute* (string-append out "/bin/msmtpq")
+ (("LOG=.*$") "LOG=\"$XDG_LOG_HOME\"/msmtpq.log\n")
+ (("^Q=.*$") "Q=\"$XDG_DATA_HOME\"/msmtp/queue\n")
+ (("^MSMTPQ_Q=.*$") "MSMTPQ_Q=\"$Q\"\n")
+ (("mkdir -m 0700 \"\\$Q\"") "mkdir -p -m 0700 \"$Q\"")))))))))))
+
+(define gpodder-xdg
+ (package
+ (inherit gpodder)
+ (name "gpodder-xdg")
+ (arguments
+ (substitute-keyword-arguments (package-arguments gpodder)
+ ((#:phases phases '%standard-phases)
+ #~(modify-phases #$phases
+ (add-after 'install 'wrap-with-environment-variables
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out")))
+ (for-each
+ (lambda (bin)
+ (wrap-program (string-append out "/bin/" bin)
+ '("GPODDER_HOME" = ("${XDG_DATA_HOME:-$HOME/.local/share}/gPodder"))
+ '("GPODDER_DOWNLOAD_DIR" = ("${XDG_DOWNLOAD_DIR:-$HOME/Downloads}/gPodder"))))
+ '("gpo" "gpodder")))))))))))
+
+(define (with-options pkg bin opts)
+ (package
+ (inherit pkg)
+ (arguments
+ (substitute-keyword-arguments (package-arguments pkg)
+ ((#:phases phases '%standard-phases)
+ `(modify-phases ,phases
+ (add-after 'install 'wrap-with-flags
+ (lambda* (#:key outputs #:allow-other-keys)
+ (define (wrap-options prog options)
+ (let ((wrapped-file (string-append (dirname prog) "/." (basename prog) "-orig")))
+ (rename-file prog wrapped-file)
+ (call-with-output-file prog
+ (lambda (port)
+ (format port
+ "#!/bin/sh~%~%exec \"~a\" ~a \"$@\"~%"
+ (canonicalize-path wrapped-file)
+ options)))
+ (chmod prog #o755)))
+ (wrap-options (string-append (assoc-ref outputs "out")
+ "/bin/"
+ ,bin)
+ ,opts)))))))))
+
+(define isync-with-options
+ (with-options isync "mbsync" "--config=\"$XDG_CONFIG_HOME\"/mbsync/config"))
+
+(define wget-with-options
+ (with-options wget "wget" "--hsts-file=\"$XDG_STATE_HOME\"/wget-hsts"))
+
+(define tmux-with-options
+ (with-options tmux "tmux" "-f \"$XDG_CONFIG_HOME\"/tmux/tmux.conf"))
+
+(define texinfo-with-options
+ (with-options texinfo "info" "--init-file \"$XDG_CONFIG_HOME\"/info/infokey"))
+
+(define mpv-with-options
+ (with-options mpv "mpv" (string-append "--script="
+ (getenv "HOME")
+ "/.guix-home/profile/lib/mpris.so")))
+
+(define openssh-with-options
+ (with-options openssh "ssh" "-F \"$XDG_CONFIG_HOME\"/ssh/config"))
+
+(define (xdg-config-home s)
+ (string-append (getenv "XDG_CONFIG_HOME") "/" s))
+
+
+(define (slurp name)
+ (string-trim-both
+ (call-with-input-file
+ name
+ textual-ports:get-string-all)))
+
+(define (script name content)
+ (package
+ (name name)
+ (version "latest")
+ (source #f)
+ (build-system trivial-build-system)
+ (arguments
+ `(#:modules ((guix build utils))
+ #:builder
+ (begin
+ (use-modules (guix build utils))
+ (let* ((bin (string-append %output "/bin"))
+ (prog (string-append bin "/" ,name)))
+ (mkdir-p bin)
+ (call-with-output-file prog
+ (lambda (port)
+ (format port "~a" ,content)))
+ (chmod prog #o755)))))
+ (home-page "")
+ (synopsis "")
+ (description "")
+ (license #f)))
+
+(define cronjobs
+ (list
+ #~(job "0 0 * * *" "cronjob msmtp-queue -r")
+ #~(job "0 0 * * *" "cronjob check")
+ #~(job "5 */6 * * *" "cronjob m")
+ #~(job "30 0 * * *" "cronjob x update AND upgrade")
+ #~(job "30 0 * * *" "cronjob backup -q cron")))
+
+(define (home-service name package bin)
+ (service-type
+ (name name)
+ (extensions
+ (list
+ (service-extension home-shepherd-service-type
+ (lambda _
+ (list
+ (shepherd-service
+ (provision (list name))
+ (documentation
+ (format #f "Shepherd service that manages ~a." name))
+ (start
+ #~(make-forkexec-constructor
+ (list #$(file-append package bin))))
+ (stop #~(make-kill-destructor))))))
+ (service-extension home-profile-service-type
+ (lambda _ (list package)))))
+ (default-value '())
+ (description
+ (format #f
+ #"-
+ Service that runs ~a as a daemon under Shepherd.
+
+ It has no configuration."#
+ name))))
+
+(define xdg-prefix "$HOME/.usr")
+(define (xdg path)
+ (string-append xdg-prefix "/" path))
+
+(home-environment
+ (packages
+ (append
+ (map (compose list specification->package+output symbol->string)
+ '(nss-certs
+ bash
+ coreutils
+ findutils
+ diffutils
+ grep
+ sed
+ tar
+ gawk
+ bc
+ nvi
+ patchelf
+
+ man-pages
+ man-pages-posix
+
+ bash-completion
+
+ git
+ git:send-email
+ git:gui
+ git-open
+ git-remote-gcrypt
+ git-lfs
+ mercurial
+ fossil
+ darcs
+ subversion
+ cvs
+ rcs
+ cssc
+ quilt
+
+ gnupg
+ rsync
+ tree
+ diffoscope
+ mailutils
+ entr
+ pulseaudio
+ password-store
+ playerctl
+ pinentry-gtk2
+ bmake
+ make
+ tup
+ autoconf
+ automake
+ libtool
+ pcre:out
+ pcre:bin
+ pcre:doc
+ pcre:static
+ pcre2
+ avahi
+ libgcrypt
+ qbe
+ cproc
+ doxygen
+ gperf
+ readline
+ gmp
+ help2man
+ libtomcrypt
+ libtommath
+ lz4
+ lokke
+ meson
+ ninja
+ sparse
+ ant
+ mpc
+ maven
+ pkg-config
+ fzf
+ ranger
+ blueman
+ pavucontrol
+ ledger
+ bind:utils
+ stunnel
+ netcat
+ siege
+ curl
+ curl:doc
+ xclip
+ cloc
+ strace
+ file@5.39
+ urlscan
+ rlwrap
+ direnv
+ borg
+ khal
+ khard
+ libfaketime
+ qrencode
+ feh
+ sox
+ xset
+ graphviz
+ moreutils
+ shellcheck
+ gettext
+ lilypond
+ groff
+ groff:doc
+ grap
+ ghostscript
+ texlive
+ jq
+ recutils
+ units
+ ncurses
+ trash-cli
+ lsof
+ autojump
+ unzip
+ powertop
+ md4c
+ timidity++
+ cmark
+ cmake
+ makefile2graph
+ po4a
+ mdpo
+ universal-ctags
+ gron
+ reptyr
+ xpdf
+ perf-tools
+ scdoc
+ rpm
+ cpio
+
+ ;; for compiling ECL
+ libatomic-ops
+ libgc
+ libffi
+ ;; for compiling CLISP
+ libffcall
+ libsigsegv
+
+ cryptsetup
+ btrfs-progs
+
+ flatpak
+ xdg-desktop-portal
+
+ sqlite
+ clojure
+ clojure-tools
+ leiningen
+ openjdk
+ perl
+ perl-dbi
+ perl-dbd-sqlite
+ perl-critic
+ perl-json
+ perl-mojolicious
+ perl-regexp-grammars
+ perl-commonmark
+ perl-aliased
+ perl-uri-escape
+ ruby
+ python
+ python-sphinx
+ python-slixmpp
+ python-unidecode
+ python-yubikey-manager
+ python-coverage
+ python-pytest
+ python-requests
+ python-beautifulsoup4
+ python-docx
+ python-telegram-bot
+ ; python-docutils ; broken: conflicts with python-sphinx
+ python-mkdocs
+ valgrind
+ flex
+ bison
+ gcc-toolchain
+ clang
+ tcc
+ fuse
+ ; node ; broken: conflicts with archivebox
+ quickjs
+ m4
+ go
+ xrandr
+ arandr
+ openssl
+ fswatch
+ ;; rust ; broken
+ ;; rust:cargo ; broken
+ ;; rust:rustfmt ; broken
+ vala
+ tcl
+
+ sbcl
+ gcl
+ ecl
+ clisp
+ ccl
+ abcl
+ janet
+ kawa
+ chez-scheme
+ racket
+ chibi-scheme
+ ; chicken ; broken: conflicts with gcc-toolchain
+ gambit-c
+ gauche
+
+ dash
+ fish
+ rc
+ es
+ tcsh
+ zsh
+ oksh
+ loksh
+ mksh
+ oil
+ gash
+ nushell
+
+ gtk
+ gtk:bin
+ gtk:doc
+ glade
+ ; libglade ; broken: conflicts with zathura
+ cambalache
+ tk
+ qtbase
+ qtbase:debug
+ qtdeclarative
+
+ st
+ i3status
+ xmessage
+ dmenu
+ httpd ;; for htpasswd
+
+ weechat
+ alot
+ notmuch
+ w3m
+ afew
+ qtox
+ telescope
+ imagemagick
+ ffmpeg
+ pandoc
+ mktorrent
+ jekyll
+ flac
+ mediainfo
+ libnotify
+ espeak-ng
+ procps
+ htop
+ zenity
+ util-linux
+ lightning
+ lmdb
+ guile
+ guile-heredoc-latest
+ gzip
+ xz
+ bzip2
+ lzip
+ lzop
+ which
+ libxml2
+ psmisc
+ less
+ nano
+ patch
+ youtube-dl
+ tmux-plugin-resurrect
+ tmux-plugin-continuum
+
+ ;; ArchiveBox and some of its optional dependencies
+ archivebox
+ ripgrep
+
+ poezio
+ freetalk
+ mcabber
+ profanity
+ newsboat
+ mpv-mpris
+ vlc
+ hicolor-icon-theme
+
+ keepassxc
+
+ xbacklight
+
+ gnote
+ telegram-desktop
+ zathura
+ zathura-djvu
+ zathura-pdf-poppler
+ zathura-ps
+ dino
+ poedit
+ transmission
+ transmission:gui
+ audacity
+ inkscape
+ libreoffice
+ quodlibet
+ ungoogled-chromium
+ icedove
+ firefox))
+ (list msmtp-non-hardcoded
+ ;; cmucl
+ isync-with-options
+ wget-with-options
+ tmux-with-options
+ texinfo-with-options
+ mpv-with-options
+ openssh-with-options
+ hunspell-iconv
+ gpodder-xdg
+ (hunspell-dictionary-utf8 "en")
+ (hunspell-dictionary-utf8 "pt")
+ (hunspell-dictionary-utf8 "fr")
+ (hunspell-dictionary-utf8 "eo")
+ (script "cronjob" (slurp (string-append (getenv "XDG_CONFIG_HOME")
+ "/sh/cronjob.sh"))))))
+ (services
+ (list
+ (service (home-service 'clipmenu clipmenu "/bin/clipmenud"))
+ (service (home-service 'dunst dunst "/bin/dunst"))
+ (service (home-service 'poweralertd poweralertd "/bin/poweralertd"))
+ (service home-xdg-base-directories-service-type
+ (home-xdg-base-directories-configuration
+ (cache-home (xdg "var/cache"))
+ (config-home (xdg "etc"))
+ (data-home (xdg "share"))
+ (log-home (xdg "var/log"))
+ (state-home (xdg "var/state"))))
+ (simple-service 'my-shell-profile home-shell-profile-service-type
+ (list (plain-file
+ "my-profile"
+ (format #f
+ #"-
+ export XDG_PREFIX="~a"
+ . "$XDG_CONFIG_HOME"/sh/rc"#
+ xdg-prefix))))
+ (service home-mcron-service-type
+ (home-mcron-configuration
+ (jobs cronjobs))))))
diff --git a/etc/guix/system.scm b/etc/guix/system.scm
new file mode 100644
index 0000000..fddadca
--- /dev/null
+++ b/etc/guix/system.scm
@@ -0,0 +1,209 @@
+(use-modules
+ ((xyz euandreh heredoc) #:prefix heredoc:)
+ (gnu bootloader)
+ (gnu bootloader grub)
+ (gnu packages)
+ (gnu services base)
+ (gnu services cups)
+ (gnu services desktop)
+ (gnu services docker)
+ (gnu services pm)
+ (gnu services security-token)
+ (gnu services sound)
+ (gnu services ssh)
+ (gnu services virtualization)
+ (gnu services vpn)
+ (gnu services xorg)
+ (gnu system keyboard)
+ (gnu system file-systems)
+ (gnu system locale)
+ (gnu system mapped-devices)
+ (guix gexp)
+ (guix packages)
+ (nongnu packages linux)
+ (nongnu system linux-initrd)
+ (srfi srfi-1)
+ (xyz euandreh queue))
+(heredoc:enable-syntax)
+
+(operating-system
+ (kernel linux)
+ (initrd microcode-initrd)
+ (firmware (list linux-firmware))
+ (locale "fr_FR.UTF-8")
+ (locale-definitions
+ (append
+ (list
+ (locale-definition
+ (name "pt_BR.UTF-8")
+ (source "pt_BR")))
+ %default-locale-definitions))
+ (timezone "America/Sao_Paulo")
+ (keyboard-layout
+ (keyboard-layout "br" #:options '("caps:swapescape" "esperanto:qwerty")))
+ (host-name "velhinho")
+ (hosts-file
+ (plain-file
+ "hosts"
+ (format #f
+ #"-
+ 127.0.0.1 localhost ~a
+ ::1 localhost ~a
+
+ 10.0.2.1 kuvira.wg
+ 10.0.2.2 velhinho.wg
+ "#
+ host-name
+ host-name)))
+ (users
+ (append
+ (list
+ (user-account
+ (name "andreh")
+ (comment "EuAndreh")
+ (group "users")
+ (supplementary-groups '("netdev" "audio" "video" "wheel" "kvm" "docker"))))
+ %base-user-accounts))
+ (packages
+ (append
+ (map (compose list specification->package+output symbol->string)
+ '(nss-certs
+ i3-wm
+ guile
+ guile-heredoc-latest))
+ (list)
+ (remove (lambda (package)
+ (equal? "wget" (package-name package)))
+ %base-packages)))
+ (services
+ (append
+ (list
+ (service bluetooth-service-type)
+ (service tlp-service-type)
+ (service thermald-service-type)
+ (service pcscd-service-type)
+ (service docker-service-type)
+ (service libvirt-service-type)
+ (service virtlog-service-type)
+ (service xfce-desktop-service-type)
+ (service mate-desktop-service-type)
+ (service lxqt-desktop-service-type)
+ (service enlightenment-desktop-service-type)
+ (service gnome-desktop-service-type)
+ (service gnome-keyring-service-type)
+ (service wireguard-service-type
+ (wireguard-configuration
+ (addresses '("10.0.2.2/24"))
+ (peers
+ (list
+ (wireguard-peer
+ (name "kuvira")
+ (endpoint "euandreh.xyz:51820")
+ (public-key "FwXqY9wXO8jK/D7lyprI+cslVeb9AqOQBAbxKG6S5lE=")
+ (allowed-ips '("10.0.2.1/32"))
+ (keep-alive 25))))))
+ (service qemu-binfmt-service-type
+ (qemu-binfmt-configuration
+ (platforms
+ (lookup-qemu-platforms "arm" "aarch64"))))
+ (service cups-service-type
+ (cups-configuration
+ (web-interface? #t)
+ (extensions
+ (list epson-L365))))
+ (service openssh-service-type
+ (openssh-configuration
+ (password-authentication? #f)
+ (authorized-keys
+ `(("andreh" ,(local-file
+ (string-append (or (getenv "XDG_CONFIG_HOME")
+ (string-append (getenv "HOME") "/.ssh"))
+ "/ssh/id_rsa.pub")))))
+ (extra-content #"-
+ ClientAliveInterval 30
+ ClientAliveCountMax 20
+ MaxSessions 20
+ "#)))
+ #;
+ (udev-rules-service
+ 'backlight
+ (udev-rule
+ "backlight.rule"
+ (string-replace
+ #"-
+ ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="@DEVICE@", GROUP="video", MODE="0664"
+ "#
+ "@DEVICE@"
+ (getenv "BACKLIGHT_DEVICE"))))
+ (set-xorg-configuration
+ (xorg-configuration
+ (keyboard-layout keyboard-layout)
+ (extra-config
+ (list
+ #"-
+ Section "InputClass"
+ Identifier "touchpad"
+ Driver "libinput"
+ MatchIsTouchpad "on"
+ Option "Tapping" "on"
+ EndSection
+ Section "Device"
+ Identifier "Intel Graphics"
+ Driver "intel"
+ Option "Backlight" "intel_backlight"
+ EndSection
+ "#)))))
+ (modify-services %desktop-services
+ (pulseaudio-service-type config =>
+ (pulseaudio-configuration
+ (inherit config)
+ (extra-script-files
+ (list
+ (plain-file
+ "noise-cancelling.pa"
+ #"-
+ load-module module-echo-cancel
+ "#)))))
+ (guix-service-type config =>
+ (guix-configuration
+ (inherit config)
+ (substitute-urls
+ (append
+ '("https://substitutes.nonguix.org")
+ %default-substitute-urls))
+ (authorized-keys
+ (append
+ (list
+ (plain-file
+ "non-guix.pub"
+ #"-
+ (public-key
+ (ecc
+ (curve Ed25519)
+ (q #C1FD53E5D4CE971933EC50C9F307AE2171A2D3B52C804642A7A35F84F3A4EA98#)))
+ "#))
+ %default-authorized-guix-keys)))))))
+ (bootloader
+ (bootloader-configuration
+ (bootloader grub-efi-bootloader)
+ (targets '("/boot/efi"))
+ (keyboard-layout keyboard-layout)))
+ (mapped-devices
+ (list
+ (mapped-device
+ (source (uuid "6b0d38a6-d93e-4f8e-a59a-7729f5adf892"))
+ (target "cryptroot")
+ (type luks-device-mapping))))
+ (file-systems
+ (append
+ (list
+ (file-system
+ (mount-point "/boot/efi")
+ (device (uuid "1B26-9F4E" 'fat32))
+ (type "vfat"))
+ (file-system
+ (mount-point "/")
+ (device "/dev/mapper/cryptroot")
+ (type "ext4")
+ (dependencies mapped-devices)))
+ %base-file-systems)))
diff --git a/etc/hg/hgrc b/etc/hg/hgrc
new file mode 100644
index 0000000..656f40b
--- /dev/null
+++ b/etc/hg/hgrc
@@ -0,0 +1,2 @@
+[ui]
+username = EuAndreh <eu@euandre.org>
diff --git a/etc/i3/config b/etc/i3/config
new file mode 100644
index 0000000..94648b2
--- /dev/null
+++ b/etc/i3/config
@@ -0,0 +1,185 @@
+set $mod Mod4
+
+
+# font pango:monospace 8
+
+# This font is widely installed, provides lots of unicode glyphs, right-to-left
+# text rendering and scalability on retina/hidpi displays (thanks to pango).
+font pango:DejaVu Sans Mono 8
+
+# Start XDG autostart .desktop files using dex. See also
+# https://wiki.archlinux.org/index.php/XDG_Autostart
+# exec --no-startup-id dex --autostart --environment i3
+
+# The combination of xss-lock, nm-applet and pactl is a popular choice, so
+# they are included here as an example. Modify as you see fit.
+
+# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
+# screen before suspend. Use loginctl lock-session to lock your screen.
+exec xss-lock --transfer-sleep-lock -- i3lock --nofork
+
+# NetworkManager is the most popular way to manage wireless networks on Linux,
+# and nm-applet is a desktop environment-independent system tray GUI for it.
+exec nm-applet
+exec blueman-applet
+
+# Use pactl to adjust volume in PulseAudio.
+set $refresh_i3status killall -SIGUSR1 i3status
+bindsym F1 exec volume toggle && $refresh_i3status
+bindsym F2 exec volume down && $refresh_i3status
+bindsym F3 exec volume up && $refresh_i3status
+bindsym $mod+Shift+s exec volume rotate && $refresh_i3status
+
+bindsym F4 exec player backward
+bindsym Shift+F4 exec player previous
+bindsym F5 exec player play-pause
+Bindsym Shift+F5 exec player rotate
+bindsym F6 exec player forward
+bindsym Shift+F6 exec player next
+
+bindsym F7 exec brightness -1
+bindsym F8 exec brightness +1
+
+
+
+
+
+# Use Mouse+$mod to drag floating windows to their wanted position
+floating_modifier $mod
+
+bindsym $mod+Return exec st
+bindsym $mod+Shift+q kill
+
+
+
+
+bindsym $mod+u exec wms uuid
+bindsym $mod+t exec wms date
+bindsym $mod+m exec wms clear-notification
+bindsym $mod+p exec menu bin
+bindsym $mod+o exec menu emoji
+bindsym $mod+v exec menu clipboard
+bindsym $mod+i exec menu password
+bindsym $mod+Control+i exec menu username
+bindsym $mod+Control+Shift+i exec menu yubikey
+
+
+
+
+# change focus
+bindsym $mod+h focus left
+bindsym $mod+j focus down
+bindsym $mod+k focus up
+bindsym $mod+l focus right
+
+# move focused window
+bindsym $mod+Shift+h move left
+bindsym $mod+Shift+j move down
+bindsym $mod+Shift+k move up
+bindsym $mod+Shift+l move right
+
+# bindsym $mod+h split h # what is this?
+
+# split in vertical orientation
+bindsym $mod+Shift+v split v
+
+# enter fullscreen mode for the focused container
+bindsym $mod+f fullscreen toggle
+
+# change container layout (stacked, tabbed, toggle split)
+bindsym $mod+s layout stacking
+bindsym $mod+w layout tabbed
+bindsym $mod+e layout toggle split
+
+# toggle tiling / floating
+bindsym $mod+Shift+space floating toggle
+
+# change focus between tiling / floating windows
+bindsym $mod+space focus mode_toggle
+
+# focus the parent container
+bindsym $mod+a focus parent
+
+# focus the child container
+bindsym $mod+d focus child
+
+# Define names for default workspaces for which we configure key bindings later on.
+# We use variables to avoid repeating the names in multiple places.
+set $ws1 "1"
+set $ws2 "2"
+set $ws3 "3"
+set $ws4 "4"
+set $ws5 "5"
+set $ws6 "6"
+set $ws7 "7"
+set $ws8 "8"
+set $ws9 "9"
+set $ws10 "10"
+
+# switch to workspace
+bindsym $mod+1 workspace number $ws1
+bindsym $mod+2 workspace number $ws2
+bindsym $mod+3 workspace number $ws3
+bindsym $mod+4 workspace number $ws4
+bindsym $mod+5 workspace number $ws5
+bindsym $mod+6 workspace number $ws6
+bindsym $mod+7 workspace number $ws7
+bindsym $mod+8 workspace number $ws8
+bindsym $mod+9 workspace number $ws9
+bindsym $mod+0 workspace number $ws10
+
+# move focused container to workspace
+bindsym $mod+Shift+1 move container to workspace number $ws1
+bindsym $mod+Shift+2 move container to workspace number $ws2
+bindsym $mod+Shift+3 move container to workspace number $ws3
+bindsym $mod+Shift+4 move container to workspace number $ws4
+bindsym $mod+Shift+5 move container to workspace number $ws5
+bindsym $mod+Shift+6 move container to workspace number $ws6
+bindsym $mod+Shift+7 move container to workspace number $ws7
+bindsym $mod+Shift+8 move container to workspace number $ws8
+bindsym $mod+Shift+9 move container to workspace number $ws9
+bindsym $mod+Shift+0 move container to workspace number $ws10
+
+# reload the configuration file
+bindsym $mod+Shift+c reload
+# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
+bindsym $mod+Shift+r restart
+# exit i3 (logs you out of your X session)
+bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
+
+# resize window (you can also use the mouse for that)
+mode "resize" {
+ # These bindings trigger as soon as you enter the resize mode
+
+ # Pressing left will shrink the window’s width.
+ # Pressing right will grow the window’s width.
+ # Pressing up will shrink the window’s height.
+ # Pressing down will grow the window’s height.
+ bindsym h resize shrink width 10 px or 10 ppt
+ bindsym j resize grow height 10 px or 10 ppt
+ bindsym k resize shrink height 10 px or 10 ppt
+ bindsym l resize grow width 10 px or 10 ppt
+
+ # same bindings, but for the arrow keys
+ # bindsym Left resize shrink width 10 px or 10 ppt
+ # bindsym Down resize grow height 10 px or 10 ppt
+ # bindsym Up resize shrink height 10 px or 10 ppt
+ # bindsym Right resize grow width 10 px or 10 ppt
+
+ # back to normal: Enter or Escape or $mod+r
+ bindsym Return mode "default"
+ bindsym Caps_Lock mode "default"
+ bindsym $mod+r mode "default"
+}
+
+bindsym $mod+r mode "resize"
+
+# Start i3bar to display a workspace bar (plus the system information i3status
+# finds out, if available)
+bar {
+ position top
+ status_command i3status | status-bar
+}
+
+default_border pixel
+default_floating_border pixel
diff --git a/etc/i3status/config b/etc/i3status/config
new file mode 100644
index 0000000..8099a2f
--- /dev/null
+++ b/etc/i3status/config
@@ -0,0 +1,31 @@
+general {
+ output_format = "i3bar"
+ colors = true
+}
+
+order += "wireless _first_"
+order += "battery all"
+order += "disk /"
+order += "memory"
+order += "tztime local"
+
+wireless _first_ {
+ format_up = "%essid ~%quality"
+}
+
+battery all {
+ format = "bat: %status %percentage %remaining"
+}
+
+disk "/" {
+ format = "disk: %avail"
+}
+
+memory {
+ format = "mem: %used/%total"
+ threshold_degraded = "1G"
+}
+
+tztime local {
+ format = "%A, %Y-%m-%d %H:%M:%S"
+}
diff --git a/etc/info/infokey b/etc/info/infokey
new file mode 100644
index 0000000..90edc50
--- /dev/null
+++ b/etc/info/infokey
@@ -0,0 +1,7 @@
+^e down-line
+^y up-line
+
+#var
+link-style=cyan
+active-link-style=blue,bold
+match-style=underline,bold,bggreen
diff --git a/etc/khal/config b/etc/khal/config
new file mode 100644
index 0000000..f42a87b
--- /dev/null
+++ b/etc/khal/config
@@ -0,0 +1,16 @@
+[calendars]
+
+[[private]]
+path = $XDG_DATA_HOME/khal/calendars/private/
+type = calendar
+
+[locale]
+timeformat = %H:%M
+dateformat = %d/%m/%Y
+longdateformat = %d/%m/%Y
+datetimeformat = %d/%m/%Y %H:%M
+longdatetimeformat = %d/%m/%Y %H:%M
+default_timezone = America/Sao_Paulo
+
+[default]
+default_calendar = private
diff --git a/etc/khard/khard.conf b/etc/khard/khard.conf
new file mode 100644
index 0000000..e6ef986
--- /dev/null
+++ b/etc/khard/khard.conf
@@ -0,0 +1,13 @@
+[addressbooks]
+
+[[private]]
+path = $XDG_DATA_HOME/khard/contacts/private/
+
+[general]
+default_action = list
+
+[contact table]
+show_nicknames = yes
+
+[vcard]
+preferred_version = 4.0
diff --git a/etc/lisp-cli/init.lisp b/etc/lisp-cli/init.lisp
new file mode 100644
index 0000000..69cb054
--- /dev/null
+++ b/etc/lisp-cli/init.lisp
@@ -0,0 +1,33 @@
+#-quicklisp
+(let ((quicklisp-init (merge-pathnames "dev/quicklisp/setup.lisp"
+ (user-homedir-pathname))))
+ (when (probe-file quicklisp-init)
+ (load quicklisp-init)))
+
+(setf ql:*quickload-verbose* t)
+
+(defun load-once (p)
+ (let ((k (intern
+ (concatenate 'string
+ (string :ql/)
+ (string p))
+ "KEYWORD")))
+ (unless (member k *features*)
+ (ql:quickload p :verbose t)
+ (pushnew k *features*))
+ k))
+
+(mapcar #'load-once
+ (list
+ :cl-ppcre
+ :cffi
+ :trivial-dump-core
+ :named-readtables
+ :rstring))
+
+(mapcar (lambda (p)
+ (pushnew (concatenate 'string p "/") cffi:*foreign-library-directories*
+ :test #'equal))
+ (cl-ppcre:split ":" (uiop:getenv "LIBRARY_PATH")))
+
+(load-once :cl-fswatch)
diff --git a/etc/mailcaps/config b/etc/mailcaps/config
new file mode 100644
index 0000000..60f7286
--- /dev/null
+++ b/etc/mailcaps/config
@@ -0,0 +1 @@
+text/html; env HOME=$XDG_DATA_HOME/w3m w3m -dump -o document_charset=%{charset} '%s'; nametemplate=%s.html; copiousoutput
diff --git a/etc/newsboat/config b/etc/newsboat/config
new file mode 100644
index 0000000..b138e1d
--- /dev/null
+++ b/etc/newsboat/config
@@ -0,0 +1 @@
+text-width 80
diff --git a/etc/newsboat/urls b/etc/newsboat/urls
new file mode 120000
index 0000000..c7c1b2d
--- /dev/null
+++ b/etc/newsboat/urls
@@ -0,0 +1 @@
+../../var/lib/private/tilde/newsboat/urls \ No newline at end of file
diff --git a/etc/python/pythonrc.py b/etc/python/pythonrc.py
new file mode 100644
index 0000000..1fc3bfe
--- /dev/null
+++ b/etc/python/pythonrc.py
@@ -0,0 +1,15 @@
+import os
+import atexit
+import readline
+
+history = os.path.join(os.environ["XDG_STATE_HOME"], "python-history")
+
+try:
+ readline.read_history_file(history)
+except OSError:
+ pass
+
+def write_history():
+ readline.write_history_file(history)
+
+atexit.register(write_history)
diff --git a/etc/ranger/rc.conf b/etc/ranger/rc.conf
new file mode 100644
index 0000000..2f1d9c9
--- /dev/null
+++ b/etc/ranger/rc.conf
@@ -0,0 +1,4 @@
+map DD shell trash %s
+map XX shell rm -rf %s
+map <C-e> scroll_preview 1
+map <C-y> scroll_preview -1
diff --git a/etc/remhind/config.tmpl b/etc/remhind/config.tmpl
new file mode 100644
index 0000000..4d74b20
--- /dev/null
+++ b/etc/remhind/config.tmpl
@@ -0,0 +1,4 @@
+[calendars]
+ [calendars.private_cal]
+ name = "private_cal"
+ path = "${XDG_DATA_HOME}/khal/calendars/private/"
diff --git a/etc/sh/cronjob.sh b/etc/sh/cronjob.sh
new file mode 100755
index 0000000..0569b44
--- /dev/null
+++ b/etc/sh/cronjob.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+set -eu
+
+usage() {
+ cat <<-'EOF'
+ Usage:
+ cronjob COMMAND...
+ cronjob -h
+ EOF
+}
+
+help() {
+ cat <<-'EOF'
+
+ Options:
+ -h, --help show this message
+
+ COMMAND the command to be executed
+
+
+ Execute the given command, and send the output to email, with
+ special treatment to the status code.
+
+ It loads the appropriate files, so that the actual cron
+ declaration is smaller.
+
+
+ Examples:
+
+ Run a backup:
+
+ $ cronjob backup -q cron
+ EOF
+}
+
+
+for flag in "$@"; do
+ case "$flag" in
+ --)
+ break
+ ;;
+ --help)
+ usage
+ help
+ exit
+ ;;
+ *)
+ ;;
+ esac
+done
+
+while getopts 'h' flag; do
+ case "$flag" in
+ h)
+ usage
+ help
+ exit
+ ;;
+ *)
+ usage >&2
+ exit 2
+ ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+
+set +e
+# shellcheck disable=1090
+. ~/.profile
+set -e
+
+CMD="$*"
+with-email -s "$CMD" -- "$@" 1>>"$XDG_LOG_HOME"/euandreh/mcron.log 2>&1
diff --git a/etc/sh/privrc.sh b/etc/sh/privrc.sh
new file mode 120000
index 0000000..f946f34
--- /dev/null
+++ b/etc/sh/privrc.sh
@@ -0,0 +1 @@
+../../var/lib/private/tilde/privrc.sh \ No newline at end of file
diff --git a/etc/sh/rc b/etc/sh/rc
new file mode 100644
index 0000000..ae552a6
--- /dev/null
+++ b/etc/sh/rc
@@ -0,0 +1,364 @@
+#!/bin/sh
+# shellcheck disable=1090,1091
+
+export ENV=~/.profile
+
+export XDG_DATA_DIRS="$XDG_DATA_HOME/flatpak/exports/share:/var/lib/flatpak/exports/share${XDG_DATA_DIRS:+:}${XDG_DATA_DIRS:-}"
+
+
+mkdir -p \
+ "$XDG_CONFIG_HOME" \
+ "$XDG_CACHE_HOME/euandreh" \
+ "$XDG_DATA_HOME/euandreh" \
+ "$XDG_STATE_HOME/euandreh" \
+ "$XDG_LOG_HOME/euandreh"
+
+GUIX_PROFILE="$XDG_CONFIG_HOME"/guix/current
+if [ -r "$GUIX_PROFILE"/etc/profile ]; then
+ . "$GUIX_PROFILE"/etc/profile
+fi
+
+idempotent_path_add() {
+ case "$(eval "echo \$$1")" in
+ *"$2"*)
+ ;;
+ *)
+ eval "export $1=$2\${$1:+:}\${$1:-}"
+ ;;
+ esac
+}
+export A="$HOME${A:+:}${A:-}"
+# idempotent_path_add B "$HOME"
+export XDG_DATA_DIRS="$XDG_DATA_HOME/flatpak/exports/share:/var/lib/flatpak/exports/share${XDG_DATA_DIRS:+:}${XDG_DATA_DIRS:-}"
+# idempotent_path_add XDG_DATA_DIRS "$XDG_DATA_HOME/flatpak/exports/share"
+
+
+
+#
+#
+#
+
+export HISTSIZE=-1
+export HISTFILE="$XDG_STATE_HOME/sh-history"
+export SRC=~/dev
+export PRIV_CONFIG="$XDG_PREFIX"/var/lib/private/tilde
+export EDITOR='e'
+export VISUAL="$EDITOR"
+export PAGER='less -R'
+export BROWSER='firefox'
+export MAILDIR=~/Maildir
+export BACKLIGHT_DEVICE='acpi_video0'
+
+export GUILE_HISTORY="$XDG_STATE_HOME/guile-history"
+export GNUPGHOME="$XDG_CONFIG_HOME/gnupg"
+export RLWRAP_HOME="$XDG_CACHE_HOME/rlwrap"
+export LESSHISTFILE="$XDG_STATE_HOME/lesshst"
+export NOTMUCH_CONFIG="$XDG_CONFIG_HOME/notmuch/default/config"
+export PASSWORD_STORE_DIR="$SRC/private/password-store"
+export MAILCAPS="$XDG_CONFIG_HOME/mailcaps/config"
+export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/pythonrc.py"
+export EXINIT='
+ " set number
+ " set autoindent
+ set ruler
+ set showmode
+ set showmatch
+'
+
+HOSTNAME="$(hostname)"
+export BORG_PASSCOMMAND="pass show $HOSTNAME/borg/passphrase"
+export BORG_REPO="suyin:borg/$HOSTNAME"
+export BORG_REMOTE_PATH='borg1'
+
+N_PROCS=$(($(nproc) * 2 + 1))
+GUILE_EFFECTIVE_VERSION="$(guile -c '(display (effective-version))')"
+export MAKEFLAGS="-j $N_PROCS"
+export GOPATH="$SRC/go"
+export CFLAGS='-std=c99 -Wall -Wextra -Wpedantic -g -flto -Werror'
+export CC=gcc
+export AR=gcc-ar
+export LEX=flex
+export LDFLAGS='-flto'
+export LISP='sbcl --eval'
+export N_PROCS GUILE_EFFECTIVE_VERSION
+export LISP_CLI_IMPL=clisp
+
+add_prefix() {
+ export GUILE_LOAD_PATH="$1/share/guile/site/$GUILE_EFFECTIVE_VERSION${GUILE_LOAD_PATH:+:}${GUILE_LOAD_PATH:-:}"
+ export GUILE_LOAD_COMPILED_PATH="$1/lib/guile/$GUILE_EFFECTIVE_VERSION/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}${GUILE_LOAD_COMPILED_PATH:-}"
+ export C_INCLUDE_PATH="$1/include${C_INCLUDE_PATH:+:}${C_INCLUDE_PATH:-}"
+ export LIBRARY_PATH="$1/lib${LIBRARY_PATH:+:}${LIBRARY_PATH:-}"
+ export INFOPATH="$1/share/info${INFOPATH:+:}${INFOPATH:-}"
+ export MANPATH="$1/share/man${MANPATH:+:}${MANPATH:-}"
+ export DICPATH="$1/share/hunspell${DICPATH:+:}${DICPATH:-}"
+ export PATH="$1/bin${PATH:+:}${PATH:-}"
+}
+export PREFIX="$XDG_PREFIX/var/mkg"
+add_prefix "$PREFIX"
+add_prefix "$XDG_PREFIX"
+
+for d in "$XDG_PREFIX"/opt/bin-dirs/*; do
+ PATH="$d:$PATH"
+done
+
+
+
+#
+# Aliases
+#
+
+unalias -a
+
+alias p='ping euandre.org -c 3'
+alias c='tmux send-keys -R \; clear-history'
+alias o='open'
+alias mm='msmtp-queue -r'
+alias s='vcs status'
+alias d='vcs diff'
+alias ds='vcs diff -- --staged'
+alias tpd='cd "$(mkdtemp)"'
+
+alias l='ls -lahF --color'
+alias grep='grep --color=auto'
+alias diff='diff --color=auto'
+alias watch='watch --color '
+alias man='MANWIDTH=$((COLUMNS > 80 ? 80 : COLUMNS)) man'
+alias less='less -R'
+alias tree='tree -aC'
+alias make='make -e'
+alias mv='mv -i'
+alias vi='echo "Use \"e\" instead."; false'
+alias bc='bc -l'
+
+alias sqlite='rlwrap sqlite3'
+alias guile='guile -l "$XDG_CONFIG_HOME"/guile/init.scm'
+
+alias flush='sync && echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null'
+alias kal='khal calendar today `LANG=en.UTF-8 date +%A`'
+
+
+
+#
+# PS1
+#
+
+error_marker() {
+ STATUS=$?
+ if [ "$STATUS" != 0 ]; then
+ color -c redb " (!! $STATUS !!) "
+ fi
+}
+
+shell_status_level() {
+ if [ -z "${SHLVL:-}" ]; then
+ return
+ fi
+
+ if [ -n "${TMUX:-}" ]; then
+ LVL=$((SHLVL - 1))
+ else
+ LVL="$SHLVL"
+ fi
+
+ if [ "$LVL" = 1 ]; then
+ return
+ fi
+
+ color -c white "$LVL"
+ if [ -n "${RANGER_LEVEL:-}" ]; then
+ color -c white '|'
+ color -c bluei 'r'
+ fi
+}
+
+shell_status_jobs() {
+ JOBS="$(jobs | grep -cv autojump)"
+ if [ "$JOBS" != 0 ]; then
+ color -c red "$JOBS"
+ fi
+}
+
+shell_status() {
+ LEVEL="$(shell_status_level)"
+ JOBS="$(shell_status_jobs)"
+
+ if [ -z "$LEVEL" ] && [ -z "$JOBS" ]; then
+ return
+ fi
+
+ color -c white '['
+ printf '%s' "$LEVEL"
+ if [ -n "$LEVEL" ] && [ -n "$JOBS" ]; then
+ color -c white '|'
+ fi
+ printf '%s' "$JOBS"
+ color -c white ']'
+ printf ' '
+}
+
+timestamp() {
+ color -c blacki '\T'
+}
+
+path() {
+ color -c yellowb '\w/'
+}
+
+guix_env() {
+ if [ -z "${GUIX_ENVIRONMENT:-}" ]; then
+ return
+ fi
+
+ printf '\n'
+ color -c blacki '~> '
+ color -c purple 'guix environment '
+ printf '('
+ color -c blueb "$GUIX_ENVIRONMENT"
+ printf ')'
+}
+
+in_nix_shell() {
+ if [ -z "${IN_NIX_SHELL:-}" ]; then
+ return
+ fi
+
+ printf '\n'
+ color -c blacki '~> '
+ color -c purpleb "$IN_NIX_SHELL "
+ color -c purple 'nix-shell '
+ printf '('
+ color -c blueb "${name:-}"
+ printf ')'
+}
+
+PS1='`error_marker`'$(timestamp)' '$(path)' `shell_status``vcs ps1``guix_env``in_nix_shell`
+$ '
+
+
+
+# g '^\w.*json_destroy('
+g() {
+ # shellcheck disable=2086
+ fn=$(git grep -n -- "$1" ${2:-} | \
+ cut -d: -f -2 | \
+ fzf --select-1 \
+ --exit-0 \
+ --preview "echo {} | \
+ cut -d: -f1 | \
+ xargs -I% awk -v bounds=25 -v pat=\"$1\" -v n=\$(echo {} | cut -d: -f2) '
+ (n - bounds < NR) && (NR < n + bounds) && (NR != n) { print }
+ NR==n { gsub(pat, \"\033[1;33m&\033[1;000m\"); print }
+ ' %")
+ if [ -n "$fn" ]; then
+ f="$(echo "$fn" | cut -d: -f1)"
+ n="$(echo "$fn" | cut -d: -f2)"
+ # shellcheck disable=2068
+ # history -s g "$@"
+ # history -s vi "+$n" "$f"
+ # vi "+$n" "$f"
+ history -s g "$@"
+ history -s e "+$n" "$f"
+ e "+$n" "$f"
+ fi
+}
+
+f() {
+ # profile="f-shell-function$(pwd | sed -e 's_/_-_g')"
+ # file="$(git ls-files | grep ${2:-.} | remembering -p "$profile" -c "fzf --select-1 --exit-0 --preview 'cat {}'")"
+ # shellcheck disable=2086
+ file="$(git ls-files | grep ${2:-.} | fzf --select-1 --exit-0 --preview 'cat {}')"
+ if [ -n "$file" ]; then
+ # shellcheck disable=2068
+ history -s f "$@"
+ history -s "$1" "$file"
+ "$1" "$file"
+ fi
+}
+
+
+
+r() {
+ . ~/.profile
+ xset r rate 225 100
+}
+
+_edit_without_executing() {
+ F="$(mkstemp)"
+ printf '%s\n' "$READLINE_LINE" > "$F"
+ e "$F"
+ READLINE_LINE="$(cat "$F")"
+ READLINE_POINT="${#READLINE_LINE}"
+ rm -f "$F"
+}
+if set -o | grep 'on' | grep -Eq '^(vi|emacs)'; then
+ bind -x '"\C-x\C-e":_edit_without_executing'
+fi
+
+
+
+
+#
+# GPG and SSH agents configuration
+#
+
+SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
+GPG_TTY=$(tty ||:)
+export GPG_TTY SSH_AUTH_SOCK
+gpgconf --launch gpg-agent
+
+
+
+case $- in
+ *i*)
+ stty -ixon # Disable C-s/C-q mode
+ ;;
+ *)
+ ;;
+esac
+
+F="$PRIV_CONFIG"/privrc.sh
+if [ -r "$F" ]; then
+ # Extra rc code to be loaded, stored in private repository
+ . "$F"
+fi
+
+
+
+#
+# From here on, bash-specific things.
+#
+
+if [ -z "$BASH_VERSION" ]; then
+ return
+fi
+
+ln -fs .profile ~/.bashrc
+
+export INPUTRC="$XDG_CONFIG_HOME/bash/inputrc"
+export HISTCONTROL=ignorespace:ignoredups
+
+eval "$(direnv hook bash)"
+
+
+#
+# From here on, interactive-only bash-specific things.
+#
+
+case $- in
+ *i*)
+ ;;
+ *)
+ return
+ ;;
+esac
+
+# IIRC, the Guix profile should do this
+for f in "$HOME_ENVIRONMENT"/profile/etc/bash_completion.d/*; do
+ . "$f"
+done
+
+# IIRC, the Guix package should do this
+F="$HOME_ENVIRONMENT"/profile/share/autojump/autojump.bash
+if [ -r "$F" ]; then
+ . "$F"
+fi
diff --git a/etc/sh/root-rc b/etc/sh/root-rc
new file mode 100644
index 0000000..f78f293
--- /dev/null
+++ b/etc/sh/root-rc
@@ -0,0 +1,87 @@
+#!/bin/sh
+# shellcheck disable=1090,1091
+export ENV=~/.profile
+
+XDG_PREFIX=~/.usr
+export XDG_CACHE_HOME="$XDG_PREFIX/var/cache"
+export XDG_CONFIG_HOME="$XDG_PREFIX/etc"
+export XDG_DATA_HOME="$XDG_PREFIX/share"
+export XDG_STATE_HOME="$XDG_PREFIX/state"
+export XDG_LOG_HOME="$XDG_PREFIX/var/log"
+
+mkdir -p \
+ "$XDG_CACHE_HOME" \
+ "$XDG_CONFIG_HOME" \
+ "$XDG_DATA_HOME" \
+ "$XDG_STATE_HOME" \
+ "$XDG_LOG_HOME"
+
+GUIX_PROFILE="$XDG_CONFIG_HOME"/guix/current
+if [ -e "$GUIX_PROFILE"/etc/profile ]; then
+ . "$GUIX_PROFILE"/etc/profile
+fi
+
+HISTSIZE=-1
+HISTFILE="$XDG_STATE_HOME"/bash-history
+HISTCONTROL=ignorespace:ignoredups
+
+export EDITOR='vi'
+export VISUAL="$EDITOR"
+export PAGER='less -R'
+export GUILE_HISTORY="$XDG_STATE_HOME"/guile-history
+export RLWRAP_HOME="$XDG_CACHE_HOME"/rlwrap
+export LESSHISTFILE="$XDG_STATE_HOME"/lesshst
+export EXINIT='
+ " set number
+ set autoindent
+ set ruler
+ set showmode
+ set showmatch
+'
+
+alias l='ls -lahF --color=auto'
+alias grep='grep --color=auto'
+alias diff='diff --color'
+alias less='less -R'
+alias mv='mv -i'
+alias rm='rm -i'
+alias r='reload'
+
+reload() {
+ . ~/.profile
+}
+
+
+
+#
+# PS1
+#
+
+error_marker() {
+ STATUS=$?
+ if [ "$STATUS" != 0 ]; then
+ printf ' (!! %s !!) ' "$STATUS"
+ fi
+}
+
+shell_level() {
+ # shellcheck disable=3028
+ L="${SHLVL:-1}"
+ if [ -n "${TMUX:-}" ]; then
+ LVL=$((L - 1))
+ else
+ LVL="$L"
+ fi
+ if [ "$LVL" != 1 ]; then
+ printf '[%s] ' "$LVL"
+ fi
+}
+
+guix_env() {
+ if [ -n "${GUIX_ENVIRONMENT:-}" ]; then
+ printf '\n~> guix environment (%s)' "$GUIX_ENVIRONMENT"
+ fi
+}
+
+PS1='`error_marker`\T \w/ `shell_level``guix_env`
+# '
diff --git a/etc/ssh/config.tmpl b/etc/ssh/config.tmpl
new file mode 100644
index 0000000..fd4b8a3
--- /dev/null
+++ b/etc/ssh/config.tmpl
@@ -0,0 +1,6 @@
+Host *
+ UserKnownHostsFile ${XDG_CONFIG_HOME}/ssh/known_hosts
+
+Include ~/dev/libre/servers/src/infrastructure/ssh.conf
+Include ~/dev/others/lawtech/src/infrastructure/ssh.conf
+Include ${XDG_DATA_HOME}/euandreh/vm-ssh.conf
diff --git a/etc/ssh/known_hosts b/etc/ssh/known_hosts
new file mode 100644
index 0000000..fa1b43a
--- /dev/null
+++ b/etc/ssh/known_hosts
@@ -0,0 +1,84 @@
+|1|G2vfdmQ84glwobYXZZ0d+cCMVRE=|DZJYmWjbeP52J4K7+Bsz2e0dgBA= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
+|1|yosAhKlbZt51FfD2VvQJiVijSBA=|BFEig1gqq4EwCHEHagEASQZQmNI= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
+|1|5yKbUaAB5AFz4MINtTVhVAPwMtU=|LwcI5Z8hXwwKxtkk4KDpeZduyPQ= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+|1|sfEM3JnFec93XEzMf9A6TkthgdI=|oZX7oe9eBKYMrXLcoFydh70my5A= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+|1|F/E3nafzrpMZEzyN8iA++okJ7Q4=|T00Gk7F90YmbaTMSOGjP8yhls94= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMylg2eib0byVT2R7dVFkxdhXO5pvgllnszKhlHiEP15ee8IjMYNPvz2A605hUdIxXtsBgjf+u7jlubh6mbx/YA=
+|1|jSpDKjDomux2z3O/ok/UPGGQ8xs=|ZP60naGKQnpK6yHGD+B/+ykB05c= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMylg2eib0byVT2R7dVFkxdhXO5pvgllnszKhlHiEP15ee8IjMYNPvz2A605hUdIxXtsBgjf+u7jlubh6mbx/YA=
+|1|PJybLcZRkpN9IyDsqaNjGO6lE5Y=|K0nchvCA7XV91J2X6l0h2DwOmyI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+|1|zzdSJf8JIMfi5sKbc/mNcBy/RB8=|0GxC/CesxJHcRdt8MuPVjfab06k= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBxDZv64oRMzRkywjmRRrml2pr0XFSZhlL46nUSmM60
+|1|X5OmtKdXZh2kC//XCXEEOim7tgE=|Rh5ro2oEB4MN8MP6PRbG3QBR0Kk= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBxDZv64oRMzRkywjmRRrml2pr0XFSZhlL46nUSmM60
+46.101.43.82 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLIGIc5X12Y61eVcKJnNzCvrPeSKgyKgElqGl7QDeGeynE33sRVoNAg9aqkgXdc2MkN+nFhEWELkjPuBKYsyp2I=
+hinarioespirita.org,167.99.34.30 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEnGFkXNEF6RHihT3szgVEBAhRKXlI6YKSUOQFzhuNVkMOBgEfr+OaXpFV3zQ3/Dp875skdTOZaA9DjQ0EeUS+M=
+pt.hinarioespirita.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEnGFkXNEF6RHihT3szgVEBAhRKXlI6YKSUOQFzhuNVkMOBgEfr+OaXpFV3zQ3/Dp875skdTOZaA9DjQ0EeUS+M=
+mtm.hinarioespirita.org ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEnGFkXNEF6RHihT3szgVEBAhRKXlI6YKSUOQFzhuNVkMOBgEfr+OaXpFV3zQ3/Dp875skdTOZaA9DjQ0EeUS+M=
+77.109.148.18 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBxDZv64oRMzRkywjmRRrml2pr0XFSZhlL46nUSmM60
+35.231.145.151 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
+git.sr.ht,173.195.146.142 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCj6y+cJlqK3BHZRLZuM+KP2zGPrh4H66DacfliU1E2DHAd1GGwF4g1jwu3L8gOZUTIvUptqWTkmglpYhFp4Iy4=
+192.168.33.10 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCL+hEiW/Va2L6y5Y4MyxRBXHJw/9bIC02M3wGVe1zaD3DT8wsAUcJ2QO1lJILudvMInx+SaPyJmwBvUn58YR2c=
+173.195.146.152 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCj6y+cJlqK3BHZRLZuM+KP2zGPrh4H66DacfliU1E2DHAd1GGwF4g1jwu3L8gOZUTIvUptqWTkmglpYhFp4Iy4=
+2001:1620:2019::218 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKBxDZv64oRMzRkywjmRRrml2pr0XFSZhlL46nUSmM60
+140.82.114.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+140.82.113.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+140.82.113.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+140.82.114.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+2604:bf00:710:0:5054:ff:fe7d:8fa8 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCj6y+cJlqK3BHZRLZuM+KP2zGPrh4H66DacfliU1E2DHAd1GGwF4g1jwu3L8gOZUTIvUptqWTkmglpYhFp4Iy4=
+azusa.runners.sr.ht,2604:bf00:710:0:ae1f:6bff:fead:55a ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPzxK5AM1FdMI9gZVDpw2O5iiS/49QokWpzANFntVt0Qig4qdBt4K7B0O6MrwggLh3A+zBlsXCMoWtvFtPQgLxA=
+18.228.52.138 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+18.231.5.6 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+2604:bf00:710:0:5054:ff:fe36:ebc6 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCj6y+cJlqK3BHZRLZuM+KP2zGPrh4H66DacfliU1E2DHAd1GGwF4g1jwu3L8gOZUTIvUptqWTkmglpYhFp4Iy4=
+18.228.67.229 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+hg.sr.ht,2604:bf00:710:0:5054:ff:fe25:1aa6 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL4aNGa+KnvMA0QoWrIVuI2QBU0Q/xX48sMBl3VtP/zPOGMvS50zGVMaA00RSzfcI2X0v/aUTsVm2vBNo/V1gTg=
+euandre.org,2a03:b0c0:3:d0::387:b001 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF6wlJqwd7KWLzLovwnwbTmNfO4E4yVDyqxAAlUkn9eDsTtzV1RYNDsaLPWv4mweJqP4crZPFxg40sFVeMDbkC0=
+2606:4700:90:0:f22e:fbec:5bed:a9b9 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
+46.101.160.115 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF6wlJqwd7KWLzLovwnwbTmNfO4E4yVDyqxAAlUkn9eDsTtzV1RYNDsaLPWv4mweJqP4crZPFxg40sFVeMDbkC0=
+173.195.146.249 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPzxK5AM1FdMI9gZVDpw2O5iiS/49QokWpzANFntVt0Qig4qdBt4K7B0O6MrwggLh3A+zBlsXCMoWtvFtPQgLxA=
+2604:a880:800:14::32:4000 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK8YTumqLFAL5MJ0AcDtFG9dWfbkJKU7FUDlH0xEgAZvHGU57TBr9DIQy2OHrxCxuhk9bZEUX8+vJiRXE05+Rzs=
+2001:19f0:7001:5cec:5400:2ff:feec:9940 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPYRWlGutc+bRJ+N0sXHxhgnDsRvRoauQ92yM1U7N+8a
+2001:19f0:6c01:2cf0:5400:2ff:feec:99c5 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMGiiEXB+koPS1vgGkwdExk2Q5fGv3Yc5rf8jVHB2FB7
+45.32.155.96 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKfPxSXxvq3MHuMvthg+q69ooniSeqXbit1UiW0gbLZN
+45.77.65.204 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKfPxSXxvq3MHuMvthg+q69ooniSeqXbit1UiW0gbLZN
+136.244.85.68 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKfPxSXxvq3MHuMvthg+q69ooniSeqXbit1UiW0gbLZN
+199.247.0.136 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+euandreh.xyz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+136.244.80.130 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+209.250.232.122 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+git.euandreh.xyz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+80.240.24.148 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+95.179.246.150 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+45.77.52.185 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+199.247.2.245 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+140.82.112.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+104.238.176.223 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+172.65.251.78 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
+140.82.112.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
+45.32.158.17 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+95.179.253.243 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+95.179.163.103 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+217.69.2.177 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhpYZqFXy4CkOrSg5naR5Any47jqgZUIwbiTvsl2Yhm5EiUtCZTIVHui7q262M5qlDY6syQ5lVMtSsLJuTce+I=
+104.238.176.81 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhpYZqFXy4CkOrSg5naR5Any47jqgZUIwbiTvsl2Yhm5EiUtCZTIVHui7q262M5qlDY6syQ5lVMtSsLJuTce+I=
+173.199.70.52 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNhpYZqFXy4CkOrSg5naR5Any47jqgZUIwbiTvsl2Yhm5EiUtCZTIVHui7q262M5qlDY6syQ5lVMtSsLJuTce+I=
+[remembering.euandreh.xyz]:23841 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+167.71.86.194 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCXg/l/grol/OAY95VphKbVn4yXUStSWpxQjnka7PWXzWyForfX+fpmY+p72r1Uimx5oXIFISt8uSZW/tvD61iQ=
+[localhost]:10022 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLHACdQJXUj5e4Znyh7KdTjB1RLznSfStRw6cuHZlu8rhANVfkjt300Fum9Jv6yLra6W4v2FLALWfcYpOlUzt9c=
+107.191.63.70 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMONpsqwH79f/MsjtsOPitT5C+3hPPJqVh42oHMKOen6
+217.69.11.49 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPKbzWSlFwmlrC+k6XU9eUJaejREGxTF03OX/mT7KhSr
+anoncvs.netbsd.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA3QiBl8leG9fqIJpKeNov0PKq5YryFFiroMWOPUv4hDFn8R0jC07YVaR/OSBrr37CTmGX5AFceXPzoFnLlwCqWR7rXg4NR75FTlTp9CG9EBAEtU8mee27KDrUFBTZdfVl2+aRYoAI5fTXA+0vpIO68Cq843vRWUZCcwinS4cNLUU=
+git.2f30.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJSLZ4G5w4NysBUmAHmr6/V9om42IHSUCtqrNdhWoYQ0
+[199.247.13.53]:38123 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILoz1gFl6chY91vQ5SrZXSP5yHqRI3TdYy2ccEDpS7Z4
+[2001:19f0:6801:988:5400:3ff:fea1:b566]:38123 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILoz1gFl6chY91vQ5SrZXSP5yHqRI3TdYy2ccEDpS7Z4
+[gerrit.wikimedia.org]:29418 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCF8pwFLehzCXhbF1jfHWtd9d1LFq2NirplEBQYs7AOrGwQ/6ZZI0gvZFYiEiaw1o+F1CMfoHdny1VfWOJF3mJ1y9QMKAacc8/Z3tG39jBKRQCuxmYLO1SWymv7/Uvx9WQlkNRoTdTTa9OJFy6UqvLQEXKYaokfMIUHZ+oVFf1CgQ==
+2001:19f0:5:1d65:5400:3ff:fee3:7463 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF2EgU3IgCwv1ynnWfxFm0SHTSoE0AYG3MJT/TpN3pBz
+[camarada.site]:38123 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILoz1gFl6chY91vQ5SrZXSP5yHqRI3TdYy2ccEDpS7Z4
+149.28.21.56 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK2cITa9TuC3lzEihIfFYb0KhyJJ5Vg2vnGW1SMMwxhc
+camarada.site ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILoz1gFl6chY91vQ5SrZXSP5yHqRI3TdYy2ccEDpS7Z4
+[127.0.0.1]:60022 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuoUWqrJ8WLBDWwWG7zCyYVYz1upMlg1mSXMGMHIVzY
+[localhost]:60022 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEuoUWqrJ8WLBDWwWG7zCyYVYz1upMlg1mSXMGMHIVzY
+[10.0.2.1]:23841 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+[kuvira.wg]:23841 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+kuvira.wg ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIvhhXQBEY9GhWOtBoLpDJRjqHAu7ci2A9l1xoet1Cz/
+216.238.68.100 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKF5klRzMiaDhfFv7vj6nIT2BdjbcgpsmnNT3y/X9oUu
+arrobaponto.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKF5klRzMiaDhfFv7vj6nIT2BdjbcgpsmnNT3y/X9oUu
+10.0.2.2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII9jxIXM2FSYeZmY2uLWkQUJQLNIQQJyJdc7P4eEPhEU
+velhinho ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII9jxIXM2FSYeZmY2uLWkQUJQLNIQQJyJdc7P4eEPhEU
+velhinho.wg ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII9jxIXM2FSYeZmY2uLWkQUJQLNIQQJyJdc7P4eEPhEU
+localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII9jxIXM2FSYeZmY2uLWkQUJQLNIQQJyJdc7P4eEPhEU
diff --git a/etc/tmux/tmux.conf b/etc/tmux/tmux.conf
new file mode 100644
index 0000000..93efdf9
--- /dev/null
+++ b/etc/tmux/tmux.conf
@@ -0,0 +1,96 @@
+# Use personal prefix over "C-b"
+unbind C-b
+set -g prefix C-v
+
+# Turn on mouse mode
+# https://groups.google.com/forum/#!msg/tmux-users/TRwPgEOVqho/Ck_oth_SDgAJ
+# https://github.com/tmux/tmux/blob/310f0a960ca64fa3809545badc629c0c166c6cd2/CHANGES#L12
+set -g mouse on
+
+# Bind "C-x r" to reload the configuration file
+bind-key r source-file $XDG_CONFIG_HOME/tmux/tmux.conf \; display-message "$XDG_CONFIG_HOME/tmux.conf reloaded"
+
+# Holy answer that properly implements copying from tmux!
+# https://unix.stackexchange.com/a/349020/276661
+bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe "xclip -selection clipboard -i" \;
+bind-key y send-keys -X copy-pipe "xclip -selection clipboard -i" \; display-message "Copied system clipboard! Hooray! Long-live tmux!"
+
+# Moving around windows
+bind-key -n M-[ previous-window
+bind-key -n M-] next-window
+
+# Moving around panes
+bind-key -n M-h select-pane -L
+bind-key -n M-j select-pane -D
+bind-key -n M-k select-pane -U
+bind-key -n M-l select-pane -R
+
+# Resizing panes
+bind-key -n M-H resize-pane -L 5
+bind-key -n M-J resize-pane -D 5
+bind-key -n M-K resize-pane -U 5
+bind-key -n M-L resize-pane -R 5
+
+# Reorder windows
+bind-key -n C-S-Left swap-window -t -1\; select-window -t -1
+bind-key -n C-S-Right swap-window -t +1\; select-window -t +1
+#
+# To change the number of a window, use: PREFIX-., and pick a new unused number
+#
+
+# Join windows
+bind-key -n C-S-M-Left join-pane -s :-0 -t :-1
+bind-key -n C-S-M-Right join-pane -s :-0 -t :+1
+
+# "M m" to actually clear the pane history
+bind -n M-m send-keys -R \; clear-history
+
+# Keybinding to activate pane typing sync
+# https://stackoverflow.com/questions/25909964/tmux-how-to-toggle-on-and-off-options-with-the-same-key
+bind-key b setw synchronize-panes \; display-message "synchronize-panes toggle"
+
+setw -g mode-keys vi # Move around with vi keys
+set-option -g status-key "vi" # Use vi mode for status bar command (like after typing "C-x [" one can search with "/")
+set-option -g status-bg "#333333" # Status bar background color
+set-option -g status-fg "#ffffff" # Status bar foreground color
+set-option -g status-left-length 50 # session name in status bar length =[annex]= part
+set-option -g history-limit 150000 # How many lines of history to keep
+set-option -g status-right ""
+
+# Set the panes initial index value to 1 instead of 0
+# 0 is too far from ` ;)
+set -g base-index 1
+set-window-option -g pane-base-index 1
+
+# Automatically set window title
+set-window-option -g automatic-rename on
+set-option -g set-titles on
+
+# Set "correct term"
+# https://wiki.archlinux.org/index.php/Tmux
+set -g default-terminal screen-256color
+
+# No delay for escape key press
+# https://mutelight.org/practical-tmux#faster-command-sequences
+set -sg escape-time 0
+
+# Display pane numbers for longer
+# https://unix.stackexchange.com/questions/307696/how-to-increase-tmux-pane-numbers-display-time-ctrl-b-q
+set -g display-panes-time 2500
+
+bind-key t resize-pane -x 80
+
+bind -n M-r attach-session -t . -c '#{pane_current_path}' \; display-message "CWD for session updated to #{pane_current_path}!"
+
+bind-key u capture-pane \; save-buffer $XDG_RUNTIME_DIR/tmux-urlscan-buffer \; new-window -n "urlscan" '$SHELL -c "urlscan < $XDG_RUNTIME_DIR/tmux-urlscan-buffer"'
+bind-key - last
+
+
+# $XDG_DATA_HOME variable isn't allowed by tmux-resurrect
+set -g @resurrect-dir '~/.usr/share/tmux/resurrect'
+set -g @continuum-restore 'on'
+set -g @continuum-save-interval '60'
+set -g @resurrect-capture-pane-contents 'on'
+set -g @resurrect-processes '~make ~ssh ~e "~alot->alot" "~ranger->ranger" "~newsboat->newsboat" "~entr->entr" "~git->git" "~info->info"'
+run-shell ~/.guix-home/profile/share/tmux-plugins/resurrect/resurrect.tmux
+run-shell ~/.guix-home/profile/share/tmux-plugins/continuum/continuum.tmux
diff --git a/etc/weechat/irc.conf b/etc/weechat/irc.conf
new file mode 120000
index 0000000..d42fdad
--- /dev/null
+++ b/etc/weechat/irc.conf
@@ -0,0 +1 @@
+../../var/lib/private/tilde/weechat/irc.conf \ No newline at end of file