Stage Partner Center folder with listing assets and Arm64 binary; MakeAppx not present so README includes pack/bundle commands. Co-authored-by: Cursor <cursoragent@cursor.com>
83 lines
3.9 KiB
Markdown
83 lines
3.9 KiB
Markdown
# MSIX packaging for EvilFox (Microsoft Store)
|
|
|
|
EvilFox ships as a **full-trust Win32 + WebView2** app. Prefer **MSIX** over a PWA:
|
|
system proxy and protocol cores cannot be delivered as a Store PWA alone.
|
|
|
|
## Multi-arch (x64 + Arm64)
|
|
|
|
- Device family: `Windows.Desktop` (Win10 19041+ / Win11; `MaxVersionTested` 10.0.26100.0).
|
|
- Architectures: **x64** and **arm64** only (no x86 / AArch32).
|
|
- Pack script writes final artifacts to **`dist\microsoft-store\`**:
|
|
- `EvilFox_<ver>_x64.msix`
|
|
- `EvilFox_<ver>_arm64.msix`
|
|
- `EvilFox_<ver>.msixbundle` (when MakeAppx can bundle both)
|
|
- `README.txt` (Partner Center upload notes, RU+EN)
|
|
- `listing\` (store.csv + screenshots) — filled by the submission prep step
|
|
|
|
If MakeAppx is missing, the script still stages under `packaging/msix/_staging_<arch>` and prints exact `makeappx` commands in `README.txt`.
|
|
|
|
## Prerequisites
|
|
|
|
1. Build Windows x64: `build.bat` → `dist\navis-release\windows\EvilFox.exe`
|
|
2. Cross-build Arm64 (`CGO_ENABLED=0`). **Important:** `goversioninfo -64` produces an **amd64** `cmd/vpnapp/resource.syso` — temporarily rename it aside for the arm64 link, then restore:
|
|
|
|
```bat
|
|
set GOOS=windows
|
|
set GOARCH=arm64
|
|
set CGO_ENABLED=0
|
|
move cmd\vpnapp\resource.syso cmd\vpnapp\resource.syso.amd64.bak
|
|
go build -ldflags="-H windowsgui -s -w" -trimpath -o dist\navis-release\windows\arm64\EvilFox.exe ./cmd/vpnapp
|
|
move cmd\vpnapp\resource.syso.amd64.bak cmd\vpnapp\resource.syso
|
|
```
|
|
|
|
3. [Windows SDK](https://developer.microsoft.com/windows/downloads/windows-sdk/) with `MakeAppx.exe` (and `SignTool.exe` for sideload signing)
|
|
4. Optional: code-signing certificate whose **Subject CN** matches `Identity/@Publisher`
|
|
|
|
## Pack
|
|
|
|
From the repo root (PowerShell):
|
|
|
|
```powershell
|
|
.\scripts\pack-msix.ps1
|
|
.\scripts\pack-msix.ps1 -Arch x64 -Version 4.2.8.1
|
|
.\scripts\pack-msix.ps1 -Arch arm64 -ExePath dist\navis-release\windows\arm64\EvilFox.exe
|
|
.\scripts\pack-msix.ps1 -Arch all -OutDir dist\microsoft-store
|
|
.\scripts\pack-msix.ps1 -Publisher "CN=Your Store Publisher" -Name "EvilFox.EvilFox"
|
|
.\scripts\pack-msix.ps1 -CertPath ".\certs\evilfox-msix.pfx" -CertPassword "..."
|
|
```
|
|
|
|
Parameters: `-Arch x64|arm64|all`, `-OutDir`, `-Version`, `-Name`, `-Publisher`.
|
|
|
|
## Store submission
|
|
|
|
1. Create the app in [Partner Center](https://partner.microsoft.com/dashboard).
|
|
2. Copy **Package/Identity Name** and **Publisher** into `AppxManifest.xml` (or pass `-Name` / `-Publisher`).
|
|
3. Upload **`.msixbundle`** if available, else both **`.msix`** files. Partner Center can re-sign with the Store cert.
|
|
4. Device family: **Windows 10/11 Desktop** only. Arm64 covers Windows on ARM.
|
|
5. Declare **runFullTrust** and network capabilities; answer Store questions about VPN/proxy use.
|
|
6. Privacy policy URL on [evilfox.win](https://evilfox.win) required.
|
|
7. Sign in to Visual Studio / Partner Center with the **same Store developer account** if using VS packaging / Store association.
|
|
8. **Do not enable in-app self-update** for Store builds — EvilFox detects MSIX package identity and hides the updater (Store updates only).
|
|
|
|
Optional: place arch-specific `wintun.dll` under `assets/wintun/<arch>/`. Without it, packaging still succeeds; TUN/VPN mode needs the dll next to the exe (proxy mode works without it).
|
|
|
|
## Sideload test
|
|
|
|
```powershell
|
|
Add-AppxPackage -Path .\dist\microsoft-store\EvilFox_4.2.8.1_x64.msix
|
|
```
|
|
|
|
Unsigned packages need a trusted cert or developer mode / sideloading enabled.
|
|
|
|
## Remnawave notes
|
|
|
|
EvilFox can pull configs from a Remnawave panel:
|
|
|
|
1. Public subscription: paste `https://<panel>/api/sub/<shortUuid>` (or use panel URL + short UUID in the Remnawave block).
|
|
2. Optional API token (panel → API Tokens) enables authenticated lookups:
|
|
- `GET /api/subscriptions/by-short-uuid/{short}` / `…/raw`
|
|
- `GET /api/users/by-short-uuid/{short}` → `subscriptionUrl`
|
|
3. Optional Caddy `X-Api-Key` if the panel sits behind Caddy token auth.
|
|
|
|
Tokens are stored only in local `configs/config.json` (mode 0600) — never commit them.
|