TutorLoom
기업·대학·교육기관을 위한 학습 플랫폼, 무료 오픈소스이며 엔터프라이즈 버전 제공
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Moved out of Ruflo monorepo
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗One focused debate. One clear weakness. One immediate repair. One measurable improvement over time.
Daily Debate is a daily reasoning trainer built around one loop:
Guests get the same loop without an account: today's motion against the live AI opponent (the transcript goes to the AI provider only to write its replies and is not stored), or a guided case that never leaves the device. Feedback, repair and retest checks are deterministic and local either way.
Practice quality beats practice volume. The product deliberately optimises the
smallest complete loop and measures whether it works before adding anything
else. Validation is published, not implied: as of the latest benchmark run no
benchmarked judge clears the quality gates (Groq, Cerebras and Gemini have no
benchmark row yet), so every training-loop number is unvalidated
and competitive claims stay behind eloGate — see
docs/status.md for the honest numbers and
docs/roadmap.md for what is active (proving the loop) versus
parked (corpus, benchmarks, classrooms, tournaments, ranked play).
Next.js (App Router) + a repository-owned Postgres/auth backend + free-tier AI only: the opponent, summaries, topics and PvP judge run over OpenAI-compatible free tiers (UnoRouter → Groq → Cerebras → Gemini → NVIDIA → OpenRouter). Each call fails over model by model and then provider by provider until one returns a schema-valid answer, so a rate-limited free tier does not take the product down. There is no paid provider. The app talks to standard Postgres through the Neon serverless driver.
npm install, copy .env.example to .env.local, and set DATABASE_URL plus at least one AI provider key. Configure the password-reset email variables before relying on account recovery.npm run db:migrate && npm run dev.The Vercel project must point its Root Directory at the repository root (this is a standalone repo) with the framework preset left on Next.js.
Requests run through the Next.js 16 proxy in src/proxy.ts. The proxy only checks for the app's signed-in session cookie; it performs no database or third-party network work, so a backend outage cannot crash Vercel Routing Middleware. Without DATABASE_URL, / remains available in guest mode, /login explains that sign-in is unavailable, and protected pages redirect there.
Previews must never share the production database. Scope DATABASE_URL to Production only; point Preview (and local Development) at their own database — the Vercel–Neon integration can create a Neon branch per preview automatically, or set a dedicated DATABASE_URL override for the Preview environment. Sharing one URL across environments lets a preview build run migrations against production and leak preview writes into prod data. Redeploy after setting variables:
| Variable | Required | Notes |
|---|---|---|
DATABASE_URL | yes | Server-only pooled Postgres connection string. Never expose it with a NEXT_PUBLIC_ prefix. |
UNOROUTER_API_KEY / GROQ_API_KEY / CEREBRAS_API_KEY / GEMINI_API_KEY / NVIDIA_API_KEY / OPENROUTER_API_KEY | at least one (production) | Free-tier AI providers, tried in that order. Set as many as you can: each extra key is another fallback when a free tier is rate-limited. With none, solo debates, PvP judging and daily topics show an explicit "AI unavailable" state (daily topics fall back to the curated bank). <LABEL>_DISABLED=1 removes one without deleting its key. |
<LABEL>_MODEL / <LABEL>_FALLBACK_MODELS | optional | Per-provider model chain (e.g. GROQ_MODEL). Defaults and priority order live in config/ai-providers.json, shared by the app, the benchmark and topic generation. Free rosters change often; override when a provider retires a default. A provider that answers 429 is skipped by later requests until its Retry-After passes. The model that actually served is stamped into every verdict. |
AI_DAILY_SPEND_CAP_USD | optional | Daily AI spend cap, default 10; off disables. When hit: opponent/judge degrade to an explicit retryable unavailable state (never silent). |
AI_SPEND_UNCOSTED_CALL_USD | optional | Declared charge for each call with no recorded cost (classifier.dev), default 0.02. Free-tier provider calls are logged at $0 unless the provider reports a cost. |
GUEST_AI_DAILY_CALLS | optional | Global cap on live guest opponent calls per 24h, default 400 (each visitor is also limited to 8/day). GUEST_AI_DISABLED=1 keeps every guest on the guided case. |
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT | optional | Web Push reminders. Generate with npx web-push generate-vapid-keys; subject is mailto: or https:. All three unset = no opt-in shown, nothing sent. |
PUSH_DISPATCH_SECRET | optional |
After setting DATABASE_URL, run npm run db:migrate locally against the same database before deploying authenticated features.
Deploys migrate themselves. Production builds run pending migrations before next build (see scripts/vercel-build.mjs); a failed migration fails the build so the previous deployment stays live. Preview builds skip migrations unless MIGRATE_ON_PREVIEW=1 is set for a preview-scoped database. Check ledger state any time with npm run db:status (non-zero exit while migrations are pending); npm run db:policy enforces the expand/contract rule (destructive SQL needs a -- destructive-ok: <reason> marker).
npm test — unit + regression suite (fully offline; DB invariant tests also run when TEST_DATABASE_URL is set).npm run test:e2e — Playwright against an ephemeral Postgres with E2E_MOCK_AI=1; includes PvP, full-debate, and the Sprint → weakness → repair loop.npm run benchmark:judges — live-model judge benchmark (weekly in CI).| File | Contents |
|---|---|
| docs/status.md | Feature status with honest labels, validation notice, capability map, model-call costs |
| docs/product.md | The daily loop, Sprint vs Full, coaching goal, repair, screen-by-screen hierarchy |
| docs/judging.md | Argument graph, observable assessment, scoring policy, judge ensemble + invariance |
| docs/evidence.md | Source grounding, citation verification, quote + claim-to-source matching |
| docs/validation.md | Measurement honesty, confidence labels, benchmarks, corpus, what stays provisional |
| docs/architecture.md | Pipeline, data model, reliability, security, testing |
| docs/roadmap.md | Prove-the-loop scorecard, active backlog, parked surfaces, gating rule |
≥32 characters; protects POST /api/push/dispatch. Set the same value as the PUSH_DISPATCH_SECRET repository secret; the hourly push-dispatch workflow calls the URL in the PROD_HEALTH_URL variable. |
CLASSIFIER_DEV_ENABLED | optional | 1 sends argument texts to classifier.dev. Default off everywhere until the service is disclosed in the privacy policy. |
NEXT_PUBLIC_EXPERIMENTAL_SURFACES | optional | 1 re-enables the parked surfaces in navigation (PvP, friend challenges, voice input, corpus-validation pages). Default off — see docs/status.md. |
OPENROUTER_MODEL | optional | Defaults to nvidia/nemotron-3-super-120b-a12b:free. |
OPENROUTER_FALLBACK_MODELS | optional | Comma-separated failover chain. Defaults to free Nemotron 3 Super then Ultra. Empty string pins to one model. |
CORPUS_ADMIN_EMAILS | optional | Leave unset to keep the corpus endpoints closed. |
RESEND_API_KEY | required for password reset | Server-only Resend API key. Reset requests report the service unavailable when email delivery is not configured. |
PASSWORD_RESET_FROM | required for password reset | Verified sender, for example Daily Debate <[email protected]>. |
APP_BASE_URL | recommended | Canonical public origin used in reset links, for example https://debate.example.com. Vercel production URL is used as a fallback. |