1.16.4 (2026-08-25)
- api: add missing pushLogContext/popLogContext exports to fix ReferenceError (#912) (cc9639f)
- ci: build APK before running Maestro E2E tests (#915) (dd4d563)
- test.yml: only print 'All tests passed' when job actually succeeds (#914) (8529f37)
- tsconfig: add skipLibCheck to unblock the syntax.yml type gate (#913) (8327778)
1.16.3 (2026-08-25)
- api: distinguish CORS failures from generic network errors in interceptors (#919) (9dd63c4)
- ci: correct workflow name from ci-optimized to ci in monitor-build-times.yml (#916) (d17ffed)
- ssl: default to pinning enabled when EXPO_PUBLIC_APP_ENV is unset or misspelled (#918) (39749a4)
- ssl: read pin hashes from env vars, fail if placeholder or missing (#917) (d7c24b4)
1.16.2 (2026-08-25)
- app.json: remove cydia from LSApplicationQueriesSchemes (#923) (ca27f04)
- biometrics: safe-load expo-local-authentication, default to not enrolled on error (#920) (29fc78a)
- security: remove unsafe-eval and wildcard connect-src from trusted CSP tier (#921) (ff5ed58)
- utils: replace Math.random() with crypto-safe ID generation (#922) (c730e18)
1.16.1 (2026-08-25)
- api: route SESSION_EXPIRED rejection through buildSanitizedApiError (#927) (7064711)
- api: use dedicated refreshClient to avoid interceptor re-entry on token refresh (#926) (02f6827)
- audit: use npm ci instead of npm install to match lockfile (#925) (1bf42fd)
- ci: add permissions block to restrict GITHUB_TOKEN scope (#924) (02d261e)
1.16.0 (2026-08-25)
- #594: cap requestDeduplicator at 100 entries with 30s TTL eviction (4a00abe), closes #594
- #599: debounce useFormCache writes at 800ms, add flushCache and unmount cleanup (4ed22d4), closes #599
- #637: persist quiz draft answers and add resume prompt (b916b40), closes #637
- 626: stabilize SettingRow onPress/right/icon props to prevent unnecessary re-renders (4422597)
- add build script for CI workflow (a7d27fa)
- add environment variables to all CI workflows (2967357)
- add error handler to searchIndexService.initialize() call (a39511f)
- add expo-store-review dependency and test mocks (805c115)
- add generic type params to post/put/patch (#801) (6daaf8c)
- add getItemLayout to FlatLists for virtualization performance (0a6ec35)
- add uuid import via expo-crypto for request ID generation (3a4dc79)
- add validated platform helper to prevent receipt validation bypass (d2635ce)
- align axios mock with project standard pattern (all HTTP methods) (b257e20)
- align empty restore-purchases message with expected copy (eafdb95)
- allow lint warnings and use npm install in test workflow (ef02e06)
- api: sanitize unhandled API error messages, add Sentry request context (#579) (801c845)
- auth: add client-side lockout after repeated failed login attempts (52d8e7d), closes #581
- auth: sanitize OAuth error responses before rendering in UI (9e413de), closes #676
- cap metrics buffers, add auto‑flush and memory‑pressure flushing (5446605)
- change npm ci to npm install in workflows (2fedf36)
- ci: resolve dependency install and workflow issues (71fb612)
- clean up lint warnings in socket service after merge (ff54a8e)
- clipboard: add 30-second TTL to clear pasted content from state (5dca93a)
- correct expo-store-review version to 8.0.0 (7d1246a)
- correct style array syntax in MobileProfile and format modified files (532dd4b)
- deduplicate queued requests by method+URL+body fingerprint (#813) (1f44a53)
- enforce @typescript-eslint/ban-ts-comment to ban unexplained @ts-ignore (#809) (21d021b)
- explicitly add typescript and dependencies to sync lockfile for CI clean install (b8fe75b)
- explicitly type persist onRehydrateStorage error callback (#803) (15c90ad)
- gate Sentry init on EXPO_PUBLIC_SENTRY_ENABLED instead of isDev (f6c1613)
- guard token expiry listener to prevent accumulation on re-launch (#812) (68f943f)
- handle AsyncStorage quota exceeded by clearing pending analytics queue (6b046c3)
- import missing components in AdvancedDataGrid and add rules of hooks bypasses (ff297d8)
- lazy-load lessons in MobileCourseViewer, embed via ?include=lessons (#625) (54e1d9f)
- lint: use valid no-console rule form so ESLint 9 and the pre-commit hook run (9d6ff2e)
- make auth and storage failures explicit and recoverable (fe13d8f), closes #788 #789 #790 #791
- mobile: optimize quiz analytics and socket reconnect backoff (#593, #601) (33283f0)
- narrow error types and give failures specific, typed handling (68ec214), closes #796 #797 #798 #799
- null-check authErrorCode before getAuthErrorMessage (#804) (4ba047a)
- optimistic rollback, float completion, deep link replay, bg reconnect (ef6ca00)
- pin jest-expo@54.0.17 (upstream ~54.0.19 doesn't exist on npm) (1d9b8e1)
- refactor component tree to reduce re-render propagation (a634d31)
- remove dead requestQueue import and usage (ab533d8)
- rename streaming test to TSX for JSX parsing support and commit updated lockfile (be458bf)
- replace any with ApiClient type in RequestQueue (#802) (71eb942)
- replace feature as any with FeatureType guard (#807) (da79ca4)
- resolve CI failures, dependency mismatches and security vulnerabilities (4a151d9)
- resolve CI test failures by fixing test mocks and expectations (031214c)
- resolve CI test failures from bad merge artifacts (b9e0e82)
- resolve ESLint errors — remove stale ScrollView ref, fix import order, wire onScroll handlers (6cceac1)
- resolve eslint hook dependency errors and typescript compiler issues (ab30009)
- resolve failing test suites for secureStorage, streaming, videoQuality, notifications, and card components (239ca24)
- resolve import path alias in useProfileData.ts (8e3c637)
- resolve issues #617, #618, #619 (6c7c2fb)
- resolve issues #620, #621, #622 (8123c0b)
- resolve upstream tsconfig and carousel syntax errors (d4073e2)
- security issue #576 - sanitize console output and prevent internal state leaks in production (b179d1b)
- security: add SSL public key pinning for iOS and Android (71bfdfe), closes #577
- security: validate & sanitise notification payload to block prototype pollution (#586) (55018be)
- server-validate restore receipts (#615) and scope form cache by userId (#616) (f78e0a0)
- stop logging leaking data and stop errors disappearing silently (6c3ad8c), closes #792 #793 #794 #795
- store notification timestamps as numeric ms, add migration and update logic (c5cf4b0)
- store: fix degradedFeatures Set serialization bug in persist middleware (5a8a069)
- store: guard getState() session check behind store hydration (95b4c8d)
- store: validate courseProgressStore updates with type guard (fc93aa9)
- support diacritic-insensitive search indexing (#629) (265c587)
- type socket event callbacks with generic T instead of any (#805) (770aef5)
- typed errors and complete flows for mobile auth, push and API conflicts (51cf7ad), closes #784 #785 #786 #787
- use full jitter for socket reconnect to prevent thundering herd (#810) (0131d65)
- validate 409 response shape at runtime before ConflictData access (#806) (a534160)
- validate and sanitize incoming deep links to prevent open redirects (96064c9)
- validate biometric type at runtime to prevent spoofing (831672b)
- wrap bundle-size comment step in try-catch to allow fork PRs to pass (3b88561)
- #244: Optimized context re-renders with useMemo and useCallback and also added a test for it (40f63f3), closes #244
- #337: Implement scroll position restoration for navigation (3f6f87e), closes #337
- #390: implement activity/metrics dashboard for team visibility (33f9c7b), closes #390 #390 #31 #32 #33 #73
- #660: Implement offline-first conflict resolution for concurrent edits (7e63677), closes #660 #660
- #661: Add memory pressure auto-cleanup service with three-tier degradation (b4dce3a), closes #661
- add analytics event batching with offline queue (#670) (11314f0)
- add ApiClient interface to replace any in RequestQueue (#802) (300d547)
- add CI lint/typecheck gates, deep link crash fix, app version display, FlatList keyExtractor audit (e471301), closes #866 #865 #864 #863
- add haptic feedback for quiz answers and achievement unlocks (30b14e0)
- add health check auto-disable with feature flag integration (ef00f90)
- add health check auto-disable with feature flag integration (6c2d8a4)
- add jailbreak/root detection to gate biometric auth and payments (5bc3f21)
- add keyboard navigation support for tablet and web rendering targets (397ced7)
- add LRU eviction and size cap to image cache (da7968f)
- add module augmentation for custom Axios config fields (#800) (ab10d43)
- add notification deep link allowlist and payload schema validation (#664) (64c8157)
- Add Notification Permission Explanation Sheet and deferral logic (b47dc5f)
- add OfflineBanner component with queue depth indicator (#824) (40eeeaa)
- Add PR syntax gate workflow that fails fast on TypeScript and lint errors (441c79b)
- add SecureWebView with configurable CSP injection (45dee89), closes #669
- add smart multi-tier API cache (422b683)
- add socket queue persistence, avatar upload retry, a11y labels, and dark mode fixes (e075c59)
- add team pagination and secure offline queue replay (606a5ac)
- add WebP image format negotiation with PNG fallback (11db8ce)
- android: configure ProGuard/R8 for APK size reduction (#239) (7a406b1)
- api: add SWR-style cache revalidation with visible syncing state (3ce5b5d)
- api: apply per-endpoint TTL in apiService.get (196d049)
- async MMKV store adapter, screen boundary reset keys, shared validators (ab7d238)
- biometric re-authentication timeout for sensitive operations. (dc90674)
- biometric reinstall check, perf-based timing, badge sync, video position persistence (b017b31), closes #630 #631 #633 #636
- cache: add invalidatePattern method (f5b30c4)
- cache: add per-endpoint TTL map and subscription/payment invalidation rules (f438110)
- commit solution for the listed issue (a9ae082)
- commit solutions for the listed issues (c849311)
- course: add CourseListSkeleton loading placeholder (32f7d28)
- deduplicate markLessonComplete with 500ms guard window (53443c9)
- enhance request queue with persistence, priority levels, and batch sync (#228) (b594cac)
- ErrorBoundary Sentry componentStack, search indexing placeholder, AsyncStorage security, pull-to-refresh (fc68a28)
- generate certificate of completion on course completion (ecadf17)
- grid sort nullsFirst, network probe, token cache, dedup subscriptions (80b982a), closes #632 #634 #635 #638
- images: implement progressive loading with LQIP and WebP (#231) (5226202)
- implement aggressive image prefetching for likely user flows (4c8237a), closes #233
- implement app version auto-update mechanism (fe18a4c)
- implement background task scheduling to optimize UI responsiveness (#268) (22c2a15)
- implement biometric re-enrollment flow to prevent user lockout after fingerprint change (9e57b8b)
- implement differential privacy for analytics (#407) (806c158)
- implement efficient modal stacking and automatic z-index management (5b1188f)
- Implement graceful degradation for camera and location features (e97e70c)
- implement idle task scheduling for non-critical initialization (#243) (b936cdb)
- implement intersection observer and viewability hooks for OptimizedVideoPlayer visibility management (7908ec4)
- implement lazy video initialization for MobileVideoPlayer (fe44e52)
- Implement progressive image loading with LQIP and WebP (2f7fa53)
- implement remote feature flags with local fallback and polling (1282279)
- implement shimmer SkeletonLoader and fix quizStore index persistence bug (aa04b7e)
- implement smart in-app review system (ad0e3ab)
- implement touch event deduplication to prevent double-triggers (#330) (c3c74db)
- migrate forms to react-hook-form for minimal re-renders (2dc0cf7)
- optimize data grid rendering and secure WebView (4295c1c)
- OTA update modal, OTP rate limiting, video lesson auto-complete, delete account confirmation (5e31b26)
- quiz results actions, self-contained AppState listener, testable biometric login (09843d0)
- security: encrypt AsyncStorage form cache entries with AES-256-GCM (#587) (bf4b520)
- security: mandatory server-side receipt validation before subscription grant (689a535)
- security: re-sync biometric enabled state from SecureStore on foreground (1dd4ec7)
- sentry: support tunnel URL to avoid exposing raw DSN in bundle (cd7153a)
- services: implement idempotent location watch cleanup and hook to logout action via TDD (edfd079)
- styling optimization and font subsetting pipeline (d475802)
- video crash recovery with retry, renovate config, token refresh race condition docs (c80fb32)
- add removeClippedSubviews to FlatList components (6745d9f)
- enable removeClippedSubviews on ScrollView and FlatList (67d649e)
- frontend: decouple typing loops from heavy transaction calculations with useTransition (#245) (9ab7dfd)
- implement exponential backoff (#225), request deduplication (#224), and document lazy loading (#216, #223) (30e6d76)
- memoize FlatList renderItem and enforce exhaustive-deps (c6fcd66)
- reduce store memory footprint at startup (3374028)
- replace per-response cache-stat calculation with 60 s batched flush (#811) (5f519ed)
- skip or reduce cache warming on slow/cellular connections (#814) (4723e69)
- split appStore and lazy-init achievement state (ab8b06a), closes #5 #6 #29
- strategic memoization based on re-render profiling (844c574)
- virtualize bookmark & syllabus lists (#219) (15868ca)
1.15.0 (2026-06-01)
- implement cursor-based pagination for courses and add related hooks and tests (9f4efb2)
- Implement efficient animation scheduling with requestAnimationFrame (#349) (b0b8292)
1.14.1 (2026-06-01)
- prevent generic prop spreading in mobile drawer and offline indicator (e60dea5)
1.14.0 (2026-06-01)
- add resource timing metrics for API calls and image loads (c34e734), closes #31 #32 #33 #34
- timeout countdown with progress bar and retry button (9a4e516), closes #11 #20
1.13.0 (2026-06-01)
- implement TopicFeed UI/UX enhancement (5e49d20)
- add removeClippedSubviews to FlatList components (1dc4ca3)
1.12.0 (2026-06-01)
- warm critical caches during splash screen startup (a7f7b03)
1.11.0 (2026-06-01)
- add build script and regenerate package-lock.json (1a8a4f3)
- replace missing 'npm run build' with 'npx expo export' in CI workflow (faf9ea0)
- strip production debug code (eaf8818)
- Add cache warming and prefetching strategies for critical data (d23ea2a)
- add Core Web Vitals monitoring with regression alerts (0fbfbd1)
- add performance regression testing to CI pipeline (3b13996), closes #31 #32 #34
- add React Profiler integration and performance monitoring (#246) (b44bc9f)
- add zustandBatch utility for batching state updates in React Native (b52b8b2)
- animation state machine hook with FilterSheet integration (72e649a)
- build: inline small image assets under 1KB as data URLs (6956ca0)
- implement accessible focus management hooks and AccessibleModal component (70154eb)
- Implement battery level-aware performance throttling (e99271a)
- implement clipboard performance optimization for large text (#335) (8b9e2da)
- implement cursor-based pagination for courses and add related hooks and tests (8216a32)
- implement incremental builds and CI/CD caching (#241) (d90dff1)
- implement modal portal to isolate modals from parent re-renders (922617c), closes #5 #7 #29
- implement search cancellation in MobileSearch component (0bd5fe4)
- implement smart cache size management with LRU eviction (e79efac)
- lazy load Sentry and socket.io (0453648)
- measure predictive-preload accuracy and document the system (a466a02)
- optimize CSS-in-JS styling with atomic NativeWind styles (#350) (2e6ab6f)
- optimize location data fetching with caching, batching and precision tiers (5a7c149)
- warm critical caches during splash screen startup (c489fff)
- implement keyboard event delegation at root level (d552064)
- ios: optimize iOS build with LLVM O3, LTO, and bitcode (0eac62e)
1.9.0 (2026-05-30)
- resolve tmp package high vulnerability in npm audit (289894b)
- implement user preference for data-saver mode (5fa933d)
- implement efficient diff algorithm for deep object updates (22c2a5a)
- implement native bridge batching for haptics and logging (dc630c5)
1.8.0 (2026-05-30)
1.7.0 (2026-05-30)
- add StreamingProgressBar component for visual progress feedback (85359f4)
- add useStreamingData hook for progressive rendering with automatic deduplication and metrics (95f70ad)
- implement streaming API service for progressive rendering with TTFB optimization (93ae011)
1.6.0 (2026-05-30)
1.5.0 (2026-05-30)
- #347: Replace index-based keys with stable unique identifiers (e2917f8), closes #347
- lint: sort imports alphabetically and structurally to satisfy strict rule matchers (f3215f2)
- build: add custom Babel production optimizer plugin (3079903)
- enhance useMemoryMonitor with heap tracking, automated leak detection, and high-usage alerts (071a2b7), closes hi#usage
- implement font subsetting pipeline and custom font loading (#253) (3d9bf4c)
- implement progressive app startup with visible progress indicator (0fb5159)
- implement react.memo for expensive list item components (ab05a9a)
- timeout countdown with progress bar and retry button (c11e193), closes #11 #20
1.4.0 (2026-05-29)
- add useFormValidation hook with 300ms debounce (#351) (d4f3e64)
- added smart preloading of next likely screens (dad22cb)
- components: error boundary with automatic retry and exponential backoff (8ced93b), closes #376
- devtools: add in-app memory profiling overlay for development (4be8119), closes #378
1.3.0 (2026-05-29)
- harden mobile search and video player tests (af42884)
- regenerate package-lock.json to sync with package.json dependencies (bd919f4)
- repair quiz carousel bundle parse errors (d451ac7)
- resolve CI, dependency audit, and bundle size tracking workflow failures (fcc8a5d)
- #354: Implement performance regression tests for heavy components (81d04af), closes #354 #354
- #392: Implement efficient virtual scroll for infinite lists (4f374ce), closes #392
- #412: Implement batch processing for large data imports/exports (6d5fa4e), closes #412
- #640: add OpenAPI 3.0 compliance validation with CI integration (a319477), closes #640
- cache reusable form values for autofill (b514fd4)
- expand cached form prefilling across auth flows (0aaeedf)
- implement optimized video player with native controls and buffering strategy (c6da89b)
- reduce animation frame rate on low-end devices and battery saver mode (8fb4b40)
- version-based cache invalidation (#260) (d51bd44)
- virtualize LessonCarousel and QuizCarousel with FlatList (7c5be18)
1.2.0 (2026-05-28)
1.1.0 (2026-05-28)
- batch and debounce rapid user input events (typing, scrolling) (bf0098b)
- bookmarks: wire up bookmark saving, sync, and list display (3474656)
- consistent code formatting #171 (48b6451)
- deps: remove unused dependencies identified by depcheck (#218) (4299a8e)
- hooks: add all hooks to barrel export in index.ts (1b3d9ba)
- hooks: wire up course progress saving and server sync (c445c7e)
- implement comprehensive performance audit and optimization report system (#414) (42f8f14)
- memory issues (859fc5d)
- remove direct console.log and add production stripping (5177610)
- remove unused native expo dependencies (close #041) (d25ff21)
- resolve merge conflict in PrimaryButton.tsx (fe206b5)
- secure-storage: verify Keychain/Keystore usage and prevent AsyncStorage fallback (5bd1bfc), closes #140
- updated eslint config (72ba7c8)
- verify and clean up search history implementation (5353f87), closes #154
- wire up notification settings persistence (7c56e0d), closes #156
- #399: implement progressive disclosure UI for complex screens (bb1fd52), closes #399 #399
- add accessibility tests for buttons, images, contrast, and keyboard nav (11c74f0), closes #030
- add API cache strategy with stale-while-revalidate (74a2a4b), closes #142
- add bundle size tracking and alerts to CI (9fcfc1d), closes #145
- add comprehensive test suite and CI workflow (Issue #49) (7db5414)
- add lazy loading / code splitting for screens (#144) (16ce9a8)
- add lint, typecheck, and test steps to CI workflow (43ec325)
- add mobile video player component with controls and picture-in-picture support (91f539f)
- add npm audit and depcheck to CI workflow (41dfc9b)
- add React.lazy code splitting to all heavy routes (fe8d59a), closes #063
- add real-time socket event handlers (3d600cc), closes #86
- add release workflow (Close #124) (be83228)
- add runtime environment variable validation (00453ef)
- analytics: implement event sampling and stabilize secure storage tests (7abb531)
- analytics: implement event tracking across screens and components (0de3fc3)
- api: add 429 rate limit handling with exponential backoff (#141) (e5eee30)
- api: corrected linting issues. (2316402)
- api: implement 403, 429, and 500+ error handling with exponential backoff (9add556)
- assets: restore high-resolution icons and fix placeholder assets (3dc8b1c), closes hi#density hi#res hi#DPI
- auth: add centralized auth service with login, logout, and checkAuthStatus (102e463)
- build mobile test taking interface (acd596a)
- create haptic feedback hook (89c99fa)
- form validation added (f2d214d)
- image-cache: integrate image caching throughout app (0706bc3), closes #143
- implement AdvancedDataGrid with sorting, filtering, editing, and export (76b3e41)
- implement AdvancedDataGrid with sorting, filtering, editing, and export (a78b592)
- implement app content cache versioning with smart updates (#402) (7fc8c92)
- implement automatic crash recovery with session restoration (#411) (06a65c5)
- implement automatic route-size based code splitting heuristics (6b6534b)
- implement centralized logger and replace console statements (960f707)
- implement contextual skeleton loading states for perceived performance (#403) (c2c1edc)
- implement Deep linking and app links (6552258)
- implement dynamic font scaling throughout the app (77685f8)
- implement error boundaries for main screens and layout components (165e87d)
- implement mobile analytics and crash reporting #36 (4ba1ab1)
- Implement mobile app store deployment with EAS (8633760)
- Implement Mobile Course Viewer with swipeable lessons, progress tracking, bookmarks, and notes (5bbae39)
- implement mobile navigation system (c22dc61)
- Implement Mobile Profile Management components (328c46b)
- Implement Mobile Profile Management components (f559854)
- implement offline request queue with retry and pending badge (37cb6cd)
- implement session expiry handling (auto-refresh, logout, warnings) (abbcf59)
- implement splash screen logic to manage application initialization and resource loading (7989211)
- implement Trie-based autocomplete for instant search (#410) (8cfaea1)
- implement useAnalytics hook and integrate automatic screen tracking in root layout (657f792)
- initialize push notifications at app startup (d2adee9)
- initialize TeachLink mobile app with Expo and React Native (3abab2b), closes #1
- logging: Implement centralized structured logging system #176 (1ebe1cf)
- Mobile Performance Optimizations (Image Caching, Virtual Lists, Memory Monitoring) (bd8b740)
- redesign HomeScreen and MobileSyllabus with unified design system (3bebea3), closes #19c3e6
- setup Storybook and add component stories #175 (06e8a76)
- socket: add protobuf-style binary websocket protocol (c07c749)
- socket: enable websocket deflate compression with benchmarking telemetry (2920e22)
- store: add devtools and subscribeWithSelector middleware to Zustand store (6891fb2)
- store: implement selective persistence with versioning (#384) (8c449da)
- swipe: add native-backed swipe actions with gesture-handler animations (f3d748b)
- theme: optimize dark mode switching with CSS variable tokens (dca6303)
- update splash screen icon and theme colors in app configuration (074c0ac)
- wire biometric auth into login/settings and add socket reconnection (f86551a), closes #82 #85
- wire up achievement badges display with persistent storage (61a86e0), closes #155
- wire up react-native-iap for mobile payments (761dea9)
- wire VoiceSearch into search input as compact mic button (63b4857), closes #88