Dashboard
The OneLibro dashboard provides a comprehensive overview of your financial health at a glance. View your total balance, track monthly spending, monitor recent transactions, and visualize spending trends—all in one beautifully designed interface.
Overview
The dashboard is the central hub of OneLibro, displaying:
- Total balance across all connected accounts
- Monthly spending (last 30 days)
- Number of connected accounts
- Spending chart visualizing daily expenses over 30 days
- Recent transactions (last 10 transactions)
- Quick actions to connect banks or view all transactions
The dashboard automatically refreshes data using SWR (stale-while-revalidate) for real-time updates without manual reloading.
Accessing the Dashboard
Navigation
- Log in to OneLibro
- Dashboard is the default landing page after login
- Or click "Dashboard" in the main navigation
URL
/finance/dashboard
Dashboard Layout
The dashboard consists of several key sections:
1. Stats Cards (Top Row)
Three key metrics displayed as cards:
- Total Balance
- Monthly Spending
- Connected Accounts
2. Spending Chart (Middle Section)
Line/bar chart showing daily spending over the last 30 days
3. Recent Transactions (Bottom Section)
Table/list of most recent 10 transactions with "View All" link
Stats Cards
Total Balance Card
What It Shows:
- Sum of current balances across all connected accounts
- Includes checking, savings, credit, and other account types
Card Details:
- Icon: Dollar sign ($) in green circle
- Label: "Total Balance" (small text, uppercase)
- Amount: Large, bold display (e.g., "$12,543.67")
- Subtitle: "Across all accounts" with trending-up icon
Calculation:
const totalBalance = accounts.reduce((sum, account) => {
return sum + (account.current_balance || 0);
}, 0);
Example:
- Checking: $3,500.00
- Savings: $10,000.00
- Credit Card: -$450.00 (debt shown as negative)
- Total: $13,050.00
Credit card balances are negative (debt). They reduce your total balance. If you owe $500 on a credit card, it shows as -$500.
Monthly Spending Card
What It Shows:
- Total expenses in the last 30 days
- Only counts expenses (positive amounts), not income
Card Details:
- Icon: Trending down arrow in green circle
- Label: "Monthly Spending" (small text, uppercase)
- Amount: Large, bold display (e.g., "$2,456.18")
- Subtitle: "Last 30 days" with trending-down icon
Calculation:
const monthlySpending = transactions
.filter((tx) => {
const txDate = new Date(tx.transaction_date);
const thirtyDaysAgo = new Date();
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
return txDate >= thirtyDaysAgo && tx.amount > 0; // Positive = expense
})
.reduce((sum, tx) => sum + tx.amount, 0);
Use Cases:
- Compare to monthly budget
- Track spending trends month-to-month
- Identify high-spending months
- Plan future budgets
Connected Accounts Card
What It Shows:
- Number of bank accounts connected via Plaid
- Total count across all institutions
Card Details:
- Icon: Building (bank) in green circle
- Label: "Connected Accounts" (small text, uppercase)
- Count: Large number display (e.g., "5")
- Subtitle: "N banks linked" (singular "bank" if 1 account)
Example:
- 2 checking accounts
- 1 savings account
- 2 credit cards
- Total: 5 accounts
Quick Action:
- Click anywhere on card → Navigate to Accounts page
Spending Chart
Overview
The spending chart visualizes your daily spending over the last 30 days as a line or bar chart.
Chart Details:
- Title: "Spending Over Time (Last 30 Days)"
- X-Axis: Dates (e.g., "Jan 15", "Jan 16")
- Y-Axis: Amount spent (currency formatted)
- Data Points: 30 days of spending
- Chart Type: Bar chart (using Recharts library)
- Color: Green bars matching OneLibro theme
Chart Data Generation
How Data is Calculated:
- Generate 30 date buckets (one per day)
- For each day, sum all expense transactions
- Plot amount spent on Y-axis, date on X-axis
Code Example:
const chartData = [];
for (let i = 29; i >= 0; i--) {
const date = new Date();
date.setDate(date.getDate() - i);
const dateStr = date.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
});
// Calculate spending for this day
const daySpending = transactions
.filter((tx) => {
const txDate = new Date(tx.transaction_date);
return (
txDate.toDateString() === date.toDateString() &&
tx.amount > 0 // Expenses only
);
})
.reduce((sum, tx) => sum + tx.amount, 0);
chartData.push({
date: dateStr,
amount: daySpending,
});
}
Chart Insights
Spending Patterns:
- Spike days: Large expenses (e.g., rent, car payment)
- Flat periods: Days with no spending
- Consistent spending: Daily expenses (groceries, gas, food)
- Weekend patterns: Higher spending on Saturdays/Sundays
Use Cases:
- Identify spending spikes
- Spot unusual spending days
- Compare weekly spending patterns
- Track progress toward budget goals
Chart Interactivity
Features:
- Hover over bars to see exact amount
- Tooltip shows date and amount
- Responsive design adjusts for mobile
- Auto-scales Y-axis based on spending range
Mobile View:
- Scrollable chart on small screens
- Touch-friendly tooltips
- Simplified axis labels
Recent Transactions
Overview
The Recent Transactions widget displays the 10 most recent transactions for quick visibility.
Widget Details:
- Title: "Recent Transactions"
- Transaction Count: Up to 10 most recent
- Sort Order: Newest first (by transaction date)
- View: Table on desktop, cards on mobile
Transaction Display
Desktop (Table View):
| Date | Merchant | Category | Amount | Status |
|---|---|---|---|---|
| Jan 20 | Starbucks | Food & Drink | -$5.47 | Posted |
| Jan 19 | Amazon | Shopping | -$32.15 | Pending |
Mobile (Card View):
- Merchant name (bold)
- Date and category
- Amount (large, color-coded)
- Status badge
Transaction Details
Each Transaction Shows:
- Date: Formatted as "MMM DD" (e.g., "Jan 20")
- Merchant: Business name
- Category: Transaction category badge
- Amount: Color-coded (red for expenses, green for income)
- Status: Pending (yellow) or Posted (green)
Color Coding:
- Red amount: Expense (money spent)
- Green amount: Income (money received)
- Yellow badge: Pending transaction
- Green badge: Posted transaction
View All Transactions
Call-to-Action:
- "View All" link at bottom of widget
- Arrow icon indicating navigation
- Clicking navigates to
/finance/transactionspage
Empty State (New Users)
When Displayed
The empty state appears when:
- User has no connected bank accounts
- First time visiting dashboard after signup
Empty State Content
Display:
- Large bank building icon (green)
- Heading: "Welcome to OneLibro!"
- Message: "Connect your bank account to start tracking your finances. Your data is secure and encrypted end-to-end."
- Large "Connect Your First Bank Account" button
Button Action:
- Clicking opens Plaid Link modal
- After successful connection, dashboard loads with data
Loading State
Loading Skeleton
While data is being fetched, the dashboard shows loading skeletons:
Skeleton Elements:
- 3 stat card skeletons (animated pulse)
- Spending chart skeleton
- Recent transactions skeleton
Loading Duration:
- Typically 1-2 seconds on first load
- Instant on subsequent visits (thanks to SWR caching)
Skeleton Animation:
- Pulsing gray rectangles
- Matches layout of actual cards
- Smooth transition when data loads
Error State
When Errors Occur
Errors are displayed if:
- Network connection fails
- API returns error
- Authentication expires
- Database query fails
Error Display
Error Banner:
- Red background with alert icon
- Heading: "Error Loading Dashboard"
- Message: "Failed to load dashboard data. Please try again."
- "Retry" button to reload data
Error Handling:
- Banner appears at top of page
- Existing data (if any) remains visible
- Click "Retry" to attempt reload
- If error persists, user should check connection or contact support
Data Refresh
Automatic Refresh (SWR)
OneLibro uses SWR (stale-while-revalidate) for smart data fetching:
How It Works:
- Show cached data immediately (stale)
- Fetch fresh data in background (revalidate)
- Update UI when fresh data arrives
Benefits:
- Instant page loads
- Always up-to-date data
- Automatic error recovery
- Background updates without user action
Manual Refresh
Refresh Triggers:
- Connecting a new bank account
- Syncing transactions from Accounts page
- Navigating back to dashboard
- Browser tab regains focus
How to Manually Refresh:
- Navigate away from dashboard and back
- Or hard refresh browser (Ctrl+R / Cmd+R)
- Or sync transactions from Accounts page
Responsive Design
Desktop (1024px+)
- Stats Cards: 3-column grid, side-by-side
- Chart: Full width, tall height
- Transactions: Table view with all columns visible
- Spacing: Generous padding and gaps
Tablet (768px - 1024px)
- Stats Cards: 3-column grid, slightly compressed
- Chart: Full width, medium height
- Transactions: Table view or hybrid card/table
- Spacing: Moderate padding
Mobile (<768px)
- Stats Cards: Single column stack
- Chart: Scrollable if too wide
- Transactions: Card view, full width
- Spacing: Compact for scrolling
Performance Considerations
Optimizations
Memoization:
- Total balance calculation memoized
- Monthly spending calculation memoized
- Chart data generation memoized
- Prevents unnecessary re-calculations
Code Example:
const totalBalance = useMemo(() => {
return accounts.reduce((sum, account) => {
return sum + (account.current_balance || 0);
}, 0);
}, [accounts]); // Only recalculates when accounts change
SWR Caching:
- Data fetched once and cached
- Subsequent visits load instantly from cache
- Background revalidation ensures freshness
Large Dataset Handling
Transaction Limit:
- Dashboard fetches last 50 transactions
- Only displays 10 in widget
- Full list available on Transactions page
Chart Performance:
- 30 data points max (one per day)
- Lightweight Recharts library
- Renders smoothly even on slow devices
Use Cases
Daily Quick Check (2 minutes)
- Open dashboard
- Check total balance
- Scan recent transactions for unusual activity
- Verify monthly spending is on track
Frequency: Every morning or evening
Weekly Financial Review (10 minutes)
- Review spending chart for the week
- Identify high-spending days
- Check if on track for monthly budget
- Plan adjustments for next week
Frequency: Sunday evening
Monthly Budget Analysis (30 minutes)
- Review monthly spending total
- Compare to budget goals
- Analyze spending chart for trends
- Export transactions for detailed analysis
Frequency: Last day of each month
Account Health Monitor
- Check total balance trend (increasing/decreasing?)
- Review connected accounts count
- Ensure all accounts are synced
- Verify no unauthorized transactions
Frequency: Weekly or as needed
API and Data Flow
Data Sources
Dashboard Data:
- Accounts: Fetched from
getUserAccounts(userId) - Transactions: Fetched from
getUserTransactions(userId, options)
Query Parameters:
// Accounts: All accounts for user
const accounts = await getUserAccounts(userId);
// Transactions: Last 30 days, limit 50
const transactions = await getUserTransactions(userId, {
startDate: thirtyDaysAgo,
limit: 50,
});
SWR Configuration
Hooks Used:
useAccounts(userId)- Fetches and caches accountsuseTransactions(userId, options)- Fetches and caches transactions
SWR Features:
- Automatic revalidation on focus
- Automatic retry on error
- Deduplicate requests
- Optimistic updates
Customization (Future)
Potential dashboard customizations in future versions:
Widget Preferences:
- Show/hide specific cards
- Reorder dashboard sections
- Choose chart type (line, bar, area)
- Set custom date ranges
Theme Options:
- Light/dark mode toggle
- Custom color schemes
- Compact vs spacious layout
Data Filters:
- Filter by account type
- Filter by category
- Custom date ranges for charts
Troubleshooting
Dashboard Not Loading
Possible Causes:
- No internet connection
- Authentication expired
- API server down
- Browser cache issue
Solutions:
- Check internet connection
- Log out and log back in
- Hard refresh browser (Ctrl+Shift+R)
- Clear browser cache
- Try different browser
Stats Cards Show $0.00
Possible Causes:
- No accounts connected yet
- All account balances are actually zero
- Accounts not synced
- Recent bank connection still processing
Solutions:
- Connect a bank account if none connected
- Wait 1-2 minutes after connecting for initial sync
- Go to Accounts page and manually sync
- Refresh dashboard
Spending Chart is Empty
Possible Causes:
- No transactions in last 30 days
- Transactions haven't synced yet
- Only income transactions (no expenses)
Solutions:
- Wait for transactions to sync (can take 5-10 minutes after connecting)
- Manually sync from Accounts page
- Add manual transactions if needed
- Check Transactions page to verify data exists
Recent Transactions Shows "No transactions"
Possible Causes:
- Account just connected, initial sync in progress
- No transactions in database
- Transactions failed to sync
Solutions:
- Wait 5-10 minutes for initial sync
- Manually sync accounts
- Check Accounts page for sync errors
- Add manual transactions to test
Related Features
- Accounts - Connect and manage bank accounts
- Transactions - View full transaction history
- Budgets - Track spending goals
- Budget Alerts - Get notified of budget status
Best Practices
Dashboard Habits
Morning Routine (1 minute):
- Check total balance
- Scan recent transactions
- Identify any unusual activity
End of Day (2 minutes):
- Review day's spending in chart
- Verify pending transactions cleared
- Plan tomorrow's expenses
Weekly Review (10 minutes):
- Analyze spending chart trends
- Compare to budget goals
- Identify areas to cut spending
- Plan week ahead
Using Chart Insights
Identify Patterns:
- High spending days: Usually rent/bills
- Flat days: Weekdays with packed lunch
- Weekend spikes: Dining out, shopping
Take Action:
- If spending trending up, review budgets
- If spike days, verify large purchases
- If consistent overspending, adjust budgets
Transaction Monitoring
Red Flags to Watch For:
- Unfamiliar merchant names
- Duplicate charges
- Higher-than-expected amounts
- Transactions in wrong locations
Quick Actions:
- Click "View All" to investigate
- Search merchant name in Transactions page
- Contact bank if suspicious
- Dispute unauthorized charges
Summary
The OneLibro dashboard provides:
- ✅ Real-time financial overview
- ✅ Total balance across all accounts
- ✅ Monthly spending tracking (30 days)
- ✅ Visual spending chart
- ✅ Recent transactions widget
- ✅ SWR-powered automatic updates
- ✅ Responsive design (desktop, tablet, mobile)
- ✅ Loading and error states
- ✅ Empty state for new users
The dashboard is designed for daily use—open it each morning to stay on top of your finances and make informed spending decisions throughout the day!