8 Commits
Author SHA1 Message Date
oxpoe 0353b71223 ci: pin URL rilis publik + ganti setup-uv (API GitHub kena rate limit)
release / appimage (push) Successful in 1m40s
2026-10-15 13:08:10 +07:00
oxpoe 7f01abad25 release: v1.3.5 (zsync update URL kini domain publik)
release / appimage (push) Failing after 32s
2026-10-15 13:01:48 +07:00
oxpoe 4886cb570d docs: banner mirror sebutkan rilis/unduhan di Gitea 2026-10-14 22:34:23 +07:00
oxpoe 66894ecdca ci: rilis via API Gitea (ganti action-gh-release) + fix deps build
release / appimage (push) Successful in 1m7s
2026-10-14 21:45:32 +07:00
oxpoe d9b64a5ab5 chore: bump versi 1.3.4 (rebrand ke Gitea)
release / appimage (push) Failing after 1m24s
2026-10-14 21:40:55 +07:00
oxpoe 3f73b97b39 rebrand: ganti sisa teks 'GitHub' -> 'Gitea' (UI, komentar, dokumen) 2026-10-14 21:09:05 +07:00
oxpoe 323e270c51 rebrand: arahkan tautan, badge, label UI & cek-update ke Gitea (bukan GitHub) 2026-10-14 21:08:04 +07:00
oxpoe 3c06d802a9 docs: banner mirror (repo asli di Gitea) 2026-10-14 12:30:39 +07:00
5 changed files with 60 additions and 54 deletions

No files matched your search

+30 -27
View File
@@ -1,6 +1,6 @@
name: release name: release
# Build the GAMEMAX LCD AppImage from source and attach it to a GitHub release. # Build the GAMEMAX LCD AppImage from source and attach it to a Gitea release.
# Trigger: push a tag like v1.0.0 (or run manually from the Actions tab). # Trigger: push a tag like v1.0.0 (or run manually from the Actions tab).
on: on:
@@ -11,6 +11,11 @@ on:
permissions: permissions:
contents: write contents: write
env:
# github.server_url mengikuti alamat saat runner didaftarkan dan bisa jadi IP internal,
# jadi URL yang disematkan ke dalam AppImage ditulis eksplisit di sini.
RELEASE_URL: https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/releases/download
jobs: jobs:
appimage: appimage:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -21,15 +26,16 @@ jobs:
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y --no-install-recommends \ sudo apt-get install -y --no-install-recommends \
libgl1 libegl1 libxkbcommon0 libdbus-1-3 libfuse2 fuse zsync libgl1 libegl1 libxkbcommon0 libdbus-1-3 libfuse2 fuse zsync libpython3.12
- name: Set up uv - name: Set up uv
uses: astral-sh/setup-uv@v5 # installers astral, bukan setup-uv: setup-v5 menembak API GitHub dan kena rate limit
run: curl -LsSf https://astral.sh/uv/install.sh | env INSTALLER_PREFIX=/usr/local sh
- name: Build AppImage - name: Build AppImage
env: env:
APPIMAGE_EXTRACT_AND_RUN: "1" APPIMAGE_EXTRACT_AND_RUN: "1"
UPDATE_INFO_URL: https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/GAMEMAX-LCD-x86_64.AppImage.zsync UPDATE_INFO_URL: ${{ env.RELEASE_URL }}/${{ github.ref_name }}/GAMEMAX-LCD-x86_64.AppImage.zsync
run: bash packaging/build_appimage.sh run: bash packaging/build_appimage.sh
- name: Smoke test the bundle (no display) - name: Smoke test the bundle (no display)
@@ -43,37 +49,34 @@ jobs:
run: | run: |
cd dist cd dist
sha256sum GAMEMAX-LCD-x86_64.AppImage > GAMEMAX-LCD-x86_64.AppImage.sha256 sha256sum GAMEMAX-LCD-x86_64.AppImage > GAMEMAX-LCD-x86_64.AppImage.sha256
zsyncmake -u "https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/GAMEMAX-LCD-x86_64.AppImage" \ zsyncmake -u "${{ env.RELEASE_URL }}/${{ github.ref_name }}/GAMEMAX-LCD-x86_64.AppImage" \
-o GAMEMAX-LCD-x86_64.AppImage.zsync GAMEMAX-LCD-x86_64.AppImage -o GAMEMAX-LCD-x86_64.AppImage.zsync GAMEMAX-LCD-x86_64.AppImage
cat GAMEMAX-LCD-x86_64.AppImage.sha256 cat GAMEMAX-LCD-x86_64.AppImage.sha256
ls -l ls -l
- name: Publish release - name: Publish release (Gitea API)
uses: softprops/action-gh-release@v2 env:
with: TOKEN: ${{ github.token }}
name: GAMEMAX LCD ${{ github.ref_name }} run: |
generate_release_notes: true API="${GITHUB_API_URL:-${GITHUB_SERVER_URL}/api/v1}"
body: | TAG="${GITHUB_REF_NAME}"
Linux bridge + tray app for the LCD panel of GAMEMAX IceBurg Digital AIO cat > /tmp/body.md <<'EOF'
coolers. Built automatically from `${{ github.sha }}`. Linux bridge + tray app for the LCD panel of GAMEMAX IceBurg Digital AIO coolers.
**Download** `GAMEMAX-LCD-x86_64.AppImage`, then: **Download** `GAMEMAX-LCD-x86_64.AppImage`, then:
```bash ```bash
chmod +x GAMEMAX-LCD-x86_64.AppImage chmod +x GAMEMAX-LCD-x86_64.AppImage
./GAMEMAX-LCD-x86_64.AppImage # tray + window ./GAMEMAX-LCD-x86_64.AppImage
./GAMEMAX-LCD-x86_64.AppImage --selftest # verify the bundle starts
``` ```
Device access still needs the udev rule once: Verify with the published SHA-256, or use AppImageUpdate with the `.zsync` asset.
`sudo cp packaging/70-gamemax.rules /etc/udev/rules.d/ && sudo udevadm control --reload` Independent project, not affiliated with the vendor.
EOF
**Integrity:** verify the download with the published SHA-256, or use python3 -c 'import json,sys;print(json.dumps({"tag_name":sys.argv[1],"name":"GAMEMAX LCD "+sys.argv[1],"body":open(sys.argv[2]).read()}))' "$TAG" /tmp/body.md > /tmp/rel.json
`appimageupdatetool`/AppImageUpdate with the `.zsync` asset for delta updates. RID=$(curl -sf -X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" "$API/repos/$GITHUB_REPOSITORY/releases" --data @/tmp/rel.json | python3 -c 'import json,sys;print(json.load(sys.stdin)["id"])')
The built-in updater (v1.2.3+) also verifies that checksum before replacing itself. echo "release id=$RID"
for f in dist/GAMEMAX-LCD-x86_64.AppImage dist/GAMEMAX-LCD-x86_64.AppImage.sha256 dist/GAMEMAX-LCD-x86_64.AppImage.zsync; do
Independent project, not affiliated with the vendor — see DISCLAIMER.md. [ -f "$f" ] || continue
files: | curl -sf -X POST -H "Authorization: token $TOKEN" -F "attachment=@$f" "$API/repos/$GITHUB_REPOSITORY/releases/$RID/assets?name=$(basename "$f")" -o /dev/null
dist/GAMEMAX-LCD-x86_64.AppImage done
dist/GAMEMAX-LCD-x86_64.AppImage.sha256
dist/GAMEMAX-LCD-x86_64.AppImage.zsync
+9 -7
View File
@@ -1,3 +1,5 @@
> 🪞 **Mirror.** Repo asli, pengembangan & **rilis/unduhan** ada di **Gitea**: https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/releases · GitHub hanya cermin kode.
# GAMEMAX LCD — Linux bridge & tray app # GAMEMAX LCD — Linux bridge & tray app
Drive the LCD panel of a GAMEMAX **IceBurg Digital** AIO cooler from Linux: a small Drive the LCD panel of a GAMEMAX **IceBurg Digital** AIO cooler from Linux: a small
@@ -7,8 +9,8 @@ Reverse engineered independently from the Windows vendor software
(`PcInfoMonitorPro.exe` / "IceBurg Digital Software"); the protocol notes are in (`PcInfoMonitorPro.exe` / "IceBurg Digital Software"); the protocol notes are in
[`docs/reverse-engineering.md`](docs/reverse-engineering.md) (Indonesian). [`docs/reverse-engineering.md`](docs/reverse-engineering.md) (Indonesian).
[![Release](https://img.shields.io/github/v/release/oxpoe/Gamemax-linux-apps?color=def750&label=release)](https://github.com/oxpoe/Gamemax-linux-apps/releases) [![Release](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgitea.oxpoe.qzz.io%2Fapi%2Fv1%2Frepos%2Foxpoe%2FGamemax-linux-apps%2Freleases%2Flatest&query=%24.tag_name&label=release&color=def750&logo=gitea)](https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/releases)
[![Release build](https://github.com/oxpoe/Gamemax-linux-apps/actions/workflows/release.yml/badge.svg)](https://github.com/oxpoe/Gamemax-linux-apps/actions/workflows/release.yml) [![Release build](https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/actions/workflows/release.yml/badge.svg)](https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/actions/workflows/release.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-def750)](LICENSE) [![License: MIT](https://img.shields.io/badge/license-MIT-def750)](LICENSE)
[![Platform: Linux](https://img.shields.io/badge/platform-Linux-def750)](#compatibility) [![Platform: Linux](https://img.shields.io/badge/platform-Linux-def750)](#compatibility)
[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-def750)](src/gamemax_report.py) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-def750)](src/gamemax_report.py)
@@ -108,8 +110,8 @@ temperature source (Tctl vs Tccd).
- **Plug and play**: the service waits for the device, streams while present and keeps - **Plug and play**: the service waits for the device, streams while present and keeps
waiting through unplug/replug; a udev rule grants access to the logged-in user waiting through unplug/replug; a udev rule grants access to the logged-in user
- **Single instance**: launching the app again just raises the running window - **Single instance**: launching the app again just raises the running window
- **Self-update from GitHub Releases** (check + one-click update) - **Self-update from Gitea Releases** (check + one-click update)
- **Donate / GitHub buttons** in the app (window and tray menu) - **Donate / Gitea buttons** in the app (window and tray menu)
- **AppImage build** script (`packaging/build_appimage.sh`, PySide6 bundled) - **AppImage build** script (`packaging/build_appimage.sh`, PySide6 bundled)
The GUI labels are in Indonesian. The app itself is named **IceBurg LCD** (no vendor brand in The GUI labels are in Indonesian. The app itself is named **IceBurg LCD** (no vendor brand in
@@ -131,7 +133,7 @@ One command (downloads the latest release, verifies its SHA-256, installs the ap
systemd user unit, the menu entry and the udev rule): systemd user unit, the menu entry and the udev rule):
```bash ```bash
curl -fsSL https://raw.githubusercontent.com/oxpoe/Gamemax-linux-apps/main/install.sh | bash curl -fsSL https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/raw/branch/main/install.sh | bash
# uninstall: bash install.sh --uninstall (add --remove-data to drop settings too) # uninstall: bash install.sh --uninstall (add --remove-data to drop settings too)
``` ```
@@ -225,10 +227,10 @@ assets/ previews and icon
## Updates ## Updates
The app keeps itself current from GitHub Releases: The app keeps itself current from Gitea Releases:
- On start (when running from an AppImage) and from the **Periksa pembaruan** button or the - On start (when running from an AppImage) and from the **Periksa pembaruan** button or the
tray menu, it asks the GitHub API for the latest release and compares it with its version. tray menu, it asks the Gitea API for the latest release and compares it with its version.
- When a newer release exists, a **Perbarui ke vX.Y.Z** button appears. One click downloads - When a newer release exists, a **Perbarui ke vX.Y.Z** button appears. One click downloads
the release asset, replaces the running AppImage atomically, refreshes the sender from the the release asset, replaces the running AppImage atomically, refreshes the sender from the
new bundle and restarts the service. Restart the app to use the new version. new bundle and restarts the service. Restart the app to use the new version.
+1 -1
View File
@@ -11,4 +11,4 @@ This is a small local tool. The relevant surface:
If you find a problem — for example a way to make the helper scripts run something else, If you find a problem — for example a way to make the helper scripts run something else,
or a path that writes outside the documented locations — please open an issue (or a or a path that writes outside the documented locations — please open an issue (or a
private security advisory on GitHub). Do not test on hardware you do not own. private security advisory on Gitea). Do not test on hardware you do not own.
+6 -5
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# GAMEMAX LCD — pemasangan / pelepasan satu perintah. # GAMEMAX LCD — pemasangan / pelepasan satu perintah.
# #
# curl -fsSL https://raw.githubusercontent.com/oxpoe/Gamemax-linux-apps/main/install.sh | bash # curl -fsSL https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps/raw/branch/main/install.sh | bash
# #
# Opsi: # Opsi:
# --uninstall lepaskan pemasangan (layanan, aplikasi, config, ikon, entri menu) # --uninstall lepaskan pemasangan (layanan, aplikasi, config, ikon, entri menu)
@@ -15,7 +15,8 @@ set -euo pipefail
REPO="oxpoe/Gamemax-linux-apps" REPO="oxpoe/Gamemax-linux-apps"
ASSET="GAMEMAX-LCD-x86_64.AppImage" ASSET="GAMEMAX-LCD-x86_64.AppImage"
RAW="https://raw.githubusercontent.com/$REPO/main" INSTANCE="https://gitea.oxpoe.qzz.io"
RAW="$INSTANCE/$REPO/raw/branch/main"
OPT_DIR="$HOME/.local/opt/gamemax-lcd" OPT_DIR="$HOME/.local/opt/gamemax-lcd"
APP="$OPT_DIR/GAMEMAX-LCD.AppImage" APP="$OPT_DIR/GAMEMAX-LCD.AppImage"
@@ -76,10 +77,10 @@ need sha256sum
command -v systemctl >/dev/null 2>&1 || die "systemd (systemctl) dibutuhkan untuk layanan" command -v systemctl >/dev/null 2>&1 || die "systemd (systemctl) dibutuhkan untuk layanan"
if [ "$VERSION" = "latest" ]; then if [ "$VERSION" = "latest" ]; then
BASE="https://github.com/$REPO/releases/latest/download" VERSION="$(curl -fsSL "$INSTANCE/api/v1/repos/$REPO/releases/latest" | sed -n 's/.*"tag_name":"\([^"]*\)".*/\1/p')"
else [ -n "$VERSION" ] || die "gagal menentukan rilis terbaru di Gitea"
BASE="https://github.com/$REPO/releases/download/$VERSION"
fi fi
BASE="$INSTANCE/$REPO/releases/download/$VERSION"
say "== GAMEMAX LCD: pemasangan ($VERSION) ==" say "== GAMEMAX LCD: pemasangan ($VERSION) =="
mkdir -p "$OPT_DIR" "$DATA_DIR" "$DESKTOP_DIR" "$ICON_DIR" "$HOME/.config/systemd/user" mkdir -p "$OPT_DIR" "$DATA_DIR" "$DESKTOP_DIR" "$ICON_DIR" "$HOME/.config/systemd/user"
+14 -14
View File
@@ -33,17 +33,17 @@ from PySide6.QtWidgets import (
) )
from PySide6.QtNetwork import QLocalServer, QLocalSocket from PySide6.QtNetwork import QLocalServer, QLocalSocket
APP_VERSION = "1.3.3" APP_VERSION = "1.3.5"
APP_NAME = "IceBurg LCD" APP_NAME = "IceBurg LCD"
REPO = "oxpoe/Gamemax-linux-apps" REPO = "oxpoe/Gamemax-linux-apps"
RELEASES_API = f"https://api.github.com/repos/{REPO}/releases/latest" RELEASES_API = f"https://gitea.oxpoe.qzz.io/api/v1/repos/{REPO}/releases/latest"
UPDATE_ASSET = "GAMEMAX-LCD-x86_64.AppImage" UPDATE_ASSET = "GAMEMAX-LCD-x86_64.AppImage"
HERE = os.path.dirname(os.path.abspath(__file__)) HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, HERE) sys.path.insert(0, HERE)
import gamemax_report as gr # noqa: E402 import gamemax_report as gr # noqa: E402
DONATE_URL = "https://donasi.oxpoe.qzz.io/" DONATE_URL = "https://donasi.oxpoe.qzz.io/"
GITHUB_URL = "https://github.com/oxpoe/Gamemax-linux-apps" REPO_URL = "https://gitea.oxpoe.qzz.io/oxpoe/Gamemax-linux-apps"
SERVICE = "gamemax-report.service" SERVICE = "gamemax-report.service"
CONFIG_PATH = gr.CONFIG_PATH CONFIG_PATH = gr.CONFIG_PATH
@@ -144,10 +144,10 @@ def verify_sha256(path, sha_url):
def latest_release(): def latest_release():
"""(tag, url aset) dari rilis terbaru GitHub — dipanggil dari thread pekerja.""" """(tag, url aset) dari rilis terbaru Gitea — dipanggil dari thread pekerja."""
ensure_ca_bundle() ensure_ca_bundle()
req = urllib.request.Request(RELEASES_API, headers={ req = urllib.request.Request(RELEASES_API, headers={
"Accept": "application/vnd.github+json", "User-Agent": "gamemax-lcd"}) "Accept": "application/json", "User-Agent": "gamemax-lcd"})
with urllib.request.urlopen(req, timeout=10) as resp: with urllib.request.urlopen(req, timeout=10) as resp:
data = json.load(resp) data = json.load(resp)
asset = next((a for a in data.get("assets", []) if a["name"] == UPDATE_ASSET), None) asset = next((a for a in data.get("assets", []) if a["name"] == UPDATE_ASSET), None)
@@ -502,18 +502,18 @@ class Window(QWidget):
donate = QPushButton("❤ Donasi") donate = QPushButton("❤ Donasi")
donate.setToolTip(DONATE_URL) donate.setToolTip(DONATE_URL)
donate.clicked.connect(lambda: open_link(DONATE_URL, self)) donate.clicked.connect(lambda: open_link(DONATE_URL, self))
github = QPushButton("GitHub") repo_btn = QPushButton("Gitea")
github.setToolTip(GITHUB_URL) repo_btn.setToolTip(REPO_URL)
github.clicked.connect(lambda: open_link(GITHUB_URL, self)) repo_btn.clicked.connect(lambda: open_link(REPO_URL, self))
links.addWidget(donate) links.addWidget(donate)
links.addWidget(github) links.addWidget(repo_btn)
links.addStretch(1) links.addStretch(1)
copy_button = QPushButton("Salin report") copy_button = QPushButton("Salin report")
copy_button.setToolTip("Salin isi report 65 byte ke papan klip (untuk laporan bug)") copy_button.setToolTip("Salin isi report 65 byte ke papan klip (untuk laporan bug)")
copy_button.clicked.connect(self.copy_report) copy_button.clicked.connect(self.copy_report)
links.addWidget(copy_button) links.addWidget(copy_button)
self.check_button = QPushButton("Periksa pembaruan") self.check_button = QPushButton("Periksa pembaruan")
self.check_button.setToolTip("Bandingkan dengan rilis terbaru di GitHub") self.check_button.setToolTip("Bandingkan dengan rilis terbaru di Gitea")
self.check_button.clicked.connect(lambda: self.start_task("memeriksa pembaruan", self.do_check_update)) self.check_button.clicked.connect(lambda: self.start_task("memeriksa pembaruan", self.do_check_update))
links.addWidget(self.check_button) links.addWidget(self.check_button)
self.update_button = QPushButton("Perbarui") self.update_button = QPushButton("Perbarui")
@@ -659,7 +659,7 @@ class Window(QWidget):
tag, url = latest_release() tag, url = latest_release()
self._pending_update = (tag, url) if url and version_tuple(tag) > version_tuple(APP_VERSION) else None self._pending_update = (tag, url) if url and version_tuple(tag) > version_tuple(APP_VERSION) else None
if not tag: if not tag:
return "tidak bisa membaca daftar rilis GitHub" return "tidak bisa membaca daftar rilis Gitea"
if self._pending_update: if self._pending_update:
return f"versi baru tersedia: {tag} (terpasang v{APP_VERSION})" return f"versi baru tersedia: {tag} (terpasang v{APP_VERSION})"
return f"sudah versi terbaru (v{APP_VERSION})" return f"sudah versi terbaru (v{APP_VERSION})"
@@ -978,8 +978,8 @@ class Tray:
"memeriksa pembaruan", self.window.do_check_update)) "memeriksa pembaruan", self.window.do_check_update))
donate_action = QAction("❤ Donasi", menu) donate_action = QAction("❤ Donasi", menu)
donate_action.triggered.connect(lambda: open_link(DONATE_URL, self.window)) donate_action.triggered.connect(lambda: open_link(DONATE_URL, self.window))
github_action = QAction("GitHub", menu) repo_action = QAction("Gitea", menu)
github_action.triggered.connect(lambda: open_link(GITHUB_URL, self.window)) repo_action.triggered.connect(lambda: open_link(REPO_URL, self.window))
quit_action = QAction("Keluar", menu) quit_action = QAction("Keluar", menu)
quit_action.triggered.connect(self.quit_app) quit_action.triggered.connect(self.quit_app)
menu.addAction(show) menu.addAction(show)
@@ -988,7 +988,7 @@ class Tray:
menu.addSeparator() menu.addSeparator()
menu.addAction(check_action) menu.addAction(check_action)
menu.addAction(donate_action) menu.addAction(donate_action)
menu.addAction(github_action) menu.addAction(repo_action)
menu.addSeparator() menu.addSeparator()
menu.addAction(quit_action) menu.addAction(quit_action)
self.icon.setContextMenu(menu) self.icon.setContextMenu(menu)