Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a474f04
Refactor app structure and update unit tests
mrquantumoff Apr 4, 2026
2a265de
Add dual Electron and Tauri desktop runtime support
mrquantumoff Apr 4, 2026
9047a4e
Trust electron dependency for Bun and fix updater import
mrquantumoff Apr 4, 2026
f4a405d
Fix ESM loading for quadrant-node and enable CurseForge NAPI
mrquantumoff Apr 4, 2026
e89f088
Fix Electron runtime metadata and enable proprietary NAPI features
mrquantumoff Apr 4, 2026
8adee43
Accept camelCase host invoke args in Electron
mrquantumoff Apr 4, 2026
fa92e76
Add ARM support and docs for Electron builds
mrquantumoff Apr 4, 2026
2f106e4
Return share codes from Tauri commands and bump stable version
mrquantumoff Apr 4, 2026
04e8c42
Switch Flathub sync to Electron AppImage releases
mrquantumoff Apr 4, 2026
32f697f
Add Electron Flatpak packaging notes and refresh lockfile
mrquantumoff Apr 4, 2026
8af8945
Fix Electron deep links, updater channel, and tray asset
mrquantumoff Apr 4, 2026
4455ec7
Fix desktop validation env vars for native addon builds
mrquantumoff Apr 4, 2026
2e9de64
Add Tauri aliases for modpack folder and export commands
mrquantumoff Apr 4, 2026
e0c022a
Fix export save dialog and defer deep links until renderer ready
mrquantumoff Apr 4, 2026
4f58425
Pass ETERNAL API token to release packaging
mrquantumoff Apr 4, 2026
754ee26
Add Electron runtime support and install guards
mrquantumoff Apr 4, 2026
cd8d5a9
Accept integral JSON numbers for modpack sync timestamps
mrquantumoff Apr 4, 2026
344cd01
Bump appx manifest version to 26.4.1.0
mrquantumoff Apr 4, 2026
770f5f3
Harden sidecar desktop storage and telemetry
mrquantumoff Apr 4, 2026
24c4cdf
Initialize host logging with colog
mrquantumoff Apr 4, 2026
fd8180f
Normalize desktop platform names in Electron IPC
mrquantumoff Apr 4, 2026
cf73abe
Add Electron sidecar restarts and backend sync updates
mrquantumoff Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions .github/workflows/flatpak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ jobs:
gh release download "$TAG" \
--repo "$RELEASE_REPO" \
--dir downloads \
--pattern "Quadrant_${VERSION}_amd64.deb" \
--pattern "Quadrant_${VERSION}_arm64.deb"
--pattern "Quadrant-${VERSION}-linux-x64-electron.AppImage" \
--pattern "Quadrant-${VERSION}-linux-arm64-electron.AppImage"

- name: Compute source hashes
id: hashes
Expand All @@ -84,8 +84,8 @@ jobs:
set -euo pipefail

metainfo_sha="$(sha256sum "$METAINFO_PATH" | awk '{print $1}')"
amd64_sha="$(sha256sum "downloads/Quadrant_${VERSION}_amd64.deb" | awk '{print $1}')"
arm64_sha="$(sha256sum "downloads/Quadrant_${VERSION}_arm64.deb" | awk '{print $1}')"
amd64_sha="$(sha256sum "downloads/Quadrant-${VERSION}-linux-x64-electron.AppImage" | awk '{print $1}')"
arm64_sha="$(sha256sum "downloads/Quadrant-${VERSION}-linux-arm64-electron.AppImage" | awk '{print $1}')"

echo "metainfo_sha=$metainfo_sha" >> "$GITHUB_OUTPUT"
echo "amd64_sha=$amd64_sha" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -192,8 +192,8 @@ jobs:
set -euo pipefail

metainfo_url="https://github.com/${RELEASE_REPO}/raw/${TAG}/${METAINFO_PATH}"
amd64_url="https://github.com/${RELEASE_REPO}/releases/download/${TAG}/Quadrant_${VERSION}_amd64.deb"
arm64_url="https://github.com/${RELEASE_REPO}/releases/download/${TAG}/Quadrant_${VERSION}_arm64.deb"
amd64_url="https://github.com/${RELEASE_REPO}/releases/download/${TAG}/Quadrant-${VERSION}-linux-x64-electron.AppImage"
arm64_url="https://github.com/${RELEASE_REPO}/releases/download/${TAG}/Quadrant-${VERSION}-linux-arm64-electron.AppImage"
pr_head="${FLATHUB_HEAD_OWNER}:${FLATHUB_BRANCH}"

{
Expand Down
67 changes: 64 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ jobs:
- name: Setup bun
uses: oven-sh/setup-bun@v2


- name: install Rust stable
uses: dtolnay/rust-toolchain@stable

Expand Down Expand Up @@ -71,12 +70,74 @@ jobs:
releaseDraft: false
prerelease: ${{ !endsWith(github.ref_name, 'stable') }}
args: ${{ matrix.args }}
tauriScript: 'bun tauri'
tauriScript: "bun tauri"
tagName: ${{github.ref_name}}

publish-electron:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- platform: "blacksmith-4vcpu-windows-2025"
os: "windows"
arch: "x64"
- platform: "blacksmith-4vcpu-ubuntu-2404"
os: "linux"
arch: "x64"
- platform: "windows-11-arm"
os: "windows"
arch: "arm64"
- platform: "blacksmith-4vcpu-ubuntu-2404-arm"
os: "linux"
arch: "arm64"
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4

- name: Setup bun
uses: oven-sh/setup-bun@v2

- name: install Rust stable
uses: dtolnay/rust-toolchain@stable

- name: install dependencies (ubuntu only)
if: matrix.os == 'linux'
run: |
sudo apt update
sudo apt install -y libsecret-1-dev libarchive-tools rpm

- name: install frontend dependencies (bun)
run: bun install

- uses: Swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"

- name: Package Electron app
env:
ETERNAL_API_TOKEN: ${{ secrets.ETERNAL_API_TOKEN }}
QUADRANT_API_KEY: ${{ secrets.QUADRANT_API_KEY }}
QUADRANT_OAUTH2_CLIENT_ID: ${{ secrets.QUADRANT_OAUTH2_CLIENT_ID }}
QUADRANT_OAUTH2_CLIENT_SECRET: ${{ secrets.QUADRANT_OAUTH2_CLIENT_SECRET }}
QUADRANT_API_BASE_URL: ${{ vars.QUADRANT_API_BASE_URL }}
run: bun run package:electron -- --arch=${{ matrix.arch }}

- name: Upload Electron assets to release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAG_NAME: ${{ github.ref_name }}
shell: bash
run: |
mapfile -d '' files < <(find dist-electron -maxdepth 1 -type f -print0)
gh release upload "$TAG_NAME" "${files[@]}" --clobber

sync_flathub:
name: Sync Flathub
needs: publish-tauri
needs:
- publish-tauri
- publish-electron
if: endsWith(github.ref_name, '-stable') || endsWith(github.ref_name, '-flatpak')
uses: ./.github/workflows/flatpak.yml
secrets: inherit
Expand Down
52 changes: 52 additions & 0 deletions .github/workflows/validate-desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Validate Desktop

on:
pull_request:
push:
branches:
- main
- master
- release

jobs:
validate:
runs-on: ubuntu-24.04
env:
# quadrant-core still uses compile-time env!() for these desktop-only
# credentials, so CI must provide placeholder values for every Rust build.
QUADRANT_API_KEY: dev
QUADRANT_OAUTH2_CLIENT_ID: dev
QUADRANT_OAUTH2_CLIENT_SECRET: dev
ETERNAL_API_TOKEN: dev
steps:
- uses: actions/checkout@v4

- name: Setup bun
uses: oven-sh/setup-bun@v2

- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable

- name: Install Linux desktop dependencies
run: |
sudo apt update
sudo apt install -y libwebkit2gtk-4.1-dev xdg-utils libappindicator3-dev librsvg2-dev patchelf libsecret-1-dev libarchive-tools rpm

- name: Install frontend dependencies
run: bun install

- uses: Swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"

- name: Build shared renderer
run: bun run build

- name: Build native addon
run: bun run build:napi

- name: Build Electron shell
run: node scripts/build-electron.mjs

- name: Build Tauri shell
run: bun tauri build --no-bundle
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ lerna-debug.log*

node_modules
dist
dist-electron
dist-ssr
*.local

Expand Down Expand Up @@ -39,3 +40,5 @@ src-tauri/versoview
target/
AppxContent
AppxBundles
electron/runtime-config.generated.json
packages/quadrant-node/native/
8 changes: 3 additions & 5 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
{
"rust-analyzer.cargo.cfgs": [
"debug_assertions"
],
"typescript.tsdk": "node_modules\\typescript\\lib"
}
"rust-analyzer.cargo.cfgs": ["debug_assertions"],
"typescript.tsdk": "node_modules\\typescript\\lib"
}
2 changes: 1 addition & 1 deletion AppxManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap uap3 uap10 desktop rescap">
<Identity Name="58734MrQuantumOFFDemirYer.MinecraftModpackManagerR" Version="26.4.0.0"
<Identity Name="58734MrQuantumOFFDemirYer.MinecraftModpackManagerR" Version="26.4.1.0"
Publisher="CN=010914FC-8843-4963-A3FE-E3E06E6D9F53" ProcessorArchitecture="x64" />
<Properties>
<DisplayName>QuadrantMC</DisplayName>
Expand Down
8 changes: 7 additions & 1 deletion DEVELOP.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,10 @@ You can develop the Quadrant Next client by:

- Installing the needed dependencies for [Tauri](https://tauri.app/start/prerequisites/) and [Rust](https://www.rust-lang.org/). If you're on Linux, you'll also need libsecret-1-dev.
- Then install bun and run `bun install` in the root directory of the project.
- After that in order to run the app without any of the proprietary features, you can run `bun tauri dev -- -- --no-default-features`.
- Renderer-only development remains available through `bun run dev`.
- Tauri development is available through `bun run dev:tauri`.
- Electron development is available through `bun run dev:electron`.
- To build the shared renderer only, run `bun run build`.
- To build the native Electron addon explicitly, run `bun run build:napi`.
- To package the Electron app, run `bun run package:electron`.
- To build the Tauri app without any of the proprietary features, run `bun tauri dev -- -- --no-default-features`.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

> An easy way to manage your modpacks, written in React and Rust.

## Desktop Runtimes

Quadrant supports two desktop runtimes, they share the frontend and backend logic, but differ in technicalities:

- `Tauri`: the original Quadrant experience.
- `Electron`: the Node/Electron shell in `electron/`, backed by the Quadrant N-API bindings, should work better on Linux, because it replaces WebKit with CEF.

### Installation guide:

##### The app is available on these stores:
Expand Down
Loading
Loading