commits
Support accessing Standard.site publications via rkey (e.g. /3m3x4bgbsh22k)
in addition to slugs (e.g. /blog). Both work interchangeably across all
routes including RSS feeds and document paths.
Update all Bluesky profile, post, mention, and hashtag URLs to use
witchsky.app domain instead of bsky.app. Changes affect Footer,
BlueskyPostCard, ProfileCard components and url utility functions.
BREAKING CHANGE: Removed all WhiteWind and Leaflet platform support in favor of Standard.site exclusively.
Major changes:
- Remove WhiteWind and Leaflet document/publication fetching
- Create new Standard.site documents service (documents.ts)
- Replace BlogPostCard with DocumentCard component
- Update all routes to use Standard.site publications only
- Remove PUBLIC_ENABLE_WHITEWIND environment variable
- Update archive page to display Standard.site documents
- Fix fetchFn parameter passing in musicbrainz.ts and fetch.ts
- Update README with Standard.site-only documentation
- Simplify publication system to single platform
- Remove Leaflet publication base_path logic
All slug mappings now point exclusively to Standard.site publications.
RSS feeds now generate from Standard.site documents only.
Archive page displays Standard.site documents grouped by date.
Migration guide available in updated README.md
Apply consistent formatting across the entire codebase:
- Normalize indentation to tabs
- Format arrays and objects for readability
- Adjust whitespace and line breaks
- Standardize quote usage
- Format CSS color values consistently
No functional changes - formatting only.
- Add type annotations to map callbacks
- Use SvelteKit env instead of process.env
Add support for Standard.site publications and documents alongside Leaflet
and WhiteWind. Includes platform-aware routing, theme support, and unified
blog feed integration.
- New: fetchStandardSitePublications() and fetchStandardSiteDocuments()
- New: Platform-aware slug mappings with 'leaflet' | 'standard.site'
- New: Comprehensive documentation and migration guides
- Enhanced: BlogPost type includes 'standard.site' platform
- Enhanced: Route handlers support Standard.site redirects
Fully backwards compatible - no breaking changes.
See docs/standard-site-integration.md for details.
- Move data fetching from server to client for non-blocking loads
- Update Footer to fetch its own data with onMount
- Enable progressive content streaming with existing skeletons
- Combine with caching system for optimal performance
Results: 50-200ms initial load, zero 504 errors, content streams in progressively
- Add configurable cache TTL system with environment-aware defaults
- Implement dynamic TTL based on data type (profile: 60m, music: 10m, identity: 24h)
- Add HTTP Cache-Control headers for browser and CDN caching
- Cache identity resolution to reduce Slingshot API calls
- Add stale-while-revalidate for graceful cache updates
- Update environment configuration with optional cache TTL overrides
Fixes 504 Gateway Timeout errors by reducing AT Protocol API calls
and serving cached responses. All cache durations are configurable
via environment variables while maintaining DRY principles.
- Add pronouns field to ProfileData and PostAuthor types
- Fetch pronouns from profile record in addition to profile view
- Display pronouns below handle in ProfileCard component
- Style with subtle italic text for visual consistency
- Gracefully handle cases where pronouns are not set or fetch fails
- Add shared dropdown state management via new dropdownState store
- Move mobile theme dropdown rendering to Header component
- Implement mutually exclusive dropdown behavior (nav menu vs theme picker)
- Mobile theme dropdown now pushes content down instead of overlaying
- Add proper Svelte 5 $state runes for reactive variables
- Improve accessibility with proper ARIA labels and roles
- Sync active state styling between desktop and mobile dropdowns
- Update "color" to "colour" for British English consistency
- Introduced the Sage theme with a palette of green-blue, mint, and jade.
- Added the Slate theme featuring blue-grey tones with sophisticated slate and steel grey.
- Implemented the Sunset theme showcasing warm orange, golden yellow, and deep amber.
- Launched the Teal theme highlighting cool teal, aqua, and deep turquoise.
Add self-start to InternalCard to constrain vertical height based on
content, fixing unnecessary stretching in masonry layout
- Add IntersectionObserver to DecimalClock to detect visibility
- Stop interval computation when clock is hidden on mobile/scroll
- Use $effect in DecimalClockInfoBox to track modal visibility
- Only update traditional time when info modal is open
- Add proper interval cleanup on component unmount
Saves CPU cycles and improves battery life by preventing
unnecessary time computations when components are not visible.
Implement comprehensive accessibility improvements including:
- Skip-to-content link and keyboard navigation
- Enhanced focus indicators with high contrast support
- Proper ARIA labels, roles, and live regions
- Reduced motion support
- Semantic HTML fixes
- Decimal clock UI improvements with base indicators
Fixes all accessibility violations and meets WCAG AA standards.
- Add CSP directives for Google Fonts (style-src-elem, font-src)
- Include @atproto/api in Vite optimizeDeps (something about CommonJS?)
- Replace flex-grow with grow utility class in layout
Fixes CSP blocking of fonts.googleapis.com and fonts.gstatic.com
Apparently Vite needed to transform @atproto/api or something? It works now.
- Change manualChunks from object to function to handle SSR externals
- Only chunk client-side libraries (lucide, hls.js)
- Exclude @atproto/api from optimization as it's server-side only
- Let Vite automatically handle other vendor chunking
- Replace deprecated flex-shrink-0 with modern shrink-0 utility class
- Fix important modifier syntax in LinkCard (!flex-row → flex-row!)
- Update MusicStatusCard icon classes for consistency
- Replace generic skeletons with component-specific loading states
- Wrap all skeletons in proper Card components with correct styling
- Update DynamicLinks skeleton to match LinkCard structure (emoji, title, description)
- Fix TangledRepoCard import and usage in home page
- Remove non-existent TangledRepos export from layout index
- Added domain-specific terms to .cspell.json, including 'ACTIVITYPUB', 'changefreq', 'urlset', and 'Scrobbles'.
- Reformatted ignorePaths and ignoreRegExpList in .cspell.json to use multi-line arrays for better readability.
- Removed a trailing comma in src/lib/data/slug-mappings.ts to enforce consistent code style.
Removed the lengthy inline configuration section from README.md to reduce redundancy.
- Replaced detailed setup steps with a link to the new CONFIGURATION.md.
- Simplified the 'Quick Start' instructions to four concise steps.
- Fixed minor indentation formatting in the slug mapping example.
Created a new CONFIGURATION.md file to serve as the central source of truth for site setup.
This guide includes:
- Prerequisites including Node.js and AT Protocol DIDs.
- Detailed environment variable setup for .env.local.
- Instructions for mapping URL slugs to Leaflet publication rkeys.
- Steps for customizing static files like robots.txt, sitemap.xml, and favicons.
- Advanced configuration for optional features like WhiteWind and Slingshot.
- A comprehensive troubleshooting section for common issues.
BREAKING CHANGE: Removed all WhiteWind and Leaflet platform support in favor of Standard.site exclusively.
Major changes:
- Remove WhiteWind and Leaflet document/publication fetching
- Create new Standard.site documents service (documents.ts)
- Replace BlogPostCard with DocumentCard component
- Update all routes to use Standard.site publications only
- Remove PUBLIC_ENABLE_WHITEWIND environment variable
- Update archive page to display Standard.site documents
- Fix fetchFn parameter passing in musicbrainz.ts and fetch.ts
- Update README with Standard.site-only documentation
- Simplify publication system to single platform
- Remove Leaflet publication base_path logic
All slug mappings now point exclusively to Standard.site publications.
RSS feeds now generate from Standard.site documents only.
Archive page displays Standard.site documents grouped by date.
Migration guide available in updated README.md
Add support for Standard.site publications and documents alongside Leaflet
and WhiteWind. Includes platform-aware routing, theme support, and unified
blog feed integration.
- New: fetchStandardSitePublications() and fetchStandardSiteDocuments()
- New: Platform-aware slug mappings with 'leaflet' | 'standard.site'
- New: Comprehensive documentation and migration guides
- Enhanced: BlogPost type includes 'standard.site' platform
- Enhanced: Route handlers support Standard.site redirects
Fully backwards compatible - no breaking changes.
See docs/standard-site-integration.md for details.
- Move data fetching from server to client for non-blocking loads
- Update Footer to fetch its own data with onMount
- Enable progressive content streaming with existing skeletons
- Combine with caching system for optimal performance
Results: 50-200ms initial load, zero 504 errors, content streams in progressively
- Add configurable cache TTL system with environment-aware defaults
- Implement dynamic TTL based on data type (profile: 60m, music: 10m, identity: 24h)
- Add HTTP Cache-Control headers for browser and CDN caching
- Cache identity resolution to reduce Slingshot API calls
- Add stale-while-revalidate for graceful cache updates
- Update environment configuration with optional cache TTL overrides
Fixes 504 Gateway Timeout errors by reducing AT Protocol API calls
and serving cached responses. All cache durations are configurable
via environment variables while maintaining DRY principles.
- Add shared dropdown state management via new dropdownState store
- Move mobile theme dropdown rendering to Header component
- Implement mutually exclusive dropdown behavior (nav menu vs theme picker)
- Mobile theme dropdown now pushes content down instead of overlaying
- Add proper Svelte 5 $state runes for reactive variables
- Improve accessibility with proper ARIA labels and roles
- Sync active state styling between desktop and mobile dropdowns
- Update "color" to "colour" for British English consistency
- Introduced the Sage theme with a palette of green-blue, mint, and jade.
- Added the Slate theme featuring blue-grey tones with sophisticated slate and steel grey.
- Implemented the Sunset theme showcasing warm orange, golden yellow, and deep amber.
- Launched the Teal theme highlighting cool teal, aqua, and deep turquoise.
- Add IntersectionObserver to DecimalClock to detect visibility
- Stop interval computation when clock is hidden on mobile/scroll
- Use $effect in DecimalClockInfoBox to track modal visibility
- Only update traditional time when info modal is open
- Add proper interval cleanup on component unmount
Saves CPU cycles and improves battery life by preventing
unnecessary time computations when components are not visible.
Implement comprehensive accessibility improvements including:
- Skip-to-content link and keyboard navigation
- Enhanced focus indicators with high contrast support
- Proper ARIA labels, roles, and live regions
- Reduced motion support
- Semantic HTML fixes
- Decimal clock UI improvements with base indicators
Fixes all accessibility violations and meets WCAG AA standards.
- Add CSP directives for Google Fonts (style-src-elem, font-src)
- Include @atproto/api in Vite optimizeDeps (something about CommonJS?)
- Replace flex-grow with grow utility class in layout
Fixes CSP blocking of fonts.googleapis.com and fonts.gstatic.com
Apparently Vite needed to transform @atproto/api or something? It works now.
- Replace generic skeletons with component-specific loading states
- Wrap all skeletons in proper Card components with correct styling
- Update DynamicLinks skeleton to match LinkCard structure (emoji, title, description)
- Fix TangledRepoCard import and usage in home page
- Remove non-existent TangledRepos export from layout index
- Added domain-specific terms to .cspell.json, including 'ACTIVITYPUB', 'changefreq', 'urlset', and 'Scrobbles'.
- Reformatted ignorePaths and ignoreRegExpList in .cspell.json to use multi-line arrays for better readability.
- Removed a trailing comma in src/lib/data/slug-mappings.ts to enforce consistent code style.
Created a new CONFIGURATION.md file to serve as the central source of truth for site setup.
This guide includes:
- Prerequisites including Node.js and AT Protocol DIDs.
- Detailed environment variable setup for .env.local.
- Instructions for mapping URL slugs to Leaflet publication rkeys.
- Steps for customizing static files like robots.txt, sitemap.xml, and favicons.
- Advanced configuration for optional features like WhiteWind and Slingshot.
- A comprehensive troubleshooting section for common issues.