Initial commit: BlueCap Strategies Astro site

Static Astro 5 site for BlueCap Strategies with exact live-site content
parity, deployed to k3s via GitOps (ArgoCD).

- Page copy in Markdown content collections (services, focus-areas, pages,
  insights) with a Zod SEO schema enforced at build time
- Homepage + About restored to exact live copy; real live-site imagery
- Build-time SEO linter (scripts/seo-lint.mjs) and Playwright e2e suite
- Multi-stage Dockerfile (nginx serves dist/) and Kustomize manifests (k8s/)
- Per-agent robots.txt; config-driven PostHog + Umami analytics scaffold
- ADRs and engineering docs under docs/

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
gitea_adminandClaude Opus 4.8 committed 2026-07-15 17:40:46 -04:00
commit cd91c4b97c
92 files changed
+10246

No files matched your search

+92
View File
@@ -0,0 +1,92 @@
import { site } from "@data/site";
import { assetUrl, canonical, siteUrl } from "./url";
type Crumb = { name: string; href: string };
export function organizationSchema() {
return {
"@context": "https://schema.org",
"@type": "Organization",
"@id": `${siteUrl}/#organization`,
name: site.name,
legalName: site.legalName,
url: siteUrl,
logo: assetUrl("/assets/bluecap-logo.png"),
email: site.email,
telephone: site.phone,
founder: {
"@type": "Person",
name: site.founder,
},
description: site.description,
};
}
export function websiteSchema() {
return {
"@context": "https://schema.org",
"@type": "WebSite",
"@id": `${siteUrl}/#website`,
url: siteUrl,
name: site.name,
publisher: { "@id": `${siteUrl}/#organization` },
};
}
export function pageSchema({
type = "WebPage",
title,
description,
pathname,
}: {
type?: "WebPage" | "AboutPage" | "ContactPage";
title: string;
description: string;
pathname: string;
}) {
return {
"@context": "https://schema.org",
"@type": type,
"@id": `${canonical(pathname)}#webpage`,
url: canonical(pathname),
name: title,
description,
isPartOf: { "@id": `${siteUrl}/#website` },
about: { "@id": `${siteUrl}/#organization` },
};
}
export function serviceSchema({
title,
description,
pathname,
}: {
title: string;
description: string;
pathname: string;
}) {
return {
"@context": "https://schema.org",
"@type": "Service",
"@id": `${canonical(pathname)}#service`,
name: title,
description,
provider: { "@id": `${siteUrl}/#organization` },
areaServed: "United States",
url: canonical(pathname),
serviceType: "Water-sector advisory services",
};
}
export function breadcrumbSchema(crumbs: Crumb[]) {
return {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: crumbs.map((crumb, index) => ({
"@type": "ListItem",
position: index + 1,
name: crumb.name,
item: canonical(crumb.href),
})),
};
}
+13
View File
@@ -0,0 +1,13 @@
const defaultSiteUrl = "https://www.bluecapstrategies.com";
export const siteUrl = (import.meta.env.PUBLIC_SITE_URL ?? defaultSiteUrl).replace(/\/$/, "");
export function canonical(pathname: string) {
const cleanPath = pathname.startsWith("/") ? pathname : `/${pathname}`;
const withSlash = cleanPath.endsWith("/") ? cleanPath : `${cleanPath}/`;
return `${siteUrl}${withSlash}`;
}
export function assetUrl(path: string) {
return `${siteUrl}${path.startsWith("/") ? path : `/${path}`}`;
}