Skip to content

Commit a12e2e2

Browse files
authored
Merge pull request #93 from bscott/v0.5.5
v0.5.5 - Pushover Notifications, BDT Currency, and Cancellation Reminders
2 parents d21d36e + b32b6a9 commit a12e2e2

File tree

19 files changed

+1385
-59
lines changed

19 files changed

+1385
-59
lines changed

.beads/issues.jsonl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
1+
{"id":"subtrackr-xyz-1fb","title":"Implement cancellation date email notifications (#88)","description":"Add email notification option for X days before cancellation date. User wants reminders to cancel subscriptions before renewal. Fits with Pushover notifications already added in v0.5.5.","status":"closed","priority":2,"issue_type":"feature","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:32:20.604827-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:42:20.912338-08:00","closed_at":"2026-02-01T18:42:20.912338-08:00","close_reason":"Issue #88 implementation complete: cancellation date notifications fully implemented"}
2+
{"id":"subtrackr-xyz-255","title":"Add cancellation reminder fields to models","description":"Add CancellationReminders and CancellationReminderDays to NotificationSettings. Add LastCancellationReminderSent and LastCancellationReminderDate to Subscription model. Files: internal/models/settings.go, internal/models/subscription.go","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.632633-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:42:20.925084-08:00","closed_at":"2026-02-01T18:42:20.925084-08:00","close_reason":"Issue #88 implementation complete: cancellation date notifications fully implemented"}
13
{"id":"subtrackr-xyz-3gh","title":"Fix Tab and PWA icon missing (#84)","description":"Tab favicon and PWA icon are not displaying in Firefox and Safari. Need to configure proper favicon/manifest icons.","status":"closed","priority":2,"issue_type":"bug","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-01-22T18:21:09.631203-08:00","created_by":"Brian Scott","updated_at":"2026-01-22T18:26:02.363767-08:00","closed_at":"2026-01-22T18:26:02.363767-08:00","close_reason":"Implemented in v0.5.3"}
4+
{"id":"subtrackr-xyz-4ma","title":"Add repository method for upcoming cancellations","description":"Add GetUpcomingCancellations(days int) method to query subscriptions with cancellation dates approaching. File: internal/repository/subscription.go","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.768444-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:42:20.95075-08:00","closed_at":"2026-02-01T18:42:20.95075-08:00","close_reason":"Issue #88 implementation complete: cancellation date notifications fully implemented"}
5+
{"id":"subtrackr-xyz-5ls","title":"Add cancellation reminder service methods","description":"Add GetSubscriptionsNeedingCancellationReminders(), SendCancellationReminder() to subscription, email, and pushover services. Files: internal/service/subscription.go, email.go, pushover.go","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.827689-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:40:33.13865-08:00","closed_at":"2026-02-01T18:40:33.13865-08:00","close_reason":"Added SendCancellationReminder methods to email and pushover services","dependencies":[{"issue_id":"subtrackr-xyz-5ls","depends_on_id":"subtrackr-xyz-255","type":"blocks","created_at":"2026-02-01T18:33:58.079731-08:00","created_by":"Brian Scott"},{"issue_id":"subtrackr-xyz-5ls","depends_on_id":"subtrackr-xyz-4ma","type":"blocks","created_at":"2026-02-01T18:33:58.148998-08:00","created_by":"Brian Scott"}]}
6+
{"id":"subtrackr-xyz-8gh","title":"Add cancellation reminder settings UI","description":"Add settings handlers and UI for cancellation reminder preferences. Files: internal/handlers/settings.go, templates/settings.html","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.941374-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:42:16.382596-08:00","closed_at":"2026-02-01T18:42:16.382596-08:00","close_reason":"Added cancellation reminder settings UI to handlers and template","dependencies":[{"issue_id":"subtrackr-xyz-8gh","depends_on_id":"subtrackr-xyz-uzq","type":"blocks","created_at":"2026-02-01T18:33:58.280161-08:00","created_by":"Brian Scott"}]}
7+
{"id":"subtrackr-xyz-lw5","title":"Add database migration for cancellation tracking","description":"Create migration to add last_cancellation_reminder_sent and last_cancellation_reminder_date columns to subscriptions table. File: internal/database/migrations.go","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.709756-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:42:20.938383-08:00","closed_at":"2026-02-01T18:42:20.938383-08:00","close_reason":"Issue #88 implementation complete: cancellation date notifications fully implemented","dependencies":[{"issue_id":"subtrackr-xyz-lw5","depends_on_id":"subtrackr-xyz-255","type":"blocks","created_at":"2026-02-01T18:33:57.997065-08:00","created_by":"Brian Scott"}]}
28
{"id":"subtrackr-xyz-tqp","title":"Remember sorting preference (#85)","description":"Persist user's subscription list sort preference to localStorage so it remembers their choice between sessions","status":"closed","priority":2,"issue_type":"feature","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-01-22T18:21:09.459913-08:00","created_by":"Brian Scott","updated_at":"2026-01-22T18:26:02.362337-08:00","closed_at":"2026-01-22T18:26:02.362337-08:00","close_reason":"Implemented in v0.5.3"}
9+
{"id":"subtrackr-xyz-uzq","title":"Add cancellation reminder scheduler","description":"Add checkAndSendCancellationReminders() function and integrate with daily scheduler. File: cmd/server/main.go","status":"closed","priority":2,"issue_type":"task","owner":"191290+bscott@users.noreply.github.com","created_at":"2026-02-01T18:33:40.884483-08:00","created_by":"Brian Scott","updated_at":"2026-02-01T18:41:11.679802-08:00","closed_at":"2026-02-01T18:41:11.679802-08:00","close_reason":"Added cancellation reminder scheduler and checker functions to main.go","dependencies":[{"issue_id":"subtrackr-xyz-uzq","depends_on_id":"subtrackr-xyz-5ls","type":"blocks","created_at":"2026-02-01T18:33:58.214037-08:00","created_by":"Brian Scott"}]}

AGENTS.md

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ subtrackr-xyz/
4444

4545
#### 2. Handlers (`internal/handlers/`)
4646
- **subscription.go**: CRUD operations for subscriptions
47-
- **settings.go**: SMTP config, notifications, API keys, currency, dark mode
47+
- **settings.go**: SMTP config, Pushover config, notifications, API keys, currency, dark mode
4848
- **category.go**: Category management
4949

5050
#### 3. Services (`internal/service/`)
@@ -53,13 +53,16 @@ subtrackr-xyz/
5353
- **settings.go**: Settings management
5454
- **category.go**: Category operations
5555
- **currency.go**: Currency conversion (Fixer.io integration)
56+
- **email.go**: Email notification service (SMTP)
57+
- **pushover.go**: Pushover notification service
5658

5759
#### 4. Models (`internal/models/`)
5860
- GORM models:
5961
- `Subscription`: Main subscription entity
6062
- `Category`: Subscription categories
6163
- `Settings`: Application settings (key-value store)
6264
- `SMTPConfig`: Email configuration
65+
- `PushoverConfig`: Pushover notification configuration
6366
- `APIKey`: API authentication keys
6467
- `ExchangeRate`: Currency exchange rates
6568

@@ -122,12 +125,20 @@ subtrackr-xyz/
122125
- Renewal reminders
123126
- High cost alerts
124127

125-
3. **Currency Support**
126-
- USD, EUR, GBP, JPY, RUB, SEK, PLN, INR
128+
3. **Pushover Notifications**
129+
- Pushover API integration for mobile push notifications
130+
- User Key and Application Token configuration
131+
- Renewal reminders (same settings as email)
132+
- High cost alerts (same threshold as email)
133+
- Works alongside email notifications
134+
135+
4. **Currency Support**
136+
- USD, EUR, GBP, JPY, RUB, SEK, PLN, INR, CHF, BRL, COP, BDT
127137
- Optional Fixer.io integration for real-time rates
128138
- Automatic conversion display
139+
- BDT (Bangladeshi Taka) with ৳ symbol
129140

130-
4. **API Access**
141+
5. **API Access**
131142
- API key authentication
132143
- RESTful endpoints
133144
- JSON responses
@@ -218,9 +229,19 @@ This project uses versioned branches for releases. See `CLAUDE.md` for the compl
218229
4. Update date calculation logic if needed
219230

220231
#### Adding a New Currency
221-
1. Update currency service with new symbol
222-
2. Add to currency selection in settings template
223-
3. Update exchange rate handling if using Fixer.io
232+
1. Add currency code to `SupportedCurrencies` in `internal/service/currency.go`
233+
2. Add currency symbol mapping in `GetCurrencySymbol()` in `internal/service/settings.go`
234+
3. Add currency option to currency selection in `templates/settings.html`
235+
4. Update exchange rate handling if using Fixer.io
236+
237+
#### Adding a New Notification Method
238+
1. Create notification config model in `internal/models/settings.go`
239+
2. Create notification service in `internal/service/` (e.g., `pushover.go`)
240+
3. Add config save/get methods to `SettingsService`
241+
4. Add handlers in `internal/handlers/settings.go`
242+
5. Add UI in `templates/settings.html`
243+
6. Update subscription handler to send notifications
244+
7. Update renewal reminder scheduler in `cmd/server/main.go`
224245

225246
### Environment Variables
226247

README.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ Themes persist across all pages and are saved per user. Change themes anytime fr
5151
- 📅 **Calendar View**: Visual calendar showing all subscription renewal dates with iCal export
5252
- 📈 **Analytics**: Visualize spending by category and track savings
5353
- 🔔 **Email Notifications**: Get reminders before subscriptions renew
54+
- 📱 **Pushover Notifications**: Receive push notifications on your mobile device
5455
- 📤 **Data Export**: Export your data as CSV, JSON, or iCal format
5556
- 🎨 **Beautiful Themes**: 5 stunning themes including a festive Christmas theme with snowfall animation
56-
- 🌍 **Multi-Currency Support**: Support for USD, EUR, GBP, JPY, RUB, SEK, PLN, and INR (with optional real-time conversion)
57+
- 🌍 **Multi-Currency Support**: Support for USD, EUR, GBP, JPY, RUB, SEK, PLN, INR, CHF, BRL, COP, and BDT (with optional real-time conversion)
5758
- 🐳 **Docker Ready**: Easy deployment with Docker
5859
- 🔒 **Self-Hosted**: Your data stays on your server
5960
- 📱 **Mobile Responsive**: Optimized mobile experience with hamburger menu navigation
@@ -251,7 +252,7 @@ SubTrackr supports automatic currency conversion using Fixer.io exchange rates:
251252

252253
**Note:** The free Fixer.io plan only allows EUR as the base currency. SubTrackr automatically handles cross-rate calculations (e.g., USD→INR goes through EUR) so all currency conversions work correctly regardless of this limitation.
253254

254-
**Supported currencies:** USD, EUR, GBP, JPY, RUB, SEK, PLN, INR
255+
**Supported currencies:** USD, EUR, GBP, JPY, RUB, SEK, PLN, INR, CHF, BRL, COP, BDT
255256

256257
### Email Notifications (SMTP)
257258

@@ -265,6 +266,27 @@ Configure SMTP settings in the web interface:
265266
3. Test connection
266267
4. Enable renewal reminders
267268

269+
### Pushover Notifications
270+
271+
Receive push notifications on your mobile device via Pushover:
272+
273+
1. **Get your Pushover credentials**:
274+
- Sign up at [pushover.net](https://pushover.net/) (free account)
275+
- Get your User Key from the dashboard
276+
- Create an application at [pushover.net/apps/build](https://pushover.net/apps/build) to get an Application Token
277+
278+
2. **Configure in SubTrackr**:
279+
- Navigate to Settings → Pushover Notifications
280+
- Enter your User Key and Application Token
281+
- Click "Test Connection" to verify configuration
282+
- Save settings
283+
284+
3. **Notification Types**:
285+
- **Renewal Reminders**: Get notified before subscriptions renew (uses the same reminder days setting as email)
286+
- **High Cost Alerts**: Receive alerts when adding expensive subscriptions (uses the same threshold as email alerts)
287+
288+
**Note**: Pushover notifications work alongside email notifications. Both will be sent when enabled, giving you multiple ways to stay informed about your subscriptions.
289+
268290
### Data Persistence
269291

270292
**Important**: Always mount a volume to `/app/data` to persist your database!

0 commit comments

Comments
 (0)