Commit Graph
43 Commits
Author SHA1 Message Date
James RichandClaude Sonnet 5 e3dc4b5ab0 feat(prefs): enable wasmJs via a platform-neutral PrefsStore abstraction
androidx.datastore.preferences publishes no wasmJs variant at any
version, so core:prefs can no longer depend on DataStore<Preferences>
from commonMain. Introduces PrefsStore/PrefsSnapshot/PrefsKey
(core/prefs/store/PrefsStore.kt), a minimal interface mirroring
DataStore<Preferences>'s own shape closely enough that porting each
*PrefsImpl off DataStore is a mechanical key-factory rename, not a
rewrite.

Two implementations: nonWebMain's DataStorePrefsStore adapts a real
DataStore<Preferences> (android/jvm/iOS unchanged underneath), and
wasmJsMain's LocalStoragePrefsStore is backed by the browser's
localStorage directly -- synchronous and built-in, so unlike
core:database's OPFS story this needs no Worker or npm dependency.

Unlike core:database's DatabaseManager split, none of the 17
*PrefsImpl classes needed to move out of commonMain: the platform
difference is fully absorbed inside PrefsStore's two implementations,
so every impl's diff is exactly the mechanical shape promised (defaults,
migration logic, dynamic per-node keys all unchanged). PrefsDataStores.kt's
12 marker interfaces/wrappers get the same mechanical swap.

Enabling core:prefs's wasmJs target exposed a second, one-module-upstream
gap: core:repository had no wasmJs target at all (its `expect class
Location` had android/jvm/iOS actuals but no wasmJs one). Fixed with a
wasmJsMain placeholder mirroring the existing jvmMain placeholder exactly
-- desktop has no real location hardware either, so this introduces no
new product decision, just parity with the platform that already has none.

core:service's MeshLogCleanupWorkerTest fake DataStore<Preferences> is
updated to fake PrefsStore/PrefsSnapshot instead, following the interface
change through its one external consumer.

CorePrefsWasmJsModule (new Koin module, localStorage-backed) is not yet
registered anywhere -- no webApp module exists yet to wire it into, same
as core:database's SingleDatabaseProvider precedent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-30 21:44:05 -05:00
James Rich 1f92259f6d feat(database): enable wasmJs with real OPFS-backed persistence
Room 3.0.2 + androidx.sqlite:sqlite-web:2.7.0's WebWorkerSQLiteDriver, backed by real
SQLite compiled to WASM (@sqlite.org/sqlite-wasm) running in a dedicated Web Worker
(core/database/worker/{package.json,worker.js}), persisting via OPFS -- same shape
already proven end-to-end this session (insert survives a full page reload) against
the upstream danysantiago/room-web-demo reference. Uses the same nonWebMain
hierarchy-split pattern already proven for core:ble.

DatabaseManager (multi-device switching, legacy-DB migration, cross-transport merge)
is built entirely on DatabaseDataStore (a DataStore<Preferences> wrapper), and
androidx.datastore.preferences has zero wasmJs variant at any published version --
not a temporary gap, the Preferences type itself doesn't resolve for that target. That
whole orchestrator is out of scope for a web client (no BLE/USB device-switching story
exists there), so it moves to nonWebMain unchanged, alongside DatabaseDataStore and its
Koin module. wasmJs gets a new SingleDatabaseProvider: one real, persistent,
non-switching MeshtasticDatabase, nothing to switch between.

BusyTimeoutSQLiteDriver turned out not to be platform-neutral as originally assumed:
androidx.sqlite.SQLiteDriver.open() is suspend on androidx.sqlite's own webMain branch,
non-suspend everywhere else (confirmed from androidx.sqlite:sqlite:2.7.0's own
sources) -- split into two independent, identically-shaped classes rather than one
shared implementation, since the suspend-modifier difference means actual can't
paper over it (same "disjoint compilations" shape as core:ble's
BleServiceExtensions.kt).

getInMemoryDatabaseBuilder()/getDatabaseDirectory()/deleteDatabase()/getFileSystem()
fail loudly or return best-effort placeholders on wasmJs -- confirmed via grep that
their only real caller, DatabaseManager, lives entirely in nonWebMain now, so nothing
wasmJs-reachable needs them to do anything real. Same "fail loudly, don't silently
return wrong data" precedent as core:resources' getString().

androidApp/desktopApp needed a small, necessary addition: registering the new
CoreDatabaseNonWebModule alongside the existing CoreDatabaseModule, since without it
neither platform would have a DatabaseDataStore Koin binding anymore.

Verified independently twice: compileKotlinWasmJs/compileTestKotlinWasmJs pass;
full regression (android/jvm/iOS compiles, allTests -- with the ~21 moved
DatabaseManager*/DAO tests confirmed actually executing via real test-report output,
not just exit code) passes; androidApp and desktopApp both compile clean with the new
DI wiring; detekt/spotlessCheck clean across core:database and both app modules. No
real browser round-trip test was run against this exact worker.js (accepted as a
stretch goal, not required for this pass).
2026-08-30 20:50:59 -05:00
James RichandClaude Opus 5 f5a6ae38b8 feat(map): replace OSMdroid with MapLibre on F-Droid, and put a map on desktop (#6901)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-29 15:59:26 +00:00
232d2f9d51 feat(units): resolve units from the device region, add a Units setting, render through ICU (#6916)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: nomdetom <nomdetom@protonmail.com>
2026-08-27 14:32:55 -05:00
James RichandClaude Opus 5 4938982e2e fix(desktop): test the bundle path, not the identifier, before notifying (#6885)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 08:06:08 -05:00
James RichandClaude Opus 5 b7757e08d3 fix(desktop): disable macOS notifications when the process has no app bundle (#6876)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 00:28:52 +00:00
Jeremiah K e9d09a3380 fix(lifecycle): harden packet admission and transport ownership (#6716) 2026-08-15 21:44:17 +00:00
James RichandClaude Opus 5 1f0d40bad1 feat(demo): make Demo Mode reachable and populated in release builds (#6691)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 00:15:58 +00:00
James RichandClaude Opus 5 fd3cce355d fix(connections): hide the replay demo entry when its capture asset is absent (#6692)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 23:23:38 +00:00
simulationstation 2f387369c1 fix(messaging): disambiguate sender-scoped packet IDs (#6624) 2026-08-13 13:50:37 +00:00
James RichandClaude Opus 5 d102ca262a fix(service): stop blocking getString on Dispatchers.Default-reachable notification paths (#6668)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 03:07:03 +00:00
James RichandClaude Opus 5 215358ef9b fix(desktop): free the GError and release libnotify on shutdown (#6544)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 14:46:20 +00:00
James RichandClaude Opus 5 e2439a492a fix(desktop): stop SIGSEGV on every Linux notification (#6543)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 22:09:06 +00:00
James RichandClaude Opus 5 07d253130b refactor(di): replace Koin string qualifiers with distinct types (#6522)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 20:56:07 +00:00
James RichandClaude Opus 5 b4105e3e3f fix(event): honor disabled node events, gate brand URLs, observe the manifest (#6499)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-28 21:09:13 +00:00
Jeremiah K 0030d3bf96 fix(settings): retain config session across navigation (#6449) 2026-07-26 20:59:14 -05:00
Jeremiah K 1bf25121ca fix(database): make DB updates atomic across device switches (#6256) 2026-07-21 14:36:00 +00:00
James RichandClaude Fable 5 82e5da16dc fix: make NotificationManager.dispatch await the platform send (#6326)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 05:55:41 +00:00
91d2f7660b Add firmware update notice (#6309)
Co-authored-by: Benjamin Faershtein <benjaminfaershtein@Benjamins-MacBook-Pro-2.local>
Co-authored-by: James Rich <james.a.rich@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 14:31:25 -05:00
James RichandClaude Fable 5 b307ceb5c2 feat(desktop): update notifications and store-readiness fixes (#6215)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 02:40:33 +00:00
James RichandClaude Fable 5 a57c1444b8 fix(desktop): align tray, shortcuts, and macOS chrome with current CMP desktop guidance (#6205)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 23:45:57 +00:00
Jeremiah K 6a53b0805e fix(ble): refresh GATT cache around ESP32 OTA profile changes (#6166) 2026-07-09 14:20:18 -05:00
James Rich 33fbb9f7fc chore: fix build warnings and migrate deprecated APIs (#6130) 2026-07-07 18:17:42 +00:00
James RichandClaude Opus 4.8 e400acf305 fix(geofence): restrict crossing alerts to creator, add per-geofence opt-in (#6117)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 23:01:17 +00:00
Ben Meadors d815d6d363 feat(messaging): translate chat messages in-place with on-device ML Kit (google flavor only) (#6103) 2026-07-06 01:03:38 +00:00
James RichandClaude Fable 5 32cbf522bd fix(data): stale firmware/hardware caches — stop cancelling slow API refreshes, prune pulled releases, seed from newer bundles (#6060)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 02:35:18 +00:00
James RichandClaude Opus 4.8 4ea8736c3a feat(settings): view & export app debug logs in-app (#6055)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 00:46:14 +00:00
James RichandClaude Opus 4.8 6a2dfc898b feat(discovery): surface received Mesh Beacon invitations (#6043)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 21:54:49 +00:00
Jeremiah K f57cf73180 fix(qr): Stabilize scanner lifecycle and imports (#6040) 2026-07-01 16:25:06 +00:00
Jeremiah K 09cde67e51 fix(usb): Surface permission denial as permanent disconnect (#5943) 2026-06-25 10:36:17 +00:00
James RichandClaude Opus 4.8 1194c75594 refactor(data): consolidate bundled-asset loading behind BundledAssetReader (#5921)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 22:05:21 +00:00
Jeremiah K 3ca87fa032 fix(service): recover stalled WiFi/TCP handshakes by cycling active transport (#5856) 2026-06-20 19:03:48 +00:00
James RichandClaude Opus 4.8 a5f9238183 fix(network): retry transient connection/IO failures to api.meshtastic.org (#5870)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:23:37 +00:00
James RichandClaude Opus 4.8 0ab7a4d8c2 fix(desktop): terminate process on exit; quit on close when no tray (#5858)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 22:20:44 +00:00
James RichandClaude Opus 4.8 f2769a3b29 fix(build): isolate ML Kit GenAI to the Google flavor (fix F-Droid rb-check) (#5824)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 20:58:46 -05:00
James RichandClaude Opus 4.8 953eef941e refactor(node): fetch device links from the API, drop the bundled matcher (#5765)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 15:51:54 -05:00
James RichandCopilot 76847dd638 feat(discovery): mesh network discovery (#5275)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-16 15:51:54 -05:00
James RichandClaude Opus 4.8 7631db63d0 feat(node): msh.to device hardware links ("I want one" section + Settings directory) (#5714)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 15:51:54 -05:00
3e0d2d39c3 refactor: Remove AIDL API and modernize service architecture (#5586)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-16 15:51:54 -05:00
James RichandCopilot ea85b906e8 feat(nav): rename tab labels to canonical order (#5551)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 17:57:08 -05:00
James RichandCopilot fc0df1a79a feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 04:00:22 +00:00
James RichandCopilot df4f10c4d6 fix(nav): remote admin nodenum + Nav3 consolidation and improvements (#5478)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-18 17:29:27 +00:00
James RichandCopilot f4b6b02ace refactor(build): rename entry modules and remove DESKTOP_ONLY mode (#5476)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-18 12:44:12 +00:00