explainroo
explainroo는 AI 에이전트가 음성으로 설명 영상을 만들 수 있는 무료 오픈소스 도구이며, 로컬에서 API 키 없이 실행됩니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기SkillShift: tech news mapped to real job requirements (CMU MSSM GenAI News Portal)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Live app: https://skillshift-xi.vercel.app
GitHub: https://github.com/deokhwajeong/skillshift
SkillShift reads tech news and maps each shift to real job requirements, showing tech job seekers which skills are Rising, Emerging, Established, or Fading, with the evidence behind each.
It is a news portal first. News is the primary object; job descriptions are the evidence layer that grounds each news shift in hiring reality.
CMU MSSM individual assignment: Generative AI News Portal. Demo and pitch: Tuesday, October 27, 2026.
Data status: the committed data is a real pipeline run (
mode: "pipeline"indata/generated/tpm/pipeline-summary.json): 14 real tech news articles and 16 real TPM job postings from public sources (Aug to Oct 2026), analyzed with the Claude API. The one exception is the Try a weak input recording on Run live (weak-cache.json), a scripted example that is labeled SAMPLE on screen: with the real model, the Filter drops that weak article outright, so the real run never reaches the policy checks the demo is meant to show.
| Part | Status |
|---|---|
data/raw/news/, data/raw/jds/tpm/ | Real: 14 public tech news articles and 16 public TPM job postings (Aug to Oct 2026) |
data/generated/tpm/ (matrix, shifts, brief, run log) | Real output of npm run pipeline on that data with the Claude API (mode: "pipeline") |
data/generated/tpm/eval.json | Real data, but small and optimistic: 11 articles and 5 postings, labeled by reviewing the agents' output (96% precision, 100% recall for skill extraction). It is not a measure of accuracy on new data. |
data/generated/tpm/live-cache.json | Real: a recorded Run live call on data/live/demo-article.md |
data/generated/tpm/weak-cache.json | SAMPLE: a scripted "Try a weak input" run, labeled SAMPLE on screen |
data/eval/tpm.sample.json, tests/fixtures/sample/ | SAMPLE: made-up data used only by the unit tests and by npm run sample |
Requires Node 22 or newer.
npm install
cp .env.example .env.local # then fill in the values below
npm run dev # http://localhost:3000
| Variable | Needed for | Notes |
|---|---|---|
ANTHROPIC_API_KEY | npm run pipeline, npm run live:cache, Live mode | Never commit it. Locally it goes in .env.local (gitignored); on Vercel or a cloud environment, set it as an environment variable. |
ANTHROPIC_MODEL | all LLM agents | Default claude-sonnet-5-5. |
ANTHROPIC_MODEL_FILTER | Filter Agent only | Optional cheaper model, e.g. claude-haiku-5-5. |
LIVE_MODE_PASSPHRASE | Live mode on a deployment | When empty, Live mode only works on a local dev server. Also set a monthly spend limit on the API key. |
The app itself (everything except Live mode) needs no key: it reads precomputed results.
| Command | What it does |
|---|---|
npm run dev | Start the app at http://localhost:3000 |
npm run check:data | Validate config, raw data, and editor decisions; print a summary |
npm run pipeline [-- --role tpm] | Run all agents on data/raw/ and write data/generated/<role>/ (needs the API key) |
npm run eval [-- --role tpm] | Grade Shift Extraction and JD Analyzer against hand labels in data/eval/; -- --template writes a labeling template |
npm run live:cache | Record a Live mode run of data/live/demo-article.md as the offline fallback (needs the API key) |
npm run sample | Regenerate the SAMPLE data, SAMPLE live cache, and SAMPLE eval (no API key). Overwrites the real run in data/generated/tpm/ |
npm test | Unit tests (Vitest) |
npm run zip | Package the committed project as dist/skillshift-submission.zip, plus one-pager.pdf from the repo root (never includes .env* secrets, node_modules, .next, or .vercel; refuses if a key-like string is committed) |
npm run build | Production build (all pages prerendered) |
npm run build:demo | Static copy of the site in out/, served under /demos/skillshift (for the portfolio site). No server, so Live mode replays its recorded run. BASE_PATH=/other/path changes the path. |
npm run check:data # after adding articles to data/raw/news and JDs to data/raw/jds/tpm
npm run pipeline # real agents, about 60 LLM calls
npm run eval # after labeling data/eval/tpm.json
npm run live:cache # after putting a fresh article in data/live/demo-article.md
git add data && git commit -m "Real pipeline run"
data/raw/news/*.md, one article per file with front matter (id, title, source, url, published_date, source_type). See data/README.md.data/raw/jds/tpm/*.md, saved manually (no scraping).data/live/demo-article.md. Use a fresh article that is not in the curated set. The "Fill with the demo article" button loads it, and "Replay the cached run" works without network.data/eval/tpm.json (npm run eval -- --template writes a starting file).config/ roles.json, taxonomy.json (flat skill list), scoring.json (thresholds and weights)
data/raw/ curated articles and job postings
data/generated/ pipeline output read by the app (committed)
data/editorial/ decisions.json exported from the Editor Queue
data/eval/ hand labels for npm run eval
data/live/ the Live mode demo article
src/agents/ one module per agent; prompts in src/agents/prompts/
src/scoring/ Signal Scorer (pure TypeScript)
src/pipeline/ schemas (the data contract), loaders, orchestrator, editorial policy, Live mode
src/eval/ precision and recall
src/lib/ LLM wrapper, data access, view helpers
src/app/ Next.js pages and the /api/live route
src/components/ UI components (Signal Matrix, Editor Queue, Live mode, Listen)
scripts/ command-line entry points
tests/ Vitest tests
docs/ ARCHITECTURE.md, DEMO_SCRIPT.md, ONE_PAGER.md, STATUS.md, PROJECT_BRIEF.md
How the pieces fit: docs/ARCHITECTURE.md.
@anthropic-ai/sdk): the five LLM agents (Filter, Shift Extraction, Verification, JD Analyzer, Brief Writer). Structured JSON outputs, validated with Zod. Called only by npm run pipeline, npm run live:cache, and the Live mode route.next/font (Newsreader, Geist, Geist Mono), downloaded at build time and served by the app.data/editorial/decisions.json and the pipeline is re-run. The brief only updates on a pipeline run.I used Claude Code (Anthropic) as a coding assistant. This is the honest split.
What I designed:
data/eval/tpm.json (11 articles, 5 postings), made by reviewing the agents' output item by item, so the scores are likely optimistic.What Claude Code generated: the TypeScript implementation (schemas, loaders, agents, prompts, LLM wrapper, scorer, orchestrator, UI, API route, scripts), the unit tests, the SAMPLE data, the collection of the 14 articles and 16 postings from public pages to my criteria, and drafts of these docs.
How I reviewed it: at each phase checkpoint I ran the app and the tests, checked the behavior against my spec, and asked for changes. I did not write or review every line of TypeScript. The files that carry the design decisions are: how LLM output is validated with Zod and retried once (src/lib/llm.ts), how the orchestrator passes data from one agent to the next (src/pipeline/orchestrator.ts), the editorial policy that publishes or holds a shift (src/pipeline/editorial.ts), the scoring and quadrant rules (src/scoring/signal-scorer.ts), and how Editor Queue decisions change the data (src/lib/rescore.ts, data/editorial/decisions.json).