QtWebKit based web browser

web, browser, qt, webkit, qtwebkit
pip install eilat-web-browser==1.5.5



Homebrew, Qt-Webkit based web browser, focused on keyboard navigation and privacy and security while browsing.



pip install eilat-web-browser after installing PyQt4.

A proxy cache (e.g. squid) is strongly recommended. The default install creates the file options.yaml inside the directory ~/.eilat containing blank entries for proxy's host and port after the first eilat startup; once a proxy is ready and running, please set host and port to enable proxy, then restart eilat.


  • Small and rather readable layer over WebKit
  • Keyboard navigation, minimal UI widgets
  • Reports every network request


  • No persistent disk cache, yet; external proxy works very well
  • Does not have a fully featured bookmarks management.
  • Has no means to make downloads. Copies the download URL to clipboard and leaves the actual download to external means.

All Key Bindings

Anywhere except the address bar

The reason being, creating a new tab when a popup is active is a delicate matter, and maybe a rare case, better to be avoided.

  • ^t add tab
    • ^T with javascript on


  • ^q close window


  • ^t add tab
    • ^y extracting the url from a redirector in the clipboard
    • ^T with javascript on
  • ^w close current tab


  • ^PgDown move to next tab
    • ^PgUp move to previous tab

Input emulation

  • ^j sends Return
  • ^h sends Backspace

On the web area

  • e copy the contents of the address bar to clipboard
  • g init a search in page text
  • ^l focus the address bar


  • u re-open last closed tab
  • y add tab, navigating to an url in the clipboard

DOM manipulation

  • ^m dump DOM to file
  • f unembed frames
  • F2 remove fixed elements
    • Shift F2 un-fix fixed elements

Web actions

  • F5, r reload page
  • Alt ← go back in history (this tab only)
    • Alt → go forward in history


  • hjkl move page
  • Shift hjklmove between links
  • Shift i forget currently focused link;et spatial navigation
  • Ctrl ↑ zoom in
    • Ctrl ↓ zoom out
  • m move to next tab
    • n move to previous tab

Input emulation

  • c sends left mouse click

Modal state manipulation

  • i next navigation will be on new tab
    • io on new tab, with javascript on
  • s next navigation request will be saved to clipboard; no actual navigation will occur


  • ^<space> toggle show/hide status bar
  • q toggle enable/disable javascript
  • Z toggle display of traffic
    • z toggle display of debug information

On the address bar

  • ^i next completion
    • ^p previous completion
  • <escape> focus the webkit

On the search frame

  • <escape> hide the search frame


Run eilat, that will be installed as a script and is probably on the path by now. This starts an empty browser. On the bottom is an address bar. Write a partial URL, as, for example, xkcd.com. Press Ctrl+j (Enter also works). The domain will be identified, the address completed, and the browser will navigate to http://xkcd.com.

Press Ctrl+Space. This enables the status bar. Hovering over a link makes the href appear in the bar. Press Ctrl+Space to disable the status bar again.

Press Ctrl+t. A new tab will appear. Select this: http://sidigital.co/ from wherever you're reading. Go back to the browser, press Escape (to ensure the web area is active) and press y. This will navigate to the address stored on the primary clipboard. The animation will not run yet: javascript is disabled. Press j to scroll the page down, k to scroll up. Press F2 to hide the fixed header. Shift+F2 will instead freeze the header in place and prevent it from following the scroll.

Press q. The address bar should have turned blue: javascript is enabled now, for this tab only. Press r or F5 to reload. The animation starts since scripting is active. You can even keep pressing q to pause and resume the animation.

Press Ctrl+t to create another new tab. Press m, n (with the web view active, instead of the address bar or search frame - press Escape first otherwise), or Ctrl+PgUp, Ctrl+PgDn to navigate between the tabs. All newly created tabs should have white background on the address bar, meaning that scripting is disabled there.

Go back to xkcd. Press g. A text entry should appear just over the address bar. Write p, e, r letter by letter to find the string "Permanent".

Instance isolation

Once a tab has opened its first URL it has a set instance, marked by a prefix that can be seen next to the address bar. If there's no prefix, the tab is a 'general' tab, that will respect the blacklist sqlite table contents, by default containing references to facebook, twitter and google. This means, a 'general' tab can't open any resources coming from any of those sites.

On the other side, a tab that first opened facebook, twitter or google URLS has the FB, TW or G prefix next to the address bar. That tab will only be able to open URLs from that source. The procedure to follow a link from e.g. facebook to a non-fb site is a bit convoluted due to facebook creating a redirect.

First, either save (yes... save) the link with right click menu + save (that will produce a transient message) or transient-navigate with Shift+hjlk and press s then ^j (or Return - just navigate after pressing s), and the link will be saved to the clipboard. But that will not be the real link - it will be a redirector.

To navigate to a new tab (therefore without an active instance yet) using that redirector stored on the clipboard, press Ctrl+y instead of y. That will extract the real URL without navigating to facebook first, and then navigate directly.

If using vim, edit source code with https://github.com/hynek/vim-python-pep8-indent/

Use pylint on all source .py files aiming for 100%; a reference pylintrc is provided.