v0.3.0
Complete rewrite with no backwards compatibility to previous versions. The app has been rebuilt around a spatial SQLite database and a Redux store with substantial performance improvements across the board, a new side-drawer panel system, and a new customizable dashboard. New capabilities include BRouter offline routing, full line management with tags, and Lines and Tags data browsers.
Added
- Feature-based plugin architecture — 14 production features each contributing UI items, drawer panels, dashboard widgets, map components, and app overlays via a shared
AppFeaturecontract and priority-sortedFeatureRegistry. - Redux Toolkit with 16 slices and a custom listener middleware for side-effect-driven persistence, state reactions, and cross-feature coordination.
- Spatial SQLite database layer with drizzle-orm, op-sqlite, and libspatialite — LINESTRINGZ/POINTZ geometry columns (SRID 4326), R*Tree spatial indexes, React Query caching (
staleTime: Infinity), drizzle-kit migrations, and dynamic database path configuration. - Centralized database error handling with
withDbErrorHandlingwrapper — try/catch + error toast + log across all DB actions. - Line management — full CRUD for geographic lines with tags (many-to-many, cascade deletes), per-line colours, multi-column filtering, bulk actions, batch export to GPX/KML/GeoJSON, system-protected tags, and data-table browsers.
- BRouter offline routing — waypoint-based via
react-native-brouterwith per-point profile inheritance, segment-change optimization, DEM-based elevation enrichment, slope colour-ramp visualization, and route persistence across restarts. - GPX/KML/GeoJSON import — multi-step wizard with single-file and batch-directory modes, date extraction from 18 preset filename patterns, title and tag extraction via regex, overwrite handling (create/skip/replace), dry-run preview, and background processing via foreground service.
- Shared foreground service — native
BackgroundTaskServicewith thread-safe task registry, progress notifications, and auto-stop when idle. - Side drawers — left/right panels with reanimated gesture handling, sortable drag-and-drop ordering, and programmatic expand/collapse.
BidirectionalScrollHost— custom Fabric native view for simultaneous horizontal drawer drag and vertical list scrolling with native fling handling.- Dashboard — configurable widget grid with drag-to-reorder editing, per-widget visibility/font/size/unit controls, and widgets for coordinates, altitude, and zoom level.
- Cache manager — lists all tile caches with sizes, per-layer associations, individual deletion, and sweep-all-unused action.
- App updater — version comparison on app start with plugin-style migration callbacks, downgrade detection, and splash-screen progress.
- Generic component library — controls (numeric, toggle, file-picker, colour, date-time), info-label wrappers, primitives (buttons, icons, badges, links), and layout wrappers (keyboard-avoiding modals, menus, lists).
- User-configurable date/time display format via Day.js singleton with locale bundles for all 4 languages.
- Native Android splash screen with dark/light theme variants and custom font title.
- Custom icon font with automated build pipeline (
yarn buildIcons) plus third-partyfont-gisicon set. yarn sortI18nscript keeping translation key order in sync across all languages.yarn organizeImportsscript sorting TypeScript imports into external/internal blocks.- GitHub Actions CI/CD — builds APK+AAB on
v*tags, signs with keystore secrets, attaches artefacts to the GitHub release. - Release automation via
yarn publish— bumps versions, generates semver-basedversionCode, releases the changelog, creates GitHub release, merges to main/development. PRIVACY.md— permission disclosures, GDPR rights, data storage description, and contact info.
Changed
- Architecture — restructured from flat component tree to self-contained feature modules, each with its own Redux slice, selectors, i18n, and extension-point registration.
- State management — introduced Redux Toolkit with 16 slices and listener middleware for side-effect coordination.
- Map rendering — migrated to
react-native-mapsforge-vtm0.8.0 withuseMapPosition()Reanimated hook for 60fps coordinate reads at zero bridge cost, native GNSS filter onMapContainer, and DEM-based elevation enrichment. - i18n — expanded to 4 languages (en, de, es, pt) with per-feature translation files.
- Performance — comprehensive
React.memo/useCallback/useMemosweep across all components. Per-line colour paint objects shared by reference (≤11 total).BidirectionalScrollHostnative fling handling.TextInputNativeMultilinezero-layout-cycle auto-resize. - UI — settings panels and modals rebuilt on the generic component library with
ModalWrapperkeyboard-avoidance and blur backdrop. PaperButtonstyling standardized viauseButtonPropscomposable. - Layers and profiles — sortable drag-and-drop lists with temp/commit editing to avoid map re-creation on every keystroke.
- Database — React Query
staleTime: Infinity(no auto-refetch, only manual invalidation after writes).withDbTransactionfor atomic multi-statement writes. - Date/time — pre-configured Day.js singleton with user-configurable display format applied globally. Never bare
dayjsimports. - Android permissions — added foreground-service, location, and notification permissions; storage permissions capped at SDK 28.
- Build —
targetSdkVersion/compileSdkVersionbumped from 34 to 36.metro.config.jstransforms.md/.sqlfiles.babel-plugin-inline-importfor SQL.drizzle.config.tsauto-discovers schema files. - Logging — centralized error handling with toast notifications, no bare
consolecalls anywhere.