GPU based Electron on a diet
Go to file
Chris b0ea673fef
Update React example (#56)
2022-10-05 21:19:36 -07:00
.github/workflows Feat workflow (#33) 2019-10-19 14:03:12 -05:00
examples/create-react-app Update React example (#56) 2022-10-05 21:19:36 -07:00
include Remove unecessary headers 2019-10-08 00:49:12 -05:00
ultralight Added conditional LDFLAGS to support windows x86 2019-10-16 23:20:48 -05:00
.gitignore Added support for null and undefined JS types 2019-10-08 12:05:55 -05:00
LICENSE Create LICENSE 2019-10-07 15:40:54 -05:00
README.md Update README.md 2019-10-16 23:40:35 -05:00
getting-started.md Update getting-started.md 2019-10-10 14:46:14 -05:00
go.mod Usability features 2019-10-07 19:29:22 -05:00
logo.svg readme 2019-10-04 18:54:37 -05:00
muon.go fix width/height being used in wrong order 2019-10-09 08:51:23 +01:00
muon_test.go Fixed cgo callbacks 2019-10-09 01:37:17 -05:00
ultralight.yml Bump to Ultralight 1.1 2019-10-07 14:04:16 -05:00

README.md

gnet

GitHub code size in bytes


Muon is a lightweight alternative to Electron written in Golang in about ~300 LoC, using Ultralight instead of Chromium. Ultralight is a cross-platform WebKit rewrite using the GPU to target embedded desktop applications that resulted in a fast, lightweight, and low-memory HTML UI solution that blends the power of Chromium with the small footprint of Native UI.

Features

  • Full JS to Go interop
  • GPU based rendering
  • Cross-platform
  • Hot-reloading
  • Superior disk size + memory & cpu usage

Comparison with a "Hello, World!" React App

Muon Electron
CPU 0.0% 1.2%
MEM 26.0 MB 201.7 MB
DISK 42 MB 136 MB

Example

From examples/create-react-app/main.go:

package main

import (
  "github.com/ImVexed/muon"

  "cra-go/webfiles"
  "net/http"
)

func main() {
  // Any static asset packer of your liking (ex. fileb0x)
  fileHandler := http.FileServer(webfiles.HTTP)

  cfg := &muon.Config{
    Title:      "Hello, World!",
    Height:     500,
    Width:      500,
    Titled:     true,
    Resizeable: true,
  }

  m := muon.New(cfg, fileHandler)

  // Expose our `add` function to the JS runtime
  m.Bind("add", add)

  // Show the Window and start the Runtime
  if err := m.Start(); err != nil {
    panic(err)
  }
}

// Muon automatically handles interop to and from the JS runtime
func add(a float64, b float64) float64 {
  return a + b
}

FAQ

Q: How are JS types translated to Go types?

  • JS: Boolean Go: bool
  • JS: Number Go: float64
  • JS: String Go: string
  • JS: Object Go: struct via JSON

Q: How do I setup Ultralight?

Q: Is there perfect Chrome or Firefox feature parity?

Q: How do I get rid of the Console on Windows?

  • Add -ldflags -H=windowsgui to either your go build or go run to get rid of the window.

Q: I get exit status 3221225781

  • Your program likely can't find the Ultralight libraries. Ensure they're either installed on the system, or, in the same folder as your program. Currently, Muon uses the 1.1 Ultralight pre-release that hasn't yet propagated to their main site and can only be downloaded from the Ultralight github repo.

Q: I get libWebCore.so: cannot open shared object file

  • If you're attempting to load the libraries out of the same directory as your program add -ldflags "-r ." to your go build to set rpath to the local directory for library resolution.

Q: I get symbol not found: ulCreateSettings

  • This likely means you're not using the 1.1 Ultralight pre-release which can be downloaded only from their GitHub Repo for now

Q: How do I compile for x86?

  • Currently, Ultralight only supports Windows for x86. Ensure you have a 32-bit gcc in your path, and ensure you have CGO_ENABLED=1 and GOARCH=386 environment variables set.

Licensing

While muon itself is MIT licensed, Ultralight is not.

Ultralight is free for non-commercial use, educational use, 
and also free for commercial use by small indie developers making
less than US$100,000 a year. You can find full terms in the SDK. 
Pricing plans for larger commercial projects will be announced later.

Their specific license terms can be found here.