Skip to content

Ray Cloud

The Ray Cloud (/ray) visualises the tag ecosystem as an interactive graph. Tag size and weight reflect each tag's score — tags used in high-performing lenses, threads, and battles grow larger over time.

What are tags (Rays)?

Tags categorise lenses, threads, and battles. They drive:

  • Discovery feeds — content surfaces under the tags you follow.
  • Trending — high-score tags bubble up on the Ray Cloud and in explore surfaces.
  • Tag leaderboard — tags compete for ranking based on cumulative score.

Tags appear as clickable badges throughout the app. Click any badge to open that tag's detail page, which shows all content published under it.

How tag scores accumulate

  1. A lens, thread, or battle is published with one or more tags.
  2. Reactions on that content (likes, saves, forks, shares) increment the tag's score.
  3. Battle wins attributed to lenses carrying the tag add a larger score bump.
  4. Score decays slowly over time so that recently active tags rank above dormant ones.

The algorithm weights recency and engagement quality — a tag with 10 highly-reacted pieces outranks one with 100 low-engagement pieces.

Following a tag

Click any tag badge → Follow. Followed tags:

  • Personalise your For You feed on the home page.
  • Are listed under your profile's followed tags.
  • Can be unfollowed at any time from the same badge or from your settings.

Ray Cloud visualisation

The /ray page renders tags as a force-directed node graph. Larger nodes = higher score. Clicking a node navigates to that tag's detail page.

Language-based suggestions

Every Lens and Thread is stored with a language_code (ISO 639-1, default en). Each lenser profile holds a preferred language in their settings. These two values interact across all discovery surfaces to surface relevant-language content first.

How your language preference is set

Go to Settings → Language to change your preferred language. The value is stored in lensers.preferences.language and used automatically in every personalised feed.

The trending Lenses and Threads feeds accept an optional lang filter. When a language is specified, content whose language_code matches receives a 1.5× multiplier applied to its raw hot_score before ranking:

ranked_score = hot_score × (language_code = p_lang ? 1.5 : 1.0)

This does not hide non-matching content — it promotes matching content within the same ranked list.

Personalised feeds (For You)

The For You feed computes a personal_score from four weighted signals:

SignalWeightSource
Tag interest (followed tags)0.30lensers.tag_follows
Language match0.25lensers.preferences.language vs entity_translations.language_code
Author follow0.25lensers.relationships
Reaction recency0.20content.reactions

Language contributes 0.25 out of 1.0, so it meaningfully shapes ranking but does not dominate over tag interest or social graph.

Tag search and tag cloud

Tag search (fn_tags_search) and the tag stats list (list_tags_stats) both accept a lang parameter (default en). Results are joined to content.tag_translations by language_code, so tag names and descriptions are returned in your language when a translation exists, falling back to the original language otherwise.

The Ray Cloud visualisation at /ray inherits the same language-aware tag data — node labels render in your locale when a translation is available.

Lens and Thread language at publish time

When a Lens is created (lenses.fn_lens_create), the p_language_code parameter determines the language_code stored in content.entity_translations for the original translation. Threads follow the same polymorphic pattern via entity_translations (entity_type = 'thread'). Only the original translation row (is_original = true) feeds the suggestion ranking; machine-translated variants are available for display but are not scored separately.

Summary

SurfaceLanguage mechanism
Trending Lenses / Threads1.5× hot_score multiplier
For You feed0.25 component of personal_score
Tag searchtag_translations join by language_code
Ray Cloud labelsTag translation fallback chain
Lens / Thread authoringlanguage_code stored on entity_translations at publish time