senclaw/news

app Trung tâm tin tức cá nhân: thu thập bài từ nhiều nguồn RSS/Atom (VnExpress, Tuổi Trẻ, BBC… hoặc TỰ TÌM NGUỒN bằng AI theo chủ đề / dò feed từ URL trang web) VÀ từ các trang KHÔNG CÓ RSS bằng cách quét link bài viết ngay trong nội dung trang (đọc Open Graph của từng bài để lấy tiêu đề/tóm tắt/ảnh/ngày đăng) theo chu kỳ, dedup tự động, gán CHỦ ĐỀ theo từ khóa, phát hiện XU HƯỚNG (cụm từ tăng nhiệt so kỳ trước — thuần thống kê), gom bài cùng sự kiện từ nhiều nguồn thành DÒNG SỰ KIỆN với timeline diễn biến, BẢN ĐỒ LIÊN KẾT sự kiện dạng graph (kéo-thả, phóng to/thu nhỏ) kèm AI map lại thành mạch chuyện, tìm kiếm toàn văn không dấu (FTS5), tải toàn văn bài gốc, và AI qua bridge SenClaw: đánh giá từng bài (tóm tắt, cảm xúc, tầm quan trọng, giật tít, độ tin cậy), tóm tắt diễn biến sự kiện, nhận định xu hướng, viết bản điểm tin. Giao diện sáng/tối. Dữ liệu 100% local (SQLite) — app chỉ ĐỌC tin, không đăng gì lên đâu.

Install

senclaw app install senclaw/news

Verifies sha512 and SenClaw’s signature before writing to disk.

Documentation

Tin Tức — SenClaw News Space App

Trung tâm tin tức cá nhân chạy hoàn toàn local: thu thập bài từ nhiều nguồn RSS/Atom — và cả những trang không có RSS, bằng cách quét link bài viết ngay trong nội dung trang — gán chủ đề theo từ khóa, phát hiện xu hướng, gom bài cùng sự kiện thành dòng sự kiện với timeline, và AI phân tích qua bridge SenClaw.

  • Port: 4660 · MCP: **news-mcp** (mcp__news-mcp__news_*, 27 tools)
  • Dữ liệu: ~/.senclaw/apps/news/news.db (SQLite, FTS5)
  • Outbound duy nhất: các feed người dùng khai + bridge LLM của daemon. App chỉ đọc tin — không đăng/gửi gì đi đâu.

Kiến trúc

src/
  main.rs     — axum server (:4660) + scheduler quét feed định kỳ
  fetch.rs    — HTTP + parser RSS 2.0/Atom (quick-xml), conditional GET
                (ETag/Last-Modified), trích xuất toàn văn trang bài, và
                SCRAPER cho trang không có RSS (scan_page_articles: lọc
                <a> theo độ dài tiêu đề + dạng slug + cùng host;
                parse_page_meta: đọc Open Graph của từng bài mới)
  cluster.rs  — tokenize tiếng Việt (GIỮ dấu), gom dòng sự kiện (token
                profile overlap), phát hiện trend (n-gram spike vs kỳ trước),
                bản đồ liên kết sự kiện (trùng CỤM 2 âm tiết + lọc IDF)
  db.rs       — SQLite: sources, articles (+FTS5 remove_diacritics 2 →
                tìm không dấu), topics, stories, analyses, activity, settings
  llm.rs      — bridge AI: đánh giá bài (JSON), tóm tắt dòng sự kiện,
                điểm tin, nhận định xu hướng
  api.rs      — REST + các *_value helper dùng chung với MCP
  mcp.rs      — MCP server news-mcp (HTTP + SSE)
web/          — React 19 + AntD 6, sáng/tối/theo hệ thống (7 tab: Tổng quan /
                Tin tức / Xu hướng / Dòng sự kiện / Điểm tin AI / Chủ đề /
                Nguồn tin). Tab Dòng sự kiện có 2 chế độ: danh sách + timeline,
                hoặc BẢN ĐỒ graph (force layout, kéo-thả node, kéo nền, zoom).

Hai kiểu nguồn

kind='feed'kind='scrape'
URL trỏ vàotài liệu RSS/Atomtrang chuyên mục/danh sách bài bình thường
Lấy bài bằngparser XMLlọc <a> trong HTML: tiêu đề ≥24 ký tự & ≥4 từ, href dạng slug bài viết, cùng host, bỏ <nav>/<header>/<footer>
Ngày đăng, tóm tắt, ảnhfeed cung cấp sẵnmở từng bài MỚI đọc Open Graph (og:*, article:published_time), tối đa 25 bài/chu kỳ
Chi phí một chu kỳ1 request1 + số bài mới (≤25), 5 request song song

Ưu tiên feed khi trang có cả hai — rẻ hơn, ngày đăng chuẩn hơn, không phải đoán. news_source_discover tự làm việc đó: dò feed trước, chỉ khi không có feed nào mới đề xuất kind='scrape'. Cả hai kiểu đi tiếp cùng một đường ống (dedup theo URL → gán chủ đề → gom dòng sự kiện), nên mọi tính năng phía sau không phân biệt nguồn đến từ đâu.

Giới hạn thật thà: scraper đọc HTML server-render, không chạy JavaScript. Trang chỉ dựng danh sách bài bằng JS sẽ quét ra rỗng — app báo lỗi rõ ở last_error thay vì im lặng coi như "không có tin mới".

Hai tầng liên kết sự kiện

Máy (thống kê)AI (ngữ nghĩa)
Cách làmtrùng cụm 2 âm tiết giữa tiêu đề, lọc cụm phổ thông bằng IDFđọc cả bản đồ qua bridge, map lại
Cho racạnh xám, kèm cụm chung + % trùngmạch chuyện (tô màu node), cạnh nét đứt tím "AI nối thêm", cạnh nghi nhiễu
Bắt đượccùng chủ đề, chung tên riêngnhân quả, cùng chủ thể — thứ không trùng chữ nào

Ngưỡng máy đặt chặt (≥2 cụm chung, hoặc 1 cụm nhưng chiếm ≥20%) để bản đồ không thành mạng nhện; phần mở rộng ngữ nghĩa là việc của AI. Mọi id AI trả về đều được đối chiếu với graph thật trước khi vẽ — id bịa bị loại.

Nguyên tắc phân vai: máy đếm, AI diễn giải. Gom sự kiện + trend là thuần thống kê, deterministic; AI chỉ tóm tắt/diễn giải trên số liệu đã tính và mọi prompt đều cấm bịa thêm.

Chạy dev

cargo run -p news                    # backend :4660 (tự seed nguồn VN + quốc tế)
cd apps/news/web && npm run dev      # UI dev, proxy /api → :4660
cargo test -p news                   # 79 unit tests

Đóng gói

apps/news/scripts/pack.sh            # → apps/news/news-app.zip

MCP nhanh

NhómTools
Thu thậpnews_fetch, news_source_discover (AI/URL), news_source_add/list/update/delete
Đọc tinnews_latest, news_search, news_article_get, news_article_content
Chủ đềnews_topic_add/list/update/delete
Xu hướngnews_trends, news_analyze_trends
Dòng sự kiệnnews_story_list, news_story_get, news_story_brief, news_story_graph, news_analyze_graph
AInews_analyze_article, news_digest, news_digest_history
Khácnews_status, news_dashboard, news_activity

Declared permissions

{
  "network": [
    "127.0.0.1"
  ],
  "exec": [
    "./news"
  ]
}

Declared by the publisher, not enforced by SenClaw. The CLI compares this against what you already have installed and asks before anything widens.

Published by

@senclawtrusted
benji
44 packages · 0 downloads · member since 2026-07 · GitHub since 2015-06

The checkmark means SenClaw confirmed who this publisher is. It says nothing about whether their packages are safe.

About

Owner@senclaw
Latest1.0.0
Downloads (30d)0
Repositorygithub.com/NortonBen/senclaw-app

Versions

VersionTagsArtifactsPublished
1.0.0latestdarwin-arm64, linux-x64, win32-x642026-08-07

Artifacts · 1.0.0

PlatformFormatSignatureFileSize
darwin-arm64zipunsignednews-app.zip3290 KB
linux-x64zipunsignednews-app.zip3682 KB
win32-x64zipunsignednews-app.zip3633 KB

Unsigned builds require sign-in to download and are not distributed to the auto-updater, because unsigned executables from a new domain get flagged as unsafe. Sign and notarize (macOS) or Authenticode-sign (Windows) to distribute publicly.

Auto-update endpoints

For a Tauri app — add to tauri.conf.json:

"endpoints": ["https://senclaw.bacnd.com/api/v1/updates/tauri/senclaw/news/{{target}}/{{arch}}/{{current_version}}"]

For an electron-updater app — generic provider URL:

https://senclaw.bacnd.com/updates/senclaw/news/stable

Only signed/notarized artifacts are offered as updates — a client fetches the update without credentials, and unsigned binaries are not publicly downloadable.

Something wrong with this package?

Report this package

Report this package

Tell us what is wrong and a moderator will look at it. Be specific — a report that names a version and a behaviour can be checked in minutes; one that says “looks sketchy” cannot be acted on at all.

Not about this package? Contact us instead. What happens to a report is described in reporting and moderation.

API: GET https://senclaw.bacnd.com/api/v1/packages/senclaw/news