Files
hope-events/SETTINGS.md
T
joshuaandClaude Sonnet 5 86af7093ac Add admin-configurable branding (colors, logo, favicon) and generic default fallbacks
Site Settings -> Branding now supports a Primary/Secondary/Accent brand color
system applied site-wide (buttons, nav, hover states, links) and to outgoing
email header/CTA colors, plus a favicon upload alongside the existing logo
upload, a live preview panel (website/email x desktop/mobile), and
logo-based color suggestions. The setup wizard's Branding step got the same
treatment. Fixes two related bugs found along the way: the setup wizard's
logo/favicon upload was missing its auth token, and a static favicon.ico in
Next's special app/ convention path was silently overriding the dynamic one.

Also replaces every "Hope Events"/"Hope Family Church" default (org name,
email subjects, WhatsApp messages, report metadata, API docs) with a neutral
"Cross Code" placeholder, and the optional legal settings (operator name, IO
details, website URL, effective date) with obviously-generic placeholders
instead of defaulting to real personal/organisational details -- since this
platform is deployed for multiple organisations. Adds SETTINGS.md documenting
every setting's default behaviour.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 14:49:51 +02:00

6.4 KiB

Site Settings — Defaults Reference

Every setting below is stored as a row in the AppSetting key-value table and is editable at runtime via Admin → Site Settings (or, for the first few, the /setup wizard on a fresh install). None of them are required — this page documents exactly what happens when a given key has never been saved.

Settings changes take effect within 60 seconds everywhere (the backend's in-process settings cache TTL) without a server restart.

Organisation

Setting Default when unset Notes
org_name "Cross Code" Falls back to ORG_NAME env var first, then this hardcoded default (the platform vendor's name, used as a neutral placeholder — org_name is a required field in the setup wizard, so this fallback is practically unreachable once a site has been set up). Shown in the navbar, email headers/subjects, and WhatsApp messages.
org_tagline "Connecting community through events" Falls back to ORG_TAGLINE env var first. Shown under the org name in the email header.
org_email (blank) No fallback in most places. Exception: the Terms of Use / Privacy Policy pages default to privacy@example.com (an obvious placeholder) if unset — see the Legal section below.
org_phone / org_address (blank) No fallback — simply omitted wherever shown if unset.
app_base_url APP_BASE_URL or FRONTEND_URL env var, else http://localhost:3001 Used to build links in emails (password reset, ticket delivery, etc.). Should always be set in production.

Branding

Setting Default when unset Notes
primary_color Legacy accent_color value if present, else #4F46E5 (indigo) on the website / #1e3a5f (navy) in emails See Two different fallbacks below — this is the one setting with a genuine inconsistency worth knowing about. Drives buttons, links, nav highlights, and the email header/CTA.
secondary_color 210 40% 96.1% background / near-black text (light gray "wash", shadcn's stock theme) The Branding tab's color picker pre-fills #8B5CF6 as a suggested starting point, but that's only a UI default — if you never hit Save, the actual site uses the light-gray fallback, not violet.
accent_color 210 40% 96.1% background / near-black text (same light gray as Secondary) Same story as Secondary — the picker pre-fills #EC4899 (pink) as a suggestion only.
logo_url Bundled logo (frontend/src/app/church_logo.jpg) Shown in the navbar. This is still the original Hope Family Church artwork checked into the repo — swap the file (or upload a real logo via the Branding tab) before deploying for a different organisation.
favicon_url frontend/public/favicon.ico (the site's original generic favicon) Shown in the browser tab.

Two different fallbacks for primary_color

If primary_color has never been saved (no admin has ever used the new 3-color Branding tab) and there's no legacy accent_color value either, the website and outgoing emails currently disagree on what "no color" means:

  • Website (globals.css / tailwind.config.js static defaults): #4F46E5, a bright indigo.
  • Emails (backend/src/utils/email.js getOrg()): #1e3a5f, a dark navy — unless overridden by the EMAIL_HEADER_COLOR env var.

In practice this only matters on a brand-new install before the setup wizard or Branding tab has been saved even once — the wizard always writes primary_color, so this gap closes itself the moment setup completes.

Notifications

Setting Default when unset Notes
reg_notification_emails REGISTRATIONS_EMAIL env var, else (blank) If truly blank, no internal notification email is sent for new registrations/payments/donations — it's silently skipped, not an error.

Email delivery (SMTP)

Setting Default when unset Notes
smtp_host SMTP_HOST/EMAIL_HOST env var, else (blank) If blank, the app does not send real email — it uses nodemailer's jsonTransport, which just logs the would-be email to the console. This is the single biggest "nothing is configured" gotcha — ticket/payment/password-reset emails silently don't go anywhere until SMTP is set up.
smtp_port 587
smtp_secure false
smtp_user / smtp_pass (blank) Stored AES-256-GCM encrypted (key derived from JWT_SECRET).
smtp_from (blank) If blank, outgoing mail's From: address falls back to the literal no-reply@crosscode.local.
Setting Default when unset Notes
legal_operator_name "[operator details not yet configured]" Deliberately a generic, obviously-incomplete placeholder rather than any real person's or organisation's name. Unlike org_name, these legal fields are optional and can realistically stay unset on a live site — defaulting them to Cross Code's (or anyone else's) real identity would misrepresent who's legally responsible for that deployment.
legal_io_name "[not yet configured]" Same reasoning as legal_operator_name.
legal_io_email "io@example.com" Rendered as a mailto: link, so the placeholder stays a syntactically valid address on the IANA-reserved example.com domain rather than a bracketed non-email string that would break the link.
legal_website_url "example.com" Same reasoning — used to build an https:// link.
legal_effective_date "[not yet set]" Plain text only, no link — a bracketed placeholder is fine here.
org_email (as used on legal pages specifically) "privacy@example.com" Different fallback than org_email's general default (blank) — also rendered as a mailto: link, so it needs to stay a valid-looking address.

WhatsApp

Setting Default when unset Notes
WAWP_ACCESS_TOKEN / WAWP_INSTANCE_ID WAWP_ACCESS_TOKEN/WAWP_INSTANCE_ID env vars, else (blank) No hardcoded default — WhatsApp sending is simply unavailable until both are configured (Admin → Site Settings → WhatsApp).

Setup state

Setting Default when unset Notes
setup_complete false (treated as "not true") Controls whether /setup redirects to /login or runs the first-time wizard. Set to "true" automatically when the wizard finishes.