Appearance
Explore & Discovery
The Explore page is the primary discovery surface for challenges on DoCurious. It is where users find new challenges to try, browse curated collections, search for specific activities, and discover what their communities are doing.
STATUS: BUILT
Store: src/store/useExploreStore.ts (9.2 KB) | Types: src/types/explore.types.ts (4.5 KB) | API: src/api/explore.api.ts (9.9 KB) + explore.real.api.ts | Pages: Explore.tsx, SavedList.tsx, ExploreCategoryView.tsx, DealersChoicePage.tsx, MapView.tsx | Components: 16 explore components including HorizontalChallengeRow, SearchFilterBar, LocationFilter, DealersChoice, CalendarView, FilterPanel, ActiveFilters, EventCard, and more.
Explore Page Layout
The Explore page is organized into five visual zones stacked vertically within the main content area. The global header and side navigation remain persistent.
+-----------------------------------------------------+
| Global Header |
+----------+------------------------------------------+
| | A. Search Bar + Filter Controls |
| Side +------------------------------------------+
| Nav | B. Active Filters Chip Bar |
| +------------------------------------------+
| | C. View Library (Pinned + Browsable) |
| +------------------------------------------+
| | D. Challenge Card Grid |
| | (12 per page, Load More) |
| +------------------------------------------+
| | E. Load More / End of Results |
+----------+------------------------------------------+Zone A: Search Bar and Filter Controls
The search bar is a full-width input at the top of the content area. It is always visible and never collapses. The placeholder text reads "Search challenges..." with a magnifying glass icon on the left and a clear button that appears when text is entered.
To the right of the search bar is a "Filters" toggle button. Clicking it opens or closes the collapsible filter panel, which displays all eight filter dimensions as a grid of controls (see Filter System below).
A sort dropdown sits right-aligned above the challenge grid. Sort options include: Relevance (default when searching), Most Popular, Newest, Price Low-High, and Price High-Low.
Zone B: Active Filters Chip Bar
This row appears only when one or more filters are active. Each active filter displays as a removable chip (for example, "Beginner x", "Free x", "Outdoor x"). A "Clear all filters" button at the end of the chip row resets everything at once. The result count updates live as filters change, displaying something like "23 challenges found."
Zone C: View Library
The View Library is the primary discovery surface. It shows curated views organized by family in horizontal scrollable rows, one row per family. Pinned views appear in a dedicated top row labeled "Your Views." Each view card shows its name, icon, challenge count badge, and a pin/unpin icon. Clicking a view loads its challenges into the challenge card grid below.
Zone D: Challenge Card Grid
A responsive grid of challenge cards. Desktop shows 3 to 4 columns, tablet shows 2 columns, and mobile shows 1 column (or swipeable horizontal for featured rows). Each page loads 12 challenge cards.
Zone E: Load More
A centered "Load More" button appears after every 12 cards. When all results have been loaded, the message reads "You've seen all X challenges." If no results match, an empty state is displayed with helpful suggestions.
Search
How Search Works
The search bar is persistent at the top of the Explore page. When you type a query and press Enter (or click the search icon), DoCurious creates a dynamic "Search Results" view that appears in the View Library. That view persists until you explicitly close it with the X button.
Searchable fields (highest to lowest priority): challenge title, category names, tags/keywords, challenge description, vendor name, materials needed, milestone text, location.
Fuzzy Matching
DoCurious uses fuzzy matching with typo tolerance so that a search like "cokking" will still match "Cooking." The implementation uses PostgreSQL trigram similarity (pg_trgm extension) initially, with Elasticsearch or Meilisearch available at scale.
Synonym expansion is also supported: searching "cooking" will also surface results for "baking" and "culinary."
Relevance Ranking
Search results are ranked by a composite score that weighs multiple signals:
| Signal | Weight | Details |
|---|---|---|
| Text relevance | 40% | How well the query matches title, description, and tags. Title exact matches get the highest boost. Phrase matching ranks higher than individual word matching. |
| Popularity | 20% | Normalized score based on completions, saves, starts, and views. Weighted toward completions. Decayed over time so recent popularity matters more. |
| Quality | 20% | Average rating (weighted by number of ratings), completion rate, and Track Record media richness. |
| Freshness | 10% | Newer challenges get a slight boost that decays over 30 days. Recently updated challenges get a smaller boost. |
| Personalization | 10% | Boost for categories matching user interests, difficulty matching user history, and similarity to completed challenges. |
The formula:
search_score = (text_relevance x 0.4)
+ (popularity x 0.2)
+ (quality x 0.2)
+ (freshness x 0.1)
+ (personalization x 0.1)Instant Suggestions (Autocomplete)
As you type, a dropdown shows up to 5 challenge title suggestions. Suggestions are debounced at 300 milliseconds -- the system waits 300ms after you stop typing before making the API call. Clicking a suggestion navigates directly to that challenge's detail page. Autocomplete triggers after 2 characters.
Suggestion types include matching challenge titles, category names, and vendor names. Recent searches are stored client-side only (not on the server) and shown in the dropdown. Maximum 8 suggestions total.
Search Results View
Search results appear as a standard challenge card grid with:
- A result count ("23 challenges found")
- Sort options: Relevance (default), Most Popular, Newest, Price Low-High, Price High-Low
- All filter controls available (filters can be combined with search)
- Pagination at 12 per page with "Load More"
- The view persists in the View Library until you close it
Zero-Result Handling
DoCurious never shows a completely blank results page. When a search returns no results, it shows "Did you mean...?" suggestions, related categories, and popular challenges in related categories. Target zero-result rate: below 5%.
Performance Targets
Search queries under 200ms, autocomplete under 100ms, filter application under 150ms, recommendation feed load under 300ms, feed refresh under 500ms (all p95 targets).
Filter System
Filters can be applied to any view, including search results. Multiple filters can be combined. The core logic rule is:
- OR within a dimension: Selecting "Beginner" and "Intermediate" under Difficulty shows challenges that are either beginner OR intermediate.
- AND across dimensions: Selecting "Beginner" difficulty AND "Free" cost shows only challenges that are both beginner AND free.
Filter Dimensions
| Dimension | Options | UI Control |
|---|---|---|
| Category | 6 parent categories with 27 subcategories (Outdoor Adventure, Decorative Arts & Crafts, Cooking & Nutrition, etc.). Multi-select. | Checkbox dropdown |
| Difficulty | Beginner, Intermediate, Advanced. Multi-select. | Checkbox group |
| Cost | Free, Under $25, Under $50, Under $100, $100+. Multi-select. | Checkbox group |
| Solo / Group | Solo, Group, Both. Multi-select. | Checkbox group |
| Age Range | Minimum and maximum age sliders. | Dual-handle range slider |
| Fulfillment Type | Kit, Hosted, Digitally Guided, Free (no fulfillment). Multi-select. | Checkbox group |
| Duration | Under 1 hour, 1-3 hours, Half day, Full day, Multi-day, Multi-week. Multi-select. | Checkbox group |
| Location | Indoor, Outdoor, Specific Venue, No Location Required. Multi-select. | Checkbox group |
Filter UX Details
- Filters appear in a collapsible panel below the search bar
- Active filters are shown as removable chips above the results grid
- A "Clear all filters" button resets all filters at once
- Result count updates live as filters change
- Filter state persists while the user navigates between views in the same session
- URL parameters encode filter state, so filtered views are shareable and bookmarkable
- The filter panel layout adapts based on the active theme configuration (
exploreFilterPlacementin theme config): it can render as a modal, a sidebar, or a top bar
Curated Views
Views are organized into six families. Each view is a named collection of challenges with its own selection logic -- algorithmic, editorial, social, or contextual. Views are the navigation layer of the Explore page.
View Library
The View Library uses a hybrid list/tile layout. Views are shown as labeled tiles grouped by family. You can:
- Pin favorites: Up to 5 views can be pinned. Pinned views appear in a "Pinned" row at the top of the library, above the family groupings.
- Smart preview: Hovering over a view tile for 500ms shows a tooltip with 3 challenge card previews and a challenge count.
- Select a view: Clicking a tile opens that view's challenge grid in the main content area.
For You Family
Personalized views tailored to the individual user.
| View | Logic |
|---|---|
| Best Fit | Primary personalized view. Ranks challenges based on selected interest categories, age, past completions (avoids repeats, suggests related), difficulty progression, cost preferences (inferred from behavior), and category diversity (mixes familiar + adjacent categories). Adjustable via preference selector. See Best Fit Recommendations. |
| Recommended | Challenges recommended to you by friends, family, and community members via the Recommend flow. |
| Continue Your Journey | Challenges in Series you have already started -- shows the next challenge in the series. |
| Bucket List | Challenges that align with your Bucket List items. |
| Matched to Your Profile | Challenges popular among users with similar interest profiles (collaborative filtering). |
Discover Family
Curated views for exploration and pushing boundaries.
| View | Logic |
|---|---|
| Dealer's Choice | Gamified random selection. See Dealer's Choice for the full specification. |
| Uncharted Territory | Challenges exclusively from subcategories and types you have NOT selected when setting Best Fit parameters. Excludes completed and in-progress challenges. Maximizes novelty. |
| Expert Picks | Staff-curated editorial selections, rotated periodically. Each pick includes a short editorial blurb. |
| Hidden Gems | High-rated challenges with low completion counts. Surfaces quality content that has not gone viral. |
| Level Up | Challenges one difficulty level above your most commonly completed difficulty. |
Social Family
Views driven by community and platform-wide activity.
| View | Logic |
|---|---|
| My Communities | Dynamic sub-views for each community you belong to. Shows challenges that community members have recently completed, started, or added to Bucket Lists. |
| Most Completed This Month | Platform-wide. Challenges with the highest completion count in the current calendar month. |
| Trending | Challenges with the steepest increase in starts over the past 7 days. |
| Rising Stars | Recently approved challenges gaining traction quickly (ratio of completions to age). |
| Top Rated | Challenges whose Track Records have the highest average thumbs-up counts. |
| Discover Communities | Not a challenge view. Shows discoverable communities (public Interest/Hobby type) the user can browse and request to join. |
Fresh Family
Time-sensitive and recently added content.
| View | Logic |
|---|---|
| New This Week | Challenges approved within the last 7 days. |
| Just Added | Challenges approved within the last 24 hours. May be empty on slow days. |
| Seasonal | Staff-curated seasonal collections (summer outdoor, holiday crafts, back-to-school). Rotated quarterly. |
| Limited Time | Challenges with a defined availability window (hosted event on a specific date, seasonal vendor offering). |
| Recently Updated | Challenges that have been edited or refreshed since you last viewed them. |
Practical Family
Utility-driven views for users with specific constraints.
| View | Logic |
|---|---|
| Free Only | All challenges where cost is free. |
| Quick Wins | Challenges with estimated duration under 1 hour. |
| Practical Skills for Age | Challenges tagged as Practical Skills & Preparedness, filtered to your age range. |
| Online Only | Digitally Guided challenges requiring no physical materials or venue. |
| Kit Required | Challenges with fulfillment type = kit. |
| Under $X Budget | You set a budget threshold; shows all challenges at or below that price. Budget persists in settings. |
| Solo Challenges | Challenges where solo/group = solo or both. |
| Group Challenges | Challenges where solo/group = group or both. |
| Near Me | Map-based view showing hosted and venue-specific challenges near your location. See Map View. |
Search Results (Dynamic)
Dynamically generated when you perform a search. Persists in the View Library until closed with the X button. Supports all filters and sort options.
Staff Tools (Admin Only)
Platform admins have access to view-level analytics (popularity, pin frequency, conversion rate, time spent) and view management tools (archive views, create new curated views, edit names/descriptions, reorder within families, feature specific views).
Best Fit Recommendations
Best Fit is the primary personalized view. It combines multiple signals to rank challenges for each user.
Ranking Signals
| Signal | Weight | How It's Used |
|---|---|---|
| Interest categories | High (primary signal) | User's selected interests during onboarding. Updated from settings. |
| Past completions | High | Avoids showing challenges already completed. Favors categories and difficulty levels the user has demonstrated interest in. |
| Age | Hard filter + medium boost | Filters out age-inappropriate challenges. Boosts challenges in the user's exact age range. |
| Difficulty progression | Medium | If a user has completed 3 Beginner challenges in a category, Intermediate challenges in that category get boosted. |
| Cost preferences | Low-Medium | Inferred from behavior: if you mostly start free challenges, the system does not heavily feature $100+ challenges. |
| Category diversity | Medium | Mixes familiar categories with adjacent/unexplored categories. Avoids over-indexing on one category. |
| Challenge quality | Low-Medium (tiebreaker) | Completion rate, Track Record quality (thumbs-up counts), and editorial rating. |
| Recency | Low | Slight boost for newer challenges to surface fresh content. |
The recommendation formula:
recommendation_score = (category_match x 0.35)
+ (difficulty_match x 0.15)
+ (quality_score x 0.25)
+ (freshness_bonus x 0.10)
+ (diversity_bonus x 0.15)Preference Selector
You can customize Best Fit by adjusting weights in a preference selector:
- Category interest sliders (per category: Not Interested / Slightly / Moderately / Very Interested)
- Difficulty preference (show me easier / all / harder challenges)
- Budget ceiling (do not show challenges above $X)
- Novelty preference (stick to what I know / surprise me)
These preferences are saved to your profile and persist across sessions. They supplement the algorithmic signals -- they do not replace them.
Cold Start (New Users)
For new users with no history, the system relies on onboarding interest selections, defaults to Beginner difficulty, mixes free and low-cost challenges, and shows platform-wide popular challenges as a fallback. After 3 completions, behavioral signals begin influencing rankings.
Diversity Rules
Every recommendation set enforces rules to prevent filter bubbles: no more than 40% from a single category, at least 2 different categories in any set of 6+, no more than 30% from a single vendor, at least 20% from challenges added in the last 30 days, and impression fatigue suppression after 5 impressions without interaction. Always includes at least 1 "exploration" pick from an untried category.
Dealer's Choice
Dealer's Choice is a gamified discovery feature that pushes users outside their comfort zone. It is the platform's answer to "I don't know what to try next."
How It Works
- Deal Me In: You click "Deal Me In." The system selects 4 challenge cards based on your profile, deliberately biased toward categories you have not tried or rarely engage with.
- Cards revealed: 4 cards appear face-down, then flip over with a short animation.
- One re-deal allowed: You can click "Re-Deal" once to get 4 new cards. The original 4 are gone. No further re-deals are permitted.
- Select one card: You pick one of the 4 presented cards (or the 4 re-dealt cards). The selected challenge is immediately added to In Progress and a Track Record is created in draft state.
- Timer starts: You have a defined completion window. If the window expires, the challenge is auto-abandoned with XP penalties.
Card Selection Algorithm
The 4 cards are selected with weighted randomness that favors novelty:
| Card Type | Weight | What It Means | Visual |
|---|---|---|---|
| Uncharted | 34% | Subcategories you have NEVER tried or tried much less than your average | Distinct visual badge labeled "Uncharted" |
| Less Commonly Tried | 33% | Subcategories you have tried somewhat-to-much less than your average | Standard card styling |
| Comfort Zone Push | 33% | Categories you do regularly but at a higher difficulty level | Labeled "Comfort Zone Push" |
The algorithm also filters for:
- Age-appropriateness
- Cost (preferring free or low-cost)
- Difficulty level (appropriate to your experience)
- Avoiding challenges already in progress or already completed
XP Multipliers
Dealer's Choice challenges earn multiplied XP based on their novelty category:
| Card Type | XP Multiplier | Example |
|---|---|---|
| Comfort Zone Push | 1.5x | Base 100 XP becomes 150 XP |
| Less Commonly Tried | 1.5x | Base 100 XP becomes 150 XP |
| Uncharted | 2.0x | Base 100 XP becomes 200 XP |
Abandonment Penalty
Dealer's Choice uses a symmetric penalty model. If you abandon a DC challenge, you lose the same XP you would have gained:
| Card Type | Penalty |
|---|---|
| Comfort Zone Push | -1.5x base XP |
| Less Commonly Tried | -1.5x base XP |
| Uncharted | -2.0x base XP |
Why symmetric penalties? The risk/reward symmetry makes the choice meaningful. Users should only "Deal In" when they are genuinely willing to try something new. Without penalties, users would re-deal until they got something easy.
Completion Windows
DC challenges have a maximum completion window. If the window expires without completion, the challenge is auto-abandoned with the full XP penalty.
| Challenge Type | Completion Window |
|---|---|
| Standard challenges | 1 year from selection |
| Seasonal challenges | 2 years from selection (allows the relevant season to come around again) |
| Long-duration challenges | Custom window set by vendor/staff (minimum 6 months) |
Users receive reminders at 30 days, 7 days, and 1 day before their completion window expires.
Constraints
| Rule | Detail |
|---|---|
| Maximum 3 simultaneous DC challenges | You cannot have more than 3 active Dealer's Choice challenges at once. Complete or abandon one before starting another. |
| 7-day cooldown after abandonment | After abandoning a DC challenge, you cannot "Deal Me In" for 7 days. This prevents rapid deal-abandon-redeal cycles. |
| Re-deal limit | Exactly 1 re-deal per round. No exceptions. |
| No cherry-picking | You must select one of the 4 presented cards (or the 4 re-dealt cards). You cannot exit without selecting once cards are revealed, unless you abandon the entire round -- which counts as an abandonment with penalty. |
Under-13: Practice Dealer's Choice
For users under 13, Dealer's Choice operates in a safer "Practice" mode:
| Aspect | Practice DC (Under 13) | Full DC (13+) |
|---|---|---|
| XP multiplier | 1.25x for all card types | 1.5x / 1.5x / 2.0x |
| Abandonment penalty | None (XP cannot go negative for minors) | Full symmetric penalty |
| UI label | "Practice DC" | "Dealer's Choice" |
| Card selection | Same algorithm but strictly filtered for age-appropriateness | Full algorithm |
| Constraints | Same max 3, same re-deal rules | Same |
Social Dealer's Choice
Friend Challenge: You can challenge a friend to a DC round. Both users get the same 4 cards and must each select one. If both complete their selected challenges, each gets a +25% bonus on top of their DC multiplier. If one completes and the other abandons, no penalty to the completer and standard penalty to the abandoner.
Group DC: A community can initiate a Group DC where all participants (3-10 people) get the same 4 cards. Each participant selects independently. If ALL participants complete their chosen challenges, everyone gets +25% bonus.
Community DC Events: A community leader can schedule a DC event ("Everyone deals in by [date]"). Participants deal in during the event window. A community leaderboard shows who completed their DC challenge. No additional XP -- social motivation only.
DC Activity Feed: A feed visible only to users who have participated in DC at least once, showing entries like "[User] just dealt in!" and "[User] completed an Uncharted challenge!" This is a pull model with no push notifications for feed items.
DC Leaderboard: Platform-wide leaderboard for DC-specific XP earned. Resets monthly. Shows rank, display name, DC challenges completed, and total DC XP. Separate leaderboards for under-13 (Practice DC) and 13+ (Full DC).
Map View (Near Me)
The Map View is a location-based discovery feature that shows hosted and venue-specific challenges near you. It lives in the Practical family of views as "Near Me."
STATUS: BUILT
Page: src/pages/explore/MapView.tsx | Component: src/components/explore/LocationFilter.tsx
Layout
+-----------------------------------------------------+
| Global Header |
+----------+------------------------------------------+
| | A. Map Controls Bar |
| Side +------------------------------------------+
| Nav | |
| | B. Interactive Map |
| | (pins for hosted challenges/events) |
| +------------------------------------------+
| | C. Results List Panel |
| | (collapsible, scrollable) |
+----------+------------------------------------------+Map Controls
- Location input: Text field auto-populated with your current location. Editable for manual address or zip code entry. Geolocation icon for "Use my location."
- Distance radius dropdown: 5 miles, 10 miles, 25 miles (default), 50 miles, 100 miles, 250 miles.
- Filter button: Opens the filter panel (same filters as Explore, plus a "Has upcoming events" toggle).
- View toggle: Map view (default) or List view (switches the map area to a full card list).
Map Interface
The map uses a full-screen interactive map (Google Maps or Mapbox). Vendor pins appear for each location with hosted or venue challenges, clustered at low zoom. Each pin shows a challenge count badge with category-colored dots. Clicking a pin opens a popup card with vendor name, address, challenge count, and scrollable challenge cards. Clicking a cluster zooms in.
A scrollable results panel (below the map on mobile, beside it on desktop) shows challenge cards sorted by distance. Clicking a card highlights the corresponding pin on the map.
Location and Distance
User location is obtained via browser Geolocation API (mobile) or IP-based approximation (desktop), with a permission prompt on first access. Default radius is 25 miles. Users can enter a zip code or city name for trip planning. Mobile users get real-time GPS with a "Center on my location" button.
Map Filtering
All standard Explore filters apply to the Map View. Additionally:
- Category filter: Pins update in real time as category filters change
- Cost filter: Hide vendors whose challenges exceed the budget threshold
- Fulfillment type: Map View shows only challenges with
fulfillment_type = hostedorlocation_type = specific_venueby default. A toggle allows including kit-based and digitally guided challenges that happen to have a vendor location.
Map Data and Performance
For challenges to appear on the map, they need location_type = specific_venue or fulfillment_type = hosted with a valid geocoded address (lat/lng stored at challenge creation time, not computed on each load). Locations load in batches based on the visible viewport with 300ms debounce on map movement, pin clustering at high zoom, and a maximum of 200 pins visible at once.
Challenge Cards
Every challenge on the Explore page is displayed as a card. Cards are the fundamental visual unit across all views, search results, and saved lists.
Card Anatomy
Each card contains:
| Element | Details |
|---|---|
| Cover image | Fills the top of the card with a fixed aspect ratio of approximately 3:2 |
| Title | Truncated to 2 lines |
| Category badge(s) | 1-2 category labels shown as colored badges |
| Difficulty indicator | Text label plus a visual indicator (color dot or icon): Beginner, Intermediate, Advanced |
| Cost | "Free" badge (green) or a price like "$24.99" |
| Bookmark icon | Toggles the Interesting List. Outline when not saved, filled when saved. Single click toggles without navigating away. |
| Completion count | Small text beneath the card: "47 people completed this" |
Clicking anywhere on the card (except the bookmark icon) navigates to the Challenge Detail page.
Responsive Grid
| Breakpoint | Columns |
|---|---|
| Desktop | 3-4 columns |
| Tablet | 2 columns |
| Mobile | 1 column (or swipeable horizontal for featured rows) |
Saved List
The Saved List consolidates two pre-commitment stages into a single accessible view: the Interesting List (lightweight bookmarking) and the Bucket List (deliberate "I want to do this" commitment).
STATUS: BUILT
Page: src/pages/explore/SavedList.tsx | Store: useExploreStore manages savedList and savedChallengeIds
Interesting List
The Interesting List is a lightweight bookmarking feature for challenges you want to remember but are not ready to commit to.
- Interaction: Bookmark icon on every challenge card. Outline = not saved, filled = saved. Single click toggles.
- Access: Available as a saved filter/view from the Explore page. Not a separate navigation page.
- Persistence: Items remain until explicitly removed or moved to Bucket List.
Actions on Interesting List items:
- Move to Bucket List (stronger intent signal)
- Start challenge directly (skips Bucket List)
- Remove from Interesting List
- Share or recommend to someone
Bucket List
The Bucket List is a deliberate commitment. It is a separate navigation page with its own privacy and sharing settings.
- Layout: Grid of challenge cards, similar to Explore but only showing your saved items.
- Privacy: Its own privacy/permission settings independent of individual Track Records. You can share your Bucket List with specific communities or individuals.
- Lifecycle: Items disappear from the Bucket List when you move them to Accepted/Started (begin the challenge). Completed challenges do not reappear.
Actions on Bucket List items:
- Start challenge (creates Track Record, moves to In Progress)
- Remove from Bucket List
- Move back to Interesting List (downgrade intent)
- Share or recommend to someone
Community Bucket List Feed
Each community has a Bucket List Feed that shows what members want to do. This enables partner-finding: if two community members both have the same challenge on their Bucket List, the platform surfaces that overlap. See Communities for details.
Discovery to Completion Flow
The full path from discovery to completion:
- See challenge on Explore page. Click bookmark icon -- saved to Interesting List.
- Review Interesting List later. Move challenge to Bucket List (intent confirmed).
- Ready to start. Click "Start" from Bucket List -- challenge moves to In Progress, Track Record created.
- Complete and document. Build Track Record entries offline. Submit for verification.
- Verified. Challenge appears in Completed tab. XP and badges awarded.
Shortcut paths: You can skip the Interesting List (add directly to Bucket List from any challenge card) or skip both (start a challenge directly from the challenge detail page). The Interesting List to Bucket List to Start path is recommended but not enforced.
Calendar View
The Calendar View provides a time-based interface for discovering scheduled challenges, tracking commitments, and planning activities. It shows vendor-hosted events, personal commitments, assignment due dates (school context), community events, and Learning Path milestones.
STATUS: BUILT
Component: src/components/explore/CalendarView.tsx | Related: EventCard.tsx, EventDetailPanel.tsx, EventDetailModal.tsx
Four layouts are available: Month View (default, traditional grid with color-coded dots), Week View (7-day horizontal with time slots), List View (chronological with infinite scroll), and Day View (hourly breakdown). Events are color-coded by type: blue for scheduled challenges, green for your commitments, orange for assignment due dates, purple for community events, gray for personal plans, and teal for Learning Path milestones.
Notifications (Explore-Specific)
| Event | Recipient | Channel | Timing |
|---|---|---|---|
| DC challenge timer expiring | User | In-app + Email | 24 hours before expiry |
| DC challenge auto-abandoned | User | In-app + Email | On expiry |
| Friend DC challenge received | Friend | In-app | Immediate |
| Group DC all completed | All participants | In-app | On last completion |
| Bucket List challenge price drop | User | In-app | On price change |
| New challenge in favorite category | User | Weekly digest | Weekly |
| DC cooldown ended | User | In-app | On cooldown expiry |
Roles and Permissions
All roles can browse the Explore page, search challenges, use filters, pin views (max 5), use Map View, and use Calendar View.
Restricted actions:
| Action | Who Can | Who Cannot |
|---|---|---|
| Save to Interesting / Bucket List | All roles except Tier 1 students | Tier 1 students (school-only accounts) |
| Full Dealer's Choice (1.5x/2.0x multipliers) | All users aged 13+ | Under-13 users, Tier 1 students |
| Practice Dealer's Choice (1.25x, no penalties) | Under-13 users only | Users 13+ (they get Full DC) |
| View analytics and manage views | Platform Admin only | All other roles |
Key Constraints
- Tier 1 students (school-only accounts): Cannot save to Interesting or Bucket List. Practice DC only. Content strictly filtered for school-appropriateness.
- Under-13 users: Practice Dealer's Choice only. No negative XP. Minimal browsing behavior tracking (interests + completions only). Recommendations filtered for age-appropriateness.
- Under-13 Tier 2: Parent notification sent on event registration; parent can cancel.
- All users: Recommendation signals stored only for active accounts. Deleted with account on request. No cross-platform tracking. No third-party recommendation services.
Data Model Summary
The Explore & Discovery system spans 17 PostgreSQL tables (all IDs are UUIDs, all timestamps in UTC). Key table groups:
- Saved lists:
interesting_list_items,bucket_list_items,bucket_list_settings,bucket_list_permissions-- bookmarking and save-for-later with per-user privacy controls - Views:
curated_views(family, slug, selection logic),view_library_pins(max 5 per user),view_analytics(opens, pins, conversions) - Preferences:
user_interest_preferences(per-category interest levels),user_explore_preferences(difficulty, budget, novelty),user_interest_profiles(computed recommendation profile) - Dealer's Choice:
dealers_choice_rounds(cards dealt, selected card, multiplier, status, cooldown),group_dc_events,dc_leaderboard_monthly - Location:
challenge_locations(lat/lng indexed for spatial queries, geocoded at creation time) - Search & Recommendations:
challenge_quality_scores(pre-computed daily),recommendation_feeds(cached per user),search_analytics,impression_tracking(suppresses after 5 impressions without interaction)
Implementation Notes
The frontend implementation spans the Zustand store (useExploreStore), typed models (explore.types.ts with ViewFamily, CuratedView, SavedItem, SearchSuggestion, DealersChoiceResult), a mock API (explore.api.ts) with a real API stub (explore.real.api.ts), 5 page components, and 16 explore-specific components. The store uses typed selectors (selectCuratedViews, selectSavedList, selectDealersChoice) and manages the saved list with a Set<string> for O(1) bookmark lookups. Filter placement adapts to the active theme configuration.
Caching strategy (planned for production): User recommendation feeds pre-computed hourly per user. Popular/trending/new feeds pre-computed daily and cached globally. Search results cached by query + filters with a 5-minute TTL. Challenge quality scores computed in a daily batch job.
Cross-References
- Challenge System: Challenge detail pages, Track Records, verification workflow, challenge lifecycle
- Gamification: XP system, levels, badges, streaks, Learning Paths -- how DC multipliers and penalties integrate with the broader XP economy
- Communities: Community Bucket List feeds, community DC events, social views in the View Library, Discover Communities view
Spec Reference
This page is derived from:
- Doc 4: Explore Page & Discovery -- Sections 1-11 (full document)
- Screen Descriptions: Features -- Section 1 (Explore page layout) and Section 7 (Map View)