Oksskolten Oksskolten

The AI-native
RSS reader

Every article, full text, by default. Zero config. Self-hosted, one container, zero subscription.

Full Text, Zero Config

Every article is fetched from its source, cleaned with Readability + 500 patterns, and stored as Markdown. No per-feed config, no manual CSS selectors — it just works.

AI Built In

Summarize, translate, and chat with your articles. Works on full text, not RSS snippets. 3 LLM providers, 2 translation engines. Your API keys, zero subscription.

Any Page, Any Feed

No RSS? Oksskolten uses LLM-powered selector inference to turn any webpage into a feed. FlareSolverr handles JS-rendered sites. Subscribe to anything.

Everything you need to read smarter

Full-text extraction, AI-powered analysis, and a beautiful reading experience — all in one self-hosted container.

Read Full Articles In-App

Articles are fetched, cleaned, and rendered as Markdown right inside Oksskolten. No clicking through to the original site, no cookie banners, no ad-heavy layouts.

Summarize, Translate, Chat

One click to summarize or translate any article. Ask questions about it with AI chat — powered by MCP, with full conversation history.

Customizable

14 Themes, 4 Layouts, 9 Fonts

Switch between list, card, magazine, and compact layouts. Choose from 14 color themes — or import your own as JSON. Pick the reading font that suits you.

Talk to your feeds from the terminal

The same AI chat tools you use in the app are exposed as an MCP server, so terminal-based assistants like Claude Code or Codex can search, summarize, and discover articles too — seamlessly switch between app and CLI whenever you like.

Terminal — oksskolten MCP

Article fetching pipeline

How an RSS entry travels from source to your reading list — each stage runs automatically once you add a feed.

Subscribe

Add any feed or page

RSS, Atom — or any web page. No feed? No problem.

RSS / Atom discovery RSS Bridge CSS Selector (LLM)

Auto-discovers native RSS/Atom feeds first. RSS Bridge handles legacy or restricted sources. CSS Selector uses an LLM to scrape pages with no feed at all.

Fetch

3-layer change detection

Polls only when something actually changed. Adaptive intervals adjust to each feed's real tempo.

ETag / 304 SHA-256 hash XML parse

Bot-protected sites fall back to FlareSolverr automatically. Intervals range from 15 min to 4 hours based on HTTP cache headers, RSS TTL, and empirical article frequency.

Extract

HTML → clean Markdown, automatically

Every article is fetched, cleaned, and converted to Markdown in an isolated worker.

SSRF-safe fetch OG image / title Readability + scoring 500+ noise selectors HTML → GFM Markdown Excerpt + lang detect

DNS-level SSRF guard blocks private IPs and limits redirects to 5 hops. OG image and title are extracted before any DOM mutation. Readability parses the article, then a content-block scorer can override it when paragraph density is 2× higher. 500+ CSS and regex patterns strip ads, nav, and tracking. Turndown converts to fenced-code GFM Markdown. Excerpt (200 chars) and language (CJK ratio) are derived locally. All DOM work runs in a Piscina thread pool (max 2, 30 s timeout).

Store

SQLite + Meilisearch

Articles land in WAL-mode SQLite, then sync to a full-text search index.

WAL mode / Meilisearch rebuild / 6 h

Articles are persisted to WAL-mode SQLite with language, excerpt, and OG image already attached from the Extract step. Meilisearch rebuilds every 6 hours with change-log tracking.

Enrich

AI on demand, not in batch

Summarize or translate any article — streamed via SSE, no queue.

Claude / Gemini / OpenAI

DeepL / Google Translate

Pick your provider per task. Summaries produce a 1–2 sentence overview plus bullet points. Translations preserve Markdown structure. All responses stream token-by-token.

Read

Scored, searchable, yours

Engagement scoring surfaces what matters. Full-text search with Meilisearch. Self-hosted, minimal footprint, zero subscription.

How does it compare?

Other readers can fetch full text — but it's opt-in per feed and requires configuration.
Oksskolten does it for every article, by default, with AI built in.

Oksskolten Miniflux FreshRSS Feedly
Full-text Extraction ✓ Every article, by default Opt-in per feed Opt-in per feed ✓ Auto (best-effort)
Extraction Engine Readability.js + 500 patterns Go Readability (~390 lines, ~60 rules) Manual CSS selectors (user-specified) Proprietary
JS-rendered Sites ✓ FlareSolverr Enterprise only
Sites without RSS ✓ LLM selector inference Pro+ (25 feeds) / Enterprise (100)
AI Summarization ✓ (3 providers) Pro+ only (Leo AI)
AI Translation ✓ (6 engines) Enterprise only
AI Chat ✓ (MCP)
Search Meilisearch (typo-tolerant) PostgreSQL full-text SQL LIKE Pro+ (Power Search)
Offline Reading (PWA) — (mobile apps only)
Database SQLite (embedded) PostgreSQL (external) MySQL/PG/SQLite SaaS
Deployment Single container Binary + PostgreSQL PHP + web server + DB SaaS
Price Free / OSS Free / OSS Free / OSS $12.99/mo (Pro+)

Up and running in 60 seconds

One container. No external database. No complex configuration.

1

Clone the repo

git clone https://github.com/babarot/oksskolten.git
cd oksskolten
2

Start with Docker Compose

docker compose up --build
3

Open your browser

open http://localhost:5173