Colophon

The tech stack, design decisions, and integrations that make this site tick.

Framework & Hosting

Astro 5

Static-first framework with islands architecture. Astro components handle server-side rendering, React components hydrate client-side only where interactivity is needed.

Framework & Hosting

React 19

Used for interactive islands โ€” animated icons, GitHub calendar, social links โ€” hydrated via client:idle and client:visible directives.

Framework & Hosting

Netlify

Static output with serverless API routes for Spotify, Discogs, Hardcover, view counting, and password-protected posts.

Framework & Hosting

TypeScript

End-to-end type safety across components, API routes, content schemas, and utility functions.

Content

Astro Content Collections

Four collections โ€” Thoughts, TIL, Projects, Photography โ€” with Zod schemas, Markdown/MDX support, and frontmatter validation.

Content

Shiki

Syntax highlighting with dual themes (Catppuccin Latte for light, Tokyo Night for dark), plus transformers for filename labels, line highlighting, and diff notation.

Content

Custom Rehype Plugins

Sidenotes rendered as margin notes on wide screens, external link indicators, and GFM support via remark-gfm.

Content

Pages CMS

Git-based content management for data files โ€” bookmarks, brain dumps, networks, and speaker bio copy on the media page.

Content

Changelogs

Auto-generated at build time by running git log via Node's execSync. Parses conventional commit prefixes, filters out content-only noise, and groups entries by month โ€” no manual changelog maintenance needed.

Styling & Design

Tailwind CSS 3

Utility-first CSS with class-based dark mode. Extended via a custom design system token layer built on CSS custom properties.

Styling & Design

Design Tokens

CSS variables for colours, shadows, radii, z-index scale, and transition speeds. Every component references tokens, never raw values.

Styling & Design

Typography

Literata (serif) for body and headings, system sans-serif for UI elements. Font size accessibility controls for reader preference.

Styling & Design

View Transitions

Astro's ClientRouter for smooth page transitions. Dark mode toggle uses a clip-path circle reveal animation from the click point.

Integrations

Spotify

Now-playing widget with marquee text, spinning vinyl disc animation, and idle state. OAuth token refresh handled server-side.

Integrations

Hardcover

GraphQL-powered reading list rendered as an interactive bookshelf. Click any spine to open a modal with cover art, star rating, genres, description, and a deep-link to Hardcover.

Integrations

Discogs

Vinyl collection displayed in a grid with spinning disc animations and YouTube-powered single playback for each record.

Integrations

Upstash Redis

View counting for Thoughts and TIL posts with per-session deduplication, stale-while-revalidate caching, and graceful fallback.

Integrations

GitHub

Contribution calendar on the projects page via react-github-calendar.

Integrations

Microlink

Auto-generated bookmark preview thumbnails for the curated links collection.

Integrations

Cloudflare Web Analytics

Privacy-friendly, cookie-free analytics with no pageview limits. No individual visitor tracking.

Integrations

YouTube IFrame API

Lofi music player powered by a hidden YouTube iframe. Global singleton on <html> survives Astro view transitions. Optimistic play state, CSS vinyl disc, and spring-animated playlist toggle.

Interactions & Polish

30+ Animated Icons

SVG React components with hover animations, derived from itshover.com and wrapped in a shared animation controller.

Interactions & Polish

Motion

Layout animations and presence transitions throughout the site โ€” most notably the talks accordion, where photo thumbnails morph into a full gallery on expand via shared layoutId, with spring-animated height and coordinated AnimatePresence exit sequences.

Interactions & Polish

Cambio

Drag-to-dismiss photo lightbox in the talks section. Sheet-style overlay with spring entry animation, pointer-capture swipe-to-close gesture, and scroll lock while open.

Interactions & Polish

Typed.js

Typewriter animation for the rotating quote in the sidebar. Lazy-loaded on first use to avoid blocking initial paint.

Interactions & Polish

Sound Effects

Web Audio API piano notes on bookshelf hover (mapped across a jazz pentatonic scale), transition sounds for modal open and close, button taps, and page navigation. Off by default with a persistent mute toggle.

Interactions & Polish

Haptic Feedback

Vibration API patterns on mobile for button presses, toggles, and form submissions.

Interactions & Polish

Command Palette & Search

Cmd+K interface for keyboard navigation across all pages and posts, plus g+key shortcuts. Full-text search powered by Pagefind โ€” indexes at build time, loads on demand with zero upfront JS cost.

Interactions & Polish

PWA

Installable with offline support via service worker. Save individual posts for offline reading.

Interactions & Polish

OG Images

Dynamic Open Graph image generation via Vercel OG for every blog post.

Performance

Static Output

Pre-rendered HTML with selective hydration. Only interactive islands ship JavaScript to the client.

Performance

Asset Compression

Images optimised to AVIF via Astro's image pipeline. CSS and JS compressed at build time.

Performance

Prefetching

All routes prefetched on page load for near-instant navigation.

Performance

Caching

Build-time API response caching with 5-minute TTL. Redis view counts use stale-while-revalidate headers.

Performance

LQIP Blur Placeholders

Build-time generated 20px base64 WebP thumbnails used as blurred CSS placeholders across the site โ€” profile photos, press photos, talk gallery images, and more. Fades out once the full image loads.

For the full story behind building this site, read Building itsmeray v6. For a running log of every feature and fix shipped, see the Changelogs.