Skip to content

feat: auto-generate recurring expenses, tagging system, expense indicators#6

Merged
audemed44 merged 3 commits into
mainfrom
feat/recurring-processor-tags-logging
Feb 28, 2026
Merged

feat: auto-generate recurring expenses, tagging system, expense indicators#6
audemed44 merged 3 commits into
mainfrom
feat/recurring-processor-tags-logging

Conversation

@audemed44

Copy link
Copy Markdown
Owner

No description provided.

…ators

- Server-side recurring processor runs on startup and on a configurable
  interval (RECURRING_INTERVAL_MS, default 1h). Idempotent — uses a
  Set<"recurringId|date"> to prevent duplicates. Only generates expenses
  for today onward (no historical backfill). Timezone-aware via TZ env
  var (default Asia/Kolkata).
- Tags: user-created tags table with junction tables for both expenses
  and recurring expenses. Tags on a recurring rule are auto-inherited by
  generated expenses. Full CRUD via /api/tags.
- Expense list shows an "Auto" badge (RefreshCw icon) for expenses
  generated from a recurring rule, plus tag pills and a tag filter.
- Add/edit dialogs for expenses and recurring expenses include a tag
  multi-select. The recurring dialog labels tags as "auto-applied to
  generated expenses".
- Vite config updated to load root .env via loadEnv() so VITE_* vars
  and PORT are available at config evaluation time.
- Server dev script uses --env-file=../.env to pick up root .env.
- docker-compose.yml passes TZ env var (default Asia/Kolkata).
Introduces server/src/logger.ts — a minimal [timestamp] [LEVEL] [tag]
logger that routes to console.log/warn/error by level.

- HTTP middleware logs every request: METHOD /path → STATUS (Xms),
  using warn for 4xx and error for 5xx
- Startup events: DB init, recurring interval, server listen address
- Recurring processor: logs the target date, number of active rules,
  each generated expense, and a final created/nothing-to-do summary
- All route files log mutations (POST/PUT/DELETE) with key identifiers
  and notable errors (404, 409 conflict, validation rejections)
- New release.yml triggers on v* tag pushes (e.g. v1.0, v1.2.3) and
  builds/pushes the Docker image tagged with the git tag name to GHCR
- docker.yml cleanup step now ignores v* tags in addition to 'latest',
  so versioned releases are never pruned by the rolling-3 cleanup job
@audemed44 audemed44 merged commit cc9eaf6 into main Feb 28, 2026
1 check passed
@audemed44 audemed44 deleted the feat/recurring-processor-tags-logging branch February 28, 2026 22:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant