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:
commit
cd91c4b97c
92 files changed
+10246
No files matched your search
@@ -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`.
|
||||
Reference in new issue
Block a user