Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
2a31ee1
feat: inital add electron and port over FE and BE, BE selects port dy…
nicoalee Feb 19, 2026
3ae6c05
fix: bug where dicom search was halted prematurely
nicoalee Mar 5, 2026
128f4db
fix: revert
nicoalee Mar 5, 2026
91c70a3
Merge pull request #156 from brainlife/fix/not-all-files-converted
nicoalee Mar 5, 2026
343fe83
fix: revert pypet2bids import
nicoalee Mar 5, 2026
d721506
Merge pull request #157 from brainlife/fix/not-all-files-converted
nicoalee Mar 5, 2026
0d7fa8d
fix: bug
nicoalee Mar 6, 2026
edb8692
Merge pull request #158 from brainlife/fix/modality-check
nicoalee Mar 6, 2026
8c37af9
feat: updated ezbids with local electron support
nicoalee Mar 18, 2026
3947320
feat: better support for init and fixed some SIGINT issues
nicoalee Mar 19, 2026
fe1d5dd
fix: startup issues
nicoalee Mar 19, 2026
531a8a5
feat: added build github workflow
nicoalee Mar 30, 2026
2fc6497
fix: remove github token
nicoalee Mar 31, 2026
11ce0d5
fix: build step
nicoalee Apr 2, 2026
3570f7b
fix: remove github token
nicoalee Apr 2, 2026
f58d664
fix: more debugging workflow
nicoalee Apr 2, 2026
75b76da
fix: normalize urls
nicoalee Apr 2, 2026
fb7b493
fix: set shell as bash
nicoalee Apr 2, 2026
77599e4
fix: python path for windows
nicoalee Apr 7, 2026
aff4d6a
fix: python path for windows
nicoalee Apr 7, 2026
4aef0a5
fix: python
nicoalee Apr 7, 2026
12920d7
fix: download files for windows issue
nicoalee Apr 8, 2026
b33d871
fix: 7z force format
nicoalee Apr 8, 2026
ad11851
fix: use 7z.dll
nicoalee Apr 8, 2026
f257174
feat: add support for .deb files
nicoalee Apr 8, 2026
11694be
fix: add maintainer info
nicoalee Apr 8, 2026
ccae856
release: add mac signing and notarization pipeline
nicoalee Apr 14, 2026
40fd068
feat: integrated defacing via allineate and fixed minor bugs
nicoalee Apr 14, 2026
966c83e
ci: enable verbose mac packaging logs
nicoalee Apr 14, 2026
ca98108
Revert "ci: enable verbose mac packaging logs"
nicoalee Apr 14, 2026
8b3bcc3
fix: unblock mac packaging signing paths
nicoalee Apr 14, 2026
4c53a88
fix: remove bundled joblib tests before mac notarization
nicoalee Apr 14, 2026
3756267
fix: strip embedded dcm2niix archive from mac runtime
nicoalee Apr 14, 2026
d6c39be
fix: use our bundled dcm2niix instead of default in pypet2bids, remov…
nicoalee Apr 14, 2026
aaf1ce2
ci: strip pooch test zips for mac notarization; retry electron-builder
nicoalee Apr 15, 2026
a79f29b
fix: make verbose
nicoalee Apr 15, 2026
1110274
fix: more debugging
nicoalee Apr 15, 2026
4aa06ff
fix: more debugging
nicoalee Apr 15, 2026
a10020f
fix: more aggressive pruning
nicoalee Apr 15, 2026
98094f3
fix: fix executable mode logic
nicoalee Apr 15, 2026
1d0a47e
fix: removed pruning for now, and fixed windows issues
nicoalee Apr 15, 2026
55ffb21
fix: updated path handling to make platform agnostic
nicoalee Apr 15, 2026
cd36b72
fix: continue despite cog atlas error
nicoalee Apr 15, 2026
e62e3d5
fix: set allineate as defacto option when in desktop mode, added para…
nicoalee Apr 16, 2026
affd11f
fix: remove aftersign
nicoalee Apr 16, 2026
479609f
fix: try again
nicoalee Apr 16, 2026
d4639b6
fix: add dmg size
nicoalee Apr 16, 2026
5816840
fix: broken app path
nicoalee Apr 16, 2026
ec6fc93
fix: ...try again
nicoalee Apr 16, 2026
9de876b
feat: guarded against invalid imaging files
nicoalee Apr 17, 2026
74c2fd3
feat: updated ezbids ui with better improvements, fixed various bugs,…
nicoalee Apr 22, 2026
c2750eb
fix: main and build scripts
nicoalee Apr 22, 2026
a178db6
feat: add unit tests
nicoalee Apr 22, 2026
aee8c7f
chore: resolve merge conflicts
nicoalee Apr 22, 2026
874cac9
fix: test issues
nicoalee Apr 22, 2026
b458772
fix: test paths
nicoalee Apr 22, 2026
fc966be
fix: backend path issues
nicoalee Apr 22, 2026
ef94ac5
fix: update lint staged
nicoalee Apr 22, 2026
efe3ba8
feat: styling and path issues
nicoalee Apr 22, 2026
cfeeb8e
fix: merge conflicts
nicoalee Apr 23, 2026
ec23580
fix: update project with new npm workspace configuration, updated docker
nicoalee Apr 23, 2026
35952de
chore: added documentation
nicoalee Apr 23, 2026
9378839
chore: added documentation
nicoalee Apr 23, 2026
18f23c6
fix: updated version numbers
nicoalee Apr 23, 2026
a83e6ed
fix: pin electron version
nicoalee Apr 23, 2026
c18afef
fix: update lock file
nicoalee Apr 23, 2026
83c1969
fix: faulty user check caused userId 0 to be rejected
nicoalee May 12, 2026
7246f91
Merge pull request #162 from brainlife/hotfix/user-check
nicoalee May 12, 2026
f392e41
chore: update npm package release versions
nicoalee May 12, 2026
c2ee4b5
fix: added smoke test, fixed PET paths, improved UI
nicoalee May 20, 2026
7ecfa6e
Merge pull request #166 from brainlife/hotfix/resolve-pet-path-issues
nicoalee May 20, 2026
76776eb
feat: ui improvements
nicoalee May 20, 2026
442fe63
Merge pull request #168 from brainlife/hotfix/v0.0.5-ui-fix
nicoalee May 20, 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
24 changes: 23 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
ui
# This file applies only to Docker builds whose context is the repo root (`context: .`),
# e.g. the api and ui services in docker-compose.yml. (A ui/.dockerignore is not used when
# context is the repo root — only this file is.) Other services (handler, telemetry)
# use their own build directories, so ignoring paths here does not affect those images.
#
# Shared context rules:
# - api/ must NOT be listed — the API Dockerfile copies ./api; hiding it breaks that image.
# - ui/ must NOT be listed — the UI Dockerfile copies ./ui after npm ci.
#
# handler/ is safe to exclude here — the handler image is built with context ./handler, not
# the repo root, so this ignore list does not apply to that build.
#
# electron/: npm workspaces only require electron/package.json in context for the root
# lockfile. Simple patterns like electron/* would also exclude that file. We exclude
# heavy paths only (node_modules, dist, release); other electron sources may still be
# sent in the context but are small compared to those directories.

handler
workdir
test
bids-specification
node_modules
ui/node_modules
electron/node_modules
electron/dist
electron/release
.git
10 changes: 9 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,13 @@
"no-empty": "error",
"no-empty-function": "error",
"no-floating-decimal": "error"
}
},
"overrides": [
{
"files": ["**/*.test.ts"],
"rules": {
"max-nested-callbacks": ["warn", { "max": 8 }]
}
}
]
}
208 changes: 208 additions & 0 deletions .github/workflows/build-desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
name: Build Desktop App

on:
push:
tags:
- 'v*'

permissions:
contents: write

jobs:
create-release:
runs-on: ubuntu-latest
steps:
- name: Create release
uses: softprops/action-gh-release@v2
with:
name: ${{ github.ref_name }}
draft: false
prerelease: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build:
needs: create-release
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
platform: darwin
arch: arm64
eb_flags: --mac --arm64
- os: windows-latest
platform: windows
arch: amd64
eb_flags: --win --x64
- os: ubuntu-latest
platform: linux
arch: amd64
eb_flags: --linux --x64

runs-on: ${{ matrix.os }}

defaults:
run:
shell: bash

# specify bash for windows
env:
npm_config_script_shell: bash

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install dependencies
run: npm ci

- name: Fetch binaries
run: bash fetch-binaries.sh ${{ matrix.platform }} ${{ matrix.arch }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Remove embedded archives / package test fixtures (mac notarization)
if: matrix.platform == 'darwin'
run: |
PY_SITE="handler/bin/python-runtime/venv/lib/python3.8/site-packages"
# Some vendored Python packages ship test fixtures as zip/tar archives (and sometimes odd perms).
# Apple's notarization pipeline can flag these when bundled inside a signed app.
rm -rf "$PY_SITE/joblib/test"
rm -rf "$PY_SITE/pooch/tests"
# remove dcm2niix_binaries to avoid notarization failure. We will point to the bundled dcm2niix in the app.
# Note that we have pinned pypet2bids to 1.4.6 in requirements.txt, and it uses dcm2niix v1.0.20250505.
# in the future, if we want to upgrade pypet2bids, we must make sure that our version of dcm2niix is compatible and vice versa.
rm -rf "$PY_SITE/pypet2bids/dcm2niix_binaries"

- name: Clean dist
run: rm -rf electron/dist

- name: Build JS bundles
working-directory: electron
run: |
npm run build:electron-api
npm run build:electron-handler
npm run build:electron-handler-scripts

- name: Copy Python files, BIDS schema, and templates
working-directory: electron
run: |
npm run build:electron-python
npm run build:electron-bids-spec
npm run build:electron-templates

- name: Build frontend
working-directory: ui
run: npm run build:electron

- name: Transpile main process
working-directory: electron
run: |
npm run build:electron-preload
npm run build:electron-main

- name: Validate Apple signing secrets
if: matrix.platform == 'darwin'
run: |
test -n "${{ secrets.APPLE_CERTIFICATE_P12_BASE64 }}"
test -n "${{ secrets.APPLE_CERTIFICATE_PASSWORD }}"
test -n "${{ secrets.APPLE_API_KEY_ID }}"
test -n "${{ secrets.APPLE_API_ISSUER }}"
test -n "${{ secrets.APPLE_API_KEY_P8_BASE64 }}"

- name: Import Apple signing certificate
if: matrix.platform == 'darwin'
uses: apple-actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.APPLE_CERTIFICATE_P12_BASE64 }}
p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}

- name: Create Apple API key file
if: matrix.platform == 'darwin'
run: |
API_KEY_PATH="$RUNNER_TEMP/AuthKey_${APPLE_API_KEY_ID}.p8"
# Support both GNU and BSD base64 flags on GitHub runners.
if ! printf '%s' "$APPLE_API_KEY_P8_BASE64" | base64 --decode > "$API_KEY_PATH" 2>/dev/null; then
printf '%s' "$APPLE_API_KEY_P8_BASE64" | base64 -D > "$API_KEY_PATH"
fi
env:
APPLE_API_KEY_P8_BASE64: ${{ secrets.APPLE_API_KEY_P8_BASE64 }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}

- name: Package (macOS signed + notarized)
if: matrix.platform == 'darwin'
working-directory: electron
timeout-minutes: 360
run: |
npx electron-builder ${{ matrix.eb_flags }} &
EB_PID=$!
while kill -0 "$EB_PID" 2>/dev/null; do
echo "[heartbeat] electron-builder still running at $(date -u +'%Y-%m-%dT%H:%M:%SZ')"
ps -axo pid,ppid,etime,command | grep -E "electron-builder|app-builder|codesign|notarytool" | grep -v grep || true
sleep 60
done
wait "$EB_PID"
env:
# Verbose logs: builder-util registers `electron-builder`; @electron/notarize registers `electron-notarize`.
DEBUG: 'electron-builder*,electron-notarize*'
APPLE_API_KEY: ${{ runner.temp }}/AuthKey_${{ secrets.APPLE_API_KEY_ID }}.p8
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}

- name: Package (Windows/Linux)
if: matrix.platform != 'darwin'
working-directory: electron
run: npx electron-builder ${{ matrix.eb_flags }}

- name: Verify macOS code signing and notarization
if: matrix.platform == 'darwin'
working-directory: electron
run: |
# electron-builder puts the .app under release/mac-<arch>/ (not release/*.app).
APP_PATH=$(find release -name '*.app' -type d | head -n 1)
DMG_PATH=$(find release -maxdepth 1 -name '*.dmg' -type f | head -n 1)
if [[ -z "$APP_PATH" || ! -d "$APP_PATH" ]]; then
echo "No .app bundle found under electron/release (expected e.g. release/mac-arm64/*.app):"
find release -maxdepth 4 -type d -print || true
exit 1
fi
if [[ -z "$DMG_PATH" || ! -f "$DMG_PATH" ]]; then
echo "No .dmg found under electron/release:"
ls -la release || true
exit 1
fi

echo "Verifying app signature: $APP_PATH"
codesign --verify --deep --strict --verbose=2 "$APP_PATH"
codesign -dv --verbose=4 "$APP_PATH" 2>&1

# electron-notarize staples the .app; the .dmg is built afterward and usually has no separate ticket.
echo "Validating notarization ticket on app bundle: $APP_PATH"
xcrun stapler validate "$APP_PATH"

echo "Gatekeeper assess app bundle: $APP_PATH"
spctl --assess --verbose=4 "$APP_PATH"

echo "DMG artifact present (notarization ticket is on the .app, not this wrapper): $DMG_PATH"
test -f "$DMG_PATH"

- name: Upload artifacts to release
uses: softprops/action-gh-release@v2
with:
files: |
electron/release/*.dmg
electron/release/*.exe
electron/release/*.AppImage
electron/release/*.deb
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
60 changes: 60 additions & 0 deletions .github/workflows/desktop-smoke-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Desktop pack smoke test

on:
push:
tags:
- 'v*'
workflow_dispatch:

permissions:
contents: read

jobs:
smoke-test:
name: Pack and verify binaries (${{ matrix.platform }}-${{ matrix.arch }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
platform: darwin
arch: arm64
- os: ubuntu-latest
platform: linux
arch: amd64
- os: windows-latest
platform: windows
arch: amd64

defaults:
run:
shell: bash

env:
npm_config_script_shell: bash
EZBIDS_PLATFORM: ${{ matrix.platform }}
EZBIDS_ARCH: ${{ matrix.arch }}

steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: npm

- name: Install dependencies
run: npm ci

- name: Fetch binaries
run: ./fetch-binaries.sh ${{ matrix.platform }} ${{ matrix.arch }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Pack test app and smoke test binaries
run: npm run electron:pack-test && npm run electron:smoke-test
30 changes: 30 additions & 0 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
name: Jest Unit Tests

on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:

jobs:
jest:
name: Run Jest unit tests
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: npm

- name: Install dependencies
run: npm ci

- name: Run unit tests
run: npm test -- --ci
38 changes: 33 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,36 @@ api/config.json

handler/container/ROBEXv12.linux64.tar.gz

api/*.pub
api/*.key
api/ezbids.key
api/*.js
api/*.js.map
api/**/*.pub
api/**/*.key
api/**/*.key
api/**/*.js
api/**/*.js.map
api/**/*.cjs
api/**/*.cjs.map

handler/**/*.js
handler/**/*.js.map
handler/**/*.cjs
handler/**/*.cjs.map
handler/bin/*
handler/*.js
handler/*.js.map
handler/*.cjs
handler/*.log

tmp/*

electron/node_modules
electron/dist
electron/dist/*
electron/build
electron/release
electron/**/*.js
electron/dist/*
electron/**/*.js
electron/**/*.js.map
electron/**/*.cjs
electron/**/*.cjs.map
electron/ezbids.key
electron/ezbids.pub
3 changes: 2 additions & 1 deletion .lintstagedrc.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
{
"**/*.{js,json,ts,vue}": ["npm run style-check", "npm run lint-check"]
"**/*.{js,json,ts,vue}": ["npm run style-check", "npm run lint-check"],
"**/*.{js,ts,vue}": ["npm run test -- --findRelatedTests --passWithNoTests"]
}
Loading
Loading