From e80c00e9faf41f4d43374471b330509f1c15769d Mon Sep 17 00:00:00 2001 From: Kris Yotam <75515498+krisyotam@users.noreply.github.com> Date: Thu, 2 Jul 2026 01:07:09 -0500 Subject: [PATCH] qutebrowser: sync Plan 9 acme theme from moirai --- .config/qutebrowser/config.py | 228 +++++++++++++++++++++++++--------- 1 file changed, 172 insertions(+), 56 deletions(-) diff --git a/.config/qutebrowser/config.py b/.config/qutebrowser/config.py index 588bb1821154168cd624c52314ecb740369a2ef9..0e9336f1e06db073edd43ed440f9448a11ab0b1c 100644 --- a/.config/qutebrowser/config.py +++ b/.config/qutebrowser/config.py @@ -15,6 +15,17 @@ c.aliases = {'q': 'quit', 'w': 'session-save', 'wq': 'quit --save'} # See: ~/.local/share/qutebrowser/greasemonkey/youtube-minimal.user.js +# Cookie and session persistence +c.content.cookies.accept = 'all' +c.content.cookies.store = True +c.auto_save.session = True + +# Disable page/resource cache (keeps cookies and logins) +c.content.cache.size = 0 + +# Chromium flags to disable aggressive caching (fixes stale HTML during dev) +c.qt.args = ['disable-http-cache'] + # Cookie settings for devtools config.set('content.cookies.accept', 'all', 'chrome-devtools://*') config.set('content.cookies.accept', 'all', 'devtools://*') @@ -25,6 +36,17 @@ config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99 Safari/537.36', 'https://*.slack.com/*') config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko/20100101 Firefox/71.0', 'https://docs.google.com/*') config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko/20100101 Firefox/71.0', 'https://drive.google.com/*') +config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.208 Safari/537.36', 'https://*.openai.com/*') +config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.208 Safari/537.36', 'https://chatgpt.com/*') +config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.208 Safari/537.36', 'https://auth0.openai.com/*') +config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.6998.208 Safari/537.36', 'https://auth.openai.com/*') + +# OpenAI login requires third-party cookies (auth0 cross-domain) and DRM for some features +config.set('content.cookies.accept', 'all', 'https://*.openai.com/*') +config.set('content.cookies.accept', 'all', 'https://auth.openai.com/*') +config.set('content.cookies.accept', 'all', 'https://auth0.openai.com/*') +config.set('content.cookies.accept', 'all', 'https://chatgpt.com/*') +config.set('content.tls.certificate_errors', 'ask-block-thirdparty', 'https://*.openai.com/*') # Load images in devtools config.set('content.images', True, 'chrome-devtools://*') @@ -40,8 +62,14 @@ config.set('content.javascript.enabled', True, 'qute://*/*') config.set('content.notifications.enabled', True, 'https://www.reddit.com') config.set('content.notifications.enabled', True, 'https://www.youtube.com') +# Stay in insert mode until Esc is pressed +c.input.insert_mode.auto_leave = False + # Downloads directory -c.downloads.location.directory = '~/Downloads' +c.downloads.location.directory = '~/dl' + +# Render PDFs in-browser instead of downloading +c.content.pdfjs = True # Tab bar visibility c.tabs.show = 'always' @@ -67,15 +95,43 @@ c.url.searchengines = { } # ============================================================================= -# Colors - Light mode with blue accents (no green) +# Colors - Plan 9 (acme-inspired) # ============================================================================= -# Webpage colors - force light mode +# Palette (from Zed Plan 9 theme) +_p9 = { + 'bg': '#ffffea', + 'fg': '#000000', + 'grey': '#bdc1bb', + 'dim_grey': '#666666', + 'dark_grey': '#444444', + 'panel': '#eaffff', + 'surface': '#ffffca', + 'yellow_bg': '#eeee9e', + 'border': '#99994c', + 'blue': '#000099', + 'link_blue': '#005dbb', + 'bright_blue':'#4993dd', + 'cyan': '#008888', + 'dim_cyan': '#55aaaa', + 'cyan_bg': '#9eeeee', + 'green': '#448844', + 'green_bg': '#aaffaa', + 'red': '#aa0000', + 'red_bg': '#ffaaaa', + 'magenta': '#8888cc', + 'yellow': '#99994c', +} + +# Webpage colors - do NOT override; let sites render natively c.colors.webpage.bg = 'white' c.colors.webpage.darkmode.enabled = False -c.colors.webpage.preferred_color_scheme = 'light' +c.colors.webpage.preferred_color_scheme = 'auto' + +# Ensure no user stylesheets paint external sites +c.content.user_stylesheets = [] -# Web fonts - Brave/Chrome defaults +# Web fonts c.fonts.web.family.standard = '' c.fonts.web.family.serif = '' c.fonts.web.family.sans_serif = '' @@ -84,65 +140,111 @@ c.fonts.web.size.default = 16 c.fonts.web.size.default_fixed = 13 c.fonts.web.size.minimum = 0 -# Completion widget -c.colors.completion.fg = '#1f2933' -c.colors.completion.odd.bg = '#f5f7f9' -c.colors.completion.even.bg = '#eef2f5' -c.colors.completion.category.fg = '#1f2933' -c.colors.completion.category.bg = '#dae4ee' -c.colors.completion.category.border.top = '#B0C5DA' -c.colors.completion.category.border.bottom = '#B0C5DA' -c.colors.completion.item.selected.fg = '#1f2933' -c.colors.completion.item.selected.bg = '#B0C5DA' -c.colors.completion.item.selected.match.fg = '#1f2933' -c.colors.completion.match.fg = '#90B0D2' -c.colors.completion.scrollbar.fg = '#90B0D2' +# Completion widget (multi-colored menu text) +c.colors.completion.fg = _p9['fg'] +c.colors.completion.odd.bg = _p9['bg'] +c.colors.completion.even.bg = _p9['surface'] +c.colors.completion.category.fg = _p9['green'] +c.colors.completion.category.bg = _p9['panel'] +c.colors.completion.category.border.top = _p9['cyan'] +c.colors.completion.category.border.bottom = _p9['cyan'] +c.colors.completion.item.selected.fg = _p9['fg'] +c.colors.completion.item.selected.bg = _p9['panel'] +c.colors.completion.item.selected.match.fg = _p9['red'] +c.colors.completion.match.fg = _p9['green'] +c.colors.completion.scrollbar.fg = _p9['dark_grey'] +c.colors.completion.scrollbar.bg = _p9['panel'] # Downloads -c.colors.downloads.bar.bg = '#eef2f5' -c.colors.downloads.error.bg = '#DEC292' +c.colors.downloads.bar.bg = _p9['panel'] +c.colors.downloads.start.bg = _p9['cyan'] +c.colors.downloads.start.fg = _p9['bg'] +c.colors.downloads.stop.bg = _p9['green'] +c.colors.downloads.stop.fg = _p9['bg'] +c.colors.downloads.error.bg = _p9['red'] +c.colors.downloads.error.fg = _p9['bg'] # Hints -c.colors.hints.fg = '#1f2933' -c.colors.hints.bg = '#dae4ee' -c.colors.hints.match.fg = '#90B0D2' +c.colors.hints.fg = _p9['fg'] +c.colors.hints.bg = _p9['yellow_bg'] +c.colors.hints.match.fg = _p9['red'] # Messages -c.colors.messages.info.bg = '#eef2f5' -c.colors.messages.info.fg = '#1f2933' +c.colors.messages.info.bg = _p9['panel'] +c.colors.messages.info.fg = _p9['fg'] +c.colors.messages.info.border = _p9['cyan'] +c.colors.messages.warning.bg = _p9['yellow_bg'] +c.colors.messages.warning.fg = _p9['fg'] +c.colors.messages.warning.border = _p9['yellow'] +c.colors.messages.error.bg = _p9['red_bg'] +c.colors.messages.error.fg = _p9['red'] +c.colors.messages.error.border = _p9['red'] + +# Prompts +c.colors.prompts.bg = _p9['panel'] +c.colors.prompts.fg = _p9['fg'] +c.colors.prompts.border = _p9['cyan'] +c.colors.prompts.selected.bg = _p9['cyan_bg'] +c.colors.prompts.selected.fg = _p9['fg'] # Statusbar -c.colors.statusbar.normal.bg = '#eef2f5' -c.colors.statusbar.normal.fg = '#1f2933' -c.colors.statusbar.insert.fg = '#1f2933' -c.colors.statusbar.insert.bg = '#B0C5DA' -c.colors.statusbar.passthrough.bg = '#9CC2EC' -c.colors.statusbar.passthrough.fg = '#1f2933' -c.colors.statusbar.command.bg = '#eef2f5' -c.colors.statusbar.command.fg = '#1f2933' -c.colors.statusbar.url.fg = '#1f2933' -c.colors.statusbar.url.success.http.fg = '#90B0D2' -c.colors.statusbar.url.success.https.fg = '#90B0D2' -c.colors.statusbar.url.warn.fg = '#DEC292' - -# Tabs -c.colors.tabs.bar.bg = '#eef2f5' -c.colors.tabs.odd.bg = '#f5f7f9' -c.colors.tabs.odd.fg = '#1f2933' -c.colors.tabs.even.bg = '#eef2f5' -c.colors.tabs.even.fg = '#1f2933' -c.colors.tabs.selected.odd.bg = '#B0C5DA' -c.colors.tabs.selected.odd.fg = '#1f2933' -c.colors.tabs.selected.even.bg = '#B0C5DA' -c.colors.tabs.selected.even.fg = '#1f2933' -c.colors.tabs.pinned.odd.bg = '#9CC2EC' -c.colors.tabs.pinned.odd.fg = '#1f2933' -c.colors.tabs.pinned.even.bg = '#AECDEC' -c.colors.tabs.pinned.even.fg = '#1f2933' -c.colors.tabs.pinned.selected.odd.bg = '#B0C5DA' -c.colors.tabs.pinned.selected.odd.fg = '#1f2933' -c.colors.tabs.pinned.selected.even.bg = '#B0C5DA' -c.colors.tabs.pinned.selected.even.fg = '#1f2933' +c.colors.statusbar.normal.bg = _p9['panel'] +c.colors.statusbar.normal.fg = _p9['fg'] +c.colors.statusbar.insert.fg = _p9['fg'] +c.colors.statusbar.insert.bg = _p9['green_bg'] +c.colors.statusbar.passthrough.bg = _p9['cyan_bg'] +c.colors.statusbar.passthrough.fg = _p9['fg'] +c.colors.statusbar.command.bg = _p9['panel'] +c.colors.statusbar.command.fg = _p9['fg'] +c.colors.statusbar.caret.bg = _p9['magenta'] +c.colors.statusbar.caret.fg = _p9['bg'] +c.colors.statusbar.caret.selection.bg = _p9['magenta'] +c.colors.statusbar.caret.selection.fg = _p9['bg'] +c.colors.statusbar.url.fg = _p9['fg'] +c.colors.statusbar.url.success.http.fg = _p9['green'] +c.colors.statusbar.url.success.https.fg = _p9['green'] +c.colors.statusbar.url.hover.fg = _p9['link_blue'] +c.colors.statusbar.url.warn.fg = _p9['yellow'] +c.colors.statusbar.url.error.fg = _p9['red'] + +# Tabs: inactive = grey, active = cyan_bg (same blue highlight as headers) +c.colors.tabs.bar.bg = _p9['panel'] +c.colors.tabs.odd.bg = _p9['grey'] +c.colors.tabs.odd.fg = _p9['dark_grey'] +c.colors.tabs.even.bg = _p9['grey'] +c.colors.tabs.even.fg = _p9['dark_grey'] +c.colors.tabs.selected.odd.bg = _p9['panel'] +c.colors.tabs.selected.odd.fg = _p9['fg'] +c.colors.tabs.selected.even.bg = _p9['panel'] +c.colors.tabs.selected.even.fg = _p9['fg'] +c.colors.tabs.pinned.odd.bg = _p9['grey'] +c.colors.tabs.pinned.odd.fg = _p9['dark_grey'] +c.colors.tabs.pinned.even.bg = _p9['grey'] +c.colors.tabs.pinned.even.fg = _p9['dark_grey'] +c.colors.tabs.pinned.selected.odd.bg = _p9['panel'] +c.colors.tabs.pinned.selected.odd.fg = _p9['fg'] +c.colors.tabs.pinned.selected.even.bg = _p9['panel'] +c.colors.tabs.pinned.selected.even.fg = _p9['fg'] +c.colors.tabs.indicator.start = _p9['cyan'] +c.colors.tabs.indicator.stop = _p9['green'] +c.colors.tabs.indicator.error = _p9['red'] + +# ============================================================================= +# Aliases +# ============================================================================= + +c.aliases.update({ + 'readability': 'spawn --userscript readability-js', + 'mpv': 'spawn --userscript view_in_mpv', + 'feeds': 'spawn --userscript openfeeds', + 'pass': 'spawn --userscript qute-pass', + 'json': 'spawn --userscript format_json', + 'rss': 'spawn --userscript rss', + 'zotero': 'spawn --userscript qute-zotero', +}) + +# Node.js module path for readability-js +c.qt.environ = {"NODE_PATH": "/usr/lib/node_modules"} # ============================================================================= # Keybindings @@ -153,6 +255,11 @@ c.colors.tabs.pinned.selected.even.fg = '#1f2933' # config.bind('O', 'spawn --userscript dmenu-open --tab') # Normal mode bindings +config.unbind('d') +config.bind('c', 'tab-close') +config.bind('b', 'back') +config.bind('f', 'forward') +config.bind('h', 'hint') config.bind('M', 'hint links spawn mpv {hint-url}') config.bind('Z', 'hint links spawn st -e youtube-dl {hint-url}') config.bind('t', 'set-cmd-text -s :open -t') @@ -160,6 +267,15 @@ config.bind('xb', 'config-cycle statusbar.show always never') config.bind('xt', 'config-cycle tabs.show always never') config.bind('xx', 'config-cycle statusbar.show always never;; config-cycle tabs.show always never') +# Userscript bindings +config.bind(',r', 'spawn --userscript readability-js') +config.bind(',m', 'spawn --userscript view_in_mpv') +config.bind(',f', 'spawn --userscript openfeeds') +config.bind(',p', 'spawn --userscript qute-pass') +config.bind(',j', 'spawn --userscript format_json') +config.bind(',z', 'spawn --userscript qute-zotero') +config.bind(',Z', 'hint links spawn --userscript qute-zotero') + # CSS stylesheet cycling (Solarized Everything CSS) # https://github.com/alphapapa/solarized-everything-css config.bind(',ap', 'config-cycle content.user_stylesheets ~/.config/qutebrowser/solarized-everything-css/css/apprentice/apprentice-all-sites.css ""')