尚未检测到更新。GitHub 发布版本后会显示在这里。
A minimal personal RSS/Atom/JSON reader.
翻译准备中
正在加载完整 README。
查看完整 README ↗A minimal, self-hosted RSS/Atom/JSON feed reader for one person. Plain PHP (no framework), flat JSON file storage (no database), vanilla HTML/CSS/JS (no build step).
<link rel="alternate"> tags, feed links on the page, the site's feed-directory page, conventional paths like /rss.xml, and per-section feeds of news sites.See the in-app Settings panel and feed row menus for the full interaction surface, or DOCUMENTATION.md for the complete reference.
brew install php
cp src/config.sample.php src/config.php # if not already done
php -S localhost:8000 -t public
Open http://localhost:8000/ and create your login on first visit; that first account is the admin, who can add more accounts under Settings → Users. Data lives under data/ as JSON files, one folder per account in data/users/<id>/. Lost your password? An admin can reset it in Settings → Users; for the only admin, run on the server:
php -r 'require "src/bootstrap.php"; Users::setPassword(Users::findByUsername("YOUR_NAME")["id"], "NEW_PASSWORD");'
cron/refresh.php refreshes every feed past its interval and logs to data/cron.log. Pick one:
public/cron.php with a CRON_TOKEN in src/config.php, then hit its URL on a schedule (host cron panel, cron-job.org, GitHub Actions).*/15 * * * * php /path/to/rss/cron/refresh.php >> /path/to/rss/data/cron-stderr.log 2>&1LaunchAgent plist calling the same script on an interval.The manual "Refresh all" button always force-refreshes regardless of interval.
bin/package-for-deploy.sh: it builds ./deploy/ from git archive (no local data, ever) and scaffolds src/config.php. Upload its contents; point the doc root at public/ if possible..htaccess in data//src/ blocks direct access as a fallback.public/.htaccess as defense-in-depth on top of app login.When a higher version number is on GitHub (from src/version.json), the footer shows "Version X available". Click it to open Settings, or use Check for updates there to ask GitHub right away instead of waiting for the hourly check. To release an update, bump that number and push.
From the app (easiest): in Settings → Version, press Download version X. The server builds quill-X.zip from the latest commit on main, using the same exclusions as bin/package-for-deploy.sh. It needs only curl, not the zip extension. The package is update-safe: it contains no src/config.php and nothing from data/ except the tracked templates. Upload the contents of its quill-X/ folder over your install. Safari unzips the download for you.
Manually:
[!WARNING] Pull/download the new version, re-run
bin/package-for-deploy.sh, and upload it over the old install.On your server you can replace
public/,cron/, and all ofsrc/exceptsrc/config.php. That one file holds your login credentials andCRON_TOKEN, and overwriting it with the freshly generated one wipes them.Leave
data/alone entirely.
public/ document root: index.html, style.css, app.js, api/*.php, cron.php
src/ PHP classes: Storage, Auth, FeedFetcher, FaviconResolver, FeedDiscovery, RefreshService, OpmlImporter, YouTubeResolver, UpdatePackager
data/ users.json (accounts), users/<user_id>/{feeds.json, items/, items-index/, search-index/, search-counts/, pages/}, cron.log
cron/refresh.php CLI scheduled-refresh entry point (see also public/cron.php)
Every public/api/*.php endpoint requires login except auth.php (users.php and update-package.php require an admin); public/cron.php is unauthenticated but gated by CRON_TOKEN. See inline docblocks / src/ for endpoint details.