fediversion/.specify/specs/fediversion-multi-band.md
fullsizemalt b4cddf41ea feat: Initialize Fediversion multi-band platform
- Fork elmeg-demo codebase for multi-band support
- Add data importer infrastructure with base class
- Create band-specific importers:
  - phish.py: Phish.net API v5
  - grateful_dead.py: Grateful Stats API
  - setlistfm.py: Dead & Company, Billy Strings (Setlist.fm)
- Add spec-kit configuration for Gemini
- Update README with supported bands and architecture
2025-12-28 12:39:28 -08:00

185 lines
7.1 KiB
Markdown

# Feature Specification: Fediversion - Multi-Band Jam Platform
**Feature Branch**: `001-fediversion-multi-band`
**Created**: 2025-12-28
**Status**: Draft
**Input**: Expand elmeg.xyz (Goose) to support Grateful Dead, Dead & Company, Phish, and Billy Strings
---
## Executive Summary
Fediversion is a unified "HeadyVersion" platform for multiple jam bands. It extends the proven elmeg.xyz architecture to support multiple "verticals" (bands) while sharing common infrastructure for users, social features, and the core setlist/performance tracking system.
---
## User Scenarios & Testing
### User Story 1 - Cross-Band Discovery (Priority: P1)
A jam band fan visits the platform and can browse shows and performances across multiple bands they follow (Phish, Dead & Company, Billy Strings) from a single account.
**Why this priority**: This is the core value proposition - one account, all bands.
**Independent Test**: User can register once, mark attendance at shows from different bands, and see unified activity feed.
**Acceptance Scenarios**:
1. **Given** a logged-in user, **When** they navigate to the band selector, **Then** they see all supported bands (Goose, Phish, Grateful Dead, Dead & Company, Billy Strings)
2. **Given** a user on Phish section, **When** they click a show, **Then** they see the full setlist with performance pages
3. **Given** a user with attendance records on multiple bands, **When** they view their profile, **Then** attendance is organized by band
---
### User Story 2 - Phish Fan Migration (Priority: P1)
A Phish fan can access complete setlist data, rate performances, and track their show attendance with the same depth as Phish.net but with enhanced social features.
**Why this priority**: Phish has the most complete API and largest community.
**Independent Test**: User can browse Phish shows from 1983-present, view setlists, rate performances, and see gap statistics.
**Acceptance Scenarios**:
1. **Given** complete Phish data import, **When** user searches "Tweezer", **Then** they see all 600+ performances with dates
2. **Given** a Phish show page, **When** user views setlist, **Then** they see Set 1, Set 2, Encore with segue indicators (>)
---
### User Story 3 - Dead Family Navigation (Priority: P2)
A Deadhead can navigate between Grateful Dead, Dead & Company, and related projects, with song history spanning the entire lineage.
**Why this priority**: Dead family bands share repertoire, enabling unique cross-band song tracking.
**Independent Test**: User can view "Dark Star" song page showing performances across GD, D&C, and side projects.
**Acceptance Scenarios**:
1. **Given** a song played by both GD and D&C, **When** user views song stats, **Then** they see aggregate and per-band breakdowns
2. **Given** D&C show page, **When** viewing performance, **Then** user can see "also played by Grateful Dead X times"
---
### User Story 4 - Billy Strings Fan Experience (Priority: P2)
A Billy Strings fan can access complete setlist data and engage with community features for the fast-growing bluegrass jam scene.
**Why this priority**: Billy Strings is the fastest-growing jam act, appealing to both bluegrass and jamband audiences.
**Independent Test**: User can browse all Billy Strings shows, view setlists, and rate performances.
**Acceptance Scenarios**:
1. **Given** Billy Strings data import, **When** user browses shows, **Then** they see shows from 2016-present
2. **Given** a BMFS show, **When** viewing setlist, **Then** user sees song titles, covers attributed to original artists
---
### Edge Cases
- What happens when a song is shared between multiple bands with different arrangements?
- How do we handle guest sit-ins across bands (e.g., Bobby Weir sitting in with Billy Strings)?
- How do we handle date conflicts (two bands playing same date)?
- What if a data source API becomes unavailable?
---
## Requirements
### Functional Requirements
- **FR-001**: System MUST support multiple "Verticals" (bands) with independent show/song data
- **FR-002**: System MUST allow users to track attendance across all bands from single account
- **FR-003**: System MUST import setlist data from band-specific APIs (Phish.net, Grateful Stats, etc.)
- **FR-004**: System MUST provide per-band navigation with clear visual distinction
- **FR-005**: System MUST display song gap statistics independently per band
- **FR-006**: System MUST allow performance ratings scoped to specific performances
- **FR-007**: System MUST support chase songs per band (user wants to see song X by band Y)
- **FR-008**: System SHOULD track cross-band song appearances where applicable
- **FR-009**: System SHOULD support band-specific theming/branding
### Key Entities
- **Vertical**: A band/artist (Goose, Phish, Grateful Dead, Dead & Company, Billy Strings)
- **Show**: A concert tied to a Vertical, Venue, and optional Tour
- **Song**: A composition tied to a Vertical (but may have cross-references)
- **Performance**: A specific play of a Song at a Show
- **User**: Single account spanning all Verticals
- **Attendance**: User's attendance at a Show
- **Rating/Review**: Tied to Performance, Show, or Song
---
## Success Criteria
### Measurable Outcomes
- **SC-001**: All target band data imported (500+ Phish shows, 2,000+ GD shows, 100+ D&C shows, 500+ BMFS shows)
- **SC-002**: Users can navigate between bands in <2 clicks
- **SC-003**: Search returns results across all bands in <500ms
- **SC-004**: Data import runs incrementally without duplicating existing records
- **SC-005**: Gap statistics calculate correctly per-band
---
## Data Source Specifications
### Phish.net API v5
- **Base URL**: `https://api.phish.net/v5`
- **Auth**: API key required (register at phish.net)
- **Endpoints**: `/shows`, `/setlists`, `/songs`, `/venues`
- **Rate Limit**: Unspecified, cache heavily
- **Attribution**: "Data courtesy of Phish.net"
### Grateful Stats API
- **Base URL**: `https://gratefulstats.com/api`
- **Auth**: TBD (may require key)
- **Coverage**: Grateful Dead complete, may include D&C
- **Attribution**: Required
### Setlist.fm API (Fallback)
- **Base URL**: `https://api.setlist.fm/rest/1.0`
- **Auth**: API key required
- **Coverage**: Universal, good for Billy Strings and D&C
- **Limitations**: Less structured than band-specific APIs
### Billy Strings Sources
- **bmfsdb.com**: Fan database, structure TBD
- **BillyBase (billybase.net)**: Alternative source
- **Fallback**: Setlist.fm
---
## Technical Approach
### Architecture Pattern
The existing elmeg-demo uses a `Vertical` model that already supports multi-band architecture:
```python
class Vertical(SQLModel, table=True):
id: Optional[int]
name: str # "Phish"
slug: str # "phish"
description: str
class Show(SQLModel, table=True):
vertical_id: int # Links to Vertical
# ...
class Song(SQLModel, table=True):
vertical_id: int # Links to Vertical
# ...
```
### Recommended Changes
1. **Data Import Layer**: Create pluggable importer classes per data source
2. **Frontend Routing**: Add `/{vertical}/` prefix to all routes
3. **API Scoping**: Add vertical filter to all list endpoints
4. **Theme System**: Per-vertical color/branding configuration