Skip to content

Integrate @comapeo/core via IPC over Unix sockets#5

Merged
achou11 merged 67 commits into
mainfrom
comapeo-core-integration
Apr 27, 2026
Merged

Integrate @comapeo/core via IPC over Unix sockets#5
achou11 merged 67 commits into
mainfrom
comapeo-core-integration

Conversation

@gmaclennan

Copy link
Copy Markdown
Member

Summary

  • Integrates @comapeo/core into the React Native module via @comapeo/ipc over Unix domain sockets
  • Backend runs as a Rollup-bundled ESM module (.mjs) in Node.js on Android, communicating with the JS layer through a framed message protocol
  • Replaces the old stub backend with a real MapeoManager instance served via ComapeoRpcServer

Key changes

  • Backend IPC layer: SocketMessagePort bridges Unix sockets to the MessagePort interface expected by @comapeo/ipc. Messages are queued while idle and flushed on start(), allowing the frontend to call methods before the backend is fully ready
  • Bug fixes: Fixed ServerHelper.listen() premature return, this binding in callbacks, missing messagePort.start() in ComapeoRpcServer, and shutdown handler not closing MapeoManager
  • Gradle asset pipeline: Replaced broken npm install task with a Copy task that copies the Rollup bundle from backend/dist/ into Android assets
  • Dependencies: Updated @comapeo/core 4.3.0→6.0.2, @comapeo/ipc 5.0.0→7.0.0
  • Android service fixes: Control socket rename, CompletableDeferred<NodeJSIPC>, activeInstanceCount race fix, coroutine-based onDestroy, startForeground contract fix

Known issue

Native addon prebuilds (sodium-native, better-sqlite3, etc.) are not yet resolved at runtime — the bundle loads but fails when requiring .node files. This will be addressed in a follow-up.

Test plan

  • Build backend bundle: cd backend && npm run build
  • Build and run on Android emulator: cd example && npx expo run:android
  • Verify Node.js process starts (logcat: "Starting Comapeo Node server...")
  • Verify IPC connection established between native module and Node.js
  • Verify graceful shutdown on app background/stop
  • Address native addon prebuild loading (follow-up)

🤖 Generated with Claude Code

claude and others added 25 commits March 11, 2026 00:36
Comprehensive documentation covering the dual-process architecture
(React Native + embedded Node.js), IPC protocol over Unix domain
sockets, Android foreground service lifecycle, directory structure,
data flow, and platform status.

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
Documents what CoMapeo is, the relationship to Mapeo, and how this
module fits into the broader ecosystem (@comapeo/core, @comapeo/ipc,
comapeo-mobile, comapeo-desktop, comapeo-cloud). Explains how the
messagePort connects to @comapeo/ipc's createMapeoServer/Client pattern.

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
- Add testID props to example app for element targeting
- Create 5 Maestro flow files testing: app launch, state transitions,
  Node.js process startup, IPC round-trip (1000 messages), and
  multi-round messaging stability
- Add e2e runner script with emulator management, APK build/install,
  and single-flow or full-suite execution modes
- Add e2e:android script to example/package.json
- Document setup, prerequisites, and CI integration

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
Three-layer test infrastructure:

1. JVM unit tests (android/src/test/) - no device needed:
   - MessageFramingTest: length-prefix protocol encoding/decoding,
     buffer reuse correctness, unicode handling, multi-frame sequences

2. Android instrumented tests (android/src/androidTest/) - requires device:
   - NodeJSIPCTest: IPC protocol against mock LocalServerSocket (connect,
     send, receive, echo round-trip, 100-message burst, 64KB messages,
     delayed socket creation, server disconnect handling)
   - ServiceLifecycleTest: foreground service via intents (start, stop,
     separate process verification, START_STICKY restart after kill,
     socket file lifecycle, notification presence)
   - ShutdownPathTest: graceful shutdown, process kill recovery, stop
     during startup race, 3x start/stop cycles, force-stop cleanup
   - WatchForFileTest: FileObserver suspension, cancellation, TOCTOU
     scenarios, wrong-file filtering, parent directory creation

3. Runner script (e2e/run-instrumented-tests.sh) with --class filtering,
   --unit-only mode, and automatic emulator boot

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
- GitHub Actions workflow (.github/workflows/android-tests.yml) with two jobs:
  - JVM unit tests: runs without emulator, caches gradle + nodejs-mobile
  - Instrumented tests: uses reactivecircus/android-emulator-runner with KVM
- Both jobs: expo prebuild, download nodejs-mobile binaries, auto-discover
  the Expo-autolinked Gradle module name

- Download script (scripts/download-nodejs-mobile.sh):
  - Fetches nodejs-mobile prebuilt Android binaries from GitHub releases
  - Supports version override via argument or NODEJS_MOBILE_VERSION env
  - Caches with .version marker to skip redundant downloads
  - Verifies expected structure (libnode.so per ABI + node headers)

- Fix NodeJSIPCTest: LocalServerSocket(String) uses abstract namespace but
  NodeJSIPC connects to FILESYSTEM namespace. Fixed by binding a LocalSocket
  to the filesystem address and passing its FD to LocalServerSocket.

- Remove unused imports across test files

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
When no comapeo module is found by the initial grep, the fallback
diagnostic grep also returns exit code 1 (no matches), causing the
script to fail under bash -e before the fallback MODULE_NAME is set.
Add || true to both grep pipelines so the fallback path works.

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
The gradle-wrapper.jar is gitignored and not available in CI, causing
"Could not find or load main class org.gradle.wrapper.GradleWrapperMain".
Use gradle/actions/setup-gradle and generate the wrapper before running
any ./gradlew commands.

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
Running `gradle wrapper` inside example/android causes Gradle 9.3.1 to
compile the project's Expo/RN Kotlin plugins against its bundled Kotlin
2.2.0 stdlib, which is incompatible with the older Kotlin versions those
plugins expect. Generate the wrapper in an empty temp dir instead and
copy just the jar file.

https://claude.ai/code/session_01JvQt9SCcroodTwtW4NhiC7
Remove ServiceLifecycleTest and ShutdownPathTest which can't work as
library-level instrumented tests (test APK runs as different uid and
can't start non-exported service in example app). Remove unused
IServiceCallback reference left after AIDL removal. Simplify CI by
removing broken Gradle wrapper generation step (expo prebuild already
generates it) and fragile module name discovery.

Remaining tests (16 instrumented + JVM) all pass locally:
- MessageFramingTest: length-prefixed framing protocol
- NodeJSIPCTest: IPC socket communication
- WatchForFileTest: file watching utility

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move service lifecycle and shutdown path tests to the example app's
androidTest (same UID as the service) to fix SecurityException when
starting the unexported ComapeoCoreService.

Tests that require a full Node.js backend are @ignore'd for now —
they'll be enabled once the app is fully built with the JS bundle.

Passing tests (4 app + 16 library + JVM):
- ServiceLifecycleTest: start, separate process, stop
- ShutdownPathTest: stop during startup
- NodeJSIPCTest: IPC socket communication (9 tests)
- WatchForFileTest: file watching utility (7 tests)
- MessageFramingTest: framing protocol (JVM)

Also:
- Check in example/android/ (remove from .gitignore) so we can
  add androidTest files without expo prebuild regeneration
- Remove expo prebuild step from CI (no longer needed)
- Add :app:connectedDebugAndroidTest to CI

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The jar is required to bootstrap Gradle builds. It was being excluded
by a global ~/.gitignore_global rule for *.jar files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add jlumbroso/free-disk-space to remove dotnet, haskell, large
  packages, and docker images (~15-20GB freed)
- Set disk-size: 2048M on emulator (down from default 7.4GB)
- Remove unused pre-installed NDKs and platform versions
- Use API level 30 for emulator (smaller system image)
- Restore npm install (needed for Gradle's node-based module resolution)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…sion

Gradle auto-downloads the NDK version specified in build.gradle, so manual
sdkmanager install was redundant and was installing the wrong version
(27.0.12077973 vs 27.1.12297006 that Gradle actually needs).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The android-emulator-runner action runs each line of the script as a
separate shell command, so cd and gradlew must be on the same line.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
serviceRunsInSeparateProcess and stopActionStopsService both require
the service to remain running, which needs the full JS backend bundle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Gradle task to auto-install nodejs-project node_modules before
  asset merging, so the Node.js backend can find its dependencies
- Remove all @ignore annotations — all 9 tests now pass
- Fix test cleanup race condition: stop using startServiceWithAction(STOP)
  in stopServiceAndWait() as it starts the service process and queues
  intents that race with the test's USER_FOREGROUND intent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The CI emulator (x86_64 software rendering) is significantly slower
than local ARM emulators. Wait 5 seconds after service registers as
running to let Node.js fully initialize before testing further actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Addresses 11 bugs identified in code review:

- ComapeoCoreService: reset isServiceStarted on stop/destroy, replace
  runBlocking with serviceScope.launch to prevent ANR on main thread
- NodeJSIPC: break send loop on IOException instead of infinite retry,
  allow reconnection from error state, close/recreate sendChannel on
  disconnect/connect, expose connectionState property
- NodeJSService: replace lateinit ipc with CompletableDeferred to prevent
  UninitializedPropertyAccessException race, return early in stop() when
  not running instead of throwing, separate destroy() from finally block
- ComapeoCoreReactActivityLifecycleListener: safe-call nullable activity
- watchForFile: start FileObserver before checking existence to fix TOCTOU
  race, add withTimeout wrapper (default 30s)
- control-rpc.js: declare missing count variable
- ComapeoCoreModule: return actual IPC connection state from getState()

Adds JVM unit tests for CompletableDeferred and timeout patterns, and
instrumented tests for stop-then-restart and waitForFile behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The async onDestroy coroutine could call Process.killProcess() after a
new service instance had already started in the same process, causing
"startForegroundService did not call startForeground" crashes. Track
active instance count so killProcess is skipped when a new instance
is alive.

Also change stopThenRestartWorks test to use stopServiceAndWait()
(process kill) instead of STOP action to avoid race on slow CI emulators.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tract

Android requires startForeground() to be called within 5 seconds every
time startForegroundService() is invoked, even if the service is already
in the foreground. The old code returned early from startService() when
isServiceStarted was true, skipping the startForeground() call and
causing a RemoteServiceException crash on the second USER_FOREGROUND.

Move startForeground() before the isServiceStarted guard so it is
always called, while still only starting Node.js once.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Two changes to improve instrumented test performance:

1. Switch from google_apis to google_atd (Automated Test Device) target.
   ATD images strip unnecessary apps and services, resulting in faster
   boot and lower resource usage. Available at API 30.

2. Add AVD snapshot caching. On first run, the emulator boots and saves
   a snapshot to the GitHub Actions cache. Subsequent runs boot from
   the cached snapshot instead of cold-booting, saving 1-3 minutes.

Also removed profile and disk-size/heap-size overrides since ATD images
have appropriate defaults and don't need a device profile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* claude/document-codebase-agents-Mi9Dq: (21 commits)
  Speed up CI emulator with AVD caching and ATD images
  Always call startForeground on USER_FOREGROUND to satisfy Android contract
  Fix Process.killProcess race on stop→restart and stabilize CI test
  Fix critical bugs in service lifecycle, IPC, and file watching
  Add stabilization delay after service start for CI emulator
  Enable all service lifecycle tests with Node.js backend deps
  Skip tests that need service to stay alive without JS bundle
  Fix gradlew not found in emulator runner script
  Remove manual NDK install steps — let Gradle auto-install correct version
  Fix CI disk space for emulator and optimize workflow
  Add gradle-wrapper.jar (was excluded by global gitignore)
  Add app-level service lifecycle tests and check in example/android
  Fix Android tests and CI workflow
  Generate Gradle wrapper jar in temp dir to avoid Kotlin version conflict
  Add Gradle setup steps to generate wrapper jar in CI
  Fix find-module step failing due to grep exit code 1
  Add CI workflow, nodejs-mobile download script, and fix test issues
  Add Android instrumented tests and JVM unit tests
  Add Maestro e2e testing infrastructure for Android emulator
  Add CoMapeo ecosystem context and IPC integration details to agents.md
  ...

# Conflicts:
#	android/src/main/assets/nodejs-project/lib/control-rpc.js
#	android/src/main/java/com/comapeo/core/ComapeoCoreModule.kt
#	android/src/main/java/com/comapeo/core/ComapeoCoreService.kt
#	android/src/main/java/com/comapeo/core/NodeJSService.kt
#	example/App.tsx
- Fix SocketMessagePort to queue messages while idle and flush on start()
- Fix ComapeoRpcServer: call messagePort.start() and wire cleanup
- Fix ServerHelper: remove premature return in listen(), fix this binding
- Fix SimpleRpcServer: fix this binding in message handler
- Add comapeo.close() to shutdown handler for clean MapeoManager teardown
- Replace broken installNodejsDeps Gradle task with copyBackendBundle
- Output ESM bundle as .mjs for Node 18 on Android
- Update @comapeo/core 4.3.0→6.0.2, @comapeo/ipc 5.0.0→7.0.0
- Fix example app infinite re-render (React.use → useEffect+useState)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* origin/main:
  Android Testing Infrastructure & Bug Fixes (#3)

# Conflicts:
#	.github/workflows/android-tests.yml
#	android/build.gradle
#	android/src/main/assets/nodejs-project/lib/control-rpc.js
#	android/src/main/java/com/comapeo/core/ComapeoCoreModule.kt
#	android/src/main/java/com/comapeo/core/ComapeoCoreService.kt
#	android/src/main/java/com/comapeo/core/NodeJSService.kt
#	example/App.tsx
@RangerMauve

Copy link
Copy Markdown

Would y'all like another pair of eyes on this at some point? I've done a similar approach with an iroh based service on Android not long ago. :o

@gmaclennan

Copy link
Copy Markdown
Member Author

Would y'all like another pair of eyes on this at some point? I've done a similar approach with an iroh based service on Android not long ago. :o

Yes that would be great @RangerMauve. The actual IPC code is prior to this branch - this branch is adding @comapeo/core to the existing IPC layer. The best overview of the architecture is probably https://github.com/digidem/comapeo-core-react-native/blob/e3cdf0db1cf0acc1504722090b7dab59089d0e27/agents.md (from this branch which adds iOS support and updates the agents.md)

@achou11 achou11 merged commit ede29d6 into main Apr 27, 2026
4 checks passed
@achou11 achou11 deleted the comapeo-core-integration branch April 27, 2026 14:32
gmaclennan added a commit that referenced this pull request Jun 22, 2026
## Optic Release Automation

This **draft** PR is opened by Github action
[optic-release-automation-action](https://github.com/nearform-actions/optic-release-automation-action).

A new **draft** GitHub release
[v1.0.0-pre.2](https://github.com/digidem/comapeo-core-react-native/releases/tag/untagged-c499977757c9745e56b2)
has been created.

Release author: @gmaclennan

#### If you want to go ahead with the release, please merge this PR.
When you merge:

- The GitHub release will be published

- The npm package with tag pre will be published according to the
publishing rules you have configured



- No major or minor tags will be updated as configured


#### If you close the PR

- The new draft release will be deleted and nothing will change

## What's Changed
* Android Testing Infrastructure & Bug Fixes by @gmaclennan in
#3
* chore: prebuild example/android; harden instrumented tests by
@gmaclennan in
#10
* Integrate @comapeo/core via IPC over Unix sockets by @gmaclennan in
#5
* chore: adjust repo setup by @achou11 in
#12
* chore: minor fixes based on expo-doctor by @achou11 in
#13
* Add iOS support & test infrastructure by @gmaclennan in
#6
* chore: add architecture docs & plans by @gmaclennan in
#11
* update some native deps used in backend by @achou11 in
#14
* iOS Phase 1: unified JS bundle + smoke test (simulator-only) by
@gmaclennan in
#15
* iOS Phase 2: xcframework Embed & Sign for native addons by @gmaclennan
in #16
* Phase 2 Android: jniLibs packaging + unified rollup loader plugin by
@gmaclennan in
#17
* chore: post-Phase-2 cleanup — comments, plan docs, agents.md by
@gmaclennan in
#33
* android: read abiFilters from reactNativeArchitectures (#30) by
@gmaclennan in
#35
* refactor: simplify build-backend.ts; rollup writes directly to native
asset trees by @gmaclennan in
#34
* chore: fix eslint configuration by @achou11 in
#41
* android: audit 16 KB page alignment on every shipped .so by
@gmaclennan in
#43
* Add rootkey persistence and lifecycle state management by @gmaclennan
in #36
* chore: move example app into apps directory by @achou11 in
#18
* refactor: per-component lifecycle state with derived ComapeoState by
@gmaclennan in
#47
* android: fold waitForFile into connect retry loop by @gmaclennan in
#52
* chore: add e2e testing app by @achou11 in
#49
* fix(android): drop setUnlockedDeviceRequired from rootkey wrapper key
by @gmaclennan in
#57
* fix(backend): cache stopping/error frames for late joiners by
@gmaclennan in
#58
* fix(ios-tests): wait for STOPPING before signalling node exit by
@gmaclennan in
#59
* fix(android): drain JNI stdio pumps before returning from node::Start
by @gmaclennan in
#60
* Sentry integration: Phase 1 + Phase 2a + Phase 2b by @gmaclennan in
#54
* feat(backend): polywasm-backed undici on iOS, re-enable maps plugin by
@gmaclennan in
#62
* ci: drop unreliable Android emulator snapshot caching by @gmaclennan
in #64
* feat(sentry): land Phase 3 — backend loader + RPC tracing by
@gmaclennan in
#63
* fix(ios-tests): serialise STOPPING/STOPPED observers in
testFullLifecycleStateTransitions by @gmaclennan in
#71
* use npm list instead of custom traversal to get native module versions
by @achou11 in
#70
* feat(sentry): land Phases 6 + 7a — Android exit reasons & iOS
MetricKit app-exit telemetry by @gmaclennan in
#72
* fix(sentry): make exit telemetry lossless and stop cross-process
clobbering by @gmaclennan in
#84
* chore(e2e): add e2e tests on browserstack via Maestro by @achou11 in
#56
* feat(sentry): migrate to @sentry/react-native v8; exit telemetry as
Application Metrics by @gmaclennan in
#73
* Map server integration by @gmaclennan in
#86
* chore(deps): upgrade to Expo SDK 56 (React Native 0.85) by @gmaclennan
in #87
* chore(ci): add release workflow by @gmaclennan in
#90
* chore: fix npm script and release build script by @gmaclennan in
#91
* chore(pack): don't try to package build files by @gmaclennan in
#92
* fix: start fastify listening by @gmaclennan in
#93
* perf(backend): switch bundler from rollup to rolldown by @gmaclennan
in #94
* fix(ci): ignore-scripts in ios npm installs by @gmaclennan in
#96
* fix(ci): replace --ignore-scripts with npm strict-allow-scripts
allowlist by @gmaclennan in
#106
* feat(config): let the consuming app supply the default project config
by @gmaclennan in
#95
* chore(release): merge prerelease branch. by @gmaclennan in
#110

## New Contributors
* @achou11 made their first contribution in
#12

**Full Changelog**:
https://github.com/digidem/comapeo-core-react-native/commits/v1.0.0-pre.2

<!--

<release-meta>{"id":342868678,"version":"v1.0.0-pre.2","npmTag":"pre","opticUrl":"https://optic-zf3votdk5a-ew.a.run.app/api/generate/"}</release-meta>
-->
@gmaclennan gmaclennan added the feature New feature (changelog) label Jun 22, 2026
gmaclennan added a commit that referenced this pull request Jun 22, 2026
## Optic Release Automation

This **draft** PR is opened by Github action
[optic-release-automation-action](https://github.com/nearform-actions/optic-release-automation-action).

A new **draft** GitHub release
[v1.0.0-pre.2](https://github.com/digidem/comapeo-core-react-native/releases/tag/untagged-352a6c41c12fd02dec37)
has been created.

Release author: @gmaclennan

#### If you want to go ahead with the release, please merge this PR.
When you merge:

- The GitHub release will be published

- The npm package with tag pre will be published according to the
publishing rules you have configured



- No major or minor tags will be updated as configured


#### If you close the PR

- The new draft release will be deleted and nothing will change

<!-- Release notes generated using configuration in .github/release.yml
at 7fe80b4 -->

## What's Changed
### 🚀 Features
* Integrate @comapeo/core via IPC over Unix sockets by @gmaclennan in
#5
* Add iOS support & test infrastructure by @gmaclennan in
#6
* iOS Phase 1: unified JS bundle + smoke test (simulator-only) by
@gmaclennan in
#15
* iOS Phase 2: xcframework Embed & Sign for native addons by @gmaclennan
in #16
* Phase 2 Android: jniLibs packaging + unified rollup loader plugin by
@gmaclennan in
#17
* android: read abiFilters from reactNativeArchitectures (#30) by
@gmaclennan in
#35
* Add rootkey persistence and lifecycle state management by @gmaclennan
in #36
* Sentry integration: Phase 1 + Phase 2a + Phase 2b by @gmaclennan in
#54
* feat(backend): polywasm-backed undici on iOS, re-enable maps plugin by
@gmaclennan in
#62
* feat(sentry): land Phase 3 — backend loader + RPC tracing by
@gmaclennan in
#63
* feat(sentry): land Phases 6 + 7a — Android exit reasons & iOS
MetricKit app-exit telemetry by @gmaclennan in
#72
* feat(sentry): migrate to @sentry/react-native v8; exit telemetry as
Application Metrics by @gmaclennan in
#73
* Map server integration by @gmaclennan in
#86
* feat(config): let the consuming app supply the default project config
by @gmaclennan in
#95
### 🐛 Bug Fixes
* fix(android): drop setUnlockedDeviceRequired from rootkey wrapper key
by @gmaclennan in
#57
* fix(backend): cache stopping/error frames for late joiners by
@gmaclennan in
#58
* fix(ios-tests): wait for STOPPING before signalling node exit by
@gmaclennan in
#59
* fix(android): drain JNI stdio pumps before returning from node::Start
by @gmaclennan in
#60
* fix(ios-tests): serialise STOPPING/STOPPED observers in
testFullLifecycleStateTransitions by @gmaclennan in
#71
* fix(sentry): make exit telemetry lossless and stop cross-process
clobbering by @gmaclennan in
#84
* fix: start fastify listening by @gmaclennan in
#93
* fix(ci): ignore-scripts in ios npm installs by @gmaclennan in
#96
* fix(ci): replace --ignore-scripts with npm strict-allow-scripts
allowlist by @gmaclennan in
#106
* fix(release): stop `npm pack --dry-run` leaking dry-run into backend
install by @gmaclennan in
#129
### ⚡ Performance
* perf(backend): switch bundler from rollup to rolldown by @gmaclennan
in #94
### ⬆️ Dependencies
* update some native deps used in backend by @achou11 in
#14
* chore(deps): upgrade to Expo SDK 56 (React Native 0.85) by @gmaclennan
in #87
### 🏗️ Maintenance
* Android Testing Infrastructure & Bug Fixes by @gmaclennan in
#3
* chore: prebuild example/android; harden instrumented tests by
@gmaclennan in
#10
* chore: adjust repo setup by @achou11 in
#12
* chore: minor fixes based on expo-doctor by @achou11 in
#13
* chore: add architecture docs & plans by @gmaclennan in
#11
* chore: post-Phase-2 cleanup — comments, plan docs, agents.md by
@gmaclennan in
#33
* refactor: simplify build-backend.ts; rollup writes directly to native
asset trees by @gmaclennan in
#34
* chore: fix eslint configuration by @achou11 in
#41
* android: audit 16 KB page alignment on every shipped .so by
@gmaclennan in
#43
* chore: move example app into apps directory by @achou11 in
#18
* refactor: per-component lifecycle state with derived ComapeoState by
@gmaclennan in
#47
* android: fold waitForFile into connect retry loop by @gmaclennan in
#52
* chore: add e2e testing app by @achou11 in
#49
* ci: drop unreliable Android emulator snapshot caching by @gmaclennan
in #64
* use npm list instead of custom traversal to get native module versions
by @achou11 in
#70
* chore(e2e): add e2e tests on browserstack via Maestro by @achou11 in
#56
* chore(ci): add release workflow by @gmaclennan in
#90
* chore: fix npm script and release build script by @gmaclennan in
#91
* chore(pack): don't try to package build files by @gmaclennan in
#92
* chore(release): merge prerelease branch. by @gmaclennan in
#110
* ci(e2e): retry BrowserStack builds on infra-class flakes by
@gmaclennan in
#113
### Other Changes
* ci: derive changelog labels from PR titles + add Dependabot by
@gmaclennan in
#114

## New Contributors
* @achou11 made their first contribution in
#12
* @optic-release-automation[bot] made their first contribution in
#112

**Full Changelog**:
https://github.com/digidem/comapeo-core-react-native/commits/v1.0.0-pre.2

<!--

<release-meta>{"id":342970724,"version":"v1.0.0-pre.2","npmTag":"pre","opticUrl":"https://optic-zf3votdk5a-ew.a.run.app/api/generate/"}</release-meta>
-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature (changelog)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants