What's new in Spendly
Follow Spendly's evolution through new features, improvements and the regular fixes that make this app better for everyone
migrate to Vuetify 4
add a dedicated Changelog page
disable turnstile on login, bump deps, change dev port to be different from EDM115/website
build changes
don't allow multiple form submissions
too lazy to add proper idempotency tho
bump all deps (vite 8.1 will wait for next nuxt due to server.hmr issue), allow both decimal separators in amount field, backport changes like png favicon to avoid issues on firefox
perf & safety improvements
- lazy-load charts & categories tabs, force spending table as first loaded - guard stale responses with request ID checking - fetch spendings with date window instead of retreiving the full history - cache number & date format operations - don't render all 4 charts at once - add a finally to re-enable buttons when a chart export have failed - compute lowercase chars only once when searching spendings - less brittle icon validity check + debounced search - stricter date search in spending api to match frontend one - no select all in category api
better account page layout, bump deps
bump to vite 8 after verifying it doesn't cause any issue
allow to install as PWA even after the user dismissed, through the account page
- also scroll into view the years selector - more resolved alert colors - removed pwa bullshit from store and add missing type
retain selected date period
- fix month selection by scrolling year into view - allow alerts to not be closable - better lint/format configs - disable sourcemaps - bump deps (can't use vite 8 due to PWA issues ??) - specify that we use Vuetify 3 while the other branch is getting ready - better font settings, woff2, pre-optimize deps - use jiti only - dedupe lockfile peers - remove outdated command - refresh vs code settings - refresh ai guidance
bump deps, fixed the type issue with tm, better-auth i18n, lock vuetify to 3 while issues are still present (no styles applied)
small QoL
- avoid buttons that span on more than 2 lines to have the text go out of bounds - better display of the share menu on mobile - align link/unlink oauth button on right on mobile - fixed a casing issue for consistency - don't log i18n requests - better export buttons & requests count
missing validation i18n, add budget tracker owner in the export metadata, space out a bit the table sort icons, refactor to functions, rework imports
admin edit user, better username check
QoL, allow to search for categories when adding a transaction & search for a budget tracker, reposition the chips properly
add missing text from b46a98a
bump deps reduce context loaded in docker builder
user doc
allow lower-bound limit in spendings balance
stack the budget chips on mobile to leave more space for the name
bogus condition check
allow to disable features
- can disable emails, logs, magic-link, oauth (google/github) & turnstile - added documentation on how all that works and how to get api keys for everything - unified helper to get the disabled features info - prevent users when a feature is not available - prefix email templates - remove unused env var
reintroduce i18n title change
revert 9c1143c for 2 pages as it broke
simplify i18n
QoL
- add a chip for who owns the budget, pad to right, rework shared colors, sort users better - remove clearable prop from budget selector - rework styling in some places - admins user count, properly sort users, add user display onn mobile - better sorting everywhere - don't cache js/css/json in the pwa - text is properly overriten from Roboto
fix navigate to home on non-canonical urls
bump deps (fixes Vuetify quirks), disable non-local font providers, remove drizzle eslint plugin, simplify vs code files, fixes lint issues
?: try to fix PWA caching issue
show an install prompt for the PWA because ie. Chrome mobile doesn't show it on its own for some reason
PWA support
- install Spendly as an "app" - didn't implemented Offline functionnality because i'm not crazy - had to disable Vite Env API for PWA to work for some reason - start the built server on 8888 too - revert a change on last used login method that caused forms to misbehave on oauth error
ready
- enhanced and more detailed landing page (hello google oauth validators) - Nunito finally applies on all titles - apply the gradient-text effect to all occurences of Spendly in the home page, and the navbar - email alert api added - added a back to login button on the password reset page - bump deps
keep the export/dl menu open to show the loading state
turnstile and spendings search take less width on mobile
deps
- finally send emails on all actions that require it - properly log the last remaining requests - properly ban the user on account deletion request - don't display wrong messages, properly disconnect the user after account deletion request - compress the exported PDFs to overcome their abysmal size - make the last used provider success color on oauth btn link - user budget export folder have its actual name now - fixed missing tabindex - check for username availability in admin too - don't allow illegal usernames
check for updates every hour and easier refresh
allow admins to reject a request, add confirmations
container name
user requests
- users request to export data or delete their accounts is stored in db, visible admin side and actionnable - fixed an issue with the category color not initializing properly - fixed wrong props type - centralize user exports in an util
wide events and logs explorer
- add app-wide logger to properly understand what's happening - use wide-events to have better clues (cf. loggingsucks.com) - validate the logs against a schema - created an entire freaking CLI & TUI for interpretation of logs, filtering, vizualization and more - new (entirely optional) env vars to help with logging - make all buttons with links preload with NuxtLink - don't allow password-show & turnstile to be tab-focused - enhance agent work on long-lasting tasks - avoid agents loading the demo in context
better deployment, docker compose and automated migrations/seeding on server startup
perf improvements
add AI guidance, bump deps, remove demo user checks in API as it's no longer a real logged-in user
transfer ownership of budget trackers
- should be flawless with no sync issues whatsoever (took so long) - also we can't do async transactions ? for some odd reason - add a confirmation before deleting a shared user - sort budget trackers by name
casing issue from a replace_all
admin section
- list existing users (limited to 200 for now, we'll never reach that anyway lol. if we do, rework with a search and pagination) - allow to edit users, create new ones - impersonation implemented, force page reload to refresh session - export user data (complete zip), send email modal todo - delete user (requests todo) - don't prefetch admin data in the page. the guard is probably redundant from the middleware but it doesn't hurt
rename Error to LayoutAlert, also update the name on username change, fix wording
make the budget selection foldable to free space on mobile and avoid misclicks
working account page
- ability to change username/email/password, link/unlink oauth, request data export and account deletion (TODO, as well as ownership transfer), add donate links. no need for turnstile here since the user is already logged in - enable users to change their emails & implement email verification (required for email change) without forced verification - add missing data in store - add current page indicator in the menu and a link to the app - keep the loading state for oauth for example as they do a full reload - clamp properly button's content on mobile - display a proper reset password text when coming back from the email - revert the manual imports introduced in cd3b8b8 to work around a Nuxt issue (nuxt/nuxt#34140) - properly reset the category color to the theme's one - show the footer on the account page - remove unused stuff from vs code & eslint config
reset password
- new page to reset the password, works in 2 steps, send email then change the pass, handle errors - allow the Error to be success (lol) - exports have the budget tracker name as a prefix - add a notice for magic links - the github icon at the bottom isn't as far from the rest of the footer - proper page titles - log the email requests for now - properly save username and magic link for last used method
missing await, remove superfluous imports, named import and move the auth context type extension to shared to be consumed by both back & front without duplication
use exported t and move legal keys in their page to not pollute the i18n files
tidy up the better-auth migration
- proper middlewares (app & server) to check for auth, proper use of the session system (~ish ? have to double check the store and those) - move the auth/user out of the store and only get reactive getters around data - proper menu in the navbar, houses theme/lang switch, connect/disconnect, account management and admin panel. might also show the impersonation notice in the future - properly reflect changes in the theme composable - move the footer to the layout, except in app/demo, admin and account (might change that one later), include ToS & PP in there - make sure the rounding of all buttons is consistent - all modals are glassy - gradients don't get cut - move rounded to props when possible - better landing cta button, remove the github one and join section - remove the Email OTP (for now, i feel like we have enough login methods) - fix the last used login method not appearing - turnstile will try to match the UI lang/theme - properly reset the turnstile token on form failure + don't override existing error messages - proper modal titles - fixed the glow button usage - prefix the seed script, ensure seeded users are verified (even though we never check for that) - ! hotpatch the settings types while the route is nonexistent - todo : change title per page except in app, do the acc page
move to Better Auth
- email/password - username - admin (role, impersonate) - email otp & magic link (tbd) - last login method - google - github - captcha (turnstile) - allow oauth emails to be different than primary email - relax username/password limits - enhanced seed db script - drop the api middleware - resend for emails (tbd) - drop the dep on bcryptjs, jsonwebtoken, add resend and vue-cloudflare-turnstile, move out of drizzle beta for now and add imports aliases for proper execution of the seed script - readme .env revamp, add all new required vars - lowercase table names for consistency - better login component - username/password(/magic link ? if you can find it lol) - google/github oauth - cloudflare turnstile with warnings and errors handling - proper form validation - last used method - signup component ! - email/username - no oauth, yes i could link it to another account later but i'm lazy - existing username check - allow the error component to display warnings too - removed Bearer Auth on api requests **for now**, until i figured out sessions management. the admin/user route will also come back later - don't load dotenv for drizzle as drizzle-kit auto-loads them - proper app name loading from i18n - fully localized privacy policy and terms of use (had to bcz google oauth) - move some features out of the store - db export have date in the filename - dedicated error page for better-auth (skill) issues - make ssrSafe finite - tweak types, store.user is still to be determined (especially for the demo) - still todo : move navbar items to menu, user settings page (username/email/password change, link/unlink social), link legal pages on the footer, password reset, implement emails (including magic link), admin page revamp (add/edit/delete user, impersonate, export user data (and send to email ?)), budget name in exports, change the rocketship text, remove the email from "ready to join" section
move to Drizzle ORM
- no longer manipulate queries blindly with raw better-sqlite3 - proper type checking - actually extends the actual tools - still allows for SQLite to be used ! - created a proper schema to reference and db instance to use - store the demo in-app so no db clutter and added i18n ! also reduce api load and simplify the seed script - gate the app path to non-demo users - flip the BudgetTrackerRole type to not have null in order to avoid having "Exclude" everywhere - fix the role type of User and Store user which was totally wrong lol, properly type Spending.is_spending as boolean thanks to Drizzle - added drizzle eslint rules
mobile friendlyness part 1
- show a virtual list of cards instead of a virtual table, inspired by banking apps and separated by date elements - smaller scrollbars - disable buttons instead of hiding them - proper text when there's no category/no icon selected - don't display charts when there's no data - enlarge the search field on mobile - remove the welcome message - color tint the bottom navbar
deps & format (oxfmt-ish)
add more opentags
new OG image and better description
show the category buttons but disabled in view-only
allow to tweak the total balance to include past and future records, ensure minimum space next to switches
better charts exports
- export at higher quality (x6 pixels on rasterized content), create a proper SVG as a base instead of having PNG as a base - export always in light theme for compatibility - fix a shit ton of bugs related to export that i don't wanna remember. yes there's some errors in the console. does it still export just fine ? yeah. so don't care + didn't asked - filenames include the timerange - add the 3rd part of the cashflow in the legend - always show the cashflow legend at the bottom - remove unnecessary type casts - add a loading indicator while the file is generated - stream the parallel commands outputs to not collapse them
better charts
- only display the options relevant to the visible chart - better color choice - separate X & Y axis display - better date display to avoid crammed YYYY-MM-DD - show the balance last so it is above the other areas
meta import blowing up as a promise
use dynamic imports for the huge mdi metadata
built-in icon search
- search icons with their name, aliases and categories - properly switch the default category color on theme change - hide buttons when there's no data - hide simplifiers when already in simplified mode - properly tie points in simplified mode - fix the search on mobile - fix (again) the table when no data - closer to real-app skeleton loaders - don't autocomplete any field apart from username and password - document the env var changes
demo profile
- complete demo with no rights, but read access to a complete 150 transactions view - strenghten the api against wrong privileges (expose the username in the context) - disable buttons instead of hiding them - ability to disable points in the area graph for cleaner look - show also income category repartition and disable either - restyle category pies for mobile readability and avoid cropping - also search for categories in the table + clear it, center and limit width - disabled fractions ligatures for readability - seed command auto-sets the env var
move types to shared folder (autoimport) + use new proper server import alias, bump deps, remove chart function call, force imports in composables and store since nuxt just no longer recognize them (?) and force an api type (??), use non-deprecated createError params
mobile view enhancements
- overall looks better, more spaced buttons, less unused space - bottom navbar on mobile to cleanup the space - charts get a simplified mode, ability to manually disable title, legend, axes and grid, and the 3 individual areas - fix some edits not propagating through the app - fix the date getting ellipsis - fix the color picker getting squished on mobile - hide the scrollbar junction - removed the draft assets again
node 25 image no longer includes corepack nor yarn, display the no spendings message without scroll
no longer requires users to use the mdi prefix for icons, use the primary color by default, cleanup unused classes, format pass
redesign (yes, again)
- commit more to a glass style - properly use the alt logo in light theme + tweak a bit more its colors to match that - globally refine colors, padding and more - error component transitions - admin settings are much cleaner - categories get a cleaner icon look - charts should be more readable - better export buttons (tonal and colored) - gradient-based summary cards - non-100% width navbar - more impactful tagline, better scroll incentive - simplify the login page - finally tidy up the type safety of DB queries, remove a lot of oxlint disable - use node 25 - swap the logos with better bg-removed ones, smaller as a bonus
switch to a virtual table, add a search field, more rounded, label chips for categories, no more small text in table, default sort, fixed the divider gradient on mobile, better display of categories (more when space is available horizontally) + outlined color from the icon
make categories limited to budget trackers to not share them to other accounts
rework the landing and login pages
- more interesting landing, more playful - actually okay layout on login with loading indicator - added color variations - i18n cleanup
sort JSON i18n
better date range selectors
- use a select in mobile view & simplify the button creation - more consistent date range + buttons row between pages - space out the date range from buttons on mobile - show arrows on mobile when not enough space is available for the tabs - more readable font size for the charts - auto redirect to the app on homepage if already logged in - better skeleton loader placement on mobile - consistent logs - consistent tags
dev docs
docker: use non hardened images and use an allowed port (32768-61000)
proper 4th chart
- doughnut now displays actually useful information (cashflow) - percentages in some tooltips - fixed the charts font being wanky - better downloaded filenames, reflects the selected date period
auto select all days of the week in week filtering mode, use the same color for impact
rework the date filters
- move the filtering logic to its own component - restyle - fixed some logic bugs - ability to select other day/week/month/year than the current one with an indicator of the current one using a tooltip - fixed titles not getting the right font - add expose dev scripts
properly sort by week
don't load empty values, properly filter by date, fix an error and select the right day
actually limit description size
use local fonts, inter everywhere except titles, ligatures and fira code on the highlights
restyle
- space out things - rework icons - display input details (ex errors) - better looking admin page - clear the selected budget for an easy refresh - simplify i18n - make sure the cancel in modals is always the left option - different icons per role - added tooltips for unlabled actions - switch to a proper number input for the amount, proper calendar for the date picker too - cleaner skeleton loaders - use tabs for the main sections, like for the charts
remove the Icon table, merge with Category, allow users to create their own icons tied to their BudgetTrackers
- updated types and api routes - remove the icon section in the admin settings - make sure that icon names are always correctly prefixed - proper error page - properly type the admin export
landing page
better colors, login page
strengthen the admin API, fix the budget tracker not being properly selected on creation
switch to UUID for identifiers, centralize types
working-ish PoC
- actual components with budgets selector, table, filtering & sorting, charts, rights, categories and more - fixed the annoying "disconnect" issue - hardened docker images
latest better-maps & website changes, now ready to kickstart the project
docs: rough sketch of the db
crash, inter tweaks, remove unused styles, properly redirect, don't send to homepage when logged in
switch to a setup-based store
port the latest changes from better-maps as a base
- recheck EDM115/better-maps@9253d53 to see more about the SSR fetch-once tricks in the app file - added a charting lib
init
most of the code has been ported from EDM115/better-maps