Commit Graph

33 Commits

Author SHA1 Message Date
hsiegeln
ea6267d6f7 Make CI arm64-runner-aware for Gitea self-hosted act_runner
Runner: self-hosted arm64. Deploy target: amd64 (Hetzner). Cross-arch is
safe because Astro output is plain static HTML/CSS/JS — nothing in the
bundle is arch-specific.

Changes:
- runs-on: ubuntu-latest (most portable act_runner label — override per your
  runner's registered labels if needed).
- Install Chromium from apt at workflow time (Google Chrome has no Linux/arm64
  stable build; Chromium does). Handles both chromium and chromium-browser
  package names, sudo-less runners, and idempotently skips if already present.
- Export CHROME_PATH so LHCI picks the right binary.
- Add chromeFlags to lighthouserc.cjs: --no-sandbox --headless=new
  --disable-gpu --disable-dev-shm-usage (required in containerized/root
  Chromium on CI runners).
- timeout-minutes on both jobs.
- Defense-in-depth install of rsync + openssh in deploy job if the runner
  image doesn't ship them.
- Null-guard SFTP_KEY and SFTP_KNOWN_HOSTS secrets.
- Switch echo to printf for deterministic newline handling when writing key
  material to ~/.ssh files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 17:39:34 +02:00
hsiegeln
d98d73b14a Apply final-review cleanup: robots sitemap, CI guards, header parity
- Remove Sitemap line from robots.txt (no @astrojs/sitemap installed; was
  pointing to a 404 that would trip Google Search Console).
- Align Permissions-Policy across all three enforcement layers (middleware,
  .htaccess, Cloudflare Transform Rule in OPERATOR-CHECKLIST) by dropping the
  stray fullscreen=(self) from the middleware.
- Bump Lighthouse CI numberOfRuns from 1 to 3 to dampen CI-runner noise.
- Add CI guard that fails the build if any <TBD:...> marker survives into
  dist/ — prevents a legally incomplete imprint from shipping by accident.
- Add SFTP_* secret null-guard before the rsync --delete step so a missing
  secret fails loudly instead of targeting the SSH user's home root.
- Document the set:html compile-time-constant invariant in DualValueProps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 17:34:27 +02:00
hsiegeln
7e0d341c89 Add README and operator checklist for Hetzner + Cloudflare + Gitea setup 2026-04-24 17:25:53 +02:00
hsiegeln
92bef08357 Add Gitea Actions workflow: build, test, lint, Lighthouse, rsync deploy with header smoke check 2026-04-24 17:25:02 +02:00
hsiegeln
cc7802e461 Add Lighthouse CI config with >=95 thresholds across 4 categories 2026-04-24 17:24:37 +02:00
hsiegeln
04a1bd0aaf Add CI lint configs (html-validate, linkinator), fix nav a11y and URL routing
- .htmlvalidate.json with relaxed rules for design-system inline styles
- linkinator.config.json skipping mail, external auth/platform origins
- Fix lint:html npm script quoting for Windows-shell compatibility
- Switch astro build.format to 'directory' so /pricing resolves without MultiViews
- trailingSlash: 'ignore' lets both /pricing and /pricing/ work naturally
- Add aria-label to both <nav> landmarks (Primary, Footer) to satisfy html-validate

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 17:24:21 +02:00
hsiegeln
dfb8419b08 Add .htaccess for origin hardening, HTTPS redirect, and cache headers 2026-04-24 17:22:25 +02:00
hsiegeln
ecbf1f90d7 Add privacy policy page (GDPR-aligned, no-cookies posture documented) 2026-04-24 17:21:56 +02:00
hsiegeln
07de57dda5 Add imprint page (TMG §5 / DDG §5 structure, operator fields marked <TBD>) 2026-04-24 17:21:17 +02:00
hsiegeln
d4449bb404 Add pricing page with 4-tier comparison cards 2026-04-24 17:20:21 +02:00
hsiegeln
6f70e1a642 Assemble homepage — Hero, DualValueProps, HowItWorks, WhyUs, PricingTeaser, FinalCTA 2026-04-24 17:19:47 +02:00
hsiegeln
94b9b844ac Add PricingTeaser section — 4 tier mini-cards linking to /pricing 2026-04-24 17:18:58 +02:00
hsiegeln
9795c633c9 Add WhyUs section — moat (zero-code, bidirectional) + team pedigree 2026-04-24 17:18:33 +02:00
hsiegeln
5af7e0079f Add HowItWorks section — 3-step engineer-facing walkthrough 2026-04-24 17:18:08 +02:00
hsiegeln
6f9e98aeb6 Add DualValueProps section — 3 tiles pairing outcomes with capabilities 2026-04-24 17:17:46 +02:00
hsiegeln
754333226b Add homepage Hero section — headline, subhead, CTAs, diagram 2026-04-24 17:17:24 +02:00
hsiegeln
6b27d8f013 Add RouteDiagram hero SVG: 2 Camel routes with cross-route correlation 2026-04-24 17:16:29 +02:00
hsiegeln
8b4b1ae699 Add shared building-block components: header, footer, CTAs, topographic background
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 17:14:58 +02:00
hsiegeln
e084177acf Add BaseLayout with meta tags, favicon, robots.txt, and OG card
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 17:13:07 +02:00
hsiegeln
e0a7ec4651 Plan fix: correct Task 4 preview-headers claim (static Astro doesn't run middleware at preview)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 17:11:21 +02:00
hsiegeln
2945c63f2a Document CSP directive rationale and strengthen inline-script assertion
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 17:11:16 +02:00
hsiegeln
3432d509df Add security-headers middleware with strict CSP (TDD)
Exports buildSecurityHeaders() (pure, testable) and wires it into the
Astro onRequest middleware. Adds astro:middleware alias in vitest config
so the unit tests run outside Astro's build context. 14 tests pass (7
existing + 7 new).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 17:06:45 +02:00
hsiegeln
7f8a41fd34 Plan fix: mirror sign-up URL test coverage additions for Task 3 2026-04-24 17:04:01 +02:00
hsiegeln
3a155efa69 Add sign-up URL test coverage and remove unused beforeEach import 2026-04-24 17:03:57 +02:00
hsiegeln
8ab30ca8fc Add auth URL config module with validation (TDD)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 16:59:50 +02:00
hsiegeln
4759f88780 Plan fix: use text-display/text-hero (fontSize) not font-display/font-hero (fontFamily) 2026-04-24 16:57:55 +02:00
hsiegeln
d0e7d13f09 Fix focus ring visibility and add DM Sans 600 weight 2026-04-24 16:57:51 +02:00
hsiegeln
ec320f7ae4 Add Tailwind config with Mission Control tokens and global styles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 16:51:37 +02:00
hsiegeln
902d48a80a Plan fix: add lightningcss to Task 1 devDependencies list 2026-04-24 16:36:33 +02:00
hsiegeln
4afe37ee1a Add lightningcss devDependency (required by vite cssMinify config) 2026-04-24 16:36:29 +02:00
hsiegeln
b9b0dcb6ec Scaffold Astro 5 project with static output and i18n-ready content collections 2026-04-24 16:30:21 +02:00
hsiegeln
75f20d5367 Add implementation plan for cameleer.io marketing site
21-task TDD-oriented plan covering Astro scaffold, Mission Control
tokens, auth URL + security-headers modules (with vitest), shared
components, 6-section dual-register homepage, pricing/imprint/privacy
pages, Apache .htaccess hardening, HTML + link + Lighthouse CI gates,
and Gitea Actions rsync deploy with host-key pinning and post-deploy
header smoke check. Includes operator checklist for Hetzner +
Cloudflare + Gitea secrets.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 16:25:31 +02:00
hsiegeln
e15408b498 Initial design spec for cameleer.io marketing site
Captures brainstormed architecture: Astro 5 static site on Hetzner
Webhosting L, Cloudflare profile B (WAF, rate limit, HSTS, security
headers), redirect-to-Logto auth at auth.cameleer.io. Four pages (home,
pricing, imprint, privacy), English-only with i18n-ready scaffold, no
analytics in v1. Homepage uses dual-register 6-section weave serving
both manager and engineer audiences at every scroll depth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 16:13:47 +02:00