What's Changed
🚀 Enhancements
- Rewrite UI from Fragments and XML to Jetpack Compose by @d4rken in #174
- Add theme color and contrast style settings by @d4rken in #176
- Add Compose previews to all major screens by @d4rken in #177
- Show upgrade prompt when tapping locked theme settings by @d4rken in #178
- Improve DataStore with deduplication, error resilience, and logging by @d4rken in #179
- Fix build warnings for AGP 9.0 and Kotlin K2 compiler by @d4rken in #180
- Improve debug recorder and contact support reliability by @d4rken in #187
- Require time on sponsors page before unlocking FOSS pro by @d4rken in #189
- Add configurable sync intervals by @d4rken in #192
- Use new round mascot image on onboarding and upgrade screens by @d4rken in #193
- Add sync status bar to dashboard by @d4rken in #194
- Migrate battery widget from RemoteViews to Glance by @d4rken in #196
- Improve upgrade card on dashboard with details and device limit hint by @d4rken in #195
- Replace dashboard module rows with visual tile grid and drag editor by @d4rken in #200
- Add instant sync with real-time notifications by @d4rken in #205
- Rename K-Server to Octi Server and add type-safe connector identification by @d4rken in #206
- Reduce Google Drive API calls with change detection and targeted sync by @d4rken in #208
- Add warning icon and red date for stale devices on dashboard by @d4rken in #210
- Add device reorder and card edit menu to dashboard by @d4rken in #211
- Skip directory traversal for event-driven Google Drive syncs by @d4rken in #212
- Show battery alert thresholds on dashboard progress bar by @d4rken in #213
- Improve clock skew detection accuracy and show offset direction by @d4rken in #217
- Show upgrade icon instead of toggle for pro-only pause sync by @d4rken in #218
- Improve apps tile to show full app name on its own line by @d4rken in #220
- Distinguish multiple sync accounts on dashboard by @d4rken in #222
- Show waiting indicator on device link host screen by @d4rken in #223
- Upgrade encryption to AES256-GCM-SIV with device compatibility detection by @d4rken in #226
- Show server device metadata on sync devices screen by @d4rken in #227
- Replace raw encryption type strings with typed enum by @d4rken in #228
- Add connector issue system for warnings and errors by @d4rken in #231
- Support adding multiple Google Drive accounts by @d4rken in #239
- Show warning details on sync connector and device screens by @d4rken in #240
- Improve sync performance and reduce redundant network operations by @d4rken in #243
- Modernize codebase and prepare for future multiplatform deployments by @d4rken in #244
- Add clipboard and network widgets by @d4rken in #242
- Choose which devices each widget shows by @d4rken in #248
- Polish file-sharing: storage UX, streaming uploads, server v2 sync by @d4rken in #252
- Surface auth-issue pause for unregistered OctiServer device by @d4rken in #255
- OctiServer: simpler create-account flow and clearer device warning by @d4rken in #256
- Fix cross-device file deletion and add delete confirmation by @d4rken in #259
- Show BETA chip in toolbar and fix Support issues link by @d4rken in #264
🐞 Bug fixes
- Force widget color configuration screen on placement by @d4rken in #173
- Point in-app changelog link to octi.darken.eu by @d4rken in #175
- Navigate to sync list after successful account creation by @d4rken in #190
- Fix stale share code when linking additional devices via KServer by @d4rken in #197
- Fix Live sync mode not showing on dashboard at startup by @d4rken in #221
- Fix transient sync error after linking a new device by @d4rken in #224
- Fix sync being cancelled when navigating between screens by @d4rken in #225
- Fix paused sync connector still showing activity by @d4rken in #229
- Fix foreground sync and WebSocket never activating by @d4rken in #230
- Fix duplicate meta module syncs every 10 seconds by @d4rken in #238
- Stop all activity on paused sync connectors by @d4rken in #246
- Read release type from version.properties by @d4rken in #247
- Fix crashes from uncaught errors in ViewModel background flows by @d4rken in #249
- Persist widget config in DataStore to survive reboot by @d4rken in #250
- Hide legacy encryption warning when modern connector reaches device by @d4rken in #260
🤷 Other changes
- Replace Moshi with kotlinx.serialization by @d4rken in #188
- Replace waitForState with asStateFlow + collectAsState by @d4rken in #183
- Update GitHub Actions to Node.js 24-compatible versions by @d4rken in #191
- Modularize dashboard UI and convert action dialogs to bottom sheets by @d4rken in #198
- Show per-module sync progress in dashboard status bar by @d4rken in #199
- Add Fastlane metadata length validation to CI by @d4rken in #201
- Upload R8 mapping files to Google Play for crash reporting by @d4rken in #202
- Remove mapping file references from Fastlane by @d4rken in #203
- Restrict GITHUB_TOKEN permissions to minimum required by @d4rken in #204
- Enable Quick Sync by default for pro users by @d4rken in #209
- Improve onboarding and add adaptive multi-column dashboard by @d4rken in #214
- Fix module data not syncing to server on idle or newly configured devices by @d4rken in #215
- Upgrade Tink API and align test dependency versions by @d4rken in #216
- Centralize experimental API opt-ins in Gradle compiler args by @d4rken in #219
- Replace battery optimization chip with reliability bottom sheet by @d4rken in #232
- Refactor sync to single-path writes with per-connector hash tracking by @d4rken in #235
- Fix last synced timestamp updating on failed or skipped sync by @d4rken in #233
- Modernize Google Drive authorization by @d4rken in #236
- Replace @file:UseSerializers with per-property annotations by @d4rken in #234
- Migrate Long milliseconds to kotlin.time.Duration by @d4rken in #245
- File sharing module by @d4rken in #185
- Migrate Pages to Actions deploy and fix changelog race by @d4rken in #251
- Upgrade addressable to 2.9.0 and json to 2.19.4 by @d4rken in #253
- Add cross-version regression test against v0.8.1 server by @d4rken in #254
- Fix dashboard issue device navigation by @d4rken in #257
- Limit free-tier file sharing to 1 file per device by @d4rken in #258
- Migrate release process to GitHub Actions by @d4rken in #261
- CI: Skip release bump-only workflow runs by @d4rken in #262
- Update translations from Crowdin by @d4rken in #263
Full Changelog: v0.16.0-rc0...v1.0.0-beta1