GPU based Electron on a diet
Go to file
ImVexed ed7c05e2e8 Added conditional LDFLAGS to support windows x86 2019-10-16 23:20:48 -05:00
examples/create-react-app Example version bump & removed learn react blank target 2019-10-09 10:02:09 -05: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 fixed small errors 2019-10-09 16:40:14 +02:00
getting-started.md Create getting-started.md 2019-10-08 09:28:33 -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: I get exit status 3221225781 when I try to run my program

  • 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: How do I get rid of the Console window on Windows?

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

Q: How do I setup Ultralight?

Q: Is there perfect Chrome or Firefox feature parity?

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.