Changelog
Complete version history of the site. Following Semantic Versioning and Keep a Changelog format.
# Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
v2.26.0 2025-11-04
Added
- 3 new authentic retro CRT-inspired Three.js scenes:
- CRT CAD Wireframe: 1980s Tektronix/HP amber phosphor CAD workstation aesthetic
- 5 rotating technical wireframe models (mechanical parts, architecture, gyroscope, teapot, nested cubes)
- 5 authentic phosphor colors (P3 Amber 602nm, P31 Green 530nm, White, Infrared Red, Cyan)
- Retro HUD with system info and controls
- Controls: [SPACE] cycle phosphor • [M] cycle model • [R] toggle rotation
- Vector Oscilloscope Display: Tektronix oscilloscope and vector arcade game aesthetic
- 5 display modes: Lissajous curves, waveforms, spectrum analyzer, X-Y scatter plot, Asteroids-style game
- Authentic graticule grid and crosshair
- Adjustable signal parameters (frequency, phase)
- Controls: [SPACE] cycle mode • [C] cycle phosphor • [↑↓←→] adjust frequencies
- Retro Terminal: 1970s mainframe terminal experience
- 5 classic themes: DEC VT100 green, IBM 3270 amber, Apple ][ green, Commodore 64 blue, White phosphor
- 5 display modes: boot sequence, system status monitor, ASCII art, Matrix rain, diagnostic readout
- Authentic cursor blink and scanline effects
- Controls: [SPACE] cycle theme • [M] cycle mode • [ENTER] add message
- Authentic phosphor physics based on RCA/Tektronix specifications:
- P3 Amber: 602nm peak, bi-exponential decay (k₁=0.85, τ₁=7ms, k₂=0.15, τ₂=25ms)
- P31 Green: 530nm peak, ZnS:Cu,Al composition, single exponential decay (τ=1.2ms)
- P22R Red: 611nm peak, Y₂O₂S:Eu composition, bi-exponential decay (~6ms)
- P4 White: Ultra-fast decay (~0.03ms), standard TV phosphor
- Shadow-mask (RGB triads) and aperture-grille (vertical stripes) patterns
- Scanline rendering with configurable intensity
- Bloom/glow with separable Gaussian blur
- Screen curvature distortion and vignette darkening
- Proper gamma pipeline (γ≈2.2)
/crt-showcase) 📄- Comprehensive documentation for all three CRT scenes
- Technical implementation details (phosphor physics, rendering pipeline)
- Historical context (1970s-1990s display technology)
- References to RCA phosphor datasheets, Tektronix oscilloscope manuals, JVC professional monitor specs
- Visual preview cards with phosphor glow effects
/plotting) 🖊️- Complete 12-month roadmap for pen plotter art practice
- 4-phase approach with detailed checklists:
- Phase 1 (1-2mo): Foundation & Learning
- Equipment research (AxiDraw SE/A3, pens, paper)
- Software ecosystem (Inkscape, vpype, p5.js-svg)
- First plots (circles, hatching, parametric curves)
- Phase 2 (2-4mo): Algorithmic Foundations
- Flow fields & noise-based art
- Stippling & halftone algorithms (TSP art, Voronoi, dithering)
- Recursive & fractal systems (L-systems, space-filling curves)
- Physics simulations (particle systems, differential growth)
- Phase 3 (4-8mo): Advanced Techniques
- Multi-layer & multi-pen plotting with color theory
- Typography & text treatment (Hershey fonts, calligraphic algorithms)
- Photographic input processing (edge detection, contour tracing)
- Custom tooling development (SVG optimizer, plot time estimator)
- Phase 4 (6-12mo): Portfolio & Exhibition
- 4 portfolio series (40-80 works): Algorithmic Portraits, Urban Flows, Noise Studies, Typographic Experiments
- Exhibition preparation (framing, documentation, pricing)
- Online presence integration
- Community engagement (#plottertwitter)
- Technical integration plans (P5.js → plotter pipeline, photography × plotting fusion)
- Learning resources (Tyler Hobbs, Inconvergent, Licia He)
- Budget estimate: $1,275-1,850 (AxiDraw, pens, paper, archival materials)
- Marey diagram visualization with Canvas-based 2D rendering
- 3 subway lines (1, A, L) with authentic station sequences
- Animated train trajectories with play/pause controls
- Time range adjustment (1-6 hours)
- Delay visualization toggle
- 747 lines of code with proper TypeScript interfaces
- Interactive datamoshing tool with Canvas API
- 9 different glitch effects:
- Pixel sorting (brightness threshold)
- RGB channel shift (chromatic aberration)
- Displacement mapping
- JPEG compression artifacts
- Color channel swapping
- Bit crushing
- Scanline displacement
- Color quantization
- Random noise injection
- Image upload and real-time processing
- Download button for processed images
- 803 lines of code
- WebGL/GLSL shader-based film stock emulation
- 4 classic film stocks:
- Kodak Portra 400 (warm pastels, magenta shadows)
- Ilford HP5 Plus (high contrast B&W)
- CineStill 800T (tungsten balanced, halation)
- Kodak Tri-X 400 (classic B&W with grain)
- Adjustable parameters: grain intensity, grain size, vignette strength
- Film-specific color grading with custom LUTs
- Procedural noise-based grain generation
- Image upload and download
- 927 lines of code
Changed
- Removed hamburger menu entirely (per user requirement: "NO HAMBURGER MENU I HATE THOSE")
- Implemented modern mega-menu system that surfaces all pages
- Organized into 4 main categories:
- Portfolio (4 pages): Photography, Photo Collection, Projects, Pen Plotting
- Interactive (8 pages): Three.js Gallery, CRT Showcase, Generative Art, Code Art, Film Emulation, Glitch Studio, Subway Diagram, Urban GIS
- Writing (4 pages): Blog, Cooking (hub with all recipes), Travel Log, Interests (hub with all sub-pages)
- Meta (3 pages): Roadmap, Changelog, Inventory
- Plus About and Contact as standalone top-level links
- Desktop: hover-activated mega-menu dropdowns
- Mobile: click-to-expand accordion (still NO hamburger!)
- Improved transparency:
rgba(26, 26, 26, 0.95)for nav,rgba(36, 36, 36, 0.98)for dropdowns
- Stronger backdrop blur (12px) for better readability over content
- All 38 pages now accessible and organized (previously only 13 were visible in nav)
- Added comprehensive contact information
- Email and LinkedIn alongside existing Twitter/GitHub
- New "Let's Talk About" section with 5 collaboration topics
- Grid layout for better organization
Fixed
- Fixed "Init function not found" errors for all three CRT scenes
- Converted from ES6 module exports to IIFE pattern with
window.initSceneNamefunctions
- Pattern now matches existing Three.js scenes (rotating-cube.js, etc.)
- Proper error handling with THREE undefined checks
- Fixed "e.getContext is not a function" error
- Updated all CRT scenes to accept container div instead of canvas element
- Scenes now create WebGLRenderer and append to container (matching existing scene pattern)
- Updated
onWindowResizemethods to use container dimensions
- Removed unused
onSceneReadycallbacks
- Fixed trains not appearing on initial page load
- Changed
animationTimeinitial value from0to-currentTimeRange * 60
- Trains now start at beginning of time range and are visible immediately
- Consistent with reset button behavior
- Disabled tutorial overlay requiring "BEGIN SHIFT" button click
- Scene now auto-starts immediately when loaded
- Changed
isPausedto false and commented outshowTutorial()
- Better user experience (no confusing instructions screen)
- Fixed arrows jumping to inconsistent images functionally
- Changed from tracking DOM elements to tracking numeric indices
- Fixed arrows moving around visually on screen
- Locked arrows to exact viewport coordinates:
calc(50vh - 32px)from top, 32px from edges
- Removed transforms that caused subpixel shifts
- Final fix:
position: fixedwith exact pixel positioning (no transforms)
- Fixed TypeScript compilation errors preventing production deployment
- Navigation component: Added optional chaining (
category.submenu?.map()) to prevent undefined access errors
- Astro v5 compatibility: Removed deprecated
AstroComponentFactorytype (no longer exported in Astro v5)
- Changed enhancement loader type from
AstroComponentFactorytoanyinenhancements.ts:6andBaseLayout.astro
- Removed type annotations from inline scripts (
photo-collection.astro:1070,1554) - not supported in
- Implemented proper TypeScript type guard:
.filter((item): item is { id: EnhancementId; Component: any } => item !== null)
- Fixed type narrowing issue where
.filter(Boolean)didn't properly narrow union types
- Added CHANGELOG.md to project root (required by
/changelogpage)
- All TypeScript checks now pass, build successful
Technical
- crt-cad-wireframe.js (545 lines)
- oscilloscope.js (540 lines)
- retro-terminal.js (514 lines)
- subway-diagram.astro (767 lines, Canvas 2D API)
- glitch-studio.astro (803 lines, Canvas pixel manipulation)
- film-emulation.astro (927 lines, WebGL/GLSL shaders)
- crt-showcase.astro (comprehensive technical docs)
- plotting.astro (12-month roadmap with budget breakdown)
v2.25.0 2025-10-30
Added
- 4-camera surveillance system (2×2 grid layout)
- 3 color modes: Phosphor Green, Amber CRT, Infrared
- Click or press 'C' to cycle monitor tints
- Detailed procedural footage per camera:
- CAM 01: Hallway with moving shadow figure and flickering light
- CAM 02: Stairwell with depth, railing, and descending darkness
- CAM 03: Basement with pipes, dripping water, flickering bulb
- CAM 04: Exit door with mysterious approaching figure
- REC indicators with blinking animation (3Hz)
- Random motion detection alerts with red borders
- VHS effects: glitches, static bursts, signal loss, tracking errors
- Real-time timestamp display
- Horror atmosphere with atmospheric fog and mist layers
- Download button in fullscreen view (bottom-right)
- Image information panel showing title/alt text (top-left)
- Hover-only UI elements for clean fullscreen experience
- One-click download with auto-generated filename
- Glass-morphism design consistent with site aesthetic
- Mobile-responsive sizing for all new controls
- Chromatic aberration with cyan/magenta/orange gradients
- Color polarization diagonal overlay
- RGB text split effect (0.5px shadows)
- Purple-tinted vignette instead of pure black
- Scanline opacity reduced from 90% to 25% (user feedback)
- Toggle with 📺 button or keyboard shortcuts
- Homepage photo previews: enhanced shadows, better hover effects
- Stat cards: gradient backgrounds, enhanced depth
- Removed non-functional FloatingActionMenu component
- Removed "Press ? for shortcuts" hint (kept functionality)
- Fixed lightbox arrow positioning with explicit CSS
- Film grain texture applied site-wide
Changed
- Reframed as "Experimental Playground" vs generic portfolio
- New theme: "Weird Web Renaissance"
- Added creative project priorities:
- Memory Palace Navigator (3D spatial knowledge map)
- Sound-Reactive Generative Art (microphone-driven P5.js)
- NYC Subway Time-Space Diagram (Marey diagram with real-time trains)
- Analog Film Emulation Shaders (Portra 400, Tri-X, CineStill)
- Hypertext Garden (Zettelkasten bidirectional links)
- Glitch Art Studio (datamoshing, pixel sorting tools)
- Design philosophy: "Interesting failure beats boring success"
- Influences: Gwern.net depth, Hundred Rabbits, early web weirdness
- Updated date: October 30, 2025
- Cleaner header design (reduced padding, darker background)
- Better backdrop blur (24px with 180% saturation)
- Halloween variant with orange glow effects
- Fixed keyboard navigation modal cleanup
- Complete lightbox redesign for high-quality fullscreen viewing
- Minimal UI (hover-only) to focus on images
- Fixed MicroInteractions excluding nav buttons
- Counter only visible on hover (user request)
- Image metadata display in lightbox
- Improved page title with accent line
Fixed
- Position: fixed for lightbox nav arrows (was absolute)
- Z-index conflicts resolved (100000+ for lightbox)
- Motion detection state tracking
- Color mode label updates with tint changes
- Arrow transform positioning with translateY(-50%)
- SVG pointer-events conflicts
- Counter visibility (opacity-based show/hide)
- Mobile responsive button sizing
- Image loading transitions
- Removed prefers-reduced-motion blocker
- Changed from opacity fade to display toggle
- Made scanlines actually visible (was too subtle)
- Added console logging for debugging
Technical
- Hash-based noise functions
- Voronoi patterns for future effects
- Procedural scene generation per camera
- Real-time uniform updates (glitch, static, signal loss)
- Color tint system with Vec3 uniforms
Design Philosophy Updates
- Experimental interfaces over conventional UX
- Analog aesthetics (VHS, film grain, CRT monitors)
- Horror-inspired visual themes
- Technical craft and attention to shader detail
- Reject: flat minimalism, infinite scroll, SEO obsession
- Embrace: memorable interactions, unexpected outputs, creative risks
- Silent Hill surveillance system
- VHS degradation effects
- Motion detection paranoia
- Mysterious figures in camera feeds
- Green/amber/infrared color modes for different moods
- Fullscreen prioritizes image quality over chrome
- Download functionality respects photographer intent
- Metadata shown but not intrusive
- Minimal UI philosophy
Removed
v2.24.0 2025-10-29
Added
- Gradient Text Hero Title: Applied gradient background-clip effect to main heading for visual depth
- Decorative Accent Lines: Added glowing vertical accent line beside hero section
- Status Badge Enhancements: Animated shimmer effect, ripple animation on status dot, enhanced backdrop
- Section Title Accents: Small vertical gradient bars before section titles
- Sidebar Title Decorations: Glowing accent dots before sidebar headings
- Floating Background Orb: Subtle animated gradient orb with 20s float animation
- Sophisticated Footer: Gradient top border, decorative radial accent gradient
- Activity Items: Left accent line that grows on hover, slide-right transform effect
- Skill Tags: Gradient background on hover, sophisticated lift effect, special treatment for interest tags
- Project Cards: Enhanced hover with image scale, gradient borders, multiple shadow elevations
- Photo Previews: Zoom effect on hover, gradient overlay reveal, enhanced shadows
- Link Treatments: Animated gradient underlines, arrow transform on hover
- Bordered Items: Glowing blur effect on left border hover
- Hero Title Underline: Small gradient accent line under main heading
- Gradient Borders: Throughout site using gradient-border CSS variable
- Ripple Animations: On status indicator dots with expanding rings
- Shimmer Effects: Subtle animated shimmer across status badges
- Layered Shadows: Multiple elevation levels with refined opacity
Changed
- Improved letter-spacing on hero title (-0.03em)
- Better section title spacing (-0.02em)
- Enhanced gradient text rendering with background-clip
- More sophisticated border gradients using gradient-border variable
- Enhanced accent-subtle and accent-glow variations
- Better use of backdrop-filter with saturate(180%)
- Added float animation for background orb (20s duration)
- Shimmer animation for badge decoration (3s loop)
- Ripple animation for status indicator (2s loop)
- Pulse animation for status dot (2s loop)
- Sophisticated gradient top border
- Decorative radial gradient accent
- Enhanced link hover with gradient underlines
- Better backdrop filtering and visual depth
- Hide hero decorative line on mobile for cleaner look
- Reduce floating orb size and opacity on smaller screens
- Adjust gradient positions for tablets and mobile
- Maintain visual polish across all breakpoints
Enhanced Components
Technical
Design Philosophy
v2.23.0 2025-10-29
Fixed
- Root cause: Cards had
opacity: 0with entrance animation that wasn't completing
- Removed
fadeInUpanimation entirely (had gimmickytranslateYtransform)
- Removed ALL entrance animations and transforms from P5Gallery
- Cards now render immediately visible with
opacity: 1
- Thumbnails now display correctly on /generative page
- Fixed play icon scale transform (removed)
- Fixed keyboard help modal scale transform (kept only centering transform)
- Fixed seed button active state scale (removed)
- Result: Thumbnails fully visible and functional
- Removed ALL transform-based hover effects across entire site
- Removed:
transform: translateY(),transform: scale(),box-shadowglows
- Removed: animated underlines, gradient reveals, entrance animations
- Affected files: Navigation, projects, cooking, travel-log, urban-planning, interests pages, blog pages, P5Gallery
- Used grep + sed for comprehensive site-wide cleanup
- User Requirement: Only simple color/background changes on hover allowed
- Pages modified: 10+ files with 50+ transform removals
Added
- Added chaos.png generative art image to homepage
- Created featured card layout with project image
- Image optimized with Astro Image component (WebP format, quality 90)
- Grainy texture overlay maintained throughout site
- Featured section positioned prominently above work grid
Changed
- All hover effects now use ONLY color/background transitions
- No transforms, scales, or shadow changes anywhere
- Simple, professional aesthetic matching user preference
- Border-color transitions on cards (no lifts)
- Background opacity changes on buttons (no elevation)
- Navigation: Simple background fade on hover
- Projects: Border highlight only
- Cooking: Background color fade only
- P5Gallery: Border-color change only
Technical
- Navigation.astro: Removed translateY, animated underlines, slideDown
- projects.astro: Removed card lifts, icon scaling
- cooking.astro: Removed recipe card transforms, image scaling
- travel-log.astro: Removed stat card and location card transforms
- urban-planning.astro: Removed transforms
- interests/*.astro: Removed all transforms across 5 pages
- blog/*.astro: Removed transforms across multiple blog pages
- P5Gallery.astro: Complete animation overhaul
Debugging
v2.18.4 2025-10-27
Fixed
- Added explicit z-index values to ensure proper stacking
- Grid lines (z-index: 3) now render on top of grain texture (z-index: 2)
- Radial vignette (z-index: 1) stays at bottom
- Fixes issue where grain texture was covering grid lines
Technical
v2.18.3 2025-10-27
Changed
- Increased center glow from 0.02 to 0.05 (2.5x more visible)
- Enhanced edge vignette from 0.02 to 0.08 (4x more prominent)
- Creates beautiful purple depth with glow at center and darker edges
- Light mode: 0.03 center, 0.06 edges
- Adds dramatic depth to grid background
Technical
v2.18.2 2025-10-27
Changed
- Changed grid color from purple to white for better contrast on dark backgrounds
- Increased opacity from 0.08 to 0.25 for MUCH more visible grid lines
- Grid now uses white (255, 255, 255) at 25% opacity instead of purple
- Grid should now be clearly visible on black (#0a0a0a) background
- Added
cursor: pointerto all nav links and logo
- Added
user-select: noneto prevent text selection cursor
- Navigation links now show proper pointer cursor on hover
- Improves user experience and visual feedback
Fixed
- Fixed bug where HTML span tags were being fetched as URLs
- Added script/style to filter exclusions
- Added error handling for math delimiter processing
- Improved regex matching to prevent double-processing
Technical
rgba(255, 255, 255, 0.25)v2.18.1 2025-10-27
Fixed
- Critical Fix: Moved solid background color from
bodyto.grid-backgroundcontainer
- Body was covering the grid with solid
--bg-primarycolor
- Grid background now properly renders with pattern visible on top
- Made body background transparent so grid shows through
- Removed desktop media query that was reducing opacity to 0.6/0.5
- Grid now maintains full opacity (1.0) across all screen sizes
- Blueprint-style grid pattern now clearly visible as intended
Technical
background: var(--bg-primary) to containervar(--bg-primary) to transparentv2.18.0 2025-10-27
Added
- Animated hero section with floating plane icon (✈️) and pulsing rings
- Stats grid showcasing 13 locations, 4 continents, 2 countries, 11+ years
- Complete location cards grid with descriptions for all 13 visited places
- Type badges for home base, domestic, Caribbean, and international locations
- Category overview section with 4 themed cards
- Travel philosophy section explaining the personal approach to exploration
- Future destinations section with 6 upcoming target locations
- Enhanced map presentation with decorative corner accents
- Improved related projects section with better visual hierarchy
- Card-based design throughout with hover effects and animations
- Full mobile responsive (breakpoints: 1024px, 768px, 480px)
- Professional color scheme with gradient accents
Changed
- Increased grid pattern opacity from 0.03 to 0.15 (dark mode) and 0.05 to 0.12 (light mode)
- Changed grid size from 50px to 40px for tighter, more visible pattern
- Increased overall grid opacity from 0.5 to 1.0 (dark) and 0.4 to 1.0 (light)
- Enhanced grain texture opacity from 0.03 to 0.06 (dark) and 0.02 to 0.04 (light)
- Grid now clearly visible as blueprint-style background pattern
- Maintains smooth animations and GPU acceleration
- Still respects prefers-reduced-motion preference
Technical
v2.17.1 2025-10-27
Added
- Subtle animated grid pattern (50px × 50px squares)
- CSS-based grainy texture overlay
- Theme-aware colors (purple tint)
- Smooth 20s grid movement animation
- 8s grain shift animation
- Radial gradient for depth
- GPU-accelerated performance
- Respects prefers-reduced-motion
- Non-intrusive opacity (0.5 dark, 0.4 light)
- Fixed position, z-index: 0 (behind all content)
Fixed
- Disabled PageTransitions component (was intercepting navigation)
- Restored default Astro navigation behavior
- Eliminated unwanted full page reloads
- Improved navigation responsiveness
Technical
v2.17.0 2025-10-27
Added - Content Enhancements 📝
- Enhanced code blocks with language badges (auto-detect from class)
- Line numbers for multi-line code
- Copy to clipboard button with success feedback
- Theme-aware syntax colors (dark/light mode)
- Responsive mobile design (hides copy button text on small screens)
- Custom scrollbar styling for code overflow
- Supports all language classes (language-javascript, language-python, etc.)
- Automatic rendering of flowcharts, sequence diagrams, and more
- Theme-aware (matches site dark/light mode)
- Zoom controls (in, out, reset)
- Responsive sizing with useMaxWidth
- Custom color scheme integration (purple accent)
- Dynamic CDN loading (only loads when needed)
- Error fallback with code display
- Inline math support ($...$)
- Display math support ($$...$$, language-math code blocks)
- Copy equation button for display math
- Theme-aware colors
- Common macro support (\\R, \\N, \\Z, \\Q, \\C for number sets)
- Auto-detection of math delimiters in content
- Mobile-optimized sizing
- Dynamic CDN loading
- Auto-embed for YouTube, Vimeo, CodePen, Twitter/X
- Privacy-friendly: Click to load (no tracking until user interaction)
- Responsive 16:9 aspect ratio
- Loading states with spinner animation
- YouTube uses youtube-nocookie.com domain
- CodePen embeds default to "result" tab
- Twitter/X shows styled link card
- Works with standalone links in paragraphs or .embed class
- Live HTML/CSS/JavaScript editor
- Three-pane editor with tabs
- Instant preview in sandboxed iframe
- Console output capture (log, error, warn)
- Error handling with line numbers
- Run and refresh controls
- Mobile-optimized layout
- Syntax:
Added - Animations (Minimal) ✨
- Smooth fade in/out on navigation (300ms)
- Loading bar progress indicator
- Non-intrusive, minimal design
- Respects prefers-reduced-motion
- Handles browser back/forward
- Prevents navigation during transition
- Extended to support new content components
- Animates code blocks, embeds, diagrams, math, playgrounds
- Content h2 and blockquotes now animate
- Uses existing IntersectionObserver system
- No performance impact
Technical Details
Components Added
CodeSyntaxHighlight.astro (380 lines): Enhanced code blocksMermaidDiagrams.astro (350 lines): Diagram renderingMathEquations.astro (280 lines): Math equation supportEmbedSupport.astro (420 lines): Auto-embed external contentCodePlayground.astro (500 lines): Live code editorPageTransitions.astro (120 lines): Smooth navigationPerformance
- MermaidDiagrams: 3.63 kB (1.38 kB gzipped)
- MathEquations: 3.70 kB (1.56 kB gzipped)
- CodePlayground: 5.36 kB (1.61 kB gzipped)
Integration
v2.16.0 2025-10-27
Added
- Advanced features optimized for large screens (900px+) with mouse interaction
- Parallax scrolling effects for hero sections (data-parallax attribute support)
- Link prefetching on hover: Instant navigation with intelligent prefetch system
- Advanced image zoom with 3D tilt effect on mouse movement
- Card hover effects: Perspective transforms with subtle tilt (rotateX/rotateY)
- Enhanced purple glow on hover (rgba(124, 58, 237, 0.3) shadow)
- Keyboard shortcuts: Cmd/Ctrl+K (search), G+H (home), Arrow keys (navigation)
- Smooth anchor scrolling with 100px offset for fixed navigation
- Resource hints: DNS prefetch and preconnect for fonts and external resources
- Performance optimizations: Viewport-aware prefetching for visible links
- Drop caps for intro paragraphs (4.5rem floating first letter)
- Optimal line length: 66 characters max-width for readability
- Enhanced text rendering: Kerning, ligatures, and contextual alternates
- Smart hyphenation with proper limits (6 3 2 chars)
- Widow/orphan control (3 lines minimum)
- Enhanced blockquotes: 1.25rem italic with decorative opening quote
- Better heading hierarchy with precise spacing (h2: 4rem top, h3: 3rem top)
- Improved list styling with colored markers
- Enhanced code blocks: Better padding, borders, and syntax highlighting
- Pull quotes: Float right at 40% width for long-form content
- Side notes: Margin notes at 250px width (-280px margin for wide screens)
- Small caps for abbreviations with dotted underline
- Better table typography with hover states
- Gradient horizontal rules for elegant section breaks
- Enhanced footnotes and link styling
- Paragraph indentation (1.5em after first paragraph)
- Custom scrollbar styling (12px width, purple thumb)
- 1400px+ breakpoint: H1 scales to 4rem (hero: 4.5rem)
- Enhanced intro text: 1.25rem with 1.9 line-height
- Better content max-width: 75ch for optimal reading
- 1600px+ breakpoint: Drop caps 5.5rem, blockquotes 1.4rem
- Multi-column lists for extra-wide screens (2 columns with 3rem gap)
- Wider side notes (300px with -340px margin)
- Home page hero: 0.3 speed parallax for depth
- Generative, About, Photography pages: 0.2 speed parallax on h1
- Smooth requestAnimationFrame-based scrolling
- GPU-accelerated transforms for 60fps performance
Technical Details
(min-width: 900px) and (hover: hover)Components Added
DesktopEnhancements.astro (380 lines): Advanced desktop interactionsDesktopTypography.astro (450 lines): Professional typography systemPerformance
v2.15.0 2025-10-27
Added
- Scroll progress indicator: Visual reading progress bar at top (3px gradient bar)
- Back-to-top button: Appears after 500px scroll, smooth animation to top
- Smart navigation: Hides on scroll down, shows on scroll up for immersive reading
- Smooth transitions with cubic-bezier easing for natural feel
- Mobile-optimized sizing (48px → 44px → 40px across breakpoints)
- Touch swipe detection for natural mobile navigation
- Swipe left/right to navigate between images
- Smooth scroll-into-view with focus management
- Visual hint animation: "← Swipe →" appears for 3 seconds on mobile
- Touch feedback with scale animation (0.98) on tap
- Prevents accidental scrolling during horizontal swipes
- Ripple effects on all interactive elements (buttons, cards, links)
- Ripple animations with 600ms duration and smooth scale
- Applied to: nav links, cards, buttons, gallery items, contact links
- Works on both touch and click across all devices
- Performance-optimized with automatic cleanup
- Image loading with blur-up effect: 10px blur → sharp transition
- Skeleton screens with animated gradient shimmer
- Progressive image loading for better perceived performance
- Smooth 300ms fade-in animations for loaded images
- Error state handling with visual feedback
- Keyboard navigation detection (Tab key triggers enhanced mode)
- 3px purple outline with 3px offset for keyboard users
- Box-shadow ring effect for links and buttons (rgba(124, 58, 237, 0.3))
- Mouse usage removes enhanced indicators for cleaner UI
- Accessibility-first design following WCAG guidelines
- Hidden accessibility link for keyboard users
- Appears on focus at top of page
- Smooth scroll to main content area
- Properly styled with high-contrast purple background
- Essential for screen reader users
- Respects prefers-reduced-motion OS setting
- Disables animations (0.01ms duration) when enabled
- Disables smooth scroll behavior
- Ensures accessibility for motion-sensitive users
- Automatically updates when system preference changes
Changed
- Better text selection: Purple highlight (rgba(124, 58, 237, 0.3))
- Code selection: Enhanced purple highlight (rgba(124, 58, 237, 0.5))
- Active state: 0.98 scale on button/link press
- Disabled states: 0.5 opacity with not-allowed cursor
- Loading cursor: Progress cursor for aria-busy elements
- Smooth 300ms transitions for theme changes
- Background and color fade effects
- Prevents jarring switches between themes
- Applied to body background-color and color properties
- Scroll progress: z-index 10002 (top layer)
- Mobile menu toggle: z-index 10001
- Nav content: z-index 10000
- Back-to-top: z-index 999
- Proper layering prevents visual conflicts
Improved
- RequestAnimationFrame for scroll handlers (60fps performance)
- Passive event listeners for touch and scroll
- Will-change optimization for card transformations
- Automatic cleanup on page navigation (Astro:before-swap)
- Reduced layout thrashing with transform-based animations
- Touch-action: pan-y for swipe-enabled elements
- -webkit-tap-highlight-color: transparent for cleaner taps
- User-select: none for gallery items to prevent selection during swipe
- Progressive sizing for touch targets (48px to 40px)
- Optimized hover effects based on screen size
- Smooth scroll behavior works in all modern browsers
- Ripple effects work on touch and mouse
- Focus indicators adapt to input method
- Loading states work for all image formats
- Consistent experience across desktop, tablet, and mobile
- ARIA labels for all interactive elements
- Proper focus management for swipe navigation
- Skip link for keyboard navigation
- Reduced motion support for accessibility
- Semantic HTML maintained throughout
Technical Details
- ScrollEnhancements.astro (150 lines)
- SwipeGallery.astro (120 lines)
- UniversalEnhancements.astro (380 lines)
- BaseLayout.astro: Added ScrollEnhancements and UniversalEnhancements
- photography.astro: Added SwipeGallery component
- Footer.astro: Version bump to 2.15.0
Browser Support
v2.14.0 2025-10-27
Added
- Extended mobile improvements to 4 additional critical pages: Home, Generative Art, Changelog, Roadmap
- All 15 core pages now have comprehensive 3-breakpoint mobile responsive design
- Site-wide consistency in typography scaling, spacing, and touch optimization
- Total of ~1,200 lines of responsive CSS added across entire site
- H1 hero: 3.5rem → 3rem → 2.75rem → 2.25rem across breakpoints
- Featured project cards: optimized padding and min-height for touch
- Work grid: responsive single-column layout with progressive sizing
- Featured icons and CTAs: scaled appropriately (3rem → 2.5rem on mobile)
- Border radius progression: 16px → 14px → 12px → 10px for cleaner mobile appearance
- Featured card min-heights: 260px → 240px → 220px for optimal content fit
- Complete 3-breakpoint system added (was missing 900px and 480px)
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem
- Intro text: 1.1rem → 1.0625rem → 1rem → 0.9375rem
- H2/H3 progressive scaling across all breakpoints
- Content paragraphs and lists optimized for mobile reading
- List padding: 2rem → 1.75rem → 1.5rem → 1.25rem
- Enhanced existing 900px breakpoint and added 768px + 480px
- Version sections: optimized padding and border-radius per breakpoint
- Version numbers: 1.75rem → 1.6rem → 1.5rem → 1.35rem
- Version dates: responsive font sizing (1rem → 0.95rem → 0.9rem → 0.85rem)
- List items: reduced padding and font sizes for mobile
- Code snippets: smaller font sizes on mobile (0.875em → 0.85em)
- Border-width adjustments: 2px → 1px on mobile for cleaner appearance
- Enhanced existing 768px breakpoint and added 900px + 480px
- Progress grid: 2-column → 1-column with optimized card padding
- Timeline: adjusted spacing and marker positioning per breakpoint
- Priority list: responsive counter positioning (absolute → relative on mobile)
- Section numbering hidden on mobile for cleaner appearance
- Text-align: justify → left on mobile for better readability
- Progress bars: 8px → 6px height on mobile
- Callout boxes: optimized padding (1.5rem → 1.25rem → 1.1rem)
Changed
- Hover effects further reduced on smallest screens (6px → 4px → 2px transforms)
- Border radius progressively reduced on smaller screens for cleaner appearance
- Box-shadow intensity reduced on mobile for performance and aesthetics
- Touch targets consistently maintained at 44×44px minimum
- Featured elements get larger touch targets (48×48px) where appropriate
- All 15 core pages now follow identical H1 scaling pattern (3rem → 2.5rem → 2.25rem → 2rem)
- Consistent intro/lead text sizing across pages
- Progressive line-height reductions: 1.8 → 1.75 → 1.7 → 1.65
- Font sizes never drop below 0.75rem for readability
- All pages now use consistent padding progression (10rem/8rem → 7rem → 6rem → 5rem)
- Horizontal padding: 2rem → 1.5rem → 1.25rem → 1rem site-wide
- Gap/margin reductions follow same pattern across all pages
- Bottom padding: 5rem/4rem → 3rem → 2.5rem → 2rem
Improved
- All 15 core pages now have identical breakpoint structure
- Typography scaling patterns harmonized across entire site
- Spacing and padding use same mathematical progressions
- Hover/interaction effects follow consistent reduction patterns
- Border, shadow, and radius styling unified
- Mobile breakpoints always in same order: 900px, 768px, 480px
- Consistent CSS property ordering within breakpoints
- Reduced code duplication through pattern standardization
- Better maintainability with predictable responsive patterns
Technical Details
- src/pages/index.astro (405 → 590 lines, +185 lines)
- src/pages/generative.astro (240 → 347 lines, +107 lines)
- src/pages/changelog.astro (309 → 474 lines, +165 lines)
- src/pages/roadmap.astro (706 → 1057 lines, +351 lines)
v2.13.0 2025-10-27
Added
- Complete mobile overhaul for 5 core pages: Projects, Cooking, Photography, About, Contact
- Three breakpoints per page: 900px, 768px, 480px (matching blog and recipe standards)
- Progressive typography scaling across all breakpoints
- Touch-optimized spacing and interaction targets
- Consistent padding progression: 10rem → 7rem → 6rem → 5rem across breakpoints
- Enhanced mobile UX with reduced hover effects and improved touch targets
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem across breakpoints
- H2/H3/H4 progressive typography scaling for optimal readability
- GitHub cards: single column layout on mobile with optimized padding
- Repository metadata: adjusted font sizes (0.8rem → 0.75rem → 0.7rem)
- Touch-optimized hover effects: reduced transform on mobile (-6px → -4px → -2px)
- Content paragraph scaling: 0.9375rem on smallest screens for readability
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem
- Recipe cards: optimized padding (2.5rem → 2.25rem → 2rem → 1.75rem)
- Recipe metadata: progressive font sizing (0.85rem → 0.8rem → 0.75rem)
- Tag styling: responsive padding and font sizes across breakpoints
- Placeholder card: min-height adjustments (250px → 220px → 200px → 180px)
- Description text: optimized line-height (1.7 → 1.65 → 1.6) for mobile
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem
- Gallery: single column layout on mobile with optimized gaps
- Image aspect ratio: 4:3 on desktop/tablet, 1:1 on mobile (480px) for better fit
- Zoom indicator: always visible on mobile with progressive sizing (40px → 38px → 36px → 34px)
- Reduced hover transforms on mobile for better touch UX
- Image scaling on hover: 1.08 → 1.06 → 1.04 across breakpoints
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem
- Intro text: 1.375rem → 1.25rem → 1.125rem → 1.0625rem for readability
- Content paragraphs: optimized font size and line-height per breakpoint
- H2 headings: 1.75rem → 1.6rem → 1.5rem → 1.35rem
- Link underlines: adjusted thickness and offset for touch screens
- Responsive spacing: margin/padding optimized for mobile reading flow
- H1 scaling: 3rem → 2.5rem → 2.25rem → 2rem
- Contact links: progressive font sizing (2rem → 1.75rem → 1.5rem → 1.35rem)
- Touch targets: min-height 48px on mobile for WCAG compliance
- Arrow indicators: scaled appropriately (1.5rem → 1.35rem → 1.25rem → 1.15rem)
- Reduced hover transforms on mobile: 8px → 6px → 4px translation
- Gap adjustments: 2.5rem → 2.25rem → 2rem → 1.75rem for better spacing
Changed
- Consistent H1 scaling pattern across all pages (3rem → 2.5rem → 2.25rem → 2rem)
- Progressive H2/H3/H4 sizing following golden ratio principles
- Optimized font sizes for readability on small screens (min 0.7rem for metadata)
- Line-height adjustments for mobile: 1.8 → 1.75 → 1.7 → 1.65
- Letter-spacing fine-tuning on mobile for better readability
- Consistent page padding: 10rem → 7rem → 6rem → 5rem
- Horizontal padding: 2rem → 1.5rem → 1.25rem → 1rem
- Bottom padding: 5rem → 3rem → 2.5rem → 2rem
- Gap/spacing progressive reduction: maintains visual hierarchy on small screens
- Grid systems: multi-column → single column on mobile with appropriate gaps
- Reduced hover effects on mobile (smaller translateY values)
- Touch-optimized button/link sizes (min 44×44px, 48×48px for critical actions)
- Hover transforms: 6-8px → 4px → 2px progression
- Box-shadow reduction on mobile for cleaner appearance
- Border thickness adjustments for better visibility on small screens
Improved
- Removed min-height: 100vh on mobile (480px) to prevent white space issues
- Optimized animations for touch devices
- Reduced transform complexity on mobile for smoother scrolling
- Better aspect ratio handling for images on different screen sizes
- WCAG 2.1 AA compliant touch targets throughout (min 44×44px)
- Critical actions use 48×48px minimum (Contact page links)
- Improved contrast on hover states for mobile
- Better keyboard navigation support
- Screen reader friendly markup maintained across all breakpoints
- All pages now follow the same 3-breakpoint system (900px, 768px, 480px)
- Typography scaling follows consistent patterns site-wide
- Spacing and padding use the same progression across pages
- Hover effects scaled appropriately per breakpoint
- Color and border styling consistent across mobile/desktop
Technical Details
- src/pages/projects.astro (417 → 634 lines)
- src/pages/cooking.astro (413 → 674 lines)
- src/pages/photography.astro (197 → 292 lines)
- src/pages/about.astro (190 → 289 lines)
- src/pages/contact.astro (145 → 231 lines)
v2.12.0 2025-10-24
Added
- Complete mobile overhaul for blog index and post pages
- Three breakpoints: 900px, 768px, 480px (matching site-wide standards)
- Typography scaling: h1 3rem → 2.5rem → 2.25rem → 2rem
- Responsive padding: 8rem → 6rem → 5.5rem on mobile
- Code block touch-friendly scrolling (-webkit-overflow-scrolling: touch)
- Mobile-optimized spacing and touch targets throughout
- Card-based grid layout (responsive: multi-column → single column)
- Reading time calculation (200 words/min)
- Tag filtering system with interactive buttons
- Post descriptions and metadata display
- Hover effects with lift animation (-4px translateY)
- Georgia serif typography for headings (matching site style)
- WCAG AA compliant touch targets (min-height: 240px cards)
- Breadcrumb navigation (Home / Blog / Post)
- Automatic table of contents from headings (collapsible)
- Reading time estimation in post header
- Tag display with visual badges
- Related posts section (up to 3 recent posts)
- Improved code syntax highlighting
- Enhanced typography with proper line-height (1.75)
- Scroll margin for heading anchor links (scroll-margin-top: 2rem)
descriptionfield (optional string) for post excerpts
tagsfield (optional array) for categorization
imagefield (optional string) for featured images
draftfield (boolean, default: false) to hide unpublished posts
- Complete mobile overhaul for all 6 recipe pages
- Three breakpoints: 900px, 768px, 480px (matching blog section)
- Typography scaling: h1 3rem → 2.5rem → 2.25rem → 2rem
- H2/H3 responsive scaling across all breakpoints
- Responsive padding: 8rem → 6rem → 5.5rem → 5rem
- Recipe meta items stack vertically on tablets (768px)
- Ingredient/instruction lists optimized for touch
- Numbered step circles scale appropriately (2rem → 1.35rem)
- Tag sizing and spacing optimized for mobile
- Recipe intro padding and border thickness adapt to screen size
- Progressive spacing reductions for better content fit
- All 6 recipes: Shakshuka, Aglio Olio, Cast Iron Pizza, Miso Butter Corn, Overnight Oats, Sourdough Bread
Changed
- Base font size: 1.1rem (desktop) → 1.05rem (900px) → 1rem (768px) → 0.95rem (480px)
- H2 headings: 2rem → 1.75rem → 1.6rem → 1.5rem across breakpoints
- H3 headings: 1.5rem → 1.375rem → 1.25rem → 1.15rem
- Code blocks: 0.9rem → 0.85rem → 0.8rem for mobile readability
- Line-height: 1.75 body, 1.3 headings (optimized for reading)
- Enhanced padding: 1.5rem → 1.25rem → 1rem on mobile
- Border radius: 8px → 6px on small screens
- Improved background opacity: rgba(60, 56, 54, 0.8)
- Border styling: 1px solid with accent color
- Horizontal scroll with smooth touch scrolling
- Replaced inline styles with proper CSS
- Consistent link styling across blog pages
- Back links with hover states and transitions
- Breadcrumb responsiveness (stacks on 480px)
Improved
- Grid system: auto-fill minmax(350px, 1fr) → single column mobile
- Card spacing: 2rem gaps → 1.5rem on mobile
- Touch-friendly cards: min-height 240px → 200px mobile
- Filter tags: proper hover states and active styling
- Empty state handling with friendly message
- Optimal line length: max-width 900px
- Proper content spacing with semantic HTML
- Blockquote styling with left border accent
- List styling with proper indentation (2rem → 1.5rem mobile)
- Image responsive handling (max-width: 100%, auto height)
- Table styling with border collapse and padding
- Semantic HTML structure with proper landmarks
- ARIA attributes for interactive elements
- Keyboard-navigable filter buttons
- Color contrast meets WCAG AA standards
- Touch targets meet 44×44px minimum (WCAG 2.1 AA)
- Proper heading hierarchy (h1 → h2 → h3)
Fixed
- Dramatically increased visibility (background 3x brighter, 2px border)
- Button size: 44x44 → 48x48px (more prominent)
- Line thickness: 26px width, 3px height (much more visible)
- Added box-shadow to lines for depth and contrast
- Hover/active states with clear visual feedback
- Z-index hierarchy: button/logo 10001, menu 10000 (prevents conflicts)
- Added visibility: hidden when closed (prevents ghost interactions)
- Fixed white bar appearing at bottom on mobile devices
- Added html { height: 100% } and body { min-height: 100%; position: relative }
- Proper viewport calculation prevents white space on scroll
- Body scroll lock now uses position: fixed + width/height: 100%
- Added -webkit-overflow-scrolling: touch for smooth mobile scrolling
- Blog section now has mobile responsive design (previously had NONE)
- Replaced all inline styles with maintainable CSS
- TypeScript errors in tag filtering script (added HTMLElement type assertion)
- Code block overflow handling on mobile devices
- Inconsistent spacing and padding across blog pages
Technical
v2.11.0 2025-10-24
Added
- Full-screen slide-in menu for devices < 900px
- Animated hamburger icon (3 lines → X transformation)
- Smooth slide transition with backdrop blur (20px)
- Auto-close on link click, outside tap, or navigation
- Body scroll prevention when menu open
- 44×44px minimum touch target (WCAG 2.1 AA compliant)
- @media (max-width: 480px) for phones < 480px width
- Further typography refinement for tiny screens
- Optimized padding and spacing
Changed
- Homepage h1: 2.5rem → 2.75rem (10% increase)
- Featured card titles: 1.25rem → 1.375rem
- Travel log h1: 2.5rem → 2.75rem
- Line-height: 1.15 headings, 1.65-1.75 body
- Consistent scaling across all breakpoints
- Nav links: 48px min-height (WCAG compliant)
- Featured cards: 240px min-height
- Work items: 200px min-height
- CTA buttons: larger padding (0.5rem)
- All elements meet 44×44px minimum
- Top padding: 7rem → 6rem (more content visible)
- Featured sections: 4rem → 3.5rem margins
- Header stats: 2rem → 2.5rem gap
- Very small devices: 6rem → 5.5rem padding
Improved
- East Coast inset hidden on mobile (too small)
- -webkit-overflow-scrolling for smooth touch
- Stats: horizontal → vertical stack on small screens
- Optimized list spacing and line-height
- Hardware-accelerated transforms
- Efficient scroll locking
- No layout shift
- 300ms smooth transitions
- ARIA attributes (aria-label, aria-expanded)
- Proper focus management
- Screen reader friendly
- WCAG 2.1 AA compliant touch targets
Fixed
v2.10.0 2025-10-24
Added
- Prominent feature cards highlighting Travel Log and Urban GIS visualizations
- Positioned above "Selected Work" for maximum visibility
- Two-column grid with descriptions, icons, and CTAs ("Explore Map →", "View Visualization →")
- Hover effects: lift (-4px), border highlight, background lighten, CTA arrow gap expansion
- Mobile responsive: stacks to single column, adjusts padding and font sizes
- Purple-themed section (matching site accent color) after "Urban Observation"
- Two interactive cards linking to Urban Planning (3D Brooklyn) and Travel Log (world map)
- Contextual descriptions explaining how visualizations relate to NYC urban interests
- Header with 🗺️ icon and "Interactive Visualizations" title
- Matching hover states with homepage featured cards
- Added "Geographic Visualizations" paragraph to Current Work section
- Inline links to Travel Log (scratch-off style) and Urban Planning (3D GIS)
- Updated "Current Reading" to link to NYC interests page
- Mentions cartography, data visualization, and interaction design interests
Changed
- Created multiple pathways to geographic visualization features:
* Homepage Featured Projects → Travel/Urban pages (primary discovery)
* About Current Work → Specific visualization pages (professional context)
* NYC Interests Callout → Related geographic tools (contextual discovery)
- Bi-directional linking creates discoverability web
- Each page type serves different user intent (browsing, learning about me, deep diving into NYC)
- Added "Featured Projects" section heading
- Added "Selected Work" heading above photography grid
- Featured Projects positioned first for priority visibility
- Better content flow: Hero → Featured → Selected Work
- Standardized card design across homepage and NYC page
- Purple accents for urban/GIS content
- Georgia serif headings (1.5rem homepage, 1.25rem NYC callouts)
- Consistent padding (2.5rem desktop, 2rem mobile)
- Unified hover mechanics across all feature cards
Improved
- Featured grids adapt: 2-column → 1-column on mobile
- Icon sizes scale down: 3rem → 2.5rem (homepage), 2.5rem → 2rem (NYC callout)
- Font sizes reduce proportionally across all breakpoints
- Callout header changes to vertical flex on mobile
- Cubic-bezier easing (0.4, 0, 0.2, 1) on all hover transitions
- SVG grayscale filters (0.2) on all feature icons for subtle color
- Flex-grow ensures balanced content distribution in cards
- Consistent border-radius (16px large sections, 12px cards)
- Three distinct entry points to geographic visualizations
- Contextual linking explains why pages are related
- Clear CTAs guide user actions
- Cross-page navigation creates exploration paths
v2.9.0 2025-10-24
Added
- Massachusetts (Amherst area) added as 13th visited location (🎓)
- Cross-page navigation with styled "Related" section linking to Urban Planning page
- Blue-themed related section with accent borders and hover effects
- Comprehensive feature cards grid showcasing 6 major data layers:
* Building Footprints with 30+ type heuristics
* Subway System with Brooklyn line details
* Parks & Green Spaces visualization
* Water Bodies with metallic blue material
* Road Network color-coded by hierarchy
* Professional Material System explanation
- Technical Stack section detailing Three.js, OSM, React/Astro implementation
- "Why This Matters" section explaining urban planning rationale and use cases
- Cross-page navigation linking to Travel Log in purple-themed "Related" section
- Header icon (🗺️) and expanded multi-paragraph description
- Enhanced controls UI with grouped layout and styled badge keys
- Feature cards with hover effects (lift, border glow, background transition)
Changed
- Reduced marker sizes for precision: outer ring 8→5px, inner dot 4→2.5px
- Decreased strokeWidth from 2 to 1.5 for cleaner appearance
- Reduced hover glow radius from 20 to 12 (40% smaller overlap)
- Adjusted label positioning from y=-16 to y=-10 (closer to marker)
- Label font size reduced from 13px to 12px
- Result: Markers no longer overlap clumsily in dense regions
- Headers now use Georgia serif for consistency with Travel Log
- Font sizes increased: h1 3rem→3.5rem, h2 2rem→2.25rem, h3 1.5rem→1.75rem
- Header icon added (4rem, grayscale filtered)
- Content max-width increased to 900px for feature grid layout
- Control keys styled with purple background, border, and padding
- Bi-directional links between Travel Log and Urban Planning pages
- Color-coded related sections: blue for Travel, purple for Urban Planning
- Consistent styling: rounded corners, padding, accent borders
- Link hover states with color transitions
- Total Locations: 12 → 13
- US States: 7 → 8 (added Massachusetts)
- Domestic section text updated to mention "Massachusetts (Amherst area)"
Improved
v2.8.0 2025-10-24
Added
- NEW:
src/utils/overpassAPI.ts(642 lines)
- Replaces pathetic 150-building mock data with REAL building footprints from OpenStreetMap
- No API tokens required - works immediately without registration
- Fetches actual building polygons with real geometries (not fake generated shapes)
- Smart Building Height Estimation:
- 30+ building type heuristics: houses (24ft), apartments (60ft), skyscrapers (300ft), churches (45ft), cathedrals (90ft)
- Reads building:levels, height tags, and building types from OSM
- Amenity-based heights (hospitals: 72ft, schools: 36ft, theaters: 40ft)
- Floor height varies by type: industrial (15ft), commercial (13ft), residential (12ft)
- Rich Building Metadata:
- Land use codes compatible with NYC PLUTO (residential, commercial, industrial, institutional)
- Year built from start_date, construction:date, architecture style tags
- Building materials, colors, roof shapes extracted from OSM tags
- Proper addresses formatted from addr:housenumber + addr:street
- Water Bodies Layer 💧:
- Real rivers, streams, canals, ponds from OpenStreetMap
- Deep blue metallic material (#1e40af) with 85% opacity
- Reflective surface (roughness: 0.2, metalness: 0.8)
- Positioned at y=0.1 (just above ground plane)
- Road Network Layer 🛣️:
- Primary, secondary, tertiary, and residential roads from OSM
- Color-coded by hierarchy: major roads (amber #fbbf24), residential (light yellow #fefce8)
- Width varies by importance (1.5px - 4px)
- Includes road names, lanes, surface type metadata
- Layer Toggle Controls: Water Bodies and Roads checkboxes added to UI
- Dedicated 280x180px detail zoom box in bottom-right corner
- Focuses on densely clustered East Coast locations (Brooklyn, Philly, Connecticut, Pennsylvania, Upstate NY)
- "EAST COAST" label badge for clear identification
- Fine grid lines (every 4°) for geographic precision
- Scaled markers (r=1.5 outer, r=0.8 inner) sized for detail view
- Fully interactive - hover and click work within inset
- Compact emoji-only labels to maximize space
- Connection lines between East Coast locations visible
- Reuses same coordinate system and grayscale filter for consistency
Changed
- Subway Stations (MAJOR FIX):
- Reduced sphere radius from 2.5 to 0.4 (83% smaller!)
- Removed decorative pillar cylinders entirely
- Lowered position from y=4 to y=0.5 (closer to ground)
- Reduced emissive intensity from 1.2 to 0.3
- Disabled shadows for cleaner look
- Changed from thick glowing tube to simple thin line
- Building Materials (Professional Appearance):
- Removed individual window geometry (too much visual noise)
- Disabled bevels for clean geometric edges (bevelEnabled: false)
- Increased roughness to 0.85 (more matte, less glossy)
- Removed metalness entirely (metalness: 0.0)
- Reduced emissive intensity from 0.04 to 0.02
- Enabled flat shading for crisp GIS appearance
- Color multiplier increased from 0.8 to 0.9 (brighter)
- Result: Clean, professional urban GIS visualization that looks like ArcGIS/Google Earth Pro instead of a video game
- Zoomed to Atlantic region to eliminate dead space (Pacific Ocean, etc.)
- East Coast locations (Brooklyn, Philly, Connecticut) now clearly visible instead of tiny dots
- Map bounds optimized: 40° latitude × 160° longitude (vs previous full world 180° × 360°)
- Fixed coordinate alignment by moving map image inside SVG as
element
- SVG viewBox set to "200 67 600 300" to focus on Atlantic/Americas region
- Markers now perfectly aligned with background in same coordinate system
- Monochrome grayscale filter implemented with SVG
instead of CSS
Fixed
Removed
v2.7.0 2025-10-24
Added
- New
/travel-logpage with interactive scratch-off style world map
- 12 visited locations mapped and tracked:
- International: Kyiv (Ukraine), Israel
- Caribbean: St. John & St. Croix (US Virgin Islands)
- Domestic: Brooklyn (home base), Orlando FL, Upstate NY, Pennsylvania (various), Philadelphia, Arizona, Atlanta GA, Connecticut
- Interactive React Map Component (
TravelMap.tsx)
- SVG-based world map with geographic projection
- Color-coded location markers by type (home, domestic, international, caribbean)
- Click to view detailed location info (name, year, category)
- Connection lines radiating from Brooklyn home base
- Hover effects with pulsing glow animations
- Responsive design with legend and statistics
- Travel statistics: 12 locations, 5 international/caribbean, 7 US states
- Travel philosophy section: Deep exploration over broad coverage
- Future destinations list aligned with interests (Montreal, Tokyo, Copenhagen, Berlin, Mexico City)
- Location categories with color-coded badges (home, domestic, international)
- Complete rewrite of ThreeMapViewer (420 insertions, 375 deletions)
- Post-Processing Effects:
- UnrealBloomPass for glowing lights and atmospheric depth
- ACES Filmic tone mapping for cinematic color grading
- Bloom strength 0.6, radius 0.4, threshold 0.85
- Procedural Building Windows:
- Individual window meshes generated for each building
- Grid-based window placement (floors × windows per floor)
- 80% occupancy rate for realistic variety
- Dynamic window glow: warm yellow/gold at golden hour, blue at night
- Emissive materials with adjustable intensity
- Time-of-Day Lighting System:
- Interactive slider control (0-1 range, Night → Dawn → Day → Golden Hour)
- Default: 0.75 (golden hour) for warm, dramatic lighting
- Dynamic sun position: sunAngle = (timeOfDay - 0.5) * Math.PI
- Sun moves in arc across sky throughout day cycle
- Dynamic intensity: sunIntensity = 0.3 + timeOfDay * 1.2
- Multiple light sources: sun, rim light, orbiting accent light
- Enhanced Brooklyn Cityscape:
- ~40 procedurally generated buildings representing Ditmas Park
- Victorian homes grid (7×7) with varied heights and colors
- Taller perimeter buildings in circular arrangement (20 buildings)
- Rooftop details: water towers on 50% of tall buildings
- Prospect Park: 40×40 green rectangle with 50 procedural cone trees
- Glassmorphic UI Redesign:
- Changed theme from purple to gold (#ffd700) accents
- backdrop-filter: blur(20px) on all panels
- Semi-transparent black backgrounds (rgba(0, 0, 0, 0.6))
- Rounded corners (16-20px border-radius)
- Glowing info panel borders with box shadows
- Enhanced Subway Stations:
- Glowing golden spheres with high emissive intensity
- Light halos (ring geometry) floating above each station
- Metallic pillars with emissive glow
- Enhanced track materials with emissiveIntensity: 0.6
- Improved Camera:
- Dramatic angle: position(80, 120, 120)
- Auto-rotate enabled (0.5 speed)
- 60° field of view (increased from 45°)
- Better min/max distance (30-400)
- Visual Polish:
- Grid lines for geographic reference
- Simplified continent outlines in background
- Connection lines between locations
- Pulsing glow animations on hover/selection
- Brooklyn Botanic Garden added to Culture & Events section:
- Member since 2023
- 52 acres of gardens: Japanese Hill-and-Pond, Shakespeare Garden, Native Flora Garden
- Cherry blossom season (late April) details
- Off-season visit recommendations
- Green-Wood Cemetery added as new "Green Spaces & Cemeteries" subsection:
- 478-acre National Historic Landmark established 1838
- Victorian garden cemetery with rolling hills
- Gothic Revival architecture
- Notable burials: Jean-Michel Basquiat, Leonard Bernstein, Boss Tweed
- Described as sculpture park, arboretum, and historical archive
- Recommended for contemplative walks and urban nature observation
- Prospect Park enhanced description:
- 526 acres designed by Olmsted and Vaux
- Noted as better than Central Park (less crowded, more natural)
Changed
v2.6.0 2025-10-24
Added
- New
/urban-planningpage with three.js-powered 3D map of Ditmas Park, Brooklyn
- Real NYC Open Data integration with live API calls
- ~500 actual building footprints from NYC Building Footprints dataset
- Accurate building heights from heightroof property (feet to meters conversion)
- Geographic precision: Centered on Ditmas Park (40.643°N, 73.964°W)
- Bounding box covers Prospect Park South to Newkirk Ave
NYC_OPEN_DATA.md)- Cataloged 50+ NYC datasets (buildings, transit, parks, demographics, infrastructure)
- 6 planned API projects with detailed implementation roadmaps
- Building Footprints, MapPLUTO, MTA GTFS, Parks, Bike Lanes datasets documented
- API query examples and optimization techniques
- Coordinate conversion formulas (lat/lng to Three.js coordinates)
- Caching strategies and rate limit guidance
- Socrata API authentication documentation
- 7 Q train stations with accurate GPS coordinates:
- Prospect Park, Parkside Ave, Church Ave, Beverley Rd, Cortelyou Rd, Newkirk Plaza, Avenue H
- Golden yellow station markers with pillars
- Continuous Q line track geometry connecting all stations
- Station metadata (name, lines served, coordinates)
- Click Detection: Raycasting for pixel-perfect building and station selection
- Building Info Panel: Rich property metadata display
- Address (from MapPLUTO)
- Height in feet (from Building Footprints)
- Number of floors (from MapPLUTO)
- Year built (from MapPLUTO)
- Zoning district (from MapPLUTO - e.g., "R6B" residential)
- Building area in sq ft (from MapPLUTO)
- Subway Station Info Panel: Station name, lines served (yellow badges), GPS coordinates
- Layer Toggle Controls: Show/hide buildings, subway, grid independently
- Color Mode Switcher: Height-based (gray→blue→purple→pink), Age-based (green→blue→purple→amber→red), Default (uniform gray)
- Parallel fetching of Building Footprints + MapPLUTO for faster loading
- Coordinate-based matching (0.0001° tolerance ≈ 36 feet)
- ~500 buildings enriched with property metadata
- Address, floors, year built, zoning, land use, building area
src/utils/nycOpenData.ts)latLngToVector3(): Web Mercator projection centered on Ditmas Park
geoJsonToShape(): Convert GeoJSON polygons to Three.js shapes
fetchBuildingFootprints(): NYC Open Data API integration
fetchMapPLUTO(): Property metadata fetching
fetchSubwayStations(): MTA GTFS station data (Q line)
createBuildingMesh(): Generate 3D building geometry from real data
- Color mode functions:
getColorByHeight(),getColorByAge(),getColorByLandUse()
- Cache management with 7-day localStorage persistence
getCachedData(),setCachedData()for API response caching
- Photography & Imaging category (6 items):
- Sony A7 IV camera, 35mm f/1.8 prime lens, 24-70mm zoom
- Peak Design tripod & sling bag, SanDisk SD cards
- Architecture & Drafting category (6 items):
- Studio Designs drafting table, Alvin scale ruler
- Rotring technical pens, Staedtler compass, drafting triangles, vellum paper
- Finance & Stocks category (5 items):
- Clever Fox budget planner, HP 12C calculator
- Excel financial modeling, investment books, market monitor display
- Total inventory expanded from 7 to 10 categories
- Info HUD (top left): Location, building count, coordinates, interaction hint
- Layer controls panel (top right): Clean monospace design with checkboxes
- Loading screen with progress updates ("Fetching data...", "Processing buildings: 250/500")
- Animated purple-glowing info panel at bottom center
- Real-time visibility updates for layer toggles
- Close button for info panels
- Click empty space to deselect
Fixed
- Massive performance improvement: 167MB → 628KB (99.6% reduction!)
- Moved images from
public/tosrc/assets/for Astro optimization
- Implemented Astro Image component with WebP format
- Quality 80, lazy loading for optimal performance
- First 3 photos: 54MB → 1.1MB (98% reduction)
- All 9 images now load as optimized WebP thumbnails
- Automatic format conversion (PNG/JPG → WebP)
Changed
- NYC interests page updated to reflect Ditmas Park/Kensington as actual location
- Changed "Williamsburg: Where I live" to "Ditmas Park/Kensington: Where I live"
- Added Ditmas Park to top of neighborhoods list
- All references now match 51 Stratford Rd area
- Added "Urban GIS" link to main navigation menu
Performance
- Progressive loading with status updates every 50 buildings
- Shadow mapping with PCF soft shadows (2048x2048 resolution)
- Frustum culling enabled for off-screen buildings
- Proper geometry and material disposal on unmount
- 60fps smooth rendering with 500 buildings
- LocalStorage caching eliminates redundant API calls
- Parallel data fetching (Building Footprints + MapPLUTO)
- Efficient raycasting (only checks visible objects)
- Layer toggling via visibility (no scene rebuild)
- Photography page: 167MB → 628KB total (across all images)
- 99.6% reduction in initial payload
- WebP format with quality 80
- Lazy loading prevents unnecessary downloads
- Build-time optimization via Astro Image pipeline
- Images cached at CDN edge
Technical
- Installed
@types/threefor TypeScript support
- Three.js v0.180.0 (already installed)
- Astro Image component (built-in)
- NYC Building Footprints: https://data.cityofnewyork.us/resource/nqwf-w8eh.geojson
- MapPLUTO: https://data.cityofnewyork.us/resource/64uk-42ks.json
- MTA GTFS: Hardcoded Q line stations (future: parse stops.txt)
- Web Mercator projection
- Center: 40.643°N, 73.964°W (Ditmas Park)
- Scale: 1000 units for visualization
- Height: feet × 0.3048 × 0.3 (feet → meters, scaled for vis)
- 34 pages built successfully
- 13 optimized images generated
- All TypeScript errors resolved
- Build time: ~7 seconds
Accessibility
Documentation
1. Brooklyn 3D Neighborhood Explorer ✅ (Complete)
2. Subway Accessibility Map
3. Green Space Access Analysis
4. Real-Time Transit Visualization
5. Neighborhood Change Timeline
6. Personal NYC Map
v2.5.1 2025-10-24
Added
- Extended p5-sketches.json with 7 new metadata fields per sketch
createdandupdateddates for historical context
techniquedescriptions explaining the technical approach
iterationscount tracking development process
colorPalettedescriptions for each work
mathConceptsarrays (e.g., ["Strange attractors", "Deterministic chaos"])
inspirationnotes citing artistic/scientific influences
- Metadata display grid in modal with responsive layout
- Hover effects and monospace values for technical aesthetic
- Filter by Tags: existing tags (chaos theory, l-systems, fractals, etc.)
- Filter by Complexity: light, medium, heavy
- Filter by Year: 2020, 2021, 2022, etc.
- Filter by Type: static, animated
- Filter by Interactive: show only interactive sketches
- Multi-row filter layout with labeled sections
- AND logic for combining multiple filter criteria simultaneously
- Real-time filtering with smooth transitions
- Filter counts displayed for each option
- Mobile-responsive stacking layout
Fixed
- Critical CDN MIME type fix: Switched to cdnjs.cloudflare.com after both jsdelivr and unpkg served files with incorrect
text/plainMIME type (blocked by browser security)
- Using stable three.js r128 from cdnjs with proper
application/javascriptMIME type
- Added fallback dimensions (800x600) for containers without explicit sizing
- Added min-height (500px) to scene container for proper viewport
- Improved error handling with null checks in resize handlers
- Added debug console logging for troubleshooting
- Fixed all 4 scenes: rotating-cube, particle-system, geometric-waves, fractal-tree
- CDN Migration History: jsdelivr r170 (text/plain ❌) → unpkg r170 (text/plain ❌) → cdnjs r128 (application/javascript ✅)
- Added Math.max() guards to ensure lifeFactor and radius are always positive
- Prevented DOMException when particles reached end-of-life
- Increased sketch container flex priority from 1 to 3
- Reduced modal gaps from 1.5rem to 1rem
- Added overflow-y: auto to modal-content for scrollability
- Metadata section limited to max-height: 200px with scroll
- Reduced padding throughout for space efficiency
- Result: Sketch now takes up ~60-70% of modal instead of ~33%
- Changed seedScript from template literal to string concatenation
- Resolved "Expected ';' but found '{'" syntax error
- Fixed conflict with Astro's define:vars parsing
Removed
- Removed LiveClock component (fixed position time widget)
- Removed random quote API from homepage (quotable.io)
- Removed "Live from NYC" section from interests pages:
- CitiBike station availability API
- Weather API (wttr.in)
- NYC timezone display widget
- Disabled broken custom cursor implementation (restored standard cursor)
- Deleted 639 lines of code total
Performance
Changed
v2.5.0 2025-10-23
Fixed
- Fixed unescaped closing
tag in P5Gallery.astro template literal (line 399)
- Fixed
returnstatements outside function in InteractiveParticles.astro
- Replaced deprecated
substr()withsubstring()in P5Sketch.astro
- Fixed TypeScript timeout type error in CustomCursor.astro
Performance
- Reduced max particles from 100 → 30 (70% reduction)
- Added ~60fps throttling to mousemove events using performance.now()
- Stop animation loop completely when no particles exist (major CPU savings)
- Removed expensive radial gradient glow effect (simplified to solid fill)
- Reduced particle lifetime: 60-120 frames → 40-80 frames
- Added
will-change: contentsfor GPU acceleration
- Hidden on mobile devices and for users who prefer reduced motion
- Lower opacity (0.7 → 0.6) for subtler effect
- Changed from continuous 60fps animation to event-driven animation
- Animation stops after 100ms of mouse inactivity (saves CPU when idle)
- Switched from
left/toptotransform3dfor GPU acceleration
- Added
passive: trueto mousemove listener
- Reduced animation smoothing coefficients (0.3→0.25, 0.1→0.08)
- Added
will-change: transformCSS hint
- Hidden for users who prefer reduced motion
- Faster transitions (0.3s → 0.2s)
- Reduced symbol layer text content by ~70% (fewer unicode characters)
- Faster animation durations: 180s→120s, 150s→100s, 200s→140s
- Smaller orb sizes: 600px→500px, 500px→400px, 400px→350px
- Lower opacity on all elements (0.15→0.12, 0.15→0.08, etc.)
- Added
will-change: transformto all animated elements
- Symbol layers completely hidden on mobile (display: none)
- All animations disabled for reduced-motion users
- Reduced orb blur on mobile (80px→60px)
- Elements automatically unobserved after animation (frees memory)
- Animations completely skipped for reduced-motion users
- Added
will-changehints during animation, removed after completion
- Increased threshold from 0.1 → 0.15 for better performance
- Increased rootMargin from -50px → -80px
- Faster transitions (0.6s → 0.5s)
Accessibility
prefers-reduced-motion settingTechnical
passive: true where appropriatetransform3d and will-changeExpected Impact
v2.4.1 2025-10-23
Fixed
- Added programmatic THREE.js loading in ThreeGallery component to ensure library loads before scene initialization
- Removed redundant script tag from threejs.astro page
- Fixed "THREE is not defined" errors and variable redeclaration errors
Technical
v2.4.0 2025-10-23
Added
- New index page (
/interests) with tiered presentation:
- Primary interests (5): Deep, ongoing engagement
- Active tracking (2): Organized inventories
- Exploring (2): Early-stage interests
- Stats dashboard: 8 metrics displayed prominently (active interests, projects, books, miles biked, repairs, years in NYC)
- Activity feed: Recent updates across all interests with timestamps and icons
- Metadata-driven architecture: interests.json with rich metadata (status, depth, started date, color themes, icons, tags, stats, relationships)
/interests/diy- DIY & Making (electronics, woodworking, repairs, tools, philosophy)
/interests/nyc- NYC & Brooklyn (neighborhoods, food, culture, transit, urban observation)
/interests/biking- Biking & Urban Cycling (setup, maintenance, routes, gear, advocacy)
/interests/geopolitics- Geopolitics & Current Events (US politics, international relations, economics, tech & society, analytical approach)
- Breadcrumb navigation
- Rich header with metadata badges (status, depth, dates)
- Statistics display specific to each interest
- Table of contents for quick navigation
- Long-form content with proper hierarchy
- Related interests section with cross-linking
- Back to index navigation
/interests/books- Reading & Books component
/interests/kitchen- Kitchen inventory component
/interests/workshop- Workshop inventory component
- Color-coded interests (DIY=orange, NYC=blue, Biking=green, Geopolitics=purple, Books=amber, Kitchen=beige, Workshop=blue-gray)
- Consistent card patterns with hover effects
- Tiered visual hierarchy (primary > active > exploring)
- Animated entrances with staggered delays
- Responsive layout for mobile
- Bidirectional interest relationships (DIY ↔ Workshop, Biking ↔ NYC, Geopolitics ↔ Books)
- Related interests section on each detail page
- Tag-based organization
Changed
/interests/* hierarchyFixed
interests.astro and interests/index.astro (moved old file to backup)Technical
src/data/interests.json with 9 interests and 6 recent activity itemsv2.3.0 2025-10-23
Added
- 7 categories: Computer & Peripherals, Homelab & Network, Drawing & Design, Writing & Notes, Planning & Organization, Furniture & Setup, Maker & Electronics
- 28 items tracked with comprehensive metadata (brand, specs, acquisition date, condition, notes)
- Favorite items highlighting with star badge
- Statistics display: total items and favorites count
- Blue/gray color palette with tech-inspired aesthetic
- Grid-based card layout with hover effects and responsive design
- Emoji icons for visual categorization
- Added to Interests page alongside Kitchen Inventory
Fixed
v2.2.0 2025-10-23
Added
- Organized by categories: Cookware, Knives, Tools, Appliances, Storage, Furniture
- Metadata tracking: brand, size, acquisition date, condition, notes
- Favorite items highlighting with star badge
- Statistics display: total items and favorites count
- Neutral color palette (beige, cream, soft grays) inspired by Japanese aesthetic
- Grid-based card layout with hover effects
- Emoji icons for visual categorization
- Added to Interests page
Fixed
/changelog instead of GitHub linkv2.1.0 2025-10-23
Added
- Rotating cube with Phong material and lighting
- Interactive particle system with orbit controls
- Geometric waves with vertex displacement animation
- 3D procedural fractal tree
- Modal viewer with keyboard navigation
- Scene complexity and type badges
- Version display (v2.1.0)
- GitHub repository link
- Changelog link
- Contact information
Changed
Fixed
for instant loadv2.0.0 2025-10-23
Major Changes
Added
- URL-based seed sharing (
?seed=12345)
- Full-screen mode (F key)
- Download PNG functionality (D key)
- Comprehensive keyboard shortcuts (Space, F, D, C, arrows, ESC, ?)
- Performance badges (light/medium/heavy complexity)
- SVG sketch thumbnails with hover effects
- Deterministic seeded random number generation
- Lazy loading and performance optimization
- Custom cursor (desktop)
- Scroll animations
- Keyboard navigation
- Interactive particles
- Reading progress indicator
- Tilt effects
- Parallax scrolling
- Floating action menu
- Link previews
- Sidenotes and footnotes
- Collapsible sections
- Advanced typography
- Smooth page transitions
Changed
Fixed
v1.0.0 2024
Initial Release
---
Version Numbering