From 7ff734aa8102da4182845fc98b855da7bbc28c06 Mon Sep 17 00:00:00 2001 From: qlrd <106913782+qlrd@users.noreply.github.com> Date: Mon, 18 Dec 2023 10:46:25 -0300 Subject: [PATCH 01/13] major updates on main libraries refacftored test renamed tests to .mts extension updated README.md --- .github/workflows/build-linux-appimage.yml | 4 +- .github/workflows/build-mac-dmg.yml | 2 +- .github/workflows/build-windows-nsis.yml | 10 +- .vscode/.e2e.env | 3 +- CHANGELOG.md | 40 ++------ README.md | 29 +++++- electron/main/index.ts | 65 ++++--------- electron/preload/index.ts | 24 +---- images/vscodium.png | Bin 0 -> 21656 bytes images/vscodium_debug.png | Bin 0 -> 22362 bytes lib/storage.ts | 5 - package.json | 22 ++--- test/e2e/pageobjects/app.page.ts | 26 ++--- test/e2e/specs/000.create-config.spec.mts | 37 ++++++++ test/e2e/specs/000.create-config.spec.ts | 52 ---------- test/e2e/specs/001.check-config.spec.mts | 89 ++++++++++++++++++ test/e2e/specs/001.check-config.spec.ts | 80 ---------------- test/e2e/specs/002.app-startup.spec.mts | 28 ++++++ test/e2e/specs/002.app-startup.spec.ts | 23 ----- ...app-logo.spec.ts => 003.app-logo.spec.mts} | 12 +-- ...app-consoleload-before-main-page.spec.mts} | 29 +++--- ...in-menu.spec.ts => 005.main-menu.spec.mts} | 23 +++-- ...s => 006.select-device-show-only.spec.mts} | 38 ++++---- ...ts => 007.select-device-m5stickv.spec.mts} | 14 +-- ...s => 008.select-device-amigo-ips.spec.mts} | 14 +-- ...s => 009.select-device-amigo-tft.spec.mts} | 15 +-- ...spec.ts => 010.select-device-bit.spec.mts} | 14 +-- ...pec.ts => 011.select-device-dock.spec.mts} | 14 +-- ...pec.ts => 012.select-device-back.spec.mts} | 14 +-- ... => 013.select-version-show-only.spec.mts} | 28 +++--- ...-version-selfcustody-release-zip.spec.mts} | 40 ++++---- ...wnloaded-selfcustody-release-zip.spec.mts} | 50 +++++----- ...dy-release-zip-click-back-button.spec.mts} | 18 ++-- ...se-zip-click-show-details-button.spec.mts} | 49 +++++----- ...release-zip-click-download-again.spec.mts} | 26 +++-- ...release-zip-click-proceed-button.spec.mts} | 12 +-- ...n-selfcustody-release-zip-sha256.spec.mts} | 33 ++++--- ...d-selfcustody-release-zip-sha256.spec.mts} | 50 +++++----- ...ase-zip-sha256-click-back-button.spec.mts} | 18 ++-- ...sha256-click-show-details-button.spec.mts} | 50 +++++----- ...a256-click-download-again-button.spec.mts} | 27 +++--- ...-zip-sha256-click-proceed-button.spec.mts} | 13 +-- ...sion-selfcustody-release-zip-sig.spec.mts} | 33 +++---- ...aded-selfcustody-release-zip-sig.spec.mts} | 53 +++++------ ...elease-zip-sig-click-back-button.spec.mts} | 21 ++--- ...ease-zip-sig-show-details-button.spec.mts} | 50 +++++----- ...se-zip-sig-download-again-button.spec.mts} | 27 +++--- ...ase-zip-sig-click-proceed-button.spec.mts} | 13 +-- ...2-select-version-selfcustody-pem.spec.mts} | 27 +++--- ...ready-downloaded-selfcustody-pem.spec.mts} | 49 +++++----- ...elfcustody-pem-click-back-button.spec.mts} | 21 ++--- ...fcustody-pem-show-details-button.spec.mts} | 44 ++++----- ...ustody-pem-download-again-button.spec.mts} | 25 +++-- ...custody-pem-click-proceed-button.spec.mts} | 13 +-- ...38-check-verify-official-release.spec.mts} | 15 ++- ...=> 039-verified-official-release.spec.mts} | 53 ++++++----- vite.config.ts | 2 +- wdio.conf.mts | 66 +++---------- 58 files changed, 763 insertions(+), 889 deletions(-) create mode 100644 images/vscodium.png create mode 100644 images/vscodium_debug.png create mode 100644 test/e2e/specs/000.create-config.spec.mts delete mode 100644 test/e2e/specs/000.create-config.spec.ts create mode 100644 test/e2e/specs/001.check-config.spec.mts delete mode 100644 test/e2e/specs/001.check-config.spec.ts create mode 100644 test/e2e/specs/002.app-startup.spec.mts delete mode 100644 test/e2e/specs/002.app-startup.spec.ts rename test/e2e/specs/{003.app-logo.spec.ts => 003.app-logo.spec.mts} (79%) rename test/e2e/specs/{004.app-consoleload-before-main-page.spec.ts => 004.app-consoleload-before-main-page.spec.mts} (66%) rename test/e2e/specs/{005.main-menu.spec.ts => 005.main-menu.spec.mts} (68%) rename test/e2e/specs/{006.select-device-show-only.spec.ts => 006.select-device-show-only.spec.mts} (69%) rename test/e2e/specs/{007.select-device-m5stickv.spec.ts => 007.select-device-m5stickv.spec.mts} (80%) rename test/e2e/specs/{008.select-device-amigo-ips.spec.ts => 008.select-device-amigo-ips.spec.mts} (80%) rename test/e2e/specs/{009.select-device-amigo-tft.spec.ts => 009.select-device-amigo-tft.spec.mts} (80%) rename test/e2e/specs/{010.select-device-bit.spec.ts => 010.select-device-bit.spec.mts} (80%) rename test/e2e/specs/{011.select-device-dock.spec.ts => 011.select-device-dock.spec.mts} (80%) rename test/e2e/specs/{012.select-device-back.spec.ts => 012.select-device-back.spec.mts} (80%) rename test/e2e/specs/{013.select-version-show-only.spec.ts => 013.select-version-show-only.spec.mts} (72%) rename test/e2e/specs/{014.select-version-selfcustody-release-zip.spec.ts => 014.select-version-selfcustody-release-zip.spec.mts} (66%) rename test/e2e/specs/{015.already-downloaded-selfcustody-release-zip.spec.ts => 015.already-downloaded-selfcustody-release-zip.spec.mts} (63%) rename test/e2e/specs/{016.already-downloaded-selfcustody-release-zip-click-back-button.spec.ts => 016.already-downloaded-selfcustody-release-zip-click-back-button.spec.mts} (84%) rename test/e2e/specs/{017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.ts => 017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.mts} (69%) rename test/e2e/specs/{018.already-downloaded-selfcustody-release-zip-click-download-again.spec.ts => 018.already-downloaded-selfcustody-release-zip-click-download-again.spec.mts} (79%) rename test/e2e/specs/{019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.ts => 019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.mts} (89%) rename test/e2e/specs/{020.select-version-selfcustody-release-zip-sha256.spec.ts => 020.select-version-selfcustody-release-zip-sha256.spec.mts} (74%) rename test/e2e/specs/{021.already-downloaded-selfcustody-release-zip-sha256.spec.ts => 021.already-downloaded-selfcustody-release-zip-sha256.spec.mts} (67%) rename test/e2e/specs/{022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.ts => 022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.mts} (85%) rename test/e2e/specs/{023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.ts => 023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.mts} (71%) rename test/e2e/specs/{024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.ts => 024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.mts} (78%) rename test/e2e/specs/{025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.ts => 025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.mts} (89%) rename test/e2e/specs/{026.select-version-selfcustody-release-zip-sig.spec.ts => 026.select-version-selfcustody-release-zip-sig.spec.mts} (76%) rename test/e2e/specs/{027.already-downloaded-selfcustody-release-zip-sig.spec.ts => 027.already-downloaded-selfcustody-release-zip-sig.spec.mts} (69%) rename test/e2e/specs/{028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.ts => 028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.mts} (85%) rename test/e2e/specs/{029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.ts => 029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.mts} (72%) rename test/e2e/specs/{030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.ts => 030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.mts} (81%) rename test/e2e/specs/{031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.ts => 031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.mts} (90%) rename test/e2e/specs/{032-select-version-selfcustody-pem.spec.ts => 032-select-version-selfcustody-pem.spec.mts} (82%) rename test/e2e/specs/{033.already-downloaded-selfcustody-pem.spec.ts => 033.already-downloaded-selfcustody-pem.spec.mts} (72%) rename test/e2e/specs/{034.already-downloaded-selfcustody-pem-click-back-button.spec.ts => 034.already-downloaded-selfcustody-pem-click-back-button.spec.mts} (86%) rename test/e2e/specs/{035.already-downloaded-selfcustody-pem-show-details-button.spec.ts => 035.already-downloaded-selfcustody-pem-show-details-button.spec.mts} (76%) rename test/e2e/specs/{036.already-downloaded-selfcustody-pem-download-again-button.spec.ts => 036.already-downloaded-selfcustody-pem-download-again-button.spec.mts} (84%) rename test/e2e/specs/{037.already-downloaded-selfcustody-pem-click-proceed-button.spec.ts => 037.already-downloaded-selfcustody-pem-click-proceed-button.spec.mts} (91%) rename test/e2e/specs/{038-check-verify-official-release.spec.ts => 038-check-verify-official-release.spec.mts} (92%) rename test/e2e/specs/{039-verified-official-release.spec.ts => 039-verified-official-release.spec.mts} (75%) diff --git a/.github/workflows/build-linux-appimage.yml b/.github/workflows/build-linux-appimage.yml index 4ebb3bf0..55c0ae81 100644 --- a/.github/workflows/build-linux-appimage.yml +++ b/.github/workflows/build-linux-appimage.yml @@ -19,7 +19,7 @@ jobs: - name: Install node uses: actions/setup-node@v3 with: - node-version: 18 + node-version: "20.10.0" - name: Variables helpers id: setup @@ -64,7 +64,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v3 - #if: ${{ github.ref_name == 'main' }} + if: ${{ github.ref_name == 'main' }} with: name: ${{ runner.os }}-${{ steps.setup.outputs.app-name }}-AppImage retention-days: 5 diff --git a/.github/workflows/build-mac-dmg.yml b/.github/workflows/build-mac-dmg.yml index cb787ddb..9a3e13e9 100644 --- a/.github/workflows/build-mac-dmg.yml +++ b/.github/workflows/build-mac-dmg.yml @@ -19,7 +19,7 @@ jobs: - name: Install node uses: actions/setup-node@v3 with: - node-version: 18 + node-version: "20.10.0" - name: Variables helpers id: setup diff --git a/.github/workflows/build-windows-nsis.yml b/.github/workflows/build-windows-nsis.yml index 6566d9db..a3f0d16f 100644 --- a/.github/workflows/build-windows-nsis.yml +++ b/.github/workflows/build-windows-nsis.yml @@ -17,19 +17,19 @@ jobs: - name: Install node uses: actions/setup-node@v3 with: - node-version: 18 + node-version: "20.10.0" - name: Variables helpers id: setup shell: pwsh run: | $loc = Get-Location - $firmware_version = "v23.09.0" + $firmware_version = "v23.09.1" $zipname = "krux-$firmware_version.zip" $signame = "krux-$firmware_version.zip.sig" $pemname = "selfcustody.pem" $extraResources = "$loc\extraResources" - $opensslVersion = "3.1.3" + $opensslVersion = "3.2.0" $release_url = "https://github.com/selfcustody/krux/releases/download" $raw_url = "https://raw.githubusercontent.com/selfcustody/krux/main" $app_version = node -e "console.log(require('./package.json').version)" @@ -128,7 +128,7 @@ jobs: - name: Install chromedriver.exe shell: pwsh run: | - $url = "https://chromedriver.storage.googleapis.com/106.0.5249.61/chromedriver_win32.zip" + $url = "https://chromedriver.storage.googleapis.com/120.0.6099.56/chromedriver_win32.zip" $tmp_path = ".\chromedriver_win32.zip" $dest_path = "node_modules\chromedriver\bin" Invoke-WebRequest -Uri $url -OutFile $tmp_path @@ -169,7 +169,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v3 - #if: ${{ github.ref_name == 'main' }} + if: ${{ github.ref_name == 'main' }} with: name: ${{ runner.os}}-${{ steps.setup.outputs.app-name }}-Nsis retention-days: 5 diff --git a/.vscode/.e2e.env b/.vscode/.e2e.env index d2cc6e73..1a3ca42b 100644 --- a/.vscode/.e2e.env +++ b/.vscode/.e2e.env @@ -1 +1,2 @@ -DEBUG=krux:* \ No newline at end of file +DEBUG=krux:* +NODE_ENV=test \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index db6dbaa1..1449d879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,33 +1,13 @@ -## 2022-10-03 +# 0.0.1 -[v2.1.0](https://github.com/electron-vite/electron-vite-vue/pull/267) +- Updated main dependencies: + - `electron`: 28.0.0; + - `vite-plugin-electron`: 0.15.5; + - `wdio-electron-service`: 6.0.2. -- `vite-electron-plugin` is Fast, and WYSIWYG. 🌱 -- last-commit: db2e830 v2.1.0: use `vite-electron-plugin` instead `vite-plugin-electron` +- Refactored `test/e2e/specs`: + - to suit `wdio-electron-service` major updates that break E2E tests; + - renamed extensions to `mts` to suit `vite-plugin-electron`; + - updated krux firmware version checks to `23.09.1`. -## 2022-06-04 - -[v2.0.0](https://github.com/electron-vite/electron-vite-vue/pull/156) - -- 🖖 Based on the `vue-ts` template created by `npm create vite`, integrate `vite-plugin-electron` -- ⚡️ More simplify, is in line with Vite project structure -- last-commit: a15028a (HEAD -> main) feat: hoist `process.env` - -## 2022-01-30 - -[v1.0.0](https://github.com/electron-vite/electron-vite-vue/releases/tag/v1.0.0) - -- ⚡️ Main、Renderer、preload, all built with vite - -## 2022-01-27 -- Refactor the scripts part. -- Remove `configs` directory. - -## 2021-11-11 -- Refactor the project. Use vite.config.ts build `Main-process`, `Preload-script` and `Renderer-process` alternative rollup. -- Scenic `Vue>=3.2.13`, `@vue/compiler-sfc` is no longer necessary. -- If you prefer Rollup, Use rollup branch. - -```bash -Error: @vitejs/plugin-vue requires vue (>=3.2.13) or @vue/compiler-sfc to be present in the dependency tree. -``` +- Updated `openssl` for windows to `3.2.0`. diff --git a/README.md b/README.md index 69afc0a7..a7114222 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,6 @@ For more information, see [flash the firmware onto the device](https://selfcusto - MacOS -**Help Wanted**: we need mac users! - ## Install - See [releases page](https://github.com/selfcustody/krux-installer/releases); @@ -102,6 +100,13 @@ if you want to show some debug messages: DEBUG=krux:* yarn run dev ``` +##### VSCode/VSCodium + +If you're codding with VSCode/VSCodium, go to `Run and Debug` +tab and select `Debug App`: + +![VScodium Debug](images/vscodium_debug.png) + ### Test #### Prepare tests @@ -159,6 +164,22 @@ In linux/mac: DEBUG=krux:* yarn run build -- ``` +##### Run tests + +To run all tests in command line: + +```bash +NODE_ENV=test yarn run e2e +``` + +##### VSCode/VSCodium + +If you're codding with VSCode/VSCodium, the `NODE_ENV` +variable is already configured. To run, tests, go to `Run and Debug` +tab and select `Test E2E App`: + +![VScodium E2E test](images/vscodium.png) + ##### Filter tests Additionaly, you can filter some tests with @@ -168,13 +189,13 @@ For example, if you want to exclude tests until `25th` test, you can do this: ```bash -yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.ts' +yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts' ``` if you want to debug some messages: ```bash -DEBUG=krux:* yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.ts' +DEBUG=krux:* yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts' ``` #### WARNING: Builtin OpenSSL for windows in KruxInstaller diff --git a/electron/main/index.ts b/electron/main/index.ts index 5e1f77ae..1513727a 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -20,92 +20,67 @@ const kruxInstaller = new App(`KruxInstaller | v${version}`) kruxInstaller.start(async ({ app, win, ipcMain}) => { // Create storage const storageBuilder = new Storage(app) - const store = await storageBuilder.build() + app.store = await storageBuilder.build() // Reset configurations - store.set('device', 'Select device') - store.set('version', 'Select version') - store.set('versions', []) + app.store.set('device', 'Select device') + app.store.set('version', 'Select version') + app.store.set('versions', []) // Create download resource handler - const changePage = new ChangePageHandler(win, store, ipcMain) + const changePage = new ChangePageHandler(win, app.store, ipcMain) changePage.build() // Create download resource handler - const downloadResource = new DownloadResourcesHandler(win, store, ipcMain) + const downloadResource = new DownloadResourcesHandler(win, app.store, ipcMain) downloadResource.build() // Create check resource handler - const checkResource = new CheckResourcesHandler(win, store, ipcMain) + const checkResource = new CheckResourcesHandler(win, app.store, ipcMain) checkResource.build() // Create unzip resource handler - const unzipResource = new UnzipResourceHandler(win, store, ipcMain) + const unzipResource = new UnzipResourceHandler(win, app.store, ipcMain) unzipResource.build() // Create fetcher for newest official release handler - const verifyOfficialReleasesFetch = new VerifyOfficialReleasesFetchHandler(win, store, ipcMain) + const verifyOfficialReleasesFetch = new VerifyOfficialReleasesFetchHandler(win, app.store, ipcMain) verifyOfficialReleasesFetch.build() // Create handler for official release sha256.txt - const verifyOfficialReleasesHash = new VerifyOfficialReleasesHashHandler(win, store, ipcMain) + const verifyOfficialReleasesHash = new VerifyOfficialReleasesHashHandler(win, app.store, ipcMain) verifyOfficialReleasesHash.build() // Create handler for official release .sig and .pem handler - const verifyOfficialReleasesSign = new VerifyOfficialReleasesSignHandler(win, store, ipcMain) + const verifyOfficialReleasesSign = new VerifyOfficialReleasesSignHandler(win, app.store, ipcMain) verifyOfficialReleasesSign.build() // Create handler for verify existence of openssl - const verifyOpenssl = new VerifyOpensslHandler(win, store, ipcMain) + const verifyOpenssl = new VerifyOpensslHandler(win, app.store, ipcMain) verifyOpenssl.build() // Create store setter handler - const storeSet = new StoreSetHandler(win, store, ipcMain) + const storeSet = new StoreSetHandler(win, app.store, ipcMain) storeSet.build() // Create store getter handler - const storeGet = new StoreGetHandler(win, store, ipcMain) + const storeGet = new StoreGetHandler(win, app.store, ipcMain) storeGet.build() // Create 'check if it will flash' handler - const checkIfItWillFlashHandler = new CheckIfItWillFlashHandler(win, store, ipcMain) + const checkIfItWillFlashHandler = new CheckIfItWillFlashHandler(win, app.store, ipcMain) checkIfItWillFlashHandler.build() // Create flash' handler - const flashHandler = new FlashHandler(win, store, ipcMain) + const flashHandler = new FlashHandler(win, app.store, ipcMain) flashHandler.build() // Create Wdio test handlers // if environment variable WDIO_ELECTRON equals 'true' - if (process.env.TEST === 'true' && process.env.WDIO_ELECTRON === 'true') { - win.webContents.send('building ipcMain.handle for \'wdio-electron.app\'') - ipcMain.handle('wdio-electron.app', (_event, funcName, ...args) => { - const appProp = app[funcName]; - if (typeof appProp === 'function') { - return appProp.apply(app, args); - } - return appProp; - }); - - win.webContents.send('building ipcMain.handle for \'wdio-electron\'') - ipcMain.handle('wdio-electron', (_events, ...args) => { - return { - appData: app.getPath('appData'), - documents: app.getPath('documents'), - store: { - appVersion: store.get('appVersion'), - resources: store.get('resources'), - os: store.get('os'), - versions: store.get('versions'), - version: store.get('version'), - device: store.get('device'), - sdcard: store.get('sdcard'), - showFlash: store.get('showFlash') - } - } + if (process.env.NODE_ENV === 'test') { + const _electron = await import('electron') + ipcMain.handle("wdio-electron.execute", (_, script, args) => { + return new Function(`return (${script}).apply(this, arguments)`)(_electron, ...args); }) - } else { - win.webContents.send("skip build ipcMain.handle for 'wdio-electron.app'") - win.webContents.send("skip build ipcMain.handle for 'wdio-electron'") } }) diff --git a/electron/preload/index.ts b/electron/preload/index.ts index a676f89b..4b0551e6 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -4,28 +4,10 @@ ipcRenderer.on('main-process-message', (_event, args) => { console.log(args) }) -if (process.env.TEST === 'true') { - const validChannels = [ - 'wdio-electron', - 'wdio-electron.app' - ]; - const invoke = async (channel, ...data) => { - if (!validChannels.includes(channel)) { - throw new Error(`Channel "${channel}" is invalid`); - } - if (!process.env.WDIO_ELECTRON) { - throw new Error('Electron APIs can not be invoked outside of WDIO'); - } - return ipcRenderer.invoke(channel, ...data); - }; +if (process.env.NODE_ENV === 'test') { contextBridge.exposeInMainWorld('wdioElectron', { - app: { - invoke: (funcName, ...args) => invoke('wdio-electron.app', funcName, ...args), - }, - custom: { - invoke: (...args) => invoke('wdio-electron', ...args), - } - }); + execute: (script, args) => ipcRenderer.invoke("wdio-electron.execute", script, args) + }) } contextBridge.exposeInMainWorld('api', { diff --git a/images/vscodium.png b/images/vscodium.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb725252a17dae5e93e8840853761c723596aae GIT binary patch literal 21656 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 qnq)LyCEek5BxtHHk-RkAj>XO%LKC;kuXV#dP& literal 0 HcmV?d00001 diff --git a/images/vscodium_debug.png b/images/vscodium_debug.png new file mode 100644 index 0000000000000000000000000000000000000000..eec8d70290a904597f9f72d6b1ef239626899c77 GIT binary patch literal 22362 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 literal 0 HcmV?d00001 diff --git a/lib/storage.ts b/lib/storage.ts index 4bed2654..271ae858 100644 --- a/lib/storage.ts +++ b/lib/storage.ts @@ -46,9 +46,6 @@ export default class Storage extends Base { type: 'string', regex: /maixpy_(m5stickv5|amigo|dock|bit)/g }, - sdcard: { - type: 'string' - }, showFlash: { type: 'boolean' } @@ -126,7 +123,6 @@ export default class Storage extends Base { const versions = [] const version = 'Select version' const device = 'Select device' - const sdcard = '' let isMac10 = false const showFlash = false @@ -141,7 +137,6 @@ export default class Storage extends Base { store.set('versions', versions) store.set('version', version) store.set('device', device) - store.set('sdcard', sdcard) store.set('showFlash', showFlash) const keys = Object.keys(this.config) diff --git a/package.json b/package.json index 66436e04..10c22edb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "krux-installer", - "version": "0.0.1-beta", - "revision": "2f0ee130", + "version": "0.0.1", "main": "dist-electron/main/index.js", "description": "Graphical User Interface to download, verify and flash Krux´s firmware on Kendryte K210 hardwares as bitcoin signature devices", "author": "qlrd <106913782+qlrd@users.noreply.github.com>", @@ -26,7 +25,8 @@ }, "e2e": { "env": { - "DEBUG": "krux:*" + "DEBUG": "krux:*", + "NODE_ENV": "test" }, "run": "echo Running E2E" } @@ -36,8 +36,8 @@ "build": "vue-tsc --noEmit && vite build && electron-builder", "preview": "vite preview", "e2e": "wdio run wdio.conf.mts", - "lint:md": "markdownlint README.md --ignore node_modules", - "make:revision": "sha256sum yarn.lock | cut -c -8" + "lint:readme": "markdownlint README.md --ignore node_modules", + "lint:changelog": "markdownlint CHANGELOG.md --ignore node_modules" }, "devDependencies": { "@babel/cli": "^7.22.9", @@ -56,22 +56,22 @@ "@wdio/mocha-framework": "^8.12.1", "@wdio/spec-reporter": "^8.12.2", "chai": "^4.3.7", - "electron": "^27.0.2", + "electron": "^28.0.0", "electron-builder": "^24.4.0", "glob": "^10.3.3", - "markdownlint-cli": "^0.37.0", + "markdownlint-cli": "^0.38.0", "mocha": "^10.2.0", "os-lang": "^3.1.1", "rimraf": "^5.0.1", "ts-node": "^10.9.1", "typescript": "^5.1.6", - "vite": "^4.4.6", - "vite-plugin-electron": "^0.14.1", + "vite": "^5.0.10", + "vite-plugin-electron": "^0.15.5", "vite-plugin-electron-renderer": "^0.14.1", "vite-plugin-html": "^3.2.0", "vue": "^3.2.47", "vue-tsc": "^1.8.6", - "wdio-electron-service": "^5.3.0" + "wdio-electron-service": "^6.0.2" }, "dependencies": { "@o/electron-sudo": "^2.8.23", @@ -80,7 +80,7 @@ "command-exists": "^1.2.9", "debug": "^4.3.4", "electron-store": "^8.1.0", - "vite-plugin-vuetify": "^1.0.2", + "vite-plugin-vuetify": "^2.0.1", "vue-asciimorph": "^0.0.3", "vuetify": "^3.3.9", "yauzl": "^2.10.0" diff --git a/test/e2e/pageobjects/app.page.ts b/test/e2e/pageobjects/app.page.ts index da63b237..6341734c 100644 --- a/test/e2e/pageobjects/app.page.ts +++ b/test/e2e/pageobjects/app.page.ts @@ -148,10 +148,10 @@ class App { this.__select_device_page_maixpy_back_text__ = 'div#select-device-page-back-text' this.__select_version_page__ = 'div#select-version-page'; - this.__select_version_page_selfcustody_button__ = 'div#select-version-page-selfcustody-krux-releases-tag-v23-09-0-button' + this.__select_version_page_selfcustody_button__ = 'div#select-version-page-selfcustody-krux-releases-tag-v23-09-1-button' this.__select_version_page_back_button__ = 'div#select-version-page-back-button' this.__select_version_page_odudex_button__ = 'div#select-version-page-odudex-krux-binaries-button' - this.__select_version_page_selfcustody_text__ = 'div#select-version-page-selfcustody-krux-releases-tag-v23-09-0-text' + this.__select_version_page_selfcustody_text__ = 'div#select-version-page-selfcustody-krux-releases-tag-v23-09-1-text' this.__select_version_page_odudex_text__ = 'div#select-version-page-odudex-krux-binaries-text' this.__select_version_page_back_text__ = 'div#select-version-page-back-text' @@ -162,22 +162,22 @@ class App { this.__download_official_release_zip_subtitle__ = 'div#download-official-release-zip-page-subtitle' this.__download_official_release_zip_progress__ = 'div#download-official-release-zip-page-progress' - this.__checking_release_zip_msg__ = 'pre#checking-v23-09-0-krux-v23-09-0-zip' - this.__not_found_release_zip_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-not-found' - this.__found_release_zip_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-found' + this.__checking_release_zip_msg__ = 'pre#checking-v23-09-1-krux-v23-09-1-zip' + this.__not_found_release_zip_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-not-found' + this.__found_release_zip_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-found' - this.__checking_release_zip_sha256_txt_msg__ = 'pre#checking-v23-09-0-krux-v23-09-0-zip-sha256-txt' - this.__not_found_release_zip_sha256_txt_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-sha256-txt-not-found' - this.__found_release_zip_sha256_txt_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-sha256-txt-found' + this.__checking_release_zip_sha256_txt_msg__ = 'pre#checking-v23-09-1-krux-v23-09-1-zip-sha256-txt' + this.__not_found_release_zip_sha256_txt_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-sha256-txt-not-found' + this.__found_release_zip_sha256_txt_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-sha256-txt-found' this.__download_official_release_zip_sha256_txt_page__ = 'div#download-official-release-zip-sha256-txt-page' this.__download_official_release_zip_sha256_txt_page_title__ = 'div#download-official-release-zip-sha256-txt-page-title' this.__download_official_release_zip_sha256_txt_page_subtitle__ = 'div#download-official-release-zip-sha256-txt-page-subtitle' this.__download_official_release_zip_sha256_txt_page_progress__ = 'div#download-official-release-zip-sha256-txt-page-progress' - this.__checking_release_zip_sig_msg__ = 'pre#checking-v23-09-0-krux-v23-09-0-zip-sig' - this.__not_found_release_zip_sig_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-sig-not-found' - this.__found_release_zip_sig_msg__ = 'pre#v23-09-0-krux-v23-09-0-zip-sig-found' + this.__checking_release_zip_sig_msg__ = 'pre#checking-v23-09-1-krux-v23-09-1-zip-sig' + this.__not_found_release_zip_sig_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-sig-not-found' + this.__found_release_zip_sig_msg__ = 'pre#v23-09-1-krux-v23-09-1-zip-sig-found' this.__download_official_release_zip_sig_page__ = 'div#download-official-release-zip-sig-page' this.__download_official_release_zip_sig_title__ = 'div#download-official-release-zip-sig-page-title' @@ -216,8 +216,8 @@ class App { this.__verified_official_release_page__ = 'div#verified-official-release-page' this.__verified_official_release_page_sha256_integrity_title__ = 'div#verified-official-release-page-sha256-integrity-title' - this.__verified_official_release_page_sha256_integrity_txt__ = 'div#verified-official-release-page-sha256-integrity-v23-09-0-krux-v23-09-0-zip-sha256-txt' - this.__verified_official_release_page_sha256_integrity__ = 'div#verified-official-release-page-sha256-integrity-v23-09-0-krux-v23-09-0-zip' + this.__verified_official_release_page_sha256_integrity_txt__ = 'div#verified-official-release-page-sha256-integrity-v23-09-1-krux-v23-09-1-zip-sha256-txt' + this.__verified_official_release_page_sha256_integrity__ = 'div#verified-official-release-page-sha256-integrity-v23-09-1-krux-v23-09-1-zip' this.__verified_official_release_page_signature_title__ = 'div#verified-official-release-page-signature-title' this.__verified_official_release_page_signature_command__ = 'span#verified-official-release-page-signature-command' this.__verified_official_release_page_signature_result__ = 'span#verified-official-release-page-signature-result' diff --git a/test/e2e/specs/000.create-config.spec.mts b/test/e2e/specs/000.create-config.spec.mts new file mode 100644 index 00000000..77caeee3 --- /dev/null +++ b/test/e2e/specs/000.create-config.spec.mts @@ -0,0 +1,37 @@ +import { readdir, readFile } from 'fs/promises' +import { join } from 'path' +import { expect } from 'chai' +import { browser } from '@wdio/globals' +import { describe, it } from 'mocha' +import { createRequire } from 'module' +const { version } = createRequire(import.meta.url)('../../../package.json') + +describe('KruxInstaller configuration', () => { + + it('should \'appData\' path exist with \'krux-installer\' directory', async () => { + const appData = await browser.electron.execute(function (electron) { + return electron.app.getPath('appData') + }) + const list = await readdir(appData) + expect(list.includes('krux-installer')).to.be.true + }) + + it('should \'config.json\' file exists inside \'krux-installer\' directory', async () => { + const appData = await browser.electron.execute(function (electron) { + return electron.app.getPath('appData') + }) + const dir = join(appData, 'krux-installer') + const list = await readdir(dir) + expect(list.includes('config.json')).to.be.true + }) + + it('should \'config.json\' be a readable string', async () => { + const appData = await browser.electron.execute(function (electron) { + return electron.app.getPath('appData') + }) + const filePath = join(appData, 'krux-installer', 'config.json') + const file = await readFile(filePath, 'utf-8') + expect(file).to.be.a('string') + }) + +}) diff --git a/test/e2e/specs/000.create-config.spec.ts b/test/e2e/specs/000.create-config.spec.ts deleted file mode 100644 index 75399f01..00000000 --- a/test/e2e/specs/000.create-config.spec.ts +++ /dev/null @@ -1,52 +0,0 @@ -const { readdir, readFile } = require('fs/promises') -const { join } = require('path') -const expectChai = require('chai').expect -const { browser } = require('@wdio/globals') -const { describe, it } = require('mocha') -const { version } = require('../../../package.json') - -describe('KruxInstaller configuration', () => { - - it('should \'appData\' path exist with \'krux-installer\' directory', async () => { - try { - const api = await browser.electron.api() as Record - const list = await readdir(api.appData) - expectChai(list.includes('krux-installer')).to.be.true - } catch (error) { - console.log(error) - } - }) - - it('should \'documents\' path exist with \'krux-installer\' directory', async () => { - try { - const api = await browser.electron.api() as Record - const list = await readdir(api.documents) - expectChai(list.includes('krux-installer')).to.be.true - } catch (error) { - console.log(error) - } - }) - - it('should \'config.json\' file exists inside \'krux-installer\' directory', async () => { - try { - const api = await browser.electron.api() as Record - const dir = join(api.appData, 'krux-installer') - const list = await readdir(dir) - expectChai(list.includes('config.json')).to.be.true - } catch (error) { - console.log(error) - } - }) - - it('should \'config.json\' be a readable string', async () => { - try { - const api = await browser.electron.api() as Record - const filePath = join(api.appData, 'krux-installer', 'config.json') - const file = await readFile(filePath) - expectChai(file).to.be.a('string') - } catch (error) { - console.log(error) - } - }) - -}) diff --git a/test/e2e/specs/001.check-config.spec.mts b/test/e2e/specs/001.check-config.spec.mts new file mode 100644 index 00000000..2d6b2303 --- /dev/null +++ b/test/e2e/specs/001.check-config.spec.mts @@ -0,0 +1,89 @@ +import { expect } from 'chai' +import { browser } from '@wdio/globals' +import { describe, it } from 'mocha' +import { createRequire } from 'module' +const { version } = createRequire(import.meta.url)('../../../package.json') + +describe('Check created configuration', () => { + + it('should \'appVersion\' property be equal to the defined in package.json', async () => { + const appVersion = await browser.electron.execute(function (electron) { + return electron.app.getVersion() + }) + expect(appVersion).to.equal(version) + }) + + it('should \'resources\' property be properly set for the platform', async () => { + const resources = await browser.electron.execute(function (electron) { + return electron.app.store.get('resources') + }) + + let regexp: RegExp + + if (process.env.CI && process.env.GITHUB_ACTION) { + if (process.platform === 'linux') { + regexp = new RegExp(`/home/[a-zA-Z0-9/]+`, 'g') + expect(resources).to.match(regexp) + } + if (process.platform === 'win32') { + regexp = /[A-Z]:[a-zA-Z\\-]+/g + expect(resources).to.match(regexp as RegExp) + } + if (process.platform === 'darwin') { + regexp = new RegExp('/Users/[a-zA-Z0-9/-]+', 'g') + expect(resources).to.match(regexp as RegExp) + } + } else { + const docs = 'Documents|Documentos|Documenten|Documenti|Unterlagen' + if (process.platform === 'linux') { + regexp = new RegExp(`/home/[a-zA-Z0-9/]+/(${docs})`, 'g') + expect(resources).to.match(regexp as RegExp) + } + if (process.platform === 'win32') { + regexp = new RegExp(`[A-Z]:\\Users\\[a-zA-Z0-9]+\\(${docs})\\${name}`, 'g') + expect(resources).to.match(regexp as RegExp) + } + if (process.platform === 'darwin') { + regexp = new RegExp(`/Users/[a-zA-Z0-9\/\-]+/(${docs})/${name}`, 'g') + expect(resources).to.match(regexp as RegExp) + } + } + }) + + it('should \'os\' property be properly set for the platform', async () => { + const os = await browser.electron.execute(function (electron) { + return electron.app.store.get('os') + }) + expect(os).to.equal(process.platform) + }) + + it('should \'versions\' property to be an Array with 0 elements', async () => { + const versions = await browser.electron.execute(function (electron) { + return electron.app.store.get('versions') + }) + expect(versions).to.be.an('Array') + expect(versions.length).to.equal(0) + }) + + it('should \'version\' property to be equal \'Select version\'', async () => { + const version = await browser.electron.execute(function (electron) { + return electron.app.store.get('version') + }) + expect(version).to.equal('Select version') + }) + + it('should \'device\' property to be equal \'Select device\'', async () => { + const device = await browser.electron.execute(function (electron) { + return electron.app.store.get('device') + }) + expect(device).to.equal('Select device') + }) + + it('should \'showFlash\' property to be equal \'false\'', async () => { + const showFlash = await browser.electron.execute(function (electron) { + return electron.app.store.get('showFlash') + }) + expect(showFlash).to.equal(false) + }) + +}) diff --git a/test/e2e/specs/001.check-config.spec.ts b/test/e2e/specs/001.check-config.spec.ts deleted file mode 100644 index 6ba16e70..00000000 --- a/test/e2e/specs/001.check-config.spec.ts +++ /dev/null @@ -1,80 +0,0 @@ -const { readdir, readFile } = require('fs/promises') -const { join } = require('path') -const expectChai = require('chai').expect -const { browser } = require('@wdio/globals') -const { describe, it } = require('mocha') -const { version } = require('../../../package.json') - -describe('Check created configuration', () => { - - it('should \'appVersion\' property be equal to the defined in package.json', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.appVersion).to.equal(version) - }) - - it('should \'resources\' property be properly set for the platform', async () => { - const api = await browser.electron.api() as Record - let regexp: RegExp - - if (process.env.CI && process.env.GITHUB_ACTION) { - if (process.platform === 'linux') { - regexp = new RegExp(`/home/[a-zA-Z0-9/]+`, 'g') - expectChai(api.store.resources).to.match(regexp) - } - if (process.platform === 'win32') { - regexp = /[A-Z]:[a-zA-Z\\-]+/g - expectChai(api.store.resources).to.match(regexp as RegExp) - } - if (process.platform === 'darwin') { - regexp = new RegExp('/Users/[a-zA-Z0-9/-]+', 'g') - expectChai(api.store.resources).to.match(regexp as RegExp) - } - } else { - const docs = 'Documents|Documentos|Documenten|Documenti|Unterlagen' - if (process.platform === 'linux') { - regexp = new RegExp(`/home/[a-zA-Z0-9/]+/(${docs})`, 'g') - expectChai(api.store.resources).to.match(regexp as RegExp) - } - if (process.platform === 'win32') { - regexp = new RegExp(`[A-Z]:\\Users\\[a-zA-Z0-9]+\\(${docs})\\${name}`, 'g') - expectChai(api.store.resources).to.match(regexp as RegExp) - } - if (process.platform === 'darwin') { - regexp = new RegExp(`/Users/[a-zA-Z0-9\/\-]+/(${docs})/${name}`, 'g') - expectChai(api.store.resources).to.match(regexp as RegExp) - } - } - }) - - it('should \'os\' property be properly set for the platform', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.os).to.equal(process.platform) - }) - - it('should \'versions\' property to be an Array with 0 elements', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.versions).to.be.an('Array') - expectChai(api.store.versions.length).to.equal(0) - }) - - it('should \'version\' property to be equal \'Select version\'', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.version).to.equal('Select version') - }) - - it('should \'device\' property to be equal \'Select device\'', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.device).to.equal('Select device') - }) - - it('should \'sdcard\' property to be equal \'\'', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.sdcard).to.equal('') - }) - - it('should \'showFlash\' property to be equal \'false\'', async () => { - const api = await browser.electron.api() as Record - expectChai(api.store.showFlash).to.equal(false) - }) - -}) diff --git a/test/e2e/specs/002.app-startup.spec.mts b/test/e2e/specs/002.app-startup.spec.mts new file mode 100644 index 00000000..201f3466 --- /dev/null +++ b/test/e2e/specs/002.app-startup.spec.mts @@ -0,0 +1,28 @@ +import { expect } from 'chai' +import { browser } from '@wdio/globals' +import { describe, it } from 'mocha' + +describe('KruxInstaller start up', () => { + + it('should be ready', async () => { + const isReady = await browser.electron.execute(function (electron) { + return electron.app.isReady() + }) + expect(isReady).to.be.equal(true) + }) + + it('should name be correct', async () => { + const name = await browser.electron.execute(function (electron) { + return electron.app.getName() + }) + expect(name).to.be.equal('krux-installer') + }) + + it('should version be correct', async () => { + const version = await browser.electron.execute(function (electron) { + return electron.app.getVersion() + }) + expect(version).to.be.equal('0.0.1') + }) + +}) diff --git a/test/e2e/specs/002.app-startup.spec.ts b/test/e2e/specs/002.app-startup.spec.ts deleted file mode 100644 index 687e1915..00000000 --- a/test/e2e/specs/002.app-startup.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -const expectChai = require('chai').expect -const { describe, it } = require('mocha') -const { browser } = require('@wdio/globals') -const pkg = require('../../../package.json') - -describe('KruxInstaller start up', () => { - - it('should be ready', async () => { - const isReady = await browser.electron.app('isReady') as boolean - expectChai(isReady).to.be.equal(true) - }) - - it('should name be correct', async () => { - const name = await browser.electron.app('getName') as string - expectChai(name).to.be.equal(pkg.name) - }) - - it('should version be correct', async () => { - const version = await browser.electron.app('getVersion') as string - expectChai(version).to.be.equal(pkg.version) - }) - -}) diff --git a/test/e2e/specs/003.app-logo.spec.ts b/test/e2e/specs/003.app-logo.spec.mts similarity index 79% rename from test/e2e/specs/003.app-logo.spec.ts rename to test/e2e/specs/003.app-logo.spec.mts index 57ea555d..f3c06001 100644 --- a/test/e2e/specs/003.app-logo.spec.ts +++ b/test/e2e/specs/003.app-logo.spec.mts @@ -1,8 +1,8 @@ -const expectChai = require('chai').expect -const expectWDIO = require('@wdio/globals').expect -const { describe, it } = require('mocha') +import { expect } from '@wdio/globals' +import { describe, it } from 'mocha' +import { createRequire } from 'module' -const App = require('../pageobjects/app.page') +const App = createRequire(import.meta.url)('../pageobjects/app.page') // When wdio gets the generated //
 html tag from vue-ascii-morph,
@@ -41,8 +41,8 @@ describe('KruxInstaller initialization', () => {
 
   it('should krux-installer logo appears', async () => { 
     await instance.logo.waitForExist({ timeout: 3000 })
-    await expectWDIO(instance.logo).toBeDisplayed()
-    await expectWDIO(instance.logo).toHaveText(KRUX_INSTALLER_LOGO)
+    await expect(instance.logo).toBeDisplayed()
+    await expect(instance.logo).toHaveText(KRUX_INSTALLER_LOGO)
   })
 
   it('should krux-installer logo disappears', async () => { 
diff --git a/test/e2e/specs/004.app-consoleload-before-main-page.spec.ts b/test/e2e/specs/004.app-consoleload-before-main-page.spec.mts
similarity index 66%
rename from test/e2e/specs/004.app-consoleload-before-main-page.spec.ts
rename to test/e2e/specs/004.app-consoleload-before-main-page.spec.mts
index 6ea01940..b5fc16d6 100644
--- a/test/e2e/specs/004.app-consoleload-before-main-page.spec.ts
+++ b/test/e2e/specs/004.app-consoleload-before-main-page.spec.mts
@@ -1,8 +1,9 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
+
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
-const App = require('../pageobjects/app.page')
 
 // When wdio gets the generated
 // 
 html tag from vue-ascii-morph,
@@ -23,29 +24,29 @@ describe('KruxInstaller loading messages', () => {
 
   it('should \'Loading data from storage\' message appears', async () => {
     await instance.loadingDataMsg.waitForExist({ timeout: 3000 })
-    await expectWDIO(instance.loadingDataMsg).toBeDisplayed()
-    await expectWDIO(instance.loadingDataMsg).toHaveText(LOADING_DATA_MESSAGE)
+    await expect(instance.loadingDataMsg).toBeDisplayed()
+    await expect(instance.loadingDataMsg).toHaveText(LOADING_DATA_MESSAGE)
   })
 
   it('should \'Verifying openssl\' message appears', async () => {
     await instance.verifyingOpensslMsg.waitForExist({ timeout: 6000 })
-    await expectWDIO(instance.verifyingOpensslMsg).toBeDisplayed()
-    await expectWDIO(instance.verifyingOpensslMsg).toHaveText(VERIFYING_OPENSSL_MESSAGE)
+    await expect(instance.verifyingOpensslMsg).toBeDisplayed()
+    await expect(instance.verifyingOpensslMsg).toHaveText(VERIFYING_OPENSSL_MESSAGE)
   })
 
   it('should \'openssl for  found\' message appears', async () => {
     if (process.platform === 'linux') {
       await instance.opensslForLinuxFound.waitForExist({ timeout: 9000 })
-      await expectWDIO(instance.opensslForLinuxFound).toBeDisplayed()
-      await expectWDIO(instance.opensslForLinuxFound).toHaveText(OPENSSL_FOUND_LINUX_MESSAGE)
+      await expect(instance.opensslForLinuxFound).toBeDisplayed()
+      await expect(instance.opensslForLinuxFound).toHaveText(OPENSSL_FOUND_LINUX_MESSAGE)
     } else if (process.platform === 'darwin') {
       await instance.opensslForDarwinFound.waitForExist({ timeout: 9000 })
-      await expectWDIO(instance.verifyingOpensslMsg).toBeDisplayed()
-      await expectWDIO(instance.opensslForDarwinFound).toHaveText(OPENSSL_FOUND_DARWIN_MESSAGE)
+      await expect(instance.verifyingOpensslMsg).toBeDisplayed()
+      await expect(instance.opensslForDarwinFound).toHaveText(OPENSSL_FOUND_DARWIN_MESSAGE)
     } else if (process.platform === 'win32') {
       await instance.opensslForWin32Found.waitForExist({ timeout: 9000 })
-      await expectWDIO(instance.verifyingOpensslMsg).toBeDisplayed()
-      await expectWDIO(instance.opensslForWin32Found).toHaveText(OPENSSL_FOUND_WIN32_MESSAGE)
+      await expect(instance.verifyingOpensslMsg).toBeDisplayed()
+      await expect(instance.opensslForWin32Found).toHaveText(OPENSSL_FOUND_WIN32_MESSAGE)
     }
     
   })
diff --git a/test/e2e/specs/005.main-menu.spec.ts b/test/e2e/specs/005.main-menu.spec.mts
similarity index 68%
rename from test/e2e/specs/005.main-menu.spec.ts
rename to test/e2e/specs/005.main-menu.spec.mts
index 04fa46d5..72ca34e8 100644
--- a/test/e2e/specs/005.main-menu.spec.ts
+++ b/test/e2e/specs/005.main-menu.spec.mts
@@ -1,12 +1,11 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 const SELECT_DEVICE_TEXT = 'Select device'
 const SELECT_VERSION_TEXT = 'Select version'
-const PLEASE_SELECT_VERSION_MESSAGE = 'Please click \'Select version\' to download sources'
 
 describe('KruxInstaller Main page', () => {
 
@@ -36,30 +35,30 @@ describe('KruxInstaller Main page', () => {
   })
 
   it('should main page appears', async () => {
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should message text not appears', async () => {
-    await expectWDIO(instance.mainClickMessageText).not.toBeDisplayed()
+    await expect(instance.mainClickMessageText).not.toBeDisplayed()
   })
 
   it('should \'Select device\' button appears', async () => {
-    await expectWDIO(instance.mainSelectDeviceButton).toBeDisplayed()
+    await expect(instance.mainSelectDeviceButton).toBeDisplayed()
   })
 
   it('should \'Select version\' button appears', async () => {
-    await expectWDIO(instance.mainSelectVersionButton).toBeDisplayed()
+    await expect(instance.mainSelectVersionButton).toBeDisplayed()
   })
 
   it('should \'Select device\' button have \'Select device\' text', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText(SELECT_DEVICE_TEXT)
+    await expect(instance.mainSelectDeviceText).toHaveText(SELECT_DEVICE_TEXT)
   })
 
   it('should \'Select version\' button have \'Select version\' text', async () => {
-    await expectWDIO(instance.mainSelectVersionText).toHaveText(SELECT_VERSION_TEXT)
+    await expect(instance.mainSelectVersionText).toHaveText(SELECT_VERSION_TEXT)
   })
 
   it('should \'Flash\' button not appears', async () => {
-    await expectWDIO(instance.mainSelectFlashButton).not.toBeDisplayed()
+    await expect(instance.mainSelectFlashButton).not.toBeDisplayed()
   })
 })
diff --git a/test/e2e/specs/006.select-device-show-only.spec.ts b/test/e2e/specs/006.select-device-show-only.spec.mts
similarity index 69%
rename from test/e2e/specs/006.select-device-show-only.spec.ts
rename to test/e2e/specs/006.select-device-show-only.spec.mts
index ee75a5f5..e5be4f51 100644
--- a/test/e2e/specs/006.select-device-show-only.spec.ts
+++ b/test/e2e/specs/006.select-device-show-only.spec.mts
@@ -1,12 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
-
-const SELECT_DEVICE_TEXT = 'Select device'
-const SELECT_VERSION_TEXT = 'Select version'
-const PLEASE_SELECT_VERSION_MESSAGE = 'Please click \'Select version\' to download sources'
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page (show only)', () => {
 
@@ -39,66 +35,66 @@ describe('KruxInstaller SelectDevice page (show only)', () => {
     await instance.mainSelectDeviceButton.click()
     await instance.mainPage.waitForExist({ reverse: true })
     await instance.selectDevicePage.waitForExist()
-    await expectWDIO(instance.selectDevicePage).toBeDisplayed()
+    await expect(instance.selectDevicePage).toBeDisplayed()
   })
 
   it('should \'maixpy_m5stickv\' button be displayed', async () => {
     await instance.selectMaixpyM5StickVButton.waitForExist()
-    await expectWDIO(instance.selectMaixpyM5StickVButton).toBeDisplayed()
+    await expect(instance.selectMaixpyM5StickVButton).toBeDisplayed()
   })
 
   it('should \'maixpy_m5stickv\' button have \'maixpy_m5stickv\' text', async () => { 
     await instance.selectMaixpyM5StickVText.waitForExist()
-    await expectWDIO(instance.selectMaixpyM5StickVText).toHaveText('maixpy_m5stickv')
+    await expect(instance.selectMaixpyM5StickVText).toHaveText('maixpy_m5stickv')
   })
 
   it('should \'maixpy_amigo_ips\' button be displayed', async () => {
     await instance.selectMaixpyAmigoIpsButton.waitForExist()
-    await expectWDIO(instance.selectMaixpyAmigoIpsButton).toBeDisplayed()
+    await expect(instance.selectMaixpyAmigoIpsButton).toBeDisplayed()
   })
 
   it('should \'maixpy_amigo_ips\' button have \'maixpy_amigo_ips\' text', async () => { 
     await instance.selectMaixpyAmigoIpsText.waitForExist()
-    await expectWDIO(instance.selectMaixpyAmigoIpsText).toHaveText('maixpy_amigo_ips')
+    await expect(instance.selectMaixpyAmigoIpsText).toHaveText('maixpy_amigo_ips')
   })
 
   it('should \'maixpy_amigo_tft\' button be displayed', async () => {
     await instance.selectMaixpyAmigoTftButton.waitForExist()
-    await expectWDIO(instance.selectMaixpyAmigoTftButton).toBeDisplayed()
+    await expect(instance.selectMaixpyAmigoTftButton).toBeDisplayed()
   })
 
   it('should \'maixpy_amigo_tft\' button have \'maixpy_amigo_tft\' text', async () => { 
     await instance.selectMaixpyAmigoTftText.waitForExist()
-    await expectWDIO(instance.selectMaixpyAmigoTftText).toHaveText('maixpy_amigo_tft')
+    await expect(instance.selectMaixpyAmigoTftText).toHaveText('maixpy_amigo_tft')
   })
 
   it('should \'maixpy_bit\' button be displayed', async () => {
     await instance.selectMaixpyBitButton.waitForExist()
-    await expectWDIO(instance.selectMaixpyBitButton).toBeDisplayed()
+    await expect(instance.selectMaixpyBitButton).toBeDisplayed()
   })
 
   it('should \'maixpy_bit\' button have \'maixpy_bit\' text', async () => { 
     await instance.selectMaixpyBitText.waitForExist()
-    await expectWDIO(instance.selectMaixpyBitText).toHaveText('maixpy_bit')
+    await expect(instance.selectMaixpyBitText).toHaveText('maixpy_bit')
   })
 
   it('should \'maixpy_dock\' button be displayed', async () => {
     await instance.selectMaixpyDockButton.waitForExist()
-    await expectWDIO(instance.selectMaixpyDockButton).toBeDisplayed()
+    await expect(instance.selectMaixpyDockButton).toBeDisplayed()
   })
 
   it('should \'maixpy_dock\' button have \'maixpy_dock\' text', async () => { 
     await instance.selectMaixpyDockText.waitForExist()
-    await expectWDIO(instance.selectMaixpyDockText).toHaveText('maixpy_dock')
+    await expect(instance.selectMaixpyDockText).toHaveText('maixpy_dock')
   })
 
   it('should \'back\' button be displayed', async () => {
     await instance.selectBackButton.waitForExist()
-    await expectWDIO(instance.selectBackButton).toBeDisplayed()
+    await expect(instance.selectBackButton).toBeDisplayed()
   })
 
   it('should \'back\' button have \'back\' text', async () => { 
     await instance.selectBackText.waitForExist()
-    await expectWDIO(instance.selectBackText).toHaveText('Back')
+    await expect(instance.selectBackText).toHaveText('Back')
   })
 })
diff --git a/test/e2e/specs/007.select-device-m5stickv.spec.ts b/test/e2e/specs/007.select-device-m5stickv.spec.mts
similarity index 80%
rename from test/e2e/specs/007.select-device-m5stickv.spec.ts
rename to test/e2e/specs/007.select-device-m5stickv.spec.mts
index 61c64a40..7186c68e 100644
--- a/test/e2e/specs/007.select-device-m5stickv.spec.ts
+++ b/test/e2e/specs/007.select-device-m5stickv.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'maixpy_m5stickv\' device', () => {
 
@@ -38,13 +38,13 @@ describe('KruxInstaller SelectDevice page selects \'maixpy_m5stickv\' device', (
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button changed its text to \'Device: maixpy_m5stickv\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Device: maixpy_m5stickv')
+    await expect(instance.mainSelectDeviceText).toHaveText('Device: maixpy_m5stickv')
   })
 
 })
diff --git a/test/e2e/specs/008.select-device-amigo-ips.spec.ts b/test/e2e/specs/008.select-device-amigo-ips.spec.mts
similarity index 80%
rename from test/e2e/specs/008.select-device-amigo-ips.spec.ts
rename to test/e2e/specs/008.select-device-amigo-ips.spec.mts
index b12f9659..1e50fcff 100644
--- a/test/e2e/specs/008.select-device-amigo-ips.spec.ts
+++ b/test/e2e/specs/008.select-device-amigo-ips.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'maixpy_amigo_ips\' device', () => {
 
@@ -38,13 +38,13 @@ describe('KruxInstaller SelectDevice page selects \'maixpy_amigo_ips\' device',
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button changed its text to \'Device: maixpy_amigo_ips\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Device: maixpy_amigo_ips')
+    await expect(instance.mainSelectDeviceText).toHaveText('Device: maixpy_amigo_ips')
   })
 
 })
diff --git a/test/e2e/specs/009.select-device-amigo-tft.spec.ts b/test/e2e/specs/009.select-device-amigo-tft.spec.mts
similarity index 80%
rename from test/e2e/specs/009.select-device-amigo-tft.spec.ts
rename to test/e2e/specs/009.select-device-amigo-tft.spec.mts
index 6e1a1508..19c6a8d0 100644
--- a/test/e2e/specs/009.select-device-amigo-tft.spec.ts
+++ b/test/e2e/specs/009.select-device-amigo-tft.spec.mts
@@ -1,8 +1,9 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
+
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
-const App = require('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'maixpy_amigo_tft\' device', () => {
 
@@ -38,13 +39,13 @@ describe('KruxInstaller SelectDevice page selects \'maixpy_amigo_tft\' device',
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button changed its text to \'Device: maixpy_amigo_tft\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Device: maixpy_amigo_tft')
+    await expect(instance.mainSelectDeviceText).toHaveText('Device: maixpy_amigo_tft')
   })
 
 })
diff --git a/test/e2e/specs/010.select-device-bit.spec.ts b/test/e2e/specs/010.select-device-bit.spec.mts
similarity index 80%
rename from test/e2e/specs/010.select-device-bit.spec.ts
rename to test/e2e/specs/010.select-device-bit.spec.mts
index 5a110390..7977c500 100644
--- a/test/e2e/specs/010.select-device-bit.spec.ts
+++ b/test/e2e/specs/010.select-device-bit.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'maixpy_bit\' device', () => {
 
@@ -38,13 +38,13 @@ describe('KruxInstaller SelectDevice page selects \'maixpy_bit\' device', () =>
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button changed its text to \'Device: maixpy_bit\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Device: maixpy_bit')
+    await expect(instance.mainSelectDeviceText).toHaveText('Device: maixpy_bit')
   })
 
 })
diff --git a/test/e2e/specs/011.select-device-dock.spec.ts b/test/e2e/specs/011.select-device-dock.spec.mts
similarity index 80%
rename from test/e2e/specs/011.select-device-dock.spec.ts
rename to test/e2e/specs/011.select-device-dock.spec.mts
index 7770f21a..986fbbef 100644
--- a/test/e2e/specs/011.select-device-dock.spec.ts
+++ b/test/e2e/specs/011.select-device-dock.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'maixpy_dock\' device', () => {
 
@@ -38,13 +38,13 @@ describe('KruxInstaller SelectDevice page selects \'maixpy_dock\' device', () =>
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button changed its text to \'Device: maixpy_dock\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Device: maixpy_dock')
+    await expect(instance.mainSelectDeviceText).toHaveText('Device: maixpy_dock')
   })
 
 })
\ No newline at end of file
diff --git a/test/e2e/specs/012.select-device-back.spec.ts b/test/e2e/specs/012.select-device-back.spec.mts
similarity index 80%
rename from test/e2e/specs/012.select-device-back.spec.ts
rename to test/e2e/specs/012.select-device-back.spec.mts
index b4ffadb3..8442f1cd 100644
--- a/test/e2e/specs/012.select-device-back.spec.ts
+++ b/test/e2e/specs/012.select-device-back.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectDevice page selects \'back\' button', () => {
 
@@ -38,13 +38,13 @@ describe('KruxInstaller SelectDevice page selects \'back\' button', () => {
 
   it('should change to Main page', async () => {
     await instance.selectDevicePage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectDevicePage).not.toBeDisplayed()
+    await expect(instance.selectDevicePage).not.toBeDisplayed()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
   it('should \'Select device\' button mantain its text to \'Select device\'', async () => {
-    await expectWDIO(instance.mainSelectDeviceText).toHaveText('Select device')
+    await expect(instance.mainSelectDeviceText).toHaveText('Select device')
   })
 
 })
diff --git a/test/e2e/specs/013.select-version-show-only.spec.ts b/test/e2e/specs/013.select-version-show-only.spec.mts
similarity index 72%
rename from test/e2e/specs/013.select-version-show-only.spec.ts
rename to test/e2e/specs/013.select-version-show-only.spec.mts
index 67876d8b..fd793e80 100644
--- a/test/e2e/specs/013.select-version-show-only.spec.ts
+++ b/test/e2e/specs/013.select-version-show-only.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 const GITHUB_OCTOCAT = [ 
     "MMM.           .MMM        ",
@@ -63,32 +63,32 @@ describe('KruxInstaller SelectVersion page (show only)', () => {
 
   it('should github\'s ocotcat checker appears', async () => { 
     await instance.githubOctocatCheckerLogo.waitForExist({ timeout: 3000 })
-    await expectWDIO(instance.githubOctocatCheckerLogo).toBeDisplayed()
-    await expectWDIO(instance.githubOctocatCheckerLogo).toHaveText(GITHUB_OCTOCAT)
+    await expect(instance.githubOctocatCheckerLogo).toBeDisplayed()
+    await expect(instance.githubOctocatCheckerLogo).toHaveText(GITHUB_OCTOCAT)
   })
 
   it('should \'Select version\' page appear', async () => {
     await instance.selectVersionPage.waitForExist()
-    await expectWDIO(instance.selectVersionPage).toBeDisplayed()
+    await expect(instance.selectVersionPage).toBeDisplayed()
   })
   
-  it('should \'selfcustody/krux/releases/tag/v23.09.0\' button appear', async () => {
+  it('should \'selfcustody/krux/releases/tag/v23.09.1\' button appear', async () => {
     await instance.selectVersionSelfcustodyButton.waitForExist()
-    await expectWDIO(instance.selectVersionSelfcustodyButton).toBeDisplayed()
+    await expect(instance.selectVersionSelfcustodyButton).toBeDisplayed()
   })
 
-  it('should \'selfcustody/krux/releases/tag/v23.09.0\' button have \'selfcustody/krux/releases/tag/v23.09.0\' text', async () => {
+  it('should \'selfcustody/krux/releases/tag/v23.09.1\' button have \'selfcustody/krux/releases/tag/v23.09.1\' text', async () => {
     await instance.selectVersionSelfcustodyText.waitForExist()
-    await expectWDIO(instance.selectVersionSelfcustodyText).toHaveText('selfcustody/krux/releases/tag/v23.09.0')
+    await expect(instance.selectVersionSelfcustodyText).toHaveText('selfcustody/krux/releases/tag/v23.09.1')
   })
 
   it('should \'odudex/krux_binaries\' button appear', async () => {
     await instance.selectVersionOdudexButton.waitForExist()
-    await expectWDIO(instance.selectVersionOdudexButton).toBeDisplayed()
+    await expect(instance.selectVersionOdudexButton).toBeDisplayed()
   })
 
-  it('should \'selfcustody/krux/releases/tag/v22.08.2\' button have \'selfcustody/krux/releases/tag/v22.08.2\' text', async () => {
+  it('should \'selfcustody/krux/releases/tag/v23.09.1\' button have \'selfcustody/krux/releases/tag/v23.09.1\' text', async () => {
     await instance.selectVersionOdudexText.waitForExist()
-    await expectWDIO(instance.selectVersionOdudexText).toHaveText('odudex/krux_binaries')
+    await expect(instance.selectVersionOdudexText).toHaveText('odudex/krux_binaries')
   })
 })
diff --git a/test/e2e/specs/014.select-version-selfcustody-release-zip.spec.ts b/test/e2e/specs/014.select-version-selfcustody-release-zip.spec.mts
similarity index 66%
rename from test/e2e/specs/014.select-version-selfcustody-release-zip.spec.ts
rename to test/e2e/specs/014.select-version-selfcustody-release-zip.spec.mts
index da1abd68..943c8825 100644
--- a/test/e2e/specs/014.select-version-selfcustody-release-zip.spec.ts
+++ b/test/e2e/specs/014.select-version-selfcustody-release-zip.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (download release)', () => {
 
@@ -39,48 +39,48 @@ describe('KruxInstaller SelectVersion page (download release)', () => {
     await instance.selectVersionOdudexText.waitForExist()
   })
 
-  it('should click on \'selfcustody/krux/tags/v23.09.0\' and go to ConsoleLoad page', async () => {
+  it('should click on \'selfcustody/krux/tags/v23.09.1\' and go to ConsoleLoad page', async () => {
     await instance.selectVersionSelfcustodyButton.click()
     await instance.selectVersionPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.selectVersionPage).not.toBeDisplayed()
+    await expect(instance.selectVersionPage).not.toBeDisplayed()
   })
 
-  it('should \'Checking v23.09.0/krux-v23.09.0.zip\' message appears', async () => {
+  it('should \'Checking v23.09.1/krux-v23.09.1.zip\' message appears', async () => {
     await instance.checkingReleaseZipMsg.waitForExist()
-    await expectWDIO(instance.checkingReleaseZipMsg).toBeDisplayed()
-    await expectWDIO(instance.checkingReleaseZipMsg).toHaveText('Checking v23.09.0/krux-v23.09.0.zip')
+    await expect(instance.checkingReleaseZipMsg).toBeDisplayed()
+    await expect(instance.checkingReleaseZipMsg).toHaveText('Checking v23.09.1/krux-v23.09.1.zip')
   })
 
-  it('should \'v23.09.0/krux-v23.09.0.zip not found\' message appears', async () => {
+  it('should \'v23.09.1/krux-v23.09.1.zip not found\' message appears', async () => {
     await instance.notFoundReleaseZipMsg.waitForExist()
-    await expectWDIO(instance.notFoundReleaseZipMsg).toBeDisplayed()
+    await expect(instance.notFoundReleaseZipMsg).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.notFoundReleaseZipMsg).toHaveText('v23.09.0/krux-v23.09.0.zip not found')
+      await expect(instance.notFoundReleaseZipMsg).toHaveText('v23.09.1/krux-v23.09.1.zip not found')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.notFoundReleaseZipMsg).toHaveText('v23.09.0\\krux-v23.09.0.zip not found')
+      await expect(instance.notFoundReleaseZipMsg).toHaveText('v23.09.1\\krux-v23.09.1.zip not found')
     }
   })
 
   it('should go to DownloadOfficialReleaseZip page', async () => {
     await instance.downloadOfficialReleaseZipPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseZip page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseZip page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip\' subtitle', async () => {
+  it('should DownloadOfficialReleaseZip page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip')
+    await expect(instance.downloadOfficialReleaseZipSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip')
   })
 
   it('should DownloadOfficialReleaseZip page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.ts b/test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.mts
similarity index 63%
rename from test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.ts
rename to test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.mts
index 0d785314..15f8e1cc 100644
--- a/test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.ts
+++ b/test/e2e/specs/015.already-downloaded-selfcustody-release-zip.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release - show only)', () => {
 
@@ -42,61 +42,61 @@ describe('KruxInstaller SelectVersion page (already downloaded release - show on
     await instance.checkingReleaseZipMsg.waitForExist()
   })
 
-  it('should \'v23.09.0/krux-v23.09.0.zip found\' message appears', async () => {
+  it('should \'v23.09.1/krux-v23.09.1.zip found\' message appears', async () => {
     await instance.foundReleaseZipMsg.waitForExist()
-    await expectWDIO(instance.foundReleaseZipMsg).toBeDisplayed()
+    await expect(instance.foundReleaseZipMsg).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.foundReleaseZipMsg).toHaveText('v23.09.0/krux-v23.09.0.zip found')
+      await expect(instance.foundReleaseZipMsg).toHaveText('v23.09.1/krux-v23.09.1.zip found')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.foundReleaseZipMsg).toHaveText('v23.09.0\\krux-v23.09.0.zip found')
+      await expect(instance.foundReleaseZipMsg).toHaveText('v23.09.1\\krux-v23.09.1.zip found')
     }
   })
 
   it('should WarningDownload page should be displayed', async () => {
     await instance.warningDownloadPage.waitForExist()
-    await expectWDIO(instance.warningDownloadPage).toBeDisplayed()
+    await expect(instance.warningDownloadPage).toBeDisplayed()
   }) 
 
-  it('should \'v23.09.0/krux-v23.09.0.zip already downloaded\' message be displayed', async () => {
+  it('should \'v23.09.1/krux-v23.09.1.zip already downloaded\' message be displayed', async () => {
     await instance.warningAlreadyDownloadedText.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedText).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedText).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0/krux-v23.09.0.zip already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1/krux-v23.09.1.zip already downloaded')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0\\krux-v23.09.0.zip already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1\\krux-v23.09.1.zip already downloaded')
     }
   })
 
   it('should \'Proceed with current file\' button be displayed', async () => {
     await instance.warningDownloadProceedButton.waitForExist()
     await instance.warningDownloadProceedButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadProceedButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
+    await expect(instance.warningDownloadProceedButton).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
   })
 
   it('should \'Download it again\' button be displayed', async () => {
     await instance.warningDownloadAgainButton.waitForExist()
     await instance.warningDownloadAgainButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadAgainButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
+    await expect(instance.warningDownloadAgainButton).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
   })
 
   it('should \'Show details\' button be displayed', async () => {
     await instance.warningDownloadShowDetailsButton.waitForExist()
     await instance.warningDownloadShowDetailsButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadShowDetailsButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
+    await expect(instance.warningDownloadShowDetailsButton).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
   })
 
   it('should \'Back\' button be displayed', async () => {
     await instance.warningDownloadBackButton.waitForExist()
     await instance.warningDownloadBackButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadBackButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toHaveText('Back')
+    await expect(instance.warningDownloadBackButton).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toHaveText('Back')
   })
 
 })
diff --git a/test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.ts b/test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.mts
similarity index 84%
rename from test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.ts
rename to test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.mts
index c9a56c8d..dfe008d4 100644
--- a/test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.ts
+++ b/test/e2e/specs/016.already-downloaded-selfcustody-release-zip-click-back-button.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release - click back button)', () => {
 
@@ -56,17 +56,17 @@ describe('KruxInstaller SelectVersion page (already downloaded release - click b
   it ('should click \'Back\' button and go out from WarningDownload page', async () => {
     await instance.warningDownloadBackButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it('should Main Page be displayed', async () => {
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
-  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.0\'', async () => {
+  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.1\'', async () => {
     await instance.mainSelectVersionText.waitForExist()
-    await expectWDIO(instance.mainSelectVersionText).toBeDisplayed()
-    await expectWDIO(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.0')
+    await expect(instance.mainSelectVersionText).toBeDisplayed()
+    await expect(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.1')
   })
 })
diff --git a/test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.ts b/test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.mts
similarity index 69%
rename from test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.ts
rename to test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.mts
index 7978a514..f669d605 100644
--- a/test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.ts
+++ b/test/e2e/specs/017.already-downloaded-selfcustody-release-zip-click-show-details-button.spec.mts
@@ -1,10 +1,11 @@
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { join } from 'path'
+import { homedir } from 'os'
+import { osLangSync } from 'os-lang'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release - click show details button)', () => {
 
@@ -56,36 +57,36 @@ describe('KruxInstaller SelectVersion page (already downloaded release - click s
   })
 
   it ('should overlay not be shown', async () => {
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
 
   it ('should click \'Show details\' button and overlay must be visible', async () => {
     await instance.warningDownloadShowDetailsButton.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
   })
 
   it ('should overlay title be \'Resource details\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
   })
 
-  it ('should overlay subtitle be \'v23.09.0/krux-v23.09.0.zip\'', async () => {
+  it ('should overlay subtitle be \'v23.09.1/krux-v23.09.1.zip\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.0/krux-v23.09.0.zip')
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.1/krux-v23.09.1.zip')
   })
 
-  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip\'', async () => {
+  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTextRemote.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip')
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip')
   })
 
   it ('should a overlay text have properly local resource', async () => {
     await instance.warningAlreadyDownloadedOverlayTextLocal.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
     
     let resources = ''
     if (process.env.CI && process.env.GITHUB_ACTION) {
@@ -108,26 +109,26 @@ describe('KruxInstaller SelectVersion page (already downloaded release - click s
       }
     }
 
-    const resource = join(resources, 'v23.09.0', 'krux-v23.09.0.zip')
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
+    const resource = join(resources, 'v23.09.1', 'krux-v23.09.1.zip')
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
   })
 
   it('should a overlay text have the properly description', async () => {
     await instance.warningAlreadyDownloadedOverlayTextWhatdo.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file is the official release with all necessary contents to flash or update krux firmware on your Kendryte K210 device, including the firmware signature that prove the firmware\'s authenticity')
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file is the official release with all necessary contents to flash or update krux firmware on your Kendryte K210 device, including the firmware signature that prove the firmware\'s authenticity')
   })
 
   it('should \'close\' have \'Close\' text',async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
   })
 
   it('should \'close\' button make overlay not visible', async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
   
 })
diff --git a/test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.ts b/test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.mts
similarity index 79%
rename from test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.ts
rename to test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.mts
index cb99754b..e14752fa 100644
--- a/test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.ts
+++ b/test/e2e/specs/018.already-downloaded-selfcustody-release-zip-click-download-again.spec.mts
@@ -1,10 +1,8 @@
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release - click download again button)', () => {
 
@@ -58,29 +56,29 @@ describe('KruxInstaller SelectVersion page (already downloaded release - click d
   it ('should click \'Download again\' go out of WarningDownload page', async () => {
     await instance.warningDownloadAgainButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it ('should be in DownloadOfficialRelease page', async () => {
     await instance.downloadOfficialReleaseZipPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseZip page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseZip page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip\' subtitle', async () => {
+  it('should DownloadOfficialReleaseZip page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip')
+    await expect(instance.downloadOfficialReleaseZipSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip')
   })
 
   it('should DownloadOfficialReleaseZip page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.ts b/test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.mts
similarity index 89%
rename from test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.ts
rename to test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.mts
index 150ed964..a3452561 100644
--- a/test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.ts
+++ b/test/e2e/specs/019.already-downloaded-selfcustody-release-zip-click-proceed-button.spec.mts
@@ -1,10 +1,8 @@
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release - click proceed button)', () => {
 
@@ -58,7 +56,7 @@ describe('KruxInstaller SelectVersion page (already downloaded release - click p
   it ('should click \'Proceed\' button and go out of WarningDownload page', async () => {
     await instance.warningDownloadProceedButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
   
 })
diff --git a/test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.ts b/test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.mts
similarity index 74%
rename from test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.ts
rename to test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.mts
index e188c29e..59b8d795 100644
--- a/test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.ts
+++ b/test/e2e/specs/020.select-version-selfcustody-release-zip-sha256.spec.mts
@@ -1,10 +1,9 @@
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
+
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
-const App = require('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (download release sha256.txt)', () => {
 
@@ -57,36 +56,36 @@ describe('KruxInstaller SelectVersion page (download release sha256.txt)', () =>
     await instance.warningDownloadPage.waitForExist({ reverse: true })
   })
 
-  it ('should \'checking v23.09.0/krux-v23.09.0.zip.sha256.txt\' message appears', async () => {
+  it ('should \'checking v23.09.1/krux-v23.09.1.zip.sha256.txt\' message appears', async () => {
     await instance.checkingReleaseZipSha256txtMsg.waitForExist()
-    await expectWDIO(instance.checkingReleaseZipSha256txtMsg).toBeDisplayed()
+    await expect(instance.checkingReleaseZipSha256txtMsg).toBeDisplayed()
   })
 
-  it ('should \'v23.09.0/krux-v23.09.0.zip.sha256.txt not found\' message appears', async () => {
+  it ('should \'v23.09.1/krux-v23.09.1.zip.sha256.txt not found\' message appears', async () => {
     await instance.notFoundReleaseZipSha256txtMsg.waitForExist()
-    await expectWDIO(instance.notFoundReleaseZipSha256txtMsg).toBeDisplayed()
+    await expect(instance.notFoundReleaseZipSha256txtMsg).toBeDisplayed()
   })
 
   it('should go to DownloadOfficialReleaseZipSha256 page', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseZipSha256 page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseZipSha256 page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt\' subtitle', async () => {
+  it('should DownloadOfficialReleaseZipSha256 page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt')
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt')
   })
 
   it('should DownloadOfficialReleaseZipSha256 page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipSha256txtPageProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.ts b/test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.mts
similarity index 67%
rename from test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.ts
rename to test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.mts
index b2912823..dee1e59d 100644
--- a/test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.ts
+++ b/test/e2e/specs/021.already-downloaded-selfcustody-release-zip-sha256.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release sha256.txt - show only)', () => {
 
@@ -54,61 +54,61 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
     await instance.warningDownloadPage.waitForExist({ reverse: true })
   })
 
-  it ('should \'v23.09.0/krux-v23.09.0.zip.sha256.txt found\' message appears', async () => {
+  it ('should \'v23.09.1/krux-v23.09.1.zip.sha256.txt found\' message appears', async () => {
     await instance.checkingReleaseZipSha256txtMsg.waitForExist()
-    await expectWDIO(instance.checkingReleaseZipSha256txtMsg).toBeDisplayed()
+    await expect(instance.checkingReleaseZipSha256txtMsg).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.foundReleaseZipSha256txtMsg).toHaveText('v23.09.0/krux-v23.09.0.zip.sha256.txt found')
+      await expect(instance.foundReleaseZipSha256txtMsg).toHaveText('v23.09.1/krux-v23.09.1.zip.sha256.txt found')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.foundReleaseZipSha256txtMsg).toHaveText('v23.09.0\\krux-v23.09.0.zip.sha256.txt found')
+      await expect(instance.foundReleaseZipSha256txtMsg).toHaveText('v23.09.1\\krux-v23.09.1.zip.sha256.txt found')
     }
   })
 
   it('should WarningDownload page should be displayed', async () => {
     await instance.warningDownloadPage.waitForExist()
-    await expectWDIO(instance.warningDownloadPage).toBeDisplayed()
+    await expect(instance.warningDownloadPage).toBeDisplayed()
   }) 
 
-  it('should \'v23.09.0/krux-v23.09.0.zip.sha256.txt already downloaded\' message be displayed', async () => {
+  it('should \'v23.09.1/krux-v23.09.1.zip.sha256.txt already downloaded\' message be displayed', async () => {
     await instance.warningAlreadyDownloadedText.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedText).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedText).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0/krux-v23.09.0.zip.sha256.txt already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1/krux-v23.09.1.zip.sha256.txt already downloaded')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0\\krux-v23.09.0.zip.sha256.txt already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1\\krux-v23.09.1.zip.sha256.txt already downloaded')
     }
   })
 
   it('should \'Proceed with current file\' button be displayed', async () => {
     await instance.warningDownloadProceedButton.waitForExist()
     await instance.warningDownloadProceedButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadProceedButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
+    await expect(instance.warningDownloadProceedButton).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
   })
 
   it('should \'Download it again\' button be displayed', async () => {
     await instance.warningDownloadAgainButton.waitForExist()
     await instance.warningDownloadAgainButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadAgainButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
+    await expect(instance.warningDownloadAgainButton).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
   })
 
   it('should \'Show details\' button be displayed', async () => {
     await instance.warningDownloadShowDetailsButton.waitForExist()
     await instance.warningDownloadShowDetailsButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadShowDetailsButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
+    await expect(instance.warningDownloadShowDetailsButton).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
   })
 
   it('should \'Back\' button be displayed', async () => {
     await instance.warningDownloadBackButton.waitForExist()
     await instance.warningDownloadBackButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadBackButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toHaveText('Back')
+    await expect(instance.warningDownloadBackButton).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toHaveText('Back')
   })
 
 })
diff --git a/test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.ts b/test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.mts
similarity index 85%
rename from test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.ts
rename to test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.mts
index 426eb659..88de791f 100644
--- a/test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.ts
+++ b/test/e2e/specs/022.already-downloaded-selfcustody-release-zip-sha256-click-back-button.spec.mts
@@ -1,8 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release sha256.txt - click back button)', () => {
 
@@ -62,18 +62,18 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
   it ('should click \'Back\' button and go out from WarningDownload page', async () => {
     await instance.warningDownloadBackButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it('should Main Page be displayed', async () => {
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   }) 
 
-  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.0\'', async () => {
+  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.1\'', async () => {
     await instance.mainSelectVersionText.waitForExist()
-    await expectWDIO(instance.mainSelectVersionText).toBeDisplayed()
-    await expectWDIO(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.0')
+    await expect(instance.mainSelectVersionText).toBeDisplayed()
+    await expect(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.1')
   })
 
 })
diff --git a/test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.ts b/test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.mts
similarity index 71%
rename from test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.ts
rename to test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.mts
index 8f7a0914..1e0a771a 100644
--- a/test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.ts
+++ b/test/e2e/specs/023.already-downloaded-selfcustody-release-zip-sha256-click-show-details-button.spec.mts
@@ -1,11 +1,11 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { join } from 'path'
+import { homedir } from 'os'
+import { osLangSync } from 'os-lang'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release sha256.txt - click show details button)', () => {
 
@@ -63,36 +63,36 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
   })
 
   it ('should overlay not be shown', async () => {
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
 
   it ('should click \'Show details\' button and overlay must be visible', async () => {
     await instance.warningDownloadShowDetailsButton.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
   })
 
   it('should overlay title be \'Resource details\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
   })
 
-  it ('should overlay subtitle be \'v23.09.0/krux-v23.09.0.zip.sha256.txt\'', async () => {
+  it ('should overlay subtitle be \'v23.09.1/krux-v23.09.1.zip.sha256.txt\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.0/krux-v23.09.0.zip.sha256.txt')
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.1/krux-v23.09.1.zip.sha256.txt')
   })
 
-  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt\'', async () => {
+  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTextRemote.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt')
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt')
   })
 
   it ('should a overlay text have properly local resource', async () => {
     await instance.warningAlreadyDownloadedOverlayTextLocal.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
     
     let resources = ''
     if (process.env.CI && process.env.GITHUB_ACTION) {
@@ -115,26 +115,26 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
       }
     }
 
-    const resource = join(resources, 'v23.09.0', 'krux-v23.09.0.zip.sha256.txt')
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
+    const resource = join(resources, 'v23.09.1', 'krux-v23.09.1.zip.sha256.txt')
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
   })
 
   it('should a overlay text have the properly description', async () => {
     await instance.warningAlreadyDownloadedOverlayTextWhatdo.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file proves the integrity of previous file. It uses the sha256 algorithm to check if zip file has not be changed during download.')
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file proves the integrity of previous file. It uses the sha256 algorithm to check if zip file has not be changed during download.')
   })
 
   it('should \'close\' have \'Close\' text',async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
   })
 
   it('should \'close\' button make overlay not visible', async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
   
 })
diff --git a/test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.ts b/test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.mts
similarity index 78%
rename from test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.ts
rename to test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.mts
index 016dadb1..5007eb3a 100644
--- a/test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.ts
+++ b/test/e2e/specs/024.already-downloaded-selfcustody-release-zip-sha256-click-download-again-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release sha256.txt - click download again button)', () => {
 
@@ -66,29 +63,29 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
   it ('should click \'Download again\' go out of WarningDownload page', async () => {
     await instance.warningDownloadAgainButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it ('should be in DownloadOfficialReleaseZipSha256 page', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseZipSha256 page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseZipSha256 page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt\' subtitle', async () => {
+  it('should DownloadOfficialReleaseZipSha256 page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sha256.txt')
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sha256.txt')
   })
 
   it('should DownloadOfficialReleaseZipSha256 page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipSha256txtPageProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSha256txtPageProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSha256txtPageProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipSha256txtPageProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.ts b/test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.mts
similarity index 89%
rename from test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.ts
rename to test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.mts
index 50216b23..bb848130 100644
--- a/test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.ts
+++ b/test/e2e/specs/025.already-downloaded-selfcustody-release-zip-sha256-click-proceed-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release sha256.txt - click  proceed button)', () => {
 
@@ -66,7 +63,7 @@ describe('KruxInstaller SelectVersion page (already downloaded release sha256.tx
   it ('should click \'Proceed\' go out of WarningDownload page', async () => {
     await instance.warningDownloadProceedButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
   
 })
diff --git a/test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.ts b/test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.mts
similarity index 76%
rename from test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.ts
rename to test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.mts
index 225cdb79..2706f0d1 100644
--- a/test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.ts
+++ b/test/e2e/specs/026.select-version-selfcustody-release-zip-sig.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (download release signature)', () => {
 
@@ -65,36 +62,36 @@ describe('KruxInstaller SelectVersion page (download release signature)', () =>
     await instance.warningDownloadPage.waitForExist({ reverse: true })
   })
 
-  it ('should \'checking v23.09.0/krux-v23.09.0.zip.sig\' message appears', async () => {
+  it ('should \'checking v23.09.1/krux-v23.09.1.zip.sig\' message appears', async () => {
     await instance.checkingReleaseZipSigMsg.waitForExist()
-    await expectWDIO(instance.checkingReleaseZipSigMsg).toBeDisplayed()
+    await expect(instance.checkingReleaseZipSigMsg).toBeDisplayed()
   })
 
-  it ('should \'v23.09.0/krux-v23.09.0.zip.sig not found\' message appears', async () => {
+  it ('should \'v23.09.1/krux-v23.09.1.zip.sig not found\' message appears', async () => {
     await instance.notFoundReleaseZipSigMsg.waitForExist()
-    await expectWDIO(instance.notFoundReleaseZipSigMsg).toBeDisplayed()
+    await expect(instance.notFoundReleaseZipSigMsg).toBeDisplayed()
   })
 
   it('should go to DownloadOfficialReleaseZipSig page', async () => {
     await instance.downloadOfficialReleaseZipSigPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseZipSig page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipSigTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipSigTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseZipSig page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig\' subtitle', async () => {
+  it('should DownloadOfficialReleaseZipSig page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipSigSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig')
+    await expect(instance.downloadOfficialReleaseZipSigSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig')
   })
 
   it('should DownloadOfficialReleaseZipSig page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipSigProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipSigProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.ts b/test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.mts
similarity index 69%
rename from test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.ts
rename to test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.mts
index 1a512372..8599c843 100644
--- a/test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.ts
+++ b/test/e2e/specs/027.already-downloaded-selfcustody-release-zip-sig.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded  release signature - show only)', () => {
 
@@ -65,61 +62,61 @@ describe('KruxInstaller SelectVersion page (already downloaded  release signatur
     await instance.warningDownloadPage.waitForExist({ reverse: true })
   })
 
-  it ('should \'v23.09.0/krux-v23.09.0.zip.sig found\' message appears', async () => {
+  it ('should \'v23.09.1/krux-v23.09.1.zip.sig found\' message appears', async () => {
     await instance.checkingReleaseZipSigMsg.waitForExist()
-    await expectWDIO(instance.foundReleaseZipSigMsg).toBeDisplayed()
+    await expect(instance.foundReleaseZipSigMsg).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.foundReleaseZipSigMsg).toHaveText('v23.09.0/krux-v23.09.0.zip.sig found')
+      await expect(instance.foundReleaseZipSigMsg).toHaveText('v23.09.1/krux-v23.09.1.zip.sig found')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.foundReleaseZipSigMsg).toHaveText('v23.09.0\\krux-v23.09.0.zip.sig found')
+      await expect(instance.foundReleaseZipSigMsg).toHaveText('v23.09.1\\krux-v23.09.1.zip.sig found')
     }
   })
 
   it('should WarningDownload page should be displayed', async () => {
     await instance.warningDownloadPage.waitForExist()
-    await expectWDIO(instance.warningDownloadPage).toBeDisplayed()
+    await expect(instance.warningDownloadPage).toBeDisplayed()
   }) 
 
-  it('should \'v23.09.0/krux-v23.09.0.zip.sig already downloaded\' message be displayed', async () => {
+  it('should \'v23.09.1/krux-v23.09.1.zip.sig already downloaded\' message be displayed', async () => {
     await instance.warningAlreadyDownloadedText.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedText).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedText).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0/krux-v23.09.0.zip.sig already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1/krux-v23.09.1.zip.sig already downloaded')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('v23.09.0\\krux-v23.09.0.zip.sig already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('v23.09.1\\krux-v23.09.1.zip.sig already downloaded')
     }
   })
 
   it('should \'Proceed with current file\' button be displayed', async () => {
     await instance.warningDownloadProceedButton.waitForExist()
     await instance.warningDownloadProceedButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadProceedButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
+    await expect(instance.warningDownloadProceedButton).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
   })
 
   it('should \'Download it again\' button be displayed', async () => {
     await instance.warningDownloadAgainButton.waitForExist()
     await instance.warningDownloadAgainButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadAgainButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
+    await expect(instance.warningDownloadAgainButton).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
   })
 
   it('should \'Show details\' button be displayed', async () => {
     await instance.warningDownloadShowDetailsButton.waitForExist()
     await instance.warningDownloadShowDetailsButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadShowDetailsButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
+    await expect(instance.warningDownloadShowDetailsButton).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
   })
 
   it('should \'Back\' button be displayed', async () => {
     await instance.warningDownloadBackButton.waitForExist()
     await instance.warningDownloadBackButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadBackButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toHaveText('Back')
+    await expect(instance.warningDownloadBackButton).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toHaveText('Back')
   })
   
 })
diff --git a/test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.ts b/test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.mts
similarity index 85%
rename from test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.ts
rename to test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.mts
index 534f024d..e5879859 100644
--- a/test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.ts
+++ b/test/e2e/specs/028.already-downloaded-selfcustody-release-zip-sig-click-back-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded  release signature - click back button)', () => {
 
@@ -72,18 +69,18 @@ describe('KruxInstaller SelectVersion page (already downloaded  release signatur
   it ('should click \'Back\' button and go out from WarningDownload page', async () => {
     await instance.warningDownloadBackButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it('should Main Page be displayed', async () => {
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   }) 
 
-  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.0\'', async () => {
+  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.1\'', async () => {
     await instance.mainSelectVersionText.waitForExist()
-    await expectWDIO(instance.mainSelectVersionText).toBeDisplayed()
-    await expectWDIO(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.0')
+    await expect(instance.mainSelectVersionText).toBeDisplayed()
+    await expect(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.1')
   })
   
 })
diff --git a/test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.ts b/test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.mts
similarity index 72%
rename from test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.ts
rename to test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.mts
index 5d04301d..b91a4b25 100644
--- a/test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.ts
+++ b/test/e2e/specs/029.already-downloaded-selfcustody-release-zip-sig-show-details-button.spec.mts
@@ -1,11 +1,11 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { join } from 'path'
+import { homedir } from 'os'
+import { osLangSync } from 'os-lang'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded release signature - click show details button)', () => {
 
@@ -70,36 +70,36 @@ describe('KruxInstaller SelectVersion page (already downloaded release signature
   })
 
   it ('should overlay not be shown', async () => {
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
 
   it ('should click \'Show details\' button and overlay must be visible', async () => {
     await instance.warningDownloadShowDetailsButton.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
   })
 
   it('should overlay title be \'Resource details\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
   })
 
-  it ('should overlay subtitle be \'v23.09.0/krux-v23.09.0.zip.sig\'', async () => {
+  it ('should overlay subtitle be \'v23.09.1/krux-v23.09.1.zip.sig\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.0/krux-v23.09.0.zip.sig')
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('v23.09.1/krux-v23.09.1.zip.sig')
   })
 
-  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig\'', async () => {
+  it ('should a overlay text have \'Remote: https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTextRemote.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig')
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig')
   })
 
   it ('should a overlay text have properly local resource', async () => {
     await instance.warningAlreadyDownloadedOverlayTextLocal.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
     
     let resources = ''
     if (process.env.CI && process.env.GITHUB_ACTION) {
@@ -122,26 +122,26 @@ describe('KruxInstaller SelectVersion page (already downloaded release signature
       }
     }
 
-    const resource = join(resources, 'v23.09.0', 'krux-v23.09.0.zip.sig')
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
+    const resource = join(resources, 'v23.09.1', 'krux-v23.09.1.zip.sig')
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
   })
 
   it('should a overlay text have the properly description', async () => {
     await instance.warningAlreadyDownloadedOverlayTextWhatdo.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file, with the public key certificate, proves the authenticity of zip file, checking if the zip file was signed by its creator.')
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file, with the public key certificate, proves the authenticity of zip file, checking if the zip file was signed by its creator.')
   })
 
   it('should \'close\' have \'Close\' text',async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
   })
 
   it('should \'close\' button make overlay not visible', async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
   
 })
diff --git a/test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.ts b/test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.mts
similarity index 81%
rename from test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.ts
rename to test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.mts
index 3cec6b52..edd74988 100644
--- a/test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.ts
+++ b/test/e2e/specs/030.already-downloaded-selfcustody-release-zip-sig-download-again-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded  release signature - click download again button)', () => {
 
@@ -73,29 +70,29 @@ describe('KruxInstaller SelectVersion page (already downloaded  release signatur
   it ('should click \'Download again\' go out of WarningDownload page', async () => {
     await instance.warningDownloadAgainButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it ('should be in DownloadOfficialReleaseSig page', async () => {
     await instance.downloadOfficialReleaseZipSigPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleaseSig page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleaseZipSigTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleaseZipSigTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigTitle).toHaveText('Downloading')
   })
 
-  it('should DownloadOfficialReleaseSig page have \'https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig\' subtitle', async () => {
+  it('should DownloadOfficialReleaseSig page have \'https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig\' subtitle', async () => {
     await instance.downloadOfficialReleaseZipSigSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.0/krux-v23.09.0.zip.sig')
+    await expect(instance.downloadOfficialReleaseZipSigSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigSubtitle).toHaveText('https://github.com/selfcustody/krux/releases/download/v23.09.1/krux-v23.09.1.zip.sig')
   })
 
   it('should DownloadOfficialReleaseSig page progress until 100%', async () => {
     await instance.downloadOfficialReleaseZipSigProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleaseZipSigProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleaseZipSigProgress).toBeDisplayed()
     await instance.downloadOfficialReleaseZipSigProgress.waitUntil(async function () {
       const percentText = await this.getText()
       const percent = parseFloat(percentText.split('%')[0])
diff --git a/test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.ts b/test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.mts
similarity index 90%
rename from test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.ts
rename to test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.mts
index dc63ee4a..365dbca4 100644
--- a/test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.ts
+++ b/test/e2e/specs/031.already-downloaded-selfcustody-release-zip-sig-click-proceed-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded  release signature - click proceed button)', () => {
 
@@ -73,7 +70,7 @@ describe('KruxInstaller SelectVersion page (already downloaded  release signatur
   it ('should click \'Proceed\' go out of WarningDownload page', async () => {
     await instance.warningDownloadProceedButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
      
 })
diff --git a/test/e2e/specs/032-select-version-selfcustody-pem.spec.ts b/test/e2e/specs/032-select-version-selfcustody-pem.spec.mts
similarity index 82%
rename from test/e2e/specs/032-select-version-selfcustody-pem.spec.ts
rename to test/e2e/specs/032-select-version-selfcustody-pem.spec.mts
index 01cb448b..9883891a 100644
--- a/test/e2e/specs/032-select-version-selfcustody-pem.spec.ts
+++ b/test/e2e/specs/032-select-version-selfcustody-pem.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (download public key certificate)', () => {
 
@@ -73,34 +70,34 @@ describe('KruxInstaller SelectVersion page (download public key certificate)', (
    
   it ('should \'checking selfcustody.pem\' message appears', async () => {
     await instance.checkingReleasePemMsg.waitForExist()
-    await expectWDIO(instance.checkingReleasePemMsg).toBeDisplayed()
+    await expect(instance.checkingReleasePemMsg).toBeDisplayed()
   })
 
   it ('should \'main/selfcustody.pem not found\' message appears', async () => {
     await instance.notFoundReleasePemMsg.waitForExist()
-    await expectWDIO(instance.notFoundReleasePemMsg).toBeDisplayed()
+    await expect(instance.notFoundReleasePemMsg).toBeDisplayed()
   })
 
   it('should go to DownloadOfficialReleasePem page', async () => {
     await instance.downloadOfficialReleasePemPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleasePem page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleasePemTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleasePemTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleasePemTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemTitle).toHaveText('Downloading')
   })
 
   it('should DownloadOfficialReleasePem page have \'https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem\' subtitle', async () => {
     await instance.downloadOfficialReleasePemSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleasePemSubtitle).toHaveText('https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
+    await expect(instance.downloadOfficialReleasePemSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemSubtitle).toHaveText('https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
   })
 
   it('should DownloadOfficialReleasePem page progress until 100%', async () => {
     await instance.downloadOfficialReleasePemProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemProgress).toBeDisplayed()
     // TODO: Pem is so small that wdio cannot check progress 
     /*await instance.downloadOfficialReleasePemProgress.waitUntil(async function () {
       const percentText = await this.getText()
diff --git a/test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.ts b/test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.mts
similarity index 72%
rename from test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.ts
rename to test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.mts
index 0f6536d9..6bfe8f35 100644
--- a/test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.ts
+++ b/test/e2e/specs/033.already-downloaded-selfcustody-pem.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded public key certificate - show only)', () => {
 
@@ -73,58 +70,58 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
    
   it ('should \'main/selfcustody.pem found\' message appears', async () => {
     await instance.checkingReleasePemMsg.waitForExist()
-    await expectWDIO(instance.checkingReleasePemMsg).toBeDisplayed()
+    await expect(instance.checkingReleasePemMsg).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.foundReleasePemMsg).toHaveText('main/selfcustody.pem found')
+      await expect(instance.foundReleasePemMsg).toHaveText('main/selfcustody.pem found')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.foundReleasePemMsg).toHaveText('main\\selfcustody.pem found')
+      await expect(instance.foundReleasePemMsg).toHaveText('main\\selfcustody.pem found')
     }
   })
   
   it('should WarningDownload page should be displayed', async () => {
     await instance.warningDownloadPage.waitForExist()
-    await expectWDIO(instance.warningDownloadPage).toBeDisplayed()
+    await expect(instance.warningDownloadPage).toBeDisplayed()
   }) 
 
   it('should \'main/selfcustody.pem already downloaded\' message be displayed', async () => {
     await instance.warningAlreadyDownloadedText.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedText).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedText).toBeDisplayed()
     if (process.platform === 'linux' || process.platform === 'darwin') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('main/selfcustody.pem already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('main/selfcustody.pem already downloaded')
     } else if (process.platform === 'win32') {
-      await expectWDIO(instance.warningAlreadyDownloadedText).toHaveText('main\\selfcustody.pem already downloaded')
+      await expect(instance.warningAlreadyDownloadedText).toHaveText('main\\selfcustody.pem already downloaded')
     }
   })
 
   it('should \'Proceed with current file\' button be displayed', async () => {
     await instance.warningDownloadProceedButton.waitForExist()
     await instance.warningDownloadProceedButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadProceedButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
+    await expect(instance.warningDownloadProceedButton).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadProceedButtonText).toHaveText('Proceed with current file')
   })
   
   it('should \'Download it again\' button be displayed', async () => {
     await instance.warningDownloadAgainButton.waitForExist()
     await instance.warningDownloadAgainButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadAgainButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
+    await expect(instance.warningDownloadAgainButton).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadAgainButtonText).toHaveText('Download it again')
   })
   
   it('should \'Show details\' button be displayed', async () => {
     await instance.warningDownloadShowDetailsButton.waitForExist()
     await instance.warningDownloadShowDetailsButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadShowDetailsButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
+    await expect(instance.warningDownloadShowDetailsButton).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadShowDetailsButtonText).toHaveText('Show details')
   })
   
   it('should \'Back\' button be displayed', async () => {
     await instance.warningDownloadBackButton.waitForExist()
     await instance.warningDownloadBackButtonText.waitForExist()
-    await expectWDIO(instance.warningDownloadBackButton).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toBeDisplayed()
-    await expectWDIO(instance.warningDownloadBackButtonText).toHaveText('Back')
+    await expect(instance.warningDownloadBackButton).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toBeDisplayed()
+    await expect(instance.warningDownloadBackButtonText).toHaveText('Back')
   })
 })
diff --git a/test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.ts b/test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.mts
similarity index 86%
rename from test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.ts
rename to test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.mts
index 6ef1d451..22464f82 100644
--- a/test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.ts
+++ b/test/e2e/specs/034.already-downloaded-selfcustody-pem-click-back-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded public key certificate - click back button)', () => {
 
@@ -78,17 +75,17 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
   it ('should click \'Back\' button and go out from WarningDownload page', async () => {
     await instance.warningDownloadBackButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
     
   it('should Main Page be displayed', async () => {
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
    
-  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.0\'', async () => {
+  it('should \'Select version\' button changed to \'Version: selfcustody/krux/releases/tag/v23.09.1\'', async () => {
     await instance.mainSelectVersionText.waitForExist()
-    await expectWDIO(instance.mainSelectVersionText).toBeDisplayed()
-    await expectWDIO(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.0')
+    await expect(instance.mainSelectVersionText).toBeDisplayed()
+    await expect(instance.mainSelectVersionText).toHaveText('Version: selfcustody/krux/releases/tag/v23.09.1')
   })
 })
diff --git a/test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.ts b/test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.mts
similarity index 76%
rename from test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.ts
rename to test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.mts
index a03c5271..d2ffbefc 100644
--- a/test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.ts
+++ b/test/e2e/specs/035.already-downloaded-selfcustody-pem-show-details-button.spec.mts
@@ -1,11 +1,11 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { join } from 'path'
+import { homedir } from 'os'
+import { osLangSync } from 'os-lang'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded public key certificate - click show details button)', () => {
 
@@ -76,36 +76,36 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
   })
 
   it ('should overlay not be shown', async () => {
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
 
   it ('should click \'Show details\' button and overlay must be visible', async () => {
     await instance.warningDownloadShowDetailsButton.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).toBeDisplayed()
   })
 
   it('should overlay title be \'Resource details\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTitle).toHaveText('Resource details')
   })
 
   it ('should overlay subtitle be \'main/selfcustody.pem\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTitle.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('main/selfcustody.pem')
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlaySubtitle).toHaveText('main/selfcustody.pem')
   })
 
   it ('should a overlay text have \'Remote: https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem\'', async () => {
     await instance.warningAlreadyDownloadedOverlayTextRemote.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextRemote).toHaveText('Remote:\nhttps://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
   })
 
   it ('should a overlay text have properly local resource', async () => {
     await instance.warningAlreadyDownloadedOverlayTextLocal.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toBeDisplayed()
     
     let resources = ''
     if (process.env.CI && process.env.GITHUB_ACTION) {
@@ -129,24 +129,24 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
     }
 
     const resource = join(resources, 'main', 'selfcustody.pem')
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
+    await expect(instance.warningAlreadyDownloadedOverlayTextLocal).toHaveText(`Local:\n${resource}`)
   })
 
   it('should a overlay text have the properly description', async () => {
     await instance.warningAlreadyDownloadedOverlayTextWhatdo.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file, with the signature, proves the authenticity of zip file, checking if the zip file was signed by its creator.')
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayTextWhatdo).toHaveText('Description:\nThis file, with the signature, proves the authenticity of zip file, checking if the zip file was signed by its creator.')
   })
   
   it('should \'close\' have \'Close\' text',async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.waitForExist()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
-    await expectWDIO(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlayButtonClose).toHaveText('Close')
   })
 
   it('should \'close\' button make overlay not visible', async () => {
     await instance.warningAlreadyDownloadedOverlayButtonClose.click()
     await instance.warningAlreadyDownloadedOverlay.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
+    await expect(instance.warningAlreadyDownloadedOverlay).not.toBeDisplayed()
   })
 })
\ No newline at end of file
diff --git a/test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.ts b/test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.mts
similarity index 84%
rename from test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.ts
rename to test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.mts
index 12e001a1..ea7a203b 100644
--- a/test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.ts
+++ b/test/e2e/specs/036.already-downloaded-selfcustody-pem-download-again-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded public key certificate - click download again button)', () => {
 
@@ -78,29 +75,29 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
   it ('should click \'Download again\' go out of WarningDownload page', async () => {
     await instance.warningDownloadAgainButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
   it ('should be in DownloadOfficialReleasePem page', async () => {
     await instance.downloadOfficialReleasePemPage.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemPage).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemPage).toBeDisplayed()
   })
 
   it('should DownloadOfficialReleasePem page have \'Downloading\' title', async () => {
     await instance.downloadOfficialReleasePemTitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemTitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleasePemTitle).toHaveText('Downloading')
+    await expect(instance.downloadOfficialReleasePemTitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemTitle).toHaveText('Downloading')
   })
 
   it('should DownloadOfficialReleasePem page have \'https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem\' subtitle', async () => {
     await instance.downloadOfficialReleasePemSubtitle.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemSubtitle).toBeDisplayed()
-    await expectWDIO(instance.downloadOfficialReleasePemSubtitle).toHaveText('https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
+    await expect(instance.downloadOfficialReleasePemSubtitle).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemSubtitle).toHaveText('https://raw.githubusercontent.com/selfcustody/krux/main/selfcustody.pem')
   })
 
   it('should DownloadOfficialReleasePem page progress until 100%', async () => {
     await instance.downloadOfficialReleasePemProgress.waitForExist()
-    await expectWDIO(instance.downloadOfficialReleasePemProgress).toBeDisplayed()
+    await expect(instance.downloadOfficialReleasePemProgress).toBeDisplayed()
     // TODO: Pem is so small that wdio cannot check progress 
     /*await instance.downloadOfficialReleasePemProgress.waitUntil(async function () {
       const percentText = await this.getText()
diff --git a/test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.ts b/test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.mts
similarity index 91%
rename from test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.ts
rename to test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.mts
index fa4690eb..344be9da 100644
--- a/test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.ts
+++ b/test/e2e/specs/037.already-downloaded-selfcustody-pem-click-proceed-button.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 describe('KruxInstaller SelectVersion page (already downloaded public key certificate - click proceed again button)', () => {
 
@@ -80,7 +77,7 @@ describe('KruxInstaller SelectVersion page (already downloaded public key certif
   it ('should click \'Proceed\' go out of WarningDownload page', async () => {
     await instance.warningDownloadProceedButton.click()
     await instance.warningDownloadPage.waitForExist({ reverse: true })
-    await expectWDIO(instance.warningDownloadPage).not.toBeDisplayed()
+    await expect(instance.warningDownloadPage).not.toBeDisplayed()
   })
 
 })
\ No newline at end of file
diff --git a/test/e2e/specs/038-check-verify-official-release.spec.ts b/test/e2e/specs/038-check-verify-official-release.spec.mts
similarity index 92%
rename from test/e2e/specs/038-check-verify-official-release.spec.ts
rename to test/e2e/specs/038-check-verify-official-release.spec.mts
index f9495bbb..78a0fc06 100644
--- a/test/e2e/specs/038-check-verify-official-release.spec.ts
+++ b/test/e2e/specs/038-check-verify-official-release.spec.mts
@@ -1,11 +1,8 @@
-const expectChai = require('chai').expect
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
 
 const LEN_SASSAMAN = [
     ":.:'' ,,xiW,\"4x, ''           ",
@@ -108,12 +105,12 @@ describe('KruxInstaller CheckVerifyOfficialRelease page (show Lensassaman \'usin
 
   it('should go to CheckVerifyOfficialRelease page', async () => { 
     await instance.checkVerifyOfficialReleasePage.waitForExist({ timeout: 3000 })
-    await expectWDIO(instance.checkVerifyOfficialReleasePage).toBeDisplayed()
+    await expect(instance.checkVerifyOfficialReleasePage).toBeDisplayed()
   })
 
   it('should show correctly Len Sassaman \'verifying\' with openssl', async () => {
     await instance.checkVerifyOfficialReleaseLenSassamanIsUsingOpenssl.waitForExist()
-    await expectWDIO(instance.checkVerifyOfficialReleaseLenSassamanIsUsingOpenssl).toHaveText(LEN_SASSAMAN)
+    await expect(instance.checkVerifyOfficialReleaseLenSassamanIsUsingOpenssl).toHaveText(LEN_SASSAMAN)
   })
 
   it('should go out of CheckVerifyOfficialRelease page', async () => {
diff --git a/test/e2e/specs/039-verified-official-release.spec.ts b/test/e2e/specs/039-verified-official-release.spec.mts
similarity index 75%
rename from test/e2e/specs/039-verified-official-release.spec.ts
rename to test/e2e/specs/039-verified-official-release.spec.mts
index f0344fba..4daf8633 100644
--- a/test/e2e/specs/039-verified-official-release.spec.ts
+++ b/test/e2e/specs/039-verified-official-release.spec.mts
@@ -1,10 +1,13 @@
-const expectWDIO = require('@wdio/globals').expect
-const { join } = require('path')
-const { homedir } = require('os')
-const { osLangSync } = require('os-lang')
-const { describe, it } = require('mocha')
+import { expect } from '@wdio/globals'
+import { describe, it } from 'mocha'
+import { join } from 'path'
+import { homedir } from 'os'
+import { osLangSync } from 'os-lang'
+import { createRequire } from 'module'
 
-const App = require('../pageobjects/app.page')
+const App = createRequire(import.meta.url)('../pageobjects/app.page')
+
+const SHA256 = "4d 58 39 27 a7 22 06 e0 2a 8e 58 13 48 94 37 7c 94 e2 cc 9b 65 1f 16 11 bd de 1f bf 29 4c 78 26"
 
 describe('KruxInstaller VerifiedOfficialRelease page (show and click back button)', () => {
 
@@ -84,36 +87,37 @@ describe('KruxInstaller VerifiedOfficialRelease page (show and click back button
 
   it('should show VerifiedOfficialRelease page', async () => {
     await instance.verifiedOfficialReleasePage.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePage).toBeDisplayed()
+    await expect(instance.verifiedOfficialReleasePage).toBeDisplayed()
   })
 
   it('should show sha256sum intergrity title', async () => {
     await instance.verifiedOfficialReleasePageSha2256IntegrityTitle.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegrityTitle).toBeDisplayed()     
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegrityTitle).toHaveText('Sha256sum integrity')
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegrityTitle).toBeDisplayed()     
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegrityTitle).toHaveText('Sha256sum integrity')
   })
 
   it('should show sha256sum intergrity sha256.txt', async () => {
     await instance.verifiedOfficialReleasePageSha2256IntegritySha256txt.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegritySha256txt).toBeDisplayed()
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegritySha256txt).toHaveText('Expected result from file v23.09.0/krux-v23.09.0.zip.sha256.txt\n4a 8a a4 0b 71 f7 df 35 5b d1 54 ff ac 9c 9f 10 99 e8 7a 89 c0 53 32 58 7e bc 02 a2 15 92 ec 1b')
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegritySha256txt).toBeDisplayed()
+    
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegritySha256txt).toHaveText(`Expected result from file v23.09.1/krux-v23.09.1.zip.sha256.txt\n${SHA256}`)
   })
 
   it('should show sha256sum intergrity sha256 summed result', async () => {
     await instance.verifiedOfficialReleasePageSha2256IntegritySha256.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegritySha256).toBeDisplayed()
-    await expectWDIO(instance.verifiedOfficialReleasePageSha2256IntegritySha256).toHaveText('Summed result of file v23.09.0/krux-v23.09.0.zip\n4a 8a a4 0b 71 f7 df 35 5b d1 54 ff ac 9c 9f 10 99 e8 7a 89 c0 53 32 58 7e bc 02 a2 15 92 ec 1b')
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegritySha256).toBeDisplayed()
+    await expect(instance.verifiedOfficialReleasePageSha2256IntegritySha256).toHaveText(`Summed result of file v23.09.1/krux-v23.09.1.zip\n${SHA256}`)
   })
   
   it('should show openssl authenticity title', async () => {
     await instance.verifiedOfficialReleasePageSignatureTitle.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureTitle).toBeDisplayed()     
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureTitle).toHaveText('Signature authenticity')
+    await expect(instance.verifiedOfficialReleasePageSignatureTitle).toBeDisplayed()     
+    await expect(instance.verifiedOfficialReleasePageSignatureTitle).toHaveText('Signature authenticity')
   })
 
   it('should show openssl authenticity command', async () => {
     await instance.verifiedOfficialReleasePageSignatureCommand.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureCommand).toBeDisplayed()
+    await expect(instance.verifiedOfficialReleasePageSignatureCommand).toBeDisplayed()
     
     let resources = ''
     let openssl = ''
@@ -145,9 +149,9 @@ describe('KruxInstaller VerifiedOfficialRelease page (show and click back button
       }
     }
 
-    const resourceZip = join(resources, 'v23.09.0', 'krux-v23.09.0.zip')
+    const resourceZip = join(resources, 'v23.09.1', 'krux-v23.09.1.zip')
     const resourcePem = join(resources, 'main', 'selfcustody.pem')
-    const resourceSig = join(resources, 'v23.09.0', 'krux-v23.09.0.zip.sig')
+    const resourceSig = join(resources, 'v23.09.1', 'krux-v23.09.1.zip.sig')
     const command = [
       '$>',
       `${openssl} sha256 <${resourceZip}`,
@@ -163,19 +167,19 @@ describe('KruxInstaller VerifiedOfficialRelease page (show and click back button
       resourceSig
     ].join(' ')
 
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureCommand).toHaveText(command)
+    await expect(instance.verifiedOfficialReleasePageSignatureCommand).toHaveText(command)
   })
 
   it('should show openssl authenticity command result', async () => {
     await instance.verifiedOfficialReleasePageSignatureResult.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureResult).toBeDisplayed()     
-    await expectWDIO(instance.verifiedOfficialReleasePageSignatureResult).toHaveText('Signature Verified Successfully')
+    await expect(instance.verifiedOfficialReleasePageSignatureResult).toBeDisplayed()     
+    await expect(instance.verifiedOfficialReleasePageSignatureResult).toHaveText('Signature Verified Successfully')
   })
 
   it('should show back button', async () => {
     await instance.verifiedOfficialReleasePageBackButton.waitForExist()
-    await expectWDIO(instance.verifiedOfficialReleasePageBackButton).toBeDisplayed()     
-    await expectWDIO(instance.verifiedOfficialReleasePageBackButton).toHaveText('Back')
+    await expect(instance.verifiedOfficialReleasePageBackButton).toBeDisplayed()     
+    await expect(instance.verifiedOfficialReleasePageBackButton).toHaveText('Back')
   })
 
   it('should click back button, exit from VerifiedOfficialRelease page', async () => {
@@ -184,9 +188,8 @@ describe('KruxInstaller VerifiedOfficialRelease page (show and click back button
   })
 
   it('should be in Main page', async () => {
-    await instance.verifiedOfficialReleasePageBackButton.click()
     await instance.mainPage.waitForExist()
-    await expectWDIO(instance.mainPage).toBeDisplayed()
+    await expect(instance.mainPage).toBeDisplayed()
   })
 
 })
\ No newline at end of file
diff --git a/vite.config.ts b/vite.config.ts
index 8edab32e..2960fb47 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -72,7 +72,7 @@ export default defineConfig(({ command }) => {
         minify: true,
         inject: {
           data: {
-            title: `${pkg.name} ${pkg.version}${pkg.revision !== '' ? '.' + pkg.revision : ''}`
+            title: `${pkg.name} ${pkg.version}`
           }
         }
       })
diff --git a/wdio.conf.mts b/wdio.conf.mts
index ef5e7fde..b8003087 100644
--- a/wdio.conf.mts
+++ b/wdio.conf.mts
@@ -13,22 +13,10 @@ const debug = createDebug('krux:wdio:e2e')
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = dirname(__filename);
 
-// force TEST to be true
-if (!process.env.TEST || process.env.TEST !== 'true') {
-  debug('Force TEST=true')
-  process.env.TEST = 'true'
-}
-
-// force WDIO_ELECTRON to be true
-if (!process.env.WDIO_ELECTRON || process.env.WDIO_ELECTRON !== 'true') {
-  debug('Force WDIO_ELECTRON=true')
-  process.env.WDIO_ELECTRON = 'true'
-}
-
-// force VITE_COVERAGE to be true
-if (!process.env.VITE_COVERAGE || process.env.VITE_COVERAGE !== 'true') {
-  debug('Force VITE_COVERAGE=true')
-  process.env.VITE_COVERAGE = 'true'
+enum OS {
+  linux = 'linux',
+  win32 = 'win32',
+  darwin = 'macOS'
 }
 
 // Define which specs to
@@ -61,7 +49,7 @@ if (process.env.CI && process.env.GITHUB_ACTION) {
 }
 
 // Define where specs are located
-const specs = globSync('./test/e2e/specs/*.spec.ts')
+const specs = globSync('./test/e2e/specs/*.spec.mts')
 
 // If you want to filter some test, you could use
 // a `--filter` with regular expression
@@ -204,19 +192,16 @@ export const config = {
         // grid with only 5 firefox instances available you can make sure that not more than
         // 5 instances get started at a time.
         maxInstances: 1,
-        browserName: 'chrome',
-        //acceptInsecureCerts: true
-        'goog:chromeOptions': {
-          args: []
+        browserName: 'electron',
+        'wdio:electronServiceOptions': {
+          appBinaryPath: join(__dirname, 'release', version, `${OS[process.platform]}-unpacked`, 'krux-installer'),
+          appArgs: [
+            '--disable-infobars',
+            '--disable-dev-shm-usage',
+            '--no-sandbox',
+            '--remote-debugging-port=9222'
+          ],
         }
-        //  prefs: {
-        //    enable_do_not_track: true
-        //  }
-        //}
-        // If outputDir is provided WebdriverIO can capture driver session logs
-        // it is possible to configure which logTypes to include/exclude.
-        // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
-        // excludeDriverLogs: ['bugreport', 'server'],
     }],
     //
     // ===================
@@ -265,28 +250,7 @@ export const config = {
     // Services take over a specific job you don't want to take care of. They enhance
     // your test setup with almost no effort. Unlike plugins, they don't add new
     // commands. Instead, they hook themselves up into the test process.
-    services: [
-      [
-        'electron',
-        {
-          appPath: join(__dirname, 'release', version),
-          appName: 'krux-installer',
-          //binaryPath: APP_PATH,
-          appArgs: [
-            '--disable-infobars',
-            '--disable-dev-shm-usage',
-            '--no-sandbox',
-            '--remote-debugging-port=9222'
-          ],
-          chromedriver: {
-            port: 9519,
-            logFileName: 'wdio-chromedriver.log',
-            //chromedriverCustomPath: createRequire(import.meta.url).resolve(join('chromedriver', 'bin', 'chromedriver'))
-          },
-          electronVersion: devDependencies.electron.split("^")[1]
-        }
-      ]
-    ],
+    services: ['electron'],
     // Framework you want to run your specs with.
     // The following are supported: Mocha, Jasmine, and Cucumber
     // see also: https://webdriver.io/docs/frameworks

From 931da9ddc2c44b8498f921cb3710ed538100f1bf Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Tue, 19 Dec 2023 22:37:06 -0300
Subject: [PATCH 02/13] added a setTimeout before tests start to allow the
 creation of config.json

---
 test/e2e/specs/000.create-config.spec.mts |  2 -
 wdio.conf.mts                             | 73 ++++++++++++++++++++---
 2 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/test/e2e/specs/000.create-config.spec.mts b/test/e2e/specs/000.create-config.spec.mts
index 77caeee3..ec7b5ca1 100644
--- a/test/e2e/specs/000.create-config.spec.mts
+++ b/test/e2e/specs/000.create-config.spec.mts
@@ -3,8 +3,6 @@ import { join } from 'path'
 import { expect } from 'chai'
 import { browser } from '@wdio/globals'
 import { describe, it } from 'mocha'
-import { createRequire } from 'module'
-const { version } = createRequire(import.meta.url)('../../../package.json')
 
 describe('KruxInstaller configuration', () => {
 
diff --git a/wdio.conf.mts b/wdio.conf.mts
index b8003087..c463beed 100644
--- a/wdio.conf.mts
+++ b/wdio.conf.mts
@@ -7,6 +7,7 @@ import { createRequire } from 'module'
 import { osLangSync } from 'os-lang'
 import createDebug from 'debug'
 import { accessSync } from 'fs';
+import { exec, execFile } from 'child_process';
 
 const { devDependencies, version } = createRequire(import.meta.url)('./package.json')
 const debug = createDebug('krux:wdio:e2e')
@@ -19,6 +20,14 @@ enum OS {
   darwin = 'macOS'
 }
 
+const APP_PATH = join(__dirname, 'release', version, `${OS[process.platform]}-unpacked`, 'krux-installer')
+const APP_ARGS = [
+  '--disable-infobars',
+  '--disable-dev-shm-usage',
+  '--no-sandbox',
+  '--remote-debugging-port=9222'
+]
+
 // Define which specs to
 // test or to exclude
 let SPECS_TO_TEST: string[] = [];
@@ -194,13 +203,8 @@ export const config = {
         maxInstances: 1,
         browserName: 'electron',
         'wdio:electronServiceOptions': {
-          appBinaryPath: join(__dirname, 'release', version, `${OS[process.platform]}-unpacked`, 'krux-installer'),
-          appArgs: [
-            '--disable-infobars',
-            '--disable-dev-shm-usage',
-            '--no-sandbox',
-            '--remote-debugging-port=9222'
-          ],
+          appBinaryPath: APP_PATH,
+          appArgs: APP_ARGS,
         }
     }],
     //
@@ -304,8 +308,59 @@ export const config = {
      * @param  {[type]} args     object that will be merged with the main configuration once worker is initialized
      * @param  {[type]} execArgv list of string arguments passed to the worker process
      */
-    //onWorkerStart: function (cid: string, caps: any, specs: any, args: any, execArgv: any) {
-    //},
+    onWorkerStart: function (cid: string, caps: any, specs: any, args: any, execArgv: any) {
+      // This is a little 'hacking'
+      // the created 'krux-installer' process generated by
+      // webdriveIO do not properly create the store
+      // so we will run an no-test 'krux-installer'
+      // that create the store, kill it
+      // and then start to test
+      return new Promise(async function(resolve, reject) {
+        if (specs[0].indexOf('000.create-config.spec.mts') !== -1) {
+          const shell = process.env.SHELL
+          debug(`platform: ${process.platform}`)
+          debug(`shell: ${shell}`)
+          debug('INTERMEDIATE RUNNING TO CREATE STORE')
+
+          // Get the Process ID to stop it after exection
+          debug(`exec: ${APP_PATH}`)
+          debug(`args: ${APP_ARGS.join(' ')}`)
+          const app = execFile(APP_PATH, APP_ARGS)
+          debug(`PID ${app.pid}`)
+          
+          // Wait for some time, show the config file path
+          // and stop the process killing it providing it pid.
+          // Linux and darwin have similar ways to do this (`kill` command);
+          // on windows, we will use powershell `Stop-Process -Id` arg
+          // TODO: provide a cmd alternative on windows without powershell
+          let store = ''
+          let killCmd = ''
+          if (process.platform === 'linux') {
+            store = join(process.env.HOME as string, '.config', 'krux-installer')
+            killCmd = `kill ${app.pid}`
+          } else if (process.platform === 'win32') {
+            store = join(process.env.APPDATA as string, 'krux-installer')
+          } else if (process.platform === 'darwin') {
+            store = join(process.env.HOME as string, 'Library', 'Application Support', 'krux-installer')
+            killCmd = `Stop-Process -Id ${app.pid}`
+          }
+
+          setTimeout(function () {
+            exec(killCmd, function(err) {
+              if (err) {
+                debug(err)
+                reject(err)
+              }
+              debug(`killed process ${app.pid}`)
+              resolve()
+            })
+          }, 10000)
+          
+        } else {
+          resolve()
+        }
+      })
+    },
     /**
      * Gets executed just after a worker process has exited.
      * @param  {String} cid      capability id (e.g 0-0)

From add4c4f33323eb503fa4c3b9b45897fb69fee796 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Wed, 20 Dec 2023 10:08:08 -0300
Subject: [PATCH 03/13] changed the win32's chromedriver url for windows build

---
 .github/workflows/build-windows-nsis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build-windows-nsis.yml b/.github/workflows/build-windows-nsis.yml
index a3f0d16f..ae38686d 100644
--- a/.github/workflows/build-windows-nsis.yml
+++ b/.github/workflows/build-windows-nsis.yml
@@ -128,7 +128,7 @@ jobs:
       - name: Install chromedriver.exe
         shell: pwsh
         run: |
-          $url = "https://chromedriver.storage.googleapis.com/120.0.6099.56/chromedriver_win32.zip"
+          $url = "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/120.0.6099.56/win32/chrome-win32.zip"
           $tmp_path = ".\chromedriver_win32.zip"
           $dest_path = "node_modules\chromedriver\bin"
           Invoke-WebRequest -Uri $url -OutFile $tmp_path

From ae689b456b24d60524b590188dd58c958c22f1d3 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Wed, 20 Dec 2023 16:52:51 -0300
Subject: [PATCH 04/13] Fixed the generated binary path of installer on
 wdio.config.mts

---
 wdio.conf.mts | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/wdio.conf.mts b/wdio.conf.mts
index c463beed..04411489 100644
--- a/wdio.conf.mts
+++ b/wdio.conf.mts
@@ -14,13 +14,19 @@ const debug = createDebug('krux:wdio:e2e')
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = dirname(__filename);
 
-enum OS {
-  linux = 'linux',
-  win32 = 'win32',
-  darwin = 'macOS'
+// select the correct binary
+// for each OS
+let APP_PATH: string
+if (process.platform === 'linux') {
+  APP_PATH = join(__dirname, 'release', version, 'linux-unpacked', 'krux-installer')
+} else if (process.platform === 'win32') {
+  APP_PATH = join(__dirname, 'release', version, 'win-unpacked', 'krux-installer.exe')
+} else if (process.platform === 'darwin') {
+  APP_PATH = join(__dirname, 'release', version, 'mac', 'krux-installer.app', 'Contents', 'MacOS', 'krux-installer')
+} else {
+  throw new Error(`Platform '${process.platform}' not implemented`)
 }
 
-const APP_PATH = join(__dirname, 'release', version, `${OS[process.platform]}-unpacked`, 'krux-installer')
 const APP_ARGS = [
   '--disable-infobars',
   '--disable-dev-shm-usage',

From 1a119adeeb9f2ad72990d0efc89f7b8d44be7274 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Wed, 20 Dec 2023 20:50:56 -0300
Subject: [PATCH 05/13] trying to fix build on windows during pre-launch of
 krux-installer to create configuration files

---
 wdio.conf.mts | 55 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/wdio.conf.mts b/wdio.conf.mts
index 04411489..e6602cc1 100644
--- a/wdio.conf.mts
+++ b/wdio.conf.mts
@@ -339,29 +339,40 @@ export const config = {
           // Linux and darwin have similar ways to do this (`kill` command);
           // on windows, we will use powershell `Stop-Process -Id` arg
           // TODO: provide a cmd alternative on windows without powershell
-          let store = ''
-          let killCmd = ''
-          if (process.platform === 'linux') {
-            store = join(process.env.HOME as string, '.config', 'krux-installer')
-            killCmd = `kill ${app.pid}`
-          } else if (process.platform === 'win32') {
-            store = join(process.env.APPDATA as string, 'krux-installer')
-          } else if (process.platform === 'darwin') {
-            store = join(process.env.HOME as string, 'Library', 'Application Support', 'krux-installer')
-            killCmd = `Stop-Process -Id ${app.pid}`
-          }
-
-          setTimeout(function () {
-            exec(killCmd, function(err) {
-              if (err) {
-                debug(err)
-                reject(err)
-              }
-              debug(`killed process ${app.pid}`)
-              resolve()
-            })
-          }, 10000)
+          if (process.platform !== 'linux' && process.platform !== 'win32' && process.platform !== 'darwin') {
+            const err = new Error(`Not implement for ${process.platform}`)
+            debug(err)
+            reject(err)
+          } else {
+            let store = ''
+            let killCmd = ''
+            
+            if (process.platform === 'linux') {
+              store = join(process.env.HOME as string, '.config', 'krux-installer')
+              killCmd = `kill ${app.pid}`
+            }
+          
+            if (process.platform === 'win32') {
+              store = join(process.env.APPDATA as string, 'krux-installer')
+              killCmd = `Stop-Process -Id ${app.pid}`
+            } 
           
+            if (process.platform === 'darwin') {
+              store = join(process.env.HOME as string, 'Library', 'Application Support', 'krux-installer')
+              killCmd = `kill ${app.pid}`
+            }
+
+            setTimeout(function () {
+              exec(killCmd, function(err) {
+                if (err) {
+                  debug(err)
+                  reject(err)
+                }
+                debug(`killed process ${app.pid}`)
+                resolve()
+              })
+            }, 10000)
+          }
         } else {
           resolve()
         }

From 9cc3b3dd4e9d756fbf0f71707e28df7f7b054cad Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Wed, 20 Dec 2023 21:03:20 -0300
Subject: [PATCH 06/13] using Taskkill to kill process in windows build

---
 wdio.conf.mts | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/wdio.conf.mts b/wdio.conf.mts
index e6602cc1..706599c9 100644
--- a/wdio.conf.mts
+++ b/wdio.conf.mts
@@ -338,7 +338,7 @@ export const config = {
           // and stop the process killing it providing it pid.
           // Linux and darwin have similar ways to do this (`kill` command);
           // on windows, we will use powershell `Stop-Process -Id` arg
-          // TODO: provide a cmd alternative on windows without powershell
+          // or cmd with `Taskkill /F /PID`
           if (process.platform !== 'linux' && process.platform !== 'win32' && process.platform !== 'darwin') {
             const err = new Error(`Not implement for ${process.platform}`)
             debug(err)
@@ -346,7 +346,7 @@ export const config = {
           } else {
             let store = ''
             let killCmd = ''
-            
+
             if (process.platform === 'linux') {
               store = join(process.env.HOME as string, '.config', 'krux-installer')
               killCmd = `kill ${app.pid}`
@@ -354,7 +354,8 @@ export const config = {
           
             if (process.platform === 'win32') {
               store = join(process.env.APPDATA as string, 'krux-installer')
-              killCmd = `Stop-Process -Id ${app.pid}`
+              killCmd = `Taskkill /F /PID ${app.pid}`
+              //killCmd = `Stop-Process -Id ${app.pid}`
             } 
           
             if (process.platform === 'darwin') {

From c21bed6d344b1cfe5ed43fe2ede3cdbc4bad9cd8 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Thu, 21 Dec 2023 12:26:14 -0300
Subject: [PATCH 07/13] removed unecessary console.log calls

removed unecessary src/assets files
---
 lib/check-resource.ts     | 1 -
 lib/download-resources.ts | 1 -
 src/assets/vite.svg       | 1 -
 src/assets/vue.svg        | 1 -
 src/pages/ConsoleLoad.vue | 1 -
 5 files changed, 5 deletions(-)
 delete mode 100644 src/assets/vite.svg
 delete mode 100644 src/assets/vue.svg

diff --git a/lib/check-resource.ts b/lib/check-resource.ts
index 4489a8ea..0df29ce9 100644
--- a/lib/check-resource.ts
+++ b/lib/check-resource.ts
@@ -42,7 +42,6 @@ export default class CheckResourcesHandler extends Handler {
   build () {
     super.build(async (options) => {
       try {
-        console.log(options)
         const resources = this.storage.get('resources') as string
         const destinationResource = join(resources, options.resource)
       
diff --git a/lib/download-resources.ts b/lib/download-resources.ts
index 2892b638..c8150d36 100644
--- a/lib/download-resources.ts
+++ b/lib/download-resources.ts
@@ -59,7 +59,6 @@ export default class DownloadResourcesHandler extends Handler {
       this.log(options)
       
       const destinationResource = dirname(resourceTo)
-      console.log(destinationResource)
 
       try {
         // First check if destination resource exists
diff --git a/src/assets/vite.svg b/src/assets/vite.svg
deleted file mode 100644
index e7b8dfb1..00000000
--- a/src/assets/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/vue.svg b/src/assets/vue.svg
deleted file mode 100644
index 770e9d33..00000000
--- a/src/assets/vue.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/pages/ConsoleLoad.vue b/src/pages/ConsoleLoad.vue
index ab169be1..eaad26cc 100644
--- a/src/pages/ConsoleLoad.vue
+++ b/src/pages/ConsoleLoad.vue
@@ -54,7 +54,6 @@ function toDashes(msg: string) {
   // windows need to replace \ to -
   tag = tag.replace(/\\/g, '-')
   
-  console.log(tag)
   return tag
 }
 
\ No newline at end of file

From 1b1d2b46cb525b902cf25f34102b50c6384cea34 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Thu, 21 Dec 2023 14:30:30 -0300
Subject: [PATCH 08/13] Removed macos build; Added Disclaimer on CHANGELOG
 Updated README

---
 .github/workflows/build.yml | 10 +++++-----
 CHANGELOG.md                | 12 ++++++++++++
 README.md                   |  4 ++--
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6547efba..cbcd8ca5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -11,7 +11,7 @@ on:
       - ".vscode"
       - ".dockerignore"
       - "Dockerfile"
-      #- ".gitignore"
+      - ".gitignore"
       #- ".github/**"
       #- "!.github/workflows/build.yml"
 
@@ -27,7 +27,7 @@ jobs:
     secrets: 
       token: ${{ secrets.github_token }}
 
-  build-mac-dmg:
-    uses: ./.github/workflows/build-mac-dmg.yml 
-    secrets: 
-      token: ${{ secrets.github_token }}
+  #build-mac-dmg:
+  #  uses: ./.github/workflows/build-mac-dmg.yml 
+  #  secrets: 
+  #    token: ${{ secrets.github_token }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1449d879..41fe2346 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,3 +11,15 @@
   - updated krux firmware version checks to `23.09.1`.
 
 - Updated `openssl` for windows to `3.2.0`.
+
+- Removed MacOS release since the current approach did not worked well
+  on MacOS;
+
+**Disclaimer**:  
+> We will replace the development to python/kivy due to
+two different situations: (1) Windows: needs a custom compilation of openssl
+and  `electron` use `boringssl`; with a python release, it's possible to use
+krux python modules inside the application, so the krux team envisioned
+better compatibility between linux, windows and mac without inject an `opeessl`
+binary in windows; (2) some extended permissions in MacOS and/or the lack
+of an Apple ID linked to the software on darwin system do not allow the flash feature.
\ No newline at end of file
diff --git a/README.md b/README.md
index a7114222..f5702519 100644
--- a/README.md
+++ b/README.md
@@ -189,13 +189,13 @@ For example, if you want to exclude tests until `25th` test,
 you can do this:
 
 ```bash
-yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
+NODE_ENV=test yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
 ```
 
 if you want to debug some messages:
 
 ```bash
-DEBUG=krux:* yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
+DEBUG=krux:* NODE_ENV=test yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
 ```
 
 #### WARNING: Builtin OpenSSL for windows in KruxInstaller

From f9d76b8246f18795abda48dfe220739f137d15d8 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Thu, 21 Dec 2023 19:09:09 -0300
Subject: [PATCH 09/13] linted CHANGELOG and README

---
 CHANGELOG.md | 2 +-
 README.md    | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 41fe2346..6c12cdea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,4 +22,4 @@ and  `electron` use `boringssl`; with a python release, it's possible to use
 krux python modules inside the application, so the krux team envisioned
 better compatibility between linux, windows and mac without inject an `opeessl`
 binary in windows; (2) some extended permissions in MacOS and/or the lack
-of an Apple ID linked to the software on darwin system do not allow the flash feature.
\ No newline at end of file
+of an Apple ID linked to the software on darwin system do not allow the flash feature.
diff --git a/README.md b/README.md
index f5702519..9bf5360b 100644
--- a/README.md
+++ b/README.md
@@ -100,7 +100,7 @@ if you want to show some debug messages:
 DEBUG=krux:* yarn run dev
 ```
 
-##### VSCode/VSCodium
+#### Debug development app with VSCode/VSCodium
 
 If you're codding with VSCode/VSCodium, go to `Run and Debug`
 tab and select `Debug App`:
@@ -172,7 +172,7 @@ To run all tests in command line:
 NODE_ENV=test yarn run e2e
 ```
 
-##### VSCode/VSCodium
+#### Debug test in VSCode/VSCodium
 
 If you're codding with VSCode/VSCodium, the `NODE_ENV`
 variable is already configured. To run, tests, go to `Run and Debug`

From 5ae42540b5f846312b518f9386435dd67cc75200 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Sat, 23 Dec 2023 12:06:49 -0300
Subject: [PATCH 10/13] Added deb packaging to CI workflows; Added minor
 updates to CHANGELOG; Added WARNING.md; Fixed some grammars on tests.

---
 .github/workflows/build-linux-deb.yml     |  73 ++++++++++++
 CHANGELOG.md                              |  30 ++---
 README.md                                 |  79 -------------
 TODO.md                                   |  33 ++++++
 WARNING.md                                | 129 ++++++++++++++++++++++
 package.json                              |  25 +++--
 test/e2e/specs/000.create-config.spec.mts |   8 +-
 test/e2e/specs/001.check-config.spec.mts  |  14 +--
 test/e2e/specs/002.app-startup.spec.mts   |   4 +-
 test/e2e/specs/003.app-logo.spec.mts      |   8 +-
 10 files changed, 282 insertions(+), 121 deletions(-)
 create mode 100644 .github/workflows/build-linux-deb.yml
 create mode 100644 TODO.md
 create mode 100644 WARNING.md

diff --git a/.github/workflows/build-linux-deb.yml b/.github/workflows/build-linux-deb.yml
new file mode 100644
index 00000000..3c01d68c
--- /dev/null
+++ b/.github/workflows/build-linux-deb.yml
@@ -0,0 +1,73 @@
+name: Build electron application as deb package on linux
+
+on:
+  workflow_call:
+    secrets:
+      token:
+        required: true
+
+jobs:
+
+  build-linux:
+    runs-on: ubuntu-latest
+  
+    steps:
+
+      - name: Checkout Git repository
+        uses: actions/checkout@v3
+
+      - name: Install node
+        uses: actions/setup-node@v3
+        with:
+          node-version: "20.10.0"
+
+      - name: Variables helpers
+        id: setup
+        run: |
+          KRUX_VERSION=`node -e "console.log(require('./package.json').version)"`
+          echo "app-version=$KRUX_VERSION" >> $GITHUB_OUTPUT
+          KRUX_NAME=krux-installer
+          echo "app-name=${KRUX_NAME}_${KRUX_VERSION}_amd64" >> $GITHUB_OUTPUT
+          echo "::group::Variables"
+          echo "app-version=$KRUX_VERSION"
+          echo "app-name=$KRUX_NAME"
+          echo "::endgroup::"
+
+      - name: Install dependencies 
+        run: yarn install
+
+      - name: Build electron app
+        env:
+          GH_TOKEN: ${{ secrets.token }}
+        run: yarn run build --linux deb
+
+      - name: Hash electron app (Linux)
+        uses: qlrd/sha256sum-action@v2
+        with:
+          working-directory: ./release/${{ steps.setup.outputs.app-version }}
+          file: ${{ steps.setup.outputs.app-name }}.deb
+          ext: sha256.txt
+
+      - name: List release files
+        run: |
+          echo "::group::Release files"
+          ls -la release/${{ steps.setup.outputs.app-version }}
+          echo "::endgroup::"
+
+      - name: Install xvfb-maybe to allow headless test
+        run: yarn add --dev xvfb-maybe
+
+      - name: E2E test electron app
+        env:
+          DEBUG: 'krux:*'
+        run: ./node_modules/.bin/xvfb-maybe ./node_modules/.bin/wdio run wdio.conf.mts
+
+      - name: Upload artifacts
+        uses: actions/upload-artifact@v3
+        if: ${{ github.ref_name == 'main' }}
+        with:
+          name: ${{ runner.os }}-${{ steps.setup.outputs.app-name }}-deb
+          retention-days: 5
+          path: |
+            release/${{ steps.setup.outputs.app-version }}/${{ steps.setup.outputs.app-name }}.deb
+            release/${{ steps.setup.outputs.app-version }}/${{ steps.setup.outputs.app-name }}.deb.sha256.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c12cdea..0efb829c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,25 +1,27 @@
 # 0.0.1
 
-- Updated main dependencies:
-  - `electron`: 28.0.0;
+- Major updates dependencies:
+  - `electron`: 28.1.0;
   - `vite-plugin-electron`: 0.15.5;
   - `wdio-electron-service`: 6.0.2.
 
+- Minor updates:
+  - `@wdio/cli`: 8.27.0;
+  - `@wdio/globals`: 8.27.0;
+  - `@wdio/local-runner`: 8.27.0;
+  - `@wdio/mocha-framework`: 8.27.0;
+  - `@wdio/spec-reporter`: 8.27.0;
+  - `vue`: 3.3.13;
+  - `vue-tsc`: 1.8.26;
+  - `vuetify`: 3.4.8;
+
 - Refactored `test/e2e/specs`:
   - to suit `wdio-electron-service` major updates that break E2E tests;
   - renamed extensions to `mts` to suit `vite-plugin-electron`;
-  - updated krux firmware version checks to `23.09.1`.
+  - updated krux firmware version checks to `23.09.1`;
 
-- Updated `openssl` for windows to `3.2.0`.
+- Updated `openssl` for windows to `3.2.0` *;
 
-- Removed MacOS release since the current approach did not worked well
-  on MacOS;
+- Removed MacOS release since the current approach did not worked well on MacOS;
 
-**Disclaimer**:  
-> We will replace the development to python/kivy due to
-two different situations: (1) Windows: needs a custom compilation of openssl
-and  `electron` use `boringssl`; with a python release, it's possible to use
-krux python modules inside the application, so the krux team envisioned
-better compatibility between linux, windows and mac without inject an `opeessl`
-binary in windows; (2) some extended permissions in MacOS and/or the lack
-of an Apple ID linked to the software on darwin system do not allow the flash feature.
+> \* see [WARNING](WARNING.md)
diff --git a/README.md b/README.md
index 9bf5360b..045ff520 100644
--- a/README.md
+++ b/README.md
@@ -179,82 +179,3 @@ variable is already configured. To run, tests, go to `Run and Debug`
 tab and select `Test E2E App`:
 
 ![VScodium E2E test](images/vscodium.png)
-
-##### Filter tests
-
-Additionaly, you can filter some tests with
-`--filter` option and a based regular expression argument.
-
-For example, if you want to exclude tests until `25th` test,
-you can do this:
-
-```bash
-NODE_ENV=test yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
-```
-
-if you want to debug some messages:
-
-```bash
-DEBUG=krux:* NODE_ENV=test yarn run e2e --filter '0([0-1][0-9]|2[0-4]).*.spec.mts'
-```
-
-#### WARNING: Builtin OpenSSL for windows in KruxInstaller
-
-When downloading official krux firmware versions,
-it is necessary to verify the signature through the OpenSSL tool,
-as a way to verify the authenticity of the downloaded binaries.
-
-On "Unix like" releases (Linux and MacOS),
-verification is easily done since such tool
-exists natively in operating system.
-
-In windows release,
-we are faced with the peculiarity of the operating system in question
-do not have such a tool
-(see this [issue](https://github.com/qlrd/krux-installer/issues/2)).
-
-So, we packaged a stable version of OpenSSL, and
-compiled it from the [source](https://github.com/openssl/openssl).
-The compilation process is done entirely in a reproducible virtual environment and,
-therefore, not locally, with the github-action [compile-openssl-windows-action](https://github.com/qlrd/compile-openssl-windows-action/actions).
-
-Since it is compiled in a virtual environment on github:
-
-- it is expected to be fully verifiable and free of malicious code;
-- it is expected that, if you're developing in Windows machine,
-some difficulties will be appear.
-- You can check the build steps in [actions](https://github.com/qlrd/krux-installer/actions).
-
-## TODOs
-
-- Kendryte K210 devices:
-  - [x] Flash to M5stickV;
-  - [x] Flash to Sipeed Amigo;
-  - [x] Flash to Sipeed Bit;
-  - [x] Flash to Sipeed Dock;
-  - [ ] Flash to Yahboom Aimotion
-  - [ ] Build from source to M5stickV;
-  - [ ] Build from source to Sipeed Amigo;
-  - [ ] Build from source to Sipeed Bit;
-  - [ ] Build from source to Sipeed Dock;
-  - [ ] Debug for M5stickV;
-  - [ ] Debug for Sipeed Amigo;
-  - [ ] Debug for Sipeed Bit;
-  - [ ] Debug for Sipeed Dock;
-- [odudex Android version](https://github.com/odudex/krux_binaries/tree/main/Android):
-  - [ ] Transfer to device;
-  - [ ] Build for device;
-  - [ ] Debug for device.
-- Windows:
-  - [x] Build NSIS installer;
-  - [ ] Build Portable installer;
-  - [ ] Build AppX installer;
-- Linux:
-  - [x] Build `AppImage` standalone;
-  - [ ] Build `deb` package for [apt-get](https://www.debian.org/doc/manuals/apt-howto/);
-  - [ ] Build `snap` package for [snapcraft](https://snapcraft.io/);
-  - [ ] Build `pacman` package for [pacman](https://wiki.archlinux.org/title/Pacman).
-- MacOS:
-  - [x] Build DMG installer;
-  - [ ] Build PKG installer;
-  - [ ] Build MAS installer;
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 00000000..aab660fe
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,33 @@
+# TODO
+
+- Kendryte K210 devices:
+  - [x] Flash to M5stickV;
+  - [x] Flash to Sipeed Amigo;
+  - [x] Flash to Sipeed Bit;
+  - [x] Flash to Sipeed Dock;
+  - [ ] Flash to Yahboom Aimotion
+  - [ ] Build from source to M5stickV;
+  - [ ] Build from source to Sipeed Amigo;
+  - [ ] Build from source to Sipeed Bit;
+  - [ ] Build from source to Sipeed Dock;
+  - [ ] Debug for M5stickV;
+  - [ ] Debug for Sipeed Amigo;
+  - [ ] Debug for Sipeed Bit;
+  - [ ] Debug for Sipeed Dock;
+- [odudex Android version](https://github.com/odudex/krux_binaries/tree/main/Android):
+  - [ ] Transfer to device;
+  - [ ] Build for device;
+  - [ ] Debug for device.
+- Windows:
+  - [x] Build NSIS installer;
+  - [ ] Build Portable installer;
+  - [ ] Build AppX installer;
+- Linux:
+  - [x] Build `AppImage` standalone;
+  - [x] Build `deb` package for [apt-get](https://www.debian.org/doc/manuals/apt-howto/);
+  - [ ] Build `snap` package for [snapcraft](https://snapcraft.io/);
+  - [ ] Build `pacman` package for [pacman](https://wiki.archlinux.org/title/Pacman).
+- MacOS:
+  - [x] Build DMG installer;
+  - [ ] Build PKG installer;
+  - [ ] Build MAS installer;
diff --git a/WARNING.md b/WARNING.md
new file mode 100644
index 00000000..b89e086f
--- /dev/null
+++ b/WARNING.md
@@ -0,0 +1,129 @@
+# Warning
+
+We will replace the development of `krux-installer` from `typescript/electron`
+to `python/kivy`.
+
+## Why the change?
+
+The decision was made among the members of the `selfcustody`
+team due to:
+
+- Unify software development in Python; 
+- Behaviors with SSL routines, in windows, that differ from what would be considered "normalized";
+- Fail to flash in MacOS.
+
+### Why unify software development in Python
+
+Maintenance and review of codes can be more extensive.
+
+### What systems differ in behavior with SSL routines?
+
+- Windows
+- MacOS
+
+### Why we need SSL routines?
+
+When downloading official krux firmware versions, it is necessary to verify
+the signature through a external OpenSSL tool, as a way to verify the authenticity
+of the downloaded binaries.
+
+## Why behaviors with SSL routines, in windows, differ from what would be considered "normalized"?
+
+We need to pack an external `openssl` into `krux-installer` package.
+
+### Why?
+
+On "Unix like" releases (Linux and MacOS), verification is easily done
+since such tool exists natively in operating system. In windows release, we are faced with the peculiarity of the operating
+system in question do not have such a tool
+(see this [issue](https://github.com/qlrd/krux-installer/issues/2)).
+
+### How has it been resolved so far?
+
+We compiled a stable version of OpenSSL from the
+[source](https://github.com/openssl/openssl) an packaged it on our software.
+
+#### This isn't insecure?
+
+We believe not, since the compilation process
+is done entirely in a reproducible virtual environment and,
+therefore, not locally, with the github-action
+[compile-openssl-windows-action](https://github.com/qlrd/compile-openssl-windows-action/actions).
+
+## MacOS: how flash fail?
+
+The application works until you try to flash the device. Once you try
+to flash, a message like this will appear:
+
+```bash
+Error: 0:336: execution error: [1047] Cannot open PyInstaller
+archive from executable
+(/Users/user/Documents/krux-installer/krux-v23.09.0/ktool-mac)
+or external archive
+(/Users/user/Documents/krux-installer/krux-v23.09.0/ktool-mac.pkg) (255)
+
+    at Socket. (/Applications/krux-installer.app/Contents/Resources/app.asar/dist-electron/main/index.js:6:381)
+    at Socket.emit (node:events:513:28)
+    at addChunk (node:internal/streams/readable:324:12)
+    at readableAddChunk (node:internal/streams/readable:297:9)
+    at Socket.push (node:internal/streams/readable:234:10)
+    at Pipe.onStreamRead (node:internal/stream_base_commons:190:23)
+```
+
+### What this means?
+
+This means that the `ktool-mac`, aka the "flasher", in `krux-installer` failed to be executed.
+
+### Why this happen?
+
+Although we don't know for sure, we conjecture a hypotheses:
+
+- (1) The `krux-installer` download `ktool-mac` from a source
+that `apple` did not recognize as safer;
+- (2) If it isnt safer, `macOS` add an [extended file permission](https://apple.stackexchange.com/questions/42177/what-does-signify-in-unix-file-permissions);
+- (3) This extended file permission puts the `ktool-mac` in a quarantine;
+- (4) flash will not work.
+
+## And why not use a nodejs module, instead an external tool, to verify?
+
+The usage of SSL routines, in nodejs is done by
+[Native Node Modules](https://www.electronjs.org/docs/latest/tutorial/using-native-node-modules).
+
+### And?
+
+As stated by `electron` documentation:
+
+> Native Node.js modules are supported by Electron,
+but since Electron has a different application binary interface (ABI)
+from a given Node.js binary (due to **differences such as using Chromium's
+BoringSSL instead of OpenSSL**)
+
+### What's BoringSSL?
+
+As stated by BoringSSL [`README`](https://github.com/google/boringssl):
+
+> BoringSSL is a fork of OpenSSL that is designed to meet Google's needs.
+
+### How BoringSSL affects krux-installer?
+
+The [curve used](https://github.com/selfcustody/krux/blob/7add64a0fa8cdae65e49f8bd9bd0f7ff09e95e84/krux#L151)
+to sign the firmware is `secp256k1` (the same used in Bitcoin).
+
+The BoringSSL [does not implement
+`secp256k1`](https://github.com/electron/electron/issues/32535) and,
+therefore, it is not possible
+to check this curve using javascript code in electron.
+
+## These can be solved with a python module?
+
+We believe that yes;
+
+### Which module?
+
+[pyOpenSSL](https://pypi.org/project/pyOpenSSL/);
+
+### And why you can believe that?
+
+We already made an experiment with
+[`krux-file-signer`](https://github.com/selfcustody/krux-file-signer/blob/c541dbc730f833d64c068245fae30a42bc3f2580/src/cli/verifyer.py#L97)
+in linux and windows.
diff --git a/package.json b/package.json
index 10c22edb..c2129c83 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,10 @@
     "preview": "vite preview",
     "e2e": "wdio run wdio.conf.mts",
     "lint:readme": "markdownlint README.md --ignore node_modules",
-    "lint:changelog": "markdownlint CHANGELOG.md --ignore node_modules"
+    "lint:changelog": "markdownlint CHANGELOG.md --ignore node_modules",
+    "lint:warning": "markdownlint WARNING.md --ignore node_modules",
+    "lint:todo": "markdownlint TODO.md --ignore node_modules",
+    "lint": "yarn run lint:readme && yarn run lint:changelog && yarn run lint:warning && yarn run lint:todo"
   },
   "devDependencies": {
     "@babel/cli": "^7.22.9",
@@ -48,15 +51,15 @@
     "@types/command-exists": "^1.2.0",
     "@types/debug": "^4.1.7",
     "@types/mocha": "^10.0.1",
-    "@types/node": "^20.4.3",
+    "@types/node": "^20.10.5",
     "@vitejs/plugin-vue": "^4.1.0",
-    "@wdio/cli": "^8.13.5",
-    "@wdio/globals": "^8.13.4",
-    "@wdio/local-runner": "^8.13.4",
-    "@wdio/mocha-framework": "^8.12.1",
-    "@wdio/spec-reporter": "^8.12.2",
+    "@wdio/cli": "^8.27.0",
+    "@wdio/globals": "^8.27.0",
+    "@wdio/local-runner": "^8.27.0",
+    "@wdio/mocha-framework": "^8.27.0",
+    "@wdio/spec-reporter": "^8.27.0",
     "chai": "^4.3.7",
-    "electron": "^28.0.0",
+    "electron": "^28.1.0",
     "electron-builder": "^24.4.0",
     "glob": "^10.3.3",
     "markdownlint-cli": "^0.38.0",
@@ -69,8 +72,8 @@
     "vite-plugin-electron": "^0.15.5",
     "vite-plugin-electron-renderer": "^0.14.1",
     "vite-plugin-html": "^3.2.0",
-    "vue": "^3.2.47",
-    "vue-tsc": "^1.8.6",
+    "vue": "^3.3.13",
+    "vue-tsc": "^1.8.26",
     "wdio-electron-service": "^6.0.2"
   },
   "dependencies": {
@@ -82,7 +85,7 @@
     "electron-store": "^8.1.0",
     "vite-plugin-vuetify": "^2.0.1",
     "vue-asciimorph": "^0.0.3",
-    "vuetify": "^3.3.9",
+    "vuetify": "^3.4.8",
     "yauzl": "^2.10.0"
   }
 }
diff --git a/test/e2e/specs/000.create-config.spec.mts b/test/e2e/specs/000.create-config.spec.mts
index ec7b5ca1..64c785f8 100644
--- a/test/e2e/specs/000.create-config.spec.mts
+++ b/test/e2e/specs/000.create-config.spec.mts
@@ -5,8 +5,8 @@ import { browser } from '@wdio/globals'
 import { describe, it } from 'mocha'
 
 describe('KruxInstaller configuration', () => {
-
-  it('should \'appData\' path exist with \'krux-installer\' directory', async () => {
+  
+  it('\'appData\' property should be a path that exist within \'krux-installer\' directory', async () => {
     const appData = await browser.electron.execute(function (electron) {
       return electron.app.getPath('appData')
     })
@@ -14,7 +14,7 @@ describe('KruxInstaller configuration', () => {
     expect(list.includes('krux-installer')).to.be.true
   })
 
-  it('should \'config.json\' file exists inside \'krux-installer\' directory', async () => {
+  it('\'config.json\' file should exists inside \'krux-installer\' directory', async () => {
     const appData = await browser.electron.execute(function (electron) {
       return electron.app.getPath('appData')
     })
@@ -23,7 +23,7 @@ describe('KruxInstaller configuration', () => {
     expect(list.includes('config.json')).to.be.true
   })
 
-  it('should \'config.json\' be a readable string', async () => {
+  it('\'config.json\' should be a readable string', async () => {
     const appData = await browser.electron.execute(function (electron) {
       return electron.app.getPath('appData')
     })
diff --git a/test/e2e/specs/001.check-config.spec.mts b/test/e2e/specs/001.check-config.spec.mts
index 2d6b2303..089f03cf 100644
--- a/test/e2e/specs/001.check-config.spec.mts
+++ b/test/e2e/specs/001.check-config.spec.mts
@@ -6,14 +6,14 @@ const { version } = createRequire(import.meta.url)('../../../package.json')
 
 describe('Check created configuration', () => {
 
-  it('should \'appVersion\' property be equal to the defined in package.json', async () => {
+  it('\'appVersion\' property should be equal to the value defined in package.json', async () => {
     const appVersion = await browser.electron.execute(function (electron) {
       return electron.app.getVersion()
     })
     expect(appVersion).to.equal(version)
   })
 
-  it('should \'resources\' property be properly set for the platform', async () => {
+  it('\'resources\' property should be properly set for the platform', async () => {
     const resources = await browser.electron.execute(function (electron) {
       return electron.app.store.get('resources')
     })
@@ -50,14 +50,14 @@ describe('Check created configuration', () => {
     }
   })
 
-  it('should \'os\' property be properly set for the platform', async () => {
+  it('\'os\' property should be properly set for the platform', async () => {
     const os = await browser.electron.execute(function (electron) {
       return electron.app.store.get('os')
     })
     expect(os).to.equal(process.platform) 
   })
 
-  it('should \'versions\' property to be an Array with 0 elements', async () => {
+  it('\'versions\' property should be an Array with 0 elements', async () => {
     const versions = await browser.electron.execute(function (electron) {
       return electron.app.store.get('versions')
     })
@@ -65,21 +65,21 @@ describe('Check created configuration', () => {
     expect(versions.length).to.equal(0)
   })
 
-  it('should \'version\' property to be equal \'Select version\'', async () => {
+  it('\'version\' property should be equal to \'Select version\'', async () => {
     const version = await browser.electron.execute(function (electron) {
       return electron.app.store.get('version')
     })
     expect(version).to.equal('Select version')
   })
 
-  it('should \'device\' property to be equal \'Select device\'', async () => {
+  it('\'device\' property should be equal to \'Select device\'', async () => {
     const device = await browser.electron.execute(function (electron) {
       return electron.app.store.get('device')
     })
     expect(device).to.equal('Select device')
   })
 
-  it('should \'showFlash\' property to be equal \'false\'', async () => {
+  it('\'device\' property should be equal to \'Select device\'', async () => {
     const showFlash = await browser.electron.execute(function (electron) {
       return electron.app.store.get('showFlash')
     })
diff --git a/test/e2e/specs/002.app-startup.spec.mts b/test/e2e/specs/002.app-startup.spec.mts
index 201f3466..4d739a11 100644
--- a/test/e2e/specs/002.app-startup.spec.mts
+++ b/test/e2e/specs/002.app-startup.spec.mts
@@ -11,14 +11,14 @@ describe('KruxInstaller start up', () => {
     expect(isReady).to.be.equal(true)
   })
 
-  it('should name be correct', async () => {
+  it('application name should be correct', async () => {
     const name = await browser.electron.execute(function (electron) {
       return electron.app.getName()
     })
     expect(name).to.be.equal('krux-installer')
   })
 
-  it('should version be correct', async () => {
+  it('application version should be correct', async () => {
     const version = await browser.electron.execute(function (electron) {
       return electron.app.getVersion()
     })
diff --git a/test/e2e/specs/003.app-logo.spec.mts b/test/e2e/specs/003.app-logo.spec.mts
index f3c06001..ed434009 100644
--- a/test/e2e/specs/003.app-logo.spec.mts
+++ b/test/e2e/specs/003.app-logo.spec.mts
@@ -31,21 +31,21 @@ describe('KruxInstaller initialization', () => {
     instance = new App()
   })
 
-  it('should #app html exist', async () => { 
+  it('\'#app\' html tag should exist', async () => { 
     await instance.app.waitForExist({ timeout: 5000 })
   })
 
-  it('should main tag exist', async () => { 
+  it('\'#main\' html tag should exist', async () => { 
     await instance.main.waitForExist({ timeout: 5000 })
   })
 
-  it('should krux-installer logo appears', async () => { 
+  it('krux-installer logo should appears', async () => { 
     await instance.logo.waitForExist({ timeout: 3000 })
     await expect(instance.logo).toBeDisplayed()
     await expect(instance.logo).toHaveText(KRUX_INSTALLER_LOGO)
   })
 
-  it('should krux-installer logo disappears', async () => { 
+  it('krux-installer logo should disappear', async () => { 
     await instance.logo.waitForExist({ timeout: 3000, reverse: true })
   })
 })

From 8eeb16ef66bf3dc849cf2895a25480560755b321 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Sat, 23 Dec 2023 12:09:59 -0300
Subject: [PATCH 11/13] Fixed lint on WARNING.md

---
 WARNING.md | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/WARNING.md b/WARNING.md
index b89e086f..b765c0d0 100644
--- a/WARNING.md
+++ b/WARNING.md
@@ -8,8 +8,9 @@ to `python/kivy`.
 The decision was made among the members of the `selfcustody`
 team due to:
 
-- Unify software development in Python; 
-- Behaviors with SSL routines, in windows, that differ from what would be considered "normalized";
+- Unify software development in Python;
+- Behaviors with SSL routines, in windows,
+  that differ from what would be considered "normalized";
 - Fail to flash in MacOS.
 
 ### Why unify software development in Python
@@ -27,14 +28,15 @@ When downloading official krux firmware versions, it is necessary to verify
 the signature through a external OpenSSL tool, as a way to verify the authenticity
 of the downloaded binaries.
 
-## Why behaviors with SSL routines, in windows, differ from what would be considered "normalized"?
+## Why behaviors with SSL routines differ?
 
 We need to pack an external `openssl` into `krux-installer` package.
 
 ### Why?
 
 On "Unix like" releases (Linux and MacOS), verification is easily done
-since such tool exists natively in operating system. In windows release, we are faced with the peculiarity of the operating
+since such tool exists natively in operating system.
+In windows release, we are faced with the peculiarity of the operating
 system in question do not have such a tool
 (see this [issue](https://github.com/qlrd/krux-installer/issues/2)).
 
@@ -72,7 +74,8 @@ or external archive
 
 ### What this means?
 
-This means that the `ktool-mac`, aka the "flasher", in `krux-installer` failed to be executed.
+This means that the `ktool-mac`, aka the "flasher",
+in `krux-installer` failed to be executed.
 
 ### Why this happen?
 

From 58f4100a0c0510c1b7527f326909467641e9d909 Mon Sep 17 00:00:00 2001
From: qlrd <106913782+qlrd@users.noreply.github.com>
Date: Sat, 23 Dec 2023 12:14:19 -0300
Subject: [PATCH 12/13] Fixed the forgotten deb package on build.yml

---
 .github/workflows/build.yml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index cbcd8ca5..a57a4156 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -22,6 +22,11 @@ jobs:
     secrets: 
       token: ${{ secrets.github_token }}
 
+  build-linux-deb:
+    uses: ./.github/workflows/build-linux-deb.yml
+    secrets: 
+      token: ${{ secrets.github_token }}
+
   build-windows-nsis:
     uses: ./.github/workflows/build-windows-nsis.yml 
     secrets: 

From 77426a1a9e9c12050a8e3b432ce1416c582dbddc Mon Sep 17 00:00:00 2001
From: Jean Do 
Date: Sat, 23 Dec 2023 12:44:13 -0400
Subject: [PATCH 13/13] proof-reading suggestions

---
 WARNING.md | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/WARNING.md b/WARNING.md
index b765c0d0..128ebc96 100644
--- a/WARNING.md
+++ b/WARNING.md
@@ -6,16 +6,16 @@ to `python/kivy`.
 ## Why the change?
 
 The decision was made among the members of the `selfcustody`
-team due to:
+team for the following reasons:
 
-- Unify software development in Python;
+- To unify software development in Python;
 - Behaviors with SSL routines, in windows,
   that differ from what would be considered "normalized";
-- Fail to flash in MacOS.
+- Failure to flash in MacOS.
 
 ### Why unify software development in Python
 
-Maintenance and review of codes can be more extensive.
+Maintenance and review of code can be more extensive.
 
 ### What systems differ in behavior with SSL routines?
 
@@ -25,7 +25,7 @@ Maintenance and review of codes can be more extensive.
 ### Why we need SSL routines?
 
 When downloading official krux firmware versions, it is necessary to verify
-the signature through a external OpenSSL tool, as a way to verify the authenticity
+the signature through an external OpenSSL tool, as a way to verify the authenticity
 of the downloaded binaries.
 
 ## Why behaviors with SSL routines differ?
@@ -35,15 +35,15 @@ We need to pack an external `openssl` into `krux-installer` package.
 ### Why?
 
 On "Unix like" releases (Linux and MacOS), verification is easily done
-since such tool exists natively in operating system.
+since such tool exists natively in the operating system.
 In windows release, we are faced with the peculiarity of the operating
-system in question do not have such a tool
+system in question.  Windows does not natively have such a tool
 (see this [issue](https://github.com/qlrd/krux-installer/issues/2)).
 
 ### How has it been resolved so far?
 
 We compiled a stable version of OpenSSL from the
-[source](https://github.com/openssl/openssl) an packaged it on our software.
+[source](https://github.com/openssl/openssl) and packaged it on our software.
 
 #### This isn't insecure?
 
@@ -52,7 +52,7 @@ is done entirely in a reproducible virtual environment and,
 therefore, not locally, with the github-action
 [compile-openssl-windows-action](https://github.com/qlrd/compile-openssl-windows-action/actions).
 
-## MacOS: how flash fail?
+## MacOS: how flash fails?
 
 The application works until you try to flash the device. Once you try
 to flash, a message like this will appear:
@@ -79,11 +79,11 @@ in `krux-installer` failed to be executed.
 
 ### Why this happen?
 
-Although we don't know for sure, we conjecture a hypotheses:
+Although we don't know for sure, we suspect that:
 
 - (1) The `krux-installer` download `ktool-mac` from a source
-that `apple` did not recognize as safer;
-- (2) If it isnt safer, `macOS` add an [extended file permission](https://apple.stackexchange.com/questions/42177/what-does-signify-in-unix-file-permissions);
+that `apple` did not recognize as "safe";
+- (2) If it isn't "safe", `macOS` adds an [extended file permission](https://apple.stackexchange.com/questions/42177/what-does-signify-in-unix-file-permissions);
 - (3) This extended file permission puts the `ktool-mac` in a quarantine;
 - (4) flash will not work.
 
@@ -119,14 +119,14 @@ to check this curve using javascript code in electron.
 
 ## These can be solved with a python module?
 
-We believe that yes;
+Yes, we believe so;
 
 ### Which module?
 
 [pyOpenSSL](https://pypi.org/project/pyOpenSSL/);
 
-### And why you can believe that?
+### And why do you believe that?
 
-We already made an experiment with
+We've already made an experiment with
 [`krux-file-signer`](https://github.com/selfcustody/krux-file-signer/blob/c541dbc730f833d64c068245fae30a42bc3f2580/src/cli/verifyer.py#L97)
 in linux and windows.