尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A deck for political & news react streamers. Triage chat-submitted links, get DMCA risk signals, and turn your stream into show notes.
Built with Next.js 14 (App Router), Supabase, Anthropic Claude, and Twitch EventSub webhooks. Deploys entirely on Vercel — no separate worker needed.
1. npm install
2. Copy .env.example to .env.local and fill查看完整 README ↗A deck for political & news react streamers. Triage chat-submitted links, get DMCA risk signals, and turn your stream into show notes.
Built with Next.js 14 (App Router), Supabase, Anthropic Claude, and Twitch EventSub webhooks. Deploys entirely on Vercel — no separate worker needed.
app/
page.tsx ─ landing
login/ ─ login + OAuth error display
deck/ ─ streamer's reaction view (single-card focus)
mod/ ─ mod triage view (firehose → approved queue)
setup/ ─ per-stream settings + EventSub status
api/
twitch/oauth/ ─ start OAuth
twitch/callback/ ─ finish OAuth, upsert stream, set session, register EventSub
twitch/eventsub/ ─ Twitch EventSub webhook handler (receives chat messages)
twitch/eventsub/status/ ─ check/reconnect EventSub subscription
queue/ ─ POST submit, GET list, PATCH mutate
deck/add/ ─ streamer direct-add (URLs + playlist expansion)
queue/reorder/ ─ drag-drop reorder
queue/clear/ ─ bulk-reject pending items
notes/ ─ GET show notes as JSON or Markdown
notes/discord/ ─ GET preview / POST the played list to a Discord webhook
setup/ ─ save settings
auth/ ─ logout
lib/
url.ts ─ normalize URLs, detect media kind
extract.ts ─ orchestrates extraction per media kind
extract-article.ts ─ Mozilla Readability + OpenGraph
extract-youtube.ts ─ YouTube page scraping + oEmbed + transcript
extract-twitter.ts ─ Twitter/X metadata
enrich.ts ─ Anthropic summary + credibility + DMCA risk
submit-url.ts ─ shared queue insertion + dedup logic
search-coverage.ts ─ Brave Search for related coverage
discord.ts ─ builds and sends the played list to a Discord webhook
twitch-oauth.ts ─ OAuth helpers
twitch-eventsub.ts ─ EventSub verification, subscription management
supabase.ts ─ service-role client
session.ts ─ signed-cookie session
components/
SubmissionCard.tsx
DarkModeToggle.tsx
supabase/
schema.sql ─ run this in Supabase SQL editor
npm install.env.example to .env.local and fill in:
http://localhost:3000/api/twitch/callbackNEXT_PUBLIC_TWITCH_CLIENT_ID and TWITCH_CLIENT_SECRETsupabase/schema.sql in the SQL editorNEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEYANTHROPIC_API_KEYopenssl rand -hex 32, set as EVENTSUB_SECRETYOUTUBE_API_KEYBRAVE_SEARCH_API_KEYnpm run dev and open http://localhost:3000People can sign in with a magic link instead of Twitch; those accounts get the deck and shelves but none of the chat features. Supabase Auth proves the email address, then the app issues its own session cookie (app/auth/callback). Email signup is open to anyone and is not subject to REQUIRE_APPROVAL.
Supabase dashboard setup:
{NEXT_PUBLIC_APP_URL}/** (and http://localhost:3000/**) to Redirect URLs.{{ .RedirectTo }}?token_hash={{ .TokenHash }}&type=email.smtp.resend.com, port 465, user resend, password = API key) and a higher email rate limit.No new environment variables.
NEXT_PUBLIC_APP_URL = your production URL (e.g. https://thebroadside.net)EVENTSUB_SECRET = the secret generated above.env.example{NEXT_PUBLIC_APP_URL}/api/twitch/callback.streams, register an EventSub webhook for their chat, and set a signed cookie./api/twitch/eventsub. The handler extracts URLs, applies permission/command/ignore filters, and adds them to the queue. This works 24/7 — no browser tab needs to be open./mod → see incoming links, approve/reject/add notes, and attach a viewer-facing trigger warning to anything that needs one./deck → shows only approved items in a drag-sortable sidebar. Trigger warnings can also be added or edited here mid-show, and appear on the overlay immediately.show_notes./api/notes?format=markdown, or post the played list to a Discord channel from Setup → Account or the deck header.app_theme is a default — a mod who explicitly picks High contrast because they can't read the streamer's palette keeps that choice, since only an unset preference falls through to the brand. overlay_theme is absolute: it's matching branding on air with nobody around to adjust it, so it gets per-slot colours rather than inheriting the app's six tokens. The overlay reads its theme from the poll rather than the URL, which is the only way a colour change reaches a browser source mid-show.font-family, and colours are written straight into a <style>; lib/theme.ts normalises colours to #rrggbb and restricts families to letters, digits and spaces once, at the point of saving, so no reader has to re-derive the rules.content_warning is AI-guessed and internal (a triage hint on the card). mod_notes is an internal production aside. trigger_warning is the only one written for the audience — the streamer or a mod types it, and it's published verbatim: it opens the !video reply and the "Post to chat" message (ahead of the title and url, so it survives Twitch's pinned-message preview), and it's shown on the on-air overlay. Keeping them separate is what lets the first two stay candid.mod_notes trail.discord_posted_at tracks what's already gone to Discord separately from notes_exported_at's Markdown boundary — a streamer posting to Discord and exporting Markdown to somewhere else on different schedules would otherwise find one export silently empty because the other already advanced a shared cursor. The webhook URL itself is a bearer secret (anyone holding it can post into that channel), so it's encrypted at rest the same way as the Twitch OAuth tokens and never sent back to the client after saving — only a "configured" flag is.MIT. Do whatever.