https://github.com/energye/systray
Support for Windows, Linux, and MacOSX system trays
https://github.com/energye/systray
linux linux-systray macosx macosx-systray systray windows windows-systray
Last synced: about 2 months ago
JSON representation
Support for Windows, Linux, and MacOSX system trays
- Host: GitHub
- URL: https://github.com/energye/systray
- Owner: energye
- License: apache-2.0
- Created: 2023-01-16T23:49:55.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2025-07-30T14:01:32.000Z (8 months ago)
- Last Synced: 2025-07-30T16:42:52.637Z (8 months ago)
- Topics: linux, linux-systray, macosx, macosx-systray, systray, windows, windows-systray
- Language: Go
- Homepage: https://github.com/energye/systray
- Size: 60.5 KB
- Stars: 130
- Watchers: 4
- Forks: 24
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Systray
systray is a cross-platform Go library to place an icon and menu in the notification area.
This repository is a fork of [getlantern/systray](https://github.com/getlantern/systray)
removing the GTK dependency and support for legacy linux system tray.
## Features
* Supported on Windows, macOS, Linux and many BSD systems
* Menu items can be checked and/or disabled
* Methods may be called from any Goroutine
* tray icon supports mouse click, double click, and right click
## API
```go
package main
import "github.com/energye/systray"
import "github.com/energye/systray/icon"
func main() {
systray.Run(onReady, onExit)
}
func onReady() {
systray.SetIcon(icon.Data)
systray.SetTitle("Awesome App")
systray.SetTooltip("Pretty awesome超级棒")
systray.SetOnClick(func() {
fmt.Println("SetOnClick")
})
systray.SetOnDClick(func() {
fmt.Println("SetOnDClick")
})
systray.SetOnRClick(func(menu systray.IMenu) {
menu.ShowMenu()
fmt.Println("SetOnRClick")
})
mQuit := systray.AddMenuItem("Quit", "Quit the whole app")
// Sets the icon of a menu item.
mQuit.SetIcon(icon.Data)
}
func onExit() {
// clean up here
}
```
### Run in another toolkit
Most graphical toolkits will grab the main loop so the `Run` code above is not possible.
For this reason there is another entry point `RunWithExternalLoop`.
This function of the library returns a start and end function that should be called
when the application has started and will end, to loop in appropriate features.
Note: this package requires cgo, so make sure you set `CGO_ENABLED=1` before building.
## Try the example app!
Have go v1.12+ or higher installed? Here's an example to get started on macOS or Linux:
```sh
git clone https://github.com/energye/systray
cd systray/example
go run .
```
On Windows, you should follow the instructions above, but use the followign run command:
```
go run -ldflags "-H=windowsgui" .
```
Now look for *Awesome App* in your menu bar!

## Platform notes
### Linux/BSD
This implementation uses DBus to communicate through the SystemNotifier/AppIndicator spec, older tray implementations may not load the icon.
If you are running an older desktop environment, or system tray provider, you may require a proxy app which can convert the new DBus calls to the old format.
The recommended tool for Gnome based trays is [snixembed](https://git.sr.ht/~steef/snixembed), others are available.
Search for "StatusNotifierItems XEmbedded" in your package manager.
### Windows
```sh
go build -ldflags -H=windowsgui
```
### macOS
On macOS, you will need to create an application bundle to wrap the binary; simply use add folders with the following minimal structure and assets:
```
SystrayApp.app/
Contents/
Info.plist
MacOS/
go-executable
Resources/
SystrayApp.icns
```
If bundling manually, you may want to add one or both of the following to your Info.plist:
```xml
NSHighResolutionCapable
True
LSUIElement
1
```
Consult the [Official Apple Documentation here](https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1).
## Credits
- https://github.com/getlantern/systray
- https://github.com/xilp/systray
- https://github.com/cratonica/trayhost