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