@@ 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 ""')