{"id":49361230,"url":"https://github.com/emonhoque/show-tracker-v2","last_synced_at":"2026-04-27T16:35:43.250Z","repository":{"id":315997942,"uuid":"1056792881","full_name":"emonhoque/show-tracker-v2","owner":"emonhoque","description":"A modern PWA for groups to track shows and manage RSVPs. Built with Next.js 15, Supabase, and features offline capabilities, smart time pickers, and native app-like experience.","archived":false,"fork":false,"pushed_at":"2025-09-22T03:48:33.000Z","size":759,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-22T05:38:14.911Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://edmadoptionclinic.org","language":"TypeScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emonhoque.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-14T20:10:56.000Z","updated_at":"2025-09-22T03:47:44.000Z","dependencies_parsed_at":"2025-09-22T05:38:17.895Z","dependency_job_id":"dca83309-81b9-41aa-95f0-bdff25a32543","html_url":"https://github.com/emonhoque/show-tracker-v2","commit_stats":null,"previous_names":["emonhoque/show-tracker-v2"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/emonhoque/show-tracker-v2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emonhoque%2Fshow-tracker-v2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emonhoque%2Fshow-tracker-v2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emonhoque%2Fshow-tracker-v2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emonhoque%2Fshow-tracker-v2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emonhoque","download_url":"https://codeload.github.com/emonhoque/show-tracker-v2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emonhoque%2Fshow-tracker-v2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32345808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-27T16:35:36.702Z","updated_at":"2026-04-27T16:35:43.239Z","avatar_url":"https://github.com/emonhoque.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Show Tracker\n\nA modern, password-protected Progressive Web App (PWA) for groups to track shows and manage RSVPs. Built with Next.js 15.5.2 and Supabase, featuring offline capabilities and native app-like experience.\n\n## Features\n\n- 🔐 **Password-protected access** - Simple shared password with show/hide toggle\n- 📅 **Show management** - Add, edit, and delete shows with intuitive time picker\n- ✅ **Smart RSVP system** - Going/Maybe/Not Going for upcoming, I was there!/Clear for past shows\n- 🔍 **Advanced filtering** - Filter shows by status and people with smart AND logic for multiple selections\n- 📱 **Progressive Web App** - Installable on mobile and desktop devices with scroll-to-top\n- 🕐 **Smart time picker** - Starts at 3 PM, cycles to 2 PM (realistic show times)\n- 📊 **Intelligent sorting** - Next show first (upcoming), newest first (past)\n- 🌐 **Offline detection** - Graceful handling when connection is lost\n- ⚡ **High-performance database** - Optimized queries, indexes, and caching\n- 🚀 **Instant RSVP updates** - Optimistic UI updates for immediate feedback\n- 📄 **Pagination** - Efficient loading of past shows (20 per page) with infinite scroll\n- 🎨 **Modern UI** - Clean, responsive design with smooth animations and dark/light theme support\n- 🎵 **Music integration** - Spotify and Apple Music links for shows\n- 📸 **Photo sharing** - Google Photos links for past shows\n- 🖼️ **Poster uploads** - Upload and display show posters with Vercel Blob storage\n- 🎶 **Community Release Radar** - Track new releases from any artist the community adds\n- 🔍 **Artist Search** - Search and add artists to the community pool via Spotify API\n- 📊 **Performance monitoring** - Vercel Speed Insights integration for performance tracking\n\n## Quick Start\n\n### Prerequisites\n- Node.js 18+\n- A Supabase account\n- A Spotify Developer account (for Release Radar feature)\n\n### Setup\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/emonhoque/show-tracker\n   cd show-tracker\n   ```\n\n2. **Install dependencies**\n   ```bash\n   npm install\n   ```\n\n3. **Set up the database**\n   - Create a new project in Supabase\n   - Go to SQL Editor and run the database migration scripts\n   - This will set up tables, indexes, and optimized RLS policies\n\n4. **Configure environment variables**\n   Create a `.env.local` file in the root directory:\n   ```env\n   # Public environment variables (available to client)\n   NEXT_PUBLIC_APP_PASSWORD=\"your-chosen-password\"\n   \n   # Server-only environment variables\n   SUPABASE_URL=your_supabase_project_url\n   SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key\n   \n   # Timezone configuration\n   TZ=America/New_York\n   \n   # Vercel Storage Blob (optional)\n   BLOB_READ_WRITE_TOKEN=blob\n   \n   # Spotify API (for Release Radar feature)\n   SPOTIFY_CLIENT_ID=your_spotify_client_id\n   SPOTIFY_CLIENT_SECRET=your_spotify_client_secret\n   \n   # Cron job security (optional)\n   CRON_SECRET=your_secure_random_string\n   ```\n\n5. **Run the application**\n   ```bash\n   npm run dev\n   ```\n\n6. **Visit** [http://localhost:3000](http://localhost:3000)\n\n## Usage\n\n### Web App\n1. Enter the shared password and your name\n2. Add shows with the \"Add\" button\n3. RSVP to upcoming shows\n4. Export shows to your calendar using the \"Calendar\" button\n5. Past shows are automatically moved to the Past tab\n6. Check the \"Music\" tab to see new music from tracked artists\n\n### PWA Installation\n- **Mobile**: Tap \"Add to Home Screen\" in your browser menu\n- **Desktop**: Look for the install button in your browser's address bar\n- **Features**: Once installed, scroll-to-top functionality, and native app-like experience\n\n### Time Picker\n- Shows start at 3:00 PM and cycle through to 2:00 PM the next day\n- Covers realistic show times from afternoon to late night\n- No more scrolling through 3 AM times for evening shows!\n\n### Calendar Export\n- Export shows to Google Calendar with one click\n- Download ICS files for Apple Calendar, Outlook, and other calendar apps\n- Automatic timezone conversion for accurate show times\n- Includes all show details: title, venue, time, notes, and links\n\n### Filtering System\nThe app includes a powerful filtering system to help you find specific shows:\n\n#### Status Filters\n- **All**: Shows all upcoming shows (default)\n- **Going**: Shows where people have RSVP'd as \"Going\"\n- **Maybe**: Shows where people have RSVP'd as \"Maybe\"\n- **Not Going**: Shows where people have RSVP'd as \"Not Going\"\n\n#### People Filters\n- **Everyone**: Shows all upcoming shows (default)\n- **Individual People**: Filter by specific attendees\n- **Smart Logic**: When multiple people are selected, shows only events where ALL selected people have the selected status\n\n#### Filter Examples\n- Select \"John\" + \"Taylor\" + \"Going\" = Shows where both John AND Taylor are going\n- Select \"Going\" only = Shows where anyone is going\n- Select \"Sarah\" + \"Maybe\" = Shows where Sarah is maybe attending\n\n### Release Radar Feature\nThe app now includes a community-driven Release Radar tracking system:\n\n#### Adding Artists\n1. Go to the \"Music\" tab\n2. Click \"Add Artist\" to search for artists via Spotify\n3. Once added, the artist's releases will be visible to all users\n4. Artists are shared across the entire community\n\n#### Viewing Releases\n- New releases from all tracked artists appear in the Music tab\n- Shows releases from the last 12 weeks by default\n- Each release shows artist name, release type (album/single/EP), release date, and Spotify link\n- Releases are automatically fetched and updated\n\n#### Automatic Updates\n- Set up a cron job to call `/api/cron/check-releases` periodically\n- This checks all tracked artists for new releases\n- New releases are automatically added to the database\n\n## Deployment\n\nThe easiest way to deploy is using [Vercel](https://vercel.com/new):\n\n1. Push your code to GitHub\n2. Connect your repository to Vercel\n3. Add your environment variables in Vercel's dashboard\n4. Deploy!\n\n## Tech Stack\n\n- **Frontend**: Next.js 15.5.2, React 19.1.0, TypeScript 5\n- **Styling**: Tailwind CSS 4\n- **Database**: Supabase (PostgreSQL) with performance optimizations\n- **PWA**: Service Worker, Web App Manifest\n- **Icons**: Lucide React\n- **Date Handling**: date-fns with timezone support\n- **UI Components**: Radix UI primitives\n- **Testing**: Jest with React Testing Library\n- **File Storage**: Vercel Blob for poster uploads\n- **Performance**: Vercel Speed Insights\n- **Deployment**: Vercel (recommended)\n\n## Database Setup\n\nThe app uses comprehensive database migration scripts that include:\n\n- **Tables**: `shows`, `rsvps`, `artists`, `releases`, and `user_artists` with proper relationships\n- **Show Fields**: title, date_time, time_local, city, venue, ticket_url, spotify_url, apple_music_url, google_photos_url, poster_url, notes\n- **Indexes**: Optimized for upcoming/past shows and RSVP joins\n- **RLS Policies**: Streamlined for performance and security\n- **Statistics**: Updated for optimal query planning\n\n### Key Database Optimizations\n\n1. **Combined Queries**: Shows and RSVPs are fetched together, eliminating the N+1 query problem\n2. **Strategic Indexes**: \n   - `idx_shows_upcoming` for upcoming shows queries\n   - `idx_shows_past` for past shows queries  \n   - `idx_rsvps_show_status` for efficient RSVP joins\n3. **RLS Optimization**: Single policy per action, no duplicate evaluations\n4. **Response Caching**: API responses cached for 1-5 minutes depending on data type\n\n## PWA Features\n\nThis app is a fully functional Progressive Web App with:\n\n- **Installable**: Can be installed on mobile and desktop devices\n- **Offline capable**: Works without internet connection (with graceful degradation)\n- **Native-like experience**: Scroll-to-top, app-like navigation\n- **No stale data**: Always fetches fresh show/RSVP data when online\n- **Cross-platform**: Works on iOS, Android, Windows, macOS, Linux\n- **Theme support**: Dark and light mode with system preference detection\n- **Responsive design**: Optimized for all screen sizes\n- **Pull-to-refresh**: Native gesture support for refreshing content\n- **Chunk error recovery**: Automatic recovery from JavaScript chunk loading failures\n\n## Performance Optimizations\n\n### Database Level\n- **Combined queries**: Shows and RSVPs fetched in single database calls (eliminates N+1 problem)\n- **Optimized indexes**: Strategic database indexes for fast query performance\n- **RLS optimization**: Streamlined Row Level Security policies for better performance\n- **Response caching**: API responses cached with appropriate headers (1-5 minutes)\n\n### Frontend Level\n- **Optimistic updates**: RSVP changes feel instant with immediate UI feedback\n- **Infinite scroll**: Past shows load 20 at a time with seamless infinite scroll\n- **Skeleton loading**: Smooth loading states prevent layout shifts\n- **Smart caching**: Static assets cached, API data always fresh\n- **Efficient re-renders**: Minimal unnecessary component updates\n- **Chunk loading**: Optimized webpack configuration for mobile performance\n- **Error handling**: Robust chunk load error recovery with automatic cache clearing\n\n### Performance Impact\n- **80% fewer database calls** - From 11+ queries to just 2 per page load\n- **2-5x faster queries** - Optimized database structure and indexes\n- **Instant RSVP updates** - No waiting for server responses\n- **Better scalability** - Handles large numbers of shows efficiently\n\n## Additional Features\n\n### Show Management\n- **Rich show data**: Support for ticket URLs, Spotify/Apple Music links, Google Photos, and notes\n- **Smart time handling**: America/New_York timezone support with proper UTC conversion\n- **Validation**: Comprehensive input validation and sanitization\n- **Edit/Delete**: Full CRUD operations with confirmation dialogs\n\n### User Experience\n- **Theme switching**: Dark and light mode with persistent preference\n- **Mobile optimization**: Touch-friendly interface with proper mobile gestures\n- **Offline indicators**: Clear visual feedback when connection is lost\n- **Loading states**: Skeleton loaders and smooth transitions\n- **Error handling**: Graceful error recovery and user feedback\n\n### Security \u0026 Performance\n- **Input sanitization**: All user inputs are validated and sanitized\n- **Service worker**: Advanced caching strategy for optimal performance\n- **Chunk optimization**: Webpack configuration optimized for mobile devices\n- **Database security**: Row Level Security (RLS) policies for data protection\n- **File upload security**: Type and size validation for poster uploads (JPEG, PNG, WebP, max 10MB)\n- **XSS protection**: HTML sanitization to prevent cross-site scripting attacks\n- **Performance monitoring**: Real-time performance tracking with Vercel Speed Insights\n\n## License\n\nMIT License - feel free to use this project for your own group!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femonhoque%2Fshow-tracker-v2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femonhoque%2Fshow-tracker-v2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femonhoque%2Fshow-tracker-v2/lists"}