PLATFORM_ADMIN_ENABLED on
init and display a consistent "Not Available" alert (icon + bold title) when
the flag is absent, matching the alert style used across the admin sectionPLATFORM_ADMIN_ENABLED=true in its secrets block so the flag survives
future deploys via loadSecretsForEnvironmentFromDatabasex-setup-api-key header, enabling logged-in admins to use the page
without a separate setup keyisAdminRequest() added to server routes — verifies the Bearer token with
jsonwebtoken and checks any admin-role claim before granting accessEnvironmentSetupService gains a setupApiKey field and an opts getter;
all HTTP calls now forward the key in x-setup-api-key when presentrequiresApiKey / setupApiKeyValue / setupApiKeyEntered
state and a submitSetupApiKey() method so the UI can prompt for the key
when the server signals it is required (status.requiresApiKey)loadDefaults() now loads system config first (normal session auth, neverEnvironmentDefaults model extended with ramblers.apiKey field/defaults endpoint populates ramblers.apiKey from
national.walksManager.apiKey in the system config so the Ramblers API key
is offered as a default without manual entrycloseMigrationConnection() calls mongoose.disconnect() after running
migrations, which left subsequent operations (seedBrevoTemplatesFromLocal ->
configuredBrevo -> config.findOne) failing with "Client must be connected
before running operations"ensureMongoConnection() after initialiseDatabase() returns so
mongoose reconnects to the main database before Brevo template population runsEnvironmentGitHubSecrets standalone component shows the GitHub
CONFIGS_JSON secret staleness relative to the database, with per-environment
diff detail (new / removed / changed fields) and a one-click Push buttonGET /api/environment-setup/github/status compares DB environments against
the live CONFIGS_JSON value; matches by name first then appName fallback to
avoid cross-matching where multiple DB documents share the same fly.io appPOST /api/environment-setup/github/push pushes DB → GitHub directly without
touching configs.json; after a successful push, process.env.CONFIGS_JSON is
updated in-process so subsequent status checks reflect what was pushedCONFIGS_JSON env var), the value is
initialised from the DB — same runtime behaviour as production where fly.io
injects it at startup — eliminating configs.json as a third piece of statetransformDatabaseToDeployConfig now filters out orphan DB environment
documents (no flyio config), deduplicates by appName (first occurrence wins),
and is exported for reuse in the status routeEnvironmentSettingsSubTab.GITHUB added; heading uses with-vendor-logo
style with the GitHub FA brand icon; .thumbnail-heading.with-vendor-logo
top offset corrected to -34px in frames.sassgh CLI installed in Docker image so the GitHub Secrets panel can fetch
secret metadata and push CONFIGS_JSON from the deployed environmentGH_TOKEN and PLATFORM_ADMIN_ENABLED=true set as fly.io secrets on the
ngx-ramblers (staging) app to authenticate gh and enable the admin pagesArea 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.