Files
armarium-suite/CHANGELOG.md
T
Daniel Krähenbühl 807ebc41a5 release: Armarium v1.0.0
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>
2026-04-13 14:08:44 +02:00

6.8 KiB
Raw Permalink Blame History

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.svg in navbar, Logo_vertikal.svg on login/register, Icon.svg as 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 to lg: breakpoint
  • Responsive layout: tables (accounts, expenses, transactions) get min-w and overflow-x-auto for 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 .env variables (DB_NAME, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT)
  • Database: added psycopg2-binary as PostgreSQL adapter; added .env.example for 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.language field and localStorage
  • i18n: browser language auto-detection on Login and Register pages
  • i18n: LanguageService for centralised language init, detection and switching
  • i18n: canton names translated per UI language via canton_names keys; 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 .ics file 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 pytz import that caused ModuleNotFoundError
  • i18n: translations not loading due to src/assets missing from angular.json asset sources

[0.1.0] - 2026-03-08

Added

Backend (Django)

  • Initialized Django project with core configuration app and finance app
  • 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-headers to 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 tracking
  • Transaction double-entry bookkeeping with source and destination accounts
  • Budget 7 categories (fixed expenses, mobile/internet, subscriptions, leisure, tax reserves, insurance, loans)
  • Expense 10 categories with optional due date and notes
  • Profile 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 registration
  • POST /api/auth/token/ JWT login
  • POST /api/auth/token/refresh/ token refresh
  • POST /api/auth/logout/ logout with token blacklist
  • POST /api/auth/password/ password change
  • GET/POST/PUT/DELETE /api/accounts/ account management
  • GET/POST/PUT/DELETE /api/transactions/ transaction management
  • GET/POST/PUT/DELETE /api/budgets/ budget management
  • GET/POST/PUT/DELETE /api/expenses/ expense management
  • GET/POST/PUT/DELETE /api/deadlines/ deadline management
  • GET/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.ts for Flowbite TypeScript module declaration
  • Implemented ApiService for all HTTP communication with the Django REST API
  • Implemented AuthService for JWT token storage and management
  • Implemented authGuard to protect routes requiring authentication
  • Implemented authInterceptor to attach Bearer token to all outgoing requests and handle 401 errors
  • Configured SidebarService for 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 (20252026), expense due dates and personal deadlines
  • Profile page with avatar upload, color selection, name, email, and canton selection