A self-hosted, multi-user intelligence radar for teams drowning in RSS feeds.
Collect once. Let every teammate define their own sources, keywords, quality limits, and delivery rhythm.
简体中文 · Quick start · Architecture · Privacy · Roadmap
Most RSS readers are personal. Most team intelligence tools force everyone into the same feed and ranking rules. Tech Radar Multi keeps collection shared while making relevance personal:
- one source is fetched once, instead of once per user;
- every user owns independent RSS subscriptions, include/exclude keywords, limits, and feedback;
- private sources can become team candidates only after explicit review;
- administrators see source health, keyword trends, and an audit trail without overwriting user preferences;
- a web inbox works out of the box, while Feishu delivery is optional.
It is designed for a small team that wants a transparent, hackable alternative to a black-box news recommender.
| Capability | What it gives you |
|---|---|
| Multi-user isolation | Separate sources, keywords, inboxes, preferences, feedback, and Feishu identities |
| Shared collection | Public feeds are fetched once and reused across users |
| Source governance | Private → candidate → shared review flow |
| Noise control | Include/exclude keywords, URL normalization, deduplication, and paper quotas |
| Resilient fetching | Per-source exponential backoff and source health visibility |
| Admin control plane | Users, trends, candidate review, network policy, health, and audit logs |
| Optional Feishu delivery | One-time binding code and private daily digest |
| Self-hosted stack | FastAPI, SQLite WAL, RSSHub, Redis, and Docker Compose |
Requirements: Docker Desktop or Docker Engine with Compose.
git clone git@github.com:tracy586ymz-eng/tech-radar-multi.git
cd tech-radar-multi
cp .env.example .envBefore starting, edit .env and replace at least ADMIN_PASSWORD and SESSION_SECRET.
docker compose up -d --buildOpen http://localhost:1410, then sign in with the administrator credentials from .env.
curl -fsS http://localhost:1410/health
docker compose logs -f tech-radar-multiStop without deleting data:
docker compose downDo not use
docker compose down -vunless you intentionally want to remove the Redis volume.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env
set -a
source .env
set +a
.venv/bin/python -m app.mainThe local server listens on 127.0.0.1:1410 by default. For direct Python runs, set DATABASE_PATH=runtime/tech-radar-multi.db in .env.
flowchart LR
S[Official RSS / RSSHub] --> F[Shared fetcher]
F --> D[Normalize + deduplicate]
D --> A[(Global article store)]
U[Per-user sources, keywords, limits] --> R[Personal relevance & quality gate]
A --> R
R --> I[Web inbox]
R --> L[Feishu digest]
H[Admin: health, candidates, trends, audit] --> F
The first release is a modular monolith: the FastAPI web application and background worker run together, while SQLite WAL provides durable storage for a single-instance deployment. See the architecture guide for data isolation and scaling boundaries.
Feishu is optional; the web inbox works without it.
- Create an internal Feishu app and enable the bot.
- Add the permission to send messages as the app.
- Subscribe to direct-message events if users should bind themselves.
- Set the callback URL to
https://your-domain.example/api/feishu/events. - Configure
FEISHU_APP_ID,FEISHU_APP_SECRET, andFEISHU_VERIFICATION_TOKENin.env. - A user generates a one-time code in Settings and sends
绑定 XXXXXXto the bot.
No phone number or full contact directory is required. Only the app-scoped Feishu identifier used for delivery is stored.
- Application database:
runtime/tech-radar-multi.dbfor local runs,/data/tech-radar-multi.dbin Docker. - Redis cache: the
redis-dataDocker volume. - Secrets:
.env, which is ignored by Git.
./scripts/backup.shBackups contain application data. Store them privately and never commit them.
Tech Radar Multi currently targets a trusted team of roughly 5–20 users behind HTTPS. It includes salted password hashing, signed sessions, tenant-aware queries, and audit logs, but it is not yet hardened for open public registration.
Before exposing it to the public internet, add CSRF protection, login rate limiting, password reset, invitation expiry, and user data export/deletion. See SECURITY.md.
Version 0.1 makes no hidden LLM calls and contains no model API integration. See PRIVACY.md for the exact local and external data boundaries.
- It does not yet generate LLM summaries; it preserves feed summaries and explains keyword matches.
- Daily Feishu digests are implemented; realtime and weekly toggles are modeled but not fully scheduled.
- A single server timezone drives the current digest worker.
- SQLite is intentionally limited to a small, single-instance team deployment.
python3 -m unittest discover -s tests -vThe tests cover tenant isolation, private source ownership, keyword boundaries, deduplication, paper quotas, Feishu event parsing, password hashing, and session tamper detection.
- Chinese/English model-assisted summaries with transparent citations
- Realtime alerts and weekly review jobs
- CSRF protection, rate limiting, password reset, and invitation expiry
- PostgreSQL, a standalone worker, and a job queue for multi-instance deployment
- Feishu SSO and additional delivery channels
- Import/export for OPML and user settings
- Relevance evaluation dashboard and explainable ranking experiments
Issues and pull requests are welcome. Start with CONTRIBUTING.md, especially if you want to add a delivery channel, feed connector, ranking rule, or deployment target.
If this project helps your team build a calmer information workflow, consider giving it a ⭐ — it helps more builders discover the project.
MIT © 2026 tracy586ymz-eng