Need help with webview?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Global Rank
Topics of expertise
München, Germany
9.0K Stars 701 Forks MIT License 359 Commits 269 Opened issues


Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows)

Services available


Need anything else?

Contributors list


Join the chat at Build Status GoDoc Go Report Card

A tiny cross-platform webview library for C/C++/Golang to build modern cross-platform GUIs. Also, there are Rust bindings, Python bindings, Nim bindings, Haskell, C# bindings and Java bindings available.

The goal of the project is to create a common HTML5 UI abstraction layer for the most widely used platforms.

It supports two-way JavaScript bindings (to call JavaScript from C/C++/Go and to call C/C++/Go from JavaScript).

It uses Cocoa/WebKit on macOS, gtk-webkit2 on Linux and Edge on Windows 10.

Webview for Go developers

If you are interested in writing Webview apps in C/C++, skip to the next section.

Getting started

Install Webview library with

go get
$ go get

Import the package and start using it:

package main

import ""

func main() { debug := true w := webview.New(debug) defer w.Destroy() w.SetTitle("Minimal webview example") w.SetSize(800, 600, webview.HintNone) w.Navigate("") w.Run() }

To build the app use the following commands:

# Linux
$ go build -o webview-example && ./webview-example

MacOS uses app bundles for GUI apps

$ mkdir -p $ go build -o $ open # Or click on the app in Finder

Windows requires special linker flags for GUI apps.

It's also recommended to use TDM-GCC-64 compiler for CGo.

$ go build -ldflags="-H windowsgui" -o webview-example.exe

For more details see godoc.

Distributing webview apps

On Linux you get a standalone executable. It will depend on GTK3 and GtkWebkit2, so if you distribute your app in DEB or RPM format include those dependencies. An application icon can be specified by providing a


On MacOS you are likely to ship an app bundle. Make the following directory structure and just zip it:
└── Contents
    ├── Info.plist
    ├── MacOS
    |   └── example
    └── Resources
        └── example.icns


is a property list file and
is a special icon format. You may convert PNG to icns online.

On Windows you probably would like to have a custom icon for your executable. It can be done by providing a resource file, compiling it and linking with it. Typically,

utility is used to compile resources. Also, on Windows,
must be placed into the same directory with your app executable.

Also, if you want to cross-compile your webview app - use xgo.

Migrating from v0.1.1 to v0.10.0

  1. webview.Open()
    has been removed. Use other webview APIs to create a window, open a link and run main UI loop.
  2. webview.Debug()
    have been removed. Use your favorite logging library to debug webview apps.
  3. webview.Settings
    struct has been removed. Title, URL and size are controlled via other API setters and can be updated at any time, not only when webview is created.
  4. Webview.Loop()
    has been removed. Use
  5. WebView.Run()
    stayed the same.
  6. WebView.Exit()
    has been renamed to
  7. WebView.SetColor()
    have been removed. Use
    to get native window handle and probably write some Cgo code to adjust native window to your taste.
  8. webview.Dialog
    has been removed. But it is likely to be brought back as a standalone module.
  9. WebView.Eval()
    remained the same.
  10. WebView.InjectCSS()
    has been removed. Use eval to inject style tag with CSS inside.
  11. WebView.Bind()
    kept the name, but changed the semantics. Only functions can be bound. Not the structs, like in Lorca.

Webview for C/C++ developers

Download webview.h and include it in your C/C++ code:


#include "webview.h"
#ifdef WIN32
int WINAPI WinMain(HINSTANCE hInt, HINSTANCE hPrevInst, LPSTR lpCmdLine,
                   int nCmdShow) {
int main() {
  webview::webview w(true, nullptr);
  w.set_title("Minimal example");
  w.set_size(480, 320, WEBVIEW_HINT_NONE);
  return 0;

Build it:

# Linux
$ c++ `pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0` -o webview-example
# MacOS
$ c++ -std=c++11 -framework WebKit -o webview-example
# Windows (x64)
$ c++ -mwindows -L./dll/x64 -lwebview -lWebView2Loader -o webview-example.exe


// main .c
#include "webview.h"
#ifdef WIN32
int WINAPI WinMain(HINSTANCE hInt, HINSTANCE hPrevInst, LPSTR lpCmdLine,
                   int nCmdShow) {
int main() {
    webview_t w = webview_create(0, NULL);
    webview_set_title(w, "Webview Example");
    webview_set_size(w, 480, 320, WEBVIEW_HINT_NONE);
    webview_navigate(w, "");
    return 0;

Build it:

# Linux
$ g++ main.c `pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0` -o webview-example
# MacOS
$ g++ main.c -std=c++11 -framework WebKit -o webview-example
# Windows (x64)
$ g++ main.c -mwindows -L./dll/x64 -lwebview -lWebView2Loader -o webview-example.exe

On Windows it is possible to use webview library directly when compiling with cl.exe, but WebView2Loader.dll is still required. To use MinGW you may dynamically link prebuilt webview.dll (this approach is used in Cgo bindings).

Full C/C++ API is described at the top of the


Migrating from v0.1.1 to v0.10.0

  1. Use opaque
    type instead of
    struct webview
    . Size, title and URL are controlled via API setter functions. Invoke callback has been replaced with
    to make native function bindings inter-operate with JS.
  2. If you have been using simplified
    API to only open a single URL in a webview window - this function has been removed. You now have to create a new webview instance, configure and run it explicitly.
  3. webview_init()
    is replaced by
    which creates a new webview instance.
  4. webview_exit()
    has been replaced with more meaningful
  5. Main UI loop with
    inside has been replaced with
    runs infinitely until the webview window is closed.
  6. webview_terminate()
    remains the same.
  7. webview_dispatch()
    remains the same.
  8. webview_set_title()
    remains the same.
  9. webview_set_color()
    has been removed. Use
    and native window APIs to control colors, transparency and other native window properties. At some point these APIs might be brought back.
  10. webview_set_fullscreen()
    has been removed, see above.
  11. webview_dialog()
    has been removed. But I'd like to see it added back as a separate independent module or library.
  12. webview_eval()
    remains the same.
  13. webview_inject_css()
    has been removed. Use
    to create style tag manually.
  14. webview_debug()
    has been removed. Use whatever fits best to your programming language and environment to debug your GUI apps.


Execution on OpenBSD requires

mount(8) option. For Ubuntu Users run
sudo apt install webkit2gtk-4.0
(Try with webkit2gtk-4.0-dev if webkit2gtk-4.0 is not found) to install webkit2gtk-4.0 related items. FreeBSD is also supported, to install webkit2 run
pkg install webkit2-gtk3


Code is distributed under MIT license, feel free to use it in your proprietary projects as well.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.