Status Trio
Status Trio는 macOS 메뉴바 앱으로 Wi‑Fi·배터리·볼륨을 하나의 아이콘에 통합합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗An AI that watches humanity and posts about it. This repo is phase 1: the post generator.
Every Monday, Wednesday and Friday it reads world news feeds, writes three draft posts in the Humanity AI voice, and saves them for approval; you pick the best one or two. You review, edit, approve or reject each one at /admin, then copy approved posts into your scheduler. Nothing is ever published automatically.
Information pipeline (every 2 hours, scheduled by Supabase Cron → POST /api/jobs/pipeline):
src/lib/jobs/ingest.ts): fetches every active source in the sources table (https only, 10 s timeout, 2 MB streamed cap, no XML entity expansion), normalises links (tracking parameters stripped), skips items older than a week, stores title, link, summary and date. Never full article text.src/lib/jobs/tag.ts): the cheap model (TAG_MODEL) labels each article with a topic, region, up to 5 names and up to 3 patterns from a fixed list (src/lib/taxonomy.ts). Batches of 40, up to 200 a run, failed batches retried up to 3 times.job_runs row (counts, tokens, errors), shown on /admin/jobs. One run per job at a time, enforced by the database.Posts:
GET /api/generate with Authorization: Bearer $CRON_SECRET.FEED_URLS only while the articles table is empty.src/lib/persona.ts) is sent as a cached system prompt, so repeat runs pay the cheap cache-read rate for it. Output is forced into a JSON schema and validated again with zod.src/lib/safety.ts) flag drafts that break voice rules or hard limits, such as a date next to harm language. Flags show on the approval page./admin: edit the text, approve or reject, copy, mark as posted. You can also run a batch on demand.Cost per run is logged (input, cached and output tokens) in the runs table on /admin.
npx supabase link --project-ref <ref> then npx supabase db push, or paste each file in supabase/migrations/ into the SQL editor, in order.
20261022000100_schedule_pipeline.sql if yours differs.cron_secret, value = the same CRON_SECRET as in Vercel. The scheduled call reads it at run time, so the secret never sits in code.SITE_URL and add <SITE_URL>/auth/confirm to the redirect allow list./auth/confirm?code=..., which the app exchanges for a session. Open the link in the same browser you requested it from.
ADMIN_EMAIL.{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=email; both formats are handled.Copy .env.example to .env.local and fill it in. Generate the cron secret with openssl rand -hex 32. Set the same variables in Vercel → Project → Settings → Environment Variables.
npm install
npm run dev # http://localhost:3000
Trigger a batch locally:
curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/generate
Import the repo in Vercel. vercel.json registers the weekly cron automatically; Vercel sends CRON_SECRET as the Bearer token.
npm test # unit tests (vitest)
npm run typecheck # tsc
npm run lint # eslint
npm run build # production build
SUPABASE_SECRET_KEY touches data, and only after checking the cron secret or the admin session.service_role gets read/write, anon and authenticated get nothing. Supabase stopped auto-granting new public tables from 30 Oct 2026, so any future migration that adds a table must grant service_role in the same file./admin is guarded twice: the proxy redirects requests with no session, and every page render and Server Action checks the session email against ADMIN_EMAIL using getClaims().ADMIN_EMAIL, and shows everyone the same message, so it does not reveal which address is the admin's.next.config.ts.npm audit reports advisories in ESLint's dev-only tooling (a glob-pattern denial of service). They are not shipped, and the suggested fix downgrades eslint-config-next two major versions, so they are left until upstream updates. npm audit --omit=dev is clean.AI_PROVIDER to anthropic or openai, plus that provider's API key. The persona and output format are identical either way (src/lib/generate.ts has one small adapter per provider).POST_MODEL, or leave it empty for the provider's default.src/lib/persona.ts. Keep it free of dates or per-run values so it stays cacheable./admin/sources. Check each outlet's feed terms before commercial use. The starting 11 were checked reachable on 22 Oct 2026 and none disallow bots.TAG_MODEL, or leave it empty for the provider's cheapest default.POSTS_PER_RUN (max 30).