Back to Projects
Outside Inc.Full Stack Engineer2024

Activity Feed

A social activity aggregator that unifies content from 10+ data sources into a cohesive feed experience across all Outside brands.

Next.jsTypeScriptTailwindCSSGraphQLTanStack QueryTiptap
Activity Feed

The Challenge

Outside Inc. wanted to create a unified social experience that aggregates content from across its ecosystem. The activity feed needed to combine:

  • Editorial articles from 20+ brands
  • User-generated posts and photos
  • Athletic event registrations and results
  • Trail conditions from Trailforks
  • GPS tracks from Gaia GPS
  • Videos from the Watch platform
  • Pinkbike mountain biking content

The challenge was building a feed that feels cohesive despite the diversity of content sources, while supporting social features like follows, reactions, and comments.

Architecture

The Activity Feed aggregates data from multiple sources through the Apollo Federation Gateway:

┌─────────────────────────────────────────────────────────────┐
│                      Activity Feed                           │
│                     (Next.js App)                            │
└─────────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────┐
│                Apollo Federation Gateway                     │
└─────────────────────────────────────────────────────────────┘
   │         │         │         │         │         │
   ▼         ▼         ▼         ▼         ▼         ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│Editorial│ │JWPlayer│ │  User  │ │Athlete │ │ Gaia   │ │Trailforks
│Subgraph│ │Subgraph│ │ Posts  │ │  Reg   │ │  GPS   │ │   API  │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘
Data Sources

Technical Approach

Unified Content Model

All content types implement a common interface for consistent rendering. This abstraction allows the feed to render diverse content types—articles, user posts, events, tracks, and videos—with consistent UI patterns while maintaining type-specific fields and behaviors.

Feed Composition

The feed uses a compound component pattern for flexibility, allowing each feed item to be composed of modular pieces: author information, content (which varies by type), and action buttons for reactions, comments, and sharing.

User-Generated Content

The UGC system supports rich text posts with @mentions and media uploads. A Tiptap-based editor provides the composition experience, supporting formatted text, user mentions, images, and links.

Social Graph

The follow system supports multiple profile types including users, authors, brands, and creators. Users can follow any profile type to customize their feed content and see updates from people and brands they care about.

Data Fetching Strategy

TanStack Query manages data fetching with infinite scroll support. The feed uses cursor-based pagination with optimistic UI updates for reactions and comments, ensuring the interface feels responsive even during network operations.

Key Features

Multi-Brand Support

The feed adapts to each brand's visual identity through CSS custom properties, allowing the same component code to render appropriately styled content across all Outside properties.

Privacy Controls

Users control the visibility of their posts with options for public, followers-only, or private visibility. The feed respects these settings when determining what content to show each viewer.

Content Moderation

Posts are filtered based on moderation status, with appropriate handling for hidden or flagged content while always showing users their own posts.

Trail Integration

Trailforks data provides trail conditions, difficulty ratings, and ride statistics, giving outdoor enthusiasts context about where activities took place.

Outcomes

The Activity Feed successfully:

  • Unified disparate content — 10+ data sources rendered in a cohesive experience
  • Enabled social features — Follows, reactions, and comments across all content types
  • Scaled across brands — Single implementation serves all Outside properties
  • Improved engagement — Users spend more time exploring related content
  • Supported UGC — Community members contribute their own stories and experiences

The feed now serves as the homepage experience for Outside properties, providing a personalized view of outdoor content tailored to each user's interests and activities.