qutebrowser v1.0.0 released!

I'm delighted to announce that I just released qutebrowser v1.0.0!

qutebrowser is a keyboard driven browser with a vim-like, minimalistic interface. It's written using PyQt and cross-platform.

This release comes with many big breaking changes such as the new config and QtWebEngine by default, so please take a look at the changelog.

As announced previously, per-domain settings unfortunately didn't make it into v1.0.0 - it's the next thing I plan on tackling. However, there's more than enough big things in v1.0.0! :)


edit: I just released v1.0.1 which fixes three bugs introduced in v1.0.0:

  • Fixed starting after customizing fonts.tabs or fonts.debug_console.
  • Fixed starting with old PyQt versions compiled against newer Qt versions.
  • Fixed check for PyQt version to correctly enforce 5.7 (not 5.2).

The full changelog for v1.0.0:

Major changes

  • Dependency changes:
    • Support for legacy QtWebKit (before 5.212 which is distributed independently from Qt) is dropped.
    • Support for Python 3.4 is dropped.
    • Support for Qt before 5.7.1 and PyQt before 5.7 is dropped.
    • New dependency on the QtSql module and Qt sqlite support.
    • New dependency on the attrs project (packaged as python-attr in some distributions).
    • The depedency on PyOpenGL (when using QtWebEngine) got removed. Note that PyQt5.QtOpenGL is still a dependency.
    • PyQt5.QtOpenGL is now always required, even with QtWebKit.
  • The QtWebEngine backend is now used by default. Note this means that QtWebEngine now should be a required dependency, and QtWebKit (if new enough) should be changed to an optional dependency.
  • Completely rewritten configuration system which ignores the old config file. See qute://help/configuring.html for details.
  • Various documentation files got moved to the doc/ subfolder; qutebrowser.desktop got moved to misc/.
  • :set now doesn't support toggling/cycling values anymore, that functionality got moved to :config-cycle.
  • New completion engine based on sqlite, which allows to complete the entire browsing history. The default for completion.web_history_max_items got changed to -1 (unlimited). If the completion is too slow on your machine, try setting it to a few 1000 items.


  • QtWebEngine: Spell checking support, see the spellcheck.languages setting.
  • New qt.args setting to pass additional arguments to Qt/Chromium.
  • New backend setting to select the backend to use. Together with the previous setting, this should make most wrapper scripts unnecessary.
  • qutebrowser can now be set as the default browser on macOS.
  • New config commands:
    • :config-cycle to cycle an option between multiple values.
    • :config-unset to remove a configured option.
    • :config-clear to remove all configured options.
    • :config-source to (re-)read a config.py file.
    • :config-edit to open the config.py file in an editor.
    • :config-write-py to write a config.py template file.
  • New :version command which opens qute://version.
  • New back/forward indicator in the statusbar.
  • New bindings.key_mappings setting to map keys to other keys.
  • QtWebEngine: Support for proxy authentication.


  • Using :download now uses the page's title as filename.
  • Using :back or :forward with a count now skips intermediate pages.
  • When there are multiple messages shown, the timeout is increased.
  • :search now only clears the search if one was displayed before, so pressing <Escape> doesn't un-focus inputs anymore.
  • Pinned tabs now adjust to their text's width, so the tabs.width.pinned setting got removed.
  • :set-cmd-text now has a --run-on-count argument to run the underlying command directly if a count was given.
  • :scroll-perc got renamed to :scroll-to-perc.


  • Migrating QtWebEngine data written by versions before 2016-11-15 (before v0.9.0) is now not supported anymore.
  • Upgrading qutebrowser with a version older than v0.4.0 still running now won't work properly anymore.
  • The --harfbuzz and --relaxed-config commandline arguments got dropped.


  • Exiting fullscreen via :fullscreen or buttons on a page now restores the correct previous window state (maximized/fullscreen).
  • When input.insert_mode.auto_load is set, background tabs now don't enter insert mode anymore.
  • The keybinding help widget now works correctly when using keybindings with a count.
  • The window.hide_wayland_decoration setting now works correctly again.

All posts

  1. qutebrowser v1.0.0 is coming closer
  2. New config merged!
  3. Config revolution - Part 1 finished
  4. Refactoring more things, a working YAML config, and more!
  5. Refactoring all the things!
  6. First week
  7. First 2 days
  8. Getting started again
  9. Second qutebrowser crowdfunding launched!
  10. qutebrowser v0.10.0 released
  11. Wrapping up and looking at the future
  12. Days 39/40/41: Lots of features!
  13. Days 37/38: Hints in master, tests
  14. Day 36: Hints!
  15. Days 33-35: Mouse functionality, and rewriting hints
  16. Days 31/32: More web elements
  17. Days 29/30: Web elements
  18. Days 27/28: Settings and web inspector
  19. Day 24-26: Refactoring the WebElement API
  20. Day 21-23: After Europython and releases
  21. Day 19/20: Bugs everywhere!
  22. qutebrowser v0.8.0 released
  23. Day 18: Javascript
  24. Day 17: Printing and searching
  25. Sending out qutebrowser and pytest stickers
  26. Day 15/16: Merged!
  27. Day 13/14: Almost merged!
  28. Day 12: Tests running!
  29. Day 10/11: Refactoring!
  30. Day 9: A bit of everything
  31. Day 8: More fixing and pytest sprint/training
  32. Day 7: Fixing things
  33. Day 6: Branching off
  34. qutebrowser v0.7.0 released
  35. Day 4: Playing whack-a-mole
  36. Day 3: Last pull requests and managing requirement files
  37. Day 2: More pull requests and nicer test output
  38. Day 1: Merging pull requests, and a stupid bug
  39. About and Timeline