807ebc41a5
Full-stack personal finance application (Django + Angular 21). Backend: Django REST Framework, JWT auth, PostgreSQL, iCal feed, rate limiting. Frontend: Angular 21 standalone components, TailwindCSS, i18n (DE/FR/IT/EN), responsive mobile layout, dark/light mode, ApexCharts dashboard, Swiss holiday calendar with canton support. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.8 KiB
6.8 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[1.0.0] - 2026-04-13
Added
- Branding: app renamed to "Armarium"; browser tab title updated
- Branding:
Logo_horizontal.svgin navbar,Logo_vertikal.svgon login/register,Icon.svgas favicon - Branding: navbar logo inverts colors in dark mode via
dark:invert - Responsive layout: mobile-first redesign across all pages
- Responsive layout: sidebar becomes a slide-in overlay drawer on mobile (hamburger in navbar)
- Responsive layout: mobile backdrop closes sidebar on outside click or navigation
- Responsive layout: main content padding reduced on mobile (
p-4 lg:p-8), sidebar margin shifted tolg:breakpoint - Responsive layout: tables (accounts, expenses, transactions) get
min-wandoverflow-x-autofor horizontal scroll on mobile - Responsive layout: notifications panel becomes a full-width top drawer on mobile (
fixed top-[57px] left-0 right-0), dropdown on desktop - Responsive layout: desktop sidebar toggle button hidden on mobile (
hidden lg:flex) - Database: migrated from SQLite to PostgreSQL; connection configured via
.envvariables (DB_NAME,DB_USER,DB_PASSWORD,DB_HOST,DB_PORT) - Database: added
psycopg2-binaryas PostgreSQL adapter; added.env.examplefor onboarding - i18n: full 4-language support (DE/FR/IT/EN) via ngx-translate; translation files in
assets/i18n/ - i18n: language selector in Profile settings, persisted to backend
Profile.languagefield andlocalStorage - i18n: browser language auto-detection on Login and Register pages
- i18n:
LanguageServicefor centralised language init, detection and switching - i18n: canton names translated per UI language via
canton_nameskeys; ZH = "Zürich" (DE), "Zuerich" (EN), "Zurigo" (IT), "Zurich" (FR) - Calendar year view: clicking a month card opens a modal with an enlarged month view
- Sidebar collapse toggle in navbar: sidebar can be collapsed to icon-only view and expanded again
- Collapsed sidebar: flyout submenus for Budgets and Accounts with backdrop to close on outside click
- Collapsed sidebar: tooltips on hover for all navigation icons
- Dark/Light mode toggle in navbar with sun/moon icons; preference persisted in localStorage (dark mode default)
- iCal feed:
GET /api/calendar/ical-url/returns personal iCal feed URL per user - iCal feed:
GET /api/calendar/ical/<user_id>/<token>/serves.icsfile with deadlines and expense due dates (HMAC-SHA256 token auth) - Calendar: "Subscribe" button in header opens popup with iCal feed URL and copy button
Changed
- Calendar day detail: replaced bottom panel with a slide-in drawer from the right side
- All UI strings replaced with i18n translation keys (DE/FR/IT/EN) across all pages and components
Fixed
- Profile: canton and language selects not saving — replaced
[value]/(change)with[ngModel]/(ngModelChange)for reliable Angular select binding - Calendar: canton selector not reflecting the profile canton on load
- Sidebar collapse button was not wired to any action
- Sidebar flyout submenus were clipped inside collapsed sidebar due to
overflow-y-auto - iCal feed: removed unused
pytzimport that causedModuleNotFoundError - i18n: translations not loading due to
src/assetsmissing fromangular.jsonasset sources
[0.1.0] - 2026-03-08
Added
Backend (Django)
- Initialized Django project with
coreconfiguration app andfinanceapp - Configured SQLite3 as development database
- Integrated Django REST Framework with JWT authentication via
djangorestframework-simplejwt - Enabled JWT token blacklist for secure logout and token rotation
- Configured
django-cors-headersto allow requests from Angular frontend (localhost:4200) - Implemented rate limiting: 5/min (auth), 200/min (authenticated users), 20/min (anonymous)
- Configured environment variables via
python-dotenv(SECRET_KEY, DEBUG, ALLOWED_HOSTS, CORS) - Added media file handling for avatar image uploads
Data Models
Account– asset, expense, and revenue account types with balance trackingTransaction– double-entry bookkeeping with source and destination accountsBudget– 7 categories (fixed expenses, mobile/internet, subscriptions, leisure, tax reserves, insurance, loans)Expense– 10 categories with optional due date and notesProfile– user profile with avatar (image + color), name, email, and canton (all 26 Swiss cantons)Deadline– 5 types (tax, insurance, invoice, personal, other)
REST API
POST /api/auth/register/– user registrationPOST /api/auth/token/– JWT loginPOST /api/auth/token/refresh/– token refreshPOST /api/auth/logout/– logout with token blacklistPOST /api/auth/password/– password changeGET/POST/PUT/DELETE /api/accounts/– account managementGET/POST/PUT/DELETE /api/transactions/– transaction managementGET/POST/PUT/DELETE /api/budgets/– budget managementGET/POST/PUT/DELETE /api/expenses/– expense managementGET/POST/PUT/DELETE /api/deadlines/– deadline managementGET/PUT/DELETE /api/profile/– user profile with avatar upload
Frontend (Angular)
- Initialized Angular 21.2 project using standalone component architecture
- Integrated Tailwind CSS v3.4 for utility-first styling
- Integrated Flowbite 4.0.1 as UI component library (initialized via
initFlowbite()in shell) - Integrated ApexCharts 3.46.0 for data visualization
- Added
typings.d.tsfor Flowbite TypeScript module declaration - Implemented
ApiServicefor all HTTP communication with the Django REST API - Implemented
AuthServicefor JWT token storage and management - Implemented
authGuardto protect routes requiring authentication - Implemented
authInterceptorto attach Bearer token to all outgoing requests and handle 401 errors - Configured
SidebarServicefor sidebar open/close state management
Pages & Components
- Login and Register pages with JWT-based authentication
- Shell layout with responsive sidebar and navbar (user avatar, canton display)
- Dashboard with KPIs (total income, fixed costs, expenses, available balance, savings rate) and ApexCharts bar and donut charts
- Accounts page with full CRUD for asset, expense, and revenue accounts
- Budgets page with category grouping and budget suggestions per category
- Expenses page with category filtering and due date tracking
- Transactions page with double-entry transaction management
- Calendar page with year and month view, Swiss public holidays and school holidays by canton (2025–2026), expense due dates and personal deadlines
- Profile page with avatar upload, color selection, name, email, and canton selection