Release v0.1.3
[0.1.3] - 2026-08-07
⚠️ Breaking Changes
- Document postgres named-volume breaking change and migration
The postgres container now mounts a named volume
(zerf_postgres_db_data) at /data/db. Existing deployments must copy their
PostgreSQL data directory from the previous anonymous volume into
zerf_postgres_db_data before upgrading, or the database will start empty.
See docs/UPGRADING.md.
Added
- Render independent leave-account columns in the team report
- Queue outbound email delivery with retry and a circuit breaker
- Add manual "Back up now" trigger, fix Upload now placement
- Couple leave-account access to entitlement and tile visibility
- Include comment in the new absence request email
- Align dashboard card and assistant relevance
- Provisional manual sends, an exclusion list, and a status card
- Use auto-growing textarea for recipient addresses
- Auto-select absence categories, support multiple recipients
- Show single entry edits individually, full detail for weeks
- Email a monthly payroll report to the tax office
- Record week approvals as one audit event per week
- Deep-link from pending approvals and show entry comments
- Support recurring manual holidays
- Bundle backups into a single zip archive
- Larger desktop typography via rem root font-size
- Larger typography, centered page width cap, CSS modularization
- Remove the 14-hour per-day cap
- Central delivery facade and opt-in admin error alerts
- Add System Log page and paginate the Audit Log
- Require a valid share URL to enable backup upload
- Add null-safe name comparison and update sorting logic in TeamUsers
- Implement role-based avatar colors and sorting in user lists
- Group the combined timesheet PDF export by role
- Color avatars by role and group rosters by role
- Zero leave days on assistant role selection, restore on switch back
- Hide irrelevant fields for assistant role instead of disabling them
- Add Playwright e2e suite with backup/restore verification
- Self-load holidays for out-of-range years in request dialog
- Capture pg_tde keyring with each backup for physical recovery
- Replace wrapping settings tabs with mobile dropdown
- Send email notification on admin password reset
- Enable team lead assistant management by default
- Preserve time data when disabling time tracking, add missing i18n
- Restore lz4 compression on audit_log via migration 029
- Add 10-year hard-coded retention for audit_log
- Add user archiving and restore
- Allow team leads to create and manage assistant users
- Sort users alphabetically in all list views
- Wire base annual_leave_days through user create/update
- Per-employee category enable/disable
- Persistent backup scheduling, count-based retention, and admin system-error notifications
- Interval in days, run daily at 4am UTC
- Redesign monthly PDF export as per-employee queue
- Rename Nextcloud Upload tab to Nextcloud Backups
- Nextcloud upload for DB backups and monthly timesheet PDFs
- Add per-user submission auto-approval, make all auto-approvals silent
- Per-option info icons in the AbsenceCategoryDialog
- Make absence categories fully configurable
- Extend automatic break deduction to two configurable tiers
- Implement automatic break deduction
- Add optional hire date for accurate leave-entitlement proration
- Generate timesheet export PDFs in the backend
Changed
- Simplify SMTP sending with a guarded send wrapper and timeout
- Remove redundant leave-accounts card from Account page
- Shrink shipped images and keep build cache off the layer graph
- Simplify TeamReport component by removing leave account handling and updating test fixtures
- Update team report response type and simplify absence record handling in tests
- Update workday handling to support flexible scheduling and improve documentation
- Move upload button to shared actions bar
- Remove product name from email copy and harden restore selection
- Simplify payroll and backup copy
- Drop the "Sonstige Abwesenheit" catch-all category
- Unify Reports page into Employee/Team tabs with shared toolbar
- Centralize generated copy
- Use query_scalar for the category active check
- Remove system-error alert emails, keep in-app only
- Remove redundant upload failure notification logic and update documentation
- Move allow-team-lead-manage-assistants setting to Users page
- Reorganize FlextimeSection layout and improve responsive design
- Update development workflow guidelines in AGENTS.md
- Update archived users section to match merged Users page
- Unify 'member' terminology to 'user'
- Merge archived users into Users settings page
- Centralize post-auth data loading in one shared loader
- Remove UPGRADING.md
- Reflect current state (self-contained backup image, postgres caps)
- Correct data-at-rest encryption docs and add recovery/migration guidance
- Document postgres named-volume breaking change and migration
- Replace user deactivation with archiving
- Unify Admin and Team Settings into a single Settings menu item
- Sync user-guide table of contents and fix duplicate table row
- Fix several user-guide.md inaccuracies found during a full audit
- Collapse cost flags into cost_type enum; drop team_visible
- Remove jurisdiction references from break deduction comments
- Extract inline styles to CSS utility classes
Dependencies
- Refresh Cargo.lock via cargo update
Fixed
- Retry queue-entry deletes after confirmed email delivery
- Grant assistant category access before setting leave-account entitlement
- Wait for the category list to load before clicking Add
- Default new categories to the end of the sort order
- Update leave-account card selector after tile redesign
- Build docker images sequentially to avoid CI build races
- Use numeric --chmod for static asset COPY
- Compute automatic break deduction against the day's total, not per block
- Keep "Back up now" responsive during failure backoff
- Translate absence category, align hours table, drop absence total
- Add padding and fix alignment on leave account cards
- Add missing translations for team report vacation columns
- Pre-pull postgres image with retry for integration tests
- Enhance TeamReport table with wrapping-optimized headers and add corresponding test
- Restore the custom date and time pickers on touch devices
- Stop Safari collapsing the dialog body to its padding
- Use native mobile time input fallback
- Remove unused payroll report notice from AdminPayrollReport
- Make payroll send status non-blocking
- Harden dialog interaction handling
- Complete entry dialog edge-case hardening
- Harden entry dialog rendering and fallback behavior
- Harden time entry dialog browser compatibility
- Tile must require approval even when hours aren't reported
- Show hours with two decimal places
- Correct the dashboard card's sent state and colour split
- Prevent approval queue card headers from overflowing on mobile
- Match the established 'selected day' phrasing in the Send now hint
- Clarify the Send now hint now that it doesn't skip the scheduled delivery
- A manual send no longer replaces the scheduled delivery
- Only mark categories unpaid explicitly, not by cost_type
- Validate backup selection explicitly
- Fix label overflow and upload actions layout
- Land team leads on the leftmost tab, sort team users list
- Fix payroll report category list translation and layout
- Require full approval and pre-start correctness on the Nextcloud export too
- Correct the flextime claim for no-cost absence days
- Describe absence cost types from the employee's perspective
- Restore shared input style and equal widths for flextime date pickers
- Guard category-picker save against races and dropped edits
- Remove sick-like qualifier from auto-approve label
- Correct German case agreement in no-cost help text
- Fix light-theme color-scheme so inputs stay light when OS is dark
- Clarify no-cost absence category label and help text
- Fix date picker input theme and flextime section overflow
- Wrap dialog footer buttons onto multiple rows
- Count pending weeks, not time-entry rows, in approval reminders
- Make metadata cp best-effort in direct dump.enc path
- Fix three logic errors in restore.sh
- Preserve line breaks in notification body text
- Remove redundant table-wrap on approval queue cards
- Remove PasswordCredential API calls interfering with password managers
- Translate error notification and report-upload alert text
- Make absence dates weekend/holiday-safe, fix renamed audit-log selector
- Require review for start-date reexports
- Preserve timesheet export integrity
- Remove orphaned test and unused import after notification removal
- Improve handling of unexportable timesheet entries and enhance notification details
- Update user-roster selector after settings card was added above list
- Update assistant-setting test to use Users page
- Resolve rejected entry lifecycle traps
- Harden timesheet PDF export requeue
- Hold report export for pending absences
- Tighten export readiness checks
- Close export and workflow edge cases
- Four correctness defects in PDF, archive, weekly-status, and absence behavior
- Harden reopen and reminder workflows
- Remove -i from docker exec where no host stdin is needed
- Correct backfill logic and add unit tests
- Resolve 7 audit findings across submission, export, and reopen workflows
- Correct phantom-year guard and update tests for pessimistic sourcing
- Correct vacation/absence logic holes and backup/restore defects
- Adjust bell position and sidebar width for improved layout
- Scope team settings to assigned approvers
- Enable allow_team_lead_manage_assistants before team lead tests
- Harden backup restore flow
- Restore PDF total break-adjustment and add archiving cancellation_pending test
- Close archived-user leaks in reopen requests and approval reminders, unblock absence cancellation
- Resolve remaining timesheet workflow issues
- Resolve audit findings in absence calendar, archiving, holiday idempotency, and report totals
- Restrict restore dialog approver picker to leads and admins
- Exclude non-tracking users from combined PDF
- Auto-reopen unapproved submitted weeks
- Route approval reminder clicks to the dashboard
- Adjust Team Settings placement for better role distinction
- Make auto-break threshold exclusive, matching ArbZG §4
- Decode nullable user_id as Option to handle deleted users
- Update submission obligation logic for non-assistants and zero-weekly-hours users
- Check admin authorization before validating holiday name
- Log category and holiday create/update/delete
- Fix oversized upload-now button and add distinct highlight style
- Wait for week-approval toast to clear before absence approval
- Apply consistent scrollbar styling to dialogs and panels
- Prevent settings race from overwriting zeroed leave days for assistant
- Clear pending approval entries for all approvers once an item is decided
- Add WinAnsiEncoding and move Tf inside BT block
- Replace printpdf with pdf-writer to remove lopdf vulnerability
- Label request-dialog duration as workdays, not calendar days
- Correct field spacing in entry and member dialogs
- Reload absence categories and earliest start date after first-login password change
- Block upload SSRF, validate holiday country, enforce CI audits
- Make the pg_tde keyring sidecar capture work (0644 ciphertext)
- Stream the dump into the container instead of docker cp
- Make volume-extracted copies readable by the non-root host user
- Bake backup.sh into the backup image instead of bind-mounting
- Restrict postgres container to a minimal capability set
- Stream pg_dump into openssl to remove the /tmp tmpfs ceiling
- Preserve pg_tde extension during restore to prevent data loss
- Add overflow-x: auto to desktop settings tabs
- Remove mobile menu X button, fix SMTP status for team lead user creation
- Pass smtpEnabled to TempPasswordDialog in AdminUsers password reset
- Allow admins with must_change_password to reset other users' passwords
- Explicitly mount postgres PGDATA as named volume to prevent data loss
- Close pending queue items when disabling time tracking
- Filter time entries by start_date in list_for_user, update tracks_time test
- Update stale comment and refresh user state on tab visibility
- Import ImageExt trait for with_tag on testcontainers Postgres
- Use postgres:17 testcontainer to support lz4 and drop DO-block workaround
- Correct two errors found during review
- Drop lz4 COMPRESSION from migration 028
- Correct two errors found during review
- Address storage leaks and resource waste from audit
- Correct test password length (EmpDel -> 12 chars)
- Extend test passwords to meet 12-char minimum
- Add archived_at to report repository User queries
- Correct archive logic errors found during review
- Let team leads reactivate assistants, remove their delete capability
- Update TeamSettings test for alphabetical sort order
- Sort users alphabetically in team and category reports
- Include annual_leave_days in report user-select queries
- Complete user category selection flow
- Align start/hire date fields when hire date clear button appears
- Restore pinned=TRUE on re-alert in notify_admins_backup_error
- Correct backup interval field min/placeholder; fix user-guide
- Retry tomorrow on failure instead of waiting the full interval
- Make MKCOL non-fatal; bulk INSERT for queue population
- Rename PDF to Stundenzettel_Vorname_Nachname and move Upload now button
- Add missing allow_submission_without_approval column to timesheet query
- Renumber upload_settings migration from 020 to 021
- Resolve compilation errors and bats test failures
- Include auto_approved in the empty-ids submit response
- Strip debug logging from production builds (#52)
- Top-align logo inside sidebar-logo-icon
- Unify checkbox/radio look and spacing in AbsenceCategoryDialog
- Translate absence category names, shorten add buttons, tidy mobile layout
- Address 3 logic errors in configurable-categories surface integration
- Tighten calendar comment privacy and document validate_flextime_balance
- Seed absenceCategories store in Time.test.js setup
- Address 6 logic errors in configurable absence categories audit
- Remove unused absence_cat_id helper from integration tests
- Update integration tests for B7/B8 absence category cost-type guards
- Add missing team_visible field to AbsenceCategory test helper
- Populate absenceCategories store in tests and update user guide
- Resolve logic errors in configurable absence categories (B1-B9)
- Remove time-entry conflict check from update_absence
- Correct 5 logic bugs in flextime_reduction handling
- Correct store teardown on logout, workday preview count, and test pool stability
- Suppress spurious category error on forced password change login
- Alternate timesheet PDF row shading per drawn row, not per day
- Resolve pre-existing clippy lints in services and integration tests