feat(site): add SEO essentials, contact form, early-access banner#467
feat(site): add SEO essentials, contact form, early-access banner#467
Conversation
- Add OG/Twitter Card/canonical/favicon meta tags in Base.astro - Add @astrojs/sitemap integration and robots.txt - Add JSON-LD SoftwareApplication structured data - Add Formcarry-powered ContactForm with honeypot, response validation, and error logging - Add early-access disclaimer between Hero and Proof Strip - Add Contact link to Footer community column - Non-render-blocking Google Fonts (media=print onload pattern) - Preconnect to api.github.com for GitHub buttons - Fix contrast: text-gray-500 → text-gray-400 across all pages - Fix link accessibility: persistent underlines on inline links - Update CLAUDE.md to reflect new site components and SEO infra Pre-reviewed by 3 agents, 6 findings addressed Closes #466
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.OpenSSF Scorecard
Scanned Files
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughSummary by CodeRabbit
WalkthroughAdds sitemap integration and robots.txt, injects Open Graph/Twitter/canonical metadata and JSON-LD, introduces a client-side ContactForm component and CONTACT section plus an early‑access disclaimer, and applies small footer and styling adjustments on several site pages. Changes
Sequence Diagram(s)sequenceDiagram
participant User as Browser/User
participant Form as ContactForm (client)
participant API as External Form Endpoint
User->>Form: fill fields + submit
Form->>Form: honeypot check
alt honeypot filled
Form-->>User: show fake success (hide form)
else honeypot empty
Form->>API: fetch POST FormData
API-->>Form: 200 OK (success)
Form-->>User: reset & show success message (focus)
note right of Form: on non-OK or network error\nshow error message and restore submit
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
📝 Coding Plan
Comment |
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the website's functionality, discoverability, performance, and accessibility. It introduces essential SEO elements to improve search engine ranking, adds a robust contact form for user interaction, and includes an early-access banner for clear communication. Furthermore, it addresses critical accessibility concerns by improving color contrast and link visibility, while also boosting page load performance through optimized font loading and preconnection strategies. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
Code Review
This pull request significantly enhances the landing page by adding essential SEO features, a contact form, and an early-access banner. The implementation of OG/Twitter tags, a sitemap, robots.txt, and JSON-LD data provides a solid foundation for search engine visibility. The performance optimizations, such as non-render-blocking fonts, and the accessibility improvements to color contrast and link visibility are excellent additions.
My review includes a few suggestions to improve code maintainability and type safety in the new ContactForm.astro component and the JSON-LD implementation on the index page. These changes will help keep the codebase clean and consistent as it grows.
| const form = document.getElementById("contact-form"); | ||
| const submitBtn = document.getElementById("contact-submit"); |
There was a problem hiding this comment.
For better type safety and cleaner code, you can use document.querySelector with a generic type argument instead of document.getElementById. This is a more modern and idiomatic approach in a TypeScript-aware environment like Astro.
After applying this suggestion, you can also remove all the redundant as HTMLFormElement and as HTMLButtonElement type casts within the form.addEventListener block, as the form and submitBtn variables will already have the correct types.
const form = document.querySelector<HTMLFormElement>("#contact-form");
const submitBtn = document.querySelector<HTMLButtonElement>("#contact-submit");
site/src/pages/index.astro
Outdated
| --- | ||
| import Base from "../layouts/Base.astro"; | ||
| import Footer from "../components/Footer.astro"; | ||
| import ContactForm from "../components/ContactForm.astro"; | ||
| --- | ||
|
|
||
| <Base title="SynthOrg — Build Synthetic Organizations"> |
There was a problem hiding this comment.
To avoid duplicating the description string and hardcoding the site URL in your JSON-LD schema, it's a good practice to define the description in the frontmatter and pass it as a prop to the <Base> component. This makes your code more maintainable and ensures consistency.
---
import Base from "../layouts/Base.astro";
import Footer from "../components/Footer.astro";
import ContactForm from "../components/ContactForm.astro";
const description = "Framework for building synthetic organizations — autonomous AI agents orchestrated as a virtual company";
---
<Base title="SynthOrg — Build Synthetic Organizations" description={description}>
| <script type="application/ld+json" set:html={JSON.stringify({ | ||
| "@context": "https://schema.org", | ||
| "@type": "SoftwareApplication", | ||
| "name": "SynthOrg", | ||
| "description": "Framework for building synthetic organizations — autonomous AI agents orchestrated as a virtual company", | ||
| "url": "https://synthorg.io", | ||
| "applicationCategory": "DeveloperApplication", | ||
| "operatingSystem": "Linux, macOS, Windows", | ||
| "license": "https://github.com/Aureliolo/synthorg/blob/main/LICENSE", | ||
| "author": { | ||
| "@type": "Person", | ||
| "name": "Aurelio", | ||
| }, | ||
| })} /> |
There was a problem hiding this comment.
Following the previous suggestion to define description as a variable, you can now use it here. Additionally, it's better to use Astro.site for the url property to avoid hardcoding the domain, ensuring it stays in sync with your site configuration.
<script type="application/ld+json" set:html={JSON.stringify({
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "SynthOrg",
"description": description,
"url": Astro.site,
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Linux, macOS, Windows",
"license": "https://github.com/Aureliolo/synthorg/blob/main/LICENSE",
"author": {
"@type": "Person",
"name": "Aurelio",
},
})} />
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/components/ContactForm.astro`:
- Around line 72-78: Add accessible live region attributes and focus handoff for
the success and error messages: update the elements with id "contact-success"
and "contact-error" to include aria-live="polite" (or "assertive" as
appropriate) and a programmatically focusable target (e.g., tabindex="-1"), and
in the form submit handlers that hide the form (the code paths around the form
submission where the form is hidden/visual toggles occur) set focus to the shown
message element after toggling visibility; also ensure the hidden state uses
aria-hidden or class toggles consistently so hidden content is not focusable.
This applies to the success/error elements and the code paths that hide the form
(the post-submit success and error handling logic).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 2f1da540-2d74-4f80-91f6-8dd4cfac1d04
⛔ Files ignored due to path filters (2)
site/package-lock.jsonis excluded by!**/package-lock.jsonsite/public/og-image.pngis excluded by!**/*.png
📒 Files selected for processing (11)
CLAUDE.mdsite/astro.config.mjssite/package.jsonsite/public/robots.txtsite/src/components/ContactForm.astrosite/src/components/Footer.astrosite/src/layouts/Base.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-ps1.astrosite/src/pages/get/view/install-sh.astrosite/src/pages/index.astro
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (3)
site/**/*.astro
📄 CodeRabbit inference engine (CLAUDE.md)
Landing page built with Astro (synthorg.io). Includes /get/ CLI installation page and shared Footer component. Site structure in site/src/pages/ (index, get), components/ (Footer), layouts/ (Base.astro).
Files:
site/src/pages/get/view/install-ps1.astrosite/src/components/Footer.astrosite/src/layouts/Base.astrosite/src/pages/index.astrosite/src/components/ContactForm.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-sh.astro
site/**/*.{ts,tsx,astro}
📄 CodeRabbit inference engine (CLAUDE.md)
Landing page uses Astro with Concept C hybrid design. CI builds via .github/workflows/pages.yml: exports OpenAPI schema, builds Astro landing + Zensical docs, copies CLI install scripts into /get/, merges, deploys to GitHub Pages.
Files:
site/src/pages/get/view/install-ps1.astrosite/src/components/Footer.astrosite/src/layouts/Base.astrosite/src/pages/index.astrosite/src/components/ContactForm.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-sh.astro
**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
Always read the relevant
docs/design/page before implementing any feature or planning any issue. The design spec in docs/design/ is the starting point for architecture, data models, and behavior. When a spec topic is referenced, read the relevant docs/design/ page before coding.
Files:
CLAUDE.md
🧠 Learnings (23)
📓 Common learnings
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to site/**/*.{ts,tsx,astro} : Landing page uses Astro with Concept C hybrid design. CI builds via .github/workflows/pages.yml: exports OpenAPI schema, builds Astro landing + Zensical docs, copies CLI install scripts into /get/, merges, deploys to GitHub Pages.
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to site/**/*.astro : Landing page built with Astro (synthorg.io). Includes /get/ CLI installation page and shared Footer component. Site structure in site/src/pages/ (index, get), components/ (Footer), layouts/ (Base.astro).
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to site/**/*.{ts,tsx,astro} : Landing page uses Astro with Concept C hybrid design. CI builds via .github/workflows/pages.yml: exports OpenAPI schema, builds Astro landing + Zensical docs, copies CLI install scripts into /get/, merges, deploys to GitHub Pages.
Applied to files:
site/src/pages/get/view/install-ps1.astrosite/astro.config.mjssite/src/components/Footer.astroCLAUDE.mdsite/package.jsonsite/src/layouts/Base.astrosite/src/pages/index.astrosite/src/components/ContactForm.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-sh.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to cli/scripts/install.{sh,ps1} : CLI install scripts (install.sh for Unix, install.ps1 for Windows) are in cli/scripts/. CI Pages workflow copies them to /get/ for the installation page.
Applied to files:
site/src/pages/get/view/install-ps1.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-sh.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to site/**/*.astro : Landing page built with Astro (synthorg.io). Includes /get/ CLI installation page and shared Footer component. Site structure in site/src/pages/ (index, get), components/ (Footer), layouts/ (Base.astro).
Applied to files:
site/astro.config.mjssite/src/components/Footer.astroCLAUDE.mdsite/package.jsonsite/src/layouts/Base.astrosite/src/pages/index.astrosite/src/components/ContactForm.astrosite/src/pages/get/index.astrosite/src/pages/get/view/install-sh.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to pyproject.toml : Docs group in pyproject.toml contains: zensical, mkdocstrings[python], griffe-pydantic. Install: uv sync --group docs. Docs source in docs/ (Markdown, built with Zensical). Design spec in docs/design/ (7 pages). Architecture in docs/architecture/. Roadmap in docs/roadmap/. Security in docs/security.md. Licensing in docs/licensing.md. Reference in docs/reference/. REST API reference at docs/rest-api.md. Library reference in docs/api/ (auto-generated from docstrings via mkdocstrings + Griffe AST-based, no imports). Custom templates in docs/overrides/. Scripts in scripts/.
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to mkdocs.yml : mkdocs.yml at repo root is read natively by Zensical. Config includes custom_dir for optional theme/template overrides (docs/overrides/).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to src/synthorg/**/*.py : Package structure: api/ (Litestar REST+WebSocket, JWT+API key auth, approval gate, coordination, RFC 9457 errors), budget/ (cost tracking, pre-flight/in-flight checks, CFO optimization, billing, errors), cli/ (Python CLI—superseded by Go binary), communication/ (message bus, meeting protocol, scheduler, orchestrator), config/ (YAML loading), core/ (domain models, RetryConfig, RateLimiterConfig), engine/ (orchestration, TaskEngine, routing, assignment, coordination dispatchers, checkpoint recovery, approval gate, stagnation detection), hr/ (hiring, firing, performance, promotion), memory/ (pluggable MemoryBackend, Mem0 adapter, retrieval, org memory), persistence/ (pluggable PersistenceBackend, SQLite), observability/ (logging, correlation, sinks), providers/ (LLM abstraction, LiteLLM), security/ (SecOps agent, rule engine, audit, scanner, progressive trust, autonomy levels), templates/ (presets, builder), tools/ (registry, file_system, git, sandbox, co...
Applied to files:
CLAUDE.mdsite/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to .github/workflows/pages.yml : Pages workflow: exports OpenAPI schema (scripts/export_openapi.py), builds Astro landing + Zensical docs, copies CLI install scripts into /get/, merges, deploys to GitHub Pages on push to main. Triggers on docs/**, site/**, mkdocs.yml, pyproject.toml, uv.lock, src/synthorg/**, scripts/**, cli/scripts/install.{sh,ps1}, workflow file changes, and workflow_dispatch.
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to docs/**/*.md : Documentation source files use Markdown, built with Zensical. Design spec pages (7): index, agents, organization, communication, engine, memory, operations. Architecture pages include decision log. Always link to docs/design/ pages from DESIGN_SPEC.md pointer file.
Applied to files:
CLAUDE.mdsite/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.886Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.886Z
Learning: Applies to **/*.md : Always read the relevant `docs/design/` page before implementing any feature or planning any issue. The design spec in docs/design/ is the starting point for architecture, data models, and behavior. When a spec topic is referenced, read the relevant docs/design/ page before coding.
Applied to files:
CLAUDE.mdsite/src/pages/index.astro
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Applies to web/src/components/** : Vue components organized by feature (agents/, approvals/, budget/, common/, dashboard/, layout/, messages/, org-chart/, tasks/).
Applied to files:
CLAUDE.md
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Applies to web/** : Web dashboard: Node.js 20+, dependencies in web/package.json (Vue 3, PrimeVue, Tailwind CSS, Pinia, VueFlow, ECharts, Axios, vue-draggable-plus, Vitest, fast-check, ESLint, vue-tsc).
Applied to files:
site/package.json
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to web/package.json : Web dashboard dependencies: Node.js 20+, Vue 3, PrimeVue, Tailwind CSS, Pinia (state), VueFlow (visualizations), ECharts (charts), Axios (HTTP), vue-draggable-plus (drag), Vitest (testing), fast-check (property tests), ESLint (linting), vue-tsc (type checking). Install: npm --prefix web install. Dev server: npm --prefix web run dev (http://localhost:5173). Build: npm --prefix web run build. Lint: npm --prefix web run lint. Type check: npm --prefix web run type-check. Test: npm --prefix web run test.
Applied to files:
site/package.json
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to **/*.{js,ts,vue} : Web dashboard uses Vue 3, PrimeVue for UI components, Tailwind CSS for styling, Pinia for state management, VueFlow for visualizations, ECharts for charts, Axios for API calls, vue-draggable-plus for dragging, Vitest for unit tests, fast-check for property-based tests, ESLint for linting, vue-tsc for type checking. Node.js 20+.
Applied to files:
site/package.json
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Always read the relevant `docs/design/` page before implementing any feature or planning any issue. DESIGN_SPEC.md is a pointer file linking to the 7 design pages (index, agents, organization, communication, engine, memory, operations).
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Applies to docker/{Dockerfile*,compose.yml} : Docker: Backend uses 3-stage build (builder → setup → distroless runtime), Chainguard Python, non-root (UID 65532), CIS-hardened. Web uses nginxinc/nginx-unprivileged, Vue 3 SPA with PrimeVue + Tailwind CSS, SPA routing, API/WebSocket proxy to backend.
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to Dockerfile* : Backend Dockerfile: 3-stage build (builder → setup → distroless runtime), Chainguard Python, non-root (UID 65532), CIS-hardened. Web Dockerfile: nginxinc/nginx-unprivileged with Vue 3 SPA (PrimeVue + Tailwind CSS), SPA routing, API/WebSocket proxy to backend. Sandbox Dockerfile: Python 3.14 + Node.js + git, non-root (UID 10001), agent code execution sandbox. All Dockerfiles in docker/.
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to docker/** : All Docker files (Dockerfiles, compose, .env.example) are in docker/. Backend: 3-stage build (builder → setup → distroless), Chainguard Python, non-root UID 65532. Web: nginxinc/nginx-unprivileged, Vue 3 SPA, API/WebSocket proxy. Sandbox: Python 3.14 + Node.js + git, non-root UID 10001.
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to .github/workflows/docker.yml : Docker workflow: builds backend + web + sandbox images, pushes to GHCR, signs with cosign. SLSA L3 provenance attestations via actions/attest-build-provenance. Scans: Trivy (CRITICAL = hard fail, HIGH = warn) + Grype (critical cutoff) + CIS Docker Benchmark v1.6.0 compliance (informational). CVE triage via .github/.trivyignore.yaml and .github/.grype.yaml. Images only pushed after scans pass. Triggers on push to main and version tags (v*).
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Applies to .github/workflows/docker.yml : CI Docker: build → scan → push to GHCR + cosign sign + SLSA L3 provenance via attest-build-provenance (images only pushed after Trivy/Grype scans pass).
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T11:48:14.867Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T11:48:14.867Z
Learning: Dependabot: auto-updates Docker image digests and versions daily.
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to .github/.grype.yaml : CVE triage and configuration for Docker image security scans via .github/.grype.yaml (for Grype).
Applied to files:
site/src/pages/index.astro
📚 Learning: 2026-03-15T19:54:39.887Z
Learnt from: CR
Repo: Aureliolo/synthorg PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T19:54:39.887Z
Learning: Applies to LICENSE : License: BUSL-1.1 with narrowed Additional Use Grant (free production use for non-competing small orgs; converts to Apache 2.0 three years after release). Release workflow auto-updates BSL Change Date in LICENSE to 3 years ahead.
Applied to files:
site/src/pages/index.astro
🔇 Additional comments (13)
site/src/pages/get/view/install-sh.astro (1)
40-40: Contrast update looks good.The label color shift improves visual consistency with the rest of the updated install surfaces.
site/src/pages/get/view/install-ps1.astro (1)
37-37: Nice consistency improvement.This change aligns the PowerShell header label styling with the updated contrast treatment across the site.
site/src/components/Footer.astro (1)
28-28: Footer updates are aligned with the feature scope.Adding the Contact entry and improving footer contrast both look good and match the landing-page UX goals.
Also applies to: 38-38
site/astro.config.mjs (1)
3-3: Sitemap integration wiring is correct.Import and registration are clean and align with the site-level SEO objective.
Also applies to: 10-10
site/public/robots.txt (1)
1-4: robots.txt content is solid.The directives are minimal and correct, and the sitemap reference is in the expected location.
site/src/layouts/Base.astro (2)
7-8: SEO metadata implementation is well-structured.The canonical/OG/Twitter additions and default image/type props are integrated cleanly in the shared layout.
Also applies to: 14-19, 30-44
46-64: Font loading optimization is a good improvement.The non-render-blocking stylesheet strategy plus
<noscript>fallback is a solid performance/UX tradeoff.site/src/pages/get/index.astro (1)
43-47: A11y-focused visual refinements look good.The updated contrast and persistent underline treatment improve readability and link discoverability without affecting behavior.
Also applies to: 54-55, 63-68, 80-81, 92-97, 103-107, 129-130, 162-174, 187-202
site/package.json (1)
13-15: No action needed—versions are compatible.
@astrojs/sitemap@3.7.1does not declare peer dependencies and was explicitly updated for the Astro 6 line. The combinationastro@6.0.4+@astrojs/sitemap@3.7.1resolves successfully (confirmed by the lock file).> Likely an incorrect or invalid review comment.site/src/components/ContactForm.astro (1)
87-90: Defensive DOM guard is solid.Good call on Line 87-Line 90: failing open to native form submission avoids dead-end UX when script wiring is incomplete.
site/src/pages/index.astro (2)
59-71: Early-access banner placement and tone look right.This is unobtrusive, prominent enough, and includes the two intended action links.
420-431: Contact section + JSON-LD integration looks good.Line 420-Line 431 cleanly integrates the new form component, and Line 438-Line 452 adds valid static structured data in-page.
Also applies to: 438-452
CLAUDE.md (1)
83-83: Docs update is consistent with the implementation.The landing-page scope and component list now reflect the new ContactForm + SEO work.
Also applies to: 164-164
- Make early-access banner visible on page load (hero 85vh instead of 100vh) - Remove "Bug Report" from contact form subject (use GitHub issues instead) - Add Sitemap link to footer Legal column - Use querySelector<T> for type-safe DOM lookups, remove redundant casts - Extract description to frontmatter variable, use Astro.site in JSON-LD - Add styles/ to CLAUDE.md site package structure tree
…t form - Add role="status" aria-live="polite" to success message - Add role="alert" aria-live="assertive" to error message - Add tabindex="-1" for programmatic focus targets - Focus the shown message element after form submission - Set aria-hidden on form when hidden after success - Clean up blank line from removed Bug Report option
🤖 I have created a release *beep* *boop* --- ## [0.2.6](v0.2.5...v0.2.6) (2026-03-15) ### Features * add intra-loop stagnation detector ([#415](#415)) ([#458](#458)) ([8e9f34f](8e9f34f)) * add RFC 9457 structured error responses (Phase 1) ([#457](#457)) ([6612a99](6612a99)), closes [#419](#419) * implement AgentStateRepository for runtime state persistence ([#459](#459)) ([5009da7](5009da7)) * **site:** add SEO essentials, contact form, early-access banner ([#467](#467)) ([11b645e](11b645e)), closes [#466](#466) ### Bug Fixes * CLI improvements — config show, completion install, enhanced doctor, Sigstore verification ([#465](#465)) ([9e08cec](9e08cec)) * **site:** add reCAPTCHA v3, main landmark, and docs sitemap ([#469](#469)) ([fa6d35c](fa6d35c)) * use force-tag-creation instead of manual tag creation hack ([#462](#462)) ([2338004](2338004)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Summary
@astrojs/sitemapintegration,robots.txt, and JSON-LDSoftwareApplicationstructured dataContactForm.astro) with honeypot anti-spam, response body validation, error logging, and graceful fallbacksmedia="print" onloadpattern, preconnect toapi.github.comtext-gray-500totext-gray-400for WCAG AA contrast compliance (~7:1 vs ~3.6:1 on dark bg), add persistent underlines to all inline text links (color alone not sufficient)Review coverage
Pre-reviewed by 3 agents (docs-consistency, issue-resolution-verifier, silent-failure-hunter). 6 findings addressed:
Test plan
npm --prefix site run buildpasses (verified)sitemap-index.xml,robots.txt,og-image.pngtext-gray-500remaining, all inline links underlinedCloses #466