diff --git a/.agents/skills/find-skills/SKILL.md b/.agents/skills/find-skills/SKILL.md
new file mode 100644
index 0000000..a41bdd0
--- /dev/null
+++ b/.agents/skills/find-skills/SKILL.md
@@ -0,0 +1,141 @@
+---
+name: find-skills
+description: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
+---
+
+# Find Skills
+
+This skill helps you discover and install skills from the open agent skills ecosystem.
+
+## When to Use This Skill
+
+Use this skill when the user:
+
+- Asks "how do I do X" where X might be a common task with an existing skill
+- Says "find a skill for X" or "is there a skill for X"
+- Asks "can you do X" where X is a specialized capability
+- Expresses interest in extending agent capabilities
+- Wants to search for tools, templates, or workflows
+- Mentions they wish they had help with a specific domain (design, testing, deployment, etc.)
+
+## What is the Skills CLI?
+
+The Skills CLI (`npx skills`) is the package manager for the open agent skills ecosystem. Skills are modular packages that extend agent capabilities with specialized knowledge, workflows, and tools.
+
+**Key commands:**
+
+- `npx skills find [query] [--owner ]` - Search for skills interactively or by keyword, optionally scoped to a GitHub owner
+- `npx skills add ` - Install a skill from GitHub or other sources
+- `npx skills update` - Update all installed skills
+
+**Browse skills at:** https://skills.sh/
+
+## How to Help Users Find Skills
+
+### Step 1: Understand What They Need
+
+When a user asks for help with something, identify:
+
+1. The domain (e.g., React, testing, design, deployment)
+2. The specific task (e.g., writing tests, creating animations, reviewing PRs)
+3. Whether this is a common enough task that a skill likely exists
+
+### Step 2: Check the Leaderboard First
+
+Before running a CLI search, check the [skills.sh leaderboard](https://skills.sh/) to see if a well-known skill already exists for the domain. The leaderboard ranks skills by total installs, surfacing the most popular and battle-tested options.
+
+For example, top skills for web development include:
+- `vercel-labs/agent-skills` — React, Next.js, web design (100K+ installs each)
+- `anthropics/skills` — Frontend design, document processing (100K+ installs)
+
+### Step 3: Search for Skills
+
+If the leaderboard doesn't cover the user's need, run the find command:
+
+```bash
+npx skills find [query] [--owner ]
+```
+
+For example:
+
+- User asks "how do I make my React app faster?" → `npx skills find react performance`
+- User asks "can you help me with PR reviews?" → `npx skills find pr review`
+- User asks "I need to create a changelog" → `npx skills find changelog`
+
+### Step 4: Verify Quality Before Recommending
+
+**Do not recommend a skill based solely on search results.** Always verify:
+
+1. **Install count** — Prefer skills with 1K+ installs. Be cautious with anything under 100.
+2. **Source reputation** — Official sources (`vercel-labs`, `anthropics`, `microsoft`) are more trustworthy than unknown authors.
+3. **GitHub stars** — Check the source repository. A skill from a repo with <100 stars should be treated with skepticism.
+
+### Step 5: Present Options to the User
+
+When you find relevant skills, present them to the user with:
+
+1. The skill name and what it does
+2. The install count and source
+3. The install command they can run
+4. A link to learn more at skills.sh
+
+Example response:
+
+```
+I found a skill that might help! The "react-best-practices" skill provides
+React and Next.js performance optimization guidelines from Vercel Engineering.
+(185K installs)
+
+To install it:
+npx skills add vercel-labs/agent-skills@react-best-practices
+
+Learn more: https://skills.sh/vercel-labs/agent-skills/react-best-practices
+```
+
+### Step 6: Offer to Install
+
+If the user wants to proceed, you can install the skill for them:
+
+```bash
+npx skills add -g -y
+```
+
+The `-g` flag installs globally (user-level) and `-y` skips confirmation prompts.
+
+## Common Skill Categories
+
+When searching, consider these common categories:
+
+| Category | Example Queries |
+| --------------- | ---------------------------------------- |
+| Web Development | react, nextjs, typescript, css, tailwind |
+| Testing | testing, jest, playwright, e2e |
+| DevOps | deploy, docker, kubernetes, ci-cd |
+| Documentation | docs, readme, changelog, api-docs |
+| Code Quality | review, lint, refactor, best-practices |
+| Design | ui, ux, design-system, accessibility |
+| Productivity | workflow, automation, git |
+
+## Tips for Effective Searches
+
+1. **Use specific keywords**: "react testing" is better than just "testing"
+2. **Try alternative terms**: If "deploy" doesn't work, try "deployment" or "ci-cd"
+3. **Check popular sources**: Many skills come from `vercel-labs/agent-skills` or `ComposioHQ/awesome-claude-skills`
+
+## When No Skills Are Found
+
+If no relevant skills exist:
+
+1. Acknowledge that no existing skill was found
+2. Offer to help with the task directly using your general capabilities
+3. Suggest the user could create their own skill with `npx skills init`
+
+Example:
+
+```
+I searched for skills related to "xyz" but didn't find any matches.
+I can still help you with this task directly! Would you like me to proceed?
+
+If this is something you do often, you could create your own skill:
+npx skills init my-xyz-skill
+```
diff --git a/.agents/skills/frontend-design/LICENSE.txt b/.agents/skills/frontend-design/LICENSE.txt
new file mode 100644
index 0000000..f433b1a
--- /dev/null
+++ b/.agents/skills/frontend-design/LICENSE.txt
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/.agents/skills/frontend-design/SKILL.md b/.agents/skills/frontend-design/SKILL.md
new file mode 100644
index 0000000..decdff4
--- /dev/null
+++ b/.agents/skills/frontend-design/SKILL.md
@@ -0,0 +1,55 @@
+---
+name: frontend-design
+description: Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.
+license: Complete terms in LICENSE.txt
+---
+
+# Frontend Design
+
+Approach this as the design lead at a small studio known for giving every client a visual identity that could not be mistaken for anyone else's. This client has already rejected proposals that felt templated, and is paying for a distinctive point of view: make deliberate, opinionated choices about palette, typography, and layout that are specific to this brief, and take one real aesthetic risk you can justify.
+
+## Ground it in the subject
+
+If the brief does not pin down what the product or subject is, pin it yourself before designing: name one concrete subject, its audience, and the page's single job, and state your choice. If there's any information in your memory about the human's preferences, context about what they're building, or designs you've made before – use that as a hint. The subject's own world, its materials, instruments, artifacts, and vernacular, is where distinctive choices come from. Build with the brief's real content and subject matter throughout.
+
+## Design principles
+
+For web designs, the hero is a thesis. Open with the most characteristic thing in the subject's world, in whatever form makes sense for it: a headline, an image, an animation, a live demo, an interactive moment. Be deliberate with your choice: a big number with a small label, supporting stats, and a gradient accent is the template answer, only use if that's truly the best option.
+
+Typography carries the personality of the page. Pair the display and body faces deliberately, not the same families you would reach for on any other project, and set a clear type scale with intentional weights, widths, and spacing. Make the type treatment itself a memorable part of the design, not a neutral delivery vehicle for the content.
+
+Structure is information. Structural devices, numbering, eyebrows, dividers, labels, should encode something true about the content, not decorate it. Many generic designs use numbered markers (01 / 02 / 03), but that's only appropriate if the content actually is a sequence - like a real process or a typed timeline where order carries information the reader needs. Question if choices like numbered markers actually make sense before incorporating them.
+
+Leverage motion deliberately. Think about where and if animation can serve the subject: a page-load sequence, a scroll-triggered reveal, hover micro-interactions, ambient atmosphere. An orchestrated moment usually lands harder than scattered effects; choose what the direction calls for. However, sometimes less is more, and extra animation contributes to the feeling that the design is AI-generated.
+
+Match complexity to the vision. Maximalist directions need elaborate execution; minimal directions need precision in spacing, type, and detail. Elegance is executing the chosen vision well.
+
+Consider written content carefully. Often a design brief may not contain real content, and it's up to you to come up with copy. Copy can make a design feel as templated as the design itself. See the below section on writing for more guidance.
+
+## Process: brainstorm, explore, plan, critique, build, critique again
+
+For calibration: AI-generated design right now clusters around three looks: (1) a warm cream background (near #F4F1EA) with a high-contrast serif display and a terracotta accent; (2) a near-black background with a single bright acid-green or vermilion accent; (3) a broadsheet-style layout with hairline rules, zero border-radius, and dense newspaper-like columns. All three are legitimate for some briefs, but they are defaults rather than choices, and they appear regardless of subject. Where the brief pins down a visual direction, follow it exactly — the brief's own words always win, including when it asks for one of these looks. Where it leaves an axis free, don't spend that freedom on one of these defaults. Just like a human designer who's hired, there's often a careful balance between doing what you're good at and taking each project as a chance to experiment and learn.
+
+Work in two passes. First, brainstorm a short design plan based on the human's design brief: create a compact token system with color, type, layout, and signature. Color: describe the palette as 4–6 named hex values. Type: the typefaces for 2+ roles (a characterful display face that's used with restraint, a complementary body face, and a utility face for captions or data if needed). Layout: a layout concept, using one-sentence prose descriptions and ASCII wireframes to ideate and compare. Signature: the single unique element this page will be remembered by that embodies the brief in an appropriate way.
+
+Then review that plan against the brief before building: if any part of it reads like the generic default you would produce for any similar page (work through a similar prompt to see if you arrive somewhere similar) rather than a choice made for this specific brief — revise that part, say what you changed and why. Only after you've confirmed the relative uniqueness of your design plan should you start to write the code, following the revised plan exactly and deriving every color and type decision from it.
+
+When writing the code, be careful of structuring your CSS selector specificities. It's easy to generate CSS classes that cancel each other out (especially with a type-based selector like .section and a element-based selector like .cta). This can happen often with paddings/margins between sections.
+
+Try to do a lot of this planning and iteration in your thinking, and only show ideas to the user when you have higher confidence it'll delight them.
+
+## Restraint and self-critique
+
+Spend your boldness in one place. Let the signature element be the one memorable thing, keep everything around it quiet and disciplined, and cut any decoration that does not serve the brief. Not taking a risk can be a risk itself! Build to a quality floor without announcing it: responsive down to mobile, visible keyboard focus, reduced motion respected. Critique your own work as you build, taking screenshots if your environment supports it – a picture is worth 1000 tokens. Consider Chanel's advice: before leaving the house, take a look in the mirror and remove one accessory. Human creators have memory and always try to do something new, so if you have a space to quickly jot down notes about what you've tried, it can help you in future passes.
+
+## More on writing in design
+
+Words appear in a design for one reason: to make it easier to understand, and therefore easier to use. They are design material, not decoration. Bring the same intentionality to copy that you would bring to spacing and color. Before writing anything, ask what the design needs to say, and how it can best be said to help the person navigate the experience.
+
+Write from the end user's side of the screen. Name things by what people control and recognize, never by how the system is built. A person manages notifications, not webhook config. Describe what something does in plain terms rather than selling it. Being specific is always better than being clever.
+
+Use active voice as default. A control should say exactly what happens when it's used: "Save changes," not "Submit." An action keeps the same name through the whole flow, so the button that says "Publish" produces a toast that says "Published." The vocabulary of an interface is the signposting for someone navigating the product. Cohesion and consistency are how people learn their way around.
+
+Treat failure and emptiness as moments for direction, not mood. Explain what went wrong and how to fix it, in the interface's voice rather than a person's. Errors don't apologize, and they are never vague about what happened. An empty screen is an invitation to act.
+
+Keep the register conversational and tuned: plain verbs, sentence case, no filler, with tone matched to the brand and the audience. Let each element do exactly one job. A label labels, an example demonstrates, and nothing quietly does double duty.
diff --git a/CLAUDE.md b/CLAUDE.md
index 8890da3..2a0e423 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Overview
-plushealthtech is a corporate landing site: a single-project ASP.NET Core Razor Pages app on .NET 10 (`net10.0`). There are no controllers, database, auth, or external APIs — all content lives in Razor Pages and static assets under `wwwroot`.
+plushealthtech is a corporate landing site: a single-project ASP.NET Core Razor Pages app on .NET 10 (`net10.0`). There are no controllers, database, auth, or external APIs — all content lives in Razor Pages and static assets under `wwwroot`. The company is Plus Health Tech: interoperable Clinical Decision Support (CDS), Patient Management software, and Veterinary tech (see `Design.MD` for brand positioning).
## Commands
@@ -19,13 +19,15 @@ Run from the repo root (the solution directory).
## Architecture
- `plushealthtech/` is the only project. `Program.cs` is the entire pipeline: `AddRazorPages()`, HTTPS redirect, static files — new services would be registered there.
-- Pages use the Razor Pages convention: `Pages/.cshtml` + `.cshtml.cs` (a PageModel). Existing: `Index` (logo hero), `Privacy`, `Error`, and the shared `Shared/_Layout.cshtml`. There are no areas or controllers.
-- Shared chrome and branding: `Pages/Shared/_Layout.cshtml` (navbar with Home + external blog link, footer). Styling is a **Tailwind v4** bundle: source `wwwroot/css/tailwind.input.css` (CSS-first `@theme` with brand colors — `brand` `#1c8098`, `brand-dark` `#145f72`, `brand-light` `#e6f2f5`, `brand-accent` `#0ea5e9`, `brand-vet` `#0d9488`), built by the Tailwind CLI into `wwwroot/css/tailwind.css` and linked in the layout ``. `wwwroot/css/site.css` holds legacy CSS custom properties (`.bg-blue` = `#1c8098`). The layout `` also loads an external analytics script from analytics.rokoh.com.
+- Pages use the Razor Pages convention: `Pages/.cshtml` + `.cshtml.cs` (a PageModel). Existing: `Index` (the full landing page: hero, `#solutions` cards incl. a `#veterinary` card, `#interoperability` section), `Privacy`, `Error`, and the shared `Shared/_Layout.cshtml`. There are no areas or controllers.
+- Shared chrome: `Pages/Shared/_Layout.cshtml` — sticky glassmorphism navbar (anchor links `#solutions`/`#interoperability`/`#veterinary`/`#about`, external blog link to blog.plushealthtech.com, Sign In / Request Demo CTAs pointing at `#contact`, which is the footer's id), and a dark footer. Note the **header logo is hotlinked from the production domain** (`https://www.plushealthtech.com/img/plushealthtech-logo.png`) while the footer uses the local `~/img/` copy.
+- Styling is a **Tailwind v4** bundle only: source `wwwroot/css/tailwind.input.css` (CSS-first `@theme` with brand colors — `brand` `#1c8098`, `brand-dark` `#145f72`, `brand-light` `#e6f2f5`, `brand-accent` `#0ea5e9`, `brand-vet` `#0d9488`), built by the Tailwind CLI into `wwwroot/css/tailwind.css` and linked in the layout ``. `wwwroot/css/site.css`, `wwwroot/js/site.js`, and the vendored Bootstrap/jQuery in `wwwroot/lib` are **template leftovers linked from no page** — don't build on them.
+- External runtime dependencies in the layout ``: Font Awesome 6.4.0 from cdnjs (icons used throughout the markup) and an analytics script from analytics.rokoh.com.
- Brand and UI design guidelines live in `Design.MD` (color palette with `#1c8098` as brand core, typography, component/layout conventions) — follow it when adding or restyling pages.
-- Client libraries (Bootstrap, jQuery, jquery-validation) are vendored in `wwwroot/lib`; logo and favicon are in `wwwroot/img/`.
## Deployment
-- Pushes to Gitea (gitea.rokoh.com) run the Gitea Actions workflow: build the Docker image → push `registry.rokoh.com/plushealthtech:latest` → SSH into `10.10.0.90` and run the container with `-p 7000:80 --restart=always`. Registry and server credentials come from Gitea secrets, not the repo.
+- Pushes to Gitea (gitea.rokoh.com) run the Gitea Actions workflow: build the Docker image → push `registry.rokoh.com/plushealthtech:latest` → SSH into `10.10.0.90` and run the container with `-p 7000:8080 --restart=always`. **The app listens on 8080 inside the container** (the .NET aspnet image's default `ASPNETCORE_HTTP_PORTS`); the Dockerfile's `EXPOSE 80/443` is stale and not the port the container serves. Don't "fix" the workflow to 80 to match the EXPOSE.
+- Registry and server credentials come from Gitea secrets, not the repo.
- The workflow file exists in **two identical copies**: `.gitea/workflows/default.yml` (the one Gitea reads) and `plushealthtech/.gitea/workflows/default.yml` (referenced from the csproj as ``). Keep them in sync when editing either.
-- The Dockerfile is multi-stage (node frontend → restore → build → publish → aspnet runtime), exposes 80/443, entrypoint `dotnet plushealthtech.dll`. The `frontend` stage runs `npm ci && npm run build:css` and feeds the generated `wwwroot/css/tailwind.css` into the dotnet build, so the image always ships freshly compiled CSS.
+- The Dockerfile is multi-stage (node `frontend` builds CSS → `build` → `publish` with `UseAppHost=false` → `final` runtime), entrypoint `dotnet plushealthtech.dll`. The `frontend` stage runs `npm ci && npm run build:css` and feeds the generated `wwwroot/css/tailwind.css` into the dotnet build, so the image always ships freshly compiled CSS.
diff --git a/cj.txt b/cj.txt
new file mode 100644
index 0000000..75491c0
--- /dev/null
+++ b/cj.txt
@@ -0,0 +1,5 @@
+# Netscape HTTP Cookie File
+# https://curl.se/docs/http-cookies.html
+# This file was generated by libcurl! Edit at your own risk.
+
+#HttpOnly_localhost FALSE / FALSE 0 .AspNetCore.Antiforgery.wRylZNat_hI CfDJ8LGyuqR4T-5Fs6kPeIwHZi_d7o1i8jGqa9T8fS8yz2y9SPXl5luQoltl_9zXP0-VKwWcj0S866UE4uvN1jEH3kCZ2kC6ZTnryE8ybS3EdbzE8R8W4OhKV_uoioIWhzjiMNMJLHIcu2ArZlZf8T-Izj0
diff --git a/plan/plan.md b/plan/plan.md
new file mode 100644
index 0000000..78064ef
--- /dev/null
+++ b/plan/plan.md
@@ -0,0 +1,123 @@
+# 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.
diff --git a/plushealthtech/Mail/MailSender.cs b/plushealthtech/Mail/MailSender.cs
new file mode 100644
index 0000000..1b85166
--- /dev/null
+++ b/plushealthtech/Mail/MailSender.cs
@@ -0,0 +1,39 @@
+using System.Net.Mail;
+using Microsoft.Extensions.Options;
+
+namespace plushealthtech.Mail
+{
+ ///
+ /// Sends outbound email through the configured SMTP server (MailPit in local
+ /// development). No authentication is used.
+ ///
+ public class MailSender
+ {
+ private readonly SmtpOptions _options;
+ private readonly ILogger _logger;
+
+ public MailSender(IOptions options, ILogger logger)
+ {
+ _options = options.Value;
+ _logger = logger;
+ }
+
+ public async Task SendAsync(string subject, string body)
+ {
+ using var client = new SmtpClient(_options.Host, _options.Port)
+ {
+ EnableSsl = false
+ };
+
+ var message = new MailMessage(_options.From, _options.To)
+ {
+ Subject = subject,
+ Body = body,
+ IsBodyHtml = false
+ };
+
+ await client.SendMailAsync(message);
+ _logger.LogInformation("Mail sent to {To} (subject: {Subject})", _options.To, subject);
+ }
+ }
+}
diff --git a/plushealthtech/Mail/SmtpOptions.cs b/plushealthtech/Mail/SmtpOptions.cs
new file mode 100644
index 0000000..ddd58fe
--- /dev/null
+++ b/plushealthtech/Mail/SmtpOptions.cs
@@ -0,0 +1,13 @@
+namespace plushealthtech.Mail
+{
+ ///
+ /// SMTP settings bound from the "Smtp" section of appsettings.json.
+ ///
+ public class SmtpOptions
+ {
+ public string Host { get; set; } = "localhost";
+ public int Port { get; set; } = 1025;
+ public string From { get; set; } = string.Empty;
+ public string To { get; set; } = string.Empty;
+ }
+}
diff --git a/plushealthtech/Pages/About.cshtml b/plushealthtech/Pages/About.cshtml
new file mode 100644
index 0000000..ce0db72
--- /dev/null
+++ b/plushealthtech/Pages/About.cshtml
@@ -0,0 +1,154 @@
+@page
+@model AboutModel
+@{
+ ViewData["Title"] = "About Us";
+}
+
+
+
+
+
+
+ About Plus Health Tech
+
+
+ Clinical software built on trust, precision, and care
+
+
+ Plus Health Tech builds interoperable clinical software for people and the animals they care for — decision support, patient management, and veterinary platforms that stay connected to the systems where care already happens.
+
+
+
+
+
+
+
+
+
+
What We Do
+
One platform strategy, three product pillars
+
Every product we build shares the same foundation: open standards, evidence-based logic, and a deep respect for the people using it at the point of care.
These aren't wall posters — they're the constraints we design against, in every product, from the first architecture decision to the last line of a care alert.
+
+
+
+
+
+
+
+
+
Interoperability by default
+
+ FHIR® and HL7v2 are our starting point, not an add-on — your data moves between systems without rip-and-replace or parallel records.
+
+
+
+
+
+
+
+
+
Evidence-based
+
+ Every recommendation traces back to current clinical evidence — not guesswork, not vendor opinion, not a black box.
+
+
+
+
+
+
+
+
+
Patient-first
+
+ Human or animal, the patient is who we build for. The software is in service of the care — never the other way around.
+
+
+
+
+
+
+
+
+
Built with clinicians
+
+ Doctors, nurses, and veterinarians shape our roadmaps — tools that respect how care actually works on a busy day.
+
+
+
+
+
+
+
+
+
+
+
See the platform in action
+
+ Book a walkthrough with our team and watch decision support, patient management, and interoperability run the way your care setting actually operates.
+
+ Build the future of interoperable clinical software
+
+
+ We're a small, product-focused team building decision support, patient management, and veterinary platforms that keep the systems where care happens connected. If that's the kind of work you want to do, we'd love to hear from you.
+
+
+
+
+
+
+
+
+
+
Why Join Us
+
Do work that matters, on a team that ships
+
We build software that sits at the point of care, so the bar for quality is high — and the payoff is seeing it used every day. Here's what working with us looks like.
+
+
+
+
+
+
+
+
+
Mission-driven work
+
+ The software we build touches real care, every day. You'll see the line between a well-placed piece of code and better decisions at the point of care.
+
+
+
+
+
+
+
+
+
Clinical + technical collaboration
+
+ We build alongside clinicians and veterinarians, not just for them — so the tools we ship respect how care actually works on a busy day.
+
+
+
+
+
+
+
+
+
Modern .NET stack
+
+ A current, well-supported stack — .NET 10, Razor Pages, and Tailwind CSS — so your energy goes into the product, not into fighting the tooling.
+
+
+
+
+
+
+
+
+
Ways of working that fit life
+
+ We're pragmatic about how and where work happens, and we keep the process lean so the team can stay focused on shipping quality software.
+
+
+
+
+
+
+
+
+
+
+
+ How to Apply
+
+
We're not running a public job board right now
+
+ Tell us about yourself via the Contact page and we'll be in touch. Whether you have a role in mind or just want to introduce yourself, we read every note.
+
Real-time recommendations built on live patient data — engineered to catch risk early and keep every treatment choice aligned with current evidence.
+
+
+
+
+
+
+
+
+
Error Reduction by Design
+
+ Every order, dose, and result is cross-checked against intelligent, evidence-based algorithms the moment it enters the chart — flagging unsafe combinations, duplicates, and allergies before they reach the patient.
+
+
+
+
+
+
+
+
+
Optimized Treatment Choices
+
+ Recommendations weigh current guidelines, live lab values, and documented history to surface the therapies most likely to work for the patient in front of you.
+
+
+
+
+
+
+
+
+
Alerts That Fit the Workflow
+
+ Smart, low-noise alerts arrive inside the EHR where care is already happening — no extra tab to switch to, no broken flow, no alert fatigue.
+
+
+
+
+
+
+
+
+
FHIR® & HL7v2 Native
+
+ Built on open healthcare standards, so guidance is generated from the complete clinical picture — labs, pharmacy, history, and beyond.
+
+
+
+
+
+
+
+
+
+
+
+ Standards-Based Exchange
+
Connected to the systems you already run
+
+ Guidance is only as strong as the data behind it. Plus Health Tech exchanges structured messaging with your EHR, labs, pharmacy, and registries through FHIR® and HL7v2 — so every recommendation reflects the complete, current clinical picture.
+
+
+
+ FHIR® R4 resources & HL7v2 messaging
+
+
+ Encrypted, enterprise-grade data exchange
+
+
+ Real-time synchronization across care sites
+
+
+
+
+
+ Message Exchange
+ ACK · 200 OK
+
+
+
+
IN · HL7v2 lab result
+
OBR|1|ORD-48213|LAB-88910^LIS||Potassium|Stat
+
+
+
OUT · FHIR® CDS recommendation
+
"code": "renal-dosing-review", "status": "active"
+
+
+
Structured messaging in both directions — no point-to-point integrations to maintain.
+
+
+
+
+
+
+
+
+
+
See CDS working in your workflow
+
+ Book a walkthrough with our clinical team and watch live decision support run against the way your care setting actually operates.
+
+ End-to-end patient workflow, from intake to discharge
+
+
+ One connected platform for registration, scheduling, and every touchpoint in between — so your team maximizes clinic efficiency and keeps communication channels transparent.
+
Every step of the patient journey, one connected workflow
+
From the front desk to final follow-up — purpose-built tools that keep intake, scheduling, communication, and clinical handoffs moving smoothly.
+
+
+
+
+
+
+
+
+
Intake & Registration
+
+ Capture demographics, insurance, and medical history once — then carry it across every visit, so check-in is fast and the chart is complete from the first minute.
+
+
+
+
+
+
+
+
+
Scheduling & Capacity
+
+ Balance provider calendars, room availability, and waitlists in one view — reducing no-shows and keeping appointment flow steady through the busiest days.
+
+
+
+
+
+
+
+
+
Transparent Patient Communication
+
+ Keep patients informed through the channels they already use — reminders, results, and status updates delivered clearly, so unanswered questions never stall care.
+
+
+
+
+
+
+
+
+
EHR Integration, FHIR®-Ready
+
+ Connects to the EHRs and systems you already run through FHIR®-ready exchange — no rip-and-replace, no parallel charts, no data silos.
+
+
+
+
+
+
+
+
+
+
+
See patient management working in your workflow
+
+ Book a walkthrough with our team and watch the full intake-to-discharge flow run against the way your practice actually operates.
+
Use this page to detail your site's privacy policy.
+
+
+
+
+
+ Privacy
+
+
+ Privacy, handled with care
+
+
+ We keep this site deliberately simple, and our data collection with it. Here's exactly what we collect when you get in touch, what we do with it, and what you can ask us to do.
+
+
+
+
+
+
+
+
+
+
+
+
+
Information we collect
+
+ Most of this site is read-only — you can browse it without giving us anything. When you send a message through the Contact page or request a demo, we collect only what those forms ask for: your name, work email, and organization; your phone number on the Contact form; and, on the demo form, your practice type, the products you're interested in, and any additional notes. Fields marked * are the only ones we require. We don't collect patient or animal health information here — this is a company website, not a clinical system.
+
+
+
+
+
+
+
+
How we use it
+
+ Your details are used for one purpose: to respond to you. Contact messages and demo requests are delivered to our team mailbox (alerts@plushealthtech.local), and we reply to the email address you provided. We don't sell or rent your information, we don't share it with third parties for their marketing, and we don't use it to build profiles or serve you advertising.
+
+
+
+
+
+
+
+
Third-party services
+
+ The site doesn't run much third-party machinery, but a few services help it work:
+
+
+
+ Font Awesome (via cdnjs) — the icon set is delivered as a stylesheet from the cdnjs content-delivery network.
+
+
+ Analytics (analytics.rokoh.com) — a lightweight script that measures aggregate page views across the site.
+
+
+ Blog (blog.plushealthtech.com) — our blog lives on a separate subdomain; visiting it is subject to whatever terms are stated there.
+
+
+
+
+
+
+
+
+
Cookies
+
+ This site sets no session or authentication cookies — there's nothing to log in to. The only cookies you may encounter are the analytics cookies set by the analytics script above, which track aggregate usage rather than building an individual profile. Blocking third-party cookies in your browser will not affect the site's functionality.
+
+
+
+
+
+
+
+
Data retention
+
+ Contact and demo messages are kept in our team mailbox while we work on them and for a period afterwards. The exact retention schedule is still being finalized — this section is a placeholder pending legal review and will be updated once our schedule is set.
+
+
+
+ Pending legal review — the wording in this section is provisional.
+
+
+
+
+
+
+
+
Your rights
+
+ Under applicable data-protection laws you can ask us to confirm what we hold about you, correct inaccurate details, or delete your information. Send any such request through the Contact page and we'll take care of it, responding to the email address you provide.
+
+
+
+
+
+
+
+
Contact
+
+ Questions about this policy, or a request about your data? The fastest route to a human is the Contact page — or request a demo and tell us what you'd like to know.
+
+ See how interoperable Clinical Decision Support, Patient Management, and Veterinary platforms fit your practice — in a walkthrough tailored to your team.
+
+
+ FHIR®-ready interoperability
+ 24/7 clinical support
+ 99.9% system uptime
+