A keyboard-driven, vim-like browser based on Python and Qt.
:set -u https://accounts.google.com/* content.headers.user_agent "Mozilla/5.0 ({os_info}; rv:90.0) Gecko/20100101 Firefox/90.0"
adblock
0.5.0+ are now handled properly.UnboundLocalError
in qute-keepass
when the database couldn't be opened.content.prefers_reduced_motion
setting to request websites to reduce
non-essential motion/animations.colors.prompts.selected.fg
setting to customize the text color for
selected items in filename prompts.content.blocking.hosts.lists
) now also
blocks all requests to any subdomains of blocked hosts.fonts.web.*
settings now support URL patterns.:greasemonkey-reload
command now shows a list of loaded scripts and has
a new --quiet
switch to suppress that message.QUTE_CURRENT_URL
environment
variable now points to the current page (rather than the URL of the selected
element, where QUTE_URL
points to).link_pyqt.py
script on Python 3.10
(e.g. via tox
or mkvenv.py
).--json-logging
without --debug
caused qutebrowser to crash since the
v1.13.0 release. It now works correctly again.content.headers.user_agent
or .accept_language
to a value
containing non-ascii characters was permitted by qutebrowser, but resulted in
a crash when loading a page. Such values are now rejected properly.qute://settings
page, a crash could happen, which is now fixed.:edit-text
is used, but the existing text in the input isn't
representable in the configured encoding (editor.encoding
), qutebrowser would
crash. It now shows a proper error instead.:selection-follow
was used,
this could cause a crash in qutebrowser. This is now fixed (speculatively, due
to lack of a reproducer).adblock-cache.dat
) got corrupted, qutebrowser
would crash when trying to load it. It now displays an error instead./S
(silent) and /allusers
when uninstalling via the Windows
installer now works properly.set-cmd-text
without any argument existed,
using :
would crash, which is now fixed.python -OO
(which is not recommended), a notification
being shown would result in a crash, which is now fixed.mkvenv.py
script now works when ldconfig -p
is failing.:spawn -u -o
broke in v2.2.0 and now works properly again.qute-bitwarden
userscript now still consumes returned data if the
Bitwarden CLI showed a warning but exited with a 0 (successful) exit code.qute-pass
userscript now doesn't try to match a username with
--password-only
, and error messages with invalid patterns are improved.qute-pass
userscript now avoids running pass
twice when --otp-only
is used.--force
argument for :tab-only
is deprecated, use --pinned close
instead.:tab-focus
without an argument or count is now deprecated, use
:tab-next
instead.QtDBus
module. If this requirement is an issue for you
or your distribution, please open an issue! Note that a DBus connection at
runtime is still optional.input.media_keys
setting which can be used to disable Chromium's
handling of media keys.:process
command (and associated qute://process
pages) which can be
used to view and terminate/kill external processes spawned by qutebrowser.content.site_specific_quirks.skip
setting which can be used to disable
individual site-specific quirks.--pinned
argument for :tab-only
, which replaces --force
(with
--pinned close
), but also can take --pinned keep
to keep pinned tabs
without prompting.fileselect.folder.command
which can be used with
fileselect.handler = external
to customize the command to use to upload
directories (<input type="file" webkitdirectory />
elements, which are
non-standard but in wide use).content.notifications.presenter
setting with various new ways to show
web notifications:
auto
(default): Automatically detect the best available optionqt
: Use Qt's built-in mechanism (like before this release)libnotify
: Use a libnotify-compatible notification server (i.e. native
notifications on Linux)systray
: Use a systray icon (very similar to qt
but without some of
its drawbacks)messages
: Use qutebrowser messagesherbe
: Use herbe
content.notifications.show_origin
setting, which can be used to decide
for which notifications to show the origin (the URL the notification was sent
from).content.ssl_strict
setting got renamed to
content.tls.certificate_errors
, with new values:
ask
: Prompt on overridable certificate errors (ssl_strict = 'ask'
)ask-block-thirdparty
: See belowblock
: Block the page load (ssl_strict = True
)load-insecurely
: Load the page despite the error (ssl_strict = False
)content.tls.certificate_errors
setting now also understands the
value ask-block-thirdparty
, which asks for page loads but automatically blocks
resource loads on TLS errors. This behavior is consistent with what other
browsers do.content.site_specific_quirks
setting got renamed to
content.site_specific_quirks.enabled
.content.notifications
option got renamed to
content.notifications.enabled
.set-cmd-text
in its
third column, such as o
for :open
.:spawn
is used with the -m
/ --output-messages
flag, the output now
appears live, while the process is running..redirect(...)
method on interceptors now supports an
ignore_unsupported=True
argument which supresses exceptions if a request could
not be redirected. Note, however, that it is still not public API.--config-py
argument is used, no warning about a missing
config.load_autoconfig
is shown anymore, as the argument is typically used
for temporarily testing a config._autosave
session used for crash recovery is now only saved
once per minute, since saving it for every page load is a noticable performance
issue.readability-js
userscript now displays a small header with page
information.T
(:tab-focus
) got changed so that it fills the
command line with :tab-focus
if used without a count (instead of being
equivalent to :tab-next
in that case).:config-unset
command now understands the --pattern
(-u
) flag to
unset options customized for a given URL pattern (such as after answering a
prompt with "always"/"never").:config-unset
command now shows an error when used on an option which is
valid, but was never customized.statusbar.widgets
setting now understands text:...
entries which
allows adding a hard-coded text to the statusbar.String.replaceAll
(required for Nextcloud Calendar < 2.2.0
with QtWebEngine < 5.15.3) is now disabled by default, as it's not fully
compliant to the ECMAScript spec and might cause issues on other websites.
If you still need it (e.g. if you're still on an old Nextcloud Calendar
version), remove js-string-replaceall
from
content.site_specific_quirks.skip
.--config-py
, qutebrowser now
complains instead of silently not loading it./etc/os-release
caused qutebrowser to
crash. Those are now handled correctly.NSRequiresAquaSystemAppearance
to false.qute://spawn-output
page used by :spawn -o
is now removed, as it's
replaced by the new qute://process
pages.:set -u matchmaker.krunker.io content.headers.accept_language ""
.qute-pass
userscript for gopass
:
bindings.key_mappings
to map a key to multiple other keys,
qutebrowser would crash. This is now handled correctly - however, note that
it's usually better to map keys to commands instead.:tab-select
, it's now un-minimized
properly.tabs.title_format
) used a value
like {current_url.host}
(instead of {current_url:host}
), qutebrowser
would crash. It now correctly reports an invalid config value instead.--asciidoc
script for mkvenv.py
broke with v1.14.0. It now works
correctly again.run-macro
-> macro-run
record-macro
-> macro-record
buffer
-> tab-select
open-editor
-> edit-text
toggle-selection
-> selection-toggle
drop-selection
-> selection-drop
reverse-selection
-> selection-reverse
follow-selected
-> selection-follow
follow-hint
-> hint-follow
enter-mode
-> mode-enter
leave-mode
-> mode-leave
:screenshot
command which can be used to screenshot the visible part of
the page.importlib_metadata
project on Python 3.7 and
below. This is only relevant when PyQtWebEngine is installed via pip - thus,
this dependency usually isn't relevant for packagers.qute-keepassxc
userscript integrating with the KeePassXC browser API.colors.webpage.prefers_color_scheme_dark
setting got renamed to
colors.webpage.preferred_color_scheme
and now takes the values auto
, light
and dark
(instead of being True
for dark and False
for auto).
Note that the light
value is only supported with Qt 5.15.2+, falling back to
the same behavior as auto
on older versions.pip
(as is e.g. the case with
mkvenv.py
), qutebrowser now queries the associated metadata to find out the
QtWebEngine version.:hint links yank --rapid
, the messages shown now replace each
other, thus being less noisy.confirm
, prompt
and alert
) are now
preserved.: open ...
, it's now not saved to
command history anymore (similar to how some shells work).:open
will now open a new tab instead of
displaying an error.fileselect.*.command
settings now support file selectors writing the
selected paths to stdout, which is used if no {}
placeholder is contained in
the configured command.--debug-flag
argument now understands a new log-sensitive-keys
value
which logs all keypresses (including those in insert/passthrough/prompt/...
mode) for debugging.readability
and readability-js
userscripts now add a
qute-readability
CSS class to the page, so that it can be styled easily via
a user stylesheet.qt.workarounds.locale
setting working around the issue. It is disabled by
default since distributions shipping 5.15.3 will probably have a proper patch
for it backported very soon.colors.webpage.preferred_color_scheme
and colors.webpage.darkmode.*
settings now work correctly with QtWebEngine 5.15.3 (and Gentoo, which at the
time of writing packages 5.15.3 disguised as 5.15.2).blink-features
arguments in
qt.args
(or --qt-flag
) were overridden. They are now combined properly.prefers-color-scheme
media
query is broken and always returns no-preference
, which was removed from the
CSS WG Specification. This release contains a workaround to always return
light
instead (as per the spec).nnn
does
when quitting the terminal), qutebrowser would crash. It now displays an
error instead. The same applies if the temporary file is unreadable for any
other reason.F
(hint all tab
) sometimes would open a context menu
instead of following a link. This is now fixed.String.replaceAll
did not handle special
regexp characters correctly, thus breaking some sites. It now handles them
properly.hist_importer.py
script didn't work correctly after qutebrowser v2.0.0
and resulted in a history database qutebrowser couldn't read properly. It now
works properly again.colors.wegpage.darkmode.policy.images
set to smart
.
Most notably, this causes formulae on Wikipedia to display black on (almost)
black. If content.site_specific_quirks
is enabled, qutebrowser now injects
some CSS as a workaround, which inverts all math formula images on Wikipedia
(and potentially other sites, if they use the same CSS class).content.cookies.store
to false
only worked properly when this was
done after qutebrowser was already started due to a regression in v2.0.0. It now
works as expected again.sip
dependency as sip
rather than
PyQt5.sip
was dropped, since upstream claims it should be used as PyQt5.sip
ever since PyQt 5.11. However, some distributions still package sip as a global
sip
package. Thus, support for a global sip
package is now reintroduced.hints.leave_on_load
was set to true
by default. However, the input.insert_mode.leave_on_load
setting was instead
set to true
accidentally. This is now fixed by actually setting
hints.leave_on_load
to true
, and reversing the change to
input.insert_mode.leave_on_load
so it is set to false
by default again.importlib_resources
package is required but was missing, users
would get a Python stacktrace rather than a proper error message. This is now
fixed.:help
page wasn't
displayed correctly. This is now fixed.config.load_autoconfig(...)
being missing when loading a secondary config
(e.g. via config.source(...)
). It now only shows those warnings for the main
config.py
file.--enable-webengine-inspector
flag is now accepted again, however it's
unused and undocumented. It purely exists to make it possible to use :restart
between pre-v2.0.x and v2.0.2+ versions.hints.dictionary
pointed to a file not encoded as UTF-8, this resulted
in a crash (also in versions before v2.0.0). It now properly displays an error
instead.open_url_in_instance.sh
, this would result in a partially initialized
window. Interacting with that window results in a crash (also in versions before
v2.0.0). Instead, the startpage is now shown properly.setup.py install
under certain conditions), a change in v2.0.0 caused it to
not start properly. This is now fixed.qutebrowser/components/adblock.py
file being picked up. That
file is not part of the release anymore, but if an old version is still around,
causes qutebrowser to crash. It's now explicitly blocked inside qutebrowser so
it gets ignored even if it still exists.:set
, and the adblock
dependency was unavailable when qutebrowser started (but was installed while
qutebrowser was open), this resulted in a crash. Now a warning prompting for a
restart of qutebrowser is shown instead.format_json
userscript now uses sh instead of bash again.add-nextcloud-bookmarks
, add-nextcloud-cookbook
, readability
and
ripbang
userscripts now use a python3
rather than plain python
shebang.QTWEBENGINE_CHROMIUM_FLAGS
is set in the environment, this causes flag
handling (including workarounds for QtWebEngine crashes) inside qutebrowser to
break. This will be handled properly in a future version, but this release now
shows a warning on standard output if this is the case.fileselect.*.command
now also includes the "nnn"
terminal file manager.