Skip to content

fix(metadata): use root title template and add missing page metadata - #251

Draft
dccakes wants to merge 1 commit into
mainfrom
claude/sharp-feynman-u26ovu
Draft

dccakes wants to merge 1 commit into
mainfrom
claude/sharp-feynman-u26ovu

Conversation

@dccakes

@dccakes dccakes commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Daily Product Improvement

📝 TLDR

Fix all dashboard page metadata titles to use the root layout's %s | OSWP template instead of the hardcoded Page | Your Wedding Website pattern.

📝 Description

Every dashboard page (Budget, Checklist, Events, Guest List, Vendors, Website) hardcodes its full browser tab title as "Budget | Your Wedding Website". This has two problems:

  1. Confusing label: "Your Wedding Website" is the name of the guest-facing public site. Labelling admin/planner pages the same way misleads users who have multiple tabs open — a tab named "Guest List | Your Wedding Website" looks like the public guest site, not the planning dashboard.
  2. Bypasses the design system: The root layout already defines title.template: '%s | OSWP', which is supposed to provide consistent suffix branding across all authenticated pages. Hardcoding the full string bypasses this entirely.

Additionally, the Dashboard and Settings pages had no metadata export at all, so they fell back to the root layout's default title — both showed as "OSWP — The Open Source Wedding Platform" in browser tabs regardless of which page the user was on.

This Change

  • Strips the hardcoded | Your Wedding Website suffix from all 6 dashboard pages, replacing with the short page name so the root template produces "Guest List | OSWP", "Budget | OSWP", etc.
  • Removes the redundant per-page icons declaration (already set in the root layout and duplicated on every page).
  • Adds missing metadata exports to dashboard/page.tsx and settings/page.tsx.
  • Renames the misnamed DashboardPage default export in guest-list/page.tsx to GuestListPage (copy-paste artifact).

🧪 Testing

  • Manually reviewed all 8 changed files
  • TypeScript type check passes with no new errors
  • No logic changes — metadata only

🧪 How to test as a user

  1. Log in and navigate between Dashboard, Guest List, Budget, Checklist, Events, Vendors, Website, and Settings.
  2. Observe browser tab titles — each should now read "Page Name | OSWP" instead of "Page Name | Your Wedding Website".
  3. Open both the planner dashboard and the public guest site in separate tabs — the tab labels are now clearly distinct.

📚 Documentation

  • No documentation changes needed

🎨 Style and code quality

  • TypeScript type check passes

📦 Dependencies

  • No new dependencies

Daily Product Improvement

Recommendations Reviewed

Area: All authenticated dashboard pages (budget, checklist, events, guest-list, vendors, website, dashboard, settings)
Issue: Page titles are hardcoded as "Page | Your Wedding Website" — confusing admin tabs with the public guest site and bypassing the root layout's title template
Recommendation: Use short page name so the root template produces "Page | OSWP" consistently
Type: Frontend cleanup / UX
Priority: Medium
Effort: Small


Area: src/app/layout.tsx (lines 97–98)
Issue: Both sonner and shadcn <Toaster /> are mounted simultaneously — can cause overlapping toast notifications
Recommendation: Remove the shadcn <Toaster /> since sonner is used exclusively in all non-legacy components
Type: Frontend cleanup
Priority: Medium
Effort: Small
Note: Already addressed in PR #250


Area: src/components/guest-list/guest-search-filter.tsx (lines 55–64)
Issue: Five consecutive eslint-disable-next-line react-hooks/set-state-in-effect suppressions inside one useEffect — symptom of managing too many independent filter state slices
Recommendation: Combine filter state into a single object managed by useReducer; the reset-on-event-change effect then sets one value, eliminating all suppressions and making state transitions explicit
Type: Frontend cleanup
Priority: Medium
Effort: Medium


Area: src/app/(authenicated)/guest-list/page.tsx (line 14)
Issue: Server component export is named DashboardPage despite being the Guest List page (copy-paste artifact)
Recommendation: Rename to GuestListPage
Type: Frontend cleanup
Priority: Low
Effort: Small
Note: Included in this PR alongside the metadata fix


Area: src/components/home/names-form.tsx + Prisma schema
Issue: Onboarding form uses "Groom's Information" / "Bride's Information" labels, which excludes same-sex couples; schema uses groomFirstName/brideFirstName throughout
Recommendation: Rename schema fields to partner1FirstName/partner2FirstName and update labels to neutral language (e.g. "Partner 1", "Partner 2")
Type: Product flow / UX
Priority: High
Effort: Large


Area: src/components/home/non-authenticated-view.tsx (lines 27–35)
Issue: Marketing homepage advertises "Seating & Logistics" with drag-and-drop and auto-suggest — a feature that does not exist anywhere in the codebase
Recommendation: Remove the feature callout until the feature is built, or add a "Coming soon" badge
Type: Product flow
Priority: High
Effort: Small (removing the copy) / Large (building the feature)

Selected Improvement

Fix all authenticated dashboard page metadata titles to use the root layout's %s | OSWP template, add missing metadata to Dashboard and Settings pages, remove redundant per-page icon declarations, and fix the misnamed DashboardPage export in guest-list/page.tsx.

Why This Was Selected

The confusing "Your Wedding Website" suffix in browser tabs is a real UX problem for power users with multiple tabs open — it makes planner pages indistinguishable from the public guest site by name. The fix is purely mechanical (string changes in metadata exports), zero-risk, and immediately improves every page's identity in browser tabs, bookmarks, and screen reader announcements. The toast cleanup (#250) and old dashboard removal (#231) are already covered by open PRs, so this was the next clearest small win.

Changes Made

  • Changed title in 6 page metadata exports from 'Page | Your Wedding Website' to 'Page' so the root template applies
  • Removed redundant icons field from those 6 page metadata objects (already set in root layout)
  • Added export const metadata to dashboard/page.tsx (title: 'Dashboard')
  • Added export const metadata to settings/page.tsx (title: 'Settings')
  • Renamed DashboardPage to GuestListPage in guest-list/page.tsx

Files Changed

  • src/app/(authenicated)/budget/page.tsx
  • src/app/(authenicated)/checklist/page.tsx
  • src/app/(authenicated)/dashboard/page.tsx
  • src/app/(authenicated)/events/page.tsx
  • src/app/(authenicated)/guest-list/page.tsx
  • src/app/(authenicated)/settings/page.tsx
  • src/app/(authenicated)/vendors/page.tsx
  • src/app/(authenicated)/website/page.tsx

Verification

  • TypeScript type check (tsc --noEmit) — passes, no new errors
  • All changes are metadata-only — no component logic, no routing, no data layer touched
  • Confirmed root layout title.template: '%s | OSWP' is set in src/app/layout.tsx (line 44-47)

Future Recommendations

Non-inclusive partner labels in onboarding

  • Recommendation: Rename groomFirstName/brideFirstName schema fields to partner1FirstName/partner2FirstName and update all UI labels to gender-neutral language
  • Priority: High
  • Effort: Large
  • Reason not included: Requires Prisma schema migration, updates to all tRPC types and resolvers, and UI changes across multiple pages and components
  • Should become GitHub issue: Yes

Advertised-but-unimplemented Seating & Logistics feature on marketing homepage

  • Recommendation: Remove the "Seating & Logistics" feature callout from the landing page (or add "Coming soon") until the feature is built — currently creates false expectations at signup
  • Priority: High
  • Effort: Small (copy removal) / Large (feature build)
  • Reason not included: Requires product decision on whether to remove the callout or commit to building the feature
  • Should become GitHub issue: Yes

guest-search-filter.tsx filter state refactor

  • Recommendation: Consolidate the 4 independent filter state slices into a single useReducer to eliminate 5 eslint-disable suppressions and make state transitions explicit
  • Priority: Medium
  • Effort: Medium
  • Reason not included: Medium-scope refactor of a complex component; higher risk than today's targeted fix
  • Should become GitHub issue: No (capture in code comments or backlog)

GitHub Issues Created or Proposed

No GitHub issues were created in this run. The two High-priority Large items (non-inclusive labels, advertised-but-missing seating feature) warrant separate issues but require product/design input before implementation. Issues will be proposed in a follow-up if the team confirms they want tracking.


Generated by Claude Code

All dashboard pages set 'Page | Your Wedding Website' as a hardcoded
title, bypassing the root layout's '%s | OSWP' template and labelling
planner pages with the same name as the guest-facing public site.
Fix by setting only the short page name so the template produces
'Guest List | OSWP', 'Budget | OSWP', etc. Remove the redundant per-page
icon declarations already covered by the root layout. Add missing
metadata to the Dashboard and Settings pages. Rename the misnamed
DashboardPage export in guest-list/page.tsx to GuestListPage.
@vercel

vercel Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
scv Error Error Aug 12, 2026 2:30pm

@github-actions

Copy link
Copy Markdown
Contributor

Jest Test Coverage

Coverage Summary

Lines Statements Branches Functions
Coverage: 81%
81.71% (35138/42999) 82.92% (3734/4503) 68.04% (1037/1524)

This branch had an error being deployed

1 failed deployment
Preview — 6605ba72 Deployed Aug 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant