Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
41b724e
chore(deps): bump actions/setup-java from 5 to 6
dependabot[bot] Aug 31, 2026
1622db0
chore(deps): bump the testing group with 2 updates (#498)
dependabot[bot] Aug 31, 2026
7658329
chore(deps): bump markdown-renderer from 0.44.0 to 0.45.0 (#500)
dependabot[bot] Aug 31, 2026
802a0b0
chore(deps): bump androidx.navigation:navigation-compose (#501)
dependabot[bot] Aug 31, 2026
53dd214
chore(deps): bump org.jetbrains.compose from 1.11.1 to 1.12.0 (#503)
dependabot[bot] Aug 31, 2026
6031427
chore(deps): bump haze from 1.7.2 to 1.7.3 (#504)
dependabot[bot] Aug 31, 2026
6b7cb70
chore(deps): bump coil from 3.5.0 to 3.6.0 (#502)
dependabot[bot] Aug 31, 2026
ad4175b
test(android): remove obsolete clean chat instrumentation
Codename-11 Aug 31, 2026
c8cd13e
fix(android): render bot chat history after binding
Codename-11 Aug 31, 2026
44f0ace
Merge pull request #505 from Codename-11/fix/android-bot-chat-binding…
Codename-11 Aug 31, 2026
4c00e8e
Merge pull request #499 from Codename-11/dependabot/github_actions/de…
Codename-11 Aug 31, 2026
7f7112c
feat(android): expand in-app release notes
Codename-11 Aug 31, 2026
4f5f3fa
Merge remote-tracking branch 'origin/dev' into feature/android-releas…
Codename-11 Aug 31, 2026
6be6cec
test(android): refresh v1.14 What's New assertions
Codename-11 Aug 31, 2026
30eb70d
Merge pull request #506 from Codename-11/fix/android-whats-new-tests
Codename-11 Aug 31, 2026
9a40aed
chore(android): serialize Windows build lanes
Codename-11 Aug 31, 2026
cd856da
Merge remote-tracking branch 'origin/dev' into feature/android-releas…
Codename-11 Aug 31, 2026
7b390fa
fix(android): harden supervised gateway setup
Codename-11 Aug 31, 2026
e9f3267
fix(android): recover dashboard history auth failures
Codename-11 Aug 31, 2026
246d9f1
Merge origin/dev into fix/android-dashboard-history-auth-recovery
Codename-11 Aug 31, 2026
00052d2
watchdog: arm longer leash on compacting status instead of killing si…
JackHunzicker Aug 30, 2026
95e78e0
Merge pull request #509 from Codename-11/chore/android-build-lane
Codename-11 Aug 31, 2026
857a155
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
245362d
Merge remote-tracking branch 'origin/dev' into feature/android-releas…
Codename-11 Aug 31, 2026
dafa6f3
Merge origin/dev into fix/android-dashboard-history-auth-recovery
Codename-11 Aug 31, 2026
936b9be
Merge pull request #508 from Codename-11/feature/android-release-note…
Codename-11 Aug 31, 2026
1f055cb
Merge pull request #507 from Codename-11/fix/android-supervised-gatew…
Codename-11 Aug 31, 2026
814afc5
fix(android): retain generated image results
Codename-11 Aug 31, 2026
c519502
Merge origin/dev into fix/android-dashboard-history-auth-recovery
Codename-11 Aug 31, 2026
78203fd
Merge pull request #510 from Codename-11/fix/android-generated-image-…
Codename-11 Aug 31, 2026
181e10f
test(android): cover compaction watchdog leases
Codename-11 Aug 31, 2026
d26bf6c
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
95ed8e6
fix(android): bind chat conversations to one transport
Codename-11 Aug 31, 2026
dbf71a8
Merge remote-tracking branch 'origin/dev' into fix/android-chat-trans…
Codename-11 Aug 31, 2026
1617f75
Merge origin/dev into fix/android-dashboard-history-auth-recovery
Codename-11 Aug 31, 2026
28a9062
test(android): add managed emulator coverage
Codename-11 Aug 31, 2026
febc26f
Merge origin/dev into fix/android-emulator-testing
Codename-11 Aug 31, 2026
23c06d6
ci(android): prefer cloud verification lanes
Codename-11 Aug 31, 2026
105da55
docs: note Android history auth recovery
Codename-11 Aug 31, 2026
6a495b6
Merge pull request #511 from Codename-11/chore/android-cloud-verifica…
Codename-11 Aug 31, 2026
a199c35
Merge origin/dev into fix/android-dashboard-history-auth-recovery
Codename-11 Aug 31, 2026
8865a31
fix(ci): route Android presets through registered workflow
Codename-11 Aug 31, 2026
e0b726d
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
541a7c0
fix(android): require app-specific supervised parent access
Codename-11 Aug 31, 2026
6f0948c
Merge remote-tracking branch 'origin/dev' into fix/android-supervised…
Codename-11 Aug 31, 2026
5bd0b2a
Merge pull request #513 from Codename-11/fix/android-dashboard-histor…
Codename-11 Aug 31, 2026
d367cd3
Merge remote-tracking branch 'origin/dev' into fix/android-supervised…
Codename-11 Aug 31, 2026
8625963
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
aff758f
fix(android): project passive session activity
Codename-11 Aug 31, 2026
afa875d
chore: merge origin/dev into passive session activity fix
Codename-11 Aug 31, 2026
55a838c
merge: refresh Android dispatcher with dev
Codename-11 Aug 31, 2026
698b45c
fix(android): avoid cold-start chat owner crash
Codename-11 Aug 31, 2026
9690071
Merge remote-tracking branch 'origin/dev' into fix/android-chat-trans…
Codename-11 Aug 31, 2026
ae18bbe
Merge origin/dev into fix/android-emulator-testing
Codename-11 Aug 31, 2026
8632ced
Merge pull request #516 from Codename-11/fix/android-on-demand-dispatch
Codename-11 Aug 31, 2026
6a66710
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
a2be512
chore: refresh origin/dev before passive session activity handoff
Codename-11 Aug 31, 2026
41cbafd
Merge remote-tracking branch 'origin/dev' into fix/android-supervised…
Codename-11 Aug 31, 2026
d42fa91
Merge remote-tracking branch 'origin/dev' into fix/android-chat-trans…
Codename-11 Aug 31, 2026
05d6ee4
Merge origin/dev into fix/android-emulator-testing
Codename-11 Aug 31, 2026
adcf4de
Merge pull request #517 from Codename-11/fix/android-supervised-paren…
Codename-11 Aug 31, 2026
58e8b1e
Merge remote-tracking branch 'origin/dev' into fix/android-chat-trans…
Codename-11 Aug 31, 2026
de8f555
Merge origin/dev into fix/android-emulator-testing
Codename-11 Aug 31, 2026
525f6b5
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
cbc02bb
Merge pull request #514 from Codename-11/fix/android-emulator-testing
Codename-11 Aug 31, 2026
6a93d13
Merge origin/dev into fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
949add1
Merge pull request #512 from Codename-11/fix/android-compaction-watchdog
Codename-11 Aug 31, 2026
2c15bd4
fix(android): clarify gateway connection status
Codename-11 Aug 31, 2026
b76ba7a
Merge remote-tracking branch 'origin/dev' into fix/android-chat-trans…
Codename-11 Aug 31, 2026
8b3731b
chore(android): refresh localization status
Codename-11 Aug 31, 2026
946b333
chore: refresh origin/dev before merging passive session activity
Codename-11 Aug 31, 2026
597b13e
Merge pull request #515 from Codename-11/fix/android-chat-transport-a…
Codename-11 Aug 31, 2026
eb8434e
chore: refresh chat transport base before passive session activity merge
Codename-11 Aug 31, 2026
201e204
fix(plugin): restore native installer compatibility
Codename-11 Aug 31, 2026
2278088
Merge remote-tracking branch 'origin/dev' into fix/plugin-manifest-in…
Codename-11 Aug 31, 2026
c01c6cf
Merge pull request #520 from Codename-11/fix/plugin-manifest-installe…
Codename-11 Aug 31, 2026
5fc85c1
chore: refresh plugin-only dev tip before merge
Codename-11 Aug 31, 2026
042f02b
Merge pull request #518 from Codename-11/fix/android-passive-session-…
Codename-11 Sep 1, 2026
ff64548
fix(android): settle owned streams from live idle state
Codename-11 Sep 1, 2026
40fcb80
Merge origin/dev into fix/android-stale-stream-liveness
Codename-11 Sep 1, 2026
b72ab5a
Merge pull request #521 from Codename-11/fix/android-stale-stream-liv…
Codename-11 Sep 1, 2026
e7cbed3
feat(android): prefer upstream standard surfaces
Codename-11 Sep 1, 2026
47a395a
feat(marketing): refresh README and store visuals
Codename-11 Sep 1, 2026
367e5d2
Merge origin/dev into feature/upstream-first-media
Codename-11 Sep 1, 2026
7c03f85
Merge docs/readme-marketing-hero into integration/readme-marketing-vi…
Codename-11 Sep 1, 2026
88ab48c
chore: refresh localization metadata
Codename-11 Sep 1, 2026
a4fac45
chore: complete localization refresh
Codename-11 Sep 1, 2026
23a6231
chore: restore localized docs metadata
Codename-11 Sep 1, 2026
ee59149
Merge origin/dev into feature/upstream-first-media
Codename-11 Sep 1, 2026
2d2e54b
Merge pull request #523 from Codename-11/feature/upstream-first-media
Codename-11 Sep 1, 2026
06b2463
release(android): android-v1.15.0
Codename-11 Sep 1, 2026
1e5ce98
release(server): server-v1.11.1
Codename-11 Sep 1, 2026
051844b
release(desktop): desktop-v0.4.0-beta.6
Codename-11 Sep 1, 2026
e55662e
test(android): align release presentation coverage
Codename-11 Sep 1, 2026
e6368da
release: Android 1.15.0, Plugin 1.11.1, CLI+UI 0.4.0-beta.6 (#524)
Codename-11 Sep 1, 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
38 changes: 0 additions & 38 deletions .github/PULL_REQUEST_TEMPLATE.md

This file was deleted.

9 changes: 5 additions & 4 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ not `AGENTS.md`) picks up the project's agent guidance.

**Read [AGENTS.md](../AGENTS.md) first — it is the single source of truth**
for agent guidance: the entry point, the non-negotiables, and the public-repo
writing hygiene. It links on to `CLAUDE.md` for the deep reference
(architecture, upstream Hermes API, repository layout, per-language code style,
the dev loop, and the Key Files map). Follow those; don't restate them here.
writing hygiene. `CLAUDE.md` imports that same canonical file. Follow
`AGENTS.md` and its linked project records; don't restate them here.

Quick non-negotiables (the full list and rationale are in `AGENTS.md`):

Expand All @@ -17,6 +16,8 @@ Quick non-negotiables (the full list and rationale are in `AGENTS.md`):
- **Conventional Commits**, `main`/`dev` branching — feature branches off
`dev`, `--no-ff` merges, tags cut from `main`.
- **Android:** Jetpack Compose (no XML), kotlinx.serialization (no Gson),
OkHttp (no Ktor), `wss://` only; run `./gradlew lint` before pushing Kotlin.
OkHttp (no Ktor), `wss://` only. Narrow local checks use the Android lane;
pushed exact SHAs prefer `Android On-Demand` for heavy verification; full
local pre-push remains an explicit fallback.
- **Public repo:** no personal names, no private infrastructure, no
AI/assistant self-narration in committed prose.
5 changes: 4 additions & 1 deletion .github/scripts/classify-ci-paths.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ function classifyCiPaths(paths) {
'scripts/check-android-locales.py', 'scripts/android-locale-harness.py',
'scripts/check-android-collection-apis.py', 'scripts/check-android-native-compat.py',
'scripts/check-android-release-notes.py',
'scripts/android-lane.ps1', 'scripts/android-prepush.py', 'scripts/dev.bat', 'scripts/dev.sh',
'scripts/tests/android_prepush_test.py',
'scripts/tests/check_android_native_compat_test.py',
'scripts/tests/check_android_release_notes_test.py', '.github/workflows/ci-android.yml',
'scripts/tests/check_android_release_notes_test.py',
'.github/workflows/android-on-demand.yml', '.github/workflows/ci-android.yml',
'.github/workflows/play-preflight-android.yml',
'.github/workflows/approve-release-android.yml',
'.github/workflows/release-android.yml',
Expand Down
6 changes: 6 additions & 0 deletions .github/scripts/classify-ci-paths.test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ assert.deepEqual(classifyCiPaths(['relay-core/src/main/kotlin/Wire.kt']), { ...n
assert.deepEqual(classifyCiPaths(['scripts/check-android-release-notes.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/check-android-native-compat.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/tests/check_android_native_compat_test.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/android-lane.ps1']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/android-prepush.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/dev.bat']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/dev.sh']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['scripts/tests/android_prepush_test.py']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['.github/workflows/android-on-demand.yml']), { ...none, android: true });
assert.deepEqual(classifyCiPaths(['plugin/relay/server.py']), { ...none, plugin: true });
assert.deepEqual(classifyCiPaths(['plugin/dashboard/src/App.tsx']), { ...none, dashboard: true });
assert.deepEqual(classifyCiPaths(['user-docs/index.md']), { ...none, docs: true });
Expand Down
226 changes: 226 additions & 0 deletions .github/workflows/android-on-demand.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
name: Android On-Demand

run-name: Android ${{ inputs.preset }} · ${{ inputs.head_sha }}

on:
workflow_call:
inputs:
head_sha:
required: true
type: string
preset:
required: true
type: string

permissions:
contents: read

concurrency:
group: android-on-demand-${{ inputs.head_sha }}-${{ inputs.preset }}
cancel-in-progress: false

jobs:
validate:
name: Validate exact SHA
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Validate input shape
shell: bash
env:
REQUESTED_SHA: ${{ inputs.head_sha }}
REQUESTED_PRESET: ${{ inputs.preset }}
run: |
if [[ ! "$REQUESTED_SHA" =~ ^[0-9a-f]{40}$ ]]; then
echo "head_sha must be a full lowercase 40-character commit SHA" >&2
exit 2
fi
case "$REQUESTED_PRESET" in
focused|lint|assemble-debug|release-smoke|all-final) ;;
*)
echo "unsupported Android preset: $REQUESTED_PRESET" >&2
exit 2
;;
esac

- name: Checkout exact commit
uses: actions/checkout@v7
with:
ref: ${{ inputs.head_sha }}
fetch-depth: 1

- name: Confirm checkout identity
shell: bash
env:
REQUESTED_SHA: ${{ inputs.head_sha }}
run: test "$(git rev-parse HEAD)" = "$REQUESTED_SHA"

focused:
name: Focused Android checks
needs: validate
if: ${{ inputs.preset == 'focused' || inputs.preset == 'all-final' }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v7
with:
ref: ${{ inputs.head_sha }}

- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17

- uses: gradle/actions/setup-gradle@v6.3.0
with:
cache-read-only: true

- name: Run repository checks and focused sideload tests
run: python3 scripts/android-prepush.py --skip-lint

- name: Run the same focused tests for Google Play
Comment on lines +78 to +81
shell: bash
run: |
mapfile -t focused_tests < <(python3 -c \
"import runpy; print(*runpy.run_path('scripts/android-prepush.py')['FOCUSED_TESTS'], sep='\n')")
test_args=()
for test_name in "${focused_tests[@]}"; do
test_args+=(--tests "$test_name")
done
./gradlew :app:testGooglePlayDebugUnitTest "${test_args[@]}" --console=plain

- name: Upload failed test reports
Comment on lines +81 to +92
uses: actions/upload-artifact@v7
if: failure()
with:
name: focused-test-reports-${{ inputs.head_sha }}
path: app/build/reports/tests/
if-no-files-found: ignore
retention-days: 7

lint:
name: Android lint
needs: validate
if: ${{ inputs.preset == 'lint' || inputs.preset == 'all-final' }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v7
with:
ref: ${{ inputs.head_sha }}

- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17

- uses: gradle/actions/setup-gradle@v6.3.0
with:
cache-read-only: true

- name: Validate Android repository inputs
run: |
python3 scripts/check-android-locales.py
python3 scripts/check-user-docs-locales.py
python3 scripts/check-android-collection-apis.py
python3 scripts/check-android-release-notes.py
python3 scripts/check-version-tracks.py
if [[ -f scripts/tests/android_prepush_test.py ]]; then
python3 -m unittest scripts.tests.android_prepush_test
fi
python3 -m unittest scripts.tests.check_android_release_notes_test
python3 -m unittest scripts.tests.check_android_native_compat_test

- name: Run Android lint
Comment on lines +121 to +134
run: ./gradlew lint --console=plain

- name: Upload lint reports
Comment on lines +134 to +137
uses: actions/upload-artifact@v7
if: always()
with:
name: lint-reports-${{ inputs.head_sha }}
path: app/build/reports/lint-results*
if-no-files-found: ignore
retention-days: 7

assemble-debug:
name: Assemble both debug flavors
needs: validate
if: ${{ inputs.preset == 'assemble-debug' || inputs.preset == 'all-final' }}
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@v7
with:
ref: ${{ inputs.head_sha }}

- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17

- uses: gradle/actions/setup-gradle@v6.3.0
with:
cache-read-only: true

- name: Build debug APKs
run: ./gradlew assembleDebug --console=plain

- name: Verify packaged native compatibility
Comment on lines +166 to +169
run: |
python3 scripts/check-android-native-compat.py \
app/build/outputs/apk/googlePlay/debug/*.apk \
app/build/outputs/apk/sideload/debug/*.apk

- name: Upload debug APKs
Comment on lines +169 to +175
uses: actions/upload-artifact@v7
with:
name: debug-apks-${{ inputs.head_sha }}
path: app/build/outputs/apk/*/debug/*.apk
if-no-files-found: error
retention-days: 7

release-smoke:
name: Release build smoke
needs: validate
if: ${{ inputs.preset == 'release-smoke' || inputs.preset == 'all-final' }}
runs-on: ubuntu-latest
timeout-minutes: 35
steps:
- uses: actions/checkout@v7
with:
ref: ${{ inputs.head_sha }}

- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17

- uses: gradle/actions/setup-gradle@v6.3.0
with:
cache-read-only: true

- name: Build release bundles and APKs
run: ./gradlew bundleRelease assembleRelease --console=plain

- name: Scan release DEX for unsupported collection APIs
Comment on lines +203 to +206
run: |
python3 scripts/check-android-collection-apis.py \
--apk app/build/outputs/apk/googlePlay/release/*.apk \
--apk app/build/outputs/apk/sideload/release/*.apk

- name: Verify packaged native compatibility
Comment on lines +206 to +212
run: |
python3 scripts/check-android-native-compat.py \
app/build/outputs/apk/googlePlay/release/*.apk \
app/build/outputs/apk/sideload/release/*.apk

- name: Upload release smoke artifacts
Comment on lines +212 to +218
uses: actions/upload-artifact@v7
with:
name: release-smoke-${{ inputs.head_sha }}
path: |
app/build/outputs/apk/*/release/*.apk
app/build/outputs/bundle/**/*.aab
if-no-files-found: error
retention-days: 7
15 changes: 11 additions & 4 deletions .github/workflows/ci-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ on:
- "gradle.properties"
- "gradlew"
- "gradlew.bat"
- "scripts/android-lane.ps1"
- "scripts/android-prepush.py"
- "scripts/dev.bat"
- "scripts/dev.sh"
- "scripts/tests/android_prepush_test.py"
- "scripts/check-android-locales.py"
- "scripts/android-locale-harness.py"
- "scripts/check-android-collection-apis.py"
Expand All @@ -38,6 +43,7 @@ on:
- "scripts/tests/check_android_native_compat_test.py"
- "scripts/tests/check_android_release_notes_test.py"
- ".github/workflows/ci-android.yml"
- ".github/workflows/android-on-demand.yml"
- ".github/workflows/play-preflight-android.yml"
- ".github/workflows/approve-release-android.yml"
- ".github/workflows/release-android.yml"
Expand All @@ -61,7 +67,7 @@ jobs:
uses: actions/checkout@v7

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17
Expand All @@ -80,6 +86,7 @@ jobs:
- name: Validate Android release notes
run: |
python3 scripts/check-android-release-notes.py
python3 -m unittest scripts.tests.android_prepush_test
python3 -m unittest scripts.tests.check_android_release_notes_test

- name: Test Android native compatibility checker
Expand All @@ -101,7 +108,7 @@ jobs:
uses: actions/checkout@v7

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17
Expand Down Expand Up @@ -151,7 +158,7 @@ jobs:
uses: actions/checkout@v7

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17
Expand Down Expand Up @@ -215,7 +222,7 @@ jobs:
uses: actions/checkout@v7

- name: Set up JDK 17
uses: actions/setup-java@v5
uses: actions/setup-java@v6
with:
distribution: temurin
java-version: 17
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ jobs:
- name: Run focused Plugin tests
run: |
python -m pytest \
plugin/tests/test_manifest_compatibility.py \
plugin/tests/test_relay_security.py \
plugin/tests/test_voice_routes.py \
plugin/tests/test_session_grants.py \
Expand Down
Loading
Loading