From 5f88731f536e9b704ef032fff8573afb849bf1a3 Mon Sep 17 00:00:00 2001
From: sommio
Date: Tue, 21 Apr 2026 21:33:40 +0800
Subject: [PATCH 1/4] docs(best-practices): capture operator-owned compose
contract
Record the root-owned deployment boundary, the health-gated startup
chain, and the HTTP-only Caddy contract for the first VPS compose path.
---
...ment-owns-operator-contracts-2026-04-21.md | 155 ++++++++++++++++++
...ment-owns-operator-contracts-2026-04-21.md | 155 ++++++++++++++++++
2 files changed, 310 insertions(+)
create mode 100644 docs/en/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
create mode 100644 docs/zh-Hans/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
diff --git a/docs/en/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md b/docs/en/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
new file mode 100644
index 0000000..1294028
--- /dev/null
+++ b/docs/en/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
@@ -0,0 +1,155 @@
+---
+title: Keep self-hosted Docker Compose deployment operator-owned at the repo root
+date: 2026-04-21
+category: best-practices
+module: vps deployment
+problem_type: best_practice
+component: tooling
+severity: medium
+applies_when:
+ - adding a self-hosted Docker Compose deployment path to this monorepo
+ - deciding whether deployment files belong at the repo root or inside an app
+ - wiring health checks and startup ordering across web, api, and postgres
+ - clarifying which runtime inputs are operator-owned versus app-local
+ - narrowing a first deployment path to HTTP-only reverse proxying
+tags:
+ [
+ docker,
+ compose,
+ caddy,
+ deployment,
+ vps,
+ health-checks,
+ monorepo,
+ operator-contract,
+ ]
+---
+
+# Keep self-hosted Docker Compose deployment operator-owned at the repo root
+
+## Context
+
+This repository added a VPS/self-hosted Docker Compose path that needed to respect two boundaries at the same time: Turborepo app ownership and operator-facing deployment ergonomics.
+
+The risky failure mode was to blur those boundaries. If deployment logic moved into one app, operators would need to discover app-specific entrypoints for a cross-app stack. If app-local development env files were reused as the production contract, the deployment path would silently inherit assumptions that only make sense on a developer machine. A follow-up correction in the same work made that drift visible again: the first Caddy contract had implied hostname/TLS flexibility, but the actual requirement was a simpler HTTP-only reverse proxy.
+
+## Guidance
+
+Treat the repo root as the single operator entrypoint for self-hosted deployment, and keep app-specific build logic inside the owning apps.
+
+For this repo, that means:
+
+- repo root owns `compose.yaml`, root `.env`, `.env.example`, and `Caddyfile`
+- `apps/api` and `apps/web` keep their own Dockerfiles and package-local runtime details
+- `compose.yaml` builds app images from repo-root context but points at app-local Dockerfiles
+- only `caddy` publishes a host port; `postgres`, `api-migrate`, `api`, and `web` stay on the Compose network
+- startup ordering is health-gated: `postgres` -> `api-migrate` -> `api` -> `web` -> `caddy`
+- health surfaces are explicit and dependency-light: `api` exposes `/health/live` and `/health/ready`, `web` exposes `/api/health`
+- the first deployment contract stays intentionally narrow: Caddy listens on `:80` and proxies to `web:3001` without domain or TLS configuration
+
+Keep operator-owned inputs separate from app-local development defaults. The root `.env.example` should describe only values that an operator truly owns at deployment time, such as `HTTP_PORT`, `POSTGRES_*`, `FEED_OPML_HOST_PATH`, `INGEST_ON_BOOT`, and `LLM_*`. App-local files like `apps/api/.env.local` and `apps/web/.env.local` remain development concerns and should not become the production contract.
+
+Lock the topology with a root contract test. In this change, `.github/scripts/compose-contract.test.mjs` verifies service topology, app-local Dockerfile ownership, host-port exposure, health-gated dependencies, exact image pinning, and the deliberate absence of `HTTPS_PORT` / `CADDY_SITE_ADDRESS` in the first deployment mode.
+
+## Why This Matters
+
+This pattern avoids two classes of drift.
+
+First, it preserves monorepo boundaries. The web and API packages still own how their images are built, while the repo root owns only the cross-app orchestration that genuinely spans the stack. That keeps deployment implementation from collapsing package responsibilities into the root.
+
+Second, it keeps the deployment contract truthful. The HTTP-only follow-up mattered because domain/TLS placeholders made the first rollout look more flexible than it really was. When deployment docs, env files, and contract tests all say the same narrower thing, operators get one stable mental model instead of several partially overlapping ones.
+
+The explicit health chain also prevents premature startup. Caddy should not route to a web container that cannot reach the API yet, and the API should not advertise readiness before migrations complete and the database responds. Dedicated probe routes make that state visible without depending on business pages.
+
+## When to Apply
+
+- When adding a repo-wide deployment path for multiple apps in this monorepo
+- When deciding whether root config should describe operator inputs or developer inputs
+- When introducing reverse proxy and health checks for container orchestration
+- When a first deployment mode should stay intentionally narrower than future hosting ambitions
+- When documenting or testing deployment invariants that must not drift
+
+## Examples
+
+Repo-root orchestration, app-local image ownership:
+
+```yaml
+services:
+ api:
+ build:
+ context: .
+ dockerfile: ./apps/api/Dockerfile
+ web:
+ build:
+ context: .
+ dockerfile: ./apps/web/Dockerfile
+ caddy:
+ ports:
+ - "${HTTP_PORT:-80}:80"
+```
+
+Explicit health-gated startup chain:
+
+```yaml
+api:
+ depends_on:
+ postgres:
+ condition: service_healthy
+ api-migrate:
+ condition: service_completed_successfully
+web:
+ depends_on:
+ api:
+ condition: service_healthy
+caddy:
+ depends_on:
+ web:
+ condition: service_healthy
+```
+
+Dedicated probe surfaces instead of probing business routes:
+
+```ts
+// apps/api/src/health/health.controller.ts
+@Get("ready")
+async ready(@Res({ passthrough: true }) response: Response) {
+ await this.prisma.$queryRawUnsafe("SELECT 1");
+ return { service: "api", status: "ok" };
+}
+```
+
+```ts
+// apps/web/app/api/health/route.ts
+export function GET() {
+ return NextResponse.json({ service: "web", status: "ok" });
+}
+```
+
+Narrow first deployment contract for Caddy:
+
+```caddyfile
+:80 {
+ encode gzip zstd
+ reverse_proxy web:3001
+}
+```
+
+And the contract test locks that scope:
+
+```js
+assert.doesNotMatch(caddyBlock, /HTTPS_PORT|CADDY_SITE_ADDRESS/);
+```
+
+## Related
+
+- `compose.yaml`
+- `Caddyfile`
+- `.env.example`
+- `.github/scripts/compose-contract.test.mjs`
+- `apps/api/src/health/health.controller.ts`
+- `apps/web/app/api/health/route.ts`
+- `README.md`
+- `README.zh-Hans.md`
+- `docs/en/plans/2026-04-21-001-feat-docker-images-vps-compose-plan.md`
+- `docs/zh-Hans/plans/2026-04-21-001-feat-docker-images-vps-compose-plan.md`
+- `docs/en/solutions/integration-issues/ci-e2e-runtime-inputs-must-match-seeded-targets-2026-04-16.md`
diff --git a/docs/zh-Hans/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md b/docs/zh-Hans/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
new file mode 100644
index 0000000..58d5951
--- /dev/null
+++ b/docs/zh-Hans/solutions/best-practices/repo-root-compose-deployment-owns-operator-contracts-2026-04-21.md
@@ -0,0 +1,155 @@
+---
+title: 让自托管 Docker Compose 部署在 repo 根保持 operator-owned 契约
+date: 2026-04-21
+category: best-practices
+module: vps deployment
+problem_type: best_practice
+component: tooling
+severity: medium
+applies_when:
+ - 在这个 monorepo 中新增自托管 Docker Compose 部署路径时
+ - 判断部署文件应该放在 repo 根还是某个 app 内时
+ - 为 web、api、postgres 串联健康检查与启动顺序时
+ - 澄清哪些运行时输入属于 operator,哪些属于 app 本地开发时
+ - 需要把首版部署路径明确收窄成 HTTP-only 反向代理时
+tags:
+ [
+ docker,
+ compose,
+ caddy,
+ deployment,
+ vps,
+ health-checks,
+ monorepo,
+ operator-contract,
+ ]
+---
+
+# 让自托管 Docker Compose 部署在 repo 根保持 operator-owned 契约
+
+## Context
+
+这个仓库新增了一条 VPS / 自托管 Docker Compose 部署路径,同时必须守住两层边界:Turborepo 的 app ownership,以及面向 operator 的部署入口清晰度。
+
+真正危险的失败模式,是把这两层边界揉在一起。如果把部署主入口塞进某个 app,operator 就得先理解某个 app 的局部入口,才能拉起跨 app 的整栈。如果把 app 本地开发 env 直接复用成生产契约,部署路径又会悄悄继承只适合开发机的默认假设。同一轮工作里的后续修正再次暴露了这种漂移:最初的 Caddy 契约暗示了 hostname/TLS 可配置,但真实需求其实只是更简单的 HTTP-only 反向代理。
+
+## Guidance
+
+把 repo 根视为自托管部署的唯一 operator 入口,同时让 app-specific build logic 继续留在各自 app 内。
+
+在这个仓库里,具体做法是:
+
+- repo 根拥有 `compose.yaml`、根 `.env`、`.env.example` 与 `Caddyfile`
+- `apps/api` 与 `apps/web` 继续拥有自己的 Dockerfile 和 package-local 运行时细节
+- `compose.yaml` 用 repo 根 build context 构建镜像,但 `dockerfile` 指向 app 内部文件
+- 只有 `caddy` 发布宿主机端口;`postgres`、`api-migrate`、`api`、`web` 都留在 Compose 内网
+- 启动顺序必须由健康状态串起来:`postgres` -> `api-migrate` -> `api` -> `web` -> `caddy`
+- 健康探针面要显式且轻量:`api` 提供 `/health/live` 与 `/health/ready`,`web` 提供 `/api/health`
+- 首版部署契约要刻意收窄:Caddy 监听 `:80`,只把流量反代到 `web:3001`,不提前引入 domain 或 TLS 配置
+
+operator-owned 输入要和 app 本地开发默认值分开。根 `.env.example` 应只描述 operator 在部署时真正拥有的值,比如 `HTTP_PORT`、`POSTGRES_*`、`FEED_OPML_HOST_PATH`、`INGEST_ON_BOOT`、`LLM_*`。像 `apps/api/.env.local`、`apps/web/.env.local` 这样的文件,仍然只是本地开发资产,不应被提升成生产契约。
+
+还要用 root contract test 锁住这套拓扑。在这次改动里,`.github/scripts/compose-contract.test.mjs` 会验证服务拓扑、app-local Dockerfile ownership、host port 暴露边界、health-gated 依赖、精确镜像 pin,以及首版部署模式里刻意不存在的 `HTTPS_PORT` / `CADDY_SITE_ADDRESS`。
+
+## Why This Matters
+
+这个模式主要避免两类漂移。
+
+第一类,是 monorepo 边界漂移。web 和 API package 仍然拥有自己的镜像构建方式,repo 根只拥有真正跨 app 的编排层。这样不会为了部署而把 package 的职责塌缩到根目录。
+
+第二类,是部署契约漂移。后续把 Caddy 收窄成 HTTP-only 很关键,因为 domain/TLS 占位符会让首版 rollout 看起来比真实能力更“通用”。当部署文档、env 模板和 contract test 一起表达同一个更窄但更真实的契约时,operator 获得的是一个稳定心智模型,而不是几份彼此半重叠的说法。
+
+显式健康链还能阻止过早启动。Caddy 不应该把流量转给一个还没等到 API 就绪的 web 容器;API 也不应该在 migration 完成前、数据库仍不可达时就宣称自己 ready。专门的 probe route 能把这些状态暴露出来,而不是拿业务页面充当探针。
+
+## When to Apply
+
+- 在这个 monorepo 里新增跨多个 app 的 repo-wide 部署路径时
+- 判断根配置描述的是 operator 输入还是 developer 输入时
+- 给容器编排引入 reverse proxy 与 health checks 时
+- 首版部署模式需要刻意比未来托管能力更收敛时
+- 需要把部署不变量写进文档或测试,防止后续漂移时
+
+## Examples
+
+repo 根负责编排,app 保留镜像实现 ownership:
+
+```yaml
+services:
+ api:
+ build:
+ context: .
+ dockerfile: ./apps/api/Dockerfile
+ web:
+ build:
+ context: .
+ dockerfile: ./apps/web/Dockerfile
+ caddy:
+ ports:
+ - "${HTTP_PORT:-80}:80"
+```
+
+显式 health-gated 启动链:
+
+```yaml
+api:
+ depends_on:
+ postgres:
+ condition: service_healthy
+ api-migrate:
+ condition: service_completed_successfully
+web:
+ depends_on:
+ api:
+ condition: service_healthy
+caddy:
+ depends_on:
+ web:
+ condition: service_healthy
+```
+
+不要探测业务页面,改用专用健康端点:
+
+```ts
+// apps/api/src/health/health.controller.ts
+@Get("ready")
+async ready(@Res({ passthrough: true }) response: Response) {
+ await this.prisma.$queryRawUnsafe("SELECT 1");
+ return { service: "api", status: "ok" };
+}
+```
+
+```ts
+// apps/web/app/api/health/route.ts
+export function GET() {
+ return NextResponse.json({ service: "web", status: "ok" });
+}
+```
+
+Caddy 的首版部署契约要收窄:
+
+```caddyfile
+:80 {
+ encode gzip zstd
+ reverse_proxy web:3001
+}
+```
+
+而 contract test 要把这个边界锁住:
+
+```js
+assert.doesNotMatch(caddyBlock, /HTTPS_PORT|CADDY_SITE_ADDRESS/);
+```
+
+## Related
+
+- `compose.yaml`
+- `Caddyfile`
+- `.env.example`
+- `.github/scripts/compose-contract.test.mjs`
+- `apps/api/src/health/health.controller.ts`
+- `apps/web/app/api/health/route.ts`
+- `README.md`
+- `README.zh-Hans.md`
+- `docs/en/plans/2026-04-21-001-feat-docker-images-vps-compose-plan.md`
+- `docs/zh-Hans/plans/2026-04-21-001-feat-docker-images-vps-compose-plan.md`
+- `docs/zh-Hans/solutions/integration-issues/ci-e2e-runtime-inputs-must-match-seeded-targets-2026-04-16.md`
From cbec155c6783e1ca38eec8dd681431afef06784a Mon Sep 17 00:00:00 2001
From: sommio
Date: Tue, 21 Apr 2026 22:52:25 +0800
Subject: [PATCH 2/4] docs(readme): refresh root documentation
Consolidate the root README updates across both languages. Keep the
sanitized screenshot under docs assets and tighten the product and
contribution messaging around the current agent-first workflow.
---
README.md | 298 +++++-----------------
README.zh-Hans.md | 279 +++++---------------
docs/assets/readme/rssift-reader-v0-1.png | Bin 0 -> 199098 bytes
docs/en/CONTRIBUTING.md | 128 ++++++++++
docs/zh-Hans/CONTRIBUTING.md | 128 ++++++++++
5 files changed, 388 insertions(+), 445 deletions(-)
create mode 100644 docs/assets/readme/rssift-reader-v0-1.png
create mode 100644 docs/en/CONTRIBUTING.md
create mode 100644 docs/zh-Hans/CONTRIBUTING.md
diff --git a/README.md b/README.md
index ade776b..99ebf27 100644
--- a/README.md
+++ b/README.md
@@ -4,264 +4,98 @@
English · 中文
-RSSift is a Turborepo-based monorepo for an AI-assisted RSS filtering tool.
-It is intentionally scoped around a feed-triage workflow: pull feeds, generate
-summaries, present a two-column desktop view, and jump to the original article
-when needed.
+[](https://ai-declaration.md)
-## Current status
+RSSift is a minimalist RSS summary reader.
-- The project is in agile, iterative development.
-- The first end-to-end slice is implemented as the current working slice.
-- `apps/api` now ingests feeds into PostgreSQL on boot and serves persisted
- article list and detail endpoints.
-- `apps/api` now also attempts best-effort article body extraction during
- ingestion and stores markdown internally for later summarization work.
-- `apps/web` renders the reader UI and consumes the API over HTTP.
-- Shared UI primitives live in `packages/ui`.
+Focuses on optimizing the "Open -> Scan Summary/Key Points -> Deep Read (on demand)" reading workflow.
-## Project direction
+By leveraging LLMs to rapidly extract the essence of content, it allows users to filter information efficiently and quickly decide whether to invest time in reading the full text.
-- This project is a filter-first RSS workflow, not a full-featured reader.
-- The current focus is article triage, summary generation, and jump-out to the
- original source.
-- The current implementation is being improved through agile, iterative
- delivery.
+RSSift works as follows:
-## Requirements
+- Precompute translated titles and layered summaries with an LLM
+- Show a quick gist first, then ordered key points for deeper scanning
+- Jump to the original article only when you actually want the full text
-- Node.js 24.14.1 or later
-- pnpm 10.33.0 or later
+v0.1 delivers the complete core workflow. v0.2 plans to refine UI/UX interactions.
-## Run locally
+
-1. Create the app-local environment files first:
-
-```bash
-cp apps/api/.env.example apps/api/.env.local
-cp apps/web/.env.example apps/web/.env.local
-cp apps/api/feeds.opml.example apps/api/feeds.opml
-```
-
-2. Review and edit the local environment values before booting anything:
-
-- `apps/api/.env.local`
- - `DATABASE_URL` is the development database used by `db:deploy`,
- `db:reset`, `db:seed`, and normal API runtime reads/writes.
- - `TEST_DATABASE_URL` is reserved for automated test flows only.
- - `FEED_OPML_PATH` defaults to `./feeds.opml`.
- - `INGEST_ON_BOOT=true` enables startup-time ingestion for local API runs.
-- `apps/web/.env.local`
- - `API_BASE_URL` should point to the local API, usually
- `http://127.0.0.1:3000`.
-
-3. Install dependencies:
-
-```bash
-pnpm install
-```
-
-4. Verify the local PostgreSQL 18 prerequisites with `psql-18`:
-
-```bash
-psql-18 postgresql://rssift:rssift@127.0.0.1:5432/rssift -c 'select current_database();'
-psql-18 postgresql://rssift:rssift@127.0.0.1:5432/rssift_test -c 'select current_database();'
-```
-
-Expected local databases:
-
-- `DATABASE_URL=postgresql://rssift:rssift@127.0.0.1:5432/rssift`
-- `TEST_DATABASE_URL=postgresql://rssift:rssift@127.0.0.1:5432/rssift_test`
-
-5. Apply the checked-in Prisma migrations to the development database:
-
-```bash
-pnpm --filter api db:deploy
-```
-
-6. Optionally load the deterministic development seed data:
-
-```bash
-pnpm --filter api db:seed
-```
-
-7. Start the API in one terminal:
-
-```bash
-pnpm --filter api dev
-```
-
-8. Start the web app in another terminal:
-
-```bash
-pnpm --filter web dev
-```
-
-The default local URLs are:
-
-- API: `http://127.0.0.1:3000`
-- Web: `http://127.0.0.1:3001`
-
-The repo-root `.env` and `compose.yaml` are not part of the local app-dev path.
-They are the operator-facing deployment entry for self-hosted Docker Compose.
-
-## Self-host on a VPS
-
-Repo-root `compose.yaml`, repo-root `.env`, and repo-root `Caddyfile` are the
-production deployment surface. This is intentionally a root-level entrypoint so
-an operator can clone the repo and start the whole stack from one obvious place
-without dropping into a secondary `deploy/` directory.
-
-### Prerequisites
-
-- Docker Engine with the Compose plugin installed on the VPS
-- A host-level OPML file path that the operator owns and backs up
-- Inbound network access for the published Caddy HTTP port
-
-### Prepare the operator inputs
-
-1. Copy the root deployment env file:
+## Deployment
```bash
+git clone https://github.com/sommio/RSSift
+cd RSSift
cp .env.example .env
```
-2. Edit the root `.env`:
-
-- `HTTP_PORT` controls the host port published by Caddy's HTTP listener.
-- `POSTGRES_*` owns the Compose-managed PostgreSQL credentials and database.
-- `FEED_OPML_HOST_PATH` must point to an existing host file path. Compose binds
- it into the API container as a read-only file.
-- `INGEST_ON_BOOT` and the `LLM_*` values remain explicit operator-owned
- runtime inputs for the API service.
-
-### Build and start the stack
+### Configuration
+
+Edit `.env` with your values:
+
+- `HTTP_PORT`
+ - Purpose: Host port exposed by Caddy
+ - Example: `80`
+- `POSTGRES_DB`
+ - Purpose: PostgreSQL database name used by the stack
+ - Example: `rssift`
+- `POSTGRES_USER`
+ - Purpose: PostgreSQL username used by the stack
+ - Example: `rssift`
+- `POSTGRES_PASSWORD`
+ - Purpose: PostgreSQL password for that user
+ - Example: `replace-with-a-long-random-password`
+- `FEED_OPML_HOST_PATH`
+ - Purpose: Absolute host path to the operator-owned OPML file mounted into the API container
+ - Example: `/srv/rssift/feeds.opml`
+- `INGEST_ON_BOOT`
+ - Purpose: Whether the API should ingest feeds automatically on container start
+ - Example: `true`
+- `FEED_AUTO_REFRESH_INTERVAL_HOURS`
+ - Purpose: Minimum interval between automatic refresh waves after wake/resume checks
+ - Example: `6`
+- `FEED_MAX_ARTICLES_PER_FEED`
+ - Purpose: Number of newest articles to persist per feed during each ingestion run
+ - Example: `10`
+- `LLM_API_KEY`
+ - Purpose: API key for the OpenAI-compatible LLM gateway
+ - Example: `sk-...`
+- `LLM_BASE_URL`
+ - Purpose: Base URL for the OpenAI-compatible LLM gateway
+ - Example: `https://api.openai.com/v1`
+- `LLM_MODEL`
+ - Purpose: Model name used for translated titles and summaries
+ - Example: `gpt-4.1-mini`
+- `LLM_SUMMARY_CONCURRENCY`
+ - Purpose: Number of concurrent summary jobs the API may run
+ - Example: `2`
+- `LLM_SUMMARY_LANGUAGE`
+ - Purpose: Target language for translated titles and summaries
+ - Example: `zh-CN`
+- `LLM_TIMEOUT_MS`
+ - Purpose: Optional request timeout for LLM calls in milliseconds; leave empty to use the SDK default
+ - Example: `30000`
+
+### Start
```bash
docker compose up -d --build
```
-This root stack starts:
-
-- `postgres` on the Compose network only
-- `api-migrate` as the one-shot Prisma migration gate
-- `api` as the single-process Nest runtime
-- `web` as the Next.js runtime with `API_BASE_URL=http://api:3000`
-- `caddy` as the only public entrypoint
-
-### Validate the deployment
+### Verify
```bash
docker compose ps
docker compose logs --tail=100 api-migrate api web caddy
curl http://127.0.0.1:${HTTP_PORT:-80}/
curl http://127.0.0.1:${HTTP_PORT:-80}/api/health
-docker compose exec api node -e "fetch('http://127.0.0.1:3000/health/ready').then((response) => response.text().then((body) => { console.log(response.status, body); process.exit(response.ok ? 0 : 1); })).catch((error) => { console.error(error); process.exit(1); })"
```
-Healthy expectations:
-
-- `api-migrate` exits successfully once
-- `api` reports `200` on `/health/live` and `/health/ready`
-- `web` reports `200` on `/api/health`
-- external traffic reaches `caddy`, which reverse-proxies only to `web`
-
-Operational rules for this first deployment path:
-
-- PostgreSQL stays private to the Compose network by default
-- only Caddy publishes host ports
-- the API remains a single-process deployment target
-- `feeds.opml` stays operator-owned on the host and is never baked into images
-- root `.env` is for deployment only; app-local `.env.local` files remain the
- development entry for `apps/api` and `apps/web`
-
-## Local quality checks
-
-After `pnpm install`, Husky installs the repository's local Git hooks automatically.
-
-- `pre-commit` runs `pnpm lint:staged`: staged JS/TS files are formatted with Prettier and linted with ESLint, while staged CSS/HTML/JSON/Markdown files are formatted with Prettier only.
-- `pre-push` runs `pnpm typecheck`, which reuses the existing workspace typecheck gate.
-- Local hooks do not run `pnpm test:e2e`.
-- `pre-push` can be slower than `pre-commit` because the current Turborepo task graph may run upstream `build` prerequisites before `typecheck`.
-
-If a hook fails, fix the reported issues and rerun the same Git command. You can also run the checks manually:
-
-```bash
-pnpm lint:staged
-pnpm typecheck
-```
+## Contributing
-## Useful commands
-
-```bash
-pnpm build
-pnpm lint
-pnpm typecheck
-pnpm test
-pnpm test:e2e
-```
-
-Development-database Prisma helpers live in `apps/api`:
-
-```bash
-pnpm --filter api db:generate
-pnpm --filter api db:migrate
-pnpm --filter api db:deploy
-pnpm --filter api db:reset
-pnpm --filter api db:seed
-```
-
-These commands target the development database behind `DATABASE_URL`.
-Use `db:deploy` to apply checked-in migrations, `db:migrate` only when you are
-authoring a new migration, `db:reset` to rebuild the development database from
-migrations, and `db:seed` to load the deterministic sample data set. Automated
-tests handle the test database internally through `TEST_DATABASE_URL`; those
-test-database operations are intentionally not exposed as developer-facing
-commands.
-
-Article body storage is now part of the normal ingestion lifecycle rather than a
-manual script. If one persisted article needs a repair pass, use the narrow API
-endpoint:
-
-```bash
-curl -X POST http://127.0.0.1:3000/article-content//retry
-```
-
-That endpoint is a secondary repair path only. The public article read APIs
-still do not expose stored markdown in this slice.
-
-`pnpm dev` at the repo root no longer applies Prisma migrations implicitly. Run
-an explicit API migration command before starting the dev servers whenever your
-local schema is behind:
-
-```bash
-pnpm --filter api db:deploy
-pnpm dev
-```
+This repository uses an agent-first development workflow based on skills:
-## PR Quality Workflow
+- `ce:brainstorm -> ce:plan -> ce:work -> ce:review -> ce:compound`.
-- GitHub Actions runs a PR-only quality workflow on `pull_request`.
-- Configure branch protection against these stable job names:
- - `pr-quality / format`
- - `pr-quality / static`
- - `pr-quality / test`
- - `pr-quality / e2e`
-- Docs-only pull requests still report those four jobs, but they complete as
- explicit no-op successes so required checks never stay pending.
-- Code pull requests always run full `pnpm format:check` and full
- `pnpm test:e2e`.
-- App-local pull requests can use `turbo run lint --affected`,
- `turbo run typecheck --affected`, and `turbo run test --affected` for the
- static and unit/integration gates. Any shared package, root config, workflow,
- or lockfile change falls back to full-repo execution.
-- Database-backed `pr-quality / test` and `pr-quality / e2e` provision their
- own PostgreSQL 18 service containers inside the workflow and create temporary
- CI databases before running validation.
-- To enable Turbo remote cache on trusted same-repository pull requests, set
- GitHub Actions secrets `TURBO_TOKEN` and `TURBO_TEAM`. Forks and automated
- pull requests without those secrets intentionally run uncached instead of
- weakening the quality gates.
-- No additional operational monitoring required for this workflow rollout
- because it only adds pull request validation and does not change runtime
- production behavior.
+Contributor docs: [`docs/en/CONTRIBUTING.md`](./docs/en/CONTRIBUTING.md)
diff --git a/README.zh-Hans.md b/README.zh-Hans.md
index acf5242..84d83a9 100644
--- a/README.zh-Hans.md
+++ b/README.zh-Hans.md
@@ -4,245 +4,98 @@
English · 中文
-RSSift 是一个基于 Turborepo 的 AI 辅助 RSS 筛选工具单仓库。
-它的目标是拉取 feed、生成摘要、提供双栏桌面视图,并在需要时跳转原文。
+[](https://ai-declaration.md)
-## 当前状态
+RSSift 是一款极简的 RSS 摘要阅读器。
-- 项目目前处于敏捷、迭代式开发中。
-- 已完成第一条端到端切片,作为当前可工作的切片。
-- `apps/api` 现在会在启动时把 feed 入库到 PostgreSQL,并提供持久化的文章列表与详情接口。
-- `apps/api` 现在也会在 ingestion 期间以 best-effort 方式尝试抽取并落库文章正文 Markdown,为后续摘要能力准备输入层。
-- `apps/web` 渲染阅读器界面,并通过 HTTP 消费 API。
-- 可复用的 UI 基础组件位于 `packages/ui`。
+专注于优化「打开 -> 扫视摘要与关键点 -> 按需精读」的阅读流程。
-## 项目方向
+通过 LLM 快速提取文章精髓,高效过滤信息,快速判断是否值得投入时间精读原文。
-- 这个项目是一个以筛选为核心的 RSS 工作流,不是一个完整的阅读器。
-- 当前重点是文章筛选、摘要生成,以及跳转到原文。
-- 当前实现会通过敏捷、迭代式交付持续演进。
+RSSift 通过以下方式工作:
-## 环境要求
+- 用 LLM 预生成翻译标题和分层摘要
+- 先呈现一段速览,再给出有序的关键点,方便进一步判断
+- 真正想细读时,再跳转到原文继续
-- Node.js 24.14.1 或更高版本
-- pnpm 10.33.0 或更高版本
+v0.1 已实现基础流程,v0.2 计划进一步优化 UI/UX 交互。
-## 本地运行
+
-1. 先创建 app 级别的本地环境文件:
-
-```bash
-cp apps/api/.env.example apps/api/.env.local
-cp apps/web/.env.example apps/web/.env.local
-cp apps/api/feeds.opml.example apps/api/feeds.opml
-```
-
-2. 启动任何服务前,先检查并按需修改本地环境变量:
-
-- `apps/api/.env.local`
- - `DATABASE_URL` 对应开发数据库,`db:deploy`、`db:reset`、`db:seed`
- 以及 API 本地运行都使用它。
- - `TEST_DATABASE_URL` 仅供自动化测试流程使用。
- - `FEED_OPML_PATH` 默认指向 `./feeds.opml`。
- - `INGEST_ON_BOOT=true` 表示本地 API 启动时会执行 feed 入库。
-- `apps/web/.env.local`
- - `API_BASE_URL` 应该指向本地 API,通常是
- `http://127.0.0.1:3000`。
-
-3. 安装依赖:
-
-```bash
-pnpm install
-```
-
-4. 用 `psql-18` 检查本地 PostgreSQL 18 前置条件:
-
-```bash
-psql-18 postgresql://rssift:rssift@127.0.0.1:5432/rssift -c 'select current_database();'
-psql-18 postgresql://rssift:rssift@127.0.0.1:5432/rssift_test -c 'select current_database();'
-```
-
-本地默认数据库:
-
-- `DATABASE_URL=postgresql://rssift:rssift@127.0.0.1:5432/rssift`
-- `TEST_DATABASE_URL=postgresql://rssift:rssift@127.0.0.1:5432/rssift_test`
-
-5. 启动 API 前,先把仓库里已提交的 Prisma 迁移应用到开发数据库:
-
-```bash
-pnpm --filter api db:deploy
-```
-
-6. 如需开发示例数据,可再导入一份固定 seed:
-
-```bash
-pnpm --filter api db:seed
-```
-
-7. 在一个终端启动 API:
-
-```bash
-pnpm --filter api dev
-```
-
-8. 在另一个终端启动 Web 应用:
-
-```bash
-pnpm --filter web dev
-```
-
-本地默认地址如下:
-
-- API: `http://127.0.0.1:3000`
-- Web: `http://127.0.0.1:3001`
-
-仓库根目录的 `.env` 与 `compose.yaml` 不属于本地 app 开发路径。
-它们是面向运维者的 Docker Compose 自托管部署入口。
-
-## VPS 自托管部署
-
-仓库根目录的 `compose.yaml`、根 `.env` 与根 `Caddyfile` 就是生产部署面。
-这次刻意把入口放在 repo 根,而不是 `deploy/` 子目录里,目的是让运维者在
-clone 仓库后,一眼就能看到入口,并直接从根目录拉起整栈。
-
-### 前置条件
-
-- VPS 已安装 Docker Engine 与 Compose plugin
-- 运维者自己拥有并备份的宿主机 OPML 文件路径
-- 宿主机已放通 Caddy 对外发布的 HTTP 端口
-
-### 准备运维输入
-
-1. 先复制根部署环境文件:
+## 部署
```bash
+git clone https://github.com/sommio/RSSift
+cd RSSift
cp .env.example .env
```
-2. 编辑根 `.env`:
-
-- `HTTP_PORT` 控制 Caddy 的 HTTP 监听对宿主机发布的端口
-- `POSTGRES_*` 拥有 Compose 管理的 PostgreSQL 凭据与数据库名
-- `FEED_OPML_HOST_PATH` 必须指向一个已存在的宿主机文件路径;Compose 会把它
- 以只读 bind mount 的方式挂进 API 容器
-- `INGEST_ON_BOOT` 与 `LLM_*` 仍然是显式的 operator-owned API 运行时输入
-
-### 构建并启动整栈
+### 配置
+
+编辑 `.env` 文件,填入你的配置:
+
+- `HTTP_PORT`
+ - 作用:Caddy 对宿主机暴露的端口
+ - 示例:`80`
+- `POSTGRES_DB`
+ - 作用:整栈使用的 PostgreSQL 数据库名
+ - 示例:`rssift`
+- `POSTGRES_USER`
+ - 作用:整栈使用的 PostgreSQL 用户名
+ - 示例:`rssift`
+- `POSTGRES_PASSWORD`
+ - 作用:上述数据库用户的密码
+ - 示例:`replace-with-a-long-random-password`
+- `FEED_OPML_HOST_PATH`
+ - 作用:宿主机上 OPML 文件的绝对路径,会只读挂载进 API 容器
+ - 示例:`/srv/rssift/feeds.opml`
+- `INGEST_ON_BOOT`
+ - 作用:容器启动时是否自动执行 feed 拉取
+ - 示例:`true`
+- `FEED_AUTO_REFRESH_INTERVAL_HOURS`
+ - 作用:自动刷新检查之间的最小间隔小时数
+ - 示例:`6`
+- `FEED_MAX_ARTICLES_PER_FEED`
+ - 作用:每次拉取时每个 feed 最多保留的最新文章数
+ - 示例:`10`
+- `LLM_API_KEY`
+ - 作用:OpenAI 兼容网关的 API Key
+ - 示例:`sk-...`
+- `LLM_BASE_URL`
+ - 作用:OpenAI 兼容网关的基础地址
+ - 示例:`https://api.openai.com/v1`
+- `LLM_MODEL`
+ - 作用:生成翻译标题和摘要时使用的模型名
+ - 示例:`gpt-4.1-mini`
+- `LLM_SUMMARY_CONCURRENCY`
+ - 作用:API 同时运行的摘要任务数
+ - 示例:`2`
+- `LLM_SUMMARY_LANGUAGE`
+ - 作用:翻译标题和摘要的目标语言
+ - 示例:`zh-CN`
+- `LLM_TIMEOUT_MS`
+ - 作用:可选的 LLM 请求超时时间,单位毫秒;留空则使用 SDK 默认值
+ - 示例:`30000`
+
+### 启动
```bash
docker compose up -d --build
```
-这个根栈会启动:
-
-- 仅在 Compose 内网可达的 `postgres`
-- 负责一次性 Prisma 迁移门禁的 `api-migrate`
-- 单进程运行的 Nest 服务 `api`
-- 通过 `API_BASE_URL=http://api:3000` 访问 API 的 Next.js 服务 `web`
-- 作为唯一公网入口的 `caddy`
-
-### 部署后验证
+### 验证
```bash
docker compose ps
docker compose logs --tail=100 api-migrate api web caddy
curl http://127.0.0.1:${HTTP_PORT:-80}/
curl http://127.0.0.1:${HTTP_PORT:-80}/api/health
-docker compose exec api node -e "fetch('http://127.0.0.1:3000/health/ready').then((response) => response.text().then((body) => { console.log(response.status, body); process.exit(response.ok ? 0 : 1); })).catch((error) => { console.error(error); process.exit(1); })"
```
-健康预期:
+## 贡献
-- `api-migrate` 一次性成功退出
-- `api` 的 `/health/live` 与 `/health/ready` 返回 `200`
-- `web` 的 `/api/health` 返回 `200`
-- 外部流量先到 `caddy`,再只反代到 `web`
-
-这条首版部署路径的显式运维规则:
-
-- PostgreSQL 默认保持 Compose 内网私有
-- 只有 Caddy 会向宿主机发布端口
-- API 仍然是单进程部署目标
-- `feeds.opml` 始终由运维者在宿主机持有,不会被烘焙进镜像
-- 根 `.env` 只服务部署;`apps/api` 与 `apps/web` 各自的 `.env.local`
- 继续是本地开发入口
-
-## 本地质量检查
-
-执行 `pnpm install` 后,Husky 会自动安装仓库内的本地 Git hooks。
-
-- `pre-commit` 会运行 `pnpm lint:staged`:已暂存的 JS/TS 文件会先经过 Prettier 再执行 ESLint,已暂存的 CSS/HTML/JSON/Markdown 文件只会执行 Prettier。
-- `pre-push` 会运行 `pnpm typecheck`,直接复用现有的 workspace typecheck 门禁。
-- 本地 hooks 不会运行 `pnpm test:e2e`。
-- `pre-push` 可能比 `pre-commit` 更慢,因为当前的 Turborepo 任务图可能会在 `typecheck` 前触发上游 `build` 前置步骤。
-
-如果 hook 失败,请先修复报错,再重新执行同一条 Git 命令。你也可以手动运行这些检查:
-
-```bash
-pnpm lint:staged
-pnpm typecheck
-```
+本仓库使用基于 skills 的 agent-first 开发工作流:
-## 常用命令
-
-```bash
-pnpm build
-pnpm lint
-pnpm typecheck
-pnpm test
-pnpm test:e2e
-```
-
-`apps/api` 里的开发数据库 Prisma 命令:
-
-```bash
-pnpm --filter api db:generate
-pnpm --filter api db:migrate
-pnpm --filter api db:deploy
-pnpm --filter api db:reset
-pnpm --filter api db:seed
-```
-
-这些命令都作用于 `DATABASE_URL` 指向的开发数据库。拉取仓库后做 schema
-对齐,优先使用 `db:deploy`;只有在你确实要创建或迭代新的本地迁移时,才使
-用 `db:migrate`。如果要重建开发数据库,请使用 `db:reset`;如果要导入固定
-的开发示例数据,请使用 `db:seed`。测试数据库由测试程序通过
-`TEST_DATABASE_URL` 在内部处理,不再作为开发者操作命令暴露。
-
-文章正文落库现在属于正常 ingestion 生命周期,而不是手工脚本。如果某一篇已
-持久化文章需要补救性重跑,可以调用这个狭窄接口:
-
-```bash
-curl -X POST http://127.0.0.1:3000/article-content//retry
-```
-
-这个接口只是 repair path,不是默认工作流。本切片里公开的文章读取 API 仍
-然不会暴露已存储的 Markdown。
-
-仓库根目录的 `pnpm dev` 不会再隐式执行 Prisma 迁移。只要本地 schema
-落后于迁移历史,请先显式运行 API 迁移命令,再启动开发服务:
-
-```bash
-pnpm --filter api db:deploy
-pnpm dev
-```
+- `ce:brainstorm -> ce:plan -> ce:work -> ce:review -> ce:compound`。
-## PR 质量门禁工作流
-
-- GitHub Actions 会在 `pull_request` 上运行一条仅面向 PR 的质量工作流。
-- 请把 branch protection 配置到以下稳定 job 名称上:
- - `pr-quality / format`
- - `pr-quality / static`
- - `pr-quality / test`
- - `pr-quality / e2e`
-- 仅文档 PR 仍然会上报这四个 job,但会以显式 no-op success 收敛,避免 required checks 长时间停留在 pending。
-- 代码 PR 会始终运行全量 `pnpm format:check`,并把 `pnpm test:e2e` 作为终局门禁。
-- 仅限 `apps/` 局部改动的 PR,会在 static 与单元/集成测试门禁中使用
- `turbo run lint --affected`、`turbo run typecheck --affected` 与
- `turbo run test --affected`。只要触及共享 package、根级配置、workflow
- 或 lockfile,就会保守回退到全仓执行。
-- 数据库相关的 `pr-quality / test` 与 `pr-quality / e2e` 会在 workflow 内自行拉起 PostgreSQL 18 service container,并在校验前创建临时 CI 数据库。
-- 如果要在可信的同仓库 PR 上启用 Turbo remote cache,请在 GitHub Actions
- secrets 中配置 `TURBO_TOKEN` 与 `TURBO_TEAM`。fork PR 和没有这些 secrets
- 的自动化 PR 会有意以 uncached 方式运行,而不会削弱质量门禁。
-- 这次工作流 rollout 不需要额外的生产监控,因为它只新增 PR 校验,不改变线上运行时行为。
+贡献者文档:[`docs/zh-Hans/CONTRIBUTING.md`](./docs/zh-Hans/CONTRIBUTING.md)
diff --git a/docs/assets/readme/rssift-reader-v0-1.png b/docs/assets/readme/rssift-reader-v0-1.png
new file mode 100644
index 0000000000000000000000000000000000000000..02e281b930b50eb1046f25bdde7baa1483dfd32d
GIT binary patch
literal 199098
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