From 36df083253b162c923e01e72c08f0855350b6a38 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 1/8] feat: add cross-platform macOS .app bundle script Builds PKVault.app from a dotnet publish output, generating the .icns and ad-hoc signing it. Uses macOS's iconutil/codesign when available, otherwise falls back to icnsutil (pip) and rcodesign so it also runs on Linux, with no real Mac required. --- PKVault.Desktop/publishers/macos/Info.plist | 30 ++++++++ PKVault.Desktop/publishers/macos/build-app.sh | 72 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 PKVault.Desktop/publishers/macos/Info.plist create mode 100755 PKVault.Desktop/publishers/macos/build-app.sh diff --git a/PKVault.Desktop/publishers/macos/Info.plist b/PKVault.Desktop/publishers/macos/Info.plist new file mode 100644 index 00000000..dc9b9e65 --- /dev/null +++ b/PKVault.Desktop/publishers/macos/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleName + PKVault + CFBundleDisplayName + PKVault + CFBundleIdentifier + com.chnapy.pkvault + CFBundleVersion + (VERSION) + CFBundleShortVersionString + (VERSION) + CFBundlePackageType + APPL + CFBundleExecutable + pkvault + CFBundleIconFile + pkvault.icns + CFBundleInfoDictionaryVersion + 6.0 + NSHighResolutionCapable + + LSMinimumSystemVersion + 11.0 + NSHumanReadableCopyright + Richard Haddad + + diff --git a/PKVault.Desktop/publishers/macos/build-app.sh b/PKVault.Desktop/publishers/macos/build-app.sh new file mode 100755 index 00000000..46cfcf29 --- /dev/null +++ b/PKVault.Desktop/publishers/macos/build-app.sh @@ -0,0 +1,72 @@ +#!/bin/sh + +set -e + +# Build PKVault.app in macOS context (also runs on Linux, no real Mac required) +# Usage: ./build-app.sh + +# Note: falls back to "icnsutil" (pip) and "rcodesign" when iconutil/codesign +# aren't available (i.e. running on Linux). + +RID="${1:-osx-arm64}" +VERSION="${2:-dev}" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PUBLISH_DIR="${3:-$SCRIPT_DIR/../../../out/$RID}" +OUT_DIR="${4:-$SCRIPT_DIR/../../../out}" +APP_DIR="$OUT_DIR/PKVault.app" + +echo "=== Building PKVault.app for $RID ===" + +rm -rf "$APP_DIR" +mkdir -p "$APP_DIR/Contents/MacOS" +mkdir -p "$APP_DIR/Contents/Resources" + +# copy exe (excluding app-generated data and loose files that break signing) +find "$PUBLISH_DIR" -mindepth 1 -maxdepth 1 \ + ! -name logs ! -name db ! -name backup ! -name '*.sav' \ + ! -name '*.pdb' ! -name '*.runtimeconfig.json' ! -name swagger.json \ + -exec cp -r {} "$APP_DIR/Contents/MacOS/" \; +mv "$APP_DIR/Contents/MacOS/PKVault" "$APP_DIR/Contents/MacOS/pkvault" +chmod 755 "$APP_DIR/Contents/MacOS/pkvault" + +# Info.plist +sed -e "s/(VERSION)/$VERSION/g" "$SCRIPT_DIR/Info.plist" > "$APP_DIR/Contents/Info.plist" + +# icon: build .icns from the common iconset +ICONSET_DIR=$(mktemp -d)/pkvault.iconset +mkdir -p "$ICONSET_DIR" +COMMON_ICONS="$SCRIPT_DIR/../common/icons" + +cp "$COMMON_ICONS/pkvault_16x16.png" "$ICONSET_DIR/icon_16x16.png" +cp "$COMMON_ICONS/pkvault_32x32.png" "$ICONSET_DIR/icon_16x16@2x.png" +cp "$COMMON_ICONS/pkvault_32x32.png" "$ICONSET_DIR/icon_32x32.png" +cp "$COMMON_ICONS/pkvault_64x64.png" "$ICONSET_DIR/icon_32x32@2x.png" +cp "$COMMON_ICONS/pkvault_128x128.png" "$ICONSET_DIR/icon_128x128.png" +cp "$COMMON_ICONS/pkvault_256x256.png" "$ICONSET_DIR/icon_128x128@2x.png" +cp "$COMMON_ICONS/pkvault_256x256.png" "$ICONSET_DIR/icon_256x256.png" +# note: no icon_256x256@2x.png, would need a 512px source asset we don't have + +if command -v iconutil >/dev/null 2>&1; then + iconutil -c icns "$ICONSET_DIR" -o "$APP_DIR/Contents/Resources/pkvault.icns" +else + python3 -m icnsutil compose -f "$APP_DIR/Contents/Resources/pkvault.icns" \ + "$ICONSET_DIR"/icon_16x16.png \ + "$ICONSET_DIR"/icon_16x16@2x.png \ + "$ICONSET_DIR"/icon_32x32.png \ + "$ICONSET_DIR"/icon_32x32@2x.png \ + "$ICONSET_DIR"/icon_128x128.png \ + "$ICONSET_DIR"/icon_128x128@2x.png \ + "$ICONSET_DIR"/icon_256x256.png +fi +rm -rf "$(dirname "$ICONSET_DIR")" + +# ad-hoc sign (required on Apple Silicon) +if command -v codesign >/dev/null 2>&1; then + codesign --force --deep --sign - "$APP_DIR" +elif command -v rcodesign >/dev/null 2>&1; then + rcodesign sign "$APP_DIR" +else + echo "WARNING: neither codesign nor rcodesign found, PKVault.app will be unsigned" >&2 +fi + +echo "=== PKVault.app created at $APP_DIR ===" From 99b0aea928bd86b543941bb216d846155d9d537d Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 2/8] feat(ci): build macOS desktop app bundles in release workflow Adds a desktop-publish-macos-app / desktop-macos Dockerfile stage, reusing the existing generic desktop-publish stage (dotnet cross-compiles osx-arm64/osx-x64 fine from Linux). The release job extracts both pkvault--.app.zip archives the same way it already does for the Windows/Linux desktop builds. --- .github/workflows/release.yml | 26 ++++++++++++++++++++ Dockerfile | 46 +++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aba250c0..6bc3fad7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -228,6 +228,30 @@ jobs: ls -la . + - name: Build macOS arm64 desktop image & extract app bundle + run: | + docker build . --target desktop-macos --build-arg RID=osx-arm64 --build-arg VERSION=${{ env.VERSION }} -t tmp-desktop-macos-arm64 + docker create --name tmp-desktop-macos-arm64 tmp-desktop-macos-arm64 + + docker cp tmp-desktop-macos-arm64:/app/pkvault-${{ env.VERSION }}-osx-arm64.app.zip pkvault-${{ env.VERSION }}-osx-arm64.app.zip + + docker rm tmp-desktop-macos-arm64 + docker rmi tmp-desktop-macos-arm64 + + ls -la . + + - name: Build macOS x64 desktop image & extract app bundle + run: | + docker build . --target desktop-macos --build-arg RID=osx-x64 --build-arg VERSION=${{ env.VERSION }} -t tmp-desktop-macos-x64 + docker create --name tmp-desktop-macos-x64 tmp-desktop-macos-x64 + + docker cp tmp-desktop-macos-x64:/app/pkvault-${{ env.VERSION }}-osx-x64.app.zip pkvault-${{ env.VERSION }}-osx-x64.app.zip + + docker rm tmp-desktop-macos-x64 + docker rmi tmp-desktop-macos-x64 + + ls -la . + - name: Create tag if: ${{ !inputs.dry-run }} env: @@ -249,3 +273,5 @@ jobs: pkvault-${{ env.VERSION }}.AppImage pkvault-${{ env.VERSION }}.flatpak pkvault-${{ env.VERSION }}.deb + pkvault-${{ env.VERSION }}-osx-arm64.app.zip + pkvault-${{ env.VERSION }}-osx-x64.app.zip diff --git a/Dockerfile b/Dockerfile index 0d94d97a..e9c5c190 100644 --- a/Dockerfile +++ b/Dockerfile @@ -114,6 +114,46 @@ RUN if [ "$(echo $RID | grep -o 'win-x64')" ]; then \ echo "=== Skip AppImage (non-linux-x64: $RID) ==="; \ fi +# desktop macOS - .app bundle (dotnet cross-compiles, no real Mac required) +FROM desktop-publish AS desktop-publish-macos-app + +ARG VERSION +ENV VERSION=${VERSION} + +COPY ./PKVault.Desktop/publishers/common ./PKVault.Desktop/publishers/common +COPY ./PKVault.Desktop/publishers/macos ./PKVault.Desktop/publishers/macos + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + python3 python3-pip zip curl && \ + pip3 install --break-system-packages icnsutil && \ + apt-get clean && rm -rf /var/lib/apt/lists/* /var/cache/apt/* + +# rcodesign: cross-platform codesign, required for ad-hoc signing on Apple Silicon +# https://github.com/indygreg/apple-platform-rs +ARG APPLE_CODESIGN_VERSION=0.29.0 +RUN ARCH=$(dpkg --print-architecture) && \ + case "$ARCH" in \ + amd64) RCODESIGN_TARGET=x86_64-unknown-linux-musl ;; \ + arm64) RCODESIGN_TARGET=aarch64-unknown-linux-musl ;; \ + *) echo "Unsupported architecture: $ARCH" && exit 1 ;; \ + esac && \ + curl -sL -o /tmp/apple-codesign.tar.gz \ + https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign/${APPLE_CODESIGN_VERSION}/apple-codesign-${APPLE_CODESIGN_VERSION}-${RCODESIGN_TARGET}.tar.gz && \ + tar -xzf /tmp/apple-codesign.tar.gz -C /tmp && \ + mv /tmp/apple-codesign-${APPLE_CODESIGN_VERSION}-${RCODESIGN_TARGET}/rcodesign /usr/local/bin/rcodesign && \ + rm -rf /tmp/apple-codesign.tar.gz /tmp/apple-codesign-${APPLE_CODESIGN_VERSION}-${RCODESIGN_TARGET} && \ + rcodesign --version + +RUN mkdir -p /app/publish-final + +WORKDIR /src/PKVault.Desktop/publishers/macos + +RUN chmod +x build-app.sh && \ + ./build-app.sh ${RID} ${VERSION} /app/publish /app/publish-final-app && \ + cd /app/publish-final-app && \ + zip -r -y /app/publish-final/pkvault-${VERSION}-${RID}.app.zip PKVault.app + FROM desktop-publish AS desktop-publish-linux-base COPY ./PKVault.Desktop/publishers/common ./PKVault.Desktop/publishers/common @@ -174,6 +214,12 @@ COPY --from=desktop-publish /app/publish-final /app RUN ls -la /app +FROM alpine:latest AS desktop-macos + +COPY --from=desktop-publish-macos-app /app/publish-final /app + +RUN ls -la /app + FROM alpine:latest AS desktop-linux COPY --from=desktop-publish /app/publish/PKVault /tmp/raw/PKVault From e35b836578aa88bbdf2aa2290b353c608d686a72 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 3/8] feat: detect macOS runtime and use ~/Documents/pkvault as app directory Previously macOS fell through to UNKNOWN for RuntimeSystem and used the directory next to the executable for app data, which inside a .app bundle is Contents/MacOS/ - not writable post-install. Mirrors the existing Linux behavior instead. --- PKVault.Backend.Tests/utils/PathUtils.cs | 5 +++++ PKVault.Backend/settings/dto/SettingsDTO.cs | 1 + .../settings/services/SettingsService.cs | 14 ++++++++++++++ PKVault.Backend/swagger.json | 6 ++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/PKVault.Backend.Tests/utils/PathUtils.cs b/PKVault.Backend.Tests/utils/PathUtils.cs index 147e8a16..5141e89c 100644 --- a/PKVault.Backend.Tests/utils/PathUtils.cs +++ b/PKVault.Backend.Tests/utils/PathUtils.cs @@ -10,6 +10,11 @@ public static string GetExpectedAppDirectory() ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) ?? "~/", "pkvault")); } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return Path.GetFullPath(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) ?? "~/", "pkvault")); + } + var exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName; return Path.GetFullPath(Path.GetDirectoryName(exePath)!); } diff --git a/PKVault.Backend/settings/dto/SettingsDTO.cs b/PKVault.Backend/settings/dto/SettingsDTO.cs index 3d17278f..fa502ca1 100644 --- a/PKVault.Backend/settings/dto/SettingsDTO.cs +++ b/PKVault.Backend/settings/dto/SettingsDTO.cs @@ -80,6 +80,7 @@ public enum RuntimeSystem WINDOWS, LINUX, STEAMDECK, + MACOS, } public enum SourceProvider diff --git a/PKVault.Backend/settings/services/SettingsService.cs b/PKVault.Backend/settings/services/SettingsService.cs index fe498525..dd95e1b6 100644 --- a/PKVault.Backend/settings/services/SettingsService.cs +++ b/PKVault.Backend/settings/services/SettingsService.cs @@ -220,6 +220,17 @@ public static string GetAppDirectory() ); } + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return Path.GetFullPath( + Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + ?? "~/", + "pkvault" + ) + ); + } + var exePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName; var exeDirectory = exePath != null ? Path.GetDirectoryName(exePath) : null; @@ -272,6 +283,9 @@ private static RuntimeSystem GetRuntimeSystem() if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return RuntimeSystem.WINDOWS; + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return RuntimeSystem.MACOS; + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return RuntimeSystem.UNKNOWN; diff --git a/PKVault.Backend/swagger.json b/PKVault.Backend/swagger.json index 1d445fcb..5f39dd9a 100644 --- a/PKVault.Backend/swagger.json +++ b/PKVault.Backend/swagger.json @@ -4170,14 +4170,16 @@ "DOCKER", "WINDOWS", "LINUX", - "STEAMDECK" + "STEAMDECK", + "MACOS" ], "enum": [ 0, 1, 2, 3, - 4 + 4, + 5 ] }, "SourceProvider": { From 8882099e46438934dde4097092e760f305401fa0 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 4/8] feat: add macOS label to settings runtime system display --- frontend/src/settings/main/settings-main-left.tsx | 1 + frontend/src/translate/locales/de.json | 1 + frontend/src/translate/locales/en.json | 1 + frontend/src/translate/locales/fr.json | 1 + frontend/src/translate/locales/pt-br.json | 1 + frontend/src/translate/locales/zh-hant.json | 1 + 6 files changed, 6 insertions(+) diff --git a/frontend/src/settings/main/settings-main-left.tsx b/frontend/src/settings/main/settings-main-left.tsx index e100c072..37c448f1 100644 --- a/frontend/src/settings/main/settings-main-left.tsx +++ b/frontend/src/settings/main/settings-main-left.tsx @@ -33,6 +33,7 @@ export const SettingsMainLeft: React.FC = () => { [ RuntimeSystem.WINDOWS ]: t('settings.system.windows'), [ RuntimeSystem.LINUX ]: t('settings.system.linux'), [ RuntimeSystem.STEAMDECK ]: t('settings.system.steamdeck'), + [ RuntimeSystem.MACOS ]: t('settings.system.macos'), })} } label='PKHeX' />
{settings?.pkhexVersion}
diff --git a/frontend/src/translate/locales/de.json b/frontend/src/translate/locales/de.json index 18b4d7f9..7c84667b 100644 --- a/frontend/src/translate/locales/de.json +++ b/frontend/src/translate/locales/de.json @@ -255,6 +255,7 @@ "settings.sub.external": "Externe pkms", "settings.sub.main": "Hauptsächlich", "settings.system.linux": "Linux", + "settings.system.macos": "macOS", "settings.system.steamdeck": "SteamDeck", "settings.system.unknown": "System unbekannt", "settings.system.windows": "Windows", diff --git a/frontend/src/translate/locales/en.json b/frontend/src/translate/locales/en.json index 2d47f142..33067554 100644 --- a/frontend/src/translate/locales/en.json +++ b/frontend/src/translate/locales/en.json @@ -255,6 +255,7 @@ "settings.sub.external": "External pkms", "settings.sub.main": "Main", "settings.system.linux": "Linux desktop", + "settings.system.macos": "macOS desktop", "settings.system.steamdeck": "SteamDeck", "settings.system.unknown": "System unknown", "settings.system.windows": "Windows desktop", diff --git a/frontend/src/translate/locales/fr.json b/frontend/src/translate/locales/fr.json index 384c928e..829e6a59 100644 --- a/frontend/src/translate/locales/fr.json +++ b/frontend/src/translate/locales/fr.json @@ -255,6 +255,7 @@ "settings.sub.external": "Pkms externes", "settings.sub.main": "Principal", "settings.system.linux": "Linux", + "settings.system.macos": "macOS", "settings.system.steamdeck": "SteamDeck", "settings.system.unknown": "Système non reconnu", "settings.system.windows": "Windows", diff --git a/frontend/src/translate/locales/pt-br.json b/frontend/src/translate/locales/pt-br.json index 48f533bc..a08002ce 100644 --- a/frontend/src/translate/locales/pt-br.json +++ b/frontend/src/translate/locales/pt-br.json @@ -255,6 +255,7 @@ "settings.sub.external": "Externos", "settings.sub.main": "Principal", "settings.system.linux": "Linux", + "settings.system.macos": "macOS", "settings.system.steamdeck": "Steam Deck", "settings.system.unknown": "Desconhecido", "settings.system.windows": "Windows", diff --git a/frontend/src/translate/locales/zh-hant.json b/frontend/src/translate/locales/zh-hant.json index c19615f3..f91180cb 100644 --- a/frontend/src/translate/locales/zh-hant.json +++ b/frontend/src/translate/locales/zh-hant.json @@ -255,6 +255,7 @@ "settings.sub.external": "外部 PKM", "settings.sub.main": "主要設定", "settings.system.linux": "Linux 桌面版", + "settings.system.macos": "macOS 桌面版", "settings.system.steamdeck": "Steam Deck", "settings.system.unknown": "未知系統", "settings.system.windows": "Windows 桌面版", From 15c8b3bf79c584d99e16413f255765c5c1ea2452 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 5/8] docs: add macOS to README platform table and usage section --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ed78c62..d04187f2 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,10 @@ PKVault is a Pokémon storage & save manipulation tool based on [PKHeX](https://github.com/kwsch/PKHeX). Similar to Pokémon Home, offline as online. - | | | | -|:---:|:---:|:---:|:---:| -| [![Download for Windows](https://img.shields.io/badge/Windows-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for Linux](https://img.shields.io/badge/Linux-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for SteamDeck](https://img.shields.io/badge/SteamDeck-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | [![Docker usage](https://img.shields.io/badge/Docker-Setup-purple)](#docker-usage) | -| PKVault.exe | pkvault.flatpak
pkvault.AppImage
pkvault.deb
pkvault.linux | pkvault.flatpak | `ghcr.io/chnapy/pkvault` | + | | | | | +|:---:|:---:|:---:|:---:|:---:| +| [![Download for Windows](https://img.shields.io/badge/Windows-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for Linux](https://img.shields.io/badge/Linux-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | [![Download for macOS](https://img.shields.io/badge/macOS-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for SteamDeck](https://img.shields.io/badge/SteamDeck-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | [![Docker usage](https://img.shields.io/badge/Docker-Setup-purple)](#docker-usage) | +| PKVault.exe | pkvault.flatpak
pkvault.AppImage
pkvault.deb
pkvault.linux | pkvault-osx-arm64.app.zip
pkvault-osx-x64.app.zip | pkvault.flatpak | `ghcr.io/chnapy/pkvault` | ![License](https://img.shields.io/badge/License-GPLv3-green.svg) @@ -67,6 +67,8 @@ On Windows, just use `PKVault.exe`. On Linux & SteamDeck, it's recommanded to get PKVault from Flathub: Download on Flathub
Otherwise there is plenty of Linux executables in [releases](https://github.com/Chnapy/PKVault/releases/latest) page. +On macOS, download `pkvault-osx-arm64.app.zip` (Apple Silicon) or `pkvault-osx-x64.app.zip` (Intel), unzip it, then open `PKVault.app`. Since the app isn't notarized, macOS will show "Apple could not verify 'PKVault' is free of malware that may harm your Mac or compromise your privacy." Go to **System Settings > Privacy & Security**, scroll down to find PKVault, and click "Open Anyway", then confirm in the dialog that appears. + ### Steam-based usage Steam cover From da2418047ce3bba43b12235faf6b597701a9dae3 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 20:07:53 -0300 Subject: [PATCH 6/8] docs: add macOS to technical considerations (en, pt-br) French (fr) intentionally left untranslated - needs review by a French speaker before merge. --- docs/functional/en/0-technical.md | 4 +++- docs/functional/pt-br/0-technical.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/functional/en/0-technical.md b/docs/functional/en/0-technical.md index d3f8fac6..885c2d09 100644 --- a/docs/functional/en/0-technical.md +++ b/docs/functional/en/0-technical.md @@ -1,6 +1,6 @@ # 0 - Technical considerations -PKVault runs on Windows & Linux for its desktop version. A Steamdeck version exists (flatpak). +PKVault runs on Windows, Linux & macOS for its desktop version. A Steamdeck version exists (flatpak). Like PKHeX, PKVault depends on .NET 10 to run. Since the application is multi-platform and based on web technologies, PKVault also depends on web controls depending on current OS: @@ -20,6 +20,8 @@ On Linux, folder used is one of: - `/home/$USER/Documents/pkvault` - `/home/$USER/.var/app/io.github.chnapy.pkvault/data` - expected with flatpak file +On macOS, folder used is `/Users/$USER/Documents/pkvault`. + You will find the following files: - `config/pkvault.json` - The PKVault configuration file diff --git a/docs/functional/pt-br/0-technical.md b/docs/functional/pt-br/0-technical.md index fbceace6..e6396025 100644 --- a/docs/functional/pt-br/0-technical.md +++ b/docs/functional/pt-br/0-technical.md @@ -1,6 +1,6 @@ # 0 - Considerações técnicas -O PKVault roda no Windows e no Linux em sua versão para desktop. Existe também uma versão para Steam Deck (flatpak). +O PKVault roda no Windows, Linux e macOS em sua versão para desktop. Existe também uma versão para Steam Deck (flatpak). Assim como o PKHeX, o PKVault depende do .NET 10 para funcionar. Como o aplicativo é multiplataforma e baseado em tecnologias web, o PKVault também depende de componentes de visualização web específicos para o sistema operacional em uso: @@ -20,6 +20,8 @@ No Linux, a pasta utilizada é uma das seguintes: - `/home/$USER/Documents/pkvault` - `/home/$USER/.var/app/io.github.chnapy.pkvault/data` - esperado ao usar a versão Flatpak +No macOS, a pasta utilizada é `/Users/$USER/Documents/pkvault`. + Você encontrará os seguintes arquivos: - `config/pkvault.json` - O arquivo de configuração do PKVault From 7f032be74aca1db889fcfa841553ab5293640470 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Mon, 24 Aug 2026 23:42:42 -0300 Subject: [PATCH 7/8] fix: reveal folder in Finder on macOS instead of crashing OpenFolderRequestMessage handling had no macOS branch, so clicking the folder icon for a saves-folder row threw an uncaught PlatformNotSupportedException and aborted the whole app. Use `open -R` to reveal/select the path in Finder, matching Windows' /select and Linux's xdg-open behavior. --- PKVault.Desktop/Program.cs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/PKVault.Desktop/Program.cs b/PKVault.Desktop/Program.cs index 969df711..cdf7a3e5 100644 --- a/PKVault.Desktop/Program.cs +++ b/PKVault.Desktop/Program.cs @@ -16,7 +16,7 @@ class Program { private static readonly bool WindowsOS = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); private static readonly bool LinuxOS = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - // private static readonly bool MacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + private static readonly bool MacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); private static readonly Assembly Assembly = Assembly.GetExecutingAssembly(); private static readonly string AssemblyStaticPrefix = "PKVault.Desktop.Resources.wwwroot."; @@ -312,8 +312,9 @@ async Task GetDialogResponse() { var openFolderRequest = JsonSerializer.Deserialize(message, messageJsonContext.OpenFolderRequestMessage); - var path = MatcherUtil.NormalizePath(Path.Combine(SettingsService.GetAppDirectory(), openFolderRequest.path)) - .Replace('/', '\\'); + var normalizedPath = MatcherUtil.NormalizePath(Path.Combine(SettingsService.GetAppDirectory(), openFolderRequest.path)); + + var path = normalizedPath.Replace('/', '\\'); if (WindowsOS) { @@ -365,6 +366,21 @@ async Task GetDialogResponse() Process.Start(fallback); } } + else if (MacOS) + { + // `open -R` reveals and selects a file/folder in Finder + var arg = $"-R \"{MatcherUtil.NormalizePath(normalizedPath)}\""; + + var psi = new ProcessStartInfo + { + FileName = "open", + Arguments = arg, + UseShellExecute = false + }; + + Log.Logger.Debug($"RUN open {arg}"); + Process.Start(psi); + } else { throw new PlatformNotSupportedException($"OS not supported: {RuntimeInformation.OSDescription}"); From 20c5e5b58c18415f68563e4211483eaa820a9847 Mon Sep 17 00:00:00 2001 From: Lorenzo Pincinato Date: Fri, 28 Aug 2026 23:11:00 -0300 Subject: [PATCH 8/8] feat: update macOS icon in README.md Co-authored-by: Richard Haddad --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d04187f2..bf7309a6 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ PKVault is a Pokémon storage & save manipulation tool based on [PKHeX](https://github.com/kwsch/PKHeX). Similar to Pokémon Home, offline as online. - | | | | | + | | | | | |:---:|:---:|:---:|:---:|:---:| | [![Download for Windows](https://img.shields.io/badge/Windows-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for Linux](https://img.shields.io/badge/Linux-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | [![Download for macOS](https://img.shields.io/badge/macOS-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | Download on Flathub
[![Download for SteamDeck](https://img.shields.io/badge/SteamDeck-Release-blue)](https://github.com/Chnapy/PKVault/releases/latest) | [![Docker usage](https://img.shields.io/badge/Docker-Setup-purple)](#docker-usage) | | PKVault.exe | pkvault.flatpak
pkvault.AppImage
pkvault.deb
pkvault.linux | pkvault-osx-arm64.app.zip
pkvault-osx-x64.app.zip | pkvault.flatpak | `ghcr.io/chnapy/pkvault` |