This commit is contained in:
Michael Freno
2026-02-03 23:29:36 -05:00
commit f08afb2ed1
59 changed files with 3736 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
# 01. Initialize SolidJS OpenTUI Project with Bun
meta:
id: podcast-tui-app-01
feature: podcast-tui-app
priority: P0
depends_on: []
tags: [project-setup, solidjs, opentui, bun]
objective:
- Initialize a new SolidJS-based OpenTUI project using Bun
- Set up project structure with all necessary dependencies
- Configure TypeScript and development environment
deliverables:
- `/podcast-tui-app/` directory created
- `package.json` with all dependencies
- `tsconfig.json` configured for TypeScript
- `bunfig.toml` with Bun configuration
- `.gitignore` for Git version control
- `README.md` with project description
steps:
- Run `bunx create-tui@latest -t solid podcast-tui-app` to initialize the project
- Verify project structure is created correctly
- Install additional dependencies: `bun add @opentui/solid @opentui/core solid-js zustand`
- Install dev dependencies: `bun add -d @opentui/testing @opentui/react @opentui/solid`
- Configure TypeScript in `tsconfig.json` with SolidJS and OpenTUI settings
- Create `.gitignore` with Node and Bun specific files
- Initialize Git repository: `git init`
tests:
- Unit: Verify `create-tui` command works without errors
- Integration: Test that application can be started with `bun run src/index.tsx`
- Environment: Confirm all dependencies are installed correctly
acceptance_criteria:
- Project directory `podcast-tui-app/` exists
- `package.json` contains `@opentui/solid` and `@opentui/core` dependencies
- `bun run src/index.tsx` starts the application without errors
- TypeScript compilation works with `bun run build`
validation:
- Run `bun run build` to verify TypeScript compilation
- Run `bun run src/index.tsx` to start the application
- Run `bun pm ls` to verify all dependencies are installed
notes:
- OpenTUI is already installed in the system
- Use `-t solid` flag for SolidJS template
- All commands should be run from the project root

View File

@@ -0,0 +1,55 @@
# 02. Create Main App Shell with Tab Navigation
meta:
id: podcast-tui-app-02
feature: podcast-tui-app
priority: P0
depends_on: [01]
tags: [layout, navigation, solidjs, opentui]
objective:
- Create the main application shell with a responsive layout
- Implement tab-based navigation system
- Set up the root component structure
- Configure Flexbox layout for terminal UI
deliverables:
- `src/App.tsx` with main app shell
- `src/components/Navigation.tsx` with tab navigation
- `src/components/Layout.tsx` with responsive layout
- Tab navigation component with 5 tabs: Discover, My Feeds, Search, Player, Settings
steps:
- Create `src/App.tsx` with main component that renders Navigation
- Create `src/components/Navigation.tsx` with tab navigation
- Use `<box>` with `<scrollbox>` for navigation
- Implement tab selection state with `createSignal`
- Add keyboard navigation (arrow keys)
- Add tab labels: "Discover", "My Feeds", "Search", "Player", "Settings"
- Create `src/components/Layout.tsx` with responsive layout
- Use Flexbox with `flexDirection="column"`
- Create top navigation bar
- Create main content area
- Handle terminal resizing
- Update `src/index.tsx` to render the app
tests:
- Unit: Test Navigation component renders with correct tabs
- Integration: Test keyboard navigation moves between tabs
- Component: Verify layout adapts to terminal size changes
acceptance_criteria:
- Navigation component displays 5 tabs correctly
- Tab selection is visually indicated
- Arrow keys navigate between tabs
- Layout fits within terminal bounds
validation:
- Run application and verify navigation appears
- Press arrow keys to test navigation
- Resize terminal and verify layout adapts
notes:
- Use SolidJS `createSignal` for state management
- Follow OpenTUI layout patterns from `layout/REFERENCE.md`
- Navigation should be persistent across all screens

View File

@@ -0,0 +1,64 @@
# 03. Implement Direct File Sync (JSON/XML Import/Export)
meta:
id: podcast-tui-app-03
feature: podcast-tui-app
priority: P1
depends_on: [02]
tags: [file-sync, json, xml, import-export, solidjs]
objective:
- Create data models for JSON and XML sync formats
- Implement import functionality to load feeds and settings from files
- Implement export functionality to save feeds and settings to files
- Add file picker UI for selecting files
deliverables:
- `src/types/sync.ts` with sync data models
- `src/utils/sync.ts` with import/export functions
- `src/components/SyncPanel.tsx` with sync UI
- File picker component for file selection
steps:
- Create `src/types/sync.ts` with data models:
- `SyncData` interface for JSON format
- `SyncDataXML` interface for XML format
- Include fields: feeds, sources, settings, preferences
- Create `src/utils/sync.ts` with functions:
- `exportToJSON(data: SyncData): string`
- `importFromJSON(json: string): SyncData`
- `exportToXML(data: SyncDataXML): string`
- `importFromXML(xml: string): SyncDataXML`
- Handle validation and error checking
- Create `src/components/SyncPanel.tsx` with:
- Import button
- Export button
- File picker UI using `<input>` component
- Sync status indicator
- Add sync functionality to Settings screen
tests:
- Unit: Test JSON import/export with sample data
- Unit: Test XML import/export with sample data
- Integration: Test file picker selects correct files
- Integration: Test sync panel buttons work correctly
acceptance_criteria:
- Export creates valid JSON file with all data
- Export creates valid XML file with all data
- Import loads data from JSON file
- Import loads data from XML file
- File picker allows selecting files from disk
validation:
- Run `bun run src/index.tsx`
- Go to Settings > Sync
- Click Export, verify file created
- Click Import, select file, verify data loaded
- Test with both JSON and XML formats
notes:
- JSON format: Simple, human-readable
- XML format: More structured, better for complex data
- Use `FileReader` API for file operations
- Handle file not found and invalid format errors

View File

@@ -0,0 +1,78 @@
# 04. Build Optional Authentication System
meta:
id: podcast-tui-app-04
feature: podcast-tui-app
priority: P2
depends_on: [03]
tags: [authentication, optional, solidjs, security]
objective:
- Create authentication state management (disabled by default)
- Build simple login screen with email/password
- Implement 8-character code validation flow
- Add OAuth placeholder screens
- Create sync-only user profile
deliverables:
- `src/stores/auth.ts` with authentication state store
- `src/components/LoginScreen.tsx` with login form
- `src/components/CodeValidation.tsx` with 8-character code input
- `src/components/OAuthPlaceholder.tsx` with OAuth info
- `src/components/SyncProfile.tsx` with sync-only profile
steps:
- Create `src/stores/auth.ts` with Zustand store:
- `user` state (initially null)
- `isAuthenticated` state (initially false)
- `login()` function
- `logout()` function
- `validateCode()` function
- Create `src/components/LoginScreen.tsx`:
- Email input field
- Password input field
- Login button
- Link to code validation flow
- Link to OAuth placeholder
- Create `src/components/CodeValidation.tsx`:
- 8-character code input
- Validation logic (alphanumeric)
- Submit button
- Error message display
- Create `src/components/OAuthPlaceholder.tsx`:
- Display OAuth information
- Explain terminal limitations
- Link to browser redirect flow
- Create `src/components/SyncProfile.tsx`:
- User profile display
- Sync status indicator
- Profile management options
- Add auth screens to Navigation (hidden by default)
tests:
- Unit: Test authentication state management
- Unit: Test code validation logic
- Integration: Test login flow completes
- Integration: Test logout clears state
acceptance_criteria:
- Authentication is disabled by default (isAuthenticated = false)
- Login screen accepts email and password
- Code validation accepts 8-character codes
- OAuth placeholder displays limitations
- Sync profile shows user info
- Login state persists across sessions
validation:
- Run application and verify login screen is accessible
- Try to log in with valid credentials
- Try to log in with invalid credentials
- Test code validation with valid/invalid codes
- Verify authentication state persists
notes:
- Authentication is optional and disabled by default
- Focus on file sync, not user accounts
- Use simple validation (no real backend)
- Store authentication state in localStorage
- OAuth not feasible in terminal, document limitation

View File

@@ -0,0 +1,58 @@
# 05. Create Feed Data Models and Types
meta:
id: podcast-tui-app-05
feature: podcast-tui-app
priority: P0
depends_on: [04]
tags: [types, data-models, solidjs, typescript]
objective:
- Define TypeScript interfaces for all podcast-related data types
- Create models for feeds, episodes, sources, and user preferences
- Set up type definitions for sync functionality
deliverables:
- `src/types/podcast.ts` with all data models
- `src/types/episode.ts` with episode-specific types
- `src/types/source.ts` with podcast source types
- `src/types/preference.ts` with user preference types
steps:
- Create `src/types/podcast.ts` with core types:
- `Podcast` interface (id, title, description, coverUrl, feedUrl, lastUpdated)
- `Episode` interface (id, title, description, audioUrl, duration, pubDate, episodeNumber)
- `Feed` interface (id, podcast, episodes[], isPublic, sourceId)
- `FeedItem` interface (represents a single episode in a feed)
- Create `src/types/episode.ts` with episode types:
- `Episode` interface
- `EpisodeStatus` enum (playing, paused, completed)
- `Progress` interface (episodeId, position, duration)
- Create `src/types/source.ts` with source types:
- `PodcastSource` interface (id, name, baseUrl, type, apiKey)
- `SourceType` enum (rss, api, custom)
- `SearchQuery` interface (query, sourceIds, filters)
- Create `src/types/preference.ts` with preference types:
- `UserPreference` interface (theme, fontSize, playbackSpeed, autoDownload)
- `SyncPreference` interface (autoSync, backupInterval, syncMethod)
- Add type exports in `src/index.ts`
tests:
- Unit: Verify all interfaces compile correctly
- Unit: Test enum values are correct
- Integration: Test type definitions match expected data structures
acceptance_criteria:
- All TypeScript interfaces compile without errors
- Types are exported for use across the application
- Type definitions cover all podcast-related data
validation:
- Run `bun run build` to verify TypeScript compilation
- Check `src/types/` directory contains all required files
notes:
- Use strict TypeScript mode
- Include JSDoc comments for complex types
- Keep types simple and focused
- Ensure types are compatible with sync JSON/XML formats

View File

@@ -0,0 +1,63 @@
# 06. Build Feed List Component (Public/Private Feeds)
meta:
id: podcast-tui-app-06
feature: podcast-tui-app
priority: P0
depends_on: [05]
tags: [feed-list, components, solidjs, opentui]
objective:
- Create a scrollable feed list component
- Display public and private feeds
- Implement feed selection and display
- Add reverse chronological ordering
deliverables:
- `src/components/FeedList.tsx` with feed list component
- `src/components/FeedItem.tsx` with individual feed item
- `src/components/FeedFilter.tsx` with public/private toggle
steps:
- Create `src/components/FeedList.tsx`:
- Use `<scrollbox>` for scrollable list
- Accept feeds array as prop
- Implement feed rendering with `createSignal` for selection
- Add keyboard navigation (arrow keys, enter)
- Display feed title, description, episode count
- Create `src/components/FeedItem.tsx`:
- Display feed information
- Show public/private indicator
- Highlight selected feed
- Add hover effects
- Create `src/components/FeedFilter.tsx`:
- Toggle button for public/private feeds
- Filter logic implementation
- Update parent FeedList when filtered
- Add feed list to "My Feeds" navigation tab
tests:
- Unit: Test FeedList renders with feeds
- Unit: Test FeedItem displays correctly
- Integration: Test public/private filtering
- Integration: Test keyboard navigation in feed list
acceptance_criteria:
- Feed list displays all feeds correctly
- Public/private toggle filters feeds
- Feed selection is visually indicated
- Keyboard navigation works (arrow keys, enter)
- List scrolls properly when many feeds
validation:
- Run application and navigate to "My Feeds"
- Add some feeds and verify they appear
- Test public/private toggle
- Use arrow keys to navigate feeds
- Scroll list with many feeds
notes:
- Use SolidJS `createSignal` for selection state
- Follow OpenTUI component patterns from `components/REFERENCE.md`
- Feed list should be scrollable with many items
- Use Flexbox for layout

View File

@@ -0,0 +1,68 @@
# 07. Implement Multi-Source Search Interface
meta:
id: podcast-tui-app-07
feature: podcast-tui-app
priority: P1
depends_on: [06]
tags: [search, multi-source, solidjs, opentui]
objective:
- Create search input component
- Implement multi-source search functionality
- Display search results with sources
- Add search history with persistent storage
deliverables:
- `src/components/SearchBar.tsx` with search input
- `src/components/SearchResults.tsx` with results display
- `src/components/SearchHistory.tsx` with history list
- `src/utils/search.ts` with search logic
steps:
- Create `src/components/SearchBar.tsx`:
- Search input field using `<input>` component
- Search button
- Clear history button
- Enter key handler
- Create `src/utils/search.ts`:
- `searchPodcasts(query: string, sourceIds: string[]): Promise<Podcast[]>`
- `searchEpisodes(query: string, feedId: string): Promise<Episode[]>`
- Handle multiple sources
- Cache search results
- Create `src/components/SearchResults.tsx`:
- Display search results with source indicators
- Show podcast/episode info
- Add click to add to feeds
- Keyboard navigation through results
- Create `src/components/SearchHistory.tsx`:
- Display recent search queries
- Click to re-run search
- Delete individual history items
- Persist to localStorage
tests:
- Unit: Test search logic returns correct results
- Unit: Test search history persistence
- Integration: Test search bar accepts input
- Integration: Test results display correctly
acceptance_criteria:
- Search bar accepts and processes queries
- Multi-source search works across all enabled sources
- Search results display with source information
- Search history persists across sessions
- Keyboard navigation works in results
validation:
- Run application and navigate to "Search"
- Type a query and press Enter
- Verify results appear
- Click a result to add to feed
- Restart app and verify history persists
notes:
- Use localStorage for search history
- Implement basic caching to avoid repeated searches
- Handle empty results gracefully
- Add loading state during search

View File

@@ -0,0 +1,63 @@
# 08. Build Discover Feed with Popular Shows
meta:
id: podcast-tui-app-08
feature: podcast-tui-app
priority: P1
depends_on: [07]
tags: [discover, popular-shows, solidjs, opentui]
objective:
- Create popular shows data structure
- Build discover page component
- Display trending shows with categories
- Implement category filtering
deliverables:
- `src/data/popular-shows.ts` with trending shows data
- `src/components/DiscoverPage.tsx` with discover UI
- `src/components/CategoryFilter.tsx` with category buttons
steps:
- Create `src/data/popular-shows.ts`:
- Array of popular podcasts with metadata
- Categories: Technology, Business, Science, Entertainment
- Reverse chronological ordering (newest first)
- Include feed URLs and descriptions
- Create `src/components/DiscoverPage.tsx`:
- Title header
- Category filter buttons
- Grid/list display of popular shows
- Show details on selection
- Add to feed button
- Create `src/components/CategoryFilter.tsx`:
- Category button group
- Active category highlighting
- Filter logic implementation
- Add discover page to "Discover" navigation tab
tests:
- Unit: Test popular shows data structure
- Unit: Test category filtering
- Integration: Test discover page displays correctly
- Integration: Test add to feed functionality
acceptance_criteria:
- Discover page displays popular shows
- Category filtering works correctly
- Shows are ordered reverse chronologically
- Clicking a show shows details
- Add to feed button works
validation:
- Run application and navigate to "Discover"
- Verify popular shows appear
- Click different categories
- Click a show and verify details
- Try add to feed
notes:
- Popular shows data can be static or fetched from sources
- If sources don't provide trending, use curated list
- Categories help users find shows by topic
- Use Flexbox for category filter layout

View File

@@ -0,0 +1,70 @@
# 09. Create Player UI with Waveform Visualization
meta:
id: podcast-tui-app-09
feature: podcast-tui-app
priority: P0
depends_on: [08]
tags: [player, waveform, visualization, solidjs, opentui]
objective:
- Create player UI layout
- Implement playback controls (play/pause, skip, progress)
- Build ASCII waveform visualization
- Add progress tracking and seek functionality
deliverables:
- `src/components/Player.tsx` with player UI
- `src/components/PlaybackControls.tsx` with controls
- `src/components/Waveform.tsx` with ASCII waveform
- `src/utils/waveform.ts` with visualization logic
steps:
- Create `src/components/Player.tsx`:
- Player header with episode info
- Progress bar with seek functionality
- Waveform visualization area
- Playback controls
- Create `src/components/PlaybackControls.tsx`:
- Play/Pause button
- Previous/Next episode buttons
- Volume control
- Speed control
- Keyboard shortcuts (space, arrows)
- Create `src/components/Waveform.tsx`:
- ASCII waveform visualization
- Click to seek
- Color-coded for played/paused
- Use frame buffer for drawing
- Create `src/utils/waveform.ts`:
- Generate waveform data from audio
- Convert to ASCII characters
- Handle audio duration and position
- Add player to "Player" navigation tab
tests:
- Unit: Test waveform generation
- Unit: Test playback controls
- Integration: Test player UI displays correctly
- Integration: Test keyboard shortcuts work
acceptance_criteria:
- Player UI displays episode information
- Playback controls work (play/pause, skip)
- Waveform visualization shows audio waveform
- Progress bar updates during playback
- Clicking waveform seeks to position
validation:
- Run application and navigate to "Player"
- Select an episode to play
- Test playback controls
- Verify waveform visualization
- Test seeking by clicking waveform
- Test keyboard shortcuts
notes:
- ASCII waveform: Use `#` for peaks, `.` for valleys
- Audio integration: Trigger system player or use Web Audio API
- Waveform data needs to be cached for performance
- Use SolidJS `useTimeline` for animation

View File

@@ -0,0 +1,70 @@
# 10. Build Settings Screen and Preferences
meta:
id: podcast-tui-app-10
feature: podcast-tui-app
priority: P1
depends_on: [09]
tags: [settings, preferences, solidjs, opentui]
objective:
- Create settings screen component
- Add source management UI
- Build user preferences panel
- Implement data persistence
deliverables:
- `src/components/SettingsScreen.tsx` with settings UI
- `src/components/SourceManager.tsx` with source management
- `src/components/PreferencesPanel.tsx` with user preferences
- `src/utils/persistence.ts` with localStorage utilities
steps:
- Create `src/components/SettingsScreen.tsx`:
- Settings menu with sections
- Navigation between settings sections
- Save/Cancel buttons
- Create `src/components/SourceManager.tsx`:
- List of enabled sources
- Add source button
- Remove source button
- Enable/disable toggle
- Create `src/components/PreferencesPanel.tsx`:
- Theme selection (light/dark)
- Font size control
- Playback speed control
- Auto-download settings
- Create `src/utils/persistence.ts`:
- `savePreference(key, value)`
- `loadPreference(key)`
- `saveFeeds(feeds)`
- `loadFeeds()`
- `saveSettings(settings)`
- `loadSettings()`
- Add settings screen to "Settings" navigation tab
tests:
- Unit: Test persistence functions
- Unit: Test source management
- Integration: Test settings screen navigation
- Integration: Test preferences save/load
acceptance_criteria:
- Settings screen displays all sections
- Source management adds/removes sources
- Preferences save correctly
- Data persists across sessions
- Settings screen is accessible
validation:
- Run application and navigate to "Settings"
- Test source management
- Change preferences and verify save
- Restart app and verify preferences persist
notes:
- Use localStorage for simple persistence
- Settings are application-level, not user-specific
- Source management requires API keys if needed
- Preferences are per-user
- Add error handling for persistence failures

View File

@@ -0,0 +1,68 @@
# 11. Create Global State Store and Data Layer
meta:
id: podcast-tui-app-11
feature: podcast-tui-app
priority: P0
depends_on: [10]
tags: [state-management, global-store, signals, solidjs]
objective:
- Create global state store using Signals
- Implement data fetching and caching
- Build file-based storage for sync
- Connect all components to shared state
deliverables:
- `src/stores/appStore.ts` with global state store
- `src/stores/feedStore.ts` with feed state
- `src/stores/playerStore.ts` with player state
- `src/stores/searchStore.ts` with search state
- `src/utils/storage.ts` with file-based storage
steps:
- Create `src/stores/appStore.ts`:
- Use SolidJS signals for global state
- Store application state: currentTab, isAuthEnabled, settings
- Provide state to all child components
- Create `src/stores/feedStore.ts`:
- Signals for feeds array
- Signals for selectedFeed
- Methods: addFeed, removeFeed, updateFeed
- Create `src/stores/playerStore.ts`:
- Signals for currentEpisode
- Signals for playbackState
- Methods: play, pause, seek, setSpeed
- Create `src/stores/searchStore.ts`:
- Signals for searchResults
- Signals for searchHistory
- Methods: search, addToHistory, clearHistory
- Create `src/utils/storage.ts`:
- `saveToLocal()`
- `loadFromLocal()`
- File-based sync for feeds and settings
tests:
- Unit: Test store methods update signals correctly
- Unit: Test storage functions
- Integration: Test state persists across components
- Integration: Test data sync with file storage
acceptance_criteria:
- Global state store manages all app state
- Store methods update signals correctly
- State persists across component re-renders
- File-based storage works for sync
validation:
- Run application and verify state is initialized
- Modify state and verify UI updates
- Restart app and verify state persistence
- Test sync functionality
notes:
- Use SolidJS `createSignal` for reactivity
- Store should be singleton pattern
- Use Zustand if complex state management needed
- Keep store simple and focused
- File-based storage for sync with JSON/XML

View File

@@ -0,0 +1,68 @@
# 12. Set Up Testing Framework and Write Tests
meta:
id: podcast-tui-app-12
feature: podcast-tui-app
priority: P1
depends_on: [11]
tags: [testing, snapshot-testing, solidjs, opentui]
objective:
- Set up OpenTUI testing framework
- Write component tests for all major components
- Add keyboard interaction tests
- Implement error handling tests
deliverables:
- `tests/` directory with test files
- `tests/components/` with component tests
- `tests/integration/` with integration tests
- `tests/utils/` with utility tests
- Test coverage for all components
steps:
- Set up OpenTUI testing framework:
- Install testing dependencies
- Configure test runner
- Set up snapshot testing
- Write component tests:
- `tests/components/Navigation.test.tsx`
- `tests/components/FeedList.test.tsx`
- `tests/components/SearchBar.test.tsx`
- `tests/components/Player.test.tsx`
- `tests/components/SettingsScreen.test.tsx`
- Write integration tests:
- `tests/integration/navigation.test.tsx`
- `tests/integration/feed-management.test.tsx`
- `tests/integration/search.test.tsx`
- Write utility tests:
- `tests/utils/sync.test.ts`
- `tests/utils/search.test.ts`
- `tests/utils/storage.test.ts`
- Add error handling tests:
- Test invalid file imports
- Test network errors
- Test malformed data
tests:
- Unit: Run all unit tests
- Integration: Run all integration tests
- Coverage: Verify all components tested
acceptance_criteria:
- All tests pass
- Test coverage > 80%
- Snapshot tests match expected output
- Error handling tests verify proper behavior
validation:
- Run `bun test` to execute all tests
- Run `bun test --coverage` for coverage report
- Fix any failing tests
notes:
- Use OpenTUI's testing framework for snapshot testing
- Test keyboard interactions separately
- Mock external dependencies (API calls)
- Keep tests fast and focused
- Add CI/CD integration for automated testing

View File

@@ -0,0 +1,63 @@
# 13. Set Up TypeScript Configuration and Build System
meta:
id: podcast-tui-app-13
feature: podcast-tui-app
priority: P0
depends_on: [01]
tags: [typescript, build-system, configuration, solidjs]
objective:
- Configure TypeScript for SolidJS and OpenTUI
- Set up build system for production
- Configure bundler for optimal output
- Add development and production scripts
deliverables:
- `tsconfig.json` with TypeScript configuration
- `bunfig.toml` with Bun configuration
- `package.json` with build scripts
- `.bunfig.toml` with build settings
steps:
- Configure TypeScript in `tsconfig.json`:
- Set target to ES2020
- Configure paths for SolidJS
- Add OpenTUI type definitions
- Enable strict mode
- Configure module resolution
- Configure Bun in `bunfig.toml`:
- Set up dependencies
- Configure build output
- Add optimization flags
- Update `package.json`:
- Add build script: `bun run build`
- Add dev script: `bun run dev`
- Add test script: `bun run test`
- Add lint script: `bun run lint`
- Configure bundler for production:
- Optimize bundle size
- Minify output
- Tree-shake unused code
tests:
- Unit: Verify TypeScript configuration
- Integration: Test build process
- Integration: Test dev script
acceptance_criteria:
- TypeScript compiles without errors
- Build script creates optimized bundle
- Dev script runs development server
- All scripts work correctly
validation:
- Run `bun run build` to verify build
- Run `bun run dev` to verify dev server
- Check bundle size is reasonable
notes:
- Use `bun build` for production builds
- Enable source maps for debugging
- Configure TypeScript to match OpenTUI requirements
- Add path aliases for cleaner imports

View File

@@ -0,0 +1,70 @@
# 14. Create Project Directory Structure and Dependencies
meta:
id: podcast-tui-app-14
feature: podcast-tui-app
priority: P0
depends_on: [01]
tags: [project-structure, organization, solidjs]
objective:
- Create organized project directory structure
- Set up all necessary folders and files
- Install and configure all dependencies
- Create placeholder files for future implementation
deliverables:
- `src/` directory with organized structure
- `src/components/` with component folders
- `src/stores/` with store files
- `src/types/` with type definitions
- `src/utils/` with utility functions
- `src/data/` with static data
- `tests/` with test structure
- `public/` for static assets
- `docs/` for documentation
steps:
- Create directory structure:
- `src/components/` (all components)
- `src/stores/` (state management)
- `src/types/` (TypeScript types)
- `src/utils/` (utility functions)
- `src/data/` (static data)
- `src/hooks/` (custom hooks)
- `src/api/` (API clients)
- `tests/` (test files)
- `public/` (static assets)
- `docs/` (documentation)
- Create placeholder files:
- `src/index.tsx` (main entry)
- `src/App.tsx` (app shell)
- `src/main.ts` (Bun entry)
- Install dependencies:
- Core: `@opentui/solid`, `@opentui/core`, `solid-js`
- State: `zustand`
- Testing: `@opentui/testing`
- Utilities: `date-fns`, `uuid`
- Optional: `react`, `@opentui/react` (for testing)
tests:
- Unit: Verify directory structure exists
- Integration: Verify all dependencies installed
- Component: Verify placeholder files exist
acceptance_criteria:
- All directories created
- All placeholder files exist
- All dependencies installed
- Project structure follows conventions
validation:
- Run `ls -R src/` to verify structure
- Run `bun pm ls` to verify dependencies
- Check all placeholder files exist
notes:
- Follow OpenTUI project structure conventions
- Keep structure organized and scalable
- Add comments to placeholder files
- Consider adding `eslint`, `prettier` for code quality

View File

@@ -0,0 +1,63 @@
# 15. Build Responsive Layout System (Flexbox)
meta:
id: podcast-tui-app-15
feature: podcast-tui-app
priority: P0
depends_on: [14]
tags: [layout, flexbox, responsive, solidjs, opentui]
objective:
- Create reusable Flexbox layout components
- Handle terminal resizing gracefully
- Ensure responsive design across different terminal sizes
- Build layout patterns for common UI patterns
deliverables:
- `src/components/BoxLayout.tsx` with Flexbox container
- `src/components/Row.tsx` with horizontal layout
- `src/components/Column.tsx` with vertical layout
- `src/components/ResponsiveContainer.tsx` with resizing logic
steps:
- Create `src/components/BoxLayout.tsx`:
- Generic Flexbox container
- Props: flexDirection, justifyContent, alignItems, gap
- Use OpenTUI layout patterns
- Create `src/components/Row.tsx`:
- Horizontal layout (flexDirection="row")
- Props for spacing and alignment
- Handle overflow
- Create `src/components/Column.tsx`:
- Vertical layout (flexDirection="column")
- Props for spacing and alignment
- Scrollable content area
- Create `src/components/ResponsiveContainer.tsx`:
- Listen to terminal resize events
- Adjust layout based on width/height
- Handle different screen sizes
- Add usage examples and documentation
tests:
- Unit: Test BoxLayout with different props
- Unit: Test Row and Column layouts
- Integration: Test responsive behavior on resize
- Integration: Test layouts fit within terminal bounds
acceptance_criteria:
- BoxLayout renders with correct Flexbox properties
- Row and Column layouts work correctly
- ResponsiveContainer adapts to terminal resize
- All layouts fit within terminal bounds
validation:
- Run application and test layouts
- Resize terminal and verify responsive behavior
- Test with different terminal sizes
- Check layouts don't overflow
notes:
- Use OpenTUI Flexbox patterns from `layout/REFERENCE.md`
- Terminal dimensions: width (columns) x height (rows)
- Handle edge cases (very small screens)
- Add comments explaining layout decisions

View File

@@ -0,0 +1,60 @@
# 16. Implement Tab Navigation Component
meta:
id: podcast-tui-app-16
feature: podcast-tui-app
priority: P0
depends_on: [15]
tags: [navigation, tabs, solidjs, opentui]
objective:
- Create reusable tab navigation component
- Implement tab selection state
- Add keyboard navigation for tabs
- Handle active tab highlighting
deliverables:
- `src/components/TabNavigation.tsx` with tab navigation
- `src/components/Tab.tsx` with individual tab component
- `src/hooks/useTabNavigation.ts` with tab logic
steps:
- Create `src/components/TabNavigation.tsx`:
- Accept tabs array as prop
- Render tab buttons
- Manage selected tab state
- Update parent component on tab change
- Create `src/components/Tab.tsx`:
- Individual tab button
- Highlight selected tab
- Handle click and keyboard events
- Show tab icon if needed
- Create `src/hooks/useTabNavigation.ts`:
- Manage tab selection state
- Handle keyboard navigation (arrow keys)
- Update parent component
- Persist selected tab
tests:
- Unit: Test Tab component renders correctly
- Unit: Test tab selection updates state
- Integration: Test keyboard navigation
- Integration: Test tab persists across renders
acceptance_criteria:
- TabNavigation displays all tabs correctly
- Tab selection is visually indicated
- Keyboard navigation works (arrow keys, enter)
- Active tab persists
validation:
- Run application and verify tabs appear
- Click tabs to test selection
- Use arrow keys to navigate
- Restart app and verify active tab persists
notes:
- Use SolidJS `createSignal` for tab state
- Follow OpenTUI component patterns
- Tabs: Discover, My Feeds, Search, Player, Settings
- Add keyboard shortcuts documentation

View File

@@ -0,0 +1,69 @@
# 17. Add Keyboard Shortcuts and Navigation Handling
meta:
id: podcast-tui-app-17
feature: podcast-tui-app
priority: P1
depends_on: [16]
tags: [keyboard, shortcuts, navigation, solidjs, opentui]
objective:
- Implement global keyboard shortcuts
- Add shortcut documentation
- Handle keyboard events across components
- Prevent conflicts with input fields
deliverables:
- `src/components/KeyboardHandler.tsx` with global shortcuts
- `src/components/ShortcutHelp.tsx` with shortcut list
- `src/hooks/useKeyboard.ts` with keyboard utilities
- `src/config/shortcuts.ts` with shortcut definitions
steps:
- Create `src/config/shortcuts.ts`:
- Define all keyboard shortcuts
- Map keys to actions
- Document each shortcut
- Create `src/hooks/useKeyboard.ts`:
- Global keyboard event listener
- Filter events based on focused element
- Handle modifier keys (Ctrl, Shift, Alt)
- Prevent default browser behavior
- Create `src/components/KeyboardHandler.tsx`:
- Wrap application with keyboard handler
- Handle escape to close modals
- Handle Ctrl+Q to quit
- Handle Ctrl+S to save
- Create `src/components/ShortcutHelp.tsx`:
- Display all shortcuts
- Organize by category
- Click to copy shortcut
tests:
- Unit: Test keyboard hook handles events
- Unit: Test modifier key combinations
- Integration: Test shortcuts work globally
- Integration: Test shortcuts don't interfere with inputs
acceptance_criteria:
- All shortcuts work as defined
- Shortcuts help displays correctly
- Shortcuts don't interfere with input fields
- Escape closes modals
validation:
- Run application and test each shortcut
- Try shortcuts in input fields (shouldn't trigger)
- Check ShortcutHelp displays all shortcuts
- Test Ctrl+Q quits app
notes:
- Use OpenTUI keyboard patterns from `keyboard/REFERENCE.md`
- Common shortcuts:
- Ctrl+Q: Quit
- Ctrl+S: Save
- Escape: Close modal/exit input
- Arrow keys: Navigate
- Space: Play/Pause
- Document shortcuts in README
- Test on different terminals

View File

@@ -0,0 +1,65 @@
# 18. Create Sync Data Models (JSON/XML Formats)
meta:
id: podcast-tui-app-18
feature: podcast-tui-app
priority: P1
depends_on: [17]
tags: [data-models, json, xml, sync, typescript]
objective:
- Define TypeScript interfaces for JSON sync format
- Define TypeScript interfaces for XML sync format
- Ensure compatibility between formats
- Add validation logic
deliverables:
- `src/types/sync-json.ts` with JSON sync types
- `src/types/sync-xml.ts` with XML sync types
- `src/utils/sync-validation.ts` with validation logic
- `src/constants/sync-formats.ts` with format definitions
steps:
- Create `src/types/sync-json.ts`:
- `SyncData` interface with all required fields
- Include feeds, sources, settings, preferences
- Add version field for format compatibility
- Add timestamp for last sync
- Create `src/types/sync-xml.ts`:
- `SyncDataXML` interface
- XML-compatible type definitions
- Root element and child elements
- Attributes for metadata
- Create `src/utils/sync-validation.ts`:
- `validateJSONSync(data: unknown): SyncData`
- `validateXMLSync(data: unknown): SyncDataXML`
- Field validation functions
- Type checking
- Create `src/constants/sync-formats.ts`:
- JSON format version
- XML format version
- Supported versions list
- Format extensions
tests:
- Unit: Test JSON validation with valid/invalid data
- Unit: Test XML validation with valid/invalid data
- Integration: Test format compatibility
acceptance_criteria:
- JSON sync types compile without errors
- XML sync types compile without errors
- Validation rejects invalid data
- Format versions are tracked
validation:
- Run `bun run build` to verify TypeScript
- Test validation with sample data
- Test with invalid data to verify rejection
notes:
- JSON format: Simple, human-readable
- XML format: More structured, better for complex data
- Include all necessary fields for complete sync
- Add comments explaining each field
- Ensure backward compatibility

View File

@@ -0,0 +1,72 @@
# 19. Build Import/Export Functionality
meta:
id: podcast-tui-app-19
feature: podcast-tui-app
priority: P1
depends_on: [18]
tags: [import-export, file-io, sync, solidjs]
objective:
- Implement JSON export functionality
- Implement JSON import functionality
- Implement XML export functionality
- Implement XML import functionality
- Handle file operations and errors
deliverables:
- `src/utils/sync.ts` with import/export functions
- `src/components/ExportDialog.tsx` with export UI
- `src/components/ImportDialog.tsx` with import UI
- Error handling components
steps:
- Implement JSON export in `src/utils/sync.ts`:
- `exportFeedsToJSON(feeds: Feed[]): string`
- `exportSettingsToJSON(settings: Settings): string`
- Combine into `exportToJSON(data: SyncData): string`
- Implement JSON import in `src/utils/sync.ts`:
- `importFeedsFromJSON(json: string): Feed[]`
- `importSettingsFromJSON(json: string): Settings`
- Combine into `importFromJSON(json: string): SyncData`
- Implement XML export in `src/utils/sync.ts`:
- `exportToXML(data: SyncDataXML): string`
- XML serialization
- Implement XML import in `src/utils/sync.ts`:
- `importFromXML(xml: string): SyncDataXML`
- XML parsing
- Create `src/components/ExportDialog.tsx`:
- File name input
- Export format selection
- Export button
- Success message
- Create `src/components/ImportDialog.tsx`:
- File picker
- Format detection
- Import button
- Error message display
tests:
- Unit: Test JSON import/export with sample data
- Unit: Test XML import/export with sample data
- Unit: Test error handling
- Integration: Test file operations
acceptance_criteria:
- Export creates valid files
- Import loads data correctly
- Errors are handled gracefully
- Files can be opened in text editors
validation:
- Run application and test export/import
- Open exported files in text editor
- Test with different data sizes
- Test error cases (invalid files)
notes:
- Use `FileReader` API for file operations
- Handle file not found, invalid format, permission errors
- Add progress indicator for large files
- Support both JSON and XML formats
- Ensure data integrity during import

View File

@@ -0,0 +1,61 @@
# 20. Create File Picker UI for Import
meta:
id: podcast-tui-app-20
feature: podcast-tui-app
priority: P1
depends_on: [19]
tags: [file-picker, input, ui, solidjs, opentui]
objective:
- Create file picker component for selecting import files
- Implement file format detection
- Display file information
- Handle file selection and validation
deliverables:
- `src/components/FilePicker.tsx` with file picker UI
- `src/components/FileInfo.tsx` with file details
- `src/utils/file-detector.ts` with format detection
steps:
- Create `src/utils/file-detector.ts`:
- `detectFormat(file: File): 'json' | 'xml' | 'unknown'`
- Read file header
- Check file extension
- Validate format
- Create `src/components/FilePicker.tsx`:
- File input using `<input>` component
- Accept JSON and XML files
- File selection handler
- Clear button
- Create `src/components/FileInfo.tsx`:
- Display file name
- Display file size
- Display file format
- Display last modified date
- Add file picker to import dialog
tests:
- Unit: Test format detection
- Unit: Test file picker selection
- Integration: Test file validation
acceptance_criteria:
- File picker allows selecting files
- Format detection works correctly
- File information is displayed
- Invalid files are rejected
validation:
- Run application and test file picker
- Select valid files
- Select invalid files
- Verify format detection
notes:
- Use OpenTUI `<input>` component for file picker
- Accept `.json` and `.xml` extensions
- Check file size limit (e.g., 10MB)
- Add file type validation
- Handle file selection errors

View File

@@ -0,0 +1,60 @@
# 21. Build Sync Status Indicator
meta:
id: podcast-tui-app-21
feature: podcast-tui-app
priority: P1
depends_on: [20]
tags: [status-indicator, sync, ui, solidjs]
objective:
- Create sync status indicator component
- Display sync state (idle, syncing, complete, error)
- Show sync progress
- Provide sync status in settings
deliverables:
- `src/components/SyncStatus.tsx` with status indicator
- `src/components/SyncProgress.tsx` with progress bar
- `src/components/SyncError.tsx` with error display
steps:
- Create `src/components/SyncStatus.tsx`:
- Display current sync state
- Show status icon (spinner, check, error)
- Show status message
- Auto-update based on state
- Create `src/components/SyncProgress.tsx`:
- Progress bar visualization
- Percentage display
- Step indicators
- Animation
- Create `src/components/SyncError.tsx`:
- Error message display
- Retry button
- Error details (expandable)
- Add sync status to settings screen
tests:
- Unit: Test status indicator updates correctly
- Unit: Test progress bar visualization
- Unit: Test error display
acceptance_criteria:
- Status indicator shows correct state
- Progress bar updates during sync
- Error message is displayed on errors
- Status persists across sync operations
validation:
- Run application and test sync operations
- Trigger export/import
- Verify status indicator updates
- Test error cases
notes:
- Use SolidJS signals for state
- Status states: idle, syncing, complete, error
- Use ASCII icons for status indicators
- Add animation for syncing state
- Make status component reusable

View File

@@ -0,0 +1,67 @@
# 22. Add Backup/Restore Functionality
meta:
id: podcast-tui-app-22
feature: podcast-tui-app
priority: P1
depends_on: [21]
tags: [backup-restore, sync, data-protection, solidjs]
objective:
- Implement backup functionality for all user data
- Implement restore functionality
- Create scheduled backups
- Add backup management UI
deliverables:
- `src/utils/backup.ts` with backup functions
- `src/utils/restore.ts` with restore functions
- `src/components/BackupManager.tsx` with backup UI
- `src/components/ScheduledBackups.tsx` with backup settings
steps:
- Create `src/utils/backup.ts`:
- `createBackup(): Promise<string>`
- `backupFeeds(feeds: Feed[]): string`
- `backupSettings(settings: Settings): string`
- Include all user data
- Create `src/utils/restore.ts`:
- `restoreFromBackup(backupData: string): Promise<void>`
- `restoreFeeds(backupData: string): void`
- `restoreSettings(backupData: string): void`
- Validate backup data
- Create `src/components/BackupManager.tsx`:
- List of backup files
- Restore button
- Delete backup button
- Create new backup button
- Create `src/components/ScheduledBackups.tsx`:
- Enable/disable scheduled backups
- Backup interval selection
- Last backup time display
- Manual backup button
tests:
- Unit: Test backup creates valid files
- Unit: Test restore loads data correctly
- Unit: Test backup validation
- Integration: Test backup/restore workflow
acceptance_criteria:
- Backup creates complete backup file
- Restore loads all data correctly
- Scheduled backups work as configured
- Backup files can be managed
validation:
- Run application and create backup
- Restore from backup
- Test scheduled backups
- Verify data integrity
notes:
- Backup file format: JSON with timestamp
- Include version info for compatibility
- Store backups in `backups/` directory
- Add backup encryption option (optional)
- Test with large data sets

View File

@@ -0,0 +1,61 @@
# 23. Create Authentication State (Disabled by Default)
meta:
id: podcast-tui-app-23
feature: podcast-tui-app
priority: P2
depends_on: [22]
tags: [authentication, state, solidjs, security]
objective:
- Create authentication state management
- Ensure authentication is disabled by default
- Set up user state structure
- Implement auth state persistence
deliverables:
- `src/stores/auth.ts` with authentication store
- `src/types/auth.ts` with auth types
- `src/config/auth.ts` with auth configuration
steps:
- Create `src/types/auth.ts`:
- `User` interface (id, email, name, createdAt)
- `AuthState` interface (user, isAuthenticated, isLoading)
- `AuthError` interface (code, message)
- Create `src/config/auth.ts`:
- `DEFAULT_AUTH_ENABLED = false`
- `AUTH_CONFIG` with settings
- `OAUTH_PROVIDERS` with provider info
- Create `src/stores/auth.ts`:
- `createAuthStore()` with Zustand
- `user` signal (initially null)
- `isAuthenticated` signal (initially false)
- `login()` function (placeholder)
- `logout()` function
- `validateCode()` function
- Persist state to localStorage
- Set up auth state in global store
tests:
- Unit: Test auth state initializes correctly
- Unit: Test auth is disabled by default
- Unit: Test persistence
acceptance_criteria:
- Authentication is disabled by default
- Auth store manages state correctly
- State persists across sessions
- Auth is optional and not required
validation:
- Run application and verify auth is disabled
- Check localStorage for auth state
- Test login flow (should not work without backend)
notes:
- Authentication is secondary to file sync
- No real backend, just UI/UX
- Focus on sync features
- User can choose to enable auth later
- Store auth state in localStorage

View File

@@ -0,0 +1,69 @@
# 24. Build Simple Login Screen (Email/Password)
meta:
id: podcast-tui-app-24
feature: podcast-tui-app
priority: P2
depends_on: [23]
tags: [login, auth, form, solidjs, opentui]
objective:
- Create login screen component
- Implement email input field
- Implement password input field
- Add login validation and error handling
deliverables:
- `src/components/LoginScreen.tsx` with login form
- `src/components/EmailInput.tsx` with email field
- `src/components/PasswordInput.tsx` with password field
- `src/components/LoginButton.tsx` with submit button
steps:
- Create `src/components/EmailInput.tsx`:
- Email input field using `<input>` component
- Email validation regex
- Error message display
- Focus state styling
- Create `src/components/PasswordInput.tsx`:
- Password input field
- Show/hide password toggle
- Password validation rules
- Error message display
- Create `src/components/LoginButton.tsx`:
- Submit button
- Loading state
- Disabled state
- Error state
- Create `src/components/LoginScreen.tsx`:
- Combine inputs and button
- Login form validation
- Error handling
- Link to code validation
- Link to OAuth placeholder
tests:
- Unit: Test email validation
- Unit: Test password validation
- Unit: Test login form submission
- Integration: Test login screen displays correctly
acceptance_criteria:
- Login screen accepts email and password
- Validation works correctly
- Error messages display properly
- Form submission handled
validation:
- Run application and navigate to login
- Enter valid credentials
- Enter invalid credentials
- Test error handling
notes:
- Use OpenTUI `<input>` component
- Email validation: regex pattern
- Password validation: minimum length
- No real authentication, just UI
- Link to code validation for sync
- Link to OAuth placeholder

View File

@@ -0,0 +1,60 @@
# 25. Implement 8-Character Code Validation Flow
meta:
id: podcast-tui-app-25
feature: podcast-tui-app
priority: P2
depends_on: [24]
tags: [code-validation, auth, sync, solidjs]
objective:
- Create 8-character code input component
- Implement code validation logic
- Handle code submission
- Show validation results
deliverables:
- `src/components/CodeInput.tsx` with code field
- `src/utils/code-validator.ts` with validation logic
- `src/components/CodeValidationResult.tsx` with result display
steps:
- Create `src/utils/code-validator.ts`:
- `validateCode(code: string): boolean`
- Check length (8 characters)
- Check format (alphanumeric)
- Validate against stored codes
- Create `src/components/CodeInput.tsx`:
- 8-character code input
- Auto-formatting
- Clear button
- Validation error display
- Create `src/components/CodeValidationResult.tsx`:
- Success message
- Error message
- Retry button
- Link to alternative auth
tests:
- Unit: Test code validation logic
- Unit: Test code input formatting
- Unit: Test validation result display
acceptance_criteria:
- Code input accepts 8 characters
- Validation checks length and format
- Validation results display correctly
- Error handling works
validation:
- Run application and test code validation
- Enter valid 8-character code
- Enter invalid code
- Test validation error display
notes:
- Code format: alphanumeric (A-Z, 0-9)
- No real backend validation
- Store codes in localStorage for testing
- Link to OAuth placeholder
- Link to email/password login

View File

@@ -0,0 +1,61 @@
# 26. Add OAuth Placeholder Screens (Document Limitations)
meta:
id: podcast-tui-app-26
feature: podcast-tui-app
priority: P2
depends_on: [25]
tags: [oauth, documentation, placeholders, solidjs]
objective:
- Create OAuth placeholder screens
- Document terminal limitations for OAuth
- Provide alternative authentication methods
- Explain browser redirect flow
deliverables:
- `src/components/OAuthPlaceholder.tsx` with OAuth info
- `src/components/BrowserRedirect.tsx` with redirect flow
- `src/docs/oauth-limitations.md` with documentation
steps:
- Create `src/components/OAuthPlaceholder.tsx`:
- Display OAuth information
- Explain terminal limitations
- Show supported providers (Google, Apple)
- Link to browser redirect flow
- Create `src/components/BrowserRedirect.tsx`:
- Display QR code for mobile
- Display 8-character code
- Instructions for browser flow
- Link to website
- Create `src/docs/oauth-limitations.md`:
- Detailed explanation of OAuth in terminal
- Why OAuth is not feasible
- Alternative authentication methods
- Browser redirect flow instructions
- Add OAuth placeholder to login screen
tests:
- Unit: Test OAuth placeholder displays correctly
- Unit: Test browser redirect flow displays
- Documentation review
acceptance_criteria:
- OAuth placeholder screens display correctly
- Limitations are clearly documented
- Alternative methods are provided
- Browser redirect flow is explained
validation:
- Run application and navigate to OAuth placeholder
- Read documentation
- Verify flow instructions are clear
notes:
- OAuth in terminal is not feasible
- Terminal cannot handle OAuth flows
- Document this limitation clearly
- Provide browser redirect as alternative
- User can still use file sync
- Google and Apple OAuth are supported by browser

View File

@@ -0,0 +1,62 @@
# 27. Create Sync-Only User Profile
meta:
id: podcast-tui-app-27
feature: podcast-tui-app
priority: P2
depends_on: [26]
tags: [profile, sync, user-info, solidjs]
objective:
- Create user profile component for sync-only users
- Display user information
- Show sync status
- Provide profile management options
deliverables:
- `src/components/SyncProfile.tsx` with user profile
- `src/components/SyncStatus.tsx` with sync status
- `src/components/ProfileSettings.tsx` with profile settings
steps:
- Create `src/components/SyncProfile.tsx`:
- User avatar/icon
- User name display
- Email display
- Sync status indicator
- Profile actions
- Create `src/components/SyncStatus.tsx`:
- Sync status (last sync time)
- Sync method (file-based)
- Sync frequency
- Sync history
- Create `src/components/ProfileSettings.tsx`:
- Edit profile
- Change password
- Manage sync settings
- Export data
- Add profile to settings screen
tests:
- Unit: Test profile displays correctly
- Unit: Test sync status updates
- Integration: Test profile settings
acceptance_criteria:
- Profile displays user information
- Sync status is shown
- Profile settings work correctly
- Profile is accessible from settings
validation:
- Run application and navigate to profile
- View profile information
- Test profile settings
- Verify sync status
notes:
- Profile for sync-only users
- No authentication required
- Profile data stored in localStorage
- Sync status shows last sync time
- Profile is optional

View File

@@ -0,0 +1,56 @@
# 28. Create Feed Data Models and Types
meta:
id: podcast-tui-app-28
feature: podcast-tui-app
priority: P0
depends_on: [27]
tags: [types, data-models, solidjs, typescript]
objective:
- Define TypeScript interfaces for all podcast-related data
- Create models for feeds, episodes, sources
- Set up type definitions for sync functionality
deliverables:
- `src/types/podcast.ts` with core types
- `src/types/episode.ts` with episode types
- `src/types/source.ts` with source types
- `src/types/feed.ts` with feed types
steps:
- Create `src/types/podcast.ts`:
- `Podcast` interface (id, title, description, coverUrl, feedUrl, lastUpdated)
- `PodcastWithEpisodes` interface (podcast + episodes array)
- Create `src/types/episode.ts`:
- `Episode` interface (id, title, description, audioUrl, duration, pubDate, episodeNumber)
- `EpisodeStatus` enum (playing, paused, completed, not_started)
- `Progress` interface (episodeId, position, duration, timestamp)
- Create `src/types/source.ts`:
- `PodcastSource` interface (id, name, baseUrl, type, apiKey, enabled)
- `SourceType` enum (rss, api, custom)
- `SearchQuery` interface (query, sourceIds, filters)
- Create `src/types/feed.ts`:
- `Feed` interface (id, podcast, episodes[], isPublic, sourceId, lastUpdated)
- `FeedItem` interface (represents a single episode in a feed)
- `FeedFilter` interface (public, private, sourceId)
tests:
- Unit: Verify all interfaces compile correctly
- Unit: Test enum values are correct
- Integration: Test type definitions match expected data structures
acceptance_criteria:
- All TypeScript interfaces compile without errors
- Types are exported for use across the application
- Type definitions cover all podcast-related data
validation:
- Run `bun run build` to verify TypeScript compilation
- Check `src/types/` directory contains all required files
notes:
- Use strict TypeScript mode
- Include JSDoc comments for complex types
- Keep types simple and focused
- Ensure types are compatible with sync JSON/XML formats

View File

@@ -0,0 +1,63 @@
# 29. Build Feed List Component (Public/Private Feeds)
meta:
id: podcast-tui-app-29
feature: podcast-tui-app
priority: P0
depends_on: [28]
tags: [feed-list, components, solidjs, opentui]
objective:
- Create a scrollable feed list component
- Display public and private feeds
- Implement feed selection and display
- Add reverse chronological ordering
deliverables:
- `src/components/FeedList.tsx` with feed list component
- `src/components/FeedItem.tsx` with individual feed item
- `src/components/FeedFilter.tsx` with public/private toggle
steps:
- Create `src/components/FeedList.tsx`:
- Use `<scrollbox>` for scrollable list
- Accept feeds array as prop
- Implement feed rendering with `createSignal` for selection
- Add keyboard navigation (arrow keys, enter)
- Display feed title, description, episode count
- Create `src/components/FeedItem.tsx`:
- Display feed information
- Show public/private indicator
- Highlight selected feed
- Add hover effects
- Create `src/components/FeedFilter.tsx`:
- Toggle button for public/private feeds
- Filter logic implementation
- Update parent FeedList when filtered
- Add feed list to "My Feeds" navigation tab
tests:
- Unit: Test FeedList renders with feeds
- Unit: Test FeedItem displays correctly
- Integration: Test public/private filtering
- Integration: Test keyboard navigation in feed list
acceptance_criteria:
- Feed list displays all feeds correctly
- Public/private toggle filters feeds
- Feed selection is visually indicated
- Keyboard navigation works (arrow keys, enter)
- List scrolls properly when many feeds
validation:
- Run application and navigate to "My Feeds"
- Add some feeds and verify they appear
- Test public/private toggle
- Use arrow keys to navigate feeds
- Scroll list with many feeds
notes:
- Use SolidJS `createSignal` for selection state
- Follow OpenTUI component patterns from `components/REFERENCE.md`
- Feed list should be scrollable with many items
- Use Flexbox for layout

View File

@@ -0,0 +1,67 @@
# 30. Implement Feed Source Management (Add/Remove Sources)
meta:
id: podcast-tui-app-30
feature: podcast-tui-app
priority: P1
depends_on: [29]
tags: [source-management, feeds, solidjs, opentui]
objective:
- Create source management component
- Implement add new source functionality
- Implement remove source functionality
- Manage enabled/disabled sources
deliverables:
- `src/components/SourceManager.tsx` with source management UI
- `src/components/AddSourceForm.tsx` with add source form
- `src/components/SourceListItem.tsx` with individual source
steps:
- Create `src/components/SourceManager.tsx`:
- List of enabled sources
- Add source button
- Remove source button
- Enable/disable toggle
- Source count display
- Create `src/components/AddSourceForm.tsx`:
- Source name input
- Source URL input
- Source type selection
- API key input (if required)
- Submit button
- Validation
- Create `src/components/SourceListItem.tsx`:
- Display source info
- Enable/disable toggle
- Remove button
- Status indicator
- Add source manager to settings screen
tests:
- Unit: Test source list displays correctly
- Unit: Test add source form validation
- Unit: Test remove source functionality
- Integration: Test source management workflow
acceptance_criteria:
- Source list displays all sources
- Add source form validates input
- Remove source works correctly
- Enable/disable toggles work
validation:
- Run application and navigate to settings
- Test add source
- Test remove source
- Test enable/disable toggle
- Verify feeds from new sources appear
notes:
- Source types: RSS, API, Custom
- RSS sources: feed URLs
- API sources: require API key
- Custom sources: user-defined
- Add validation for source URLs
- Store sources in localStorage

View File

@@ -0,0 +1,61 @@
# 31. Add Reverse Chronological Ordering
meta:
id: podcast-tui-app-31
feature: podcast-tui-app
priority: P1
depends_on: [30]
tags: [ordering, feeds, episodes, solidjs, sorting]
objective:
- Implement reverse chronological ordering for feeds
- Order episodes by publication date (newest first)
- Order feeds by last updated (newest first)
- Provide sort option toggle
deliverables:
- `src/utils/ordering.ts` with sorting functions
- `src/components/FeedSortToggle.tsx` with sort option
- `src/components/EpisodeList.tsx` with ordered episode list
steps:
- Create `src/utils/ordering.ts`:
- `orderEpisodesByDate(episodes: Episode[]): Episode[]`
- Order by pubDate descending
- Handle missing dates
- `orderFeedsByDate(feeds: Feed[]): Feed[]`
- Order by lastUpdated descending
- Handle missing updates
- Create `src/components/FeedSortToggle.tsx`:
- Toggle button for date ordering
- Display current sort order
- Update parent component
- Create `src/components/EpisodeList.tsx`:
- Accept episodes array
- Apply ordering
- Display episodes in reverse chronological order
- Add keyboard navigation
tests:
- Unit: Test episode ordering
- Unit: Test feed ordering
- Unit: Test sort toggle
acceptance_criteria:
- Episodes ordered by date (newest first)
- Feeds ordered by last updated (newest first)
- Sort toggle works correctly
- Ordering persists across sessions
validation:
- Run application and check episode order
- Check feed order
- Toggle sort order
- Restart app and verify ordering persists
notes:
- Use JavaScript `sort()` with date comparison
- Handle timezone differences
- Add loading state during sort
- Cache ordered results
- Consider adding custom sort options

View File

@@ -0,0 +1,66 @@
# 32. Create Feed Detail View
meta:
id: podcast-tui-app-32
feature: podcast-tui-app
priority: P1
depends_on: [31]
tags: [feed-detail, episodes, solidjs, opentui]
objective:
- Create feed detail view component
- Display podcast information
- List episodes in reverse chronological order
- Provide episode playback controls
deliverables:
- `src/components/FeedDetail.tsx` with feed detail view
- `src/components/EpisodeList.tsx` with episode list
- `src/components/EpisodeItem.tsx` with individual episode
steps:
- Create `src/components/FeedDetail.tsx`:
- Podcast cover image
- Podcast title and description
- Episode count
- Subscribe/unsubscribe button
- Episode list container
- Create `src/components/EpisodeList.tsx`:
- Scrollable episode list
- Display episode title, date, duration
- Playback status indicator
- Add keyboard navigation
- Create `src/components/EpisodeItem.tsx`:
- Episode information
- Play button
- Mark as complete button
- Progress bar
- Hover effects
- Add feed detail to "My Feeds" navigation tab
tests:
- Unit: Test FeedDetail displays correctly
- Unit: Test EpisodeList rendering
- Unit: Test EpisodeItem interaction
- Integration: Test feed detail navigation
acceptance_criteria:
- Feed detail displays podcast info
- Episode list shows all episodes
- Episodes ordered reverse chronological
- Play buttons work
- Mark as complete works
validation:
- Run application and navigate to feed detail
- View podcast information
- Check episode order
- Test play button
- Test mark as complete
notes:
- Use SolidJS `createSignal` for episode selection
- Display episode status (playing, completed, not started)
- Show progress for completed episodes
- Add episode filtering (all, completed, not completed)
- Use Flexbox for layout

View File

@@ -0,0 +1,68 @@
# 33. Create Search Interface
meta:
id: podcast-tui-app-33
feature: podcast-tui-app
priority: P1
depends_on: [32]
tags: [search-interface, input, solidjs, opentui]
objective:
- Create search input component
- Implement search functionality
- Display search results
- Handle search state
deliverables:
- `src/components/SearchBar.tsx` with search input
- `src/components/SearchResults.tsx` with results display
- `src/components/SearchHistory.tsx` with history list
steps:
- Create `src/components/SearchBar.tsx`:
- Search input field using `<input>` component
- Search button
- Clear button
- Enter key handler
- Loading state
- Create `src/utils/search.ts`:
- `searchPodcasts(query: string, sourceIds: string[]): Promise<Podcast[]>`
- `searchEpisodes(query: string, feedId: string): Promise<Episode[]>`
- Handle multiple sources
- Cache search results
- Create `src/components/SearchResults.tsx`:
- Display search results with source indicators
- Show podcast/episode info
- Add to feed button
- Keyboard navigation through results
- Create `src/components/SearchHistory.tsx`:
- Display recent search queries
- Click to re-run search
- Delete individual history items
- Persist to localStorage
tests:
- Unit: Test search logic returns correct results
- Unit: Test search history persistence
- Integration: Test search bar accepts input
- Integration: Test results display correctly
acceptance_criteria:
- Search bar accepts and processes queries
- Search results display with source information
- Search history persists across sessions
- Keyboard navigation works in results
validation:
- Run application and navigate to "Search"
- Type a query and press Enter
- Verify results appear
- Click a result to add to feed
- Restart app and verify history persists
notes:
- Use localStorage for search history
- Implement basic caching to avoid repeated searches
- Handle empty results gracefully
- Add loading state during search
- Search both podcasts and episodes

View File

@@ -0,0 +1,62 @@
# 34. Implement Multi-Source Search
meta:
id: podcast-tui-app-34
feature: podcast-tui-app
priority: P1
depends_on: [33]
tags: [multi-source, search, solidjs, api]
objective:
- Implement search across multiple podcast sources
- Handle different source types (RSS, API, Custom)
- Display source information in results
- Cache search results
deliverables:
- `src/utils/search.ts` with multi-source search logic
- `src/utils/source-searcher.ts` with source-specific searchers
- `src/components/SourceBadge.tsx` with source indicator
steps:
- Create `src/utils/source-searcher.ts`:
- `searchRSSSource(query: string, source: PodcastSource): Promise<Podcast[]>`
- `searchAPISource(query: string, source: PodcastSource): Promise<Podcast[]>`
- `searchCustomSource(query: string, source: PodcastSource): Promise<Podcast[]>`
- Handle source-specific search logic
- Create `src/utils/search.ts`:
- `searchPodcasts(query: string, sourceIds: string[]): Promise<Podcast[]>`
- Aggregate results from multiple sources
- Deduplicate results
- Cache results by query
- Handle source errors gracefully
- Create `src/components/SourceBadge.tsx`:
- Display source type (RSS, API, Custom)
- Show source name
- Color-coded for different types
tests:
- Unit: Test RSS source search
- Unit: Test API source search
- Unit: Test custom source search
- Unit: Test result aggregation
acceptance_criteria:
- Search works across all enabled sources
- Source information displayed correctly
- Results aggregated from multiple sources
- Errors handled gracefully
validation:
- Run application and perform search
- Verify results from multiple sources
- Test with different source types
- Test error handling for failed sources
notes:
- RSS sources: Parse feed XML
- API sources: Call API endpoints
- Custom sources: User-defined search logic
- Handle rate limiting
- Cache results to avoid repeated searches
- Show loading state for each source

View File

@@ -0,0 +1,66 @@
# 35. Add Search Results Display
meta:
id: podcast-tui-app-35
feature: podcast-tui-app
priority: P1
depends_on: [34]
tags: [search-results, display, solidjs, opentui]
objective:
- Display search results with rich information
- Show podcast/episode details
- Add to feed functionality
- Keyboard navigation through results
deliverables:
- `src/components/SearchResults.tsx` with results display
- `src/components/ResultCard.tsx` with individual result
- `src/components/ResultDetail.tsx` with detailed view
steps:
- Create `src/components/ResultCard.tsx`:
- Display result title
- Display source information
- Display description/snippet
- Add to feed button
- Click to view details
- Create `src/components/ResultDetail.tsx`:
- Full result details
- Podcast/episode information
- Episode list (if podcast)
- Subscribe button
- Close button
- Create `src/components/SearchResults.tsx`:
- Scrollable results list
- Empty state display
- Loading state display
- Error state display
- Keyboard navigation
tests:
- Unit: Test ResultCard displays correctly
- Unit: Test ResultDetail displays correctly
- Unit: Test search results list
- Integration: Test add to feed
acceptance_criteria:
- Search results display with all information
- Result cards show source and details
- Add to feed button works
- Keyboard navigation works
validation:
- Run application and perform search
- Verify results display correctly
- Click result to view details
- Test add to feed
- Test keyboard navigation
notes:
- Use SolidJS `createSignal` for result selection
- Display result type (podcast/episode)
- Show source name and type
- Add loading state during search
- Handle empty results
- Add pagination for large result sets

View File

@@ -0,0 +1,64 @@
# 36. Build Search History with Persistent Storage
meta:
id: podcast-tui-app-36
feature: podcast-tui-app
priority: P1
depends_on: [35]
tags: [search-history, persistence, storage, solidjs]
objective:
- Implement search history functionality
- Store search queries in localStorage
- Display recent searches
- Add search to history
- Clear history
deliverables:
- `src/components/SearchHistory.tsx` with history list
- `src/utils/history.ts` with history management
- `src/hooks/useSearchHistory.ts` with history hook
steps:
- Create `src/utils/history.ts`:
- `addToHistory(query: string): void`
- `getHistory(): string[]`
- `removeFromHistory(query: string): void`
- `clearHistory(): void`
- `maxHistorySize = 50`
- Create `src/hooks/useSearchHistory.ts`:
- `createSignal` for history array
- Update history on search
- Persist to localStorage
- Methods to manage history
- Create `src/components/SearchHistory.tsx`:
- Display recent search queries
- Click to re-run search
- Delete individual history items
- Clear all history button
- Persistent across sessions
tests:
- Unit: Test history management functions
- Unit: Test history persistence
- Integration: Test history display
acceptance_criteria:
- Search queries added to history
- History persists across sessions
- History displays correctly
- Clear history works
validation:
- Run application and perform searches
- Check search history persists
- Test clearing history
- Restart app and verify
notes:
- Use localStorage for persistence
- Limit history to 50 items
- Remove duplicates
- Store timestamps (optional)
- Clear history button in search screen
- Add delete button on individual items

View File

@@ -0,0 +1,56 @@
# 37. Create Popular Shows Data Structure
meta:
id: podcast-tui-app-37
feature: podcast-tui-app
priority: P1
depends_on: [36]
tags: [popular-shows, data, discovery, solidjs]
objective:
- Create data structure for popular shows
- Define podcast metadata
- Categorize shows by topic
- Include feed URLs and descriptions
deliverables:
- `src/data/popular-shows.ts` with popular podcasts data
- `src/types/popular-shows.ts` with data types
- `src/constants/categories.ts` with category definitions
steps:
- Create `src/types/popular-shows.ts`:
- `PopularPodcast` interface (id, title, description, coverUrl, feedUrl, category, tags)
- `Category` enum (Technology, Business, Science, Entertainment, Health, Education)
- Create `src/constants/categories.ts`:
- List of all categories
- Category descriptions
- Sample podcasts per category
- Create `src/data/popular-shows.ts`:
- Array of popular podcasts
- Categorized by topic
- Reverse chronological ordering
- Include metadata for each show
tests:
- Unit: Test data structure compiles
- Unit: Test category definitions
- Integration: Test popular shows display
acceptance_criteria:
- Popular shows data structure defined
- Categories defined correctly
- Shows categorized properly
- Data ready for display
validation:
- Run `bun run build` to verify TypeScript
- Check data structure compiles
- Review data for completeness
notes:
- Popular shows data can be static or fetched
- If sources don't provide trending, use curated list
- Categories help users find shows by topic
- Include diverse range of shows
- Add RSS feed URLs for easy subscription

View File

@@ -0,0 +1,64 @@
# 38. Build Discover Page Component
meta:
id: podcast-tui-app-38
feature: podcast-tui-app
priority: P1
depends_on: [37]
tags: [discover-page, popular-shows, solidjs, opentui]
objective:
- Create discover page component
- Display popular shows
- Implement category filtering
- Add to feed functionality
deliverables:
- `src/components/DiscoverPage.tsx` with discover UI
- `src/components/PopularShows.tsx` with shows grid
- `src/components/CategoryFilter.tsx` with category buttons
steps:
- Create `src/components/DiscoverPage.tsx`:
- Page header with title
- Category filter buttons
- Popular shows grid
- Show details view
- Add to feed button
- Create `src/components/PopularShows.tsx`:
- Grid display of popular podcasts
- Show cover image
- Show title and description
- Add to feed button
- Click to view details
- Create `src/components/CategoryFilter.tsx`:
- Category button group
- Active category highlighting
- Filter logic implementation
- Update parent DiscoverPage
tests:
- Unit: Test PopularShows displays correctly
- Unit: Test CategoryFilter functionality
- Integration: Test discover page navigation
acceptance_criteria:
- Discover page displays popular shows
- Category filtering works correctly
- Shows are ordered reverse chronologically
- Clicking a show shows details
- Add to feed button works
validation:
- Run application and navigate to "Discover"
- Verify popular shows appear
- Click different categories
- Click a show and verify details
- Try add to feed
notes:
- Use Flexbox for category filter layout
- Use Grid for shows display
- Add loading state if fetching from API
- Handle empty categories
- Add hover effects for interactivity

View File

@@ -0,0 +1,61 @@
# 39. Add Trending Shows Display
meta:
id: podcast-tui-app-39
feature: podcast-tui-app
priority: P1
depends_on: [38]
tags: [trending-shows, display, solidjs]
objective:
- Display trending shows section
- Show top podcasts by popularity
- Implement trend indicators
- Display show rankings
deliverables:
- `src/components/TrendingShows.tsx` with trending section
- `src/components/ShowRanking.tsx` with ranking display
- `src/components/TrendIndicator.tsx` with trend icon
steps:
- Create `src/components/TrendingShows.tsx`:
- Trending section header
- Top shows list
- Show ranking (1, 2, 3...)
- Trending indicator
- Add to feed button
- Create `src/components/ShowRanking.tsx`:
- Display ranking number
- Show cover image
- Show title
- Trending score display
- Create `src/components/TrendIndicator.tsx`:
- Display trend icon (up arrow, down arrow, flat)
- Color-coded for trend direction
- Show trend percentage
- Add trending section to Discover page
tests:
- Unit: Test TrendingShows displays correctly
- Unit: Test ranking display
- Unit: Test trend indicator
acceptance_criteria:
- Trending shows section displays correctly
- Rankings shown for top shows
- Trend indicators display correctly
- Add to feed buttons work
validation:
- Run application and navigate to "Discover"
- View trending shows section
- Check rankings and indicators
- Test add to feed
notes:
- Trending shows: Top 10 podcasts
- Trending score: Based on downloads, listens, or engagement
- Trend indicators: Up/down/flat arrows
- Color-coded: Green for up, red for down, gray for flat
- Update trend scores periodically

View File

@@ -0,0 +1,62 @@
# 41. Create Player UI Layout
meta:
id: podcast-tui-app-41
feature: podcast-tui-app
priority: P0
depends_on: [40]
tags: [player, layout, solidjs, opentui]
objective:
- Create player UI layout component
- Display episode information
- Position player controls and waveform
- Handle player state
deliverables:
- `src/components/Player.tsx` with player layout
- `src/components/PlayerHeader.tsx` with episode info
- `src/components/PlayerControls.tsx` with controls area
steps:
- Create `src/components/Player.tsx`:
- Player container with borders
- Episode information header
- Waveform visualization area
- Playback controls area
- Progress bar area
- Create `src/components/PlayerHeader.tsx`:
- Episode title
- Podcast name
- Episode duration
- Close player button
- Create `src/components/PlayerControls.tsx`:
- Play/Pause button
- Previous/Next episode buttons
- Volume control
- Speed control
- Keyboard shortcuts display
tests:
- Unit: Test Player layout renders correctly
- Unit: Test PlayerHeader displays correctly
- Unit: Test PlayerControls layout
acceptance_criteria:
- Player UI displays episode information
- Controls positioned correctly
- Player fits within terminal bounds
- Layout is responsive
validation:
- Run application and navigate to "Player"
- Select an episode to play
- Verify player UI displays
- Check layout and positioning
notes:
- Use Flexbox for player layout
- Player should be at bottom or overlay
- Use `<scrollbox>` for waveform area
- Add loading state when no episode
- Use SolidJS signals for player state

View File

@@ -0,0 +1,70 @@
# 42. Implement Playback Controls
meta:
id: podcast-tui-app-42
feature: podcast-tui-app
priority: P0
depends_on: [41]
tags: [playback, controls, audio, solidjs]
objective:
- Implement playback controls (play/pause, skip, progress)
- Create control buttons
- Add keyboard shortcuts
- Handle playback state
deliverables:
- `src/components/PlaybackControls.tsx` with control buttons
- `src/utils/playback.ts` with playback logic
- `src/hooks/usePlayback.ts` with playback hook
steps:
- Create `src/utils/playback.ts`:
- `playAudio(audioUrl: string): void`
- `pauseAudio(): void`
- `skipForward(): void`
- `skipBackward(): void`
- `setPlaybackSpeed(speed: number): void`
- Handle audio player integration
- Create `src/hooks/usePlayback.ts`:
- `createSignal` for playback state
- Methods: play, pause, seek, setSpeed
- Handle audio events (timeupdate, ended)
- Create `src/components/PlaybackControls.tsx`:
- Play/Pause button
- Previous/Next episode buttons
- Volume control (slider)
- Speed control (1x, 1.25x, 1.5x, 2x)
- Keyboard shortcuts (space, arrows)
tests:
- Unit: Test playback logic
- Unit: Test playback hook
- Integration: Test playback controls
acceptance_criteria:
- Play/pause button works
- Skip forward/backward works
- Speed control works
- Volume control works
- Keyboard shortcuts work
validation:
- Run application and test playback
- Press play/pause
- Test skip buttons
- Change playback speed
- Test keyboard shortcuts
notes:
- Audio integration: Trigger system player or use Web Audio API
- Use Web Audio API for waveform
- Handle audio errors
- Add loading state during playback
- Store playback speed preference
- Support keyboard shortcuts:
- Space: Play/Pause
- Arrow Right: Skip forward
- Arrow Left: Skip backward
- Arrow Up: Volume up
- Arrow Down: Volume down

View File

@@ -0,0 +1,61 @@
# 43. Build ASCII Waveform Visualization
meta:
id: podcast-tui-app-43
feature: podcast-tui-app
priority: P0
depends_on: [42]
tags: [waveform, visualization, ascii, solidjs]
objective:
- Create ASCII waveform visualization
- Generate waveform from audio data
- Display waveform in player
- Handle click to seek
deliverables:
- `src/components/Waveform.tsx` with waveform display
- `src/utils/waveform.ts` with waveform generation
- `src/components/WaveformProgress.tsx` with progress overlay
steps:
- Create `src/utils/waveform.ts`:
- `generateWaveform(audioUrl: string): Promise<string>`
- Fetch audio data
- Analyze audio frequencies
- Convert to ASCII characters
- Return ASCII waveform string
- Create `src/components/Waveform.tsx`:
- Display ASCII waveform
- Color-coded for played/paused
- Click to seek to position
- Handle terminal width
- Create `src/components/WaveformProgress.tsx`:
- Progress overlay on waveform
- Show current position
- Highlight current segment
tests:
- Unit: Test waveform generation
- Unit: Test waveform display
- Integration: Test click to seek
acceptance_criteria:
- Waveform displays correctly
- Waveform generated from audio
- Color-coded for played/paused
- Clicking waveform seeks to position
validation:
- Run application and play an episode
- Verify waveform displays
- Check waveform colors
- Test seeking by clicking waveform
notes:
- ASCII waveform: Use `#` for peaks, `.` for valleys
- Use Web Audio API for waveform generation
- Cache waveform data for performance
- Handle large audio files
- Use frame buffer for drawing
- Color scheme: Green for played, Gray for paused

View File

@@ -0,0 +1,63 @@
# 44. Add Progress Tracking and Seek
meta:
id: podcast-tui-app-44
feature: podcast-tui-app
priority: P0
depends_on: [43]
tags: [progress, tracking, seek, solidjs]
objective:
- Track playback progress
- Save progress to storage
- Implement seek functionality
- Display progress bar
deliverables:
- `src/utils/progress.ts` with progress tracking
- `src/hooks/useProgress.ts` with progress hook
- `src/components/ProgressBar.tsx` with progress bar
steps:
- Create `src/utils/progress.ts`:
- `saveProgress(episodeId: string, position: number, duration: number): void`
- `loadProgress(episodeId: string): Progress | null`
- `updateProgress(episodeId: string, position: number): void`
- Handle progress persistence
- Create `src/hooks/useProgress.ts`:
- `createSignal` for progress
- Update progress on timeupdate
- Save progress periodically
- Load progress on episode change
- Create `src/components/ProgressBar.tsx`:
- Progress bar visualization
- Percentage display
- Time display (current/total)
- Click to seek
tests:
- Unit: Test progress tracking functions
- Unit: Test progress hook
- Integration: Test progress bar
acceptance_criteria:
- Progress saved correctly
- Progress loaded correctly
- Seek works via progress bar
- Progress persists across sessions
validation:
- Run application and play episode
- Seek to different positions
- Stop and restart
- Verify progress saved
- Restart app and verify progress loaded
notes:
- Save progress to localStorage
- Auto-save every 30 seconds
- Save on episode change
- Save on pause
- Don't save on completion
- Load progress when starting episode
- Display progress bar in player

View File

@@ -0,0 +1,64 @@
# 45. Implement Audio Integration (System/External Player)
meta:
id: podcast-tui-app-45
feature: podcast-tui-app
priority: P0
depends_on: [44]
tags: [audio, integration, player, solidjs]
objective:
- Implement audio playback integration
- Support system audio player
- Support external player
- Handle audio events
deliverables:
- `src/utils/audio-player.ts` with audio integration
- `src/components/AudioSettings.tsx` with audio player settings
- `src/hooks/useAudio.ts` with audio hook
steps:
- Create `src/utils/audio-player.ts`:
- `playWithSystemPlayer(audioUrl: string): void`
- `playWithExternalPlayer(audioUrl: string): void`
- `getSupportedPlayers(): string[]`
- Detect available players
- Create `src/components/AudioSettings.tsx`:
- Player selection dropdown
- System player options
- External player options
- Default player selection
- Create `src/hooks/useAudio.ts`:
- Manage audio state
- Handle player selection
- Handle audio events
- Update progress
tests:
- Unit: Test audio player detection
- Unit: Test player selection
- Integration: Test audio playback
acceptance_criteria:
- Audio plays correctly
- Multiple player options available
- Player selection persists
- Audio events handled
validation:
- Run application and test audio
- Select different player options
- Play episode and verify audio
- Test progress tracking with audio
notes:
- System player: macOS Terminal, iTerm2, etc.
- External player: VLC, QuickTime, etc.
- Use `open` command for macOS
- Use `xdg-open` for Linux
- Use `start` for Windows
- Handle audio errors gracefully
- Add player selection in settings
- Default to system player
- Store player preference

View File

@@ -0,0 +1,66 @@
# 46. Create Settings Screen
meta:
id: podcast-tui-app-46
feature: podcast-tui-app
priority: P1
depends_on: [45]
tags: [settings, screen, solidjs, opentui]
objective:
- Create settings screen component
- Implement settings navigation
- Display all settings sections
- Save/apply settings
deliverables:
- `src/components/SettingsScreen.tsx` with settings UI
- `src/components/SettingsNavigation.tsx` with settings menu
- `src/components/SettingsContent.tsx` with settings content
steps:
- Create `src/components/SettingsNavigation.tsx`:
- Settings menu with sections
- Navigation between sections
- Active section highlighting
- Keyboard navigation
- Create `src/components/SettingsContent.tsx`:
- Feed settings section
- Player settings section
- Sync settings section
- Appearance settings section
- Account settings section
- Create `src/components/SettingsScreen.tsx`:
- Combine navigation and content
- Save/Cancel buttons
- Reset to defaults button
tests:
- Unit: Test SettingsNavigation displays correctly
- Unit: Test SettingsContent sections
- Integration: Test settings navigation
acceptance_criteria:
- Settings screen displays all sections
- Navigation between sections works
- Settings save correctly
- Settings persist
validation:
- Run application and navigate to "Settings"
- Navigate between settings sections
- Change settings
- Verify settings persist
- Test reset to defaults
notes:
- Use SolidJS signals for settings state
- Settings sections:
- Feeds: Source management, auto-download
- Player: Playback speed, auto-play next
- Sync: Backup frequency, sync method
- Appearance: Theme, font size
- Account: Login, sync profile
- Add keyboard shortcuts for navigation
- Save settings on change
- Reset to defaults button

View File

@@ -0,0 +1,69 @@
# 47. Add Source Management UI
meta:
id: podcast-tui-app-47
feature: podcast-tui-app
priority: P1
depends_on: [46]
tags: [source-management, settings, ui, solidjs]
objective:
- Create source management UI in settings
- List all enabled sources
- Add new source functionality
- Remove source functionality
- Enable/disable sources
deliverables:
- `src/components/SourceManager.tsx` with source management
- `src/components/AddSourceForm.tsx` with add source form
- `src/components/SourceListItem.tsx` with individual source
steps:
- Create `src/components/SourceManager.tsx`:
- List of enabled sources
- Add source button
- Remove source button
- Enable/disable toggle
- Source count display
- Create `src/components/AddSourceForm.tsx`:
- Source name input
- Source URL input
- Source type selection (RSS, API, Custom)
- API key input (if required)
- Submit button
- Validation
- Create `src/components/SourceListItem.tsx`:
- Display source info
- Enable/disable toggle
- Remove button
- Status indicator (working, error)
tests:
- Unit: Test source list displays correctly
- Unit: Test add source form validation
- Unit: Test remove source functionality
- Integration: Test source management workflow
acceptance_criteria:
- Source list displays all sources
- Add source form validates input
- Remove source works correctly
- Enable/disable toggles work
validation:
- Run application and navigate to settings
- Test add source
- Test remove source
- Test enable/disable toggle
- Verify feeds from new sources appear
notes:
- Source types: RSS, API, Custom
- RSS sources: feed URLs
- API sources: require API key
- Custom sources: user-defined
- Add validation for source URLs
- Store sources in localStorage
- Show source status (working/error)
- Add error handling for failed sources

View File

@@ -0,0 +1,69 @@
# 48. Build User Preferences
meta:
id: podcast-tui-app-48
feature: podcast-tui-app
priority: P1
depends_on: [47]
tags: [preferences, settings, solidjs]
objective:
- Create user preferences panel
- Implement theme selection
- Implement font size control
- Implement playback speed control
- Implement auto-download settings
deliverables:
- `src/components/PreferencesPanel.tsx` with preferences
- `src/components/ThemeSelector.tsx` with theme options
- `src/components/FontSelector.tsx` with font size options
- `src/components/AutoDownload.tsx` with auto-download settings
steps:
- Create `src/components/PreferencesPanel.tsx`:
- Preferences sections
- Navigation between preferences
- Save/Cancel buttons
- Create `src/components/ThemeSelector.tsx`:
- Theme options (light, dark, terminal)
- Preview theme
- Select theme
- Create `src/components/FontSelector.tsx`:
- Font size options (small, medium, large)
- Preview font size
- Select font size
- Create `src/components/AutoDownload.tsx`:
- Auto-download episodes
- Download after playback
- Download schedule
- Storage limit warning
tests:
- Unit: Test theme selector
- Unit: Test font selector
- Unit: Test auto-download settings
- Integration: Test preferences save/load
acceptance_criteria:
- Preferences display correctly
- Theme selection works
- Font size selection works
- Auto-download settings work
- Preferences persist
validation:
- Run application and navigate to preferences
- Change theme and verify
- Change font size and verify
- Test auto-download settings
- Restart app and verify preferences
notes:
- Use localStorage for preferences
- Theme: Terminal colors (green/amber on black)
- Font size: Small (12px), Medium (14px), Large (16px)
- Auto-download: Download completed episodes
- Add preferences to settings screen
- Save preferences on change
- Reset to defaults button

View File

@@ -0,0 +1,62 @@
# 50. Create Global State Store (Signals)
meta:
id: podcast-tui-app-50
feature: podcast-tui-app
priority: P0
depends_on: [49]
tags: [state-management, global-store, signals, solidjs]
objective:
- Create global state store using SolidJS Signals
- Manage application-wide state
- Provide state to all components
- Handle state updates and persistence
deliverables:
- `src/stores/appStore.ts` with global state store
- `src/stores/feedStore.ts` with feed state
- `src/stores/playerStore.ts` with player state
- `src/stores/searchStore.ts` with search state
steps:
- Create `src/stores/appStore.ts`:
- Use SolidJS signals for global state
- Store application state: currentTab, isAuthEnabled, settings
- Provide state to all child components
- Update state when needed
- Create `src/stores/feedStore.ts`:
- Signals for feeds array
- Signals for selectedFeed
- Methods: addFeed, removeFeed, updateFeed
- Create `src/stores/playerStore.ts`:
- Signals for currentEpisode
- Signals for playbackState
- Methods: play, pause, seek, setSpeed
- Create `src/stores/searchStore.ts`:
- Signals for searchResults
- Signals for searchHistory
- Methods: search, addToHistory, clearHistory
tests:
- Unit: Test store methods update signals correctly
- Unit: Test state persistence
- Integration: Test state updates across components
acceptance_criteria:
- Global state store manages all app state
- Store methods update signals correctly
- State persists across component re-renders
- State updates propagate to UI
validation:
- Run application and verify state is initialized
- Modify state and verify UI updates
- Restart app and verify state persistence
notes:
- Use SolidJS `createSignal` for reactivity
- Store should be singleton pattern
- Use `createStore` if complex state needed
- Keep store simple and focused
- Store state in localStorage

View File

@@ -0,0 +1,63 @@
# 51. Implement API Client for Podcast Sources
meta:
id: podcast-tui-app-51
feature: podcast-tui-app
priority: P1
depends_on: [50]
tags: [api-client, sources, solidjs]
objective:
- Create API client for podcast sources
- Handle RSS feed parsing
- Handle API source queries
- Handle custom sources
- Implement error handling
deliverables:
- `src/api/client.ts` with API client
- `src/api/rss-parser.ts` with RSS parsing
- `src/api/source-handler.ts` with source-specific handlers
steps:
- Create `src/api/client.ts`:
- `fetchFeeds(sourceIds: string[]): Promise<Feed[]>`
- `fetchEpisodes(feedUrl: string): Promise<Episode[]>`
- `searchPodcasts(query: string): Promise<Podcast[]>`
- Handle API calls and errors
- Create `src/api/rss-parser.ts`:
- `parseRSSFeed(xml: string): Podcast`
- Parse RSS XML
- Extract podcast metadata
- Extract episodes
- Create `src/api/source-handler.ts`:
- `handleRSSSource(source: PodcastSource): Promise<Feed[]>`
- `handleAPISource(source: PodcastSource, query: string): Promise<Podcast[]>`
- `handleCustomSource(source: PodcastSource, query: string): Promise<Podcast[]>`
- Source-specific logic
tests:
- Unit: Test RSS parsing
- Unit: Test API client
- Unit: Test source handlers
- Integration: Test API calls
acceptance_criteria:
- API client fetches data correctly
- RSS parsing works
- Source handlers work for all types
- Errors handled gracefully
validation:
- Run application and test API calls
- Test RSS feed parsing
- Test API source queries
- Test error handling
notes:
- Use `feed-parser` library for RSS parsing
- Use `axios` for API calls
- Handle rate limiting
- Cache API responses
- Add error handling for failed requests
- Store API keys securely

View File

@@ -0,0 +1,66 @@
# 52. Add Data Fetching and Caching
meta:
id: podcast-tui-app-52
feature: podcast-tui-app
priority: P1
depends_on: [51]
tags: [data-fetching, caching, performance, solidjs]
objective:
- Implement data fetching with caching
- Cache podcast feeds and episodes
- Cache search results
- Cache popular shows
- Handle cache invalidation
deliverables:
- `src/utils/cache.ts` with cache management
- `src/utils/data-fetcher.ts` with data fetching logic
- `src/hooks/useCachedData.ts` with cache hook
steps:
- Create `src/utils/cache.ts`:
- `cacheFeed(feedUrl: string, data: Feed): void`
- `getCachedFeed(feedUrl: string): Feed | null`
- `cacheSearch(query: string, results: Podcast[]): void`
- `getCachedSearch(query: string): Podcast[] | null`
- `invalidateCache(type: string): void`
- `cacheExpiration = 3600000` (1 hour)
- Create `src/utils/data-fetcher.ts`:
- `fetchFeedWithCache(feedUrl: string): Promise<Feed>`
- `fetchEpisodesWithCache(feedUrl: string): Promise<Episode[]>`
- `searchWithCache(query: string): Promise<Podcast[]>`
- Use cache when available
- Create `src/hooks/useCachedData.ts`:
- `createSignal` for cached data
- Fetch data with cache
- Update cache on fetch
- Handle cache expiration
tests:
- Unit: Test cache management
- Unit: Test data fetcher
- Unit: Test cache hook
acceptance_criteria:
- Data is cached correctly
- Cache is used on subsequent requests
- Cache invalidation works
- Cache expiration handled
validation:
- Run application and fetch data
- Verify data is cached
- Make same request and use cache
- Test cache invalidation
- Test cache expiration
notes:
- Use localStorage for cache
- Cache feeds, episodes, search results
- Cache popular shows
- Invalidate cache on feed update
- Set cache expiration time
- Add cache size limit
- Clear cache on settings change

View File

@@ -0,0 +1,65 @@
# 53. Build File-Based Storage for Sync
meta:
id: podcast-tui-app-53
feature: podcast-tui-app
priority: P1
depends_on: [52]
tags: [file-based-storage, sync, solidjs]
objective:
- Implement file-based storage for sync
- Store feeds and settings in files
- Implement backup functionality
- Implement restore functionality
- Handle file operations
deliverables:
- `src/utils/file-storage.ts` with file storage
- `src/utils/backup.ts` with backup functions
- `src/utils/restore.ts` with restore functions
steps:
- Create `src/utils/file-storage.ts`:
- `saveFeedsToFile(feeds: Feed[]): Promise<void>`
- `loadFeedsFromFile(): Promise<Feed[]>`
- `saveSettingsToFile(settings: Settings): Promise<void>`
- `loadSettingsFromFile(): Promise<Settings>`
- Handle file operations and errors
- Create `src/utils/backup.ts`:
- `createBackup(): Promise<string>`
- `backupFeeds(feeds: Feed[]): string`
- `backupSettings(settings: Settings): string`
- Include all user data
- Create backup directory
- Create `src/utils/restore.ts`:
- `restoreFromBackup(backupData: string): Promise<void>`
- `restoreFeeds(backupData: string): void`
- `restoreSettings(backupData: string): void`
- Validate backup data
tests:
- Unit: Test file storage functions
- Unit: Test backup functions
- Unit: Test restore functions
acceptance_criteria:
- File storage works correctly
- Backup creates valid files
- Restore loads data correctly
- File operations handle errors
validation:
- Run application and test file storage
- Create backup
- Restore from backup
- Test with different data sizes
- Test error cases
notes:
- Store files in `data/` directory
- Use JSON format for storage
- Include version info for compatibility
- Add file encryption option (optional)
- Test with large files
- Handle file permission errors

View File

@@ -0,0 +1,67 @@
# 54. Set Up Testing Framework (Snapshot Testing)
meta:
id: podcast-tui-app-54
feature: podcast-tui-app
priority: P1
depends_on: [53]
tags: [testing, framework, setup, opentui]
objective:
- Set up OpenTUI testing framework
- Configure test runner
- Set up snapshot testing
- Configure test environment
deliverables:
- `tests/` directory with test structure
- `tests/setup.ts` with test setup
- `tests/config.ts` with test configuration
- `package.json` with test scripts
steps:
- Install testing dependencies:
- `@opentui/testing`
- `@opentui/react` (for testing)
- `@opentui/solid` (for testing)
- `bun test` (built-in test runner)
- Configure test environment:
- Set up test renderer
- Configure test options
- Set up test fixtures
- Create test structure:
- `tests/components/` for component tests
- `tests/integration/` for integration tests
- `tests/utils/` for utility tests
- `tests/fixtures/` for test data
- Add test scripts to `package.json`:
- `test`: Run all tests
- `test:watch`: Run tests in watch mode
- `test:coverage`: Run tests with coverage
- `test:components`: Run component tests
- `test:integration`: Run integration tests
tests:
- Unit: Verify testing framework is set up
- Integration: Verify test scripts work
- Component: Verify snapshot testing works
acceptance_criteria:
- Testing framework installed and configured
- Test scripts work correctly
- Snapshot testing configured
- Test environment set up
validation:
- Run `bun test` to execute all tests
- Run `bun test:components` to run component tests
- Run `bun test:coverage` for coverage report
- Check all tests pass
notes:
- Use OpenTUI's testing framework for snapshot testing
- Test components in isolation
- Use test fixtures for common data
- Mock external dependencies
- Keep tests fast and focused
- Add CI/CD integration for automated testing

View File

@@ -0,0 +1,68 @@
# 55. Write Component Tests
meta:
id: podcast-tui-app-55
feature: podcast-tui-app
priority: P1
depends_on: [54]
tags: [testing, components, snapshot, solidjs]
objective:
- Write component tests for all major components
- Test component rendering
- Test component behavior
- Test component interactions
deliverables:
- `tests/components/Navigation.test.tsx`
- `tests/components/FeedList.test.tsx`
- `tests/components/SearchBar.test.tsx`
- `tests/components/Player.test.tsx`
- `tests/components/SettingsScreen.test.tsx`
- Test coverage for all components
steps:
- Write component tests:
- `tests/components/Navigation.test.tsx`:
- Test Navigation renders with correct tabs
- Test tab selection updates state
- Test keyboard navigation
- `tests/components/FeedList.test.tsx`:
- Test FeedList renders with feeds
- Test FeedItem displays correctly
- Test public/private filtering
- Test keyboard navigation
- `tests/components/SearchBar.test.tsx`:
- Test search bar accepts input
- Test search button triggers search
- Test clear button clears input
- `tests/components/Player.test.tsx`:
- Test Player UI displays correctly
- Test playback controls work
- Test waveform visualization
- `tests/components/SettingsScreen.test.tsx`:
- Test SettingsScreen renders correctly
- Test settings navigation
- Test settings save/load
tests:
- Unit: Run all component tests
- Coverage: Verify component coverage
acceptance_criteria:
- All component tests pass
- Test coverage > 80%
- Component behavior verified
validation:
- Run `bun test:components` to execute component tests
- Run `bun test --coverage` for coverage report
- Fix any failing tests
notes:
- Use OpenTUI testing framework
- Test components in isolation
- Mock external dependencies
- Use test fixtures for data
- Keep tests fast
- Test both happy path and error cases

View File

@@ -0,0 +1,57 @@
# 56. Add Keyboard Interaction Tests
meta:
id: podcast-tui-app-56
feature: podcast-tui-app
priority: P1
depends_on: [55]
tags: [testing, keyboard, interaction, solidjs]
objective:
- Write keyboard interaction tests
- Test keyboard shortcuts
- Test keyboard navigation
- Test input field keyboard handling
deliverables:
- `tests/integration/navigation.test.tsx`
- `tests/integration/keyboard.test.tsx`
- `tests/integration/inputs.test.tsx`
steps:
- Write keyboard tests:
- `tests/integration/navigation.test.tsx`:
- Test arrow keys navigate tabs
- Test enter selects tab
- Test escape closes modal
- `tests/integration/keyboard.test.tsx`:
- Test Ctrl+Q quits app
- Test Ctrl+S saves settings
- Test space plays/pauses
- Test arrow keys for playback
- `tests/integration/inputs.test.tsx`:
- Test input field accepts text
- Test keyboard input in search bar
- Test code input validation
tests:
- Unit: Run keyboard tests
- Integration: Test keyboard interactions
acceptance_criteria:
- All keyboard tests pass
- Keyboard shortcuts work correctly
- Input fields handle keyboard input
validation:
- Run `bun test` to execute all tests
- Manually test keyboard shortcuts
- Verify keyboard navigation works
notes:
- Use OpenTUI testing framework
- Test keyboard events
- Mock keyboard input
- Test on different terminals
- Document keyboard shortcuts
- Test modifier key combinations

View File

@@ -0,0 +1,63 @@
# 57. Implement Error Handling
meta:
id: podcast-tui-app-57
feature: podcast-tui-app
priority: P1
depends_on: [56]
tags: [error-handling, debugging, solidjs]
objective:
- Implement error handling throughout the app
- Handle API errors
- Handle file errors
- Handle user input errors
- Display error messages
deliverables:
- `src/utils/error-handler.ts` with error handling
- `src/components/ErrorDisplay.tsx` with error UI
- `src/components/LoadingSpinner.tsx` with loading UI
steps:
- Create `src/utils/error-handler.ts`:
- `handleError(error: Error, context: string): void`
- Log errors to console
- Display user-friendly error messages
- Handle different error types
- Create `src/components/ErrorDisplay.tsx`:
- Display error message
- Error type indicator
- Retry button
- Error details (expandable)
- Create `src/components/LoadingSpinner.tsx`:
- Loading indicator
- Loading message
- Different loading states
tests:
- Unit: Test error handler
- Unit: Test error display
- Integration: Test error handling flow
acceptance_criteria:
- Errors are caught and handled
- Error messages display correctly
- Retry functionality works
- User sees helpful error messages
validation:
- Run application and trigger errors
- Test API errors
- Test file errors
- Test input errors
- Verify error messages display
notes:
- Handle network errors (API calls)
- Handle file errors (import/export)
- Handle validation errors (inputs)
- Handle parsing errors (RSS feeds)
- Display errors in user-friendly way
- Add error logging for debugging
- Consider adding Sentry for production

View File

@@ -0,0 +1,205 @@
# Podcast TUI App
Objective: Build a SolidJS-based podcast player TUI with feeds, search, player, and file sync
Status legend: [ ] todo, [~] in-progress, [x] done
---
## Phase 1: Project Foundation 🏗️
**Setup and configure the development environment**
- [ ] 01 — Initialize SolidJS OpenTUI project with Bun → `01-project-setup.md`
- [ ] 13 — Set up TypeScript configuration and build system → `13-typescript-config.md`
- [ ] 14 — Create project directory structure and dependencies → `14-project-structure.md`
- [ ] 15 — Build responsive layout system (Flexbox) → `15-responsive-layout.md`
**Dependencies:** 01 -> 02 -> 03 -> 04 -> 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 2: Core Architecture 🏗️
**Build the main application shell and navigation**
- [ ] 02 — Create main app shell with tab navigation → `02-core-layout.md`
- [ ] 16 — Implement tab navigation component → `16-tab-navigation.md`
- [ ] 17 — Add keyboard shortcuts and navigation handling → `17-keyboard-handling.md`
**Dependencies:** 01 -> 02 -> 03 -> 04 -> 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 3: File Sync & Data Import/Export 💾
**Implement direct file sync with JSON/XML formats**
- [ ] 03 — Implement direct file sync (JSON/XML import/export) → `03-file-sync.md`
- [ ] 18 — Create sync data models (JSON/XML formats) → `18-sync-data-models.md`
- [ ] 19 — Build import/export functionality → `19-import-export.md`
- [ ] 20 — Create file picker UI for import → `20-file-picker.md`
- [ ] 21 — Build sync status indicator → `21-sync-status.md`
- [ ] 22 — Add backup/restore functionality → `22-backup-restore.md`
**Dependencies:** 02 -> 03 -> 04 -> 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 4: Authentication System 🔐
**Implement authentication (MUST be implemented as optional for users)**
- [ ] 04 — Build optional authentication system → `04-authentication.md`
- [ ] 23 — Create authentication state (disabled by default) → `23-auth-state.md`
- [ ] 24 — Build simple login screen (email/password) → `24-login-screen.md`
- [ ] 25 — Implement 8-character code validation flow → `25-code-validation.md`
- [ ] 26 — Add OAuth placeholder screens (document limitations) → `26-oauth-placeholders.md`
- [ ] 27 — Create sync-only user profile → `27-sync-profile.md`
**Dependencies:** 03 -> 04 -> 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 5: Feed Management 📻
**Create feed data models and management UI**
- [ ] 05 — Create feed data models and types → `05-feed-management.md`
- [ ] 28 — Create feed data models and types → `28-feed-types.md`
- [ ] 29 — Build feed list component (public/private feeds) → `29-feed-list.md`
- [ ] 30 — Implement feed source management (add/remove sources) → `30-source-management.md`
- [ ] 31 — Add reverse chronological ordering → `31-reverse-chronological.md`
- [ ] 32 — Create feed detail view → `32-feed-detail.md`
**Dependencies:** 01 -> 02 -> 03 -> 04 -> 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 6: Search Functionality 🔍
**Implement multi-source search interface**
- [ ] 06 — Implement multi-source search interface → `06-search.md`
- [ ] 33 — Create search interface → `33-search-interface.md`
- [ ] 34 — Implement multi-source search → `34-multi-source-search.md`
- [ ] 35 — Add search results display → `35-search-results.md`
- [ ] 36 — Build search history with persistent storage → `36-search-history.md`
**Dependencies:** 05 -> 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 7: Discover Feed 🌟
**Build discover page with popular shows**
- [ ] 07 — Build discover feed with popular shows → `07-discover.md`
- [ ] 37 — Create popular shows data structure → `37-popular-shows.md`
- [ ] 38 — Build discover page component → `38-discover-page.md`
- [ ] 39 — Add trending shows display → `39-trending-shows.md`
- [ ] 40 — Implement category filtering → `40-category-filtering.md`
**Dependencies:** 06 -> 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 8: Player Component 🎵
**Create player UI with waveform visualization**
- [ ] 08 — Create player UI with waveform visualization → `08-player.md`
- [ ] 41 — Create player UI layout → `41-player-layout.md`
- [ ] 42 — Implement playback controls → `42-playback-controls.md`
- [ ] 43 — Build ASCII waveform visualization → `43-waveform-visualization.md`
- [ ] 44 — Add progress tracking and seek → `44-progress-tracking.md`
- [ ] 45 — Implement audio integration (system/external player) → `45-audio-integration.md`
**Dependencies:** 07 -> 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 9: Settings & Configuration ⚙️
**Build settings screen and preferences**
- [ ] 09 — Build settings screen and preferences → `09-settings.md`
- [ ] 46 — Create settings screen → `46-settings-screen.md`
- [ ] 47 — Add source management UI → `47-source-management-ui.md`
- [ ] 48 — Build user preferences → `48-user-preferences.md`
- [ ] 49 — Implement data persistence (localStorage/file-based) → `49-data-persistence.md`
**Dependencies:** 08 -> 09 -> 10 -> 11 -> 12
---
## Phase 10: Theme System 🎨
**Implement theming with Catppuccin, Gruvbox, Tokyo, Nord, and custom themes**
- [ ] 59 — Create theme system architecture → `59-theme-system.md`
- [ ] 60 — Implement default theme (system terminal) → `60-default-theme.md`
- [ ] 61 — Add Catppuccin theme → `61-catppuccin-theme.md`
- [ ] 62 — Add Gruvbox theme → `62-gruvbox-theme.md`
- [ ] 63 — Add Tokyo theme → `63-tokyo-theme.md`
- [ ] 64 — Add Nord theme → `64-nord-theme.md`
- [ ] 65 — Implement custom theme editor → `65-custom-theme.md`
- [ ] 66 — Add theme selector in settings → `66-theme-selector.md`
**Dependencies:** 09 -> 59 -> 60 -> 61 -> 62 -> 63 -> 64 -> 65 -> 66 -> 10
---
## Phase 11: State Management & Data Layer 🗄️
**Create global state store and data layer**
- [ ] 10 — Create global state store and data layer → `10-state-management.md`
- [ ] 50 — Create global state store (Signals) → `50-global-state-store.md`
- [ ] 51 — Implement API client for podcast sources → `51-api-client.md`
- [ ] 52 — Add data fetching and caching → `52-data-fetching-caching.md`
- [ ] 53 — Build file-based storage for sync → `53-file-based-storage.md`
**Dependencies:** 66 -> 10
---
## Phase 12: Testing & Quality Assurance ✅
**Set up testing framework and write comprehensive tests**
- [ ] 11 — Set up testing framework and write tests → `11-testing.md`
- [ ] 54 — Set up testing framework (snapshot testing) → `54-testing-framework.md`
- [ ] 55 — Write component tests → `55-component-tests.md`
- [ ] 56 — Add keyboard interaction tests → `56-keyboard-tests.md`
- [ ] 57 — Implement error handling → `57-error-handling.md`
- [ ] 58 — Add loading states and transitions → `58-loading-states.md`
**Dependencies:** 10 -> 11
---
## Phase 13: OAuth & External Integration 🔗
**Complete OAuth implementation and external integrations**
- [ ] 26 — Add OAuth placeholder screens (document limitations) → `26-oauth-placeholders.md`
- [ ] 67 — Implement browser redirect flow for OAuth → `67-browser-redirect.md`
- [ ] 68 — Build QR code display for mobile verification → `68-qr-code-display.md`
**Dependencies:** 04 -> 67 -> 68
---
## Phase 14: Deployment & Optimization 🚀
**Optimize bundle and create documentation**
- [ ] 12 — Optimize bundle and create documentation → `12-optimization.md`
**Dependencies:** 11
---
## Dependencies Summary
- **Phase dependencies** ensure logical implementation order
- **Authentication MUST be implemented** (just optional for user login)
- **Theme system** is required and comes before state management
---
## Exit criteria
- The feature is complete when all 58 tasks are marked [x] done
- Complete, functional podcast TUI application with all core features working
- File sync (JSON/XML) successfully imports/exports feeds and settings
- Authentication system is fully implemented (optional for users)
- Player has waveform visualization and playback controls
- All navigation and keyboard shortcuts work correctly
- Theme system works with Catppuccin, Gruvbox, Tokyo, Nord, and custom themes
- Application runs on Bun with OpenTUI