Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
25fff58
chore: prepare for release v1.0
awana-release-bot[bot] Dec 15, 2025
c9cf85b
chore: update default bounding box used for observations map (#468)
achou11 Dec 16, 2025
ec13c5e
fix: clean up editing state when navigating away from observation (#471)
achou11 Dec 17, 2025
65e18ba
fix: potentially fix unhandled error in map rendering (#472)
achou11 Dec 17, 2025
8114698
chore: update deps (#473)
achou11 Dec 17, 2025
475f289
New Crowdin updates (#469)
digidem-bot Dec 17, 2025
821ab98
chore: minor adjustments to the join project onboarding page (#474)
achou11 Dec 17, 2025
fe4f9d0
chore: update deps (#476)
achou11 Jan 5, 2026
2080da3
chore: create reusable action for updating global npm version (#477)
achou11 Jan 6, 2026
5b1943e
chore: add CI step for checking Electron node version (#478)
achou11 Jan 6, 2026
901c3ec
chore: minor cleanup in device details page (#479)
achou11 Jan 6, 2026
441ab76
fix: account for another case of redacted ssid on macOS (#483)
achou11 Jan 7, 2026
89877dd
fix: fix redirect issue when leaving a project (#485)
achou11 Jan 10, 2026
00c7e50
chore: fix category selection when creating test data (#487)
achou11 Jan 19, 2026
a9da67e
fix: fix error screen after device accepts invite sent by us (#488)
achou11 Jan 19, 2026
0057f73
chore: add restart button for generic route error component (#489)
achou11 Jan 19, 2026
c10821b
chore: use custom protocol for packaged application (#490)
achou11 Jan 20, 2026
780eefe
chore: update tanstack router deps to latest (#492)
achou11 Jan 20, 2026
f06347e
chore: update deps (#486)
achou11 Jan 20, 2026
850da3b
New Crowdin updates (#491)
digidem-bot Jan 20, 2026
9023795
chore: implement e2e test isolation (#493)
achou11 Jan 22, 2026
a135caf
chore: update deps (#501)
achou11 Jan 26, 2026
bc513d5
chore: use exact text locator in welcome page e2e test (#503)
achou11 Jan 27, 2026
5e46b3d
fix: adjust word break behavior for project tooltip and popup (#502)
achou11 Jan 27, 2026
9fb7f92
chore: add initial e2e tests for project data page (#504)
achou11 Jan 28, 2026
6bc56b7
chore: add initial e2e test for inviting another device (#505)
achou11 Jan 28, 2026
429bd83
New Crowdin updates (#506)
digidem-bot Jan 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .github/update-npm-version/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Update npm version

description: Updates the global npm version based on the `devEngines` field of a package.json

inputs:
package-json-path:
description: Path pointing to package.json file. Attempts to use the one in current directory by default.
required: false
default: './package.json'

outputs:
npm-version:
description: Installed npm version
value: ${{ steps.update-npm.npm-version }}

runs:
using: composite
steps:
- name: Update npm
id: update-npm
shell: bash
env:
PACKAGE_JSON_PATH: ${{ inputs.package-json-path }}
run: |
version=$(cat "$PACKAGE_JSON_PATH" | jq '.devEngines.packageManager.version' --raw-output)

echo "Version detected: $version"

npm install -g npm@$version

echo "npm-version=$(npm --version)" >> $GITHUB_OUTPUT
64 changes: 31 additions & 33 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,45 @@ concurrency:
cancel-in-progress: ${{ github.ref_name != github.event.repository.default_branch }}

jobs:
lint:
checks:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Use Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
id: setup-node
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: '.nvmrc'

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Install deps
run: npm ci

- name: Check Electron node version
shell: bash
env:
EXPECTED_NODE_VERSION: ${{ steps.setup-node.outputs.node-version }}
run: |
electron_node_version=$(ELECTRON_RUN_AS_NODE=true npx electron -e 'console.log(process.versions.node);')

# Version string from setup-node is prefixed with "v"
if [[ "v$electron_node_version" == "$EXPECTED_NODE_VERSION" ]]
then
echo "✅ Electron node version matches expected ($electron_node_version)"
else
echo "⛔️ Electron node version ($electron_node_version) does not match expected ($EXPECTED_NODE_VERSION)"
exit 1
fi

- name: Build translations
run: node --run intl

- name: Run lint
run: node --run lint
- name: Run checks
run: node --run checks

test:
timeout-minutes: 10
strategy:
Expand All @@ -52,16 +66,12 @@ jobs:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

- name: Use Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: '.nvmrc'

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Install deps
run: npm ci
Expand Down Expand Up @@ -92,16 +102,12 @@ jobs:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

- name: Use Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: '.nvmrc'

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Install deps
run: npm ci
Expand All @@ -119,22 +125,14 @@ jobs:

- name: Run e2e tests
if: ${{ matrix.os.name != 'linux'}}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
with:
timeout_minutes: 5
max_attempts: 3
command: node --run test-e2e
run: node --run test-e2e

# NOTE: Addresses issue with app not launching (https://github.com/microsoft/playwright/issues/34251#issuecomment-2580645333)
- name: Run e2e tests (Linux)
if: ${{ matrix.os.name == 'linux'}}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
with:
timeout_minutes: 5
max_attempts: 3
command: |
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- node --run test-e2e
run: |
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- node --run test-e2e

- name: Upload Playwright report
if: ${{ !cancelled() }}
Expand Down
8 changes: 2 additions & 6 deletions .github/workflows/create-builds.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,12 @@ jobs:
fetch-depth: 0

- name: Set up Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Install dependencies
run: npm ci
Expand Down
8 changes: 2 additions & 6 deletions .github/workflows/hotfix-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,12 @@ jobs:
token: ${{ steps.app-token.outputs.token }}

- name: Setup Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Parse version
id: version
Expand Down
8 changes: 2 additions & 6 deletions .github/workflows/scheduled-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,12 @@ jobs:
token: ${{ steps.app-token.outputs.token }}

- name: Setup Node.js
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc

- name: Update npm version
shell: bash
run: |
version=$(cat package.json | jq '.devEngines.packageManager.version' --raw-output)
echo "Version detected: $version"
npm install -g npm@$version
uses: ./.github/update-npm-version

- name: Parse version
id: version
Expand Down
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# We keep this aligned with the Node version that comes with Electron

22.21.1
24.11.1
2 changes: 1 addition & 1 deletion .tool-versions
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# We keep this aligned with the Node version that comes with Electron

nodejs 22.21.1
nodejs 24.11.1
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ Go to the [Development](./docs/DEVELOPMENT.md) docs to learn about how the proje

Make sure you have the preferred versions of tooling installed:

- [`NodeJS`](https://nodejs.org): [22.21.1](./.nvmrc)
- [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm): 11.7.0
- [`NodeJS`](https://nodejs.org): [24.11.1](./.nvmrc)
- [`npm`](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm): 11.8.0

1. Clone the repo:

Expand Down
18 changes: 11 additions & 7 deletions forge.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { mkdirSync } from 'node:fs'
import fs from 'node:fs/promises'
import { arch, platform } from 'node:os'
import path from 'node:path'
import { loadEnvFile } from 'node:process'
import { fileURLToPath } from 'node:url'
import { MakerDeb } from '@electron-forge/maker-deb'
import { MakerDMG } from '@electron-forge/maker-dmg'
Expand All @@ -12,6 +13,11 @@ import { MakerZIP } from '@electron-forge/maker-zip'
import { AutoUnpackNativesPlugin } from '@electron-forge/plugin-auto-unpack-natives'
import { PluginBase } from '@electron-forge/plugin-base'
import { FusesPlugin } from '@electron-forge/plugin-fuses'
import type {
ForgeConfig,
ForgeConfigPlugin,
ForgeHookFn,
} from '@electron-forge/shared-types'
import { FuseV1Options, FuseVersion } from '@electron/fuses'
import { MakerAppImage } from '@reforged/maker-appimage'
import semver from 'semver'
Expand All @@ -21,13 +27,11 @@ import { build, createServer, type ViteDevServer } from 'vite'
import packageJSON from './package.json' with { type: 'json' }
import type { AppConfig, AppType } from './src/shared/app.ts'

import 'dotenv/config'

import type {
ForgeConfig,
ForgeConfigPlugin,
ForgeHookFn,
} from '@electron-forge/shared-types'
try {
loadEnvFile()
} catch (err) {
console.warn(`Failed to load .env file: ${err}`)
}

const {
APP_TYPE,
Expand Down
2 changes: 1 addition & 1 deletion knip.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default {
project: [
'src/**/*.{js,ts,jsx,tsx}!',
'scripts/*.{js,ts}',
'tests-e2e/*.{js,ts}',
'tests-e2e/**/*.{js,ts}',
'*.{js,ts}',
],
ignore: [
Expand Down
16 changes: 16 additions & 0 deletions messages/renderer/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
"description": "Text for button to reload page.",
"message": "Reload"
},
"components.generic-route-error-component.restart": {
"description": "Text for button to restart app.",
"message": "Neustart"
},
"components.generic-route-error-component.somethinWentWrong": {
"description": "Title text of page error",
"message": "Etwas ist schief gelaufen"
Expand Down Expand Up @@ -539,6 +543,10 @@
"description": "Text displayed when waiting for Wi-Fi information.",
"message": "Lade Wi-Fi-Informationen…"
},
"routes.app.projects.$projectId_.invite.devices.index.goBackAccessibleLabel": {
"description": "Accessible label for back button",
"message": "Gehe zurück."
},
"routes.app.projects.$projectId_.invite.devices.index.navTitle": {
"description": "Title of the device selection for invite page.",
"message": "Gerät auswählen"
Expand All @@ -547,6 +555,10 @@
"description": "Detail about how to control data sharing.",
"message": "Freigabe in den Projekteinstellungen kontrollieren."
},
"routes.app.projects.$projectId_.invite.index.goBackAccessibleLabel": {
"description": "Accessible label for back button.",
"message": "Gehe zurück."
},
"routes.app.projects.$projectId_.invite.index.inviteCollaborators": {
"description": "Title of the Invite Get Started page.",
"message": "Mitarbeiter einladen"
Expand Down Expand Up @@ -707,6 +719,10 @@
"description": "Text indicating collaborator is a coordinator.",
"message": "Koordinator"
},
"routes.app.projects.$projectId_.team.$deviceId.goBackAccessibleLabel": {
"description": "Accessible label for back button.",
"message": "Gehe zurück."
},
"routes.app.projects.$projectId_.team.$deviceId.lastCoordinatorWarning": {
"description": "Warning text about leaving the project as the last coordinator.",
"message": "Sie sind der letzte Koordinator. Überlegen Sie, ein anderes Gerät zu einem Koordinator zu machen, bevor Sie das Projekt verlassen."
Expand Down
12 changes: 12 additions & 0 deletions messages/renderer/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
"description": "Text for button to reload page.",
"message": "Reload"
},
"components.generic-route-error-component.restart": {
"description": "Text for button to restart app.",
"message": "Restart"
},
"components.generic-route-error-component.somethinWentWrong": {
"description": "Title text of page error",
"message": "Something went wrong"
Expand Down Expand Up @@ -539,6 +543,10 @@
"description": "Text displayed when waiting for Wi-Fi information.",
"message": "Getting Wi-Fi information…"
},
"routes.app.projects.$projectId_.invite.devices.index.goBackAccessibleLabel": {
"description": "Accessible label for back button",
"message": "Go back."
},
"routes.app.projects.$projectId_.invite.devices.index.navTitle": {
"description": "Title of the device selection for invite page.",
"message": "Select a Device"
Expand All @@ -547,6 +555,10 @@
"description": "Detail about how to control data sharing.",
"message": "Control sharing in Project Settings."
},
"routes.app.projects.$projectId_.invite.index.goBackAccessibleLabel": {
"description": "Accessible label for back button.",
"message": "Go back."
},
"routes.app.projects.$projectId_.invite.index.inviteCollaborators": {
"description": "Title of the Invite Get Started page.",
"message": "Invite Collaborators"
Expand Down
16 changes: 16 additions & 0 deletions messages/renderer/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
"description": "Text for button to reload page.",
"message": "Reload"
},
"components.generic-route-error-component.restart": {
"description": "Text for button to restart app.",
"message": "Reiniciar"
},
"components.generic-route-error-component.somethinWentWrong": {
"description": "Title text of page error",
"message": "Algo salió mal"
Expand Down Expand Up @@ -531,6 +535,10 @@
"description": "Text displayed when waiting for Wi-Fi information.",
"message": "Obteniendo información Wi-Fi…"
},
"routes.app.projects.$projectId_.invite.devices.index.goBackAccessibleLabel": {
"description": "Accessible label for back button",
"message": "Regresar."
},
"routes.app.projects.$projectId_.invite.devices.index.navTitle": {
"description": "Title of the device selection for invite page.",
"message": "Seleccione un dispositivo"
Expand All @@ -539,6 +547,10 @@
"description": "Detail about how to control data sharing.",
"message": "Control para compartir en la configuración del proyecto."
},
"routes.app.projects.$projectId_.invite.index.goBackAccessibleLabel": {
"description": "Accessible label for back button.",
"message": "Regresar."
},
"routes.app.projects.$projectId_.invite.index.inviteCollaborators": {
"description": "Title of the Invite Get Started page.",
"message": "Invita colaboradores"
Expand Down Expand Up @@ -699,6 +711,10 @@
"description": "Text indicating collaborator is a coordinator.",
"message": "Persona Coordinadora"
},
"routes.app.projects.$projectId_.team.$deviceId.goBackAccessibleLabel": {
"description": "Accessible label for back button.",
"message": "Regresar."
},
"routes.app.projects.$projectId_.team.$deviceId.lastCoordinatorWarning": {
"description": "Warning text about leaving the project as the last coordinator.",
"message": "Eres el último coordinator. Considera hacer otro dispositivo un coordinator antes de abandonar el proyecto."
Expand Down
Loading
Loading