Google Discover Architecture
Google Discover is not search. Users do not type queries. The system predicts what content a user wants to see based on behavioral signals, entity interests, and real-time events. This documentation is derived from analysis of 87,498 decompiled classes from the Google app's Android APK.
Methodology
How This Research Was Conducted
Metehan decompiled the Google app (Android APK) and analyzed 87,498 Java/Kotlin classes related to content surfacing, feed ranking, and personalization. The findings below are based on code structure, class names, method signatures, protobuf definitions, and gRPC endpoint analysis -- not speculation.
The 8-Stage Content Pipeline
Content moves through 8 stages before appearing in a user's Discover feed:
Stage 2: Metadata Parsing Hierarchy
Discover parses content metadata in a strict priority chain. If the preferred source is missing, it falls through to the next.
Title Resolution
| Priority | Source | Notes |
|---|---|---|
| 1 | og:title | Open Graph title tag |
| 2 | <title> | HTML title element |
| 3 | headline (schema) | Article structured data |
| 4 | First H1 on page | Fallback extraction |
Author Resolution
| Priority | Source | Notes |
|---|---|---|
| 1 | author (schema) | Article or Person schema |
| 2 | article:author (OG) | Open Graph author meta |
| 3 | Byline extraction | Pattern matching in page content |
| 4 | Domain name | Final fallback |
Image Resolution
| Priority | Source | Notes |
|---|---|---|
| 1 | og:image | Must be >= 1200px wide |
| 2 | image (schema) | Article schema image |
| 3 | First large image in content | Minimum dimension requirements |
| 4 | No image | Card displays without visual (severely penalized in feed ranking) |
Image Requirements
Discover strongly favors content with high-quality images >= 1200px wide. Content without images receives significantly lower placement in the feed. Use og:image with proper dimensions on every article.
Stage 3: Paywall Classification
Discover classifies every article into one of three access tiers:
| Classification | Definition | Feed Treatment |
|---|---|---|
| Free | No paywall detected | Normal ranking |
| Metered | Limited free articles, then paywall | Shown with "X free articles remaining" indicator |
| Locked | Full paywall, no free access | Deprioritized unless user has subscription signals |
The system detects paywalls through:
isAccessibleForFreeschema property- JavaScript-based paywall detection patterns
- Response header analysis
- Historical click-through and bounce rate patterns (locked content = high bounce)
Stages 4-5: Two-Level Filtering
Collection Filtering (Stage 4)
Collections are broad topic categories (Sports, Technology, Entertainment, etc.). A piece of content is first assigned to one or more collections based on entity and topic analysis. Collection-level filters remove:
- Content from blocked domains (spam, policy violations)
- Duplicate content (same story from multiple sources)
- Content that does not match any collection the user has shown interest in
Entity Filtering (Stage 5)
Entity-level filtering is more granular. Each piece of content is associated with specific entities (people, organizations, products, events). Entity filters remove:
- Content about entities the user has explicitly muted
- Content about entities with no engagement history
- Content about entities that have been "tombstoned"
Tombstoning System
Tombstoning is Discover's mechanism for removing stale or problematic content from the feed without deleting it from the index.
A content card is tombstoned when:
- The source URL returns a 404 or redirect
- The content has been significantly modified after initial indexing
- A manual action or policy violation is applied
- Engagement metrics fall below minimum thresholds after initial serving
Tombstoned content is not deleted -- it is flagged as ineligible for feed inclusion. It can be "un-tombstoned" if the underlying issue is resolved.
Stage 6: NAIADES Personalization
NAIADES is Google's personalization engine for Discover. It evaluates user interest across 8 subtypes:
| Subtype | What It Measures | Signal Source |
|---|---|---|
| Explicit Interest | Topics the user explicitly followed | Google app settings, Search history |
| Implicit Interest | Topics inferred from behavior | Browsing history, app usage, location |
| Trending Interest | Rapidly growing topics in user's graph | Social signals, search volume spikes |
| Seasonal Interest | Recurring time-based interests | Historical engagement by month/season |
| Local Interest | Location-based relevance | GPS, IP, location history |
| Social Interest | Topics popular in user's social graph | Contacts, shared content, group memberships |
| Professional Interest | Work-related topics | LinkedIn signals, work app usage, business hours browsing |
| Entertainment Interest | Leisure content preferences | YouTube history, streaming app data, weekend browsing |
Each subtype generates a score per entity/topic, and these scores are combined to determine overall user-content relevance.
13 Cluster Types
Discover groups content into clusters -- sets of related articles about the same topic or event. There are 13 cluster types:
| # | Cluster Type | Example | Card Format |
|---|---|---|---|
| 1 | Breaking News | Major world event | Full-width card, multiple sources |
| 2 | Developing Story | Ongoing news story with updates | Timeline card |
| 3 | Evergreen Topic | "How to invest in index funds" | Standard card |
| 4 | Product Launch | New iPhone announced | Product card with specs |
| 5 | Sports Event | Live game or match | Score card with live updates |
| 6 | Entertainment | Movie release, TV show | Media card with trailer |
| 7 | Local News | City-level event | Location-tagged card |
| 8 | Weather Event | Storm, extreme weather | Alert card |
| 9 | Financial Event | Market movement, earnings | Data card with charts |
| 10 | Science/Research | New study published | Citation card |
| 11 | How-To/Tutorial | Step-by-step content | List card |
| 12 | Opinion/Analysis | Commentary on trending topic | Author-focused card |
| 13 | Visual Story | Photo essay, infographic-heavy | Gallery card |
Freshness Bucketing Logic
Discover assigns each piece of content to a freshness bucket that determines its eligibility window in the feed.
| Bucket | Age | Treatment | Best For |
|---|---|---|---|
| Real-time | 0-4 hours | Highest priority, pushed to interested users | Breaking news, live events |
| Fresh | 4-24 hours | High priority, standard feed inclusion | News, timely content |
| Recent | 1-3 days | Moderate priority, competes on engagement | Analysis, reactions |
| Current | 3-7 days | Lower priority, needs strong engagement signal | Evergreen-ish content |
| Evergreen | 7-30 days | Lowest priority, only resurfaces on strong user match | Tutorials, guides |
| Archived | 30+ days | Not shown unless directly relevant to trending topic | Historical reference |
Freshness is Not Just Date
Discover uses datePublished, dateModified, HTTP Last-Modified headers, AND content-level freshness signals (new data points, updated statistics, current year references) to determine freshness. Changing the date without changing the content does not fool the system.
Beacon Push System
For time-sensitive content types, Discover uses a "beacon" push system that bypasses normal feed assembly.
Sports Beacons
- Triggered by live game events (goals, touchdowns, set wins)
- Pushed to users with demonstrated interest in the specific team/player
- Include real-time score data
- Override normal freshness bucketing
Finance Beacons
- Triggered by significant market movements (>2% index change, earnings surprises)
- Pushed to users with portfolio or market tracking behavior
- Include price data and change percentages
- Time-limited (expire after market close or next trading session)
Real-Time Feed Architecture (6 gRPC Endpoints)
Discover's feed is served through 6 gRPC endpoints, each handling a different aspect of feed assembly:
| Endpoint | Function | Latency Target |
|---|---|---|
/feed.GetFeedItems | Primary feed content retrieval | <200ms |
/feed.GetClusterUpdate | Real-time updates to existing clusters | <100ms |
/feed.GetBeaconPush | Time-sensitive push notifications | <50ms |
/feed.ReportEngagement | User engagement telemetry (clicks, dwell, dismissals) | Fire-and-forget |
/feed.UpdatePreferences | User preference changes (follow, mute, hide) | <150ms |
/feed.GetFeedConfig | Client-side configuration (card layouts, feature flags) | Cached, <500ms |
Publisher Recommendations
Content That Performs in Discover
High-quality images are mandatory. Use
og:imagewith images >= 1200px wide on every article. Content without images is severely penalized.Write compelling titles in
og:title. Discover pulls fromog:titlefirst. This is your headline in the feed. Make it specific and engaging without being clickbait.Publish consistently. Discover's personalization engine builds stronger entity associations with publishers who produce regular content on consistent topics.
Match content to entity clusters. Write about specific entities (people, products, organizations) rather than vague topics. Discover's entity filtering is more powerful than its topic filtering.
Use Article schema with all fields populated.
datePublished,dateModified,author,image,headline-- every field gives Discover more metadata to work with.Do not fake freshness. Updating
dateModifiedwithout changing content is detectable and will hurt trust signals.Earn Tier 1 engagement. Dwell time > 60 seconds is the threshold for highest engagement scoring. Deliver value fast but make content worth reading fully.
Monitor tombstoning. If your Discover traffic drops suddenly for a specific URL, check for 404s, redirects, or content modifications that may have triggered tombstoning.
The Discover Mindset
Discover is not search. You are not answering a query. You are predicting what someone wants to know before they ask. Write for entity-level interest matching, not keyword queries.