尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證AI-powered developer news aggregation platform combining tech news, AI updates, GitHub trends, Hacker News, engineering blogs, and open-source discoveries into one personalized dashboard.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗An AI-powered, personalized news feed for developers. AI news · GitHub trending · Hacker News · engineering blogs · open-source launches — all in one beautiful dashboard.
Built with Next.js 14 (App Router) + TypeScript + Tailwind + shadcn/ui + Supabase + Vercel Cron. Runs end-to-end on free tiers.
/bookmarks and /settings routes.| Layer | Choice |
|---|---|
| Framework | Next.js 14 App Router |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS + shadcn/ui |
| Database | Supabase Postgres (free) |
| Auth | Supabase Auth (free) |
| Cron | GitHub Actions (free) — pings cron endpoints on schedule |
| AI summary | Hugging Face Inference API (free, opt-in) + rule-based fallback |
| Hosting | Vercel (free) |
No paid services. No vector DB. No OpenAI billing.
.
├── src/
│ ├── app/ # App Router pages, API, layouts
│ │ ├── api/
│ │ │ ├── articles/ # GET feed (paginated, filterable)
│ │ │ ├── auth/callback/ # Supabase OAuth callback
│ │ │ ├── bookmarks/ # User bookmarks
│ │ │ └── cron/
│ │ │ ├── rss/ # Hourly RSS ingestion
│ │ │ ├── github/ # 6-hourly GitHub trending
│ │ │ └── hackernews/ # 30-min HN top stories
│ │ ├── bookmarks/
│ │ ├── categories/[slug]/
│ │ ├── login/, register/, settings/, trending/
│ │ ├── error.tsx, loading.tsx, not-found.tsx
│ │ ├── sitemap.ts, robots.ts
│ │ ├── layout.tsx, page.tsx
│ │ └── globals.css
│ ├── components/ # Reusable UI (navbar, cards, widgets, ui/)
│ ├── services/ # rss / github / hackernews / articles
│ ├── utils/ # summarizer, classifier, feed-parser, format
│ ├── lib/ # supabase clients + constants + utils
│ ├── hooks/ # use-debounce, use-bookmarks
│ ├── providers/ # theme, supabase
│ ├── actions/ # server actions (auth)
│ └── types/ # article, database
├── supabase/
│ └── schema.sql # complete DB schema + RLS policies
├── .github/workflows/ # GitHub Actions cron triggers (free)
│ ├── cron-rss.yml # hourly RSS ingestion
│ ├── cron-hackernews.yml # 30-min HN ingestion
│ ├── cron-github.yml # 6-hour GitHub trending
│ └── keepalive.yml # weekly — stops GitHub auto-disabling the crons
├── middleware.ts # Supabase session refresh + protected routes
├── vercel.json # Vercel config — daily backup RSS cron
├── next.config.mjs
├── tailwind.config.ts
├── tsconfig.json
├── components.json # shadcn config
├── package.json
├── .env.example
└── README.md
This project is designed to be deployed without running anything on your machine.
Upload this folder to a fresh GitHub repository (drag & drop in github.com works fine).
supabase/schema.sql → run.Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (server-only, used by cron jobs)vercel.com → Add New → Project → import the GitHub repo.
Framework preset: Next.js (auto-detected).
Environment Variables — add the values from .env.example:
| Name | Example |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | https://abcdefgh.supabase.co |
NEXT_PUBLIC_SUPABASE_ANON_KEY | eyJ… (the anon key) |
SUPABASE_SERVICE_ROLE_KEY | eyJ… (the service-role key) |
CRON_SECRET | any long random string |
NEXT_PUBLIC_SITE_URL | https://<your>.vercel.app |
HUGGINGFACE_API_KEY | optional — HF token, or leave blank for rule-based summaries |
Click Deploy.
Vercel's Hobby plan only allows daily crons, so we use GitHub Actions instead. The workflows are already in .github/workflows/ and will run automatically once you add two secrets:
Go to your repo on GitHub → Settings → Secrets and variables → Actions → New repository secret
Add these two secrets:
| Name | Value |
|---|---|
SITE_URL | Your Vercel URL, e.g. https://devfeed.vercel.app (no trailing slash) |
CRON_SECRET | Same long random string you set in Vercel env vars |
That's it. The three workflows will start running on their schedules:
cron-rss.yml — every hourcron-hackernews.yml — every 30 mincron-github.yml — every 6 hoursYou can also trigger any of them manually: Actions tab → pick a workflow → Run workflow.
Two safety nets keep ingestion running even when the repo is quiet:
keepalive.yml — GitHub disables scheduled workflows after 60 days without a commit. This weekly workflow re-enables them through the API, so that never kicks in.vercel.json) — calls /api/cron/rss once a day as a backup. That also keeps the free Supabase project active (it pauses after 7 days without traffic). Vercel sends CRON_SECRET automatically.You don't have to wait an hour for the first cron tick. Easiest way: go to your GitHub repo → Actions tab → pick any of the three workflows → Run workflow. Do that for all three to populate every source.
Alternatively, hit the endpoints directly. If CRON_SECRET is set, you'll need to send it as a Bearer header:
https://<your>.vercel.app/api/cron/rss
https://<your>.vercel.app/api/cron/github
https://<your>.vercel.app/api/cron/hackernews
When CRON_SECRET is unset (e.g. for local testing), the routes are open — set it before going to production.
This is almost always the free-tier services going to sleep, not a code bug:
Ingest … workflow once (Run workflow) so fresh articles appear right away.src/utils/summarizer.ts exports a summarize() function:
HUGGINGFACE_API_KEY is set, try sshleifer/distilbart-cnn-12-6 via the Hugging Face Inference API. ~2-second timeout to keep cron fast.generateWhyItMatters() matches the title + summary against keyword rules to produce a short developer-facing rationale ("security teams should patch", "platform engineering shift", "AI tooling signal", etc.).
classify() in src/utils/classifier.ts assigns one of the 8 categories using regex rules over the title and content.
All three are zero-cost, deterministic, and run inside the cron job before upserting into Supabase.
If you ever want to run it locally:
git clone <your-repo>
cd <repo>
cp .env.example .env.local # fill in real values
npm install
npm run dev
App runs at http://localhost:3000. The cron endpoints can be hit manually at the URLs above.
src/lib/supabase/server.ts createServiceClient() and the cron route handlers.Authorization: Bearer $CRON_SECRET when the env var is set.zod.user_preferences.categoriesMade with care. No paid APIs were harmed in the making of this project.