You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Thomas Kerber b6ae310a3b Add '' gitignore. 6 years ago
adblock Minor correction to adblock code to work with symlinked directory. 6 years ago
cmd Add search engine hints mode (ase). 6 years ago
data Add UI toggle commands. 6 years ago
exten Clean up some memory leaks. 6 years ago
golem Merge branch 'rpc' 6 years ago
gtk Start creating quickmarks file, try make gtk calls a bit safer. 6 years ago
pdf.js@8614c17c1d Use git submodules for pdf.js 6 years ago
webkit Add basic search. 6 years ago
xdg Extract xdg stuff, move web extension. 6 years ago
.gitignore Add '' gitignore. 6 years ago
.gitmodules Add glue for jubatus-msgpack-rpc. 6 years ago
LICENSE Initial commit; Project goals and license. 6 years ago
Makefile Finish transition to msgpack-rpc. 6 years ago Make closure compiler opt-dep. 6 years ago Update TODO 6 years ago
main.go Switch go to msgpack-rpc. 6 years ago
signals_linux.go Prevent freezes from blocking exit signals. 6 years ago
socket_unix.go Fix bidirectional RPC calls to use two connections. 6 years ago

golem web browser

Current State

Go away. Nothing to see here. Yet.

go get / go generate

Golem does not follow go conventions that go generate is to be run by the author and generated code stored in the repository.

Reason for this is that platform the generated code includes a platform- dependant shared object file.

As golem is not a library, the fact that it doesn't directly function with go get is not a huge loss.

To install golem with the go command, instead execute:

go get -d
go generate .../golem
go install .../golem

go generate requires the following programs to execute:

  • go-bindata which can be obtained with go get
  • go-version (go get
  • node i.e. node.js
  • Google's closure compile is an optional dependency for minifying pdf.js. If the environment variable CLOSURE_COMPILER is set for go generate, the closure compiler will be used to produce a minified version of pdf.js instead.

node is not required is pdf.js in disabled entirely. This can be done by removing it as a target in the Makefile.


The name golem was chosen to remind people of what this browser should not be: Slow and cumbersome.

Design goals

  • A keyboard driven, minimalistic browser.
  • Powerful adblocking and noscript support.
    • Fully configurable.
    • Powerful whitelisting support.
      • In particular it should be possible to whitelist particular users on services such as youtube and twitch.
  • Written in go.
  • Capable of running multiple windows within one instance.
  • One process per tab.
  • Everything runs in it's own goroutine.
  • No crashes. All goroutines should fail gracefully.
  • In-browser pdf support.
  • Multi-profile support.
  • Vim-like keybindings.
  • Fully reconfigurable keybindings.
  • Public extensions API.
  • Must exit quickly and gracefully on SIGTERM.
  • Should exit cleanly on SIGKILL (in particular should not corrupt cookies).
  • Browser should always be responsive. The UI goroutine should not handle any meaningful computation.
  • Vertical and horizontal tab bar support
  • Option to limit to one tab per window.
  • Per-tab, per-window and global private browsing mode
    • Clear visual indicator
  • Restore pages option upon restarting browser.
  • Optional lazy tab loading

Choice of layout engine

The options I considered for the choice of layout engine were Gecko and Webkit. Having using webkit-based browsers much in the past, and having seen many bugs attributed to them in fact being webkit bugs I was originally inclined to use gecko.

Unfortunately gecko is (no longer) built for embedding into applications, and it has no stable API to do so. As a result a gecko-based browser would be very difficult to maintain.

I chose to use webkit instead, and to focus the energy on ensuring that webkit can crash at most one tab at a time.


  • DWB - This browser was the immediate inspiration of this project.
  • Vimperator - A firefox plugin with similar goals.
  • Vim - How keyboard control should be done.