Personal website for Akhil Panchal, built with Astro and featuring a blog, music discography, and a persistent media player.
- π΅ Music Discography: Centralized discography powered by a persistent YouTube/SoundCloud player
- π Release Dates: Manually curated release dates stored in the discography data and sorted newest-first
- π Blog: Content collections for blog and music posts, with MDX support for React components
- π Dark Mode: Theme toggle with system preference detection and local storage persistence
- π¨ Design System: Tailwind CSS 4 with shadcn-style UI components
npm installnpm run devnpm run buildsrc/
βββ components/ # Astro and React components (UI, discography, media player, etc.)
βββ content/ # Content collections: blog/ and music/
βββ data/ # Discography data (YouTube + SoundCloud tracks)
βββ layouts/ # Page layouts and base layout
βββ lib/ # Utilities (media player state, date formatting, helpers)
βββ pages/ # Route pages (index, posts, music, about, rss, etc.)
βββ styles/ # Global styles and typography configuration
βββ types/ # Shared TypeScript types (media player, YouTube IFrame API)
Tracks are defined in src/data/discography.ts using the MediaTrack type:
export interface MediaTrack {
platform: 'youtube' | 'soundcloud';
trackId: string; // YouTube videoId or SoundCloud track URL
title: string;
releaseDate?: Date | string; // Manually specified
description?: string;
category?: 'original' | 'cover';
thumbnailUrl?: string;
}To add a new track:
- Add a new
MediaTrackentry to thediscographyDataarray insrc/data/discography.ts. - Set
platformto'youtube'or'soundcloud'. - Set
trackIdto the YouTube video ID or full SoundCloud URL. - Provide
releaseDateasYYYY-MM-DDso sorting works correctly. - Optionally set
category('original'or'cover') anddescription.
Helper functions like getOriginalSongs, getCoverSongs, and getAllTracksSorted are exported from the same file for use in components.