Release Notes
The story of BudgetBuddy, one commit at a time.
The official launch. Months of late-night debugging, three complete UI rewrites, and one very persistent localStorage bug later — BudgetBuddy is real. Privacy-first, local-first, and actually enjoyable to use.
✨ New Features
Deep Drill-Down Views
Click any category to see budget vs. actual spending, inline budget editing (just click the "Budgeted" row), quick emoji shortcuts for fast entry, and a full transaction history — all without leaving the screen.
3-Way Theme Engine
Light, Dark, or follow your OS. The toggle lives in the header and your preference persists across sessions. System preference changes are detected in real-time.
Income Breakdown Panel
A dedicated section that shows where your money comes from — each income source, its total, and its percentage of overall income. Updates instantly as you add transactions.
10 Quick-Add Categories
Housing, Food & Dining, Transportation, Entertainment, Subscriptions, Shopping, Health, Education, Savings, and Debt — all one tap away with preset icons.
🔒 Security & Auth
Supabase Authentication
Full email/password auth powered by Supabase. Sessions persist across tabs and browser restarts. Unauthorized users are redirected to the login page — no ghost sessions.
Password Recovery Flow
"Forgot Password?" link on the login page triggers a Supabase email with a secure reset link. Users land on a dedicated reset page to choose a new password. Minimum 6 characters enforced.
Clean Logout & Redirect
Logging out destroys the Supabase session server-side and redirects to login. No stale tokens, no "ghost" logged-in state if someone hits the back button.
🎨 UI/UX Polish
Avatar Dropdown Menu
Replaced the clunky "Log In / Sign Up" text links with a single, color-coded avatar circle. Click it to reveal your display name, email, profile editor, and logout — all in a smooth, animated dropdown.
Editable Display Name
Click "Profile" in the avatar dropdown to set a custom display name. Stored in Supabase user_metadata so it syncs across devices. Your avatar initial updates instantly.
Mobile-First Responsive Layout
The dashboard grid collapses cleanly on phones. Quick-add categories reflow to 3 columns. Transaction list is scrollable. Drill-down modal goes full-width. No horizontal scrolling — ever.
Rainbow Accent Bar
That thin gradient strip at the top of the page? It's a 4px tall status symbol. Purple → Green → Blue. Subtle, but it ties the whole design together.
⚡ Performance
Zero-Dependency Rendering
No React, no Vue, no virtual DOM. Pure vanilla JS with direct DOM manipulation. The result? Sub-50ms renders for hundreds of transactions. The app weighs in at a single HTML file.
Instant Local Persistence
Every transaction and category is saved to localStorage immediately. No "Save" button needed. No network delay. Your data is there even if you close the tab accidentally.
🔧 Precision Fixes
Fixed: Layout Shift on Browser Back Gesture
When navigating back from the login page using a trackpad swipe or Alt+Left, the browser would restore the page from bfcache with stale layout calculations — causing the entire UI to shift off-center. Fixed by adding a pageshow event listener that detects bfcache restoration and forces a full layout recalculation via display: none → reflow → display: ''. Also set scrollRestoration = 'manual' to prevent scroll position conflicts.
Fixed: Custom Categories Missing from Dropdown
The transaction form's category <select> only showed the 12 built-in options. Custom categories were being added to the array but never re-rendered into the dropdown. Fixed by calling updateCategoryDropdown() after every category creation and deletion, and preserving the previously selected value across re-renders.
Fixed: Duplicate Category Creation
Clicking a quick-add button twice would create two identical categories. Fixed by adding a case-insensitive duplicate check (name.toLowerCase()) before pushing to the array. Now shows a toast: "Category already exists!"
Fixed: Delete Category Left Orphan Transactions
Deleting a category removed it from the list but left its transactions floating in the ledger with no matching category. Fixed by filtering out transactions that belong to the deleted category before removing it. The confirmation dialog now tells you exactly how many transactions will be removed.
Fixed: Auth State Ignored on Dashboard Load
The login page set the Supabase session correctly, but the main dashboard had zero Supabase code — it never checked if you were actually logged in. The header always showed "Log In / Sign Up" regardless. Fixed by adding initSupabase() to the DOMContentLoaded handler, which calls sb.auth.getSession() and conditionally renders the avatar or sign-in link.
Fixed: Password Field Cleared on Failed Login
If you typoed your password, the login form cleared both the email and password fields — annoying if you have a long email. Fixed by only clearing the password field on error, keeping the email intact for a retry.
The final beta. Tested by real humans who actually budget. Their feedback shaped every feature in v1.0.
✨ Features
Income Overview Section
Added a visual breakdown of income sources below the main dashboard. Shows each source, its total, and percentage of overall income.
Skip Delete Confirmation
Added a "Don't remind me again" option on delete confirmations for power users who don't want the extra click every time.
🔧 Precision Fixes
Fixed: Date Formatting Inconsistency
Some dates showed as "5/31/2026" while others displayed "May 31". Standardized all dates to the friendlier "May 31" format using toLocaleDateString('en-US', {month:'short', day:'numeric'}).
Fixed: Negative Balance Display
When expenses exceeded income, the balance showed as "$-123.45" instead of "-$123.45". The dollar sign was on the wrong side of the minus. Rewrote formatMoney() to handle negative values correctly.