From 8cf8efcbc8531750518cb54eb30c8edc61046a81 Mon Sep 17 00:00:00 2001 From: Tony Yu Date: Tue, 13 Oct 2026 13:28:34 +0800 Subject: [PATCH 1/2] feat: show app version (v0.1.0) in the sidebar footer --- app/electron/main.ts | 2 +- app/electron/preload.ts | 3 +++ app/renderer/canvas-list.tsx | 4 ++++ app/renderer/main.tsx | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/electron/main.ts b/app/electron/main.ts index 38073e1..89877ae 100644 --- a/app/electron/main.ts +++ b/app/electron/main.ts @@ -117,7 +117,7 @@ const createWindow = (token: string): void => { // electron-vite emits the preload as .mjs (ESM); an ESM preload needs sandbox off. preload: join(__dirname, '../preload/preload.mjs'), sandbox: false, - additionalArguments: [`--engine-token=${token}`, `--engine-port=${PORT}`] + additionalArguments: [`--engine-token=${token}`, `--engine-port=${PORT}`, `--app-version=${app.getVersion()}`] } }) mainWindow = win diff --git a/app/electron/preload.ts b/app/electron/preload.ts index 639d81e..bf3d37d 100644 --- a/app/electron/preload.ts +++ b/app/electron/preload.ts @@ -11,6 +11,9 @@ contextBridge.exposeInMainWorld('engine', { token: arg('engine-token') }) +// App version (from package.json via app.getVersion() in main), shown in the sidebar. +contextBridge.exposeInMainWorld('appInfo', { version: arg('app-version') }) + // Native screen-region capture (main runs macOS `screencapture`). contextBridge.exposeInMainWorld('capture', { region: () => ipcRenderer.invoke('capture-region'), diff --git a/app/renderer/canvas-list.tsx b/app/renderer/canvas-list.tsx index 3ab850e..bb32fb4 100644 --- a/app/renderer/canvas-list.tsx +++ b/app/renderer/canvas-list.tsx @@ -163,6 +163,10 @@ export const CanvasList = (): React.ReactElement => { + + v{window.appInfo.version} + + setSettingsOpen(false)} /> Promise<{ cancelled?: boolean; pngBase64?: string; error?: string; appName?: string; url?: string; windowTitle?: string }> saveImage: (dataUrl: string, name: string) => Promise<{ saved?: boolean; path?: string; cancelled?: boolean }> From 768eb53de4ba46edd5a96174700e9fe032ab9988 Mon Sep 17 00:00:00 2001 From: Tony Yu Date: Tue, 13 Oct 2026 13:34:10 +0800 Subject: [PATCH 2/2] ci: manual-trigger release workflow (build DMG + publish GitHub release) workflow_dispatch builds the macOS DMG via electron-builder (ad-hoc signed) and publishes/uploads it to a GitHub release tagged v (or a custom tag input). Re-runnable: uploads with --clobber if the release exists. --- .github/workflows/release.yml | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..eb5c9f1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,51 @@ +name: Release + +# Manual-only CD: build the macOS DMG and publish it as a GitHub release. +on: + workflow_dispatch: + inputs: + tag: + description: "Release tag (default: v from app/package.json)" + required: false + default: "" + +permissions: + contents: write # create releases + upload assets + +jobs: + release: + runs-on: macos-latest # electron-builder needs macOS to produce a .dmg + defaults: + run: + working-directory: app + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + cache-dependency-path: app/package-lock.json + - run: npm ci + - name: Build DMG (ad-hoc signed) + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" # no signing identity; match local ad-hoc build + run: npm run package + - name: Resolve release tag + id: meta + env: + INPUT_TAG: ${{ inputs.tag }} + run: | + VERSION=$(node -p "require('./package.json').version") + TAG="${INPUT_TAG:-v$VERSION}" + echo "tag=$TAG" >> "$GITHUB_OUTPUT" + - name: Publish release + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ steps.meta.outputs.tag }} + run: | + NOTES="Automated release. macOS DMG is ad-hoc signed — on first launch, right-click the app → Open to bypass Gatekeeper." + if gh release view "$TAG" >/dev/null 2>&1; then + gh release upload "$TAG" dist/*.dmg --clobber + else + gh release create "$TAG" --target "$GITHUB_SHA" --title "Fish Notes $TAG" --notes "$NOTES" dist/*.dmg + fi