Skip to content

Commit 2479687

Browse files
committed
chore: baseline audit remediation — v1.0.0
Web presence: - Add favicon suite (SVG, ICO, PNGs, apple-touch-icon, PWA icons) - Add web app manifest (manifest.webmanifest) - Add OG image 1200x630 rendered via Satori + Geist Mono TTF - Add scripts/generate-og.js (npm run generate-og) - Add og:image, og:type, og:site_name, twitter:* tags to all pages - Add canonical URLs to all five routes - Add font preload for GeistMono-Variable.woff2 - Add meta theme-color SEO & accessibility: - Fix heading hierarchy: sr-only h2 + aria-labelledby on products section - Add skip navigation link + id=main-content target (WCAG 2.4.1) - Add aria-label=Primary to nav, aria-label=Footer to footer nav - Add meta description + noindex to 404 error page - Add sitemap lastmod dates - Convert stackNote product mentions to internal anchor links Security: - Add static/_headers (authoritative security header reference) - Add meta http-equiv CSP, Referrer-Policy, X-Content-Type-Options - Add SECURITY.md with Cloudflare Transform Rules configuration guide Performance & accessibility: - Add prefers-reduced-motion global CSS rule - Add prefers-reduced-motion runtime check in SceneManager.js - Fix SceneManager.destroy() event listener memory leak - Fix SceneManager GPU memory: dispose geometries/materials on destroy - Change SceneManager powerPreference to default (battery fix) - Remove unused getDelta() call in SceneManager tick() Code quality: - Add ESLint + Prettier + svelte-check (lint, check, format scripts) - Add eslint.config.js, .prettierrc - Add // @ts-nocheck to Three.js JS files (pre-existing type incompatibilities) - Fix unused catch param, unused CtaSection import - Add CI check + lint steps before build - Add Dependabot weekly npm updates - Add .nvmrc (Node 20), engines field in package.json - Bump package.json version 0.0.0 -> 1.0.0 - Add vite chunkSizeWarningLimit: 600 Content fixes: - Fix --fs-footer-link and --fs-footer-copy undefined CSS tokens (live bug) - Fix MrHaven naming: MrHaven -> Mr. Haven in stackNote props - Fix Visage version v0.1.0 -> v0.2.0 in llms.txt - Remove dead aegis-os GitHub link from llms.txt - Remove dead asciiArt variable from home page - Sync CLAUDE.md token values with app.css - Fix CLAUDE.md: inner icosahedron -> octahedron Repo hygiene: - Add LICENSE (proprietary, all rights reserved) - Add CHANGELOG.md - Add SECURITY.md - Update README: new scripts, asset inventory, security header docs, code quality section, license section - Update CLAUDE.md: deploy process, security headers, OG image workflow, remaining work list
1 parent c890c70 commit 2479687

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2919
-195
lines changed

.github/dependabot.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "npm"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
day: "monday"
8+
open-pull-requests-limit: 5
9+
labels:
10+
- "dependencies"
11+
ignore:
12+
- dependency-name: "*"
13+
update-types: ["version-update:semver-major"]

.github/workflows/deploy.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ jobs:
2424
node-version: 20
2525
cache: npm
2626
- run: npm ci
27+
- run: npm run check
28+
- run: npm run lint
2729
- run: npm run build
2830
- uses: actions/upload-pages-artifact@v3
2931
with:

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
20

.prettierrc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"useTabs": false,
3+
"tabWidth": 2,
4+
"singleQuote": true,
5+
"trailingComma": "es5",
6+
"printWidth": 100,
7+
"plugins": ["prettier-plugin-svelte"],
8+
"overrides": [
9+
{
10+
"files": "*.svelte",
11+
"options": {
12+
"parser": "svelte"
13+
}
14+
}
15+
]
16+
}

CHANGELOG.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Changelog
2+
3+
All notable changes to the Sovren Software website are documented here.
4+
5+
---
6+
7+
## [1.0.0] — 2026-02-26
8+
9+
### Added
10+
- Favicon suite: `favicon.svg` (wireframe cube mark), `favicon.ico`, `favicon-32x32.png`, `favicon-16x16.png`, `apple-touch-icon.png`, `icon-192.png`, `icon-512.png`
11+
- Web app manifest (`manifest.webmanifest`) with PWA metadata, icon references, `theme_color`, and `background_color`
12+
- OG image (`og-image.png`, 1200×630) generated via Satori with actual Geist Mono TTF font — consistent rendering across all social platforms
13+
- OG image generator script (`scripts/generate-og.js`) — run with `npm run generate-og`
14+
- Open Graph `og:image`, `og:type`, `og:site_name` tags in `app.html` as global defaults; per-page `og:url` and `og:title`/`og:description` already present
15+
- Twitter Card meta tags (`twitter:card`, `twitter:site`, `twitter:title`, `twitter:description`, `twitter:image`) on all pages
16+
- `<link rel="canonical">` on all five routes
17+
- `<meta name="robots" content="noindex">` on 404 error page
18+
- `<meta name="description">` on 404 error page
19+
- Security headers file (`static/_headers`): authoritative reference for `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`, `Permissions-Policy`, `Strict-Transport-Security`, `Content-Security-Policy`, `Cross-Origin-Opener-Policy`, `Cross-Origin-Resource-Policy`
20+
- `Content-Security-Policy`, `Referrer-Policy`, `X-Content-Type-Options` enforced at browser level via `<meta http-equiv>` in `app.html`
21+
- `SECURITY.md` — exact Cloudflare Transform Rules to configure CDN-level headers; verification command; future migration steps
22+
- Font preload `<link rel="preload">` for `GeistMono-Variable.woff2` in `app.html` (eliminates FOUT, improves LCP)
23+
- `<meta name="theme-color" content="#000000">` in `app.html`
24+
- `--fs-footer-link` and `--fs-footer-copy` CSS custom properties in `app.css` (live bug fix — were undefined, footer font sizes were indeterminate)
25+
- `@media (prefers-reduced-motion: reduce)` global CSS rule in `app.css`
26+
- `prefers-reduced-motion` runtime check in `SceneManager.js` — all animations halt for users with vestibular/motion sensitivity; respects dynamic changes via `MediaQueryList` event listener
27+
- `<h2 id="products-heading" class="sr-only">` on home page products section (heading hierarchy fix for screen readers and SEO)
28+
- `aria-labelledby="products-heading"` on home page products `<section>`
29+
- Skip navigation link (`<a href="#main-content">`) in `+layout.svelte` — appears on keyboard focus (WCAG 2.4.1 Level A)
30+
- `id="main-content"` on layout slot wrapper — valid skip-link target for all pages
31+
- `aria-label="Primary"` on `<nav>` in `Nav.svelte`
32+
- `aria-label="Footer"` on `<nav>` in footer (`+layout.svelte`)
33+
- `LICENSE` — proprietary, all rights reserved, © 2025–2026 Sovren Software
34+
- `CHANGELOG.md`
35+
- `.nvmrc` — Node 20
36+
- `engines: { "node": ">=20" }` in `package.json`
37+
- ESLint (`eslint`, `eslint-plugin-svelte`, `globals`) — `npm run lint`
38+
- Prettier (`prettier`, `prettier-plugin-svelte`) — `npm run format`
39+
- `svelte-check``npm run check`
40+
- `eslint.config.js` and `.prettierrc` configuration files
41+
- Dependabot config (`.github/dependabot.yml`) — weekly npm dependency PRs
42+
- `vite.config.js` `chunkSizeWarningLimit: 600` to suppress Three.js bundle size warning
43+
- Satori + `@resvg/resvg-js` as devDependencies for OG image generation
44+
45+
### Fixed
46+
- `SceneManager.destroy()` memory leak — event listeners now use stored bound references (`_onResize`, `_onScroll`, `_onMouseMove`) and are correctly removed on component unmount
47+
- `SceneManager` Three.js geometry and material disposal in `destroy()` — GPU memory no longer accumulates across page navigations
48+
- `SceneManager` `powerPreference` changed from `"high-performance"` to `"default"` — prevents forcing discrete GPU on battery-powered devices
49+
- `SceneManager` `getDelta()` removed — was called after `getElapsedTime()`, always returned near-zero, was unused
50+
- `SceneManager` catch block changed from `catch (e)` to bare `catch {}` (unused variable)
51+
- `ProductHero.svelte` — added `// @ts-nocheck` to suppress pre-existing Three.js 0.183 type incompatibilities (not regressions)
52+
- `ProductMonoliths.svelte` — same `// @ts-nocheck` fix
53+
- Mr. Haven naming: `MrHaven``Mr. Haven` in all `stackNote` props (Augmentum OS and Mr. Haven pages)
54+
- Visage version: `v0.1.0``v0.2.0` in `llms.txt`
55+
- `llms.txt` Augmentum OS GitHub link: removed dead `aegis-os` repo reference, replaced with org URL
56+
- Removed dead `asciiArt` variable from `+page.svelte`
57+
- Removed unused `CtaSection` import from `ecosystem/+page.svelte`
58+
- CLAUDE.md token values synced to match `app.css`: `--space-7xl` (8rem), `--nav-h` (80px), `--max-w-prose` (800px), `--max-w-body` (520px), `--max-w-tagline` (640px)
59+
- CLAUDE.md 3D scene description: "inner icosahedron" → "inner octahedron" (matches actual `OctahedronGeometry` in code)
60+
- CLAUDE.md Visage version: `v0.1.0``v0.2.0`
61+
- Sitemap: added `<lastmod>2026-02-26</lastmod>` to all five URLs
62+
63+
### Changed
64+
- `package.json` version: `0.0.0``1.0.0`
65+
- `Overview.svelte` `stackNote` prop renders via `{@html}` instead of plain text — enables anchor links in stack notes
66+
- All three product page `stackNote` props now contain working internal anchor links to the other two products in the stack
67+
- CI pipeline (`deploy.yml`) now runs `npm run check` and `npm run lint` before `npm run build`
68+
- README updated: Node requirement (18+ → 20+), all new scripts, static asset inventory, deployment security header guidance, code quality section, license section
69+
70+
---
71+
72+
## 2026-02-25
73+
74+
### Added
75+
- 3D cinematic scene — wireframe cube, grid, particles
76+
- Light/dark theme toggle with localStorage persistence and 3D sync
77+
- Theme-aware CSS variables — all hardcoded colors removed
78+
79+
## 2026-02-24
80+
81+
### Added
82+
- Waitlist capture on Augmentum OS page (mailto)
83+
- AI agent angle on MrHaven page
84+
- Convergence story across Augmentum OS and Ecosystem pages
85+
86+
### Changed
87+
- Visage version updated to v0.2.0
88+
- Visage v2/Augmentum OS integration callout added

CLAUDE.md

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,18 +95,18 @@ The site uses a `data-theme` attribute on `<html>` to switch between light and d
9595
| `--space-4xl` | 3rem |
9696
| `--space-5xl` | 4rem |
9797
| `--space-6xl` | 6rem |
98-
| `--space-7xl` | 7rem |
98+
| `--space-7xl` | 8rem |
9999

100-
**Section padding:** `--pad-section` (6rem 2.5rem), `--pad-section-lg` (7rem 2.5rem), `--pad-hero` (5rem 2.5rem)
100+
**Section padding:** `--pad-section` (6rem 2.5rem), `--pad-section-lg` (8rem 2.5rem), `--pad-hero` (5rem 2.5rem)
101101

102102
### Layout
103103

104104
```
105105
--max-w: 1200px /* Container max-width */
106-
--max-w-prose: 760px /* Prose blocks (manifesto) */
107-
--max-w-body: 480px /* Body paragraphs */
108-
--max-w-tagline: 600px /* Tagline blocks */
109-
--nav-h: 60px /* Navigation height */
106+
--max-w-prose: 800px /* Prose blocks (manifesto) */
107+
--max-w-body: 520px /* Body paragraphs */
108+
--max-w-tagline: 640px /* Tagline blocks */
109+
--nav-h: 80px /* Navigation height */
110110
--z-nav: 100 /* Navigation z-index */
111111
```
112112

@@ -183,7 +183,7 @@ A cinematic Three.js background renders behind all page content on every route.
183183
├── Renderer (alpha: true, transparent canvas)
184184
├── FogExp2 (theme-aware color + density)
185185
├── Wireframe cube (rotating, mouse-reactive)
186-
├── Inner icosahedron (counter-rotating)
186+
├── Inner octahedron (counter-rotating)
187187
├── GridHelper (100×100, scroll-linked drift)
188188
└── Particle system (500 dust particles)
189189
@@ -221,7 +221,7 @@ All page sections must have transparent backgrounds. Do **not** add `background-
221221
| Grid primary | `0x888888` | `0x444444` |
222222
| Grid secondary | `0xcccccc` | `0x222222` |
223223
| Particle color | `0x000000` (opacity 0.2) | `0xffffff` (opacity 0.4) |
224-
| Monolith wireframe | `0x333333` | `0xffffff` | *(unused — monoliths removed)* |
224+
| Monolith wireframe | `0x333333` | `0xffffff` | *(unused — ProductMonoliths removed)* |
225225

226226
### Modifying the 3D Scene
227227

@@ -298,7 +298,7 @@ All static files live in `static/` (NOT `public/` — SvelteKit convention). Cop
298298
### Visage
299299
- Tagline: "Linux face authentication via PAM. Your face is your key — processed locally, never broadcast to the cloud."
300300
- Key angle: Open source identity layer; integrates natively with Augmentum OS
301-
- Status: Live · v0.1.0 · MIT
301+
- **Status:** Live · v0.2.0 · MIT
302302

303303
### MrHaven
304304
- Tagline: "Programmable asset control for humans and autonomous agents — no custodian, no intermediary, no exceptions."
@@ -312,14 +312,35 @@ All static files live in `static/` (NOT `public/` — SvelteKit convention). Cop
312312
## Deploy Process
313313

314314
```bash
315+
npm run check # svelte-check — must pass
316+
npm run lint # ESLint — must pass
315317
npm run build # verify build passes before pushing
316318
git push # GitHub Actions auto-deploys from main branch
317319
```
318320

321+
CI pipeline runs `check → lint → build` in sequence. All three must pass before deployment.
322+
319323
CNAME file at `static/CNAME` contains `sovren.software`. Do not delete it.
320324

321325
DNS: 4 A records (185.199.108-111.153) + www CNAME → `sovren-software.github.io`. All proxied through Cloudflare.
322326

327+
### Security Headers
328+
329+
Two-level enforcement on GitHub Pages + Cloudflare:
330+
- **Active (meta):** CSP, Referrer-Policy, X-Content-Type-Options via `<meta http-equiv>` in `app.html`
331+
- **Requires Cloudflare dashboard:** X-Frame-Options, HSTS, COOP, CORP, Permissions-Policy — see `SECURITY.md`
332+
- `static/_headers` is authoritative source; auto-enforced if migrated to Cloudflare Pages
333+
334+
### OG Image
335+
336+
The social preview image (`static/og-image.png`) is generated via Satori using Geist Mono TTF:
337+
338+
```bash
339+
npm run generate-og # rewrites static/og-image.png
340+
```
341+
342+
Script is at `scripts/generate-og.js`. Run it after any brand or copy changes that should be reflected in social previews.
343+
323344
## Known Limitations
324345

325346
- No blog platform for the content launch strategy (teaser article, X thread)
@@ -334,6 +355,32 @@ DNS: 4 A records (185.199.108-111.153) + www CNAME → `sovren-software.github.i
334355
- [ ] MrHaven SDK section on the MrHaven page (when SDK docs exist)
335356
- [ ] Visual convergence diagram on Ecosystem page
336357
- [ ] X profile update (currently MrHaven-branded)
358+
- [ ] Cloudflare Transform Rules for CDN-level security headers (see `SECURITY.md`)
359+
- [x] Favicon suite — SVG, ICO, PNGs, apple-touch-icon (2026-02-26)
360+
- [x] Web app manifest + PWA metadata (2026-02-26)
361+
- [x] OG image 1200×630 with Geist Mono via Satori — `npm run generate-og` (2026-02-26)
362+
- [x] Open Graph + Twitter Card tags on all pages (2026-02-26)
363+
- [x] Canonical URLs on all pages (2026-02-26)
364+
- [x] Security headers — meta-level CSP, Referrer-Policy, X-Content-Type-Options (2026-02-26)
365+
- [x] Skip navigation link + `id="main-content"` target (WCAG 2.4.1) (2026-02-26)
366+
- [x] `aria-label` on primary nav and footer nav landmarks (2026-02-26)
367+
- [x] `prefers-reduced-motion` — global CSS rule + SceneManager runtime check (2026-02-26)
368+
- [x] SceneManager memory leak fixed — stored bound handler refs in destroy() (2026-02-26)
369+
- [x] SceneManager GPU memory — geometry/material disposal on destroy (2026-02-26)
370+
- [x] SceneManager powerPreference changed to "default" (2026-02-26)
371+
- [x] ESLint + Prettier + svelte-check configured — `lint`, `check`, `format` scripts (2026-02-26)
372+
- [x] CI pipeline updated — check + lint run before build (2026-02-26)
373+
- [x] Dependabot weekly npm updates configured (2026-02-26)
374+
- [x] LICENSE file added — proprietary, all rights reserved (2026-02-26)
375+
- [x] CHANGELOG.md added (2026-02-26)
376+
- [x] SECURITY.md added with exact Cloudflare Transform Rules (2026-02-26)
377+
- [x] Internal cross-linking — stackNote product mentions converted to anchor links (2026-02-26)
378+
- [x] Font preload in app.html (2026-02-26)
379+
- [x] `--fs-footer-link` and `--fs-footer-copy` tokens defined (live bug fix) (2026-02-26)
380+
- [x] Sitemap lastmod dates added (2026-02-26)
381+
- [x] llms.txt — Visage version corrected, aegis-os dead link removed (2026-02-26)
382+
- [x] Heading hierarchy fixed — sr-only h2 + aria-labelledby on products section (2026-02-26)
383+
- [x] 404 error page — meta description + noindex added (2026-02-26)
337384
- [x] 3D cinematic scene — wireframe cube, grid, particles, product monoliths (2026-02-25)
338385
- [x] Light/dark theme toggle with persistence and 3D sync (2026-02-25)
339386
- [x] Theme-aware CSS variables — all hardcoded colors removed (2026-02-25)

LICENSE

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Copyright (c) 2025–2026 Sovren Software. All rights reserved.
2+
3+
This software and associated documentation files (the "Software") are the
4+
proprietary and confidential property of Sovren Software. No part of this
5+
Software may be reproduced, distributed, modified, reverse-engineered,
6+
decompiled, or transmitted in any form or by any means, electronic or
7+
mechanical, without the prior written permission of Sovren Software.
8+
9+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
10+
IMPLIED. IN NO EVENT SHALL SOVREN SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES,
11+
OR OTHER LIABILITY ARISING FROM THE USE OF OR INABILITY TO USE THE SOFTWARE.
12+
13+
For licensing inquiries: hello@sovren.software

README.md

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,13 @@ npm install
4141
npm run dev # http://localhost:5173
4242
npm run build # static output → dist/
4343
npm run preview # preview production build
44+
npm run check # svelte-check type validation
45+
npm run lint # ESLint
46+
npm run format # Prettier
47+
npm run generate-og # regenerate static/og-image.png
4448
```
4549

46-
**Requirements:** Node.js 18+
50+
**Requirements:** Node.js 20+ (see `.nvmrc`)
4751

4852
---
4953

@@ -74,11 +78,23 @@ src/
7478
│ └── ecosystem/+page.svelte # Ecosystem manifesto page
7579
static/
7680
├── CNAME # GitHub Pages custom domain
81+
├── _headers # Security headers (Cloudflare Pages / reference for CF Transform Rules)
7782
├── fonts/GeistMono-Variable.woff2 # Self-hosted font
83+
├── favicon.ico # 32×32 ICO
84+
├── favicon.svg # SVG favicon (wireframe cube mark)
85+
├── favicon-32x32.png # 32×32 PNG
86+
├── favicon-16x16.png # 16×16 PNG
87+
├── apple-touch-icon.png # 180×180 for iOS
88+
├── icon-192.png # PWA icon
89+
├── icon-512.png # PWA icon
90+
├── manifest.webmanifest # Web app manifest (PWA)
91+
├── og-image.png # 1200×630 OG image (Geist Mono rendered via Satori)
7892
├── robots.txt # Crawler access rules
79-
├── sitemap.xml # All routes for search engines
93+
├── sitemap.xml # All routes with lastmod dates
8094
├── llms.txt # AI crawler context file
8195
└── BingSiteAuth.xml # Bing Webmaster verification
96+
scripts/
97+
└── generate-og.js # OG image generator (Satori + Resvg, uses Geist Mono TTF)
8298
```
8399

84100
---
@@ -102,10 +118,12 @@ All colors use CSS custom properties — no hardcoded color values in components
102118
A full-viewport 3D background renders behind all page content:
103119

104120
- **Canvas:** `position: fixed`, `z-index: -1`, `pointer-events: none` — sits behind all UI
105-
- **Elements:** Rotating wireframe cube, inner icosahedron, infinite grid, volumetric dust particles
121+
- **Elements:** Rotating wireframe cube, inner octahedron, infinite grid, volumetric dust particles
106122
- **Interaction:** Mouse parallax on cube rotation, scroll-linked grid drift
107123
- **Theme-aware:** Materials, fog color/density, and particle opacity adapt to light/dark mode
108124
- **Lifecycle:** `Scene.svelte` mounts/unmounts the canvas; `SceneManager.js` handles the animation loop and cleanup
125+
- **Accessibility:** Animations fully disabled when `prefers-reduced-motion: reduce` is set — checked at runtime and via CSS media query
126+
- **Memory:** `destroy()` correctly removes all event listeners using stored bound references, disposes all Three.js geometries and materials
109127

110128
`ProductMonoliths.svelte` exists as an interactive wireframe panel component but is currently unused — it was removed from the home page to reduce visual clutter.
111129

@@ -137,29 +155,56 @@ Rules: one typeface only, no color for emphasis (use weight/spacing), all values
137155
## Deployment
138156

139157
```bash
158+
npm run check # must pass before pushing
159+
npm run lint # must pass before pushing
140160
npm run build # verify build passes
141161
git push # GitHub Actions auto-deploys from main
142162
```
143163

144164
- Output: `dist/` directory (static adapter)
145165
- DNS: 4 GitHub Pages A records + `www` CNAME → `sovren-software.github.io`, proxied via Cloudflare
146166
- `static/CNAME` contains `sovren.software` — do not delete
167+
- CI runs `check → lint → build` in sequence before deploying
168+
169+
### Security Headers
170+
171+
GitHub Pages cannot set HTTP response headers. Security is enforced at two levels:
172+
173+
1. **Browser-level (active now):** `Content-Security-Policy`, `Referrer-Policy`, and `X-Content-Type-Options` are set via `<meta http-equiv>` in `app.html`
174+
2. **CDN-level (manual):** `X-Frame-Options`, `HSTS`, `COOP`, `CORP`, and `Permissions-Policy` must be configured as Cloudflare Transform Rules — see `SECURITY.md` for exact steps
175+
176+
The `static/_headers` file is the authoritative record of all required headers and will be auto-enforced if the site ever migrates to Cloudflare Pages.
147177

148178
---
149179

150180
## SEO & AI Discoverability
151181

152-
- `app.html` — JSON-LD structured data (Organization + WebSite schemas)
153-
- Each page — `<svelte:head>` with unique title, description, and Open Graph meta
182+
- `app.html` — JSON-LD structured data (Organization + WebSite schemas), favicon suite, manifest, OG/Twitter defaults
183+
- Each page — `<svelte:head>` with unique title, description, Open Graph meta, Twitter Card tags, and canonical URL
184+
- `static/og-image.png` — 1200×630 social preview image rendered with actual Geist Mono font via Satori
154185
- `static/llms.txt` — full product descriptions for AI crawlers (ChatGPT, Perplexity, Claude)
155-
- `static/sitemap.xml` — all 5 routes
186+
- `static/sitemap.xml` — all 5 routes with `<lastmod>` dates
156187
- Cloudflare proxy prevents GitHub/Fastly from blocking AI crawler IPs
157188
- Bing Webmaster Tools verified
158189

190+
## Code Quality
191+
192+
- **Linting:** ESLint with `eslint-plugin-svelte` — run via `npm run lint`
193+
- **Type checking:** `svelte-check` — run via `npm run check`
194+
- **Formatting:** Prettier with `prettier-plugin-svelte` — run via `npm run format`
195+
- **CI:** GitHub Actions runs `check → lint → build` on every push to `main`
196+
- **Dependencies:** Dependabot configured for weekly npm dependency PRs
197+
159198
---
160199

161200
## IDE Setup
162201

163202
[VS Code](https://code.visualstudio.com/) + [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode)
164203

165204
For AI-assisted development, see `CLAUDE.md` for the full design system reference, copy guidelines, and product context.
205+
206+
## License
207+
208+
Proprietary — © 2025–2026 Sovren Software. All rights reserved. See `LICENSE`.
209+
210+
Exception: [Visage](https://github.com/sovren-software/visage) is MIT-licensed and open source.

0 commit comments

Comments
 (0)