尚未偵測到更新。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.