commits
- 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.
Bump versions in THIRD-PARTY-LICENSES.txt for:
- hls.js 1.6.14 → 1.6.15
- esrap 2.1.0 → 2.1.3
- magic-string 0.30.19 → 0.30.21
- @atproto/api 0.17.2 → 0.18.1
- @lucide/svelte 0.545.0 → 0.554.0
- tlds 1.260.0 → 1.261.0
- @sveltejs/acorn-typescript 1.0.6 → 1.0.7
Text-centre the page heading and adjust paragraph dark-mode colour for consistency
Replace wrap-wrap-break-word with more standard wrap-break-words and break-all for better text overflow handling
Introduce fetchProfile on mount, show avatar/placeholder, adjust site title hover behaviour, update mobile menu and nav icon rendering
- Create InternalCard component for consistent list item styling
- Standardise padding: p-6 for containers, p-4 for list items
- Standardise spacing: mb-4 for sections, space-y-3 for lists, gap-3 for flex
- Fix flex overflow with flex-1 min-w-0 pattern
- Remove responsive padding variations for consistency
- Refactor BlogPostCard, LinkCard, TangledRepoCard to use InternalCard
- Update MusicStatusCard, PostCard, ProfileCard, BlueskyPostCard spacing
- Eliminate conditional spacing that caused unnecessary whitespace
- Add hamburger menu for mobile devices (< md breakpoint)
- Replace inline SVGs with Lucide icons (Menu, X)
- Fix Svelte 5 runes mode deprecation (use @const instead of svelte:component)
- Show full navigation labels in mobile dropdown
- Add active state highlighting in mobile menu
- Improve responsive title sizing with clamp()
- Tighter spacing on mobile (px-3 py-3)
- Auto-close menu on navigation
- Create reusable fetchAllRecords utility with cursor-based pagination
- Add fetchAllUserRecords convenience function
- Refactor archive page to use new pagination utilities
- Ensures all posts are fetched (not limited to 100)
- Add proper TypeScript types (AtProtoRecord interface)
Update wrapping utilities on home page and make archive header text-centred for better visual balance
Replace break-words with wrap-break-word / wrap-break-word variants and use shrink-0 for icons where applicable to improve text wrapping and layout consistency
Collapse ignorePaths and ignoreRegExpList to inline arrays and compact svelte override regex list
- 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.
- Create InternalCard component for consistent list item styling
- Standardise padding: p-6 for containers, p-4 for list items
- Standardise spacing: mb-4 for sections, space-y-3 for lists, gap-3 for flex
- Fix flex overflow with flex-1 min-w-0 pattern
- Remove responsive padding variations for consistency
- Refactor BlogPostCard, LinkCard, TangledRepoCard to use InternalCard
- Update MusicStatusCard, PostCard, ProfileCard, BlueskyPostCard spacing
- Eliminate conditional spacing that caused unnecessary whitespace
- Add hamburger menu for mobile devices (< md breakpoint)
- Replace inline SVGs with Lucide icons (Menu, X)
- Fix Svelte 5 runes mode deprecation (use @const instead of svelte:component)
- Show full navigation labels in mobile dropdown
- Add active state highlighting in mobile menu
- Improve responsive title sizing with clamp()
- Tighter spacing on mobile (px-3 py-3)
- Auto-close menu on navigation