Commit Graph

316 Commits

Author SHA1 Message Date
Víctor Falcón f45d23deb4 chore: release v0.1.1 2026-01-05 15:10:45 +01:00
Víctor Falcón 1cec4a6421
Add Cashflow Analytics Feature (#49)
Summary
- Add new Cashflow page with income/expense analytics, Sankey chart
visualization, and trend analysis
- Add Cashflow summary widget to the dashboard
- Implement feature flag system using Laravel Pennant to control feature
visibility per user
- Add artisan commands to enable/disable features: `php artisan
feature:enable/disable [feature] [email|all]`

## New Features
- **Cashflow Page**: Period-based income/expense breakdown with category
analysis
- **Sankey Chart**: Visual flow diagram showing money movement between
categories
- **Trend Chart**: 12-month historical cashflow visualization
- **Dashboard Widget**: Quick cashflow summary card
- **Feature Flags**: Cashflow feature hidden behind feature flag,
controllable per-user

## How to enable it
This feature it's under a feature flag until we are sure it's working
fine. If you want to test it, [send us a message on the general channel
in our discord](https://discord.gg/9UQWZECDDv). If you're self hosting
just run `php artisan feature:enable CashflowFeature {your_email}`.

## New Cashflow Page
<img width="1278" height="1185" alt="image"
src="https://github.com/user-attachments/assets/83469f24-9f96-4e5f-bef9-86c076d31243"
/>
<img width="1274" height="1035" alt="image"
src="https://github.com/user-attachments/assets/8949ff9d-c370-4fc4-81c6-268307c587a5"
/>

## New Dashboard Widget
<img width="1180" height="289" alt="image"
src="https://github.com/user-attachments/assets/ad984a66-9ffd-4079-85ce-0b2d28278d76"
/>
<img width="1179" height="286" alt="image"
src="https://github.com/user-attachments/assets/bff60286-8ea2-4e9c-8fa6-22755566648f"
/>
2026-01-05 13:06:50 +01:00
Víctor Falcón 2634a501b5
Enhance README with language options (#50)
Added multilingual links to the README for better accessibility.
2026-01-05 12:23:13 +01:00
Víctor Falcón b957ddbe0d
Preview account transactions (#48)
While importing new transactions, sometimes is difficult to now which
ones are already imported, and which one are new.

With this importer update you can quickly view the transactions that
already exist in your account, and see which ones you have and which
ones you don't have to import again.

<img width="1220" height="1169" alt="image"
src="https://github.com/user-attachments/assets/38de3208-a7d4-4578-8683-753bd0bf7c93"
/>
2026-01-04 16:17:15 +01:00
Víctor Falcón 0f879cec0e transactions: increase date column size 2026-01-02 14:56:05 +01:00
Víctor Falcón 13d6c54e12 avoid new lines on transactions date column 2026-01-02 14:48:42 +01:00
Víctor Falcón 7d90a53deb bugsing: only send error if production 2026-01-02 14:34:41 +01:00
Víctor Falcón a2bae48827 catch: play video error 2026-01-01 12:18:00 +01:00
Víctor Falcón fdb5ab3425 fix broken tests because end of year 2025-12-31 18:36:07 +01:00
Víctor Falcón 407f0f85d9 frontend: update transaction search input width 2025-12-31 13:01:12 +01:00
Víctor Falcón d592391de8 Push sourcemap to bugsink 2025-12-31 12:56:25 +01:00
Víctor Falcón 8f9f1e809d Config bugsink for React frontend 2025-12-31 12:22:01 +01:00
Víctor Falcón cb44687216 Config bugsink on Laravel 2025-12-31 12:11:55 +01:00
Víctor Falcón beecff404a
Add subscription cancellation email with manual trigger command (#47)
## Summary

- Add a subscription cancellation email that can be manually triggered
via artisan command
- Include CONTINUE50 coupon code (50% off current and future payments
for monthly/yearly subscriptions)
- Add option to disable all drip emails via `DRIP_EMAILS_ENABLED` env
var

## Usage

```bash
# Send to single user
php artisan email:subscription-cancelled user@example.com

# Send to multiple users
php artisan email:subscription-cancelled user1@example.com,user2@example.com

# Disable all drip emails
DRIP_EMAILS_ENABLED=false
```
2025-12-30 20:32:44 +01:00
Víctor Falcón 989a446f3c Update composer dev job to run emails queue 2025-12-30 18:29:49 +01:00
Víctor Falcón b79ba27008 ui: change text on unlock message dialog 2025-12-30 15:46:58 +01:00
Víctor Falcón 4fa77dc929 landing: video player ui 2025-12-30 15:37:02 +01:00
Víctor Falcón 1e3de4b1e0 landing: add encryption video 2025-12-30 15:35:10 +01:00
Víctor Falcón 2eccee09a2 ui: amount display when encryption key is not set 2025-12-30 14:25:19 +01:00
Víctor Falcón 1e866a514d remove unused images 2025-12-30 14:24:16 +01:00
Víctor Falcón b2d1bcf54c fix: wrong user menu text 2025-12-30 11:16:15 +01:00
Víctor Falcón bc9a84f929 typo: privacy mode 2025-12-30 11:13:07 +01:00
Víctor Falcón 5fe961a308 chore: update privacy mode to update transactions descriptions 2025-12-30 11:03:58 +01:00
Víctor Falcón 104723cbef chore: update landing images 2025-12-30 10:47:42 +01:00
Víctor Falcón c72b148fb4
SSR was missing the privacy mode provider (#46) 2025-12-30 08:55:03 +01:00
Víctor Falcón 3bcb4875f0 chose: increase mail limit per second 2025-12-30 08:38:28 +01:00
Víctor Falcón 46454f193f
Update balance with manually created transactions (#45)
<img width="1195" height="874" alt="image"
src="https://github.com/user-attachments/assets/1d2f5e10-dad5-4136-8f65-5e8a3e8b30c5"
/>
2025-12-30 07:55:34 +01:00
Víctor Falcón a961b24386 recover idempotent transaction sync 2025-12-30 07:50:04 +01:00
Víctor Falcón b641b23ca2 docs: add Coolify deployment instructions with direct template link 2025-12-30 07:22:19 +01:00
Víctor Falcón 797cb06f86 fix: auto-regenerate APP_KEY if invalid format (missing base64: prefix) 2025-12-30 07:22:19 +01:00
Víctor Falcón a7ee776af7 fix: use direct PDO connection test for MySQL readiness check 2025-12-30 07:22:19 +01:00
Víctor Falcón 39ef165655 Add production Docker setup for easy self-hosting with the CI-built image (#42)
- Add production Docker setup for easy self-hosting with the CI-built
image
- Build multi-architecture Docker images (amd64 + arm64)

### Changes

  Docker Production Setup
- Add docker-compose.production.yml for running the production image
locally
- Add docker/entrypoint.sh with automatic setup (migrations, caching,
storage, APP_KEY generation)
  - Add HEALTHCHECK to Dockerfile for container health monitoring
  - Add .env.production.example with documented production defaults

### CI/CD
  - Add QEMU for multi-arch builds
  - Build Docker images for both linux/amd64 and linux/arm64

### Coolify / WIP
  - Add templates/coolify/whisper-money.yaml one-click template
  - Includes MySQL service with health checks
  - Auto-generates credentials using Coolify's SERVICE_* variables

### Documentation
  - Update README with production Docker instructions
  - Add environment variable reference table
2025-12-30 07:22:19 +01:00
Víctor Falcón b52e2de987 fix: migration history 2025-12-30 07:22:19 +01:00
Víctor Falcón 9b5158dec2 docker: add new build-image step on github ci 2025-12-30 07:22:19 +01:00
Víctor Falcón 700f9325a3 Add currency selection to user profile settings (#41) 2025-12-30 07:22:19 +01:00
Víctor Falcón 0f66ab7478 chore: update user-menu-content ui 2025-12-30 07:22:19 +01:00
Víctor Falcón 037699b424 chore: add repo star count to landing 2025-12-30 07:22:19 +01:00
Víctor Falcón bdde852b80 Add GitHub funding model to FUNDING.yml (#40) 2025-12-30 07:22:19 +01:00
Víctor Falcón 8966207dbc Add Ko-fi funding option for victor_falcon (#39) 2025-12-30 07:22:19 +01:00
Víctor Falcón db81c9b888 feat: add version tracking with git tags and changelog
- Add version field to package.json (0.1.0)
- Install release-it for automated releases with conventional changelog
- Create .release-it.json configuration
- Create initial CHANGELOG.md
- Share version via Inertia (reads from package.json)
- Display version in user dropdown menu
2025-12-30 07:22:19 +01:00
Víctor Falcón 4bc24c7bb2 chore: update PWA maskable icons 2025-12-30 07:22:19 +01:00
Víctor Falcón 818a49e799 fix(charts): mobile ui, and desktop tooltips 2025-12-30 07:22:19 +01:00
Víctor Falcón 14a9343c1d fix(mobile): account chart 2025-12-30 07:22:19 +01:00
Víctor Falcón c5df59c285 feat: add multiple chart view modes for net worth evolution (#37)
## Summary

- Add four view modes for net worth and account balance charts:
- **Stacked Accounts**: existing stacked bar chart showing balances by
account
  - **Line**: net worth line chart with linear/log scale toggle
  - **Change**: bar chart showing MoM%, YoY%, Rolling 12M changes
- **Waterfall**: bridge chart showing Start -> Change -> End transition

- Add Vitest for frontend unit testing with 52 tests covering all
calculation functions
- Proper sign handling for liabilities (credit cards and loans subtract
from net worth)
- Log scale disabled with warning when net worth includes zero or
negative values
- Shared components and logic between dashboard and account detail
charts

## New Files

- `vitest.config.ts` - Vitest configuration
- `resources/js/lib/chart-calculations.ts` - Pure computation functions
- `resources/js/lib/chart-calculations.test.ts` - 52 unit tests
- `resources/js/hooks/use-chart-views.ts` - Shared chart view state hook
- `resources/js/components/charts/` - Reusable chart components

## Test plan

- [x] Dashboard net worth chart shows view toggle and all four views
work
- [ ] Account detail page chart shows view toggle and three views work
(no stacked)
- [x] Line chart scale toggle works (log disabled with warning when
applicable)
- [x] Change chart series toggle (MoM, YoY, 12M EUR, 12M %) works
- [x] Waterfall chart month selector works
- [x] All 52 unit tests pass (`bun run test`)
- [x] Build succeeds (`bun run build`)
- [x] Dark mode styling correct
2025-12-30 07:22:19 +01:00
Víctor Falcón 3cbe0a7879 fix(sync): make transaction creation idempotent (#38)
## Summary
- When a transaction ID is provided during sync, check if it already
exists before creating
- If it exists, return the existing transaction with 200 status instead
of failing with duplicate key error
- Prevents duplicate transactions when sync retries occur due to network
issues

## Test plan
- [x] Attempt to create a transaction with a specific ID
- [x] Attempt to create another transaction with the same ID
- [x] Verify the second request returns the existing transaction instead
of an error
2025-12-30 07:22:19 +01:00
Víctor Falcón 6f42b91585 ui: add hasKeyboard prop to modals 2025-12-30 07:22:19 +01:00
Víctor Falcón a785a27554 ui(fix): add hasKeyboard prop to dialogs
This property move the modal to the top on mobile, so we left space
bellow for the keyboard. On desktop is vertically centered as it was
before.
2025-12-30 07:22:19 +01:00
Víctor Falcón a6c2914e58 ui(fix): use amount display for chart current balance 2025-12-30 07:22:19 +01:00
Víctor Falcón f8ec902d83 ui(fix): responsive design on account show page 2025-12-30 07:22:19 +01:00
Víctor Falcón 618a050535 ui(fix): disable svg focus outline 2025-12-30 07:22:19 +01:00