尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Built a finishable feed for the accounts you follow. Combines YouTube channels, X accounts and Substack publications into one chronological feed you can actually reach the end of, with no algorithm and no infinite scroll. Vanilla JavaScript with no framework or build step, Vercel serverless functions and Neon Postgres.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A finishable feed for the accounts you follow. Pick your YouTube channels, X accounts and Substack publications, get one chronological feed, mark items Done or Archive, and reach "You're all caught up." No infinite scroll, no algorithm.
Live at https://trysouschef.vercel.app
@handle, ID or name, or import your
subscriptions), X accounts (@handle) and Substack publications (URL or name).api/.Requires Node 18 or later.
npm install
node dev-server.mjs
The landing page is at http://localhost:3000 and the app is at http://localhost:3000/app. The
server answers only this computer; use node dev-server.mjs --lan to open the app on a phone on the
same network.
Configuration goes in a .env file at the repo root:
| Variable | What it enables | Without it |
|---|---|---|
DATABASE_URL | Sign-in and sync (Neon Postgres) | Nobody can sign in |
DEV_DATABASE_URL | A separate development database, used instead of DATABASE_URL outside production | DATABASE_URL is used |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | Sign in with Google, and YouTube import | The Google button is unavailable |
RESEND_API_KEY | Magic-link emails | No email is sent |
YOUTUBE_API_KEY | The YouTube Data API | Falls back to RSS and page scraping |
X_BEARER_TOKEN | X accounts | X is unavailable |
ANTHROPIC_API_KEY | Topic grouping | The feed stays ungrouped |
X_DAILY_POST_QUOTA | A daily per-person limit on X posts | Usage is counted and nobody is limited |
ADMIN_EMAIL | The usage dashboard at /admin.html for that account | The dashboard is closed |
Create the tables once with node scripts/init-db.mjs. It is safe to re-run.
Check which database you are on. If DATABASE_URL is your production database, set
DEV_DATABASE_URL to a development one before running anything locally. The dev server prints the
database host when it starts, and scripts that write refuse production unless you pass --prod.
If you fork this: magic-link emails are sent from the address in api/_resend.js. Change it to
a domain you have verified with Resend. The Google OAuth client needs
<origin>/api/auth/google/callback as an authorised redirect URI.
index.html, landing.js landing page, served at /
app/index.html app shell, served at /app
app.js, style.css client logic and styles
lib/pure.js pure functions shared by the app and the tests
privacy/index.html privacy policy, served at /privacy
admin.html, admin.js usage dashboard
api/ serverless functions; files starting with _ are helpers, not routes
scripts/ database setup and maintenance scripts
dev-server.mjs local server
test/ tests and fixtures
test-helpers/ test harnesses
npm test
The suite uses node:test, which is built into Node, so there is no test framework to install. It
covers the server code in api/, the pure functions in lib/pure.js, and the client logic in
app.js and landing.js, which the harnesses in test-helpers/ run against a stubbed browser.
npm install sets up a pre-commit hook that runs the suite.
npm run mutate <spec> runs a mutation battery: it applies each deliberate breakage listed in a
spec file, runs the suite, and reports which test caught it.
SousChef is developed in a private repository, and this one is a snapshot of its code and tests. Contributions are welcome: see CONTRIBUTING.md, the Code of Conduct, and SECURITY.md for reporting a vulnerability.
MIT. See LICENSE.