selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

QMReader logo

Self-host QMReader

v1.0.12

RSS workbench with AI translation and Chinese rewriting

ReleaseOpen SourceMIT
Updated4 hours ago
LanguageJavaScript
Setup difficultyModerate
MobileResponsive
Stars
261
Port
8080 (HTTP server)
Requires
Node.js, SQLite
Install with Docker Compose
QMReader homepage showing sources, article list, reader, and AI companion workspaceSource navigation and article list with latest/hot/unread filtersArticle detail view with original text, Chinese rewrite, and Article Agent

What is QMReader?

This self-hosted RSS workbench pulls feeds from RSSHub, direct RSS, sitemaps, and several technical sources. It separates fast RSS fetching from slower AI processing so new entries appear immediately while translation and rewriting run in the background. Readers see original articles alongside bilingual translations and Qiaomu-style rewrites, can add annotations and comments, and chat with an article-context AI agent. All generated content becomes public reading assets with stable deep links, contributor pages, and RSS feeds. The stack is Node.js (Express) with SQLite, deployable via Docker Compose or systemd. Server-side AI uses DeepSeek or any OpenAI-compatible API; users may also provide their own browser-side API keys stored locally. The project is MIT-licensed and maintained by 向阳乔木.

Should you self-host QMReader?

QMReader scores 47/100 on selfhost.directory (how scoring works) and ranks #41 of 85 in Feed Reader. It has 261 GitHub stars.

It shipped 10 stable releases in the past year. The latest, v1.0.12, came out on 28 October 2026.

Setup is moderate: expect some configuration beyond a single command. It is MIT-licensed and written mostly in JavaScript.

Its closest alternative on selfhost.directory is RSSHub (85/100, 46 702 stars). It scores higher overall, so compare the two before you pick. See QMReader vs RSSHub side by side.

Features

  • Admin Dashboard
  • Article annotations
  • Article-context AI chat
  • Bilingual reading
  • Chinese article rewriting
  • Contributor system
  • Hacker News enhanced feeds
  • Immersive reading mode
  • Multi-source RSS aggregation
  • Podcast episode support
  • Public reading assets
  • Reader link submission
  • REST API
  • Split refresh pipeline
  • User-provided AI keys

QMReader README

How to install QMReader

Install QMReader with Docker Compose

Docker and Docker Compose

cp .env.example .env docker compose up -d --build

Container runs on port 8080, mapped to host 127.0.0.1:3088 by default

How to configure QMReader

  • ADMIN_EMAILAdmin account seed email

    Admin account seed email

  • ADMIN_NAME向阳乔木Admin public display name

    Admin public display name

  • ADMIN_PASSWORDAdmin account seed password

    Admin account seed password

  • AI_API_KEYAPI key for non-DeepSeek provider

    API key for non-DeepSeek provider

  • AI_BASE_URLBase URL for non-DeepSeek OpenAI/Anthropic-compatible API

    Base URL for non-DeepSeek OpenAI/Anthropic-compatible API

  • AI_DAILY_BUDGET_MICROS5000000Daily server-funded AI budget in micro-CNY; 0 disables

    Daily server-funded AI budget in micro-CNY; 0 disables

  • AI_MAX_CONCURRENT3Max concurrent AI requests

    Max concurrent AI requests

  • AI_MODELModel name for non-DeepSeek provider

    Model name for non-DeepSeek provider

  • AI_PROVIDERdeepseekAlternative server-side AI provider name

    Alternative server-side AI provider name

  • AI_USER_REQUESTS_PER_DAY100Per-user request rate limit per day

    Per-user request rate limit per day

  • AI_USER_REQUESTS_PER_MINUTE10Per-user request rate limit per minute

    Per-user request rate limit per minute

  • ARTICLE_REFRESH_INTERVAL_MS7200000Default check interval for article category sources

    Default check interval for article category sources

  • AUTO_REWRITE_LIMIT_HACKERNEWS10Hacker News auto-rewrite count

    Hacker News auto-rewrite count

  • AUTO_REWRITE_LIMIT_PER_SOURCE3Default auto-rewrite count per source

    Default auto-rewrite count per source

  • AUTO_REWRITE_MODELdeepseek-flashModel used for auto-rewrite

    Model used for auto-rewrite

  • AUTO_REWRITE_SOURCE_IDSAllowlist of source IDs for auto-rewrite; empty enables all rewritable sources

    Allowlist of source IDs for auto-rewrite; empty enables all rewritable sources

  • COOKIE_SECURE1Force session cookie Secure flag when set to 1

    Force session cookie Secure flag when set to 1

  • DEEPSEEK_API_KEYServer-side DeepSeek API key for title translation and default rewriting

    Server-side DeepSeek API key for title translation and default rewriting

  • DEEPSEEK_BASE_URLhttps://api.deepseek.com/v1DeepSeek OpenAI-compatible API base URL

    DeepSeek OpenAI-compatible API base URL

  • DEEPSEEK_MODELdeepseek-flashServer-side default model for title translation and Chinese rewriting

    Server-side default model for title translation and Chinese rewriting

  • FETCH_SOURCE_CONCURRENCY6Concurrent sources during batch refresh (1-8)

    Concurrent sources during batch refresh (1-8)

  • FRESHNESS_STARTUP_DELAY_MS120000Delay before first stale-source sweep

    Delay before first stale-source sweep

  • FRESHNESS_SWEEP_BATCH_SIZE3Max sources to refresh per sweep

    Max sources to refresh per sweep

  • FRESHNESS_SWEEP_INTERVAL_MS300000Stale-source sweep polling interval

    Stale-source sweep polling interval

  • FRESHNESS_SWEEP_MAX_COST6Max source cost per sweep

    Max source cost per sweep

  • HOST0.0.0.0Node listen address

    Node listen address

  • NEWS_REFRESH_INTERVAL_MS1800000Default check interval for news category sources

    Default check interval for news category sources

  • PODCAST_REFRESH_INTERVAL_MS21600000Default check interval for podcast category sources

    Default check interval for podcast category sources

  • PORT8080Node listen port

    Node listen port

  • SOURCE_INTERACTION_REFRESH_COOLDOWN_MS300000Cooldown for interaction-triggered background refresh per source

    Cooldown for interaction-triggered background refresh per source

  • STARTUP_REFRESH_DELAY_MS30000Startup delay before first full refresh; -1 to disable

    Startup delay before first full refresh; -1 to disable

  • TITLE_TRANSLATION_LIMIT80Per-round title translation limit

    Per-round title translation limit

  • UMAMI_SRChttps://umami.qiaomu.ai/script.jsOptional Umami script URL

    Optional Umami script URL

  • UMAMI_WEBSITE_IDOptional Umami analytics site ID

    Optional Umami analytics site ID

QMReader releases & version history

More in Self-hosting

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…