Skip to content

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.


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:

SignalWeightDetails
Text relevance40%How well the query matches title, description, and tags. Title exact matches get the highest boost. Phrase matching ranks higher than individual word matching.
Popularity20%Normalized score based on completions, saves, starts, and views. Weighted toward completions. Decayed over time so recent popularity matters more.
Quality20%Average rating (weighted by number of ratings), completion rate, and Track Record media richness.
Freshness10%Newer challenges get a slight boost that decays over 30 days. Recently updated challenges get a smaller boost.
Personalization10%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

DimensionOptionsUI Control
Category6 parent categories with 27 subcategories (Outdoor Adventure, Decorative Arts & Crafts, Cooking & Nutrition, etc.). Multi-select.Checkbox dropdown
DifficultyBeginner, Intermediate, Advanced. Multi-select.Checkbox group
CostFree, Under $25, Under $50, Under $100, $100+. Multi-select.Checkbox group
Solo / GroupSolo, Group, Both. Multi-select.Checkbox group
Age RangeMinimum and maximum age sliders.Dual-handle range slider
Fulfillment TypeKit, Hosted, Digitally Guided, Free (no fulfillment). Multi-select.Checkbox group
DurationUnder 1 hour, 1-3 hours, Half day, Full day, Multi-day, Multi-week. Multi-select.Checkbox group
LocationIndoor, 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 (exploreFilterPlacement in 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.

ViewLogic
Best FitPrimary 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.
RecommendedChallenges recommended to you by friends, family, and community members via the Recommend flow.
Continue Your JourneyChallenges in Series you have already started -- shows the next challenge in the series.
Bucket ListChallenges that align with your Bucket List items.
Matched to Your ProfileChallenges popular among users with similar interest profiles (collaborative filtering).

Discover Family

Curated views for exploration and pushing boundaries.

ViewLogic
Dealer's ChoiceGamified random selection. See Dealer's Choice for the full specification.
Uncharted TerritoryChallenges exclusively from subcategories and types you have NOT selected when setting Best Fit parameters. Excludes completed and in-progress challenges. Maximizes novelty.
Expert PicksStaff-curated editorial selections, rotated periodically. Each pick includes a short editorial blurb.
Hidden GemsHigh-rated challenges with low completion counts. Surfaces quality content that has not gone viral.
Level UpChallenges one difficulty level above your most commonly completed difficulty.

Social Family

Views driven by community and platform-wide activity.

ViewLogic
My CommunitiesDynamic 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 MonthPlatform-wide. Challenges with the highest completion count in the current calendar month.
TrendingChallenges with the steepest increase in starts over the past 7 days.
Rising StarsRecently approved challenges gaining traction quickly (ratio of completions to age).
Top RatedChallenges whose Track Records have the highest average thumbs-up counts.
Discover CommunitiesNot 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.

ViewLogic
New This WeekChallenges approved within the last 7 days.
Just AddedChallenges approved within the last 24 hours. May be empty on slow days.
SeasonalStaff-curated seasonal collections (summer outdoor, holiday crafts, back-to-school). Rotated quarterly.
Limited TimeChallenges with a defined availability window (hosted event on a specific date, seasonal vendor offering).
Recently UpdatedChallenges that have been edited or refreshed since you last viewed them.

Practical Family

Utility-driven views for users with specific constraints.

ViewLogic
Free OnlyAll challenges where cost is free.
Quick WinsChallenges with estimated duration under 1 hour.
Practical Skills for AgeChallenges tagged as Practical Skills & Preparedness, filtered to your age range.
Online OnlyDigitally Guided challenges requiring no physical materials or venue.
Kit RequiredChallenges with fulfillment type = kit.
Under $X BudgetYou set a budget threshold; shows all challenges at or below that price. Budget persists in settings.
Solo ChallengesChallenges where solo/group = solo or both.
Group ChallengesChallenges where solo/group = group or both.
Near MeMap-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

SignalWeightHow It's Used
Interest categoriesHigh (primary signal)User's selected interests during onboarding. Updated from settings.
Past completionsHighAvoids showing challenges already completed. Favors categories and difficulty levels the user has demonstrated interest in.
AgeHard filter + medium boostFilters out age-inappropriate challenges. Boosts challenges in the user's exact age range.
Difficulty progressionMediumIf a user has completed 3 Beginner challenges in a category, Intermediate challenges in that category get boosted.
Cost preferencesLow-MediumInferred from behavior: if you mostly start free challenges, the system does not heavily feature $100+ challenges.
Category diversityMediumMixes familiar categories with adjacent/unexplored categories. Avoids over-indexing on one category.
Challenge qualityLow-Medium (tiebreaker)Completion rate, Track Record quality (thumbs-up counts), and editorial rating.
RecencyLowSlight 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

  1. 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.
  2. Cards revealed: 4 cards appear face-down, then flip over with a short animation.
  3. 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.
  4. 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.
  5. 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 TypeWeightWhat It MeansVisual
Uncharted34%Subcategories you have NEVER tried or tried much less than your averageDistinct visual badge labeled "Uncharted"
Less Commonly Tried33%Subcategories you have tried somewhat-to-much less than your averageStandard card styling
Comfort Zone Push33%Categories you do regularly but at a higher difficulty levelLabeled "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 TypeXP MultiplierExample
Comfort Zone Push1.5xBase 100 XP becomes 150 XP
Less Commonly Tried1.5xBase 100 XP becomes 150 XP
Uncharted2.0xBase 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 TypePenalty
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 TypeCompletion Window
Standard challenges1 year from selection
Seasonal challenges2 years from selection (allows the relevant season to come around again)
Long-duration challengesCustom 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

RuleDetail
Maximum 3 simultaneous DC challengesYou cannot have more than 3 active Dealer's Choice challenges at once. Complete or abandon one before starting another.
7-day cooldown after abandonmentAfter abandoning a DC challenge, you cannot "Deal Me In" for 7 days. This prevents rapid deal-abandon-redeal cycles.
Re-deal limitExactly 1 re-deal per round. No exceptions.
No cherry-pickingYou 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:

AspectPractice DC (Under 13)Full DC (13+)
XP multiplier1.25x for all card types1.5x / 1.5x / 2.0x
Abandonment penaltyNone (XP cannot go negative for minors)Full symmetric penalty
UI label"Practice DC""Dealer's Choice"
Card selectionSame algorithm but strictly filtered for age-appropriatenessFull algorithm
ConstraintsSame max 3, same re-deal rulesSame

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 = hosted or location_type = specific_venue by 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:

ElementDetails
Cover imageFills the top of the card with a fixed aspect ratio of approximately 3:2
TitleTruncated to 2 lines
Category badge(s)1-2 category labels shown as colored badges
Difficulty indicatorText label plus a visual indicator (color dot or icon): Beginner, Intermediate, Advanced
Cost"Free" badge (green) or a price like "$24.99"
Bookmark iconToggles the Interesting List. Outline when not saved, filled when saved. Single click toggles without navigating away.
Completion countSmall 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

BreakpointColumns
Desktop3-4 columns
Tablet2 columns
Mobile1 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:

  1. See challenge on Explore page. Click bookmark icon -- saved to Interesting List.
  2. Review Interesting List later. Move challenge to Bucket List (intent confirmed).
  3. Ready to start. Click "Start" from Bucket List -- challenge moves to In Progress, Track Record created.
  4. Complete and document. Build Track Record entries offline. Submit for verification.
  5. 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)

EventRecipientChannelTiming
DC challenge timer expiringUserIn-app + Email24 hours before expiry
DC challenge auto-abandonedUserIn-app + EmailOn expiry
Friend DC challenge receivedFriendIn-appImmediate
Group DC all completedAll participantsIn-appOn last completion
Bucket List challenge price dropUserIn-appOn price change
New challenge in favorite categoryUserWeekly digestWeekly
DC cooldown endedUserIn-appOn 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:

ActionWho CanWho Cannot
Save to Interesting / Bucket ListAll roles except Tier 1 studentsTier 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 onlyUsers 13+ (they get Full DC)
View analytics and manage viewsPlatform Admin onlyAll 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:

DoCurious Platform Documentation