hotaru
LOW
maintainer ushineko
0 votes
scanned 2026-09-22 01:36:45.870812
Why flagged
Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.
Triggered rules
Low
Few votes, recently uploaded
zero_votes_recent
Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.
PKGBUILD
1
# Maintainer: NJ Verenini <nverenin@gmail.com>
2
#
3
# The AUR package, kept here so it is versioned with what it packages. The
4
# shape and the dependency argument are in docs/packaging.md; spec 007 is why
5
# each line below is the line it is.
6
#
7
# One PKGBUILD, two packages: `hotaru` is the CLI and the service, pure Go and
8
# installable on a headless box; `hotaru-gui` is the Fyne window, which needs
9
# the graphics stack. The split falls out of the architecture -- the window is
10
# a client -- and it keeps OpenGL off machines that only want lighting.
11
12
pkgbase=hotaru
13
pkgname=(hotaru hotaru-gui)
14
pkgver=0.1.1
15
pkgrel=1
16
pkgdesc='RGB lighting and AIO cooler control for Linux'
17
arch=('x86_64')
18
url='https://github.com/ushineko/hotaru'
19
license=('MIT')
20
makedepends=('go' 'libglvnd' 'libx11' 'libxcursor' 'libxrandr' 'libxinerama'
21
'libxi' 'libxxf86vm' 'libxkbcommon' 'wayland')
22
23
# The base's dependencies, which each package narrows. namcap wants a split
24
# PKGBUILD to declare at the top what its packages depend on, and it is right
25
# to: this is the answer to "what does installing hotaru pull in", and reading
26
# it should not mean reading two shell functions.
27
depends=('glibc' 'openrgb')
28
source=("$pkgbase-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
29
sha256sums=('4316768b37b57410611b6c890344ed6383644aceaf528ad643b1498e086342b9')
30
31
_module='github.com/ushineko/hotaru'
32
33
prepare() {
34
cd "$pkgbase-$pkgver"
35
go mod download
36
}
37
38
build() {
39
cd "$pkgbase-$pkgver"
40
41
export CGO_CPPFLAGS="${CPPFLAGS}" CGO_CFLAGS="${CFLAGS}"
42
export CGO_CXXFLAGS="${CXXFLAGS}" CGO_LDFLAGS="${LDFLAGS}"
43
export GOFLAGS='-buildmode=pie -trimpath -mod=readonly -modcacherw'
44
45
local _ldflags="-linkmode=external -X ${_module}/internal/version.Version=${pkgver}"
46
47
go build -ldflags "$_ldflags" -o build/hotaru ./cmd/hotaru
48
49
# The window, built without Fyne's per-refresh thread check. It calls
50
# runtime.Stack on every canvas refresh to find out which goroutine it is
51
# on, which a CPU profile put at 82% of samples during a window drag. The
52
# tag is safe here because internal/gui/thread_test.go fails the build if
53
# anything inside a Perform callback touches the interface unwrapped, and
54
# check() runs it.
55
go build -tags migrated_fynedo -ldflags "$_ldflags" -o build/hotaru-gui ./cmd/hotaru-gui
56
}
57
58
check() {
59
cd "$pkgbase-$pkgver"
60
# No hardware, no OpenRGB, no display and no root. That is a packaging
61
# property as much as a testing one.
62
go test ./...
63
}
64
65
package_hotaru() {
66
# namcap reports openrgb as possibly unneeded, because nothing in the
67
# binary links against it. Nothing would: it is a daemon hotaru speaks to
68
# over a socket, and it is a hard dependency on purpose -- see
69
# docs/packaging.md, "The rule that decides everything else".
70
optdepends=('nvidia-utils: GPU temperature on the dashboard'
71
'hotaru-gui: the desktop window')
72
73
cd "$pkgbase-$pkgver"
74
75
install -Dm755 build/hotaru "$pkgdir/usr/bin/hotaru"
76
77
# Not enabled, per Arch policy. `systemctl --user enable --now hotaru`, and
78
# `loginctl enable-linger $USER` for lighting at boot rather than at login;
79
# `hotaru light health` names whichever one is missing.
80
install -Dm644 packaging/hotaru.service \
81
"$pkgdir/usr/lib/systemd/user/hotaru.service"
82
83
# Without this the service sees the cooler and cannot open it. See
84
# packaging/60-hotaru.rules.
85
install -Dm644 packaging/60-hotaru.rules \
86
"$pkgdir/usr/lib/udev/rules.d/60-hotaru.rules"
87
88
# Examples, not configuration: hotaru ships no rules at all and drives every
89
# device OpenRGB reports until it is told otherwise.
90
install -Dm644 examples/hotaru.yml \
91
"$pkgdir/usr/share/doc/$pkgname/hotaru.yml.example"
92
install -Dm644 packaging/openrgb-enumeration.conf.example \
93
"$pkgdir/usr/share/doc/$pkgname/openrgb-enumeration.conf.example"
94
95
install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md"
96
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
97
}
98
99
package_hotaru-gui() {
100
pkgdesc='RGB lighting and AIO cooler control for Linux (desktop window)'
101
# The graphics stack is dlopened by GLFW rather than linked, so namcap
102
# reports most of this as possibly unneeded. It is needed: a window that
103
# cannot open libGL at runtime does not start. hicolor-icon-theme owns the
104
# directory this package's icon goes in.
105
depends=('hotaru' 'glibc' 'hicolor-icon-theme' 'libglvnd' 'libx11'
106
'libxcursor' 'libxrandr' 'libxinerama' 'libxi' 'libxxf86vm'
107
'libxkbcommon' 'wayland')
108
109
cd "$pkgbase-$pkgver"
110
111
install -Dm755 build/hotaru-gui "$pkgdir/usr/bin/hotaru-gui"
112
113
# The entry is named for the Fyne app ID and carries StartupWMClass,
114
# because KDE on Wayland resolves the titlebar icon by matching the app_id
115
# to a desktop file of that name and the task manager matches the class.
116
# Two out of three silently yields a generic icon.
117
install -Dm644 packaging/io.github.ushineko.hotaru.desktop \
118
"$pkgdir/usr/share/applications/io.github.ushineko.hotaru.desktop"
119
install -Dm644 packaging/hotaru.svg \
120
"$pkgdir/usr/share/icons/hicolor/scalable/apps/hotaru.svg"
121
122
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
123
}
124
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-22 01:36:45 | Low | 1 |
| 2026-09-22 00:15:14 | Clean | 2 |
| 2026-09-21 23:36:21 | Low | 1 |