-
#58
3e651f7Thanks @sudokoi! - Move Play Store update and in-app review support into a tracked local Expo module.Play-installed Android builds now use native Play Core flows for in-app update checks, background download/install handoff, and conservative in-app review prompts, while non-Play builds keep the GitHub-release fallback behavior.
- #56
7b1c816Thanks @sudokoi! - Improve SMS import accuracy for card-brand aliases and debit messages that include card-ending details, harden Android SMS review defaults, and clean up screen chrome and spacing across the app with shared UI theme tokens, including restored inline padding for chips, filter actions, and the add-expense amount field.
45c17e8Thanks @sudokoi! - Revamp Settings and upgrade Android SMS ML inference.- move common settings actions to the top-level screen and move payment management into a dedicated submenu
- add feature flags for math expressions and ML-only SMS import inference behavior
- upgrade the bundled Android SMS classifier to the stronger
seed-litert-embed-augmented-v1model contract - document the SMS ML model architectures and current Android-ready pipeline
-
2c0e7dbThanks @sudokoi! - Improve the SMS import review editor so it behaves like the main expense forms.This makes the review screen keyboard-safe while editing, defaults unresolved payment methods to Other, and adds the same saved payment instrument dropdown used in the add and edit flows for UPI and cards.
-
#51
c5e54d5Thanks @sudokoi! - Add a dedicated routed SMS import review screen so imported messages can be staged, reviewed, and corrected before they are applied.This moves SMS import review out of the previous sheet flow and makes it safer to confirm matches and catch mistakes before creating expenses.
- #49
1ef6533Thanks @sudokoi! - Ship Android SMS import as a review-first, local-only workflow and formalize its platform-scoped behavior in the product docs.- add Android-only SMS import with on-device regex parsing, bounded recent-message scans, and inline permission requests during manual scans
- show SMS permission status in Settings and keep raw SMS content in a local review queue until the user accepts an expense
- map SMS category suggestions onto the shipped default categories and fall back to Other when no default category matches or the suggested category no longer exists
- update privacy, architecture, README, and ADR documentation to reflect the release behavior and data boundaries
- #47
1f05bf4Thanks @sudokoi! - Optimize sync engine with Git Trees API and SHA-based differential downloads- Replace O(N) fetch phase with a single Git Trees API call to retrieve the full repository tree and blob SHAs
- Download only files whose SHA has changed since the last sync, skipping unchanged files entirely
- Reuse tree data in the push phase to eliminate a redundant
listFiles()API call - Fix sync notification count to reflect actual merge results (added + updated from remote) instead of raw download count
- Add
remote-sha-cache.tsfor persisting blob SHAs between syncs (AsyncStorage, local-only) - Add
getRepositoryTree()to the GitHub API client for tree-based fetching - Graceful fallback to Contents API when the Trees API is unavailable (network errors, truncated trees, 404/500)
- Cold start (empty SHA cache) performs a full download, identical to pre-optimization behavior
- No changes to remote repository format, merge logic, or push-side differential sync
- Comprehensive property-based and integration tests covering all 6 correctness properties
- #45
1ffdd1eThanks @sudokoi! - Add a configurable math-entry mode for expense amounts and reorganize the settings screen.- Add a persisted
enableMathExpressionssetting that lets amount fields switch between expression parsing and numeric keypad entry. - Apply the amount-entry mode across add, history edit, and analytics amount range inputs, with validation updated to match the selected mode.
- Reorganize settings into clearer groups, moving payment management together and refining the general, GitHub sync, localization, and app info sections.
- Add locale strings and test coverage for the new settings schema and amount-input behavior.
- Add a persisted
Introduce queue for sync change, fix payment instrument legend overflow
- fix(sync): queue in-flight edits, avoid dirty-day loss on sync, and improve manual/auto sync reliability
- ui(analytics): consolidate payment instrument breakdown into the pie chart legend and improve label wrapping
- fix(currency): persist currency in CSV + include in merge checks
- Link dashboard summary cards to tabs
- #40
7314667Thanks @sudokoi! - Introduce month filters, smarter sync, and language-aligned defaults.- Add month filtering for analytics and history views.
- Sync default currency with language changes and improve history load-more logic.
- Optimize GitHub sync with dirty-day tracking and localized notifications.
-
Implement full app internationalization (i18n)
- Add support for English (US, UK, IN), Japanese and Hindi locales
- Configure i18next with persistent language preference
- Localize all major screens: Dashboard, History, Add Expense, Analytics, Settings
- Add Language and Currency selectors in Settings
- Update currency formatting to adhere to locale (legacy fallback to INR)
- Update date formatting to use localized strings
- Implement Multi-Currency Support in Dashboard and Analytics
- Expenses are grouped by currency, allowing correct aggregation without mixing currencies
- Added currency filter chips to Dashboard and Analytics screens when multiple currencies are present
- Updated specific charts (Total Spent, Daily Trend, Statistics) to reflect the selected currency
- Amount input in Add/Edit screens explicitly shows the active currency symbol
- Charts and statistics automatically default to the most relevant currency
- Dynamic Locale Loading: Only the active locale is bundled at startup (~60KB bundle size reduction), with other locales loaded on-demand when selected
-
History Tab Filters - Comprehensive filtering system with cross-tab synchronization
- Search Filter: Search across expense notes, categories, payment methods, and instrument nicknames
- Amount Range Filter: Filter expenses by minimum and maximum amounts
- Time Window Filter: Filter by 7d, 15d, 1m, 3m, 6m, 1y, or all time periods
- Category Filter: Multi-select expense categories
- Payment Method Filter: Multi-select payment methods (Cash, UPI, Cards, etc.)
- Payment Instrument Filter: Filter by saved cards/UPI IDs with nicknames
- Cross-Tab Sync: Filters applied in History automatically apply to Analytics and vice versa
- Shared Persistence: Filter state persisted across app restarts and shared between tabs
- FlashList Virtualization: Automatic virtualization for >100 expenses (better performance with large datasets)
- Optimized Filtering: Single-pass O(n) algorithm with O(1) Set lookups for instant results
- Debounced Search: 300ms debounce for responsive search without excessive re-filters
- Zod Validation: Schema validation with min ≤ max amount checking
- Major architecture improvements and code quality enhancements:
- Architecture Documentation
- Created comprehensive ARCHITECTURE.md documenting store patterns, hook decomposition, and performance optimizations
- Added mermaid diagrams for store relationships and data flow
- Documented when to use each store type (Filter, UI State, Settings)
- Added migration guide for transitioning from composite hooks to focused hooks
- Performance Optimizations
- Single-Pass Filtering: Replaced sequential filtering (O(n×m)) with optimized
applyAllFilters()(O(n)) in both history and analytics - Debounced Search: Added 300ms debounce to search queries in filter store to reduce re-renders while typing
- Eliminated Code Duplication: Removed duplicate
resolveInstrumentKeyForExpensefunction (~30 lines), now shared between filters and aggregations
- Single-Pass Filtering: Replaced sequential filtering (O(n×m)) with optimized
- Code Organization
- Extracted FilterSheet Component: Moved 280-line inline component from
history.tsxto dedicatedcomponents/history/FilterSheet.tsx - Type Consolidation: Centralized all analytics types in
types/analytics.ts(single source of truth) - Import Updates: Updated all imports to use consolidated type barrel exports
- Extracted FilterSheet Component: Moved 280-line inline component from
- State Management Refactoring
- Extracted UI state (section expansion states) into dedicated
ui-state-store.tsfor device-specific preferences - Added
createSettingUpdater()factory function to eliminate ~120 lines of repetitive boilerplate in settings store - Reduced settings store complexity while maintaining full functionality
- Extracted UI state (section expansion states) into dedicated
- Analytics System Refactoring
- Split
useAnalyticsDatahook (240 lines) into 3 focused hooks:useAnalyticsBase,useAnalyticsCharts,useAnalyticsStatistics - Split
analytics-calculations.ts(579 lines) into 5 domain-specific modules: time utilities, filters, currency grouping, aggregations, and statistics - Each module now has clear single responsibility and is independently testable
- Split
- Developer Experience Improvements
- Added barrel exports (
index.ts) tohooks/,services/, andutils/directories for cleaner imports - Consolidated duplicate
DateRangetype definitions into sharedtypes/analytics.ts - Created
test-utils/module with factory functions for creating mock expenses, categories, and settings - Improved code organization and maintainability
- Added barrel exports (
- Bug Fixes
- Fixed duplicate
selectedPaymentInstrumentsprop in analytics screen - Fixed keyboard type regression in history edit (reverted to
defaultto support expression input) - Fixed layer violation: moved
PaymentMethodSelectionKeyimport from components to utils - Fixed TypeScript errors in test files after adding new interfaces
- Fixed duplicate
- Persistence Improvements
- Added
selectedCurrencyto analytics filters persistence (now survives app restarts) - Removed duplicate i18n storage (now solely managed by settings store)
- Added
- Testing
- Added property-based tests for filter functions (
applyAllFilters,resolveInstrumentKeyForExpense) - Added property-based tests for currency utilities (
getFallbackCurrency,getCurrencySymbol,computeEffectiveCurrency) - Added property-based tests for analytics calculations (
groupExpensesByCurrency,getDateRangeForTimeWindow) - All tests passing, no breaking changes
- Full backward compatibility maintained
- Added property-based tests for filter functions (
- Architecture Documentation
- Fix local day grouping across the app
- Added a shared local day key helper in
date.tsand used it for grouping/filtering in history, day view, dashboard, analytics, and daily file logic - Updated property/unit tests to use the local day helper and added boundary checks for midnight/day transitions in date.test.ts and daily-file-manager.test.ts
- Aligned date generation in sync-related tests to avoid UTC day shifts.
- Added a shared local day key helper in
- Fix chevrons; add notifications
- Fixed chevron icons in various settings sections to correctly indicate expanded/collapsed state
- Added user notifications for added and edited expenses
- Add "Add another" button to expense form; persist analytics filter settings
- Added “Add another” button next to “Save Expense”; refactored save handler to support save+reset (stay) vs save+navigate; validation blocks both actions on errors
- New device-local AsyncStorage persistence for analytics filters (defaults + normalization)
097c998Thanks @sudokoi! - Settings UI and changelog improvements.- Changelog work: “What’s New” now pulls the installed version’s entry from CHANGELOG.md (no asset-download boilerplate) and safely skips showing if the changelog is missing/malformed or the version section isn’t found.
- Settings UI improvement:
- Default payment method section is now collapsible.
- Reorder theme configuration
- Added features and improvements:
- Analytics: move filters into a dedicated sheet with an explicit Apply action (improves UX and reduces accidental filter changes).
- Payments/Analytics: add Amazon Pay as a payment method and extend analytics time windows to 3 months / 6 months / 1 year.
-
#33
97fb0cdThanks @sudokoi! - BREAKING: Native GitHub sync setup now uses GitHub OAuth Device Flow ("Sign in with GitHub") instead of manually entering a Personal Access Token.- Android/iOS: sign in via GitHub, then pick a repository (personal repos only; requires write access)
- During sign-in, the app shows a device code with actions to copy the code and open the GitHub verification page in your browser
- Web: still uses manual Personal Access Token entry (unchanged)
If you previously configured sync on native using a PAT, you may need to sign in again and re-select your repo/branch.
- Show “What’s New” changelog after app updates
- Adds a one-time changelog Sheet that appears on first launch after updating, pulling release notes for the currently installed version from GitHub Releases.
- Skips showing the changelog when release notes are empty/whitespace, in dev mode, or when a newer update is already available (update CTA takes priority).
- Adds “View full release notes” action and persists the last-seen version locally so the changelog only shows once per version.
- Includes property-based tests for changelog gating logic.
- Refactored theme management and improved system UI readability
- Removed hardcoded UI color literals across the app by centralizing theme colors/tokens and adding a contrast helper so text/icons remain readable in light/dark mode; updated category fallbacks, shadows, and web background behavior; tests stayed green
- Improved system UI readability by making the StatusBar follow the app’s effective theme (so time/notification icons are visible in light mode); typecheck + full test suite pass
- #31
3726f95Thanks @sudokoi! - Add payment instrument management, analytics integration, and GitHub sync support.- Adds saved payment instruments (Credit/Debit cards + UPI) with nicknames and digit-masking support, including validation/utilities and startup migration that backfills instruments + links existing expenses while keeping expense CSV backward compatible.
- Updates expense entry/edit flows to select a saved instrument (or “Others” manual digits) via a new inline dropdown, plus a settings screen section to add/edit/remove instruments.
- Expands analytics to support full payment-method filter chips and dependent instrument chips, including instrument-level breakdown sections and tappable pie chart flows.
- Extends GitHub sync to optionally sync settings.json (when enabled), hydrate merged settings on sync-down, and include payment instruments in settings merges; auto-sync surfaces downloaded settings.
- Adds comprehensive non-UI test coverage for payment instrument merging, settings hydration, and migration/linking behavior; removes stray test output artifacts.
-
1991858Thanks @sudokoi! - Add in-app update notification system- Automatic update check on app launch (once per session, skipped in DEV mode)
- Non-intrusive update banner with version info, Update and Dismiss buttons
- Dismissal persistence across sessions via AsyncStorage
- Smart URL handling: Play Store for Play Store installs, GitHub releases otherwise
- Manual update check from settings bypasses dismissal
- useUpdateCheck hook for centralized update state management
Fix dashboard chart Y-axis label truncation for large expense values (e.g., 27000 → 27K)
- Add issue templates and Report an Issue button
- Add GitHub issue templates for bug reports and feature requests
- Add "Report an Issue" button in settings above "View on GitHub"
- Configure issue template chooser to guide users to appropriate forms
- refactor: modularize settings UI and enhance service layer
- Extract settings into reusable components (AppInfoSection, AutoSyncSection, GitHubConfigSection)
- Add error-utils service with classification and ServiceResult pattern
- Implement secure-storage service with encryption support
- Create store helpers with validation utilities
- Add comprehensive property-based testing for new services
- Update Tamagui 1.141.5 → 1.144.0 and Expo dependencies
- Consolidate component exports and improve import consistency
-
#25
f108750Thanks @sudokoi! - Add custom category management with full CRUD support- Create, edit, and delete custom expense categories with validation
- Color picker for customizing category appearance
- Reorder categories with up/down controls (Other stays fixed at bottom)
- Category sync support with conflict resolution via merge engine
- Automatic expense reassignment when deleting categories
- Dynamic icon rendering for custom category icons
Bug fixes:
- Fix category ordering in add/edit expense flows (Other always appears last)
- Improve EditExpenseModal with larger snap point (95%) and ScrollView
- Show category filter in analytics empty state for filter reset
- Centralize category sorting logic in useCategories hook
- Fixed settings sync bugs where settings weren't being synced despite showing pending count, sync count wasn't resetting when toggling settings back to original values, and sync count wasn't properly resetting after successful sync. Replaced boolean sync tracking with hash-based comparison to accurately detect actual changes.
-
Implement git-style sync with fetch-merge-push flow
This release introduces a safer synchronization mechanism that prevents accidental data loss when syncing expenses across devices.
Key changes:
- Merge-first sync: Always fetches remote data before pushing, similar to git's workflow
- Soft deletes: Deleted expenses are now marked with a
deletedAttimestamp instead of being removed, ensuring deletions sync correctly across devices - Timestamp-based conflict resolution: When the same expense is edited on multiple devices, the newer version wins automatically
- True conflict detection: Prompts user only when edits happen within the same time window
- Detailed sync feedback: Shows counts of added, updated, and auto-resolved items after sync
Breaking changes:
- Expenses now include an optional
deletedAtfield (backward compatible - existing data works without migration)
- #23
05efbcbThanks @sudokoi! - Refactored GitHub Sync Architecture with XState- Architecture: Replaced TanStack Query with a robust XState v5 state machine
sync-machine.tsfor better sync orchestration and error handling. - Performance: Eliminated unnecessary remote data downloads when already in sync.
- Bug Fixes:
- Fixed false "conflict" detection when creating new expenses.
- Resolved issue where identical remote files were reported as updates.
- UX: Added user-friendly error messages for specific network and authentication failures (e.g., "No internet connection", "Rate limit exceeded").
- Cleanup: Removed
@tanstack/react-querydependency and ~200 lines of dead code (autoSync,analyzeConflicts).
- Architecture: Replaced TanStack Query with a robust XState v5 state machine
- Refine GitHub Sync logic and UI:
- Detailed sync feedback, robust server-side timestamp handling, improved settings layout, and usability fixes for configuration.
-
#21
8fd359dThanks @sudokoi! - Add "Rent" expense category and refactor sync logic- Add "Rent" expense category with Building icon and soft olive green color
- Unify sync buttons into single intelligent "Sync" button with automatic push/pull detection
- Reorder categories by usage frequency (Food → Transport → Groceries → Rent → ...)
- Migrate sync state management from xstate to TanStack Query mutations
- Add
useSyncPush,useSyncPull,useSmartSync, anduseSyncStatushooks - Remove
sync-status-store.tsin favor of mutation-derived state
- fix(sync): improve 422 error handling and sanitize paths
- Refactor useEffect hooks and add "Other" payment method description
- Removed unnecessary useEffect hooks by moving state management to xstate stores
- Sync notifications now auto-route via store effects instead of component effects
- Default payment method and expanded section state now load from store initialization
- Settings screen reads sync config from store instead of loading via useEffect
- Added optional description field for "Other" payment method (e.g., "Venmo", "PayPal")
-
Notification system fixes and kawaii styling
- Fix xstate event type collision by renaming 'type' to 'notificationType'
- Move store initialization from module load to StoreProvider useEffect to prevent "window is not defined" error on native devices
- Remove Tamagui toast system, consolidate to NotificationStack
- Update NotificationStack with kawaii styling (rounded corners, colored shadows, icon backgrounds, dark text for contrast)
-
Dismiss keyboard before form validation to fix double-tap issue
- Add Keyboard.dismiss() to save handlers in settings, add expense, and edit expense flows to ensure button presses are captured on first tap when an input field is focused.
- Add payment method display, complete settings sync, Zod validation, and toast styling
- Display payment method identifiers on expense cards (e.g., "Credit Card (1234)")
- Add edit expense modal with payment method support
- Extend AppSettings to include auto-sync configuration (v3 migration)
- Add Zod validation for expense forms and GitHub configuration
- Add type-specific toast notification colors (success, error, warning, info)
- Include comprehensive property-based and unit tests
-
Fix sync notifications and improve analytics time window options
- Fix toast notification missing background in dark mode by replacing undefined
theme="accent"with explicit theme-aware styling - Fix sync button showing "1 record updated" when only settings changed by distinguishing between expense and settings changes in the label
- Fix settings sync not clearing the change flag after successful upload
- Fix sync down making duplicate network calls for settings
- Add "All" time window option in Analytics to view all downloaded expenses, not just last 7/15/30 days
- Improve sync button text to show descriptive labels like "2 expense(s) + settings changed" instead of generic "X record(s) changed"
- Settings label in sync button only appears when settings sync is enabled AND settings have actually changed
- Optimize sync handlers by removing redundant async/await calls
- Add
hasChangesToSyncmemoized value for more accurate sync button disabled state
- Fix toast notification missing background in dark mode by replacing undefined
-
Migrate to XState Store and improve rendering performance
- Replace React Context + useState with XState Store v3 for all application state
- Create 4 dedicated stores: expense-store, settings-store, notification-store, sync-status-store
- Add custom hooks (useExpenses, useSettings, useNotifications, useSyncStatus) for store access
- Delete old context files (ExpenseContext, SettingsContext, notification-context, sync-status-context)
- Remove all animations from UI components for improved performance
- Wrap ExpenseCard, CollapsibleSection, ScreenContainer with React.memo
- Create memoized list item components (ExpenseListItem, RecentExpenseItem, DayExpenseItem)
- Memoize event handlers with useCallback across all screens
- Memoize computed values with useMemo (totalExpenses, chartData, groupedExpenses)
- Extract static theme colors and layout styles outside components
- Fix auto-sync helper text spacing
- Set GitHub config accordion to collapsed by default
- Disable sync button when no pending changes
- Add 52 unit tests for all 4 stores
- Add 11 property-based tests validating store correctness
- Add fast-check dependency for property-based testing
9809010Thanks @sudokoi! - Optimize category and payment method selection responsiveness- Replace slow "bouncy" animations with "quick" across selection components
- Memoize CategoryCard and PaymentMethodCard to prevent unnecessary re-renders
- Add useCallback for selection handlers in add/edit flows
- Remove unnecessary animations from static display cards
f2cf2dbThanks @sudokoi! - Add payment method tracking with analytics pie chart, default payment method selection in settings, and improved expense categorization by payment type
- Add settings sync with GitHub and redesigned settings screen
- Redesigned settings screen with organized sections (Appearance, GitHub Sync, Auto-Sync, App Information)
- Added theme selector with Light, Dark, and System Default options
- Settings now sync to GitHub alongside expenses when enabled
- Added "Also sync settings" toggle to control settings sync behavior
- Settings changes reflected in sync button badge count
- Complete kawaii theme implementation with UI consistency improvements
- Apply kawaii theme colors across entire app (tab bar, settings, add screen, modal)
- Centralize theme colors in
constants/theme-colors.ts(semantic, financial, accent, chart, card colors) - Create single source of truth for category colors in
constants/category-colors.ts - Update statistics cards to use kawaii pastel colors
- Fix padding/margin inconsistencies across screens (standardize to 16px)
- Fix expense card spacing consistency between dashboard and history
- Add auto-shrink font for long category names in analytics cards
- UI standardization and improvements:
- Fixed TypeScript errors by using
bgprop instead ofbackgroundColorfor Tamagui components - Standardized safe area padding to
8 + insets.bottomfor cleaner spacing - Fixed edit transaction modal extending outside safe area with
maxHeight="80%" - Replaced category dropdown with compact category buttons in edit expense modal
- Made category cards more compact to fit all content without scrolling
- Fixed Expo Go compatibility by using dynamic import for react-native-device-info
- Removed large amount preview text from add expense screen
- Standardized action button sizes to
$4across all screens for consistency
- Fixed TypeScript errors by using
- Add alpha track submission to release workflows
- Submit production AAB to both internal and alpha tracks
- Add alpha submit profile to eas.json
- Add smart update checker with Play Store detection
- Check for Updates now detects install source: Play Store installs open the store page directly, sideloaded installs check GitHub releases
- Added Google Play Store badge and link to README
- CI workflows now auto-submit production builds to Play Store (with continue-on-error)
- Added react-native-device-info for install source detection
- Derive Android versionCode and iOS buildNumber from package.json version
- Replace static
app.jsonwith dynamicapp.config.js - Auto-calculate versionCode using formula:
MAJOR * 10000 + MINOR * 100 + PATCH - Single source of truth for versioning (package.json)
- Remove
sync-app-version.mjsscript (no longer needed) - Change
appVersionSourcefrom "remote" to "local" in eas.json
- Replace static
-
#13
9cf1641Thanks @sudokoi! - Add Analytics tab with expense insights and UI improvementsAnalytics Features:
- New Analytics tab with pie chart (category breakdown) and line chart (daily spending)
- Time window selector (7 days, 15 days, 1 month)
- Category filter for focused analysis
- Statistics cards showing total spent, daily average, top category, and peak day
- Collapsible chart sections
Navigation & UI:
- Icon-only tab bar with Analytics (PieChart) icon
- "View Analytics" link on dashboard chart section
- Green auto-sync toggle with improved dark mode contrast
a3b28e4Thanks @sudokoi! - Fix UI theming and safe area issues- Add themed header styling to day view screen for consistent app bar appearance in light/dark modes
- Fix safe area insets for bottom navigation to prevent content overlap on devices with home indicators
- Update ScreenContainer, Add Expense, and History screens to use dynamic safe area padding
- Fix day view transaction text readability in dark mode by using theme-aware colors
acebb96Thanks @sudokoi! - Resolve white background issue on Android native and improve text consistency- Fix background color not applying on Android by using
backgroundColorprop instead ofbackgroundshorthand in Add Expense and History screens - Add
contentStylewith theme background to root Stack.Screen for tabs navigation - Standardize empty state text opacity across screens for consistent light/dark mode visibility
- Update empty state message to reference "Add Expense tab" instead of "+ tab"
- Fix background color not applying on Android by using
6ff0a31Thanks @sudokoi! - UI Legibility and Theme Enhancements- Dynamic Theming: Fixed Add and History tabs to correctly switch backgrounds between light and dark modes.
- Improved Contrast: Replaced hardcoded grays with themed tokens and opacities for better subtext legibility across the app.
- Button Visibility: Fixed "Load More" and "Save" button visibility in light mode using theme inversion.
- Settings UI: Refined spacing for auto-sync descriptions and improved the visibility of app version information.
- Code Cleanup: Removed unused color constants and resolved Tamagui-related TypeScript linting errors.
-
c8a66ddThanks @sudokoi! - Add reusable UI components, fix theming issues, and remove type casts- Add reusable UI components (
AmountText,CategoryCard,CategoryIcon,ExpenseCard,ScreenContainer,SectionHeader) for consistent styling - Replace inline styles with Tamagui token-based styling across all screens
- Add
getColorValue()helper for type-safe theme color extraction - Fix white background issue in add expense screen
- Fix back button behavior to close dialogs instead of navigating away
- Remove all
as anytype casts for better type safety
- Bump Tamagui dependencies to latest versions
- Add reusable UI components (
-
- Add arithmetic expression support in expense entry (e.g.,
10+5*2) - Add expression parser utility with property-based tests
- Add ESLint 9 and Prettier for linting and formatting
- Add PR workflow for lint, format, and test
- Automate changelog and release flow with changesets action
- Add arithmetic expression support in expense entry (e.g.,
- Github sync now batches all file changes into a single commit instead of creating separate commits per file
- Added "Groceries" category with shopping cart icon to distinguish grocery shopping from dining expenses
- Implemented differential sync - only uploads changed files to GitHub, reducing API calls and improving sync performance
- Fixed dashboard graph not updating in real-time when expenses are added, edited, or deleted
- Sync button now shows accurate count of changed files instead of total expenses
- Added date picker to expense edit flow - you can now change the date when editing an expense
-
Inputs (especially the note field) were getting hidden behind the keyboard when focused.
Changes:
- Added
react-native-keyboard-controllerwithKeyboardProviderin app layout - Replaced ScrollView with
KeyboardAwareScrollViewin add expense and edit dialog screens
- Added
- rename package name
-
- Display transaction notes as primary text with category in subtext
- Add in-app update checker that fetches latest release from GitHub
- Show current version and download link when updates are available
- Expense tracking with categories
- CSV export functionality
- GitHub sync integration
- Monthly and category-based analytics
- Dark mode support