Generate a Product Requirements Document (PRD) for a new feature. Use when planning a feature, starting a new project, or when asked to create a PRD. Triggers on: create a prd, write prd for, plan this feature, requirements for, spec out.
Create detailed Product Requirements Documents that are clear, actionable, and suitable for implementation. This creates a markdown PRD that a product manager would write.
tasks/prd-[feature-name].mdImportant: Do NOT start implementing. Just create the PRD.
Ask only critical questions where the initial prompt is ambiguous. Focus on:
1. What is the primary goal of this feature?
A. Improve user onboarding experience
B. Increase user retention
C. Reduce support burden
D. Other: [please specify]
2. Who is the target user?
A. New users only
B. Existing users only
C. All users
D. Admin users only
3. What is the scope?
A. Minimal viable version
B. Full-featured implementation
C. Just the backend/API
D. Just the UI
This lets users respond with "1A, 2C, 3B" for quick iteration.
Generate the PRD with these sections:
Brief description of the feature and the problem it solves.
Specific, measurable objectives (bullet list).
Each story needs:
Each story should be small enough to implement in one focused session.
Format:
### US-001: [Title]
**Description:** As a [user], I want [feature] so that [benefit].
**Acceptance Criteria:**
- [ ] Specific verifiable criterion
- [ ] Another criterion
- [ ] Typecheck passes
Important:
Numbered list of specific functionalities:
Be explicit and unambiguous.
What this feature will NOT include. Critical for managing scope.
How will success be measured?
Remaining questions or areas needing clarification.
When writing PRDs for this codebase, consider:
/types//stores//hooks/ or /screens/[Flow]/[Screen]/hooks//components/ or feature-specific/screens/[Flow]/[Screen]//constants//utils//i18n/languages/en.jsonHeading and Text from @/componentst() for i18ntamagui not @tamagui/stacksThe PRD reader may be a junior developer or AI agent. Therefore:
.md)tasks/prd-[feature-name].md (kebab-case)# PRD: Favorites Feature
## Introduction
Add the ability for users to favorite workout tracks so they can quickly access their preferred workouts. Favorites will be stored in Firestore and synced across devices.
## Goals
- Allow users to mark tracks as favorites with a single tap
- Persist favorites to cloud for cross-device sync
- Display a dedicated favorites section for quick access
- Provide visual feedback when favoriting/unfavoriting
## User Stories
### US-001: Create Favorite type definitions
**Description:** As a developer, I need TypeScript types for favorites so the feature is type-safe.
**Acceptance Criteria:**
- [ ] Create `types/Favorite.ts` with Favorite interface
- [ ] Include fields: id, odTid, odUserId, favoritedAt
- [ ] Export FavoriteStoreState type for Zustand store
- [ ] Typecheck passes
### US-002: Create useFavoritesStore Zustand store
**Description:** As a developer, I need a store to manage favorites state.
**Acceptance Criteria:**
- [ ] Create `stores/useFavoritesStore.ts`
- [ ] State: favorites array, isLoading boolean
- [ ] Actions: addFavorite, removeFavorite, setFavorites, clearFavorites
- [ ] Persist to AsyncStorage for offline access
- [ ] Typecheck passes
### US-003: Create FavoriteButton component
**Description:** As a user, I want a button to toggle favorites on tracks.
**Acceptance Criteria:**
- [ ] Create `components/FavoriteButton.tsx`
- [ ] Props: trackId, size (sm/md/lg)
- [ ] Shows filled heart when favorited, outline when not
- [ ] Animates on press
- [ ] Uses theme colors
- [ ] Typecheck passes
### US-004: Add i18n translations for favorites
**Description:** As a user, I want favorites UI text in my language.
**Acceptance Criteria:**
- [ ] Add 'Favorites' key to en.json
- [ ] Add 'Add to Favorites' key
- [ ] Add 'Remove from Favorites' key
- [ ] Add 'No favorites yet' key
- [ ] Typecheck passes
### US-005: Integrate FavoriteButton into TrackCard
**Description:** As a user, I want to favorite tracks from the track list.
**Acceptance Criteria:**
- [ ] Import FavoriteButton into TrackCard component
- [ ] Position button in top-right corner of card
- [ ] Connect to useFavoritesStore
- [ ] Typecheck passes
## Functional Requirements
- FR-1: Users can tap a heart icon to favorite/unfavorite a track
- FR-2: Favorites persist across app sessions via AsyncStorage
- FR-3: Favorites sync to Firestore when online
- FR-4: FavoriteButton shows loading state during sync
- FR-5: Favorites count visible in profile section
## Non-Goals
- No favorites for individual exercises (only tracks)
- No favorites sharing with other users
- No favorites limit
- No favorites organization/folders
## Technical Considerations
- Use optimistic updates for immediate UI feedback
- Sync to Firestore `users/{userId}/favorites` collection
- Handle offline gracefully with AsyncStorage cache
- Consider React Query for server state
## Success Metrics
- Users can favorite a track in under 2 taps
- Favorites persist correctly across sessions
- No performance impact on track list rendering
## Open Questions
- Should favorites appear in a dedicated tab or section?
- Should we show "recently favorited" vs "all favorites"?
Tell the user:
PRD saved to tasks/prd-[feature-name].md
Next steps:
1. Review the PRD and make any adjustments
2. When ready, say "convert to ralph" or use /ralph to convert it to prd.json
3. Then run: cd ralph-cc && ./ralph.sh
Before saving the PRD:
tasks/prd-[feature-name].md