You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- 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
- 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`)
-`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`
-**Interaction:** Mouse parallax on cube rotation, scroll-linked grid drift
107
123
-**Theme-aware:** Materials, fog color/density, and particle opacity adapt to light/dark mode
108
124
-**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
109
127
110
128
`ProductMonoliths.svelte` exists as an interactive wireframe panel component but is currently unused — it was removed from the home page to reduce visual clutter.
111
129
@@ -137,29 +155,56 @@ Rules: one typeface only, no color for emphasis (use weight/spacing), all values
137
155
## Deployment
138
156
139
157
```bash
158
+
npm run check # must pass before pushing
159
+
npm run lint # must pass before pushing
140
160
npm run build # verify build passes
141
161
git push # GitHub Actions auto-deploys from main
142
162
```
143
163
144
164
- Output: `dist/` directory (static adapter)
145
165
- DNS: 4 GitHub Pages A records + `www` CNAME → `sovren-software.github.io`, proxied via Cloudflare
146
166
-`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.
147
177
148
178
---
149
179
150
180
## SEO & AI Discoverability
151
181
152
-
-`app.html` — JSON-LD structured data (Organization + WebSite schemas)
153
-
- Each page — `<svelte:head>` with unique title, description, and Open Graph meta
0 commit comments