Technology moves fast! ⚡ Don't get left behind.🚶 Subscribe to our mailing list to keep up with latest and greatest in open source projects! 🏆

Subscribe to our mailing list


A keyboard-driven, vim-like browser based on PyQt5.

Subscribe to updates I use qutebrowser

Statistics on qutebrowser

Number of watchers on Github 3166
Number of open issues 544
Average time to close an issue about 14 hours
Main language Python
Average time to merge a PR 4 days
Open pull requests 78+
Closed pull requests 39+
Last commit over 1 year ago
Repo Created almost 5 years ago
Repo Last Updated over 1 year ago
Size 32.2 MB
Homepage https://www.quteb...
Organization / Authorqutebrowser
Latest Releasev1.2.1
Page Updated
Do you use qutebrowser? Leave a review!
View open issues (544)
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating qutebrowser for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

// If you are reading this in plaintext or on PyPi: // // A rendered version is available at: //


// QUTE_WEB_HIDE image:icons/qutebrowser-64x64.png[qutebrowser logo] A keyboard-driven, vim-like browser based on PyQt5 and Qt.

image:[license badge,link=] image:[version badge,link=] image:[Build Status, link=] image:[AppVeyor build status, link=] image:[coverage badge,link=]

link:[website] | link:[blog] |[FAQ] |[contributing] | link:[releases] |[installing] // QUTE_WEB_HIDE_END

qutebrowser is a keyboard-focused browser with a minimal GUI. It's based on Python and PyQt5 and free software, licensed under the GPL.

It was inspired by other browsers/addons like dwb and Vimperator/Pentadactyl.


image:doc/img/main.png[screenshot 1,width=300,link=doc/img/main.png] image:doc/img/downloads.png[screenshot 2,width=300,link=doc/img/downloads.png] image:doc/img/completion.png[screenshot 3,width=300,link=doc/img/completion.png] image:doc/img/hints.png[screenshot 4,width=300,link=doc/img/hints.png]


See the[github releases page] for available downloads and the link:doc/install.asciidoc[INSTALL] file for detailed instructions on how to get qutebrowser running on various platforms.


In addition to the topics mentioned in this README, the following documents are available:

  •[Key binding cheatsheet]: + image:[qutebrowser key binding cheatsheet,link=]
  • link:doc/quickstart.asciidoc[Quick start guide]
  •[Free training course] to remember those key bindings
  • link:doc/faq.asciidoc[Frequently asked questions]
  • link:doc/help/configuring.asciidoc[Configuring qutebrowser]
  • link:doc/contributing.asciidoc[Contributing to qutebrowser]
  • link:doc/install.asciidoc[Installing qutebrowser]
  • link:doc/changelog.asciidoc[Change Log]
  • link:doc/stacktrace.asciidoc[Reporting segfaults]
  • link:doc/userscripts.asciidoc[How to write userscripts]

Getting help

You can get help in the IRC channel irc://[#qutebrowser] on, or by writing a message to the[mailinglist] at[].

There's also an[announce-only mailinglist] at

If you're a reddit user, there's a[/r/qutebrowser] subreddit there.

Contributions / Bugs

You want to contribute to qutebrowser? Awesome! Please read link:doc/contributing.asciidoc[the contribution guidelines] for details and useful hints.

If you found a bug or have a feature request, you can report it in several ways:

  • Use the built-in :report command or the automatic crash dialog.
  • Open an issue in the Github issue tracker.
  • Write a mail to the[mailinglist] at[].

For security bugs, please contact me directly at, GPG ID[0x916eb0c8fd55a072].


The following software and libraries are required to run qutebrowser:

  •[Python] 3.5 or newer (3.6 recommended)
  •[Qt] 5.7.1 or newer with the following modules:
    • QtCore / qtbase
    • QtQuick (part of qtbase in some distributions)
    • QtSQL (part of qtbase in some distributions)
    • QtOpenGL
    • QtWebEngine, or
    • QtWebKit - only the link: fork is supported
  •[PyQt] 5.7.0 or newer (5.9.2 recommended) for Python 3

The following libraries are optional:

  • On Windows,[colorama] for colored log output.
  •[asciidoc] to generate the documentation for the :help command, when using the git repository (rather than a release).

See link:doc/install.asciidoc[the documentation] for directions on how to install qutebrowser and its dependencies.


Working on qutebrowser is a very rewarding hobby, but like (nearly) all hobbies it also costs some money. Namely I have to pay for the server and domain, and do occasional hardware upgrades footnote:[It turned out a 160 GB SSD is rather small - the VMs and custom Qt builds I use for testing/developing qutebrowser need about 100 GB of space].

If you want to give me a beer or a pizza back, I'm trying to make it as easy as possible for you to do so. If some other way would be easier for you, please get in touch!

  • PayPal:
  • Bitcoin: link:bitcoin:1PMzbcetAHfpxoXww8Bj5XqquHtVvMjJtE[1PMzbcetAHfpxoXww8Bj5XqquHtVvMjJtE]


qutebrowser's primary author is Florian Bruhin (The Compiler), but qutebrowser wouldn't be what it is without the help of[hundreds of contributors]!

Additionally, the following people have contributed graphics:

  • Jad/link:http://yelostudio.comyelo
  • WOFall (original icon)
  • regines (key binding cheatsheet)

Also, thanks to everyone who contributed to one of qutebrowser's link:doc/backers.asciidoc[crowdfunding campaigns]!

Similar projects

Many projects with a similar goal as qutebrowser exist. Most of them were inspirations for qutebrowser in some way, thanks for that!


*[vimb] (C, GTK+ with WebKit2)
*[luakit] (C/Lua, GTK+ with WebKit2)
*[surf] (C, GTK+ with WebKit1/WebKit2)
*[uzbl] (C, GTK+ with WebKit1/WebKit2)
* Chrome/Chromium addons:[cVim],[Vimium],[Surfingkeys],[Saka Key]
* Firefox addons (based on WebExtensions):[Vimium-FF] (experimental),[Saka Key],[Vim Vixen],[QuantumVim],[Tridactyl] (working
  on a[better API] for
  keyboard integration in Firefox).

  • Firefox addons (not based on WebExtensions or no recent activity):[Vimperator],[Pentadactyl],[VimFx],
  • Chrome/Chromium addons:[ViChrome],[Vrome]


This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see


qutebrowser optionally uses[pdf.js] to display PDF files in the browser. Windows releases come with a bundled pdf.js.

pdf.js is distributed under the terms of the Apache License. You can find a copy of the license in qutebrowser/3rdparty/pdfjs/LICENSE (in the Windows release or after running scripts/dev/, or online[here].

qutebrowser open issues Ask a question     (View All Issues)
  • over 2 years Black Screen with WebEngine and Nvidia Driver
  • over 2 years Update install instructions
  • over 2 years After executing `:search`, executing `:search-next` will try to look for an empty string
  • over 2 years URLs with spaces can't be bookmarked
  • over 2 years Segmentation fault when visiting various websites including using qt5-webkit-ng backend
  • over 2 years AttributeError: 'NoneType' object has no attribute 'history'
  • over 2 years --help fails with windows exe
  • over 2 years `qutebrowser --version` creates `~/Downloads` directory
  • over 2 years Flaky tests
  • over 2 years javascript: links aren't yankable
  • over 2 years Scrolling focus with background tabs
  • over 2 years Use view-source scheme for :view-source
  • over 2 years Selecting downloads with :download-*
  • over 2 years Add a --debug-flag argument
  • over 2 years Fullscreen behavior in unrelated tabs with fullscreen video
  • over 2 years Expose Chromium content switches
  • over 2 years Interactive popup blocking
  • over 2 years Add QSysInfo::prettyProductName to version info
  • over 2 years QtWebEngine and Nouveau
  • over 2 years AttributeError for self._reply.isOpen in _on_read_timer_timeout
  • over 2 years Rapid hints broken with hide-unmatched-rapid-hints set
  • over 2 years Bookmarks are sorted differently in qute:bookmarks and completion
  • over 2 years Add a :download-yank command to yank download URLs
  • over 2 years Clean up tox.ini
  • over 2 years QtWebEngine by default
  • over 2 years qute:history improvements
qutebrowser open pull requests (View All Pulls)
  • Clear notification messages when they're clicked.
  • Add --debug-flag argument
  • New qute:history page.
  • Benchmark history
  • Add a basic zsh completion script
  • Completion refactor V3
  • Added searchengine completion
  • Initial nsis install script
  • Additional/changed default keybinds for tab selection
  • added completer with tab behavior to file download dialog
  • Initial development to support pin tabs #926
  • Refresh on select
  • BDD tests for common exit paths
  • Pdfjs zoom keys
  • Add more variables
  • Convert :yank arguments to variables
  • qutewm
  • [WIP] shell check fixes
  • Completion fixes
  • [WIP] pdfjs single download
  • completion: let column widths scale according to content
  • Prefer putting the bookmark in the data directory
  • Add 'undo-across-windows' option
  • [WIP] Delayed tab loading
  • Per-domain javascript whitelist.
  • Autocommand (added the autocmd command)
  • [WIP] Feature/form filler
  • Implement netrc for webengine
  • Don't error out on unicode errors when reading the edit file
  • Fix :download-retry for directories that didn't exist
  • Add number ranges to download commands (fixes #2384)
  • Document chrome:// URLs (fixes #2292)
  • Add troubleshooting info for widevine to FAQ
  • Add a way to view source in editor
  • Add special cases of double quoted variables
  • Display exception type in configfiles
  • Scheduled weekly dependency update for week 05
  • Fix going back twice on lazy loading a tab
  • Delete QWebEngineDownloadItem objects when wrapper object is deleted
  • Add a new --no-last flag to :tab-focus
  • make win_ids start at 1 instead of 0
  • fix spawn race condition when using --output option
  • Use the instance attribute instead of querying the registry
  • Handle bindings with leading :
  • Add prompt-yank command
  • add netrc support for webengine. resolves #2785.
  • Flatpak
  • Save/Restore Tab input mode
  • Add feature to pastebin version string
  • Greasemonkey @require support
  • Moved cycle-inputs.js to scripts/
  • Add tabs list page
  • Change Raise Window behaviour
  • Add settings to clear focus when convenient
  • Editor triggers update on every save.
  • Make statusbar widgets configurable [WIP]
  • Userscripts, suggest command, winid env
  • Add support for hinting elements from within same-origin frames
  • Don't crash first completion update with min_chars.
  • Clear old search results on webkit
  • Add --pygment argument to view-source
  • Resolve empty completion.timestamp_format crash.
  • WIP: Key handling refactoring
  • Preserve a backup if editor callback fails.
  • [WIP] build help files from sphinx rst
  • Refactor TabbedBrowser from inheritance to composition
  • add basic completion to file dialog
  • Add Option url.open_base_url
  • Tab input mode
  • Added support for restarting the tab on abnormal renderer exit
  • Add userscript to open 1Password Mini (mac)
  • Fix: restrict output of `task` to one line (closes #3726)
  • Improve install instructions with wget commands
  • Filter installed dictionaries using a regex to ensure correct name
  • Add a tabs.min_width setting
  • Add support for scrolling in same origin frames
  • Send broken keychains in passthrough modes to browser
  • Add option to only show favicons for pinned tabs
qutebrowser questions on Stackoverflow (View All Questions)
  • How to enable HTML5 videos in qutebrowser?
qutebrowser list of languages used
qutebrowser latest release notes
v1.2.1 v1.2.1


  • qutebrowser now starts properly when the PyQt5 QOpenGLFunctions package wasn't found.
  • The keybinding cheatsheet on the quickstart page is now loaded from a local qute:// URL again.
  • With tox -e mkvenv-pypi, PyQt 5.10.0 is used again instead of Qt 5.10.1, because of an issue with Qt 5.10.1 which causes qutebrowser to fail to start (Could not find QtWebEngineProcess).
  • Unbinding keys which were bound in older qutebrowser versions now doesn't crash anymore.
  • Fixed a crash when reloading a page which wasn't fully loaded with v1.2.0
  • Keys on the numeric keypad now fall back to the same bindings without Num+ if no Num+ binding was found.
  • Fixed hinting on some pages with Qt < 5.10.
  • Titles are now displayed correctly again for tabs which are cloned or loaded from sessions.
  • Shortcuts now correctly use Ctrl instead of Command on macOS again.
v1.2.0 v1.2.0


  • Initial implementation of per-domain settings:
    • :set and :config-cycle now have a -u/--pattern argument taking a URL match pattern for supported settings.
    • config.set in now takes a third argument which is the pattern.
    • New with config.pattern('...') as p: context manager for to use the shorthand syntax with a pattern.
    • New tsh keybinding to toggle scripts for the current host. With a capital S, the toggle is saved. With a capital H, subdomains are included. With u instead of h, the exact current URL is used.
    • New tph keybinding to toggle plugins, with the same additional binding described above.
  • New QtWebEngine features:
    • Caret/visual mode
    • Authentication via ~/.netrc
    • Retrying downloads with Qt 5.10 or newer
    • Hinting and other features inside same-origin frames
  • New flags for existing commands:
    • :session-load has a new --delete flag which deletes the session after loading it.
    • New --no-last flag for :tab-focus to not focus the last tab when focusing the currently focused one.
    • New --edit flag for :view-source to open the source in an external editor.
    • New --select flag for :follow-hint which acts like the given string was entered but doesn't necessary follow the hint.
  • New special pages:
    • qute://bindings (opened via :bind) which shows all keybindings.
    • qute://tabs (opened via :buffer) which lists all tabs.
  • New settings:
    • statusbar.widgets to configure which widgets should be shown in which order in the statusbar.
    • tabs.mode_on_change which replaces tabs.persist_mode_on_change. It can now be set to restore which remembers input modes (input/passthrough) per tab.
    • input.insert_mode.auto_enter which makes it possible to disable entering insert mode automatically when an editable element was clicked. Together with input.forward_unbound_keys, this should allow for emacs-like modeless keybindings.
  • New :prompt-yank command (bound to Alt-y by default) to yank URLs referenced in prompts.
  • The hostblock_blame script which was removed in v1.0 was updated for the new config and re-added.
  • New cycle-inputs.js script in scripts/ which can be used with :jseval -f to cycle through inputs.


  • Complete refactoring of key input handling, with various effects:
    • emacs-like keychains such as <Ctrl-X><Ctrl-C> can now be bound.
    • Key chains can now be bound in any mode (this allows binding unused keys in hint mode).
    • Yes/no prompts don't use keybindings from the prompt section anymore, they have their own yesno section instead.
    • Trying to bind invalid keys now shows an error.
    • The bindings.default setting can now only be set in a, and existing values in autoconfig.yml are ignored.
  • Improvements for GreaseMonkey support:
    • @include and @exclude now support regex matches. With QtWebEngine and Qt 5.8 and newer, Qt handles the matching, but similar functionality will be added in Qt 5.11.
    • Support for @requires
    • Support for the GreaseMonkey 4.0 API
  • The sqlite history now uses write-ahead logging which should be a performance and stability improvement.
  • When an editor is spawned with :open-editor and :config-edit, the changes are now applied as soon as the file is saved in the editor.
  • The script now only imports URL schemes qutebrowser can handle.
  • Deleting a prefix (:, / or ?) via backspace now leaves command mode.
  • Angular 1 elements and <summary>/<details> now get hints assigned.
  • :tab-only with pinned tabs now still closes unpinned tabs.
  • The url.incdec_segments option now also can take port as possible segment.
  • QtWebEngine: :view-source now uses Chromium's view-source: scheme.
  • Tabs now show their full title as tooltip.
  • When there are multiple unknown keys in a autoconfig.yml, they now all get reported in one error.
  • More performance improvements when opening/closing many tabs.
  • The :version page now has a button to pastebin the information.
  • Replacements like {url} can now be escaped as {{url}}.


  • QtWebEngine bugfixes:
    • Improved fullscreen handling with Qt 5.10.
    • Hinting and scrolling now works properly on special view-source: pages.
    • Scroll positions are now restored correctly from sessions.
    • :follow-selected should now work in more cases with Qt > 5.10.
    • Incremental search now flickers less and doesn't move to the second result when pressing Enter.
    • Keys like Ctrl-V or Shift-Insert are now correctly handled/filtered with Qt 5.10.
    • Fixed hangs/segfaults on exit with Qt 5.10.1.
    • Fixed favicons sometimes getting cleared with Qt 5.10.
    • Qt download objects are now cleaned up properly when a download is removed.
    • JavaScript messages are now not double-HTML escaped anymore on Qt < 5.11
  • QtWebKit bugfixes:
    • Fixed GreaseMonkey-related crashes.
    • :view-source now displays a valid URL.
  • URLs containing ampersands and other special chars are now shown correctly when filtering them in the completion.
  • :bookmark-add "" foo can now be used to save the current URL with a custom title.
  • :spawn -o now waits until the process has finished before trying to show the output. Previously, it incorrectly showed the previous output immediately.
  • Suspended pages now should always load the correct page when being un-suspended.
  • Exception types are now shown properly with :config-source and :config-edit.
  • When using :bookmark-add --toggle, bookmarks are now saved properly.
  • Crash when opening an invalid URL from an application on macOS.
  • Crash with an empty completion.timestamp_format.
  • Crash when completion.min_chars is set in some cases.
  • HTML/JS resource files are now read into RAM on start to avoid crashes when changing qutebrowser versions while it's open.
  • Setting bindings.key_mappings to an empty value is now allowed.
  • Bindings to an empty commands are now ignored rather than crashing.


  • QUTE_SELECTED_HTML is now not set for userscripts anymore except when called via hints.
  • The qutebrowser_viewsource userscript has been removed as :view-source --edit can now be used.
  • The tabs.persist_mode_on_change setting has been removed and replaced by tabs.mode_on_change.
v1.1.2 v1.1.2


  • Windows/macOS releases now bundle Qt 5.10.1 which includes security fixes from Chromium up to version 64.0.3282.140.


  • QtWebEngine: Crash with Qt 5.10.1 when using :undo on some tabs.
  • Compatibility with Python 3.7
Other projects in Python