BillTracker/FUTURE.md

14 KiB

Bill Tracker — Future Improvements

This document tracks potential future enhancements for Bill Tracker.

Last Updated: 2026-05-11
Current Version: v0.24.3

How to Use This Document

This file is a living document. Agents should:

  1. Read this file before proposing changes
  2. Add new recommendations with priority levels
  3. Never add completed items — move those to HISTORY.md instead
  4. Reference this file when dispatching improvement tasks
  5. Only Ripley can remove items from this list. Notify Ripley if something neds to be removed.

Priority Format

All items must include the priority emoji in their heading, matching the section they belong to:

Priority Emoji Heading Format
CRITICAL 🔴 ### 🔴 Title — CRITICAL
HIGH 🟠 ### 🟠 Title — HIGH
MEDIUM 🟡 ### 🟡 Title — MEDIUM
LOW 🔵 ### 🔵 Title — LOW
NICE TO HAVE 💭 ### 💭 Title — NICE TO HAVE

Items are grouped under their priority section heading (## 🔴 CRITICAL, ## 🟠 HIGH, etc.) and sorted most-impactful-first within each tier.

Pending Recommendations

🔴 No Confirmation Before Destructive Actions — CRITICAL

Priority: CRITICAL
Added: 2026-05-11 by Ripley

Description: Deleting a bill or payment is one click with no confirmation dialog and no undo. For a financial app, accidental data loss destroys user trust.

Rationale:

  • Bills and payments represent real financial commitments and history
  • No "are you sure?" prompt before delete
  • No undo mechanism, no soft delete, no recovery
  • One misclick = gone forever — unacceptable for financial data
  • This is a trust and data integrity issue, not a UX nicety

Implementation Notes:

  • Add confirmation dialog to all delete actions (bills, payments, categories)
  • Consider soft delete (deleted_at column) with a grace period before permanent removal
  • Add undo toast after delete that allows restoration within a short window
  • Files to modify: BillModal.jsx, BillsTableInner.jsx, TrackerPage.jsx, CategoriesPage.jsx
  • Estimated effort: 3-4 hours

🟠 HIGH

🟠 No Search or Filter Across Bills — HIGH

Priority: HIGH
Added: 2026-05-11 by Ripley

Description: No way to find a bill by name, category, or amount. Users must scroll through the entire list to find anything. Every bill tracker on the market has instant search.

Rationale:

  • With dozens of bills, scrolling is slow and error-prone
  • No search bar on BillsPage, TrackerPage, or CalendarPage
  • Can't filter by category, amount range, autopay status, or billing cycle
  • Can't quickly find "where's that electric bill?" without visually scanning
  • Table stakes for any list-based app

Implementation Notes:

  • Add search input to BillsPage (filter by name, category, notes)
  • Add filter chips/dropdowns for category, billing cycle, autopay, active/inactive
  • Add search to TrackerPage (filter visible rows by bill name)
  • Consider a global Cmd+K / Ctrl+K command palette for instant bill lookup
  • Files to modify: BillsPage.jsx, TrackerPage.jsx, client/api.js
  • Estimated effort: 6-8 hours

🟠 No Visible Overdue Indicators — HIGH

Priority: HIGH
Added: 2026-05-11 by Ripley

Description: Overdue bills aren't visually flagged on the tracker. An unpaid past-due bill looks the same as one not due yet. The notify_overdue setting exists but there's no visual distinction in the UI.

Rationale:

  • The whole point of a bill tracker is to not miss payments
  • Overdue bills should be impossible to overlook — red highlight, badge count, sticky alert
  • Data model supports overdue notifications but tracker grid shows no overdue state
  • Users scanning the tracker won't notice a missed bill buried in the list

Implementation Notes:

  • Add overdue detection: if today > due date for current month and no payment logged, mark overdue
  • Red/amber background on overdue tracker rows
  • Overdue count badge in Sidebar next to Tracker nav link
  • Optional: overdue summary banner at top of TrackerPage
  • Files to modify: TrackerPage.jsx, Sidebar.jsx, routes/tracker.js (add overdue count to API response)
  • Estimated effort: 4-6 hours

🟠 Filtered Export for Reports — HIGH

Priority: HIGH
Added: 2026-05-11 by Ripley (upgraded from LOW)

Description: No way to export filtered data (e.g., "all bills in category X for last 6 months", "everything overdue in 2026"). Export dumps everything or nothing.

Rationale:

  • Exporting filtered reports is core functionality for a bill tracker, not a nice-to-have
  • Users need "all Q1 utility bills" or "overdue payments this year" for reconciliation and tax prep
  • /api/export/user-excel exports everything — no query params for date range, category, or status
  • This is how people actually use financial data outside the app

Implementation Notes:

  • Add query params to export endpoints: category_id, start, end, status (paid/unpaid/overdue)
  • Files to modify: routes/export.js, client/pages/DataPage.jsx
  • Estimated effort: 6 hours

🟡 MEDIUM

🟡 No Bill Template / Duplicate Bill — MEDIUM

Priority: MEDIUM
Added: 2026-05-11 by Ripley

Description: Creating a new bill means filling 10+ fields every time. No way to duplicate an existing bill or use a template. If you have 3 utilities from the same provider, you're retyping everything.

Rationale:

  • Bill creation has many fields (name, category, due day, amount, autopay, website, account, 2FA, notes)
  • Common pattern: similar bills from same provider or same category with slight variations
  • "Duplicate bill" is table stakes in every bill tracker
  • Reduces friction and errors during bill setup

Implementation Notes:

  • Add "Duplicate" button/action on each bill row and in BillModal
  • Pre-fill all fields from source bill, clear name and set "(Copy)" suffix
  • Files to modify: BillModal.jsx, BillsPage.jsx, routes/bills.js (POST endpoint can accept source_bill_id param)
  • Estimated effort: 3-4 hours

🟡 No Partial Payment Support — MEDIUM

Priority: MEDIUM
Added: 2026-05-11 by Ripley

Description: The UI only supports logging a single payment per bill per month. The payments table schema supports multiple entries per bill, but the frontend doesn't surface this. Split payments (half now, half later) can't be tracked.

Rationale:

  • Many bills get paid in installments (medical, tuition, large utilities)
  • Payment plan arrangements require tracking multiple payments against one bill
  • The data model already supports it — it's purely a frontend gap
  • Without this, users either over-record or under-record partial payments

Implementation Notes:

  • Show payment history per bill in tracker (expandable row or modal tab)
  • Allow "Add partial payment" with amount + date, summing to bill total
  • Display remaining balance on partially-paid bills
  • Files to modify: TrackerPage.jsx, routes/payments.js, possibly BillModal.jsx
  • Estimated effort: 6-8 hours

🟡 No Year-Over-Year Comparison in Analytics — MEDIUM

Priority: MEDIUM
Added: 2026-05-11 by Ripley

Description: Analytics shows monthly trends within a single year but there's no "this month vs same month last year" view. Users can't evaluate whether spending is improving.

Rationale:

  • The whole point of analytics is answering "am I doing better or worse?"
  • Within-year trends are useful but don't show long-term improvement
  • Comparing April 2026 to April 2025 is the natural question people ask
  • Available in every competing app (YNAB, Monarch, etc.)

Implementation Notes:

  • Add YoY comparison toggle or tab to AnalyticsPage
  • Query: same month range across current and previous year, diff the totals
  • Show percentage change and absolute change per category
  • Files to modify: AnalyticsPage.jsx, routes/analytics.js (add YoY endpoint or params)
  • Estimated effort: 6-8 hours

🟡 No Bulk Actions — MEDIUM

Priority: MEDIUM
Added: 2026-05-11 by Ripley

Description: Every action is one-at-a-time. Can't select multiple bills and mark them paid, skip them for a month, or change their category.

Rationale:

  • End-of-month reconciliation means marking many bills as paid in a row
  • Category reorganization affects multiple bills at once
  • Skipping seasonal bills for summer/winter requires individual clicks
  • Bulk actions are standard in any list-based management UI

Implementation Notes:

  • Add checkbox selection to BillsPage rows (with select-all toggle)
  • Bulk action toolbar: Mark Paid, Skip This Month, Change Category, Delete
  • Backend: batch endpoints or loop with progress indicator
  • Files to modify: BillsPage.jsx, BillsTableInner.jsx, routes/bills.js, routes/payments.js
  • Estimated effort: 8-10 hours

Architecture: Business Logic Mixed with Route Handlers

Priority: MEDIUM
Added: 2026-05-08 by Neo

Description: Many routes contain business logic that should be extracted to service layers.

Rationale:

  • bills.js contains parseDueDay(), parseInterestRate() — validation logic
  • tracker.js contains date/range calculations that are reused across routes
  • admin.js has complex OIDC config building mixed with routing
  • analytics.js has complex date-building logic (buildMonths, monthKey, etc.)

Implementation Notes:

  • Files to modify: Multiple route files + new service files in /services/
  • Estimated effort: 8 hours
  • Proposed structure:
    /services/billsService.js
    /services/trackerService.js
    /services/analyticsService.js
    /services/authService.js (existing)
    /services/oidcService.js (existing)
    /services/cleanupService.js (existing)
    
  • Route handlers should call services, not contain business logic

🔵 LOW

🔵 Payment Method Tracking and Summary — LOW

Priority: LOW
Added: 2026-05-11 by Ripley

Description: The payments table has a method column (free-text) but no way to see "how much did I pay via autopay vs manual vs credit card this month." No standardized method options, no summary.

Rationale:

  • Useful for reconciling credit card statements vs bank statements
  • Autopay vs manual tracking helps identify bills that should be switched to autopay
  • Payment method breakdown is a common analytics view in financial apps
  • Current method field is unvalidated free text — no consistency

Implementation Notes:

  • Standardize payment methods: enum or controlled list (autopay, bank_transfer, credit_card, check, cash, other)
  • Add payment method breakdown to analytics or summary page
  • Files to modify: routes/payments.js, AnalyticsPage.jsx or SummaryPage.jsx, schema migration for method validation
  • Estimated effort: 4-6 hours

🔵 No Keyboard Navigation or Shortcuts — LOW

Priority: LOW
Added: 2026-05-11 by Ripley

Description: Only a skip link exists for keyboard accessibility. No Cmd+K to find a bill, no Esc to close modals, no arrow keys to navigate the tracker grid. Power users and accessibility need keyboard support.

Rationale:

  • Keyboard accessibility is required for WCAG compliance
  • Power users navigate faster with keyboard shortcuts
  • Modal dismiss on Esc is expected behavior in any modern app
  • Command palette (Cmd+K) pairs with the search feature (also missing)

Implementation Notes:

  • Esc closes any open modal/dialog
  • Cmd+K / Ctrl+K opens search/command palette
  • Arrow keys navigate tracker rows when grid is focused
  • Tab order follows logical flow, not DOM order
  • Files to modify: App.jsx, BillModal.jsx, TrackerPage.jsx, all dialog components
  • Estimated effort: 6-8 hours

Add comprehensive unit and integration tests

Priority: LOW
Added: 2026-05-08 by Scarlett

Description: Currently no unit tests exist for components or hooks. The only testing appears to be functional tests in test-functional.js. Component-level testing is missing.

Rationale: Code quality and maintainability. Unit tests catch regressions and document component behavior. Bill Tracker has complex business logic (bill calculations, monthly state, analytics) that should be tested.

Implementation Notes:

  • Set up Jest + React Testing Library
  • Test key components: BillModal, TrackerPage row, BillsTableInner
  • Test hooks: useAuth, custom form hooks
  • Test utility functions in client/lib/utils.js
  • Consider vitest for faster test execution
  • Add CI integration for test execution
  • Files likely to be modified: Add client/test/ directory, add jest.config.cjs
  • Estimated effort: 8-12 hours for baseline coverage

Features: Missing Bill Grouping and Reorganization API

Priority: LOW
Added: 2026-05-08 by Neo

Description: No way to reorder bills, drag-and-drop, or group by custom criteria.

Rationale:

  • bills table has due_day ordering but no manual sort order
  • Frontend likely orders by due_day only
  • Users cannot create bill groups or categories for bills
  • No way to mark bills as "hidden" or "archived" without deactivating

Implementation Notes:

  • Files to modify: /home/kaspa/.openclaw/Projects/bill-tracker/db/schema.sql, /routes/bills.js
  • Estimated effort: 6 hours
  • Add:
    • sort_order column to bills table (default NULL, ordered first by sort_order then due_day)
    • PUT /api/bills/reorder endpoint accepting {bill_id: new_index}
    • PUT /api/bills/:id/archived to soft-dearchive (sets archived flag)

💭 NICE TO HAVE

Add consistent form state management pattern

Priority: MEH
Added: 2026-05-08 by Scarlett

Description: Form state management is inconsistent across components. Some use useState for each field, others use form libraries. Validation patterns vary.

Rationale: Consistency and maintainability. A consistent pattern makes it easier to add new forms and reduce bugs.

Implementation Notes:

  • Consider react-hook-form for complex forms
  • Create reusable form field components (InputField, SelectField, etc.)
  • Standardize validation approach
  • Files likely to be modified: client/components/*.jsx
  • Estimated effort: 4-6 hours for migration