# Site Expansion Plan — New Pages, Forms & MailPit Delivery Status: Ready for execution — 2026-08-20 ## 1. Objective Grow the Plus Health Tech site from a single landing page into a multi-page site: - Add **10 linked pages**: About Us, Careers, Contact, Privacy Policy, Terms & Conditions, Sign In, Request Demo, Clinical Decision Support, Patient Management, Veterinarian Solutions. - **Contact** and **Request Demo** get forms that send email via plain SMTP (no credentials) to a MailPit server at **`tools.host.domain:1025`**, recipient **`alerts@plushealthtech.local`**. - Wire every page into the navbar, footer, and the Index hero / solution-card CTAs (no dead `#` links left). ## 2. Current state (audited 2026-08-20) - `dotnet build plushealthtech.sln` — **green** (0 warnings / 0 errors). - Pages that exist: `Index` (landing), `Privacy` (template placeholder text), `Error`. - **In-progress work already in the working tree** (do not recreate): - `plushealthtech/Mail/MailSender.cs` — `SmtpClient`, `EnableSsl = false`, no auth, `SendAsync(subject, body)` from `SmtpOptions`. - `plushealthtech/Mail/SmtpOptions.cs` — binds the `"Smtp"` config section (Host/Port/From/To; From/To default to empty). - `Program.cs` — already registers `Configure("Smtp")` + `AddSingleton()`. - `Pages/ClinicalDecisionSupport.cshtml.cs` — PageModel exists, **the `.cshtml` view is missing** (route 404s until added). - **Gap**: no `"Smtp"` section in `appsettings.json` → `From`/`To` are empty → a form submission today would throw in `MailSender`. - Link rot today: navbar `Sign In` / `Request Demo` → `#contact` (footer id); footer links all → `#`; Index hero CTA → `#contact`; solution-card "Learn more" links → `#`. - Mobile menu button has **no JS** (no-op) — pre-existing defect worth fixing while we touch the nav. - Styling: Tailwind v4 local bundle only; brand tokens (`brand`, `brand-dark`, `brand-light`, `brand-accent`, `brand-vet`) already defined. ## 3. Decisions & assumptions 1. **No new dependencies.** Razor Pages + `System.Net.Mail.SmtpClient` (already in the shared framework) + DataAnnotations validation. No auth package. 2. **Reuse the existing `Mail/` infrastructure** as-is; only the missing config section is added. 3. **SMTP target**: `tools.host.domain:1025`, no TLS, no credentials (MailPit). Recipient `alerts@plushealthtech.local`. **From: `no-reply@plushealthtech.local`** (assumed — MailPit doesn't validate the sender; it lives in one place, `appsettings.json`, easy to change). 4. **Sign In is a placeholder page.** The repo has no auth (per CLAUDE.md); the page says sign-in is coming soon and offers Request Demo / Contact CTAs. Real authentication is a separate project. 5. **Privacy Policy keeps its existing route** `/Privacy` (page already exists); only the placeholder content is replaced. 6. **Copy** for About / Careers / Terms / Privacy is standard corporate boilerplate aligned to `Design.MD` — flagged for a legal/brand review before production. 7. **Mobile menu gets a minimal vanilla-JS toggle** so the new nav links are actually reachable on small screens. 8. **Footer newsletter input stays decorative** — no endpoint was specified for it; out of scope. ## 4. Route map | Page | File(s) | Route | |---|---|---| | Clinical Decision Support | `Pages/ClinicalDecisionSupport.cshtml` (`.cs` already exists) | `/ClinicalDecisionSupport` | | Patient Management | `Pages/PatientManagement.cshtml` + `.cs` | `/PatientManagement` | | Veterinarian Solutions | `Pages/Veterinary.cshtml` + `.cs` | `/Veterinary` | | About Us | `Pages/About.cshtml` + `.cs` | `/About` | | Careers | `Pages/Careers.cshtml` + `.cs` | `/Careers` | | Contact (form) | `Pages/Contact.cshtml` + `.cs` | `/Contact` | | Request Demo (form) | `Pages/RequestDemo.cshtml` + `.cs` | `/RequestDemo` | | Sign In (placeholder) | `Pages/SignIn.cshtml` + `.cs` | `/SignIn` | | Terms & Conditions | `Pages/Terms.cshtml` + `.cs` | `/Terms` | | Privacy Policy (content refresh) | `Pages/Privacy.cshtml` (existing) | `/Privacy` | ## 5. Page specs (summary) - **Product pages (CDS, Patient Management, Veterinary)** — hero with one-line value prop; 3–4 feature cards reusing Index card copy + `#interoperability` section copy (FHIR®/HL7v2, alerting, point-of-care guidance); CTA band → `/RequestDemo`. Veterinary page uses the `brand-vet` (`#0d9488`) accent per `Design.MD`. - **About Us** — mission, three product pillars (each linking to its page), values, CTA → `/RequestDemo`. - **Careers** — culture & expectations, "how to apply" pointing at `/Contact` (no job-board data exists). - **Terms & Conditions** — boilerplate sections, including a clinical-software disclaimer (CDS is decision support, not a substitute for professional judgment). - **Privacy Policy** — data collected by the two forms, where it goes (`alerts@plushealthtech.local`), third parties (cdnjs, analytics.rokoh.com), cookies, contact. - **Sign In** — centered card: sign-in coming soon + CTAs. - **Contact** — form: Name*, Work Email*, Organization, Phone, Message*. Success panel on send; friendly error on SMTP failure (details logged). - **Request Demo** — form: Name*, Work Email*, Organization*, Practice Type (select), Products of Interest (select), Message (optional). Same send/success/error behavior. ## 6. Mail spec - Config in `appsettings.json`: ```json "Smtp": { "Host": "tools.host.domain", "Port": 1025, "From": "no-reply@plushealthtech.local", "To": "alerts@plushealthtech.local" } ``` - Form → `OnPost` (antiforgery token, `ModelState` check) → `MailSender.SendAsync(subject, body)`: - Contact subject: `New contact form message — {Name}` - Demo subject: `New demo request — {Organization}` - Body: plain-text, one `Field: value` line per field, then the message. - SMTP exception → re-render with a generic "message could not be sent, please email us directly" banner; exception logged, never surfaced. ## 7. Navigation & link plan - **Desktop nav** (replaces current anchor links): CDS → `/ClinicalDecisionSupport` · Patient Management → `/PatientManagement` · Veterinary → `/Veterinary` · About → `/About` · Careers → `/Careers` · Contact → `/Contact` · Blog (external, keep). - **CTA buttons**: Sign In → `/SignIn` · Request Demo → `/RequestDemo`. - **Footer**: Solutions column → 3 product routes; Company column → `/About`, `/Careers`, `/Contact`; new **Legal** column → `/Privacy`, `/Terms`. Remove the footer's `id="contact"` (nothing may target it anymore). - **Index**: hero "Explore Platform" → `/RequestDemo`; "View Solutions" keeps `#solutions`; the three solution-card links → the product routes. - **Mobile menu**: small vanilla-JS toggle in the layout (or `
`) so nav is reachable on mobile. ## 8. Task list (files in `task/`, in recommended order) | # | Task file | Scope | Depends on | |---|---|---|---| | 01 | `task/01-smtp-mail-configuration.md` | `Smtp` config section; confirm MailPit delivery path | — | | 02 | `task/02-contact-page.md` | `/Contact` + form | 01 | | 03 | `task/03-request-demo-page.md` | `/RequestDemo` + form | 01 | | 04 | `task/04-clinical-decision-support-page.md` | CDS view (PageModel exists) | — | | 05 | `task/05-patient-management-page.md` | `/PatientManagement` | — | | 06 | `task/06-veterinary-solutions-page.md` | `/Veterinary` | — | | 07 | `task/07-about-us-page.md` | `/About` | — | | 08 | `task/08-careers-page.md` | `/Careers` | — | | 09 | `task/09-terms-and-conditions-page.md` | `/Terms` | — | | 10 | `task/10-sign-in-page.md` | `/SignIn` placeholder | — | | 11 | `task/11-privacy-policy-content.md` | `/Privacy` content refresh | — | | 12 | `task/12-navigation-footer-cta-links.md` | layout + Index links, mobile menu | 02–11 | | 13 | `task/13-verification-and-final-checks.md` | build, link sweep, e2e mail test | all | Tasks 02–11 are independent of each other (02/03 need 01) and can be done in any order or by parallel contributors. ## 9. Verification (task 13) 1. `dotnet build plushealthtech.sln` → 0 errors / 0 warnings. 2. `dotnet run --project plushealthtech` → walk navbar (desktop **and** mobile), footer, Index CTAs; every link resolves (no `#` left except the `#solutions` / `#interoperability` in-page anchors). 3. Submit both forms → messages appear in MailPit (Web UI / `mailpit api`) addressed to `alerts@plushealthtech.local`; app log shows the `Mail sent to …` line; error path (MailPit down) renders the friendly banner. 4. `/Privacy` shows the new policy, not the template text. 5. No changes needed to the Dockerfile / Gitea workflow — the image pipeline already rebuilds CSS and ships everything in `wwwroot` + the app. ## 10. Risks / open items - `tools.host.domain` must be resolvable from wherever the app runs (local dev vs. the `10.10.0.90` container host). If it only resolves in the internal network, dev machines may need a hosts entry — confirm during task 01. - Sign In placeholder: if a real portal is planned, that's a separate project (auth + account backend) and page 10 will be the integration point. - Terms/Privacy copy is boilerplate until reviewed.