9.0 KiB
9.0 KiB
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[email protected]. - 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)fromSmtpOptions.plushealthtech/Mail/SmtpOptions.cs— binds the"Smtp"config section (Host/Port/From/To; From/To default to empty).Program.cs— already registersConfigure<SmtpOptions>("Smtp")+AddSingleton<MailSender>().Pages/ClinicalDecisionSupport.cshtml.cs— PageModel exists, the.cshtmlview is missing (route 404s until added).
- Gap: no
"Smtp"section inappsettings.json→From/Toare empty → a form submission today would throw inMailSender. - 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
- No new dependencies. Razor Pages +
System.Net.Mail.SmtpClient(already in the shared framework) + DataAnnotations validation. No auth package. - Reuse the existing
Mail/infrastructure as-is; only the missing config section is added. - SMTP target:
tools.host.domain:1025, no TLS, no credentials (MailPit). Recipient[email protected]. From:[email protected](assumed — MailPit doesn't validate the sender; it lives in one place,appsettings.json, easy to change). - 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.
- Privacy Policy keeps its existing route
/Privacy(page already exists); only the placeholder content is replaced. - Copy for About / Careers / Terms / Privacy is standard corporate boilerplate aligned to
Design.MD— flagged for a legal/brand review before production. - Mobile menu gets a minimal vanilla-JS toggle so the new nav links are actually reachable on small screens.
- 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 +
#interoperabilitysection copy (FHIR®/HL7v2, alerting, point-of-care guidance); CTA band →/RequestDemo. Veterinary page uses thebrand-vet(#0d9488) accent perDesign.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 (
[email protected]), 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:"Smtp": { "Host": "tools.host.domain", "Port": 1025, "From": "[email protected]", "To": "[email protected]" } -
Form →
OnPost(antiforgery token,ModelStatecheck) →MailSender.SendAsync(subject, body):- Contact subject:
New contact form message — {Name} - Demo subject:
New demo request — {Organization} - Body: plain-text, one
Field: valueline per field, then the message.
- Contact subject:
-
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'sid="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
<details>) 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)
dotnet build plushealthtech.sln→ 0 errors / 0 warnings.dotnet run --project plushealthtech→ walk navbar (desktop and mobile), footer, Index CTAs; every link resolves (no#left except the#solutions/#interoperabilityin-page anchors).- Submit both forms → messages appear in MailPit (Web UI /
mailpit api) addressed to[email protected]; app log shows theMail sent to …line; error path (MailPit down) renders the friendly banner. /Privacyshows the new policy, not the template text.- 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.domainmust be resolvable from wherever the app runs (local dev vs. the10.10.0.90container 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.