Skip to content

About

Your feed algorithm should belong to you. Rewrite it in one sentence and see exactly which weights changed — a transparent seven-signal ranking kernel over real public Bluesky posts.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

FeedKernel

Vibe-code the algorithm, not the argument. 用一句話改變排序目標,親眼看到演算法如何改變你的動態牆。

FeedKernel social preview

繁體中文 · English · Live demo


繁體中文

FeedKernel 是什麼?

FeedKernel 是一個為競賽打造的透明推薦系統 MVP。它不要求一般使用者撰寫程式,也不假設每個人一開始就知道自己想要什麼;使用者可以先看見具體貼文,再用一句日常語言調整排序,例如:

保留有力的不同意見,但減少人身攻擊,並提高有解釋理由的內容。

系統會把這句話轉換成一份可檢查的「排序食譜(Recipe)」修改。Recipe 目前包含從 X 公開 weighted scorer 選出的 19 種 action objectives、2 個 FeedKernel goals,以及作者多樣性控制;一般使用者不需要逐一操作,完整設定收在可展開的進階區。FeedKernel 會先顯示每個目標如何改變,再用完全相同的一批候選貼文重新排名。使用者可以比較修改前後、查看每篇貼文的實際計分、套用修改,或隨時復原。

FeedKernel 想解決的不是「如何讓每個人自己寫完整演算法」,而是更簡單的問題:

當使用者按下「我不喜歡」時,能不能清楚知道系統聽懂了什麼、改了什麼,以及自己的動態牆為什麼真的不同?

為什麼做這個?

現有社群平台通常讓使用者提供大量回饋,像是按讚、停留、分享、封鎖或「不感興趣」,但排序規則和回饋效果大多不可見。使用者可能知道自己按了什麼,卻不知道平台如何解讀,也無法確認內容是否真的因此改變。

另一個問題是:注意力不等於滿意。爭吵、憤怒和人身攻擊可能帶來更多回覆與分享,但短期互動數字不一定代表使用者長期喜歡這個空間。

FeedKernel 因此採用三個設計原則:

  1. 先給好用的預設模式:一般使用者不需要理解機器學習或修改程式碼。
  2. 讓回饋的效果立即可見:顯示權重差異、排名移動和忠實計分明細。
  3. 所有修改都可以復原與分享:排序目標不是永久黑盒設定,而是一份能檢查、重混和回滾的 Recipe。

60 秒競賽展示流程

  1. 選擇一個有明顯立場衝突的主題,例如「AI 與大學教育」或「言論自由」。
  2. FeedKernel 透過公開 Bluesky 搜尋載入最多 50 篇候選貼文,不需要登入。
  3. 先展示 X-style objective mix 排名。
  4. 輸入一句想要的改變,或選擇 Better debate、Informed、Fresh voices 等預設 Recipe。
  5. 檢查 objective-weight patch;此時尚未真的套用。完整的 21 個目標與作者多樣性可在進階控制中逐一查看及編輯。
  6. 比較前三名貼文在修改前與修改後的差異。
  7. 展開 Why this?,查看每個訊號對該篇排名的實際加分或扣分。
  8. 套用修改、分享 Recipe,或從歷史紀錄復原先前版本。

MVP 已完成的功能

功能 使用者看見什麼 目前如何實作
真實公開候選內容 四個爭議主題與原始貼文連結 Bluesky 公開搜尋 API
穩定的競賽備援 網路中斷時仍能完整展示 8 篇清楚標示的固定示範貼文
自然語言修改 一句話變成可讀的權重差異 本機、規則型 prompt compiler
多目標排名 相同貼文依不同目標重新排序 19 個 X action objectives、2 個 FeedKernel goals 與作者多樣性重排
Before / After 修改前後前三名直接並排 對相同候選集合計算兩次排名
忠實解釋 每個訊號的數值、權重與貢獻 直接顯示真正使用的計分 trace
精準回饋 減少同作者、降低 ragebait、提高證據 立即修改作者 affinity 或 Recipe 權重
Recipe 預設與分享 借用別人的排序方式再自行修改 帶版本的完整 Recipe URL;舊七權重連結會自動升級
歷史與復原 復原先前使用過的 Recipe 與作者偏好 schema-v4 瀏覽器 localStorage;相容 v3/v2 舊資料
響應式介面 桌面與行動裝置皆可操作 React 與自訂 CSS

X-style 多目標排名核心

xai-org/x-algorithm 目前公開的 Home Mixer 不是只看按讚數;Phoenix 會預測多種可能行為,weighted scorer 再把各項預測乘上權重。FeedKernel 採用這個公開結構中的 19 項 action signals 與作者多樣性概念,但把平台擁有的目標變成使用者可見、可修改、可分享與可復原的 Recipe。X 目前 scorer 還包含 quoted_vqv、click_dwell_time 與 not_dwelled 等欄位;本 MVP 沒有假裝自己已完整重製它們。

目標群組 目前包含 在 FeedKernel 中代表什麼
互動 Favorite、Reply、Retweet、Quote、Share 使用者可能主動回應或傳播內容
探索 Photo expand、Click、Profile click、Video quality view、Quoted-post click 使用者可能進一步打開內容或作者
深度與關係 Share via DM、Copy link、Dwell、Long dwell、Follow author 使用者可能花時間閱讀、分享或繼續追蹤
負面行為 Not interested、Block author、Mute author、Report 這些目標以負方向計分,預估後悔或排斥風險
FeedKernel extensions Freshness、Informed 讓使用者能明確追求新鮮內容或有來源、有解釋的閱讀
作者多樣性 Author diversity 同一作者重複出現時,逐步降低後續貼文分數

競賽 MVP 沒有執行 X 的 Phoenix/Grok 模型。app/feed-kernel.ts 會根據公開可觀察特徵,產生 0–100 的確定性 demo estimates;這些是可重現的 proxy,不是經過訓練與校準的個人行為機率。

簡化後的實際計分流程如下:

公開特徵
  → 21 個確定性 objective estimates
  → Σ(estimate × Recipe weight × 正負方向)
  → negative-score offset
  → repeated-author diversity multiplier
  → final ranking

公開特徵包含以 log1p 正規化的 likes/replies/reposts/quotes、相對新鮮度、連結/圖片/影片、文章長度、回覆狀態、作者偏好,以及明確標示為 heuristic 的 evidence 與 conflict scores。

Why this? 顯示的就是本次排名實際使用的 21 項貢獻、負分 offset 與作者多樣性倍率,不是事後由 AI 生成的解釋。

一句話如何變成 Recipe?

目前的 prompt compiler 是可預測的關鍵字規則,不會呼叫大型語言模型,也不會把使用者輸入傳到外部 AI 服務。

使用者意圖範例 可見的 Recipe 改變
「減少 ragebait 和人身攻擊」 提高 not-interested/block/mute/report 權重,降低 reply/quote,提高 informed
「保留辯論和不同意見」 提高 reply、quote 與 dwell
「多一點研究、資料和理由」 提高 informed、click、dwell、long dwell 與 copy-link
「我要熱門、正在爆紅的內容」 提高 favorite、retweet 與 share
「優先最新內容」 提高 freshness
「多看熟悉和信任的帳號」 提高 profile-click/follow-author,降低作者多樣性
「讓小帳號和新聲音有機會」 提高 freshness、follow-author 與作者多樣性,降低 favorite/retweet

這不是最終的自然語言理解方案。它的目的,是先測試「一句話 → 可見修改 → 排名差異 → 使用者同意或拒絕」這個互動是否容易理解。

真實資料與備援模式

瀏覽器會請求:

GET /api/debate-feed?q=AI%20university

伺服器端 API route 會:

  1. 同時取得 Bluesky 公開搜尋的 top 與 latest 結果;
  2. 合併並移除重複貼文;
  3. 排除太短、明確成人或圖像暴力標籤的內容;
  4. 保留英文或未標示語言的貼文;
  5. 最多回傳 50 篇候選內容;
  6. 附上公開互動數字與 Bluesky 原始貼文網址。

如果 Bluesky 或現場網路無法使用,前端會自動切換到固定的競賽資料。介面會清楚顯示 Demo backup,不會把示範內容假裝成即時貼文。

目前可選主題:

  • AI & university
  • AI regulation
  • Free speech
  • Climate policy

因為即時貼文屬於外部內容,每次載入的結果可能不同,也可能出現強烈或冒犯性的公開言論。這個基礎過濾不等於正式社群平台所需的完整安全與內容審核系統。

系統流程

flowchart LR
    A["公開 Bluesky 搜尋"] --> B["Server API route"]
    B --> C["最多 50 篇候選貼文"]
    D["使用者的一句話"] --> E["本機規則型 compiler"]
    E --> F["21-objective Recipe patch"]
    C --> G["Demo action estimator"]
    F --> G
    G --> K["Weighted scorer + 作者多樣性"]
    K --> H["Before / After"]
    K --> I["每篇貼文的實際計分 trace"]
    H --> J["套用、分享或復原"]
    I --> J
Loading

技術架構

  • 介面:React 19、TypeScript、Next.js App Router
  • 建置與執行:Vinext、Vite、Cloudflare-compatible worker output
  • 公開內容來源:Bluesky app.bsky.feed.searchPosts
  • 狀態保存:schema-v4 瀏覽器 localStorage;相容舊 v3/v2 資料與七權重分享連結
  • 樣式:自訂響應式 CSS
  • 測試:Node.js test runner;15 個 unit/API tests 與 2 個 server-render tests
  • 正式展示:Sites production deployment

主要檔案:

app/
├─ api/debate-feed/route.ts   # 公開 Bluesky 候選內容代理與基本過濾
├─ feed-kernel.ts             # Objective estimator、weighted scorer、diversity、Recipe 與 migration
├─ globals.css                # 完整視覺、元件與響應式樣式
├─ layout.tsx                 # Metadata 與社群預覽設定
└─ page.tsx                   # Presets、prompt patch、Before/After、trace、feedback 與 history
docs/
├─ concept.md                 # 目前實際執行的產品與技術 contract
└─ archive/                   # 早期決策與工作紀錄
public/
└─ og.png                     # GitHub/社群分享視覺
tests/
├─ debate-feed.test.ts        # 公開候選 API、過濾、去重與媒體資訊
├─ feed-kernel.test.ts        # Objectives、ranking、diversity、history 與 migration
└─ rendered-html.test.mjs     # Production render 與必要功能檢查

本機執行

需求:

  • Node.js >=22.13.0
  • npm
  • 能連線至 Bluesky 公開 API 的網路;沒有網路時仍能使用備援 Demo
git clone https://github.com/poopro/FeedKernel.git
cd FeedKernel
npm ci
npm run dev

開啟 http://localhost:3000。

目前不需要建立 .env,也不需要 Bluesky API token。

驗證

# ESLint
npm run lint

# TypeScript
npm run typecheck

# Production build + 17 tests
npm test

# Production dependency audit
npm run audit:prod

隱私與安全界線

  • MVP 沒有帳號、登入、社交圖譜或跨裝置追蹤。
  • Recipe、作者偏好和版本歷史只保存在目前瀏覽器;分享網址只包含可見的 Recipe 數值。
  • 使用者的 prompt 在瀏覽器內透過中英文規則處理,不會送到 AI 模型。
  • 公開 Bluesky 貼文會經過 FeedKernel server route,再傳給前端。
  • 「Evidence」只是可解釋的 ranking heuristic,不是事實查核。
  • 「Conflict」只是風險訊號,不應被當作正式審核或政治立場判斷。
  • 正式產品需要更完整的內容安全、申訴、偏誤檢查、資料同意和未成年人保護機制。

目前刻意沒有做的功能

這個版本的目標是驗證透明控制是否有價值,而不是在競賽前重建一個完整的 X 或 Threads。以下功能明確延後:

  • Kafka 與即時事件串流
  • 模型訓練
  • 數千個排名特徵
  • 完整的追蹤、停留、按讚、回覆、封鎖等使用者歷史
  • 登入與帳號系統
  • 發文、私訊與通知
  • 真正的 Threads/X 官方整合
  • 大規模候選檢索、推薦服務與線上實驗基礎設施

Roadmap

階段 目標 成功條件
現在:競賽 MVP 證明使用者看得懂「意圖 → 權重 → 排名」 能在 60 秒內完成一次有意義的修改並解釋差異
下一步:小型使用測試 測量滿意度、後悔感、控制感、內容多樣性與理解程度 使用者能預測修改方向,且願意保留或重混 Recipe
小型 Beta 加入帳號、經同意的行為歷史、跨裝置同步與社群 Recipe 發布 能安全重播版本,且不需每天手動調整
成長階段 事件串流、離線評估、模型訓練與更多候選來源 改善長期滿意與回訪,而不只增加點擊
平台階段 正式社群功能與允許的外部平台整合 通過安全、隱私、可擴展性與治理要求

應該如何評估成功?

FeedKernel 不把停留時間、無限捲動或單純互動數視為唯一答案。更重要的指標包括:

  • 使用者第一次產生有用自訂動態牆所需的時間;
  • 使用者是否理解權重改變會造成什麼結果;
  • 預覽後接受、繼續修改或取消 Recipe 的比例;
  • 使用者主觀感受到的控制程度;
  • 內容多樣性與重複 ragebait 的變化;
  • 使用後的滿意度、後悔感與長期回訪;
  • 畫面顯示的解釋是否忠實對應實際計分。

目前限制

  • 這不是 X、Threads 或 Bluesky 的正式推薦演算法。
  • 19 個 action values 是確定性 demo proxies,不是 Phoenix 預測的真實個人機率。
  • freshness 與 informed 是 FeedKernel extensions,不是 X Home Mixer 的 action names。
  • 沒有帳號歷史,因此作者 affinity 預設為中立,只能透過目前裝置的「減少此作者」回饋調整。
  • 關鍵字 compiler 無法理解所有句子,也可能錯過複雜語意。
  • 公開搜尋結果會隨時間改變,Demo 無法保證每次出現相同立場分布。
  • 熱門數字可能被操控,證據與衝突規則也可能產生誤判。
  • 目前尚未完成正式使用者研究,產品價值仍是一項待驗證假設。

參與方式

歡迎透過 GitHub Issues 提出:

  • 更容易理解的排序控制;
  • 能忠實解釋的其他訊號;
  • 使用者測試設計;
  • 安全、隱私或偏誤風險;
  • Recipe 分享與互通格式建議。

提交程式碼前,請先執行 npm run lint 和 npm test。

授權

FeedKernel 採用 Apache License 2.0。本專案參考 X 開源演算法的 action names、weighted-objective 結構與作者多樣性 scorer,來源、修改範圍及非官方聲明記錄於 THIRD_PARTY_NOTICES.md。


English

What is FeedKernel?

FeedKernel is a transparent recommendation-system MVP built for a competition. It does not ask ordinary users to write code or assume they can describe a perfect feed upfront. Instead, people react to concrete posts and describe a change in everyday language:

Keep strong disagreement, but reduce personal attacks and reward people who explain their reasoning.

FeedKernel compiles that sentence into an inspectable ranking Recipe containing 19 action objectives selected from X's public weighted scorer, two FeedKernel goals, and author-diversity control. Ordinary users do not need to edit them one by one; the full configuration lives in expandable advanced controls. FeedKernel shows the proposed changes before applying them, reranks the exact same candidates, and reveals the real score contribution behind each result. The user can compare, apply, share, or roll back the change.

The core question is not “Can everyone program a complete algorithm?” It is:

When someone clicks “I don't like this,” can the product show what it understood, what it changed, and why the feed is now meaningfully different?

Why build this?

Social platforms collect constant feedback—likes, dwell time, shares, blocks, and “not interested” actions—while keeping the interpretation and ranking effects mostly invisible. People know what they clicked, but rarely know what the system learned from it.

Attention is also not the same as satisfaction. Anger, conflict, and personal attacks can generate replies and shares without creating a space people value in the long term.

FeedKernel therefore follows three design principles:

  1. Useful defaults first: mainstream users should not need machine-learning knowledge or code.
  2. Visible consequences: show the weight patch, ranking movement, and faithful score trace.
  3. Reversible and shareable control: a ranking objective should be an inspectable, remixable Recipe—not a permanent hidden profile.

The 60-second competition demo

  1. Choose a contested topic such as AI in universities or free speech.
  2. Load up to 50 real public Bluesky posts without logging in.
  3. Start from the X-style objective mix ranking.
  4. Describe a change in one sentence, or choose Better debate, Informed, or Fresh voices.
  5. Inspect the objective-weight patch before anything is applied. All 21 objectives and author diversity remain individually inspectable and editable.
  6. Compare the top three posts before and after.
  7. Open Why this? to see every signal's actual scoring contribution.
  8. Apply the Recipe, share it, or restore an earlier version.

Implemented MVP features

Feature What the user sees Current implementation
Real public candidates Four debate topics and links to original posts Bluesky public search API
Reliable competition fallback A complete demo even when venue internet fails Eight clearly labelled fixed posts
Natural-language changes One sentence becomes a readable weight diff Local deterministic prompt compiler
Multi-objective ranking The same posts reordered by a new objective 19 X action objectives, two FeedKernel goals, and author-diversity reranking
Before / After Side-by-side top-three comparison Two rankings over one candidate set
Faithful explanations Signal value, weight, and score contribution The real execution trace
Targeted feedback Less from author, reduce ragebait, reward evidence Immediate affinity or Recipe update
Presets and sharing Borrow and remix a ranking approach Versioned full-Recipe URLs; old seven-weight links migrate automatically
History and undo Restore earlier Recipes and author preferences Schema-v4 browser localStorage, with v3/v2 migration
Responsive experience Desktop and mobile interaction React and custom CSS

The X-style multi-objective ranking kernel

The current public xai-org/x-algorithm Home Mixer does not rank from likes alone. Phoenix predicts multiple possible user actions, and the weighted scorer combines those predictions with weights. FeedKernel adopts 19 of those disclosed action signals plus the author-diversity concept while turning the platform-owned objective into an inspectable, editable, shareable, and reversible user Recipe. X's current scorer also includes fields such as quoted_vqv, click_dwell_time, and not_dwelled; this MVP does not pretend to be a complete reimplementation.

Objective group Included today What it represents in FeedKernel
Engagement Favorite, Reply, Retweet, Quote, Share Likely active responses or propagation
Exploration Photo expand, Click, Profile click, Video quality view, Quoted-post click Likely deeper opening of content or authors
Depth and relationship Share via DM, Copy link, Dwell, Long dwell, Follow author Likely reading, private sharing, or continued interest
Negative actions Not interested, Block author, Mute author, Report Negative score directions that proxy regret or rejection risk
FeedKernel extensions Freshness, Informed Explicit goals for newer or better-supported reading
Author diversity Author diversity Attenuates later posts when one author repeats

The competition MVP does not run X's Phoenix/Grok model. app/feed-kernel.ts produces deterministic 0–100 demo estimates from public observable features. These values are reproducible proxies, not trained or calibrated personal-action probabilities.

The actual scoring flow is:

public features
  → 21 deterministic objective estimates
  → Σ(estimate × Recipe weight × direction)
  → negative-score offset
  → repeated-author diversity multiplier
  → final ranking

Public features include log1p-normalized likes, replies, reposts, and quotes; relative recency; link, image, video, length, and reply state; author preference; and explicitly heuristic evidence and conflict scores.

The “Why this?” panel shows the 21 real contributions, negative-score offset, and author-diversity multiplier used by the ranking call. It is not a post-hoc AI explanation.

How does a sentence become a Recipe?

The current compiler uses predictable keyword rules. It does not call an LLM and does not send the user's prompt to an external AI service.

Example intent Visible Recipe change
“Reduce ragebait and personal attacks” Raise not-interested/block/mute/report weights, lower reply/quote, raise informed
“Keep debate and disagreement” Raise reply, quote, and dwell
“More research, data, and reasoning” Raise informed, click, dwell, long dwell, and copy-link
“Show popular and viral posts” Raise favorite, retweet, and share
“Prioritize the newest posts” Raise freshness
“Show trusted and familiar accounts” Raise profile-click/follow-author and lower author diversity
“Give small accounts and fresh voices a chance” Raise freshness, follow-author, and diversity; lower favorite/retweet

This is not the final natural-language system. It exists to test whether the interaction loop—sentence → visible patch → ranking difference → approve or reject—is understandable and valuable.

Live data and fallback behavior

The browser requests:

GET /api/debate-feed?q=AI%20university

The server route:

  1. requests both top and latest results from public Bluesky search;
  2. merges and deduplicates posts;
  3. removes very short items and explicitly labelled adult or graphic media;
  4. keeps English or language-unspecified posts;
  5. returns at most 50 candidates;
  6. includes public engagement counts and original Bluesky permalinks.

If Bluesky or the venue network is unavailable, the UI automatically uses a fixed competition dataset and labels every item Demo backup. It never presents backup content as live data.

Available topics:

  • AI & university
  • AI regulation
  • Free speech
  • Climate policy

Live posts are external content, so results can change and may include strong or offensive public speech. The MVP filter is not a substitute for a production trust-and-safety system.

System flow

flowchart LR
    A["Public Bluesky search"] --> B["Server API route"]
    B --> C["Up to 50 candidate posts"]
    D["One user sentence"] --> E["Local rule-based compiler"]
    E --> F["21-objective Recipe patch"]
    C --> G["Demo action estimator"]
    F --> G
    G --> K["Weighted scorer + author diversity"]
    K --> H["Before / After"]
    K --> I["Real per-post scoring trace"]
    H --> J["Apply, share, or restore"]
    I --> J
Loading

Technical architecture

  • UI: React 19, TypeScript, Next.js App Router
  • Build and runtime: Vinext, Vite, Cloudflare-compatible worker output
  • Public content: Bluesky app.bsky.feed.searchPosts
  • Persistence: schema-v4 browser localStorage, with v3/v2 and old seven-weight link migration
  • Styling: custom responsive CSS
  • Testing: Node.js test runner; 15 unit/API tests and two server-render tests
  • Hosted demo: Sites production deployment

Key files:

app/
├─ api/debate-feed/route.ts   # Public Bluesky proxy and basic filtering
├─ feed-kernel.ts             # Objective estimator, weighted scorer, diversity, Recipe, and migration
├─ globals.css                # Visual system and responsive styles
├─ layout.tsx                 # Metadata and social preview configuration
└─ page.tsx                   # Presets, prompt patch, before/after, trace, feedback, and history
docs/
├─ concept.md                 # Current product and technical contract
└─ archive/                   # Earlier decisions and work logs
public/
└─ og.png                     # Repository and social preview visual
tests/
├─ debate-feed.test.ts        # Public candidate API, filtering, dedupe, and media data
├─ feed-kernel.test.ts        # Objectives, ranking, diversity, history, and migration
└─ rendered-html.test.mjs     # Production render and feature checks

Run locally

Requirements:

  • Node.js >=22.13.0
  • npm
  • network access to the public Bluesky API; the fallback demo still works offline
git clone https://github.com/poopro/FeedKernel.git
cd FeedKernel
npm ci
npm run dev

Open http://localhost:3000.

No .env file or Bluesky API token is currently required.

Verify

# ESLint
npm run lint

# TypeScript
npm run typecheck

# Production build + 17 tests
npm test

# Production dependency audit
npm run audit:prod

Privacy and safety boundaries

  • The MVP has no accounts, login, social graph, or cross-device tracking.
  • Recipe versions and author preferences remain in the current browser; shared URLs contain only visible Recipe values.
  • User prompts are processed by local English and Traditional Chinese rules and are not sent to an AI model.
  • Public Bluesky posts pass through the FeedKernel server route before reaching the UI.
  • “Evidence” is an explainable ranking heuristic, not fact-checking.
  • “Conflict” is a risk signal, not production moderation or a political judgment.
  • A real product would need stronger content safety, appeals, bias testing, consent, privacy, and youth-protection systems.

Deliberately out of scope

This version tests transparent control; it does not pretend to rebuild X or Threads before the core interaction is validated. The following are explicitly deferred:

  • Kafka and real-time event streaming
  • model training
  • thousands of ranking features
  • complete follow, dwell, like, reply, and block histories
  • login and account management
  • posting, private messages, and notifications
  • official Threads or X integration
  • large-scale retrieval, recommendation serving, and online experimentation

Roadmap

Stage Goal Success condition
Now: competition MVP Prove people understand intent → weights → ranking A meaningful change can be made and explained in 60 seconds
Next: small user study Measure satisfaction, regret, control, diversity, and comprehension People can predict the direction of changes and choose to keep or remix a Recipe
Small beta Add accounts, consented behavior history, cross-device sync, and community Recipe publishing Versions replay safely without daily manual tuning
Growth Add event streaming, offline evaluation, model training, and more candidate sources Improve long-term satisfaction and return—not only clicks
Platform Add social features and permitted external-platform integrations Meet safety, privacy, scalability, and governance requirements

How should success be measured?

FeedKernel does not treat time spent, endless scrolling, or raw engagement as the only answer. More useful measures include:

  • time to the first useful customized feed;
  • whether people understand the consequences of a weight change;
  • the share of previews accepted, revised, or rejected;
  • perceived control;
  • content diversity and repeated-ragebait reduction;
  • satisfaction, regret, wellbeing, and long-term return;
  • whether displayed explanations faithfully match the actual score.

Current limitations

  • This is not the official recommender of X, Threads, or Bluesky.
  • The 19 action values are deterministic demo proxies, not real personal probabilities predicted by Phoenix.
  • freshness and informed are FeedKernel extensions, not X Home Mixer action names.
  • Without account history, author affinity is neutral until adjusted by device-local “less from this author” feedback.
  • The keyword compiler cannot understand every sentence or complex intent.
  • Public search results change over time and may not contain a balanced set of positions.
  • Engagement counts can be manipulated; evidence and conflict rules can misclassify posts.
  • Formal user research has not yet been completed, so the product value remains a testable hypothesis.

Contributing

GitHub Issues are welcome for:

  • easier-to-understand ranking controls;
  • additional signals that remain faithfully explainable;
  • user-study designs;
  • safety, privacy, or bias risks;
  • Recipe sharing and interoperability.

Before submitting code, run npm run lint and npm test.

License

FeedKernel is licensed under Apache License 2.0. The project references X's open action names, weighted-objective structure, and author-diversity scorer. Provenance, modifications, and the non-endorsement boundary are documented in THIRD_PARTY_NOTICES.md.

About

Your feed algorithm should belong to you. Rewrite it in one sentence and see exactly which weights changed — a transparent seven-signal ranking kernel over real public Bluesky posts.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages