02-Mar-2026 — Environment-setup, Album and 1 more areas: 1 feature and 3 fixes #146
build 508 — commit 590a441
- Fix Fly.io shared IPv4 allocation using sharedIpAddress fallback for known GraphQL API bug
- Wire notification configs to built-in processes (forgot-password, walks, expenses, contact-us)
- Assign admin user to committee roles (membership, support) for email sender resolution
- Register admin as Brevo sender during environment creation
- Add admin password reset button to Modify Environment flow
- Allow password reset route to bypass maintenance mode guard
- Add seed endpoints for sample pages, notification configs, and Brevo templates
- Extract shared helpers: toGroupShortName, cleanIncorrectPageContent, runMigrations, registerBrevoSender
- Make notification config seeding idempotent with upsert pattern
- Fix arrow-parens lint violations across all server TypeScript files
environment-setup: use database for secrets and Brevo config, fix GitHub status comparison (#146)
- Switch loadEnvironmentContext from file-based to database-only secrets
- Read Brevo API key via configuredBrevo() instead of secrets.BREVO_API_KEY
- Destroy route uses database mongo config instead of file-based secrets
- GitHub status endpoint no longer fakes CONFIGS_JSON from database, honestly reports unknown state until a push establishes the comparison baseline
- Use sortBy from arrays.ts for reconciliation sorting
- Remove unused loadSecretsForEnvironment import
album: real-time border radius updates, toolbar full-width layout, and settings row spacing
- Change gridViewOptions to a getter in AlbumComponent to ensure edit form mutations flow through to the preview grid in real time
- Add .album-toolbar CSS rules to spread badge-buttons and badge-steppers across full width
- Add flex-fill to settings row form-groups so fields fill available width
- Create missing album.sass referenced by component
admin: stale-while-revalidate area cache, skip migration check on password reset, and centralise admin paths (#146)
Area cache now always serves cached data immediately and refreshes in the background when expired, preventing visible loading delays. Replace banned Date.now() with dateTimeNowAsValue(). Skip migration status check when navigating to set-password URLs so password resets work on newly provisioned environments with pending migrations. Centralise admin/set-password and admin/maintenance path strings as shared constants in system.model.ts and update all TypeScript references across frontend guards, services, and backend routes.