⚡ 鉴于近期 DeepSeek 涨价等一系列因素,开发活动将较大放缓——更新节奏会变慢,敬请理解。
Skip to content

Web UI (sip-web)

⚠️ Test software notice

This is a test / experimental piece of software. It has NO security features.

  • No authentication, no access control, no encryption
  • Anyone who can reach the service port can read and write your sip data (add/remove feeds, delete articles, fetch, etc.)
  • Use it only in a local development environment. Do NOT expose it to the public internet, do not bind non-loopback addresses, do not run it in shared/untrusted environments
  • Use at your own risk; the author is not responsible for data loss or leakage

Don't want to open a terminal? Give sip a local Web UI: manage subscriptions, read articles, full-text / semantic search, Today's Hotsoup, and version diffs right in the browser. It translates web requests into HTTP calls — a lightweight HTTP service turns each request into a sip <command> --json CLI invocation and returns sip's structured output to the page unchanged.

中文版简体中文 · Repo: hahahotsoup/sip-webapiextra

How it fits together

Browser (http://127.0.0.1:8777)
        │ Web requests (REST / JSON)

   sip-web.py (local HTTP server · translation layer)
        │ translated into CLI calls: sip <command> --json --ignoresafeannouncement

   sip executable (sip.exe / sip, local single-file)


   Your subscribed trusted RSS sources (readwithhotsoup/ data dir)

Core: sip-web.py is a "translation layer" — every request from the browser is translated into one sip CLI command, and the JSON output is passed back unchanged. It does not re-implement sip's logic; it is just a Web skin over the sip CLI.

Prep: put sip-web next to sip

sip-web needs to find the sip executable — copy the files into the folder that contains sip.exe (or sip):

text
sip.exe          ← your sip program
readwithhotsoup/ ← your data dir (created by sip)
sip-web.py       ← this program (web server + translation layer)
index.html       ← the web UI
start-sip-web.bat / start-sip-web.sh   ← optional launchers

Why together? sip's data lives in readwithhotsoup/ (next to the exe); the translation layer invokes sip with that directory as the working directory, so both read and write the same data.

Start

bash
# Windows: double-click start-sip-web.bat, or from a terminal
python sip-web.py

# macOS / Linux
./start-sip-web.sh

# Custom port / sip path
python sip-web.py --port 9000 --sip /path/to/sip

Open http://127.0.0.1:8777 in your browser.

CLI options

OptionDescription
--port 9000Listen port (default 8777)
--host 0.0.0.0Listen address (default 127.0.0.1, local-first)
--sip /path/to/sipPath to the sip executable (default: same dir as the script)
--timeout 300Per-call CLI timeout in seconds

What the Web UI can do

UITranslated sip command
🏠 Overview (stats + Today's Hotsoup)sip -l / sip --today
📡 Feed list / article listsip -l / sip -l <id>
📖 Article reading (HTML body / fulltext first)sip --show <id> --json
📄 Full-text search (no AI needed)sip --grep <term> --json
🧠 Semantic search (needs AI config)sip --search <term> --json
🍵 Today's Hotsoup (with change digest)sip --today [--refresh] --json
➕ Add a feedsip -d <url>
🔄 Sync / update allsip --sync / sip --update-all
🗄 Archive / unarchive / deletesip -a / sip -una / sip -r --yes
♥ Like / likes listsip --like <id> / sip --likes
📥 Fetch fulltextsip --fulltext <id> --yes --json
📜 Versions / ⇄ diffsip --versions <id> / sip --diff <id> --json
✨ Summary (needs AI config)sip --summary <id> --json

HTTP API (the translation layer)

All endpoints return sip's original JSON shape ({"success":true,"data":{...}} or {"success":false,"error":{...}}), so other tools (scripts, agents, automation) can integrate directly.

GET    /api/status                     sip version & connectivity
GET    /api/feeds                      list feeds
POST   /api/feeds            {url}     add a feed
GET    /api/feeds/{id}                 articles of a feed (?limit=N)
GET    /api/feeds/{id}/info            feed health info
POST   /api/feeds/{id}/update          update a feed
POST   /api/feeds/{id}/archive         archive
POST   /api/feeds/{id}/unarchive       unarchive
DELETE /api/feeds/{id}                 remove feed (--yes)
POST   /api/feeds/sync                 update only due feeds
POST   /api/feeds/update-all           force-update everything
GET    /api/articles/{id}              article detail (with body)
GET    /api/articles/{id}/versions     version history
GET    /api/articles/{id}/diff         diff (?from=v&to=v)
POST   /api/articles/{id}/fulltext     fetch fulltext
DELETE /api/articles/{id}/fulltext     purge fulltext cache
POST   /api/articles/{id}/like         like / unlike
POST   /api/articles/{id}/summary      generate summary
GET    /api/likes                      liked articles
GET    /api/search/grep?q=…            full-text search (?feed=N&limit=N)
GET    /api/search/semantic?q=…        semantic search (?feed=N&threshold=0.7)
GET    /api/today?refresh=1            Today's Hotsoup
GET    /api/config                     AI config status

⚠️ Known limitations (no security features)

  • No auth / no authorization: binding to 127.0.0.1 only means the machine itself can reach it — any process or user on that machine can operate your data through this port
  • No encryption: plain HTTP; the Web layer provides no protection at all
  • No sandboxing: the translation layer turns requests straight into sip CLI calls; arguments are not semantically validated
  • Test-only: not security-audited — do not use in production or on the public internet

FAQ

  • "Cannot find sip" on startup: put sip-web.py next to sip.exe, or pass --sip with the full path.
  • Search reports "AI not configured": semantic search needs an Embedding provider configured via sip --init (run manually in a real terminal); full-text search (--grep) needs no AI and always works.
  • Cross-platform? The backend uses only the Python standard library (3.10+); works on Windows / macOS / Linux. The frontend is a single HTML page with no build step.
最近更新

Released under the GNU General Public License v3.0 (GPL-3.0)