mirror of
https://github.com/andwati/andwati.com.git
synced 2026-10-18 09:22:53 +00:00
Nav bar & layout consistency - Base.astro's `wide` layout now defaults on for every page (was opt-in), fixing the nav bar wrapping differently depending on page width - Icon buttons for search and theme toggle (magnifying glass, sun/moon), replacing the plain "Search" text link and the "◐" glyph - Search is now a Cmd/Ctrl+K modal over Pagefind (lazy-loaded on first open) instead of a separate /search/ page, matching the old site - Fixed the article page's TOC sitting with unwanted left padding relative to the header (grid was center-justified instead of start-justified) Smooth navigation - Added Astro's ClientRouter for animated page transitions - Every page-local script that only ran once at module load (three.js hero, minimap, comments, book-spine carousel, scroll-to-top, reading progress, theme toggle, Pagefind init) now re-initializes via astro:page-load, with AbortController-based cleanup so window/document listeners don't accumulate across client-side navigations Restored from the legacy Zola site - Reading progress bar (article pages) and scroll-to-top button - Share buttons (X, Bluesky, LinkedIn, Reddit, HN, email) on writings - Prev/next post navigation with the old label/title layout - Utterances comments, wired to andwati/andwati.com with dark/light theme sync - YouTube embeds: any plain <iframe src="...youtube-nocookie.com..."> is now auto-wrapped in a responsive 16:9 container, gets loading="lazy", and emits VideoObject JSON-LD — no shortcode needed - LaTeX: $inline$ and $$block$$ math renders to static HTML via KaTeX at build time (no client-side JS shipped for it) - Tags page redesigned as a centered, alphabetical tag cloud Removed the related-posts section per request. Accessibility & contrast - --accent (#d1502f) measured 4.0:1 on the light background, just under WCAG AA's 4.5:1 for normal text — darkened to #a84025 (5.7:1), plus matching light-mode-only fixes for the two hljs syntax colors and the tip/warning callout colors that had the same problem in light mode - Fixed heading-order violations (h1 straight to h3 with nothing at h2) across the homepage, writings/portfolio/bookshelf/blogs lists, and tag pages — introduced a shared .entry-title class for the h2 list titles - Fixed inconsistent title-link underline colors: a plain <a> carries its own default underline (in its own text color) instead of matching its parent heading's accent-colored one — h1/h2/h3 anchors now explicitly inherit the heading's decoration - Bookshelf spine colors are generated per-title from a hash; the lightness-based text-color heuristic could still produce sub-4.5:1 contrast for some hues (e.g. green) — now computes real WCAG contrast and adjusts Performance - The three.js homepage hero was the single largest main-thread cost site-wide (dragging that page's Lighthouse performance score to the low 80s while every other page scored 95+): three.js is now dynamically imported only once the browser is idle (WebGL-support check split into its own tiny module so unsupported browsers never fetch it at all), the render loop is capped to ~30fps, and hover raycasting only runs on an actual pointer move instead of every frame SEO & structured data - Self-referential canonical links site-wide (with override support for posts first published elsewhere) - Sitewide WebSite/Person JSON-LD, plus per-article BlogPosting, BreadcrumbList, and (when applicable) VideoObject JSON-LD - robots.txt explicitly welcomes AI/LLM crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, etc.) and points at llms.txt - Added an Atom feed (RSS and JSON Feed already existed) - Sitemap now sets <lastmod> per entry from its own date/updated frontmatter instead of leaving every URL at build time Analytics & comments infra - Self-hosted Umami wiring via PUBLIC_UMAMI_SCRIPT_URL/WEBSITE_ID (apps/site/.env.example), no-ops until both are set - sws.toml's CSP updated to allow utteranc.es and analytics.andwati.com — without this both were silently blocked in production Lighthouse CI - @lhci/cli wired up against the built site (mobile + desktop configs), `pnpm run lighthouse`, and a GitHub Actions workflow to run it on every push/PR — reporting only for now, no failing thresholds
128 lines
3.6 KiB
TOML
128 lines
3.6 KiB
TOML
[general]
|
|
page404 = "./404.html"
|
|
|
|
[advanced]
|
|
|
|
[[advanced.headers]]
|
|
source = "**"
|
|
[advanced.headers.headers]
|
|
Content-Security-Policy = "default-src 'self'; script-src 'self' 'unsafe-inline' https://utteranc.es https://analytics.andwati.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self' https://analytics.andwati.com; frame-src https://www.youtube-nocookie.com https://utteranc.es; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests"
|
|
X-Frame-Options = "DENY"
|
|
X-Content-Type-Options = "nosniff"
|
|
Referrer-Policy = "strict-origin-when-cross-origin"
|
|
Permissions-Policy = "camera=(), microphone=(), geolocation=(), interest-cohort=()"
|
|
Strict-Transport-Security = "max-age=63072000; includeSubDomains; preload"
|
|
|
|
[[advanced.redirects]]
|
|
source = "/security.txt"
|
|
destination = "/.well-known/security.txt"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/index.xml"
|
|
destination = "/rss.xml"
|
|
kind = 301
|
|
|
|
# BEGIN migrated-posts-redirects (generated by scripts/migrate-posts-to-writings.mjs)
|
|
[[advanced.redirects]]
|
|
source = "/posts/a-fresh-coat-of-paint/"
|
|
destination = "/writings/a-fresh-coat-of-paint/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/file-over-app/"
|
|
destination = "/writings/file-over-app/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/from-c-to-machine-code/"
|
|
destination = "/writings/from-c-to-machine-code/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/generate-django-secret-key/"
|
|
destination = "/writings/generate-django-secret-key/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/hello-world/"
|
|
destination = "/writings/hello-world/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/inertia/"
|
|
destination = "/writings/inertia/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/install-postgresql-15-on-arch-manjaro-garuda-linux/"
|
|
destination = "/writings/install-postgresql-15-on-arch-manjaro-garuda-linux/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/integrating-netlify/"
|
|
destination = "/writings/integrating-netlify/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/javascript-exporting-modules/"
|
|
destination = "/writings/javascript-exporting-modules/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/mmuctf2025/"
|
|
destination = "/writings/mmuctf2025/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/obsidian-sync/"
|
|
destination = "/writings/obsidian-sync/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/scriptctf2025/"
|
|
destination = "/writings/scriptctf2025/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/self-hosting-gitea-and-mirroring-github/"
|
|
destination = "/writings/self-hosting-gitea-and-mirroring-github/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/semantic-version-and-conventional-commits/"
|
|
destination = "/writings/semantic-version-and-conventional-commits/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/subresource-integrity/"
|
|
destination = "/writings/subresource-integrity/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/the-single-byte-that-kills-your-exploit-understanding-endianness/"
|
|
destination = "/writings/the-single-byte-that-kills-your-exploit-understanding-endianness/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/utterances-comments/"
|
|
destination = "/writings/utterances-comments/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/vuejs-tailwind/"
|
|
destination = "/writings/vuejs-tailwind/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/what-is-pwn/"
|
|
destination = "/writings/what-is-pwn/"
|
|
kind = 301
|
|
|
|
[[advanced.redirects]]
|
|
source = "/posts/wifi-hotspot-arch/"
|
|
destination = "/writings/wifi-hotspot-arch/"
|
|
kind = 301
|
|
|
|
# END migrated-posts-redirects
|