From 61a359ee54a8da365fd7b59c18f87fc9f8f2a0a9 Mon Sep 17 00:00:00 2001 From: Oliver Kieselbach Date: Sat, 22 Aug 2026 18:12:09 +0200 Subject: [PATCH] feat(web): public /help page for support channels Adds www.autopilotmonitor.com/help as a mail-linkable page describing how to get help: Report Session in the portal for session-specific problems, GitHub Issues for everything else, LinkedIn for private contact, plus self-service links (docs, FAQ, announcements, changelog) and the private security-advisory path. Registered as public path in hostRouting (guard test pinned) and linked from the site footer. Co-Authored-By: Claude Fable 5 --- .../autopilot-monitor-web/app/help/layout.tsx | 34 ++++ .../autopilot-monitor-web/app/help/page.tsx | 175 ++++++++++++++++++ .../components/SiteFooter.tsx | 1 + .../lib/__tests__/hostRouting.guard.test.ts | 1 + .../autopilot-monitor-web/lib/hostRouting.ts | 1 + 5 files changed, 212 insertions(+) create mode 100644 src/Web/autopilot-monitor-web/app/help/layout.tsx create mode 100644 src/Web/autopilot-monitor-web/app/help/page.tsx diff --git a/src/Web/autopilot-monitor-web/app/help/layout.tsx b/src/Web/autopilot-monitor-web/app/help/layout.tsx new file mode 100644 index 00000000..1538905e --- /dev/null +++ b/src/Web/autopilot-monitor-web/app/help/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { SITE_URL } from "@/utils/config"; + +export const metadata: Metadata = { + title: "Help & Support – How to Get Help", + description: + "How to get help with Autopilot Monitor: open a GitHub issue for bugs and feature requests, or reach out directly to Oliver Kieselbach on LinkedIn. Plus documentation, FAQ, and service announcements.", + keywords: [ + "Autopilot Monitor support", + "Autopilot Monitor help", + "Windows Autopilot monitoring support", + "Autopilot Monitor GitHub issues", + "Autopilot Monitor contact", + "Oliver Kieselbach", + ], + openGraph: { + title: "Help & Support – Autopilot Monitor", + description: + "How to get help with Autopilot Monitor: open a GitHub issue or reach out directly on LinkedIn.", + url: `${SITE_URL}/help`, + }, + twitter: { + title: "Help & Support – Autopilot Monitor", + description: + "How to get help with Autopilot Monitor: open a GitHub issue or reach out directly on LinkedIn.", + }, + alternates: { + canonical: `${SITE_URL}/help`, + }, +}; + +export default function HelpLayout({ children }: { children: React.ReactNode }) { + return <>{children}; +} diff --git a/src/Web/autopilot-monitor-web/app/help/page.tsx b/src/Web/autopilot-monitor-web/app/help/page.tsx new file mode 100644 index 00000000..dab9ba90 --- /dev/null +++ b/src/Web/autopilot-monitor-web/app/help/page.tsx @@ -0,0 +1,175 @@ +import { LandingNavbar } from "../../components/landing/LandingNavbar"; +import { SiteFooter } from "../../components/SiteFooter"; +import { DOCS_URL } from "@/utils/config"; + +const GITHUB_ISSUES = "https://github.com/okieselbach/AutopilotMonitor/issues"; +const LINKEDIN_PROFILE = "https://www.linkedin.com/in/oliver-kieselbach/"; +const GITHUB_ADVISORY = "https://github.com/okieselbach/AutopilotMonitor/security/advisories/new"; + +const SELF_SERVICE_LINKS = [ + { + label: "Documentation", + description: "Setup guides, concepts, and reference for every feature.", + href: DOCS_URL, + }, + { + label: "FAQ", + description: "Answers to the most common questions.", + href: `${DOCS_URL}/troubleshooting/faq`, + }, + { + label: "Service Announcements", + description: "Known issues and current service status.", + href: `${DOCS_URL}/troubleshooting/service-announcements`, + }, + { + label: "Platform Changelog", + description: "What changed recently in the portal and backend.", + href: `${DOCS_URL}/changelog/platform-changelog`, + }, +]; + +export default function HelpPage() { + return ( +
+ +
+
+

Support

+

+ Help & Support +

+

+ Autopilot Monitor is free and open source, and support is direct and personal — no + ticket queues, no call centers. Pick the channel that fits and you'll hear back + from the person who actually builds the platform. +

+
+
+ +
+ + {/* Primary support channels */} +
+
+
+ + + + + +

GitHub Issues

+
+

+ The best channel for bug reports, feature requests, and questions. Issues are + public, so other admins benefit from the answer too — chances are someone already + reported what you're seeing. +

+ + Open a GitHub Issue + + + + +
+ +
+
+ + + + + +

LinkedIn

+
+

+ Prefer a direct, private conversation? Message Oliver Kieselbach on LinkedIn — + for anything that shouldn't go into a public issue, such as tenant-specific + details, or just to say hi. +

+ + Message on LinkedIn + + + + +
+
+ + {/* How to report a problem */} +
+

Something Wrong with an Enrollment?

+

+ If your question is about a specific enrollment, the easiest way is the{" "} + Report Session button right in the portal's session view. It + flags that session for analysis, and you can add a problem description and attach + screenshots directly in the dialog — everything needed arrives in one place. +

+

+ For everything else — general questions, portal issues, or feature ideas — a GitHub + issue works best. A short description of what you expected versus what happened, plus + a screenshot where helpful, makes it much faster to track down. Attachments work in + both places, so use whichever you prefer. +

+

+ GitHub issues are public — leave out anything confidential like tenant names, user + identities, or internal hostnames. If the details are sensitive, use Report Session + or LinkedIn instead and reference the issue number. +

+
+ + {/* Self-service resources */} +
+

Help Yourself First

+

+ Many questions are already answered in the documentation — it's the fastest way + to a solution. +

+
+ {SELF_SERVICE_LINKS.map((link) => ( + + {link.label} → + {link.description} + + ))} +
+
+ + {/* Security */} +
+

Reporting a Security Issue

+

+ Please do not report security vulnerabilities in a public issue. Use a private{" "} + + GitHub security advisory + {" "} + instead, so the issue can be assessed and fixed before details become public. +

+
+ +
+ +
+ ); +} diff --git a/src/Web/autopilot-monitor-web/components/SiteFooter.tsx b/src/Web/autopilot-monitor-web/components/SiteFooter.tsx index d1f1e19b..b1dcdd68 100644 --- a/src/Web/autopilot-monitor-web/components/SiteFooter.tsx +++ b/src/Web/autopilot-monitor-web/components/SiteFooter.tsx @@ -15,6 +15,7 @@ const LINK_COLUMNS = [ title: "Resources", links: [ { label: "Documentation", href: DOCS_URL, external: true }, + { label: "Help & Support", href: "/help" }, { label: "Feedback", href: "https://github.com/okieselbach/AutopilotMonitor/issues", external: true }, { label: "GitHub", href: "https://github.com/okieselbach/AutopilotMonitor", external: true }, ], diff --git a/src/Web/autopilot-monitor-web/lib/__tests__/hostRouting.guard.test.ts b/src/Web/autopilot-monitor-web/lib/__tests__/hostRouting.guard.test.ts index c588991a..bbdcdd9c 100644 --- a/src/Web/autopilot-monitor-web/lib/__tests__/hostRouting.guard.test.ts +++ b/src/Web/autopilot-monitor-web/lib/__tests__/hostRouting.guard.test.ts @@ -127,6 +127,7 @@ describe("hostRouting public/portal guard", () => { } // Prefix matching: subpaths and generated asset variants match… expect(isPublicPath("/about")).toBe(true); + expect(isPublicPath("/help")).toBe(true); expect(isPublicPath("/docs/setup")).toBe(true); expect(isPublicPath("/icon-192.png")).toBe(true); expect(isPublicPath("/opengraph-image.png")).toBe(true); diff --git a/src/Web/autopilot-monitor-web/lib/hostRouting.ts b/src/Web/autopilot-monitor-web/lib/hostRouting.ts index 7988375e..cb46934c 100644 --- a/src/Web/autopilot-monitor-web/lib/hostRouting.ts +++ b/src/Web/autopilot-monitor-web/lib/hostRouting.ts @@ -25,6 +25,7 @@ export const PUBLIC_PATH_PREFIXES = [ "/changelog", "/docs", "/get-started", + "/help", "/privacy", "/terms", "/roadmap",