This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+2 more
Summary
AI summaryMulti-language UI support added with initial translations in English, Spanish, German, and Dutch.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
Add multiple comma‑separated tags to any subscription; display as chips under name. Add multiple comma‑separated tags to any subscription; display as chips under name. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
One‑click Duplicate button creates a new subscription copy with same details. One‑click Duplicate button creates a new subscription copy with same details. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
New "Shared with" field allows sharing cost among multiple users. New "Shared with" field allows sharing cost among multiple users. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Configure multiple "days before" reminders via comma‑separated list in Settings. Configure multiple "days before" reminders via comma‑separated list in Settings. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Optional Label field appears as secondary line under subscription name for visual distinction. Optional Label field appears as secondary line under subscription name for visual distinction. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
New Tag model with many‑to‑many join via `subscription_tags`; new TagRepository/TagService. New Tag model with many‑to‑many join via `subscription_tags`; new TagRepository/TagService. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
New Subscription fields: Label, ShareCount, LastReminderWindow, LastCancellationReminderWindow. New Subscription fields: Label, ShareCount, LastReminderWindow, LastCancellationReminderWindow. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
CSV‑based settings `reminder_days_list` / `cancellation_reminder_days_list` parsed by ParseReminderWindows. CSV‑based settings `reminder_days_list` / `cancellation_reminder_days_list` parsed by ParseReminderWindows. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
New API routes: `/api/subscriptions/:id/duplicate`, `/api/settings/language`, notification days list endpoints. New API routes: `/api/subscriptions/:id/duplicate`, `/api/settings/language`, notification days list endpoints. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
New language selector in Settings → Appearance for multi-language support. New language selector in Settings → Appearance for multi-language support. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Initial UI translations for English, Spanish, German, and Dutch across primary user surfaces. Initial UI translations for English, Spanish, German, and Dutch across primary user surfaces. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Lightweight file-based translation catalog (`web/locales/*.json`) for community contributions. Lightweight file-based translation catalog (`web/locales/*.json`) for community contributions. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Per‑user preferred language persisted in settings. Per‑user preferred language persisted in settings. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
Category stats SQL now respects share_count for consistent dashboard and analytics totals. Category stats SQL now respects share_count for consistent dashboard and analytics totals. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Refactor | Medium |
New `internal/i18n` package with JSON catalog and English fallback lookup. New `internal/i18n` package with JSON catalog and English fallback lookup. Source: llm_adapter@2026-05-21 Confidence: low |
— |
Full changelog
What's New
Multi-language Support (#80)
- New language selector in Settings → Appearance
- Initial UI translations for English, Spanish, German, and Dutch covering all primary user surfaces (dashboard, subscriptions list, add/edit subscription form, settings notifications + data management, mobile menu)
- Lightweight, file-based translation catalog (
web/locales/*.json) — community-friendly for adding more languages - Per-user preferred language persisted in settings
- A small set of advanced surfaces (auth pages, SMTP/Pushover/Webhook configuration, categories/API keys management) remains English for v0.6.0 and is queued for v0.6.x as community contributors review and extend translations
🌍 Translations note: the non-English translations are an initial AI-assisted pass and have not been reviewed by native speakers. If you spot phrasing that sounds awkward, stilted, or wrong — please send a PR! Refinements are small, very welcome, and you don't have to fix everything at once. See
web/locales/README.mdfor how to contribute.
Tags (#110)
- Add multiple comma-separated tags to any subscription alongside its primary category
- Tags display as small chips under the subscription name
- Tags are created on the fly — just type new ones in the field
- Orphaned tags are cleaned up automatically when no subscription uses them
Duplicate Subscription (#109)
- One-click Duplicate button on each subscription row
- New copy keeps cost, category, schedule, URL, notes, label, and tags
- Reminder tracking is reset on the new copy so reminders fire fresh
Shared / Split Costs (#86)
- New "Shared with" field (people, including you) on each subscription
- Dashboard, analytics, and category stats automatically use your share of the cost (full cost divided by share count)
- Subscription list shows
split N ways · your share $X.XXunder the cost when shared
Multiple Notification Windows (#94)
- Configure multiple "days before" reminders via a comma-separated list (e.g.
7,3,0) in Settings - Each window fires once per renewal date — get a heads-up at 7 days, again at 3, and on the day-of
- Backward compatible: existing single-value
reminder_dayssetting still works as a fallback - Same feature available for cancellation reminders
Visual Distinction for Same-Service Subscriptions (#111)
- New optional Label field (e.g.
example.com,Mom's plan,work account) - Label appears as a secondary line under the subscription name
- Useful for multiple domain renewals at one registrar, family-shared streaming accounts, or any time you have two subscriptions to the same service
Technical Changes
- New
internal/i18npackage with a simple JSON catalog and English-fallback lookup; new template functiont .Lang "key" - New
Tagmodel with many-to-many join viasubscription_tags; newTagRepository/TagService - New fields on
Subscription:Label,ShareCount,LastReminderWindow,LastCancellationReminderWindow - New CSV-based settings
reminder_days_list/cancellation_reminder_days_listparsed byParseReminderWindows - Category stats SQL now respects
share_countso dashboard and analytics totals stay consistent - New routes:
POST /api/subscriptions/:id/duplicate,POST /api/settings/language,POST /api/settings/notifications/days_list,POST /api/settings/notifications/cancellation_days_list - Added Playwright specs for duplicate, label, tags, share count, and i18n (including a coverage spec that scans every primary page in every supported language for translation leaks)
- Added Go unit tests for
ParseReminderWindows, multi-window reminder logic, share-count math, tag service (parse + dedupe + replace + orphan cleanup), and i18n catalog lookup
Migration Notes
- Back up your database before upgrading. This release adds several new columns (
label,share_count,last_reminder_window,last_cancellation_reminder_window) and a newtagstable plus asubscription_tagsjoin table. Migrations run automatically on startup. - Existing subscriptions default to no label, no tags,
share_count = 1, and fresh reminder-window tracking — no behavior change. - The existing single-value
reminder_dayssetting still works; the newreminder_days_listCSV setting takes precedence when set.
Deferred to a future release
- Wallos import (#65): initial implementation targeted an incorrect format. Will ship in v0.6.1 once verified against a real Wallos backup (the actual Wallos formats are either a ZIP containing a SQLite DB, or a display-formatted JSON from
subscriptions/export.php).
Help us improve translations 🙏
If you read Spanish, German, or Dutch (or want SubTrackr in your own language), the translation files are at web/locales/*.json. Open a PR with any fixes — even one-key tweaks are welcome. See web/locales/README.md for the conventions.
Closes
- Closes #80
- Closes #110
- Closes #109
- Closes #86
- Closes #94
- Closes #111
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Beta — feedback welcome: [email protected]