diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml
index 6850acc6..27d7b494 100644
--- a/.github/workflows/deploy-web.yml
+++ b/.github/workflows/deploy-web.yml
@@ -78,6 +78,23 @@ jobs:
working-directory: ${{ env.WEB_DIR }}
run: npm ci
+ # Star counter for the GitHub star link (utils/githubStars.ts). Baked into the static HTML
+ # so visitors' browsers never call GitHub; stale until the next web deploy. The token stays
+ # in this step, never in the build. Fail-soft: without a number the link has no counter.
+ - name: Read GitHub star count (fail-soft)
+ id: stars
+ env:
+ GH_TOKEN: ${{ github.token }}
+ REPO: ${{ github.repository }}
+ run: |
+ count=$(gh api "repos/$REPO" --jq .stargazers_count 2>/dev/null || true)
+ if [[ "$count" =~ ^[0-9]+$ ]]; then
+ echo "count=$count" >> "$GITHUB_OUTPUT"
+ echo "GitHub stars: $count"
+ else
+ echo "::warning::GitHub star count unavailable - the star link renders without a counter"
+ fi
+
# next.config output:'export' -- `next build` writes the static site to out/
# (prebuild: sync-error-codes, generate-lastmod, generate-version, whats-new).
- name: Build
@@ -98,6 +115,8 @@ jobs:
GITHUB_SHA: ${{ github.sha }}
# Docs checkout for public/whats-new.json; the prebuild fails in CI without it.
WHATS_NEW_DOCS_DIR: ${{ github.workspace }}/whats-new-docs
+ # Star counter from the step above; empty when the lookup failed.
+ NEXT_PUBLIC_GITHUB_STARS: ${{ steps.stars.outputs.count }}
run: |
npm run build
test -f out/version.json || { echo "out/version.json missing - export did not run"; exit 1; }
diff --git a/src/Web/autopilot-monitor-web/app/globals.css b/src/Web/autopilot-monitor-web/app/globals.css
index 40754767..03ba9986 100644
--- a/src/Web/autopilot-monitor-web/app/globals.css
+++ b/src/Web/autopilot-monitor-web/app/globals.css
@@ -49,6 +49,8 @@ html {
--lp-warn: #d97706;
--lp-warn-soft: rgba(217, 119, 6, 0.1);
--lp-danger: #dc2626;
+ /* GitHub star glyph only (GitHubStarLink) — never text or a fill */
+ --lp-star: #eab308;
/* Terminal is dark in both themes */
--lp-term-bg: #0d1424;
--lp-term-line: #22304a;
@@ -73,6 +75,7 @@ html {
--lp-warn: #f5a623;
--lp-warn-soft: rgba(245, 166, 35, 0.12);
--lp-danger: #f87171;
+ --lp-star: #facc15;
}
body {
@@ -762,6 +765,7 @@ html.auth-pending .landing-v2::after {
--lp-warn: #d97706;
--lp-warn-soft: rgba(217, 119, 6, 0.1);
--lp-danger: #dc2626;
+ --lp-star: #eab308;
}
/* Neutralize the global .dark utility overrides inside the light-only
diff --git a/src/Web/autopilot-monitor-web/app/page.tsx b/src/Web/autopilot-monitor-web/app/page.tsx
index ac9b5d41..f14de38a 100644
--- a/src/Web/autopilot-monitor-web/app/page.tsx
+++ b/src/Web/autopilot-monitor-web/app/page.tsx
@@ -7,6 +7,7 @@ import { Story } from "../components/landing/Story";
import { CapabilitiesStrip } from "../components/landing/CapabilitiesStrip";
import { Comparison } from "../components/landing/Comparison";
import { HowItWorks } from "../components/landing/HowItWorks";
+import { Testimonials } from "../components/landing/Testimonials";
import { FinalCta } from "../components/landing/FinalCta";
import { SiteFooter } from "../components/SiteFooter";
@@ -29,6 +30,7 @@ export default function LandingPage() {
© 2026 Autopilot Monitor. Built with ❤️ by Oliver Kieselbach.{" "} Hosted on Azure by glueckkanja AG.
-- Open source. Star us on{" "} - - GitHub - -