remove qutebrower. - dotfiles - These are my dotfiles. There are many like it, but these are mine.
 (HTM) git clone git://jay.scot/dotfiles
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit f1ecc6cd5d87ce0369fe692213b63744516cc59b
 (DIR) parent 3531ea824509e3e833008e785a337228714692c5
 (HTM) Author: Jay Scott <me@jay.scot>
       Date:   Tue, 25 Nov 2025 18:17:34 +0000
       
       remove qutebrower.
       
       Diffstat:
         M .gitignore                          |      10 +++++-----
         M README                              |      12 ++++++------
         M ashrc                               |       4 ++--
         A bin/fdm_parse_feeds.sh              |      24 ++++++++++++++++++++++++
         D bin/link-handler                    |      40 -------------------------------
         A bin/link-handler.sh                 |      39 +++++++++++++++++++++++++++++++
         R bin/music -> bin/music.sh           |       0 
         A bin/offline.sh                      |      10 ++++++++++
         R bin/switch_audio -> bin/old/switch… |       0 
         A bin/update_feeds.sh                 |      20 ++++++++++++++++++++
         R bin/yt-feedurl -> bin/yt-feedurl.sh |       0 
         D bin/ytd                             |      77 -------------------------------
         A bin/ytd.sh                          |      78 +++++++++++++++++++++++++++++++
         M bootstrap.sh                        |       2 +-
         A fdm/config                          |      70 +++++++++++++++++++++++++++++++
         M foot/foot.ini                       |       2 +-
         D isync/mbsyncrc                      |      24 ------------------------
         M lynx/config                         |       4 ++--
         M mutt/muttrc                         |     107 +++++++++++++++++++++++--------
         D mutt/theme                          |      94 -------------------------------
         D newsraft/config                     |      17 -----------------
         D newsraft/feeds                      |      49 -------------------------------
         D qutebrowser/blank.html              |      44 -------------------------------
         D qutebrowser/config.py               |     108 -------------------------------
         D qutebrowser/scripts/fingerprint.py  |      43 ------------------------------
         D qutebrowser/scripts/gruvbox.py      |     332 -------------------------------
         D qutebrowser/scripts/redirects.py    |      70 -------------------------------
         D qutebrowser/scripts/user_agent.py   |      31 -------------------------------
         D qutebrowser/userscripts/password_f… |     388 ------------------------------
         A sfeed/sfeedrc                       |      51 +++++++++++++++++++++++++++++++
         M sway/config                         |       7 +++----
         M waybar/config                       |       3 ---
       
       32 files changed, 392 insertions(+), 1368 deletions(-)
       ---
 (DIR) diff --git a/.gitignore b/.gitignore
       @@ -4,11 +4,6 @@ qutebrowser/autoconfig.yml
        qutebrowser/bookmarks
        qutebrowser/quickmarks
        
       -# mpd
       -mpd/mpd.db
       -mpd/mpd.pid
       -mpd/mpdstate
       -
        # misc
        *.swp
        bin/radio
       @@ -21,3 +16,8 @@ nvim/lazy-lock.json
        # mutt contacts
        mutt/aliases
        mutt/cache
       +
       +# sfeeds
       +sfeed/feeds
       +sfeed/mbox
       +sfeed/fdm.cache
 (DIR) diff --git a/README b/README
       @@ -7,19 +7,19 @@
        
        These are my dotfiles. There are many like it, but these are mine.
        
       -They are managed via the bootstrap.sh shell script, this links the files and
       -folders in the appropriate place. They are used on Alpine Linux which I use as
       -my main desktop OS and are forever evolving.
       +They are managed via the bootstrap.sh shell script, this links the files
       +and folders in the appropriate place. They are used on Alpine Linux
       +which I use as my main desktop OS and are forever evolving.
        
        
          operating sys  : alpine linux
          window manager : sway
          terminal       : foot
          launcher       : bemenu
       -  email          : neomutt
       -  browser        : qutebrowser / lynx
       +  email          : fdm / mutt
       +  browser        : lynx / librewolf
          media          : kew / mpv
          password mgmt  : pass
          vpn            : mullvad
       -  news           : newsraft
       +  news           : sfeed
        
 (DIR) diff --git a/ashrc b/ashrc
       @@ -11,7 +11,7 @@ export BROWSER="lynx"
        export PATH=$PATH:$HOME/bin
        
        # tools
       -export OPENER=~/bin/link-handler
       +export OPENER=~/bin/link-handler.sh
        export BEMENU_OPTS="-l 10 -p '>>> ' --tb '#000000' --tf '#ffffff' --hf '#444444' -c -W0.4 --fn 'Hack 14'"
        
        # lynx
       @@ -54,7 +54,7 @@ alias gma='git commit -am'
        
        # neo
        alias vim='nvim'
       -alias mutt='neomutt'
       +#alias mutt='neomutt'
        alias mpv="mpv --autofit=30% --really-quiet --no-terminal"
        
        # vpn
 (DIR) diff --git a/bin/fdm_parse_feeds.sh b/bin/fdm_parse_feeds.sh
       @@ -0,0 +1,24 @@
       +#!/bin/sh
       +#
       +# reads text from stdin containing a url. The url is then parsed
       +# by rdrview, https://github.com/eafer/rdrview, and the url content
       +# returned appending to the end of the original text.
       +#
       +# I use this with sfeed and fdm to download feed contents without the
       +# need of a browser.
       +
       +data=$(cat)
       +
       +url=$(echo "$data" | grep -o -E 'https?://[^"]+|gemini://[^"]+')
       +uri_lower="$(printf "%s" "$url" | tr '[:upper:]' '[:lower:]')"
       +
       +case "$uri_lower" in
       +'gemini:'*)
       +        content=$(gemget -o - "$url")
       +        ;;
       +'http'*)
       +        content=$(rdrview -H "$url" | lynx -stdin --dump -force_html)
       +        ;;
       +esac
       +
       +printf "%s\n\n%s" "$data" "$content"
 (DIR) diff --git a/bin/link-handler b/bin/link-handler
       @@ -1,40 +0,0 @@
       -#!/bin/sh
       -
       -launcher="setsid"
       -
       -# applications
       -player="mpv --autofit=30% --really-quiet --no-terminal"
       -gemini="foot -e amfora"
       -gopher="foot -e lynx"
       -pdf="zathura"
       -images="swayimg"
       -torrent="qbittorrent"
       -browser="foot -e rdrview"
       -
       -uri="$1"
       -uri_lower="$(printf "%s" "$uri" | tr '[:upper:]' '[:lower:]')"
       -
       -case "$uri_lower" in
       -        *.mkv | *.mp4 | *.webm | *youtube.com* | *odysee.com*)
       -                $player "$uri" &
       -                ;;
       -        *.gmi | gemini:*)
       -                $gemini "$uri"
       -                ;;
       -        gopher:*)
       -                $gopher "$uri" &
       -                ;;
       -        magnet:*)
       -                $launcher "$torrent" "$uri" &
       -                ;;
       -        *.pdf | *.ps | *.epub)
       -                $launcher "$pdf" "$uri"
       -                ;;
       -        *.jpg | *.jpe | *.jpeg | *.png | *.gif | *.webp)
       -                $launcher "$images" "$uri"
       -                ;;
       -        *)
       -                #$launcher "$BROWSER" "$uri"
       -                $launcher $browser "$uri"
       -                ;;
       -esac
 (DIR) diff --git a/bin/link-handler.sh b/bin/link-handler.sh
       @@ -0,0 +1,39 @@
       +#!/bin/sh
       +
       +launcher="setsid"
       +
       +# applications
       +player="mpv --autofit=30% --really-quiet --no-terminal"
       +gemini="foot -e amfora"
       +gopher="foot -e lynx"
       +pdf="zathura"
       +images="swayimg"
       +torrent="qbittorrent"
       +browser="foot -e rdrview"
       +
       +uri="$1"
       +uri_lower="$(printf "%s" "$uri" | tr '[:upper:]' '[:lower:]')"
       +
       +case "$uri_lower" in
       +        *.mkv | *.mp4 | *.webm | *youtube.com* | *odysee.com*)
       +                $player "$uri" &
       +                ;;
       +        *.gmi | gemini:*)
       +                $launcher $gemini "$uri"
       +                ;;
       +        gopher:*)
       +                $gopher "$uri" &
       +                ;;
       +        magnet:*)
       +                $launcher "$torrent" "$uri" &
       +                ;;
       +        *.pdf | *.ps | *.epub)
       +                $launcher "$pdf" "$uri"
       +                ;;
       +        *.jpg | *.jpe | *.jpeg | *.png | *.gif | *.webp)
       +                $launcher "$images" "$uri"
       +                ;;
       +        *)
       +                $launcher $browser "$uri"
       +                ;;
       +esac
 (DIR) diff --git a/bin/music b/bin/music.sh
 (DIR) diff --git a/bin/offline.sh b/bin/offline.sh
       @@ -0,0 +1,10 @@
       +#!/bin/sh
       +
       +# youtube videos
       +ytd.sh
       +
       +# rss feeds (http/gemini) download
       +update_feeds.sh
       +
       +# mail
       +fdm -f ~/.config/fdm/config fetch
 (DIR) diff --git a/bin/switch_audio b/bin/old/switch_audio
 (DIR) diff --git a/bin/update_feeds.sh b/bin/update_feeds.sh
       @@ -0,0 +1,20 @@
       +#!/bin/sh
       +#
       +# wrapper for managing my feed process.
       +#   - update new feeds
       +#   - generate mbox of feeds
       +#   - parse feeds with fdm and push to Maildir format.
       +
       +sfeedroot="$HOME/.config/sfeed"
       +feedsdir="${sfeedroot}/feeds"
       +fdmconfig="$HOME/.config/fdm/config"
       +
       +if ! test -r "${fdmconfig}"; then
       +        echo "fdm configuration file \"${fdmconfig}\" does not exist or is not readable." >&2
       +        exit 1
       +fi
       +
       +sfeed_update "${sfeedroot}/sfeedrc"
       +
       +sfeed_mbox "${feedsdir}"/* >~/.config/sfeed/mbox
       +fdm -f "${fdmconfig}" -afeeds fetch
 (DIR) diff --git a/bin/yt-feedurl b/bin/yt-feedurl.sh
 (DIR) diff --git a/bin/ytd b/bin/ytd
       @@ -1,77 +0,0 @@
       -#!/bin/sh
       -
       -# yt-dlp subscription fetcher
       -# jay <me@jay.scot>
       -
       -savepath="$HOME/media/youtube"
       -cachedir="$HOME/.cache/yt_dl"
       -yt="yt-dlp"
       -baseurl="https://www.youtube.com/playlist?list="
       -ody_url="https://odysee.com/"
       -
       -info() {
       -        printf "\033[35mYT ➤\033[36m %s\033[0m\n" "$1"
       -}
       -
       -main() {
       -        mkdir -p "${cachedir}"
       -        mkdir -p "${savepath}"
       -
       -    action="$1"
       -
       -        "$action" "steve1989mreinfo" "UU2I6Et1JkidnnbWgJFiMeHA"
       -        "$action" "simon_wilson" "UUQCrKxBj5Id79syQEsY2Qxg"
       -        "$action" "c90adventures" "UUVqpNG1R72i21jh-nAxEk4A"
       -        "$action" "indigo_traveller" "UUXulruMI7BHj3kGyosNa0jA"
       -        "$action" "pppeter" "UUnHEz9DZ6EAof1-DaQGD_Xw"
       -        "$action" "abroad_in_japan" "UUHL9bfHTxCMi-7vfxQ-AYtg"
       -        "$action" "serpentza" "UUl7mAGnY4jh4Ps8rhhh8XZg"
       -        "$action" "the_lazy_peon" "UUE-f0sqi-H7kuLT0YiW9rcA"
       -        "$action" "zav_alsop" "UUcjx6m03fZwtRBFn1Cf7kKQ"
       -        "$action" "steve_marsh" "UUBhQuxcHU3aydk_zTXcbdTg"
       -        "$action" "planes_trains_everything" "UUcKw8Eg0FfRvhIAnC0cPGAA"
       -        "$action" "we_hate_the_cold" "UULmltEyJ0zBsKnL8bWSdn3A"
       -        "$action" "astonishing_glasgow" "UUIDIqg7LhjLFCyD2awY_38g"
       -        "$action" "drain_cleaning_aus" "UU7sGXeJOixPBgJ3r5R55JYg"
       -        "$action" "mike_okay" "UUpp3cHR9TWVyXqL1AVw4XkA"
       -        "$action" "rhykker" "UURl31PWkfF0a3j3hiDRaCGA"
       -        "$action" "brodie_robertson" "UUld68syR8Wi-GY_n4CaoJGA"
       -        "$action" "distrotube" "UUVls1GmFKf6WlTraIb_IaJg"
       -        "$action" "max_roving" "UUOxpcQ7KtZc7fd0jhnWS0Sg"
       -        "$action" "misfit_minds" "UUEpHkpv4_CgZIEadjjOv4jA"
       -        "$action" "better_offline" "UUsdzuPs5NKvdsBkQnP7Af8w"
       -        "$action" "simon_doherty" "UU2smcaU7852QtVvJz48dCRw"
       -        "$action" "phil_carr" "UULva3lkHR6B5OO-eiVaPnDg"
       -        "$action" "andrea_borman" "UUJsinEiaDqEn8a-GcADVEVA"
       -        "$action" "veronica_explains" "UUMiyV_Ib77XLpzHPQH_q0qQ"
       -        "$action" "chubby_trekka" "UU5YskHOZiTEzjdps94jFX1g"
       -        "$action" "bythecurb" "UUUZ68a2OJnyTutbTNG1tSpA"
       -}
       -
       -get_video() {
       -        info "Fetching latest from $1"
       -        mkdir -p "${savepath}/${1}"
       -
       -        "$yt" -q --restrict-filename \
       -                --download-archive "${cachedir}/${1}" \
       -                "${baseurl}${2}" \
       -                -o "${savepath}/${1}/%(playlist_index)s_%(title)s.%(ext)s"
       -}
       -
       -catchup() {
       -        info "Catching up on $1"
       -        "$yt" --flat-playlist --get-id \
       -                "${baseurl}${2}" | sed 's/.*/youtube &/' >"${cachedir}/${1}"
       -}
       -
       -case "$1" in
       --m)
       -        main catchup
       -        ;;
       --n)
       -        catchup "$2" "$3"
       -        ;;
       -*)
       -        main get_video
       -        ;;
       -esac
 (DIR) diff --git a/bin/ytd.sh b/bin/ytd.sh
       @@ -0,0 +1,78 @@
       +#!/bin/sh
       +
       +# yt-dlp subscription fetcher
       +# jay <me@jay.scot>
       +
       +savepath="$HOME/media/youtube"
       +cachedir="$HOME/.cache/yt_dl"
       +yt="yt-dlp"
       +baseurl="https://www.youtube.com/playlist?list="
       +
       +info() {
       +        printf "\033[35mYT ➤\033[36m %s\033[0m\n" "$1"
       +}
       +
       +main() {
       +        mkdir -p "${cachedir}"
       +        mkdir -p "${savepath}"
       +
       +    action="$1"
       +
       +        "$action" "steve1989mreinfo" "UU2I6Et1JkidnnbWgJFiMeHA"
       +        "$action" "simon_wilson" "UUQCrKxBj5Id79syQEsY2Qxg"
       +        "$action" "c90adventures" "UUVqpNG1R72i21jh-nAxEk4A"
       +        "$action" "indigo_traveller" "UUXulruMI7BHj3kGyosNa0jA"
       +        "$action" "pppeter" "UUnHEz9DZ6EAof1-DaQGD_Xw"
       +        "$action" "abroad_in_japan" "UUHL9bfHTxCMi-7vfxQ-AYtg"
       +        "$action" "serpentza" "UUl7mAGnY4jh4Ps8rhhh8XZg"
       +        "$action" "the_lazy_peon" "UUE-f0sqi-H7kuLT0YiW9rcA"
       +        "$action" "zav_alsop" "UUcjx6m03fZwtRBFn1Cf7kKQ"
       +        "$action" "steve_marsh" "UUBhQuxcHU3aydk_zTXcbdTg"
       +        "$action" "planes_trains_everything" "UUcKw8Eg0FfRvhIAnC0cPGAA"
       +        "$action" "we_hate_the_cold" "UULmltEyJ0zBsKnL8bWSdn3A"
       +        "$action" "astonishing_glasgow" "UUIDIqg7LhjLFCyD2awY_38g"
       +        "$action" "drain_cleaning_aus" "UU7sGXeJOixPBgJ3r5R55JYg"
       +        "$action" "mike_okay" "UUpp3cHR9TWVyXqL1AVw4XkA"
       +        "$action" "rhykker" "UURl31PWkfF0a3j3hiDRaCGA"
       +        "$action" "brodie_robertson" "UUld68syR8Wi-GY_n4CaoJGA"
       +        "$action" "distrotube" "UUVls1GmFKf6WlTraIb_IaJg"
       +        "$action" "max_roving" "UUOxpcQ7KtZc7fd0jhnWS0Sg"
       +        "$action" "misfit_minds" "UUEpHkpv4_CgZIEadjjOv4jA"
       +        "$action" "better_offline" "UUsdzuPs5NKvdsBkQnP7Af8w"
       +        "$action" "simon_doherty" "UU2smcaU7852QtVvJz48dCRw"
       +        "$action" "phil_carr" "UULva3lkHR6B5OO-eiVaPnDg"
       +        "$action" "andrea_borman" "UUJsinEiaDqEn8a-GcADVEVA"
       +        "$action" "veronica_explains" "UUMiyV_Ib77XLpzHPQH_q0qQ"
       +        "$action" "chubby_trekka" "UU5YskHOZiTEzjdps94jFX1g"
       +        "$action" "bythecurb" "UUUZ68a2OJnyTutbTNG1tSpA"
       +        "$action" "naomibrockwell" "UUSuHzQ3GrHSzoBbwrIq3LLA"
       +        "$action" "gotbletu" "UUkf4VIqu3Acnfzuk3kRIFwA"
       +}
       +
       +get_video() {
       +        info "Fetching latest from $1"
       +        mkdir -p "${savepath}/${1}"
       +
       +        "$yt" -q --restrict-filename \
       +                --download-archive "${cachedir}/${1}" \
       +                "${baseurl}${2}" \
       +                -o "${savepath}/${1}/%(playlist_index)s_%(title)s.%(ext)s"
       +}
       +
       +catchup() {
       +        info "Catching up on $1"
       +        "$yt" --flat-playlist --get-id \
       +                "${baseurl}${2}" | sed 's/.*/youtube &/' >"${cachedir}/${1}"
       +}
       +
       +case "$1" in
       +-m)
       +        main catchup
       +        ;;
       +-n)
       +        catchup "$2" "$3"
       +        ;;
       +*)
       +        main get_video
       +        ;;
       +esac
 (DIR) diff --git a/bootstrap.sh b/bootstrap.sh
       @@ -4,7 +4,7 @@ DOTFILES=$(pwd)
        
        FILES='ashrc profile'
        ROOT='bin'
       -CONFIG='foot git isync lynx mutt newsraft nvim qutebrowser sway waybar'
       +CONFIG='fdm foot git lynx mutt nvim sfeed sway waybar'
        
        link() {
                for f in $FILES; do ln -sfn "$DOTFILES/$f" "$HOME/.$f"; done
 (DIR) diff --git a/fdm/config b/fdm/config
       @@ -0,0 +1,70 @@
       +
       +# commands
       +$imap_pass        = $(pass tech/mailbox.org | head -n1)
       +
       +# macros.
       +$path                = "%h/.mail"
       +$feedcache        = "%h/.mail/fdm.cache"
       +$feeddir        = "%h/.mail/feeds/"
       +$listdir        = "%h/.mail/ml"
       +$strurl                = "(http[s]?://.*|gemini://.*)"
       +
       +# options
       +set unmatched-mail keep
       +set no-received
       +cache "${feedcache}"
       +
       +# accounts
       +account "feeds" disabled mbox "%[home]/.config/sfeed/mbox"
       +account "personal" imaps
       +        server "imap.mailbox.org"
       +        port 993
       +        user "me@jay.scot"
       +        pass "${imap_pass}"
       +
       +# maildirs
       +action "inbox"  maildir "${path}/%u/Inbox"
       +
       +# mailing lists
       +action        "freebsd-announce" maildir "${listdir}/freebsd.announce"
       +action        "freebsd-current" maildir "${listdir}/freebsd.current"
       +action        "freebsd-questions" maildir "${listdir}/freebsd.questions"
       +action        "alpine-users" maildir "${listdir}/alpine.users"
       +action        "alpine-aports" maildir "${listdir}/alpine.aports"
       +action        "alpine-announce" maildir "${listdir}/alpine.announce"
       +action        "alpine-devel" maildir "${listdir}/alpine.devel"
       +
       +# feeds
       +action "feedtag" tag "msgid" value "%1"
       +action "feedget" rewrite "%h/bin/fdm_parse_feeds.sh"
       +action "feedsave" {
       +        maildir "${feeddir}%1"
       +        add-to-cache "${feedcache}" key "%[msgid]"
       +        keep
       +}
       +
       +# alpine
       +match "^List-Id:.*lists\\.alpinelinux\\.org" in headers {
       +       match "^List-Id:.*announce" in headers action "alpine-announce"
       +       match "^List-Id:.*devel" in headers action "alpine-devel"
       +       match "^List-Id:.*users" in headers action "alpine-users"
       +       match "^List-Id:.*aports" in headers action "alpine-aports"
       +}
       +
       +# freebsd
       +match "^List-Id:.*freebsd-.*\\.freebsd\\.org" in headers {
       +       match "^List-Id:.*announce" in headers action "freebsd-announce"
       +       match "^List-Id:.*current" in headers action "freebsd-current"
       +       match "^List-Id:.*questions" in headers action "freebsd-questions"
       +}
       +
       +# sfeeds
       +match account "feeds" {
       +        match case "^Message-ID: (.*)" in headers action "feedtag" continue
       +        match matched and in-cache "${feedcache}" key "%[msgid]" action keep
       +        match $strurl action "feedget" continue
       +        match case "^X-Feedname: (.*)" in headers action "feedsave"
       +}
       +
       +# match all mail and deliver using the 'inbox' action.
       +match all action "inbox"
 (DIR) diff --git a/foot/foot.ini b/foot/foot.ini
       @@ -1,7 +1,7 @@
        font=Hack:size=16
        
        [url]
       -launch=link-handler ${url}
       +launch=link-handler.sh ${url}
        
        #[key-bindings]
        #show-urls-launch=Control+Shift+o
 (DIR) diff --git a/isync/mbsyncrc b/isync/mbsyncrc
       @@ -1,24 +0,0 @@
       -Create Both
       -Expunge Both
       -Remove Both
       -Sync All
       -SyncState *
       -
       -IMAPAccount jay
       -Host imap.mailbox.org
       -User me@jay.scot
       -PassCmd "pass show tech/smtp.mailbox.org"
       -TLSType IMAPS
       -
       -IMAPStore jay-remote
       -Account jay
       -
       -MaildirStore jay-local
       -SubFolders Verbatim
       -Path ~/.mail/jay/
       -Inbox ~/.mail/jay/Inbox
       -
       -Channel jay
       -Far :jay-remote:
       -Near :jay-local:
       -Patterns *
 (DIR) diff --git a/lynx/config b/lynx/config
       @@ -8,7 +8,7 @@ CHARACTER_SET:utf-8
        ASSUME_CHARSET:utf-8
        
        # image handing
       -XLOADIMAGE_COMMAND:link-handler %s&
       +XLOADIMAGE_COMMAND:link-handler.sh %s&
        
        NO_PAUSE:TRUE
        DEFAULT_EDITOR:/usr/bin/nvim
       @@ -17,7 +17,7 @@ DEFAULT_EDITOR:/usr/bin/nvim
        DEFAULT_KEYPAD_MODE:LINKS_ARE_NUMBERED
        
        # clean and read
       -EXTERNAL:http:link-handler '%s'
       +EXTERNAL:http:link-handler.sh '%s'
        
        # hide help menus
        DEFAULT_USER_MODE:ADVANCED
 (DIR) diff --git a/mutt/muttrc b/mutt/muttrc
       @@ -1,10 +1,13 @@
       -source ~/.config/mutt/gruvbox
       -
        # info
       +set my_user                = 'me@jay.scot'
       +set my_pass                = `pass tech/mailbox.org | head -n1`
        set realname        = 'Jay Scott'
        set from                = 'me@jay.scot'
       -set my_user                = 'me@jay.scot'
       -set my_pass                = "`pass tech/smtp.mailbox.org`"
       +
       +# SMTP settings
       +set smtp_pass                 = $my_pass
       +set smtp_url                = smtps://$my_user@smtp.mailbox.org
       +set ssl_force_tls         = yes
        
        # general
        set envelope_from        = yes
       @@ -25,7 +28,7 @@ bind compose p pgp-menu
        set pgp_use_gpg_agent         = yes
        set pgp_sign_as                 = 0726AF07C73389E1E4475B7EC88BBC696A39CCB0
        set pgp_timeout                 = 3600
       -set crypt_autosign                 = no
       +set crypt_autosign                 = yes
        set crypt_replyencrypt         = yes
        
        # html emails
       @@ -41,6 +44,7 @@ set folder           = ~/.mail
        set header_cache     = ~/.config/mutt/cache/headers
        set message_cachedir = ~/.config/mutt/cache/bodies
        set mailcap_path     = ~/.config/mutt/mailcap
       +set alias_file              = ~/.config/mutt/aliases
        set tmpdir           = ~/.cache/
        
        set spoolfile        = "+jay/Inbox"
       @@ -48,48 +52,97 @@ set postponed   = "+jay/Drafts"
        set record      = "+jay/Sent"
        
        # inbox
       +mailboxes +jay
        mailboxes ! `echo ~/.mail/jay/*`
        
       -# SMTP settings
       -set smtp_pass                 = $my_pass
       -set smtp_url                = smtps://$my_user@smtp.mailbox.org
       -set ssl_force_tls         = yes
       +# mailing lists
       +mailboxes +mailinglists
       +mailboxes ! `echo ~/.mail/ml/*`
        
       -# aliases
       -set alias_file                = ~/.config/mutt/aliases
       -set sort_alias                = alias
       -set reverse_alias         = yes
       -source                                 $alias_file
       +# feeds
       +mailboxes +feeds
       +mailboxes ! `echo ~/.mail/feeds/*`
       +
       +set sort_alias = alias
       +set reverse_alias = yes
       +source $alias_file
        
        # macros
       -bind index g noop
        bind index gg first-entry
        bind index G last-entry
        bind index <space> collapse-thread
        macro index \Cr "T~U<enter><tag-prefix><clear-flag>N<untag-pattern>.<enter>" "mark all messages as read"
       -macro index o "<shell-escape>mbsync -a -c \"$XDG_CONFIG_HOME\"/isync/mbsyncrc<enter>" "run isync to sync all mail"
       +macro index o "<shell-escape>fdm -f ~/.config/fdm/config fetch<enter>" "run fdm to sync all mail"
        macro index C "<copy-message>?<toggle-mailboxes>" "copy a message to a mailbox"
        macro index A "<save-message>=jay/archive<enter><enter><sync-mailbox><enter>" "save to archive"
        macro index M "<save-message>?<toggle-mailboxes>" "move a message to a mailbox"
       -macro index,pager O "<pipe-message>urlscan -c<Enter>" "call urlscan to extract URLs out of a message"
        
        # sorting
       -set sort                                = threads
       -set sort_aux                        = reverse-date
       +set sort                = threads
       +set sort_aux                = reverse-date
        set pager_index_lines        = 15
       -set pager_context                = 1
       -set index_format                = '%Z | %{%b %d %Y} | %-15.15F | %s'
       +set pager_context        = 1
       +set index_format        = '%Z | %{%b %d %Y} | %-15.15F | %s'
       +
       +# sidebar
       +set mail_check_stats         = yes
       +set sidebar_visible         = yes
       +set sidebar_width         = 25
       +set sidebar_short_path         = yes
       +set sidebar_folder_indent = yes
       +set sidebar_format = "%B%* %?N?%N?"
       +set sidebar_divider_char = │
       +bind index,pager \Ck sidebar-prev
       +bind index,pager <tab> sidebar-next
       +bind index,pager <backtab> sidebar-prev
       +bind index,pager \Cl sidebar-open
        
        # disable help menu
       -set help                 = yes
       +set help                 = no
        
        # status bar
        set sidebar_delim_chars = "/"
        set status_chars          = " *%A"
        set status_format         = "───[ Folder: %f ]───[%r%m messages%?n? (%n new)?%?d? (%d to delete)?%?t? (%t tagged)? ]───%>─%?p?( %p postponed )?───"
        
       -ignore *
       -unignore from date subject to cc
       -unignore x-mailer
       -unignore x-spam-status
       -unignore x-spam-report
       +# default
       +color normal color223 color0
       +
       +# status bar
       +color status color8 color0
       +
       +# highlight bar
       +color indicator        color223 color237
       +
       +# replied to
       +color index color2 color0 ~Q
       +
       +# email info header
       +color header color11 color0 "^(To:|From:|Date:|^Subject:)"
       +
       +# web links
       +color body color2 color0 "https?://[^ ]+"
       +color body color2 color0 "www.[^ ]+"
       +
       +# email addresss
       +color body color2 color0 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+"
       +color body color2 color0 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+"
       +
       +# image links
       +color body color2 color0 "\\[image\\ [0-9]+\\]"
       +
       +# sidebar
       +color sidebar_new bold color11 color0
       +color sidebar_divider bold color2 color0
       +
       +# patch syntax
       +color body brightwhite default ^[[:space:]].*
       +color body brightwhite default ^(diff).*
       +color body white default ^[\-\-\-].*
       +color body white default ^[\+\+\+].*
       +color body green default ^[\+].*
       +color body red default ^[\-].*
       +color body brightblue default [@@].*
       +color body brightwhite default ^(\s).*
       +color body brightwhite default ^(Signed-off-by).*
       +color body brightwhite default ^(Cc)
 (DIR) diff --git a/mutt/theme b/mutt/theme
       @@ -1,94 +0,0 @@
       -
       -color body          color136        color234        "(jay|jay.scot)"
       -
       -# basic colors ---------------------------------------------------------
       -color normal        color241        color234
       -color error         color160        color234
       -color tilde         color235        color234
       -color message       color37         color234
       -color markers       color160        color254
       -color attachment    color254        color234
       -color search        color61         color234
       -color status        color241        color235
       -color indicator     color234        color136
       -color tree          color136        color234
       -
       -# basic monocolor screen
       -mono  bold          bold
       -mono  underline     underline
       -mono  indicator     reverse
       -mono  error         bold
       -
       -# index ----------------------------------------------------------------
       -
       -color index         color160        color234        "~A"                        # all messages
       -color index         color166        color234        "~E"                        # expired messages
       -color index         color33         color234        "~N"                        # new messages
       -color index         color33         color234        "~O"                        # old messages
       -color index         color61         color234        "~Q"                        # messages that have been replied to
       -color index         color240        color234        "~R"                        # read messages
       -color index         color33         color234        "~U"                        # unread messages
       -color index         color33         color234        "~U~$"                      # unread, unreferenced messages
       -color index         color241        color234        "~v"                        # messages part of a collapsed thread
       -color index         color241        color234        "~P"                        # messages from me
       -color index         color37         color234        "~p!~F"                     # messages to me
       -color index         color37         color234        "~N~p!~F"                   # new messages to me
       -color index         color37         color234        "~U~p!~F"                   # unread messages to me
       -color index         color240        color234        "~R~p!~F"                   # messages to me
       -color index         color160        color234        "~F"                        # flagged messages
       -color index         color160        color234        "~F~p"                      # flagged messages to me
       -color index         color160        color234        "~N~F"                      # new flagged messages
       -color index         color160        color234        "~N~F~p"                    # new flagged messages to me
       -color index         color160        color234        "~U~F~p"                    # new flagged messages to me
       -color index         color235        color160        "~D"                        # deleted messages
       -color index         color245        color234        "~v~(!~N)"                  # collapsed thread with no unread
       -color index         color136        color234        "~v~(~N)"                   # collapsed thread with some unread
       -color index         color64         color234        "~N~v~(~N)"                 # collapsed thread with unread parent
       -# statusbg used to indicated flagged when foreground color shows other status
       -# for collapsed thread
       -color index         color160        color235        "~v~(~F)!~N"                # collapsed thread with flagged, no unread
       -color index         color136        color235        "~v~(~F~N)"                 # collapsed thread with some unread & flagged
       -color index         color64         color235        "~N~v~(~F~N)"               # collapsed thread with unread parent & flagged
       -color index         color64         color235        "~N~v~(~F)"                 # collapsed thread with unread parent, no unread inside, but some flagged
       -color index         color37         color235        "~v~(~p)"                   # collapsed thread with unread parent, no unread inside, some to me directly
       -color index         color136        color160        "~v~(~D)"                   # thread with deleted (doesn't differentiate between all or partial)
       -
       -# message headers ------------------------------------------------------
       -
       -#color header        color240        color234        "^"
       -color hdrdefault    color240        color234
       -color header        color241        color234        "^(From)"
       -color header        color33         color234        "^(Subject)"
       -
       -# body -----------------------------------------------------------------
       -
       -color quoted        color33         color234
       -color quoted1       color37         color234
       -color quoted2       color136        color234
       -color quoted3       color160        color234
       -color quoted4       color166        color234
       -
       -color signature     color240        color234
       -color bold          color235        color234
       -color underline     color235        color234
       -color normal        color244        color234
       -#
       -color body          color245        color234        "[;:][-o][)/(|]"    # emoticons
       -color body          color245        color234        "[;:][)(|]"         # emoticons
       -color body          color245        color234        "[*]?((N)?ACK|CU|LOL|SCNR|BRB|BTW|CWYL|\
       -                                                     |FWIW|vbg|GD&R|HTH|HTHBE|IMHO|IMNSHO|\
       -                                                     |IRL|RTFM|ROTFL|ROFL|YMMV)[*]?"
       -color body          color245        color234        "[ ][*][^*]*[*][ ]?" # more emoticon?
       -color body          color245        color234        "[ ]?[*][^*]*[*][ ]" # more emoticon?
       -
       -## pgp
       -
       -color body          color160        color234        "(BAD signature)"
       -color body          color37         color234        "(Good signature)"
       -color body          color234        color234        "^gpg: Good signature .*"
       -color body          color241        color234        "^gpg: "
       -color body          color241        color160        "^gpg: BAD signature from.*"
       -mono  body          bold                            "^gpg: Good signature"
       -mono  body          bold                            "^gpg: BAD signature from.*"
       -color body          color160        color234        "([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<>\"]"
       -color body          color33         color234        "( *[-+=#*~_]){6,}"
 (DIR) diff --git a/newsraft/config b/newsraft/config
       @@ -1,17 +0,0 @@
       -# settings
       -set open-in-browser-command ~/bin/link-handler "%l"
       -list-entry-date-format "%D"
       -feeds-menu-paramount-explore true
       -
       -# key bindings
       -bind w exec "~/bin/link-handler %l"
       -
       -# appearance
       -status-placeholder
       -set menu-feed-sorting unread-desc
       -
       -# disable notifications
       -notification-command ""
       -
       -# filters
       -set item-rule LOWER(title) NOT LIKE '%trump%' AND LOWER(title) NOT LIKE '%biden%' AND LOWER(title) NOT LIKE '%obama%' AND LOWER(title) NOT LIKE '%immigrants%' AND LOWER(title) NOT LIKE '%brexit%' AND LOWER(title) NOT LIKE '%starmer%' AND LOWER(title) NOT LIKE '%uk parliament%' AND LOWER(title) NOT LIKE '%congress%' AND LOWER(title) NOT LIKE '%white house%'
 (DIR) diff --git a/newsraft/feeds b/newsraft/feeds
       @@ -1,49 +0,0 @@
       -@ TECH
       -https://noted.lol/rss/ "Noted"
       -https://selfh.st/rss/ "Selfh"
       -https://planet.kernel.org/rss20.xml "Planet Kernel"
       -https://bearblog.dev/discover/feed/ "Bear Blogs"
       -
       -@ SOFTWARE
       -https://www.alpinelinux.org/atom.xml "Alpine Linux"
       -https://codeberg.org/newsraft/newsraft.rss "Newsraft"
       -
       -@ MEDIA
       -https://showrss.info/other/all.rss "TV Torrents"
       -
       -@ PEOPLE
       -https://codemadness.org/atom.xml "CodeMadness"
       -https://drewdevault.com/blog/index.xml "Drew DeVault"
       -http://joeyh.name/blog/index.rss "Joey H"
       -https://www.uninformativ.de/blog/feeds/en.atom "Uninformativ"
       -https://fabiensanglard.net/rss.xml "Fabiensanglard"
       -https://pluralistic.net/feed/ "Pluralistic"
       -https://k0.tel/feed.xml "Koutsie"
       -https://labnotes.org/rss/ "Lab Notes"
       -https://www.jeffgeerling.com/blog.xml "Jeff Geerling"
       -https://garfnet.org.uk/cms/feed/ "Garfnet"
       -https://bfloeser.de/index.xml "Benedikt"
       -https://chromic.org/index.xml "Chromic"
       -https://dandelion-utilitarian.com/feed.xml "Dandelion-Utilitarian"
       -https://wrongthink.link/posts/index.xml "Wrong Think"
       -https://www.cheeyeo.xyz/feed.xml "Chee Yeo"
       -https://vkc.sh/feed/ "Veronica"
       -https://chriswere.wales/rss.xml "Chris Were"
       -https://writer13.neocities.org/rss.xml "Writer 13"
       -https://techrights.org/feed.xml "TechRights"
       -
       -@ GAMING
       -https://www.gamingonlinux.com/article_rss.php "Gaming On Linux"
       -
       -@ ODYSEE
       -https://odysee.com/$/rss/@AlphaNerd:8 "Mental Outlaw"
       -https://odysee.com/$/rss/@techlore:3 "TechLore"
       -https://odysee.com/$/rss/@NaomiBrockwell:4 "Naomi Brockwell"
       -https://odysee.com/$/rss/@davidbombal:0 "David Bombal"
       -https://odysee.com/$/rss/@thelinuxcast:4 "The Linux Cast"
       -https://odysee.com/$/rss/@GreatScott:a "Great Scott"
       -https://odysee.com/$/rss/@rossmanngroup:a "Louis Rossmann"
       -https://odysee.com/$/rss/@gotbletu:b "Gotbletu"
       -
       -@ PODCASTS
       -http://www.2600.com/oth-broadband.xml "2600"
 (DIR) diff --git a/qutebrowser/blank.html b/qutebrowser/blank.html
       @@ -1,44 +0,0 @@
       -<!DOCTYPE html>
       -<html lang="en">
       -
       -  <head>
       -    <style>
       -        body {
       -          color: #cfba58;
       -          background-color: #191919;
       -          font-family: monospace;
       -        }
       -
       -        .flex {
       -          flex-direction: column;
       -          display: flex;
       -          justify-content: center;
       -          align-items: center;
       -          margin-top: 450px;
       -        }
       -
       -        input {
       -          border: none;
       -          border-bottom: 2px solid #959A1C;
       -          min-width: 500px;
       -          max-width: 750px;
       -          width: 75%;
       -          padding-bottom: 10px;
       -          background-color: transparent;
       -          color: #fff;
       -          outline: 0;
       -          margin-bottom: 20px;
       -          font-size: 22px;
       -        }
       -    </style>
       -  </head>
       -
       -  <body>
       -    <div class="flex">
       -      <form action="https://html.duckduckgo.com/html" method="get" target="_self">
       -        <input type="text" name="q" autofocus="autofocus" onfocus="this.select()" />
       -      </form>
       -    </div>
       -  </body>
       -
       -</html>
 (DIR) diff --git a/qutebrowser/config.py b/qutebrowser/config.py
       @@ -1,108 +0,0 @@
       -config.load_autoconfig(False)
       -
       -try:
       -    from qutebrowser.api import message
       -
       -    # gruvbox colour theme
       -    config.source('scripts/gruvbox.py')
       -    #config.source('scripts/redirects.py')
       -
       -except ImportError:
       -    pass
       -
       -# default local page
       -DEFAULT_PAGE = str(config.configdir / 'blank.html')
       -
       -# keybinds remapping
       -config.bind("xx", "set tabs.show always;; later 5000 set tabs.show switching")
       -config.bind("xc", "spawn --userscript password_fill")
       -config.bind("zd", "download-open")
       -config.bind("xz", "hint links spawn --detach ~/bin/link-handler {hint-url}")
       -config.bind("j", "cmd-run-with-count 5 scroll down")
       -config.bind("k", "cmd-run-with-count 5 scroll up")
       -
       -# tabbar
       -c.tabs.position = "top"
       -c.tabs.show = "multiple"
       -c.tabs.title.format = ""
       -c.tabs.width = 28
       -c.tabs.favicons.show = "never"
       -
       -# hints
       -c.colors.hints.bg = "rgb(207,186,88)" #cfba58
       -c.colors.hints.fg = "rgb(34, 34, 34)" #222222
       -
       -# darkmode
       -c.colors.webpage.darkmode.enabled = True
       -c.colors.webpage.darkmode.algorithm = 'lightness-cielab'
       -c.colors.webpage.darkmode.policy.images = 'never'
       -config.set('colors.webpage.darkmode.enabled', False, 'file://*')
       -
       -# misc
       -c.fonts.hints = "14pt Hack"
       -c.fonts.default_size = '12pt'
       -c.fonts.default_family = 'Hack'
       -c.hints.uppercase = True
       -c.scrolling.smooth = True
       -c.editor.command = ["foot", "vim '{}'"]
       -c.auto_save.session = True
       -c.zoom.default = "140%"
       -
       -# ad-block
       -c.content.blocking.enabled = True
       -c.content.blocking.method = "both"
       -c.content.blocking.adblock.lists = [
       -    "https://easylist.to/easylist/easyprivacy.txt",
       -    "https://secure.fanboy.co.nz/fanboy-cookiemonster.txt",
       -    "https://easylist.to/easylist/easylist.txt"
       -]
       -
       -# general privacy
       -c.completion.web_history.max_items = 0 # no history
       -c.downloads.remove_finished = 800 # clear dl history
       -c.downloads.location.directory = '~/tmp'
       -c.url.default_page = DEFAULT_PAGE
       -c.url.start_pages = DEFAULT_PAGE
       -c.content.private_browsing = True # always use private browsing
       -c.content.register_protocol_handler = False
       -c.content.webgl = False
       -
       -# normally default, lets make sure
       -c.content.media.audio_capture = False
       -c.content.media.audio_video_capture = False
       -c.content.media.video_capture = False
       -c.content.desktop_capture = False
       -c.content.mouse_lock = False
       -c.content.autoplay = False # no autoplay on <video> tags
       -
       -# fingerprint
       -c.content.headers.accept_language = "en-US,en;q=0.5"
       -c.content.headers.user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36"
       -c.content.headers.custom = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}
       -c.content.headers.referer = "never"
       -c.content.cookies.accept = "no-3rdparty"
       -c.content.javascript.enabled = False # disable tracking etc
       -c.content.canvas_reading = False # canvas blocking
       -c.content.geolocation = False # location ident
       -c.content.webrtc_ip_handling_policy = "disable-non-proxied-udp"
       -c.content.hyperlink_auditing = False # disable pingbacks
       -c.content.dns_prefetch = False # disable dns pre-fetching
       -
       -# search engine shortneners
       -c.url.searchengines = {
       -    "DEFAULT": "https://html.duckduckgo.com/html?q={}",
       -    "ru": "https://rutracker.org/forum/tracker.php?f=1992&nm={}",
       -    "wiby": "https://wiby.me/?q={}",
       -    "!book": "http://libgen.li/search.php?req={}&lg_topic=libgen&open=0&view=simple&res=25&phrase=1&column=def",
       -    "!wiki": "https://en.wikipedia.org/wiki/Special:Search?search={}",
       -}
       -
       -# javascript whitelist
       -js_whitelist = [
       -    "*://localhost/*",
       -    "*://127.0.0.1/*"
       -]
       -
       -for site in js_whitelist:
       -    with config.pattern(site) as p:
       -        p.content.javascript.enabled = True
 (DIR) diff --git a/qutebrowser/scripts/fingerprint.py b/qutebrowser/scripts/fingerprint.py
       @@ -1,43 +0,0 @@
       -import random
       -import json
       -import datetime
       -
       -from pathlib import Path
       -from qutebrowser.api import message, interceptor
       -
       -home = str(config.configdir)
       -agentfile = Path("{}/useragent_list.json".format(home))
       -
       -fp_timer = datetime.datetime.now() + datetime.timedelta(minutes=1)
       -
       -if agentfile.is_file():
       -    with open(agentfile, "r") as filehandle:
       -        agentList = json.load(filehandle)
       -
       -
       -def fingerprint_getheader(agent):
       -
       -    FP_HTTP_HEADER = {
       -        "Firefox": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
       -        "Chrome": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
       -        "Edge": "text/html, application/xhtml+xml, image/jxr, */*",
       -        "Opera": "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
       -        "Safari": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
       -    }
       -
       -    for a, h in FP_HTTP_HEADER.items():
       -        if "{a}" in agent:
       -            return h
       -
       -
       -def fingerprint(info: interceptor.Request):
       -    global fp_timer
       -
       -    if fp_timer < datetime.datetime.now():
       -        fp_timer = datetime.datetime.now() + datetime.timedelta(minutes=1)
       -        agent = random.choice(tuple(agentList))
       -        c.content.headers.user_agent = agent
       -        c.content.headers.custom = {"accept": fingerprint_getheader(agent)}
       -
       -
       -interceptor.register(fingerprint)
 (DIR) diff --git a/qutebrowser/scripts/gruvbox.py b/qutebrowser/scripts/gruvbox.py
       @@ -1,332 +0,0 @@
       -# gruvbox dark hard qutebrowser theme by Florian Bruhin <me@the-compiler.org>
       -#
       -# Originally based on:
       -#   base16-qutebrowser (https://github.com/theova/base16-qutebrowser)
       -#   Base16 qutebrowser template by theova and Daniel Mulford
       -#   Gruvbox dark, hard scheme by Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)
       -
       -bg0_hard = "#1d2021"
       -bg0_soft = '#32302f'
       -bg0_normal = '#282828'
       -
       -bg0 = bg0_normal
       -bg1 = "#3c3836"
       -bg2 = "#504945"
       -bg3 = "#665c54"
       -bg4 = "#7c6f64"
       -
       -fg0 = "#fbf1c7"
       -fg1 = "#ebdbb2"
       -fg2 = "#d5c4a1"
       -fg3 = "#bdae93"
       -fg4 = "#a89984"
       -
       -bright_red = "#fb4934"
       -bright_green = "#b8bb26"
       -bright_yellow = "#fabd2f"
       -bright_blue = "#83a598"
       -bright_purple = "#d3869b"
       -bright_aqua = "#8ec07c"
       -bright_gray = "#928374"
       -bright_orange = "#fe8019"
       -
       -dark_red = "#cc241d"
       -dark_green = "#98971a"
       -dark_yellow = "#d79921"
       -dark_blue = "#458588"
       -dark_purple = "#b16286"
       -dark_aqua = "#689d6a"
       -dark_gray = "#a89984"
       -dark_orange = "#d65d0e"
       -
       -### Completion
       -
       -# Text color of the completion widget. May be a single color to use for
       -# all columns or a list of three colors, one for each column.
       -c.colors.completion.fg = [fg1, bright_aqua, bright_yellow]
       -
       -# Background color of the completion widget for odd rows.
       -c.colors.completion.odd.bg = bg0
       -
       -# Background color of the completion widget for even rows.
       -c.colors.completion.even.bg = c.colors.completion.odd.bg
       -
       -# Foreground color of completion widget category headers.
       -c.colors.completion.category.fg = bright_blue
       -
       -# Background color of the completion widget category headers.
       -c.colors.completion.category.bg = bg1
       -
       -# Top border color of the completion widget category headers.
       -c.colors.completion.category.border.top = c.colors.completion.category.bg
       -
       -# Bottom border color of the completion widget category headers.
       -c.colors.completion.category.border.bottom = c.colors.completion.category.bg
       -
       -# Foreground color of the selected completion item.
       -c.colors.completion.item.selected.fg = fg0
       -
       -# Background color of the selected completion item.
       -c.colors.completion.item.selected.bg = bg4
       -
       -# Top border color of the selected completion item.
       -c.colors.completion.item.selected.border.top = bg2
       -
       -# Bottom border color of the selected completion item.
       -c.colors.completion.item.selected.border.bottom = c.colors.completion.item.selected.border.top
       -
       -# Foreground color of the matched text in the selected completion item.
       -c.colors.completion.item.selected.match.fg = bright_orange
       -
       -# Foreground color of the matched text in the completion.
       -c.colors.completion.match.fg = c.colors.completion.item.selected.match.fg
       -
       -# Color of the scrollbar handle in the completion view.
       -c.colors.completion.scrollbar.fg = c.colors.completion.item.selected.fg
       -
       -# Color of the scrollbar in the completion view.
       -c.colors.completion.scrollbar.bg = c.colors.completion.category.bg
       -
       -### Context menu
       -
       -# Background color of disabled items in the context menu.
       -c.colors.contextmenu.disabled.bg = bg3
       -
       -# Foreground color of disabled items in the context menu.
       -c.colors.contextmenu.disabled.fg = fg3
       -
       -# Background color of the context menu. If set to null, the Qt default is used.
       -c.colors.contextmenu.menu.bg = bg0
       -
       -# Foreground color of the context menu. If set to null, the Qt default is used.
       -c.colors.contextmenu.menu.fg =  fg2
       -
       -# Background color of the context menu’s selected item. If set to null, the Qt default is used.
       -c.colors.contextmenu.selected.bg = bg2
       -
       -#Foreground color of the context menu’s selected item. If set to null, the Qt default is used.
       -c.colors.contextmenu.selected.fg = c.colors.contextmenu.menu.fg
       -
       -### Downloads
       -
       -# Background color for the download bar.
       -c.colors.downloads.bar.bg = bg0
       -
       -# Color gradient start for download text.
       -c.colors.downloads.start.fg = bg0
       -
       -# Color gradient start for download backgrounds.
       -c.colors.downloads.start.bg = bright_blue
       -
       -# Color gradient end for download text.
       -c.colors.downloads.stop.fg = c.colors.downloads.start.fg
       -
       -# Color gradient stop for download backgrounds.
       -c.colors.downloads.stop.bg = bright_aqua
       -
       -# Foreground color for downloads with errors.
       -c.colors.downloads.error.fg = bright_red
       -
       -### Hints
       -
       -# Font color for hints.
       -c.colors.hints.fg = bg0
       -
       -# Background color for hints.
       -c.colors.hints.bg = 'rgba(250, 191, 47, 200)'  # bright_yellow
       -
       -# Font color for the matched part of hints.
       -c.colors.hints.match.fg = bg4
       -
       -### Keyhint widget
       -
       -# Text color for the keyhint widget.
       -c.colors.keyhint.fg = fg4
       -
       -# Highlight color for keys to complete the current keychain.
       -c.colors.keyhint.suffix.fg = fg0
       -
       -# Background color of the keyhint widget.
       -c.colors.keyhint.bg = bg0
       -
       -### Messages
       -
       -# Foreground color of an error message.
       -c.colors.messages.error.fg = bg0
       -
       -# Background color of an error message.
       -c.colors.messages.error.bg = bright_red
       -
       -# Border color of an error message.
       -c.colors.messages.error.border = c.colors.messages.error.bg
       -
       -# Foreground color of a warning message.
       -c.colors.messages.warning.fg = bg0
       -
       -# Background color of a warning message.
       -c.colors.messages.warning.bg = bright_purple
       -
       -# Border color of a warning message.
       -c.colors.messages.warning.border = c.colors.messages.warning.bg
       -
       -# Foreground color of an info message.
       -c.colors.messages.info.fg = fg2
       -
       -# Background color of an info message.
       -c.colors.messages.info.bg = bg0
       -
       -# Border color of an info message.
       -c.colors.messages.info.border = c.colors.messages.info.bg
       -
       -### Prompts
       -
       -# Foreground color for prompts.
       -c.colors.prompts.fg = fg2
       -
       -# Border used around UI elements in prompts.
       -c.colors.prompts.border = f'1px solid {bg1}'
       -
       -# Background color for prompts.
       -c.colors.prompts.bg = bg3
       -
       -# Background color for the selected item in filename prompts.
       -c.colors.prompts.selected.bg = bg2
       -
       -### Statusbar
       -
       -# Foreground color of the statusbar.
       -c.colors.statusbar.normal.fg = fg2
       -
       -# Background color of the statusbar.
       -c.colors.statusbar.normal.bg = bg0
       -
       -# Foreground color of the statusbar in insert mode.
       -c.colors.statusbar.insert.fg = bg0
       -
       -# Background color of the statusbar in insert mode.
       -c.colors.statusbar.insert.bg = dark_aqua
       -
       -# Foreground color of the statusbar in passthrough mode.
       -c.colors.statusbar.passthrough.fg = bg0
       -
       -# Background color of the statusbar in passthrough mode.
       -c.colors.statusbar.passthrough.bg = dark_blue
       -
       -# Foreground color of the statusbar in private browsing mode.
       -c.colors.statusbar.private.fg = bright_purple
       -
       -# Background color of the statusbar in private browsing mode.
       -c.colors.statusbar.private.bg = bg0
       -
       -# Foreground color of the statusbar in command mode.
       -c.colors.statusbar.command.fg = fg3
       -
       -# Background color of the statusbar in command mode.
       -c.colors.statusbar.command.bg = bg1
       -
       -# Foreground color of the statusbar in private browsing + command mode.
       -c.colors.statusbar.command.private.fg = c.colors.statusbar.private.fg
       -
       -# Background color of the statusbar in private browsing + command mode.
       -c.colors.statusbar.command.private.bg = c.colors.statusbar.command.bg
       -
       -# Foreground color of the statusbar in caret mode.
       -c.colors.statusbar.caret.fg = bg0
       -
       -# Background color of the statusbar in caret mode.
       -c.colors.statusbar.caret.bg = dark_purple
       -
       -# Foreground color of the statusbar in caret mode with a selection.
       -c.colors.statusbar.caret.selection.fg = c.colors.statusbar.caret.fg
       -
       -# Background color of the statusbar in caret mode with a selection.
       -c.colors.statusbar.caret.selection.bg = bright_purple
       -
       -# Background color of the progress bar.
       -c.colors.statusbar.progress.bg = bright_blue
       -
       -# Default foreground color of the URL in the statusbar.
       -c.colors.statusbar.url.fg = fg4
       -
       -# Foreground color of the URL in the statusbar on error.
       -c.colors.statusbar.url.error.fg = dark_red
       -
       -# Foreground color of the URL in the statusbar for hovered links.
       -c.colors.statusbar.url.hover.fg = bright_orange
       -
       -# Foreground color of the URL in the statusbar on successful load
       -# (http).
       -c.colors.statusbar.url.success.http.fg = bright_red
       -
       -# Foreground color of the URL in the statusbar on successful load
       -# (https).
       -c.colors.statusbar.url.success.https.fg = fg0
       -
       -# Foreground color of the URL in the statusbar when there's a warning.
       -c.colors.statusbar.url.warn.fg = bright_purple
       -
       -### tabs
       -
       -# Background color of the tab bar.
       -c.colors.tabs.bar.bg = bg0
       -
       -# Color gradient start for the tab indicator.
       -c.colors.tabs.indicator.start = bright_blue
       -
       -# Color gradient end for the tab indicator.
       -c.colors.tabs.indicator.stop = bright_aqua
       -
       -# Color for the tab indicator on errors.
       -c.colors.tabs.indicator.error = bright_red
       -
       -# Foreground color of unselected odd tabs.
       -c.colors.tabs.odd.fg = fg2
       -
       -# Background color of unselected odd tabs.
       -c.colors.tabs.odd.bg = bg2
       -
       -# Foreground color of unselected even tabs.
       -c.colors.tabs.even.fg = c.colors.tabs.odd.fg
       -
       -# Background color of unselected even tabs.
       -c.colors.tabs.even.bg = bg3
       -
       -# Foreground color of selected odd tabs.
       -c.colors.tabs.selected.odd.fg = fg2
       -
       -# Background color of selected odd tabs.
       -c.colors.tabs.selected.odd.bg = bg0
       -
       -# Foreground color of selected even tabs.
       -c.colors.tabs.selected.even.fg = c.colors.tabs.selected.odd.fg
       -
       -# Background color of selected even tabs.
       -c.colors.tabs.selected.even.bg = bg0
       -
       -# Background color of pinned unselected even tabs.
       -c.colors.tabs.pinned.even.bg = bright_green
       -
       -# Foreground color of pinned unselected even tabs.
       -c.colors.tabs.pinned.even.fg = bg2
       -
       -# Background color of pinned unselected odd tabs.
       -c.colors.tabs.pinned.odd.bg = bright_green
       -
       -# Foreground color of pinned unselected odd tabs.
       -c.colors.tabs.pinned.odd.fg = c.colors.tabs.pinned.even.fg
       -
       -# Background color of pinned selected even tabs.
       -c.colors.tabs.pinned.selected.even.bg = bg0
       -
       -# Foreground color of pinned selected even tabs.
       -c.colors.tabs.pinned.selected.even.fg = c.colors.tabs.selected.odd.fg
       -
       -# Background color of pinned selected odd tabs.
       -c.colors.tabs.pinned.selected.odd.bg = c.colors.tabs.pinned.selected.even.bg
       -
       -# Foreground color of pinned selected odd tabs.
       -c.colors.tabs.pinned.selected.odd.fg = c.colors.tabs.selected.odd.fg
       -
       -# Background color for webpages if unset (or empty to use the theme's
       -# color).
       -# c.colors.webpage.bg = bg4
 (DIR) diff --git a/qutebrowser/scripts/redirects.py b/qutebrowser/scripts/redirects.py
       @@ -1,70 +0,0 @@
       -from qutebrowser.api import interceptor
       -from urllib.parse import urljoin
       -from PyQt6.QtCore import QUrl
       -import operator
       -
       -o = operator.methodcaller
       -s = 'setHost'
       -i = interceptor
       -
       -def farside(url: QUrl, i) -> bool:
       -    url.setHost('farside.link')
       -    p = url.path().strip('/')
       -    url.setPath(urljoin(i, p))
       -    return True
       -
       -def nitter(url: QUrl) -> bool:
       -    return farside(url, '/nitter/')
       -def rimgo(url: QUrl) -> bool:
       -    return farside(url, '/rimgo/')
       -def scribe(url: QUrl) -> bool:
       -    return farside(url, '/scribe/')
       -def wikiless(url: QUrl) -> bool:
       -    return farside(url, '/wikiless/')
       -def invid(url: QUrl) -> bool:
       -    return farside(url, '/invidious/')
       -def reddit(url: QUrl) -> bool:
       -    return farside(url, '/libreddit/')
       -def bibliogram(url: QUrl) -> bool:
       -    return farside(url, '/bibliogram/')
       -def simplytranslate(url: QUrl) -> bool:
       -    return farside(url, '/simplytranslate/')
       -def proxitok(url: QUrl) -> bool:
       -    return farside(url, '/proxitok/')
       -def querte (url: QUrl) -> bool:
       -    return farside(url, '/querte/')
       -
       -map = {
       -        "reddit.com": reddit,
       -        "www.reddit.com": reddit,
       -        "old.reddit.com": reddit,
       -
       -        "youtu.be": invid,
       -        "youtube.com": invid,
       -        "www.youtube.com": invid,
       -
       -        "twitter.com": nitter,
       -        "mobile.twitter.com": nitter,
       -
       -        "imgur.com" : rimgo,
       -        "medium.com" : scribe,
       -        "en.wikipedia.org" : wikiless,
       -        "www.instagram.com": bibliogram,
       -        "translate.google.com" : simplytranslate,
       -        "vm.tiktok.com" : proxitok,
       -        "www.tiktok.com" : proxitok,
       -        "www.quora.com": querte,
       -
       -        "www.twitch.tv" : o(s, 'm.twitch.tv'),
       -        "tumblr.com" : o(s, 'splashblr.fly.dev'),
       -        "www.npr.org" : o(s, 'text.npr.org'),
       -        }
       -def f(info: i.Request):
       -    if (info.resource_type != i.ResourceType.main_frame or
       -            info.request_url.scheme() in {"data", "blob"}):
       -        return
       -    url = info.request_url
       -    redir = map.get(url.host())
       -    if redir is not None and redir(url) is not False:
       -        info.redirect(url)
       -i.register(f)
 (DIR) diff --git a/qutebrowser/scripts/user_agent.py b/qutebrowser/scripts/user_agent.py
       @@ -1,31 +0,0 @@
       -# qutebrowser script to set a random user-agent on launch. Add the following to
       -# your qutebrowser config.py file:
       -#
       -#        config.source('scripts/user_agent.py')
       -#
       -# You can download the most common user-agents with a script like this, I run
       -# mine on cron every 3 days. :
       -#
       -# #!/bin/bash
       -#
       -# url='https://raw.githubusercontent.com/Kikobeats/top-user-agents/master/index.json'
       -# path="$HOME/.config/qutebrowser/useragent_list.json"
       -#
       -# curl "$url" -o "$path"
       -# awk '!/Firefox/' "$path" > /tmp/1 && mv /tmp/1 "$path"
       -
       -import random
       -import json
       -
       -from pathlib import Path
       -from qutebrowser.api import message
       -
       -home = str(config.configdir)
       -agentfile = Path("{}/useragent_list.json".format(home))
       -
       -if agentfile.is_file():
       -    with open(agentfile, "r") as filehandle:
       -        agentList = json.load(filehandle)
       -
       -    agent = random.choice(tuple(agentList))
       -    c.content.headers.user_agent = agent
 (DIR) diff --git a/qutebrowser/userscripts/password_fill b/qutebrowser/userscripts/password_fill
       @@ -1,388 +0,0 @@
       -#!/usr/bin/env bash
       -help() {
       -    blink=$'\e[1;31m' reset=$'\e[0m'
       -cat <<EOF
       -This script can only be used as a userscript for qutebrowser
       -2015, Thorsten Wißmann <edu _at_ thorsten-wissmann _dot_ de>
       -In case of questions or suggestions, do not hesitate to send me an E-Mail or to
       -directly ask me via IRC (nickname thorsten\`) in #qutebrowser on Libera Chat.
       -
       -  $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset
       -  WARNING: the passwords are stored in qutebrowser's
       -           debug log reachable via the url qute://log
       -  $blink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$reset
       -
       -Usage: run as a userscript form qutebrowser, e.g.:
       -  spawn --userscript ~/.config/qutebrowser/password_fill
       -
       -Pass backend: (see also passwordstore.org)
       -  This script expects pass to store the credentials of each page in an extra
       -  file, where the filename (or filepath) contains the domain of the respective
       -  page. The first line of the file must contain the password, the login name
       -  must be contained in a later line beginning with "user:", "login:", or
       -  "username:" (configurable by the user_pattern variable).
       -
       -Behavior:
       -  It will try to find a username/password entry in the configured backend
       -  (currently only pass) for the current website and will load that pair of
       -  username and password to any form on the current page that has some password
       -  entry field. If multiple entries are found, a zenity menu is offered.
       -
       -  If no entry is found, then it crops subdomains from the url if at least one
       -  entry is found in the backend. (In that case, it always shows a menu)
       -
       -Configuration:
       -  This script loads the bash script ~/.config/qutebrowser/password_fill_rc (if
       -  it exists), so you can change any configuration variable and overwrite any
       -  function you like.
       -
       -EOF
       -}
       -
       -set -o errexit
       -set -o pipefail
       -shopt -s nocasematch # make regexp matching in bash case insensitive
       -
       -if [ -z "$QUTE_FIFO" ] ; then
       -    help
       -    exit
       -fi
       -
       -error() {
       -    local msg="$*"
       -    echo "message-error '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
       -}
       -msg() {
       -    local msg="$*"
       -    echo "message-info '${msg//\'/\\\'}'" >> "$QUTE_FIFO"
       -}
       -die() {
       -    error "$*"
       -    exit 0
       -}
       -
       -javascript_escape() {
       -    # print the first argument in an escaped way, such that it can safely
       -    # be used within javascripts double quotes
       -    # shellcheck disable=SC2001
       -    sed "s,[\\\\'\"],\\\\&,g" <<< "$1"
       -}
       -
       -# ======================================================= #
       -# CONFIGURATION
       -# ======================================================= #
       -# The configuration file is per default located in
       -# ~/.config/qutebrowser/password_fill_rc and is a bash script that is loaded
       -# later in the present script. So basically you can replace all of the
       -# following definitions and make them fit your needs.
       -
       -# The following simplifies a URL to the domain (e.g. "wiki.qutebrowser.org")
       -# which is later used to search the correct entries in the password backend. If
       -# you e.g. don't want the "www." to be removed or if you want to distinguish
       -# between different paths on the same domain.
       -
       -simplify_url() {
       -    simple_url="${1##*://}" # remove protocol specification
       -    simple_url="${simple_url%%\?*}" # remove GET parameters
       -    simple_url="${simple_url%%/*}" # remove directory path
       -    simple_url="${simple_url%:*}" # remove port
       -    simple_url="${simple_url##www.}" # remove www. subdomain
       -}
       -
       -# no_entries_found() is called if the first query_entries() call did not find
       -# any matching entries. Multiple implementations are possible:
       -# The easiest behavior is to quit:
       -#no_entries_found() {
       -#    if [ 0 -eq "${#files[@]}" ] ; then
       -#        die "No entry found for »$simple_url«"
       -#    fi
       -#}
       -# But you could also fill the files array with all entries from your pass db
       -# if the first db query did not find anything
       -# no_entries_found() {
       -#     if [ 0 -eq "${#files[@]}" ] ; then
       -#         query_entries ""
       -#         if [ 0 -eq "${#files[@]}" ] ; then
       -#             die "No entry found for »$simple_url«"
       -#         fi
       -#     fi
       -# }
       -
       -# Another behavior is to drop another level of subdomains until search hits
       -# are found:
       -no_entries_found() {
       -    while [ 0 -eq "${#files[@]}" ] && [ -n "$simple_url" ]; do
       -        # shellcheck disable=SC2001
       -        shorter_simple_url=$(sed 's,^[^.]*\.,,' <<< "$simple_url")
       -        if [ "$shorter_simple_url" = "$simple_url" ] ; then
       -            # if no dot, then even remove the top level domain
       -            simple_url=""
       -            query_entries "$simple_url"
       -            break
       -        fi
       -        simple_url="$shorter_simple_url"
       -        query_entries "$simple_url"
       -        #die "No entry found for »$simple_url«"
       -        # enforce menu if we do "fuzzy" matching
       -        menu_if_one_entry=1
       -    done
       -    if [ 0 -eq "${#files[@]}" ] ; then
       -        die "No entry found for »$simple_url«"
       -    fi
       -}
       -
       -# Backend implementations tell, how the actual password store is accessed.
       -# Right now, there is only one fully functional password backend, namely for
       -# the program "pass".
       -# A password backend consists of three actions:
       -#  - init() initializes backend-specific things and does sanity checks.
       -#  - query_entries() is called with a simplified url and is expected to fill
       -#    the bash array $files with the names of matching password entries. There
       -#    are no requirements how these names should look like.
       -#  - open_entry() is called with some specific entry of the $files array and is
       -#    expected to write the username of that entry to the $username variable and
       -#    the corresponding password to $password
       -
       -# shellcheck disable=SC2329
       -reset_backend() {
       -    init() { true ; }
       -    query_entries() { true ; }
       -    open_entry() { true ; }
       -}
       -
       -# choose_entry() is expected to choose one entry from the array $files and
       -# write it to the variable $file.
       -choose_entry() {
       -    choose_entry_zenity
       -}
       -
       -# The default implementation chooses a random entry from the array. So if there
       -# are multiple matching entries, multiple calls to this userscript will
       -# eventually pick the "correct" entry. I.e. if this userscript is bound to
       -# "zl", the user has to press "zl" until the correct username shows up in the
       -# login form.
       -choose_entry_random() {
       -    local nr=${#files[@]}
       -    file="${files[$((RANDOM % nr))]}"
       -    # Warn user, that there might be other matching password entries
       -    if [ "$nr" -gt 1 ] ; then
       -        msg "Picked $file out of $nr entries: ${files[*]}"
       -    fi
       -}
       -
       -# another implementation would be to ask the user via some menu (like rofi or
       -# dmenu or zenity or even qutebrowser completion in future?) which entry to
       -# pick
       -MENU_COMMAND=( head -n 1 )
       -# whether to show the menu if there is only one entry in it
       -menu_if_one_entry=0
       -choose_entry_menu() {
       -    local nr=${#files[@]}
       -    if [ "$nr" -eq 1 ] && ! ((menu_if_one_entry)) ; then
       -        file="${files[0]}"
       -    else
       -        file=$( printf '%s\n' "${files[@]}" | "${MENU_COMMAND[@]}" )
       -    fi
       -}
       -
       -choose_entry_rofi() {
       -    MENU_COMMAND=( rofi -p "qutebrowser> " -dmenu
       -                        -mesg $'Pick a password entry for <b>'"${QUTE_URL//&/&amp;}"'</b>' )
       -    choose_entry_menu || true
       -}
       -
       -choose_entry_zenity() {
       -    MENU_COMMAND=( zenity --list --title "qutebrowser password fill"
       -                          --text "Pick the password entry:"
       -                          --column "Name" )
       -    choose_entry_menu || true
       -}
       -
       -choose_entry_zenity_radio() {
       -    # shellcheck disable=SC2329
       -    zenity_helper() {
       -        awk '{ print $0 ; print $0 }'                   \
       -        | zenity --list --radiolist                     \
       -                 --title "qutebrowser password fill"    \
       -                 --text "Pick the password entry:"      \
       -                 --column " " --column "Name"
       -    }
       -    MENU_COMMAND=( zenity_helper )
       -    choose_entry_menu || true
       -}
       -
       -# =======================================================
       -# backend: PASS
       -
       -# configuration options:
       -match_filename=1 # whether allowing entry match by filepath
       -match_line=0     # whether allowing entry match by URL-Pattern in file
       -                 # Note: match_line=1 gets very slow, even for small password stores!
       -match_line_pattern='^url: .*' # applied using grep -iE
       -user_pattern='^(user|username|login): '
       -
       -GPG_OPTS=( "--quiet" "--yes" "--compress-algo=none" "--no-encrypt-to" )
       -GPG="gpg"
       -export GPG_TTY="${GPG_TTY:-$(tty 2>/dev/null)}"
       -command -v gpg2 &>/dev/null && GPG="gpg2"
       -[[ -n $GPG_AGENT_INFO || $GPG == "gpg2" ]] && GPG_OPTS+=( "--batch" "--use-agent" )
       -
       -pass_backend() {
       -    init() {
       -        PREFIX="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
       -        if ! [ -d "$PREFIX" ] ; then
       -            die "Can not open password store dir »$PREFIX«"
       -        fi
       -    }
       -    query_entries() {
       -        local url="$1"
       -
       -        if ((match_line)) ; then
       -            # add entries with matching URL-tag
       -            while read -r -d "" passfile ; do
       -                if $GPG "${GPG_OPTS[@]}" -d "$passfile" \
       -                     | grep --max-count=1 -iE "${match_line_pattern}${url}" > /dev/null
       -                then
       -                    passfile="${passfile#"$PREFIX"}"
       -                    passfile="${passfile#/}"
       -                    files+=( "${passfile%.gpg}" )
       -                fi
       -            done < <(find -L "$PREFIX" -iname '*.gpg' -print0)
       -        fi
       -        if ((match_filename)) ; then
       -            # add entries with matching filepath
       -            while read -r passfile ; do
       -                passfile="${passfile#"$PREFIX"}"
       -                passfile="${passfile#/}"
       -                files+=( "${passfile%.gpg}" )
       -            done < <(find -L "$PREFIX" -iname '*.gpg' | grep "$url")
       -        fi
       -    }
       -    open_entry() {
       -        local path="$PREFIX/${1}.gpg"
       -        password=""
       -        local firstline=1
       -        while read -r line ; do
       -            if ((firstline)) ; then
       -                password="$line"
       -                firstline=0
       -            else
       -                if [[ $line =~ $user_pattern ]] ; then
       -                    # remove the matching prefix "user: " from the beginning of the line
       -                    username=${line#"${BASH_REMATCH[0]}"}
       -                    break
       -                fi
       -            fi
       -        done < <($GPG "${GPG_OPTS[@]}" -d "$path" | awk 1 )
       -    }
       -}
       -# =======================================================
       -
       -# =======================================================
       -# backend: secret
       -# shellcheck disable=SC2329
       -secret_backend() {
       -    init() {
       -        return
       -    }
       -    query_entries() {
       -        local domain="$1"
       -        while read -r line ; do
       -            if [[ "$line" == "attribute.username = "* ]] ; then
       -                files+=("$domain ${line:21}")
       -            fi
       -        done < <( secret-tool search --unlock --all domain "$domain" 2>&1 )
       -    }
       -    open_entry() {
       -        local domain="${1%% *}"
       -        username="${1#* }"
       -        password=$(secret-tool lookup domain "$domain" username "$username")
       -    }
       -}
       -# =======================================================
       -
       -# load some sane default backend
       -reset_backend
       -pass_backend
       -# load configuration
       -QUTE_CONFIG_DIR=${QUTE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/qutebrowser/}
       -PWFILL_CONFIG=${PWFILL_CONFIG:-${QUTE_CONFIG_DIR}/password_fill_rc}
       -if [ -f "$PWFILL_CONFIG" ] ; then
       -    # shellcheck source=/dev/null
       -    source "$PWFILL_CONFIG"
       -fi
       -init
       -
       -simplify_url "$QUTE_URL"
       -query_entries "${simple_url}"
       -no_entries_found
       -# remove duplicates
       -mapfile -t files < <(printf '%s\n' "${files[@]}" | sort | uniq )
       -choose_entry
       -if [ -z "$file" ] ; then
       -    # choose_entry didn't want any of these entries
       -    exit 0
       -fi
       -open_entry "$file"
       -#username="$(date)"
       -#password="XYZ"
       -#msg "$username, ${#password}"
       -
       -[ -n "$username" ] || die "Username not set in entry $file"
       -[ -n "$password" ] || die "Password not set in entry $file"
       -
       -js() {
       -cat <<EOF
       -    function isVisible(elem) {
       -        var style = elem.ownerDocument.defaultView.getComputedStyle(elem, null);
       -
       -        if (style.getPropertyValue("visibility") !== "visible" ||
       -            style.getPropertyValue("display") === "none" ||
       -            style.getPropertyValue("opacity") === "0") {
       -            return false;
       -        }
       -
       -        return elem.offsetWidth > 0 && elem.offsetHeight > 0;
       -    };
       -    function hasPasswordField(form) {
       -        var inputs = form.getElementsByTagName("input");
       -        for (var j = 0; j < inputs.length; j++) {
       -            var input = inputs[j];
       -            if (input.type == "password") {
       -                return true;
       -            }
       -        }
       -        return false;
       -    };
       -    function loadData2Form (form) {
       -        var inputs = form.getElementsByTagName("input");
       -        for (var j = 0; j < inputs.length; j++) {
       -            var input = inputs[j];
       -            if (isVisible(input) && (input.type == "text" || input.type == "email")) {
       -                input.focus();
       -                input.value = "$(javascript_escape "${username}")";
       -                input.dispatchEvent(new Event('change'));
       -                input.blur();
       -            }
       -            if (input.type == "password") {
       -                input.focus();
       -                input.value = "$(javascript_escape "${password}")";
       -                input.dispatchEvent(new Event('change'));
       -                input.blur();
       -            }
       -        }
       -    };
       -
       -    var forms = document.getElementsByTagName("form");
       -    for (i = 0; i < forms.length; i++) {
       -        if (hasPasswordField(forms[i])) {
       -            loadData2Form(forms[i]);
       -        }
       -    }
       -EOF
       -}
       -
       -printjs() {
       -    js | sed 's,//.*$,,' | tr '\n' ' '
       -}
       -echo "jseval -q $(printjs)" >> "$QUTE_FIFO"
 (DIR) diff --git a/sfeed/sfeedrc b/sfeed/sfeedrc
       @@ -0,0 +1,51 @@
       +sfeedpath="$HOME/.config/sfeed/feeds"
       +
       +fetch() {
       +        case "$2" in
       +        *.gmi | 'gemini:'*)
       +                gemget -o - "$2"
       +                ;;
       +        *)
       +                curl "$2" 2>/dev/null
       +                ;;
       +        esac
       +}
       +
       +feeds() {
       +        # general
       +        feed 'tildenews' 'https://tilde.news/newest.rss'
       +        feed 'tvtorrents' 'https://showrss.info/other/all.rss'
       +        feed 'gamingonlinux' 'https://www.gamingonlinux.com/article_rss.php'
       +        feed 'bearblogs' 'https://bearblog.dev/discover/feed/'
       +        # apps
       +        feed 'rdrview' 'https://github.com/eafer/rdrview/commits/master.atom'
       +        feed 'fdm' 'https://github.com/nicm/fdm/commits.atom'
       +        feed 'sfeed' 'https://codemadness.org/git/sfeed/atom.xml'
       +        feed 'castget' 'https://github.com/mlj/castget/commits.atom'
       +        feed 'alpinelinux' 'https://www.alpinelinux.org/atom.xml'
       +        # gemini
       +        feed 'midnightpub' 'gemini://midnight.pub/feed.xml'
       +        feed 'antenna' 'gemini://warmedal.se/~antenna/atom.xml'
       +        feed 'techrights' 'gemini://gemini.techrights.org/feed.xml'
       +        feed 'ewok' 'gemini://warmedal.se/~bjorn/atom.xml'
       +        # people
       +        feed 'codemadness' 'https://codemadness.org/atom.xml'
       +        feed 'drewdevault' 'https://drewdevault.com/blog/index.xml'
       +        feed 'seeshyjo' 'http://joeyh.name/blog/index.rss'
       +        feed 'unixsheikh' 'https://unixsheikh.com/feed.rss'
       +        feed 'uninformativ' 'https://www.uninformativ.de/blog/feeds/en.atom'
       +        feed 'fabiensanglard' 'https://fabiensanglard.net/rss.xml'
       +        feed 'pluralistic' 'https://pluralistic.net/feed/'
       +        feed 'craphound' 'https://craphound.com/feed'
       +        feed 'koutsie' 'https://k0.tel/feed.xml'
       +        feed 'labnotes' 'https://labnotes.org/rss/'
       +        feed 'jeffgeerling' 'https://www.jeffgeerling.com/blog.xml'
       +        feed 'garfnet' 'https://garfnet.org.uk/cms/feed/'
       +        feed 'benedikt' 'https://bfloeser.de/index.xml'
       +        feed 'chromic' 'https://chromic.org/index.xml'
       +        feed 'dandelion-utilitarian' 'https://dandelion-utilitarian.com/feed.xml'
       +        feed 'wrongthink' 'https://wrongthink.link/posts/index.xml'
       +        feed 'cheeyeo' 'https://www.cheeyeo.xyz/feed.xml'
       +        feed 'veronica' 'https://vkc.sh/feed/'
       +        feed 'writer13' 'https://writer13.neocities.org/rss.xml'
       +}
 (DIR) diff --git a/sway/config b/sway/config
       @@ -16,9 +16,8 @@ workspace_layout default
        font pango: Hack:style=Regular 2
        
        # application assignment
       -for_window [app_id="mpv"] floating enable, sticky enable, resize set 560 280, move absolute position 3000 1100, no_focus
       +#for_window [app_id="mpv"] floating enable, sticky enable, resize set 560 280, move absolute position 3000 1100, no_focus
        assign [app_id="librewolf"] 2
       -assign [app_id="qutebrowser"] 2
        
        # misc
        xwayland enable
       @@ -33,8 +32,8 @@ input * {
        # keybinds
        bindsym $mod+Space exec footclient
        bindsym $mod+p exec $menu
       -bindsym $mod+f exec qutebrowser
       -bindsym $mod+m exec /home/jay/bin/music
       +bindsym $mod+f exec librewolf
       +bindsym $mod+m exec /home/jay/bin/music.sh
        bindsym $mod+s exec flatpak run com.heroicgameslauncher.hgl
        
        bindsym XF86AudioRaiseVolume exec pamixer -i 5
 (DIR) diff --git a/waybar/config b/waybar/config
       @@ -1,6 +1,5 @@
        {
                // general
       -        "output": "DP-1",
                "reload_style_on_change": true,
                "layer": "top",
                "position": "top",
       @@ -15,8 +14,6 @@
                ],
        
                "modules-right": [
       -                "custom/newsraft",
       -                "custom/mail",
                        "pulseaudio",
                        "tray",
                        "clock"