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

+61
View File
@@ -0,0 +1,61 @@
# BlueCap Strategies Website
Static marketing site for BlueCap Strategies, built with [Astro](https://astro.build/) and
deployed to a k3s homelab cluster via GitOps (ArgoCD).
## Stack
- **Astro 5** — static output (`output: "static"`), no runtime JS framework.
- **Content Collections (Markdown)** — page copy lives in `src/content/` (services, focus-areas,
pages, insights), validated by a Zod SEO schema at build time.
- **nginx** (Alpine) serves the built `dist/` from a multi-stage Docker image.
- **ArgoCD + Kustomize** (`k8s/`) reconcile the deployment; images are published to GHCR by CI.
## Local development
```bash
npm install
npm run dev # dev server at http://localhost:4321
npm run build # astro check (typecheck) + astro build → dist/
npm run preview # serve the production build
npm run seo:lint # structural SEO checks over dist/ (run after build)
npm run test:e2e # Playwright end-to-end tests
```
Copy `.env.example` to `.env` and fill in values as needed (site URL, contact form endpoint,
analytics keys). Never commit `.env`.
## Editing content
Page copy is Markdown with typed frontmatter — no code changes needed to edit words:
- `src/content/services/*.md` — service detail pages
- `src/content/focus-areas/*.md` — focus-area detail pages
- `src/content/pages/*.md` — standalone long-form pages (e.g. About)
- `src/content/insights/*.md` — blog/insights posts
Frontmatter is enforced by the Zod schema in `src/content.config.ts` (e.g. `description` must be
120–158 chars), so the build fails fast on SEO violations. The `.md` files are **build-time
source**: Astro compiles them to static HTML in `dist/`. The Markdown itself is never served.
## Project layout
```
src/ Astro pages, layouts, components, content collections, styles
public/ Static assets served as-is (images, robots.txt, healthz)
scripts/ Build tooling (seo-lint.mjs)
tests/ Playwright e2e specs
deploy/ nginx.conf for the runtime image
k8s/ Kustomize manifests (namespace, deployment, service, ingress, configmap)
docs/ Committed engineering records — ADRs, deployment, SEO/AEO, deviations
Dockerfile Multi-stage build → nginx image containing only dist/
```
`planning/` (git-ignored) holds working docs — content inventories, parity checklists, and the
original rebuild brief. See `docs/adr/` for the decision record.
## Deployment
Push to `main` → GitHub Actions runs the quality gates, builds and pushes a `<git-sha>`-tagged
image to GHCR, and updates the image tag in `k8s/`. ArgoCD reconciles the change to k3s. GitHub
never receives cluster credentials. See `docs/gitops-deployment-strategy.md`.