{"id":50412307,"url":"https://github.com/cskwork/learn-codex-kr","last_synced_at":"2026-05-31T04:04:53.859Z","repository":{"id":359228937,"uuid":"1244537564","full_name":"cskwork/learn-codex-kr","owner":"cskwork","description":"OpenAI Codex CLI를 한국어로 인터랙티브하게 배우는 멀티플레이어 학습 사이트. Live: https://cskwork.github.io/learn-codex-kr/","archived":false,"fork":false,"pushed_at":"2026-05-20T23:29:33.000Z","size":493,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-21T05:47:07.962Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://cskwork.github.io/learn-codex-kr/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cskwork.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-20T11:06:25.000Z","updated_at":"2026-05-20T23:28:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cskwork/learn-codex-kr","commit_stats":null,"previous_names":["cskwork/learn-codex-kr"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/cskwork/learn-codex-kr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cskwork%2Flearn-codex-kr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cskwork%2Flearn-codex-kr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cskwork%2Flearn-codex-kr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cskwork%2Flearn-codex-kr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cskwork","download_url":"https://codeload.github.com/cskwork/learn-codex-kr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cskwork%2Flearn-codex-kr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33718495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-31T04:04:53.092Z","updated_at":"2026-05-31T04:04:53.853Z","avatar_url":"https://github.com/cskwork.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# learn-codex-kr\n\n\u003e OpenAI Codex CLI를 한국어로 인터랙티브하게 배우는 멀티플레이어 학습 사이트.\n\u003e 모바일 친화, 회원가입 없이 5분에 시작. 목표는 **동시 접속자 100명 유지**.\n\n라이브: \u003chttps://cskwork.github.io/learn-codex-kr/\u003e\n\n## 기능\n\n- **싱글플레이 레슨 5개** — `codex`, `/goal`, `/plan`, `/verify`, 실전 워크플로\n- **인터랙티브 시뮬레이터** — 실제로 명령을 쳐 보고 즉시 피드백\n- **코업(co-op) 멀티플레이** — 5자리 방 코드로 2명이 같은 챌린지 해결, 방 채팅 포함\n- **레이스 멀티플레이** — 1분 단위 매치, 가장 빠른 정답이 상위 랭킹\n- **오늘의 챌린지 + 스트릭** — KST 자정 단위로 새 챌린지, 연속 학습 카운터\n- **주간 리더보드** — 최근 7일 최고 기록\n- **실시간 동접자 카운터** — `lck:global` presence 채널\n- **익명 device-id 세션** — 회원가입 없이 진행도 저장, 모든 데이터는 디바이스 단위\n\n## 기술 스택\n\n| 영역 | 선택 |\n|---|---|\n| 프론트엔드 | Next.js 16 (App Router) + TypeScript + Tailwind v4 |\n| 빌드 | `next build` 정적 export (`output: \"export\"`) |\n| 배포 | GitHub Pages (`/learn-codex-kr` 서브패스) |\n| 인증/저장 | Supabase (anon JS client) + localStorage fallback |\n| 실시간 | Supabase Realtime (presence + broadcast) |\n| 분석 | Vercel Analytics 또는 GA (선택) |\n\n## 아키텍처 핵심 결정\n\n- **서버리스 정적 export**: API 라우트, 미들웨어, 서버 액션 없음. 모든 동적 동작은\n  Supabase JS 클라이언트로 브라우저에서 직접 호출. anon key 만 사용하므로 안전.\n- **Supabase 미연결 시도 fully degradable**: `.env.local` 없이도 모든 페이지가 동작.\n  레슨/일일챌린지/레이스는 localStorage 로 진행, 실시간 멀티플레이만 비활성.\n- **device-id 세션**: 회원가입 없이 익명 ID 로 진행도 추적. 동물 이름 + ID tail 로 표시명 자동 생성.\n\n## 로컬 개발\n\n```bash\npnpm install\ncp .env.local.example .env.local   # 선택: Supabase 키 채우기\npnpm dev        # http://localhost:3000\npnpm build      # 정적 export 검증\npnpm lint\n```\n\nNode 22, pnpm 10 기준.\n\n## 디렉터리 구조\n\n```\nsrc/\n  app/\n    page.tsx                  # 랜딩\n    lessons/page.tsx          # 레슨 라이브러리 인덱스\n    lessons/[slug]/page.tsx   # 개별 레슨 (SSG)\n    coop/page.tsx             # 코업 로비 + 방\n    race/page.tsx             # 레이스 로비 + 매치\n    daily/page.tsx            # 오늘의 챌린지\n    leaderboard/page.tsx      # 주간 랭킹\n    layout.tsx, globals.css\n  components/\n    Header.tsx                # 네비 + presence badge\n    LessonSimulator.tsx       # intro/prompt/choice/terminal/summary 5종 step 렌더\n    PresenceBadge.tsx         # Supabase presence sync (or 추정값)\n    StreakBadge.tsx           # localStorage 스트릭 표시\n    ShareButton.tsx           # navigator.share + clipboard fallback\n  lib/\n    lessons.ts                # 5개 레슨 콘텐츠 (정적)\n    challenges.ts             # 코업/레이스/일일 챌린지\n    storage.ts                # localStorage + Supabase sync\n    supabase.ts               # 클라이언트 싱글톤 (env 없으면 null)\n    device-id.ts              # 익명 ID + 표시명\n    paths.ts                  # basePath 헬퍼\n\nsupabase/migrations/0001_init.sql   # DB 스키마 (lesson_progress, race_scores, daily_challenge_completions, weekly_leaderboard view)\n.github/workflows/deploy.yml        # GitHub Pages 배포\nLAUNCH.md                           # G010+G011 운영 플레이북 (사람 액션)\n```\n\n## Supabase 켜기\n\n`LAUNCH.md` 1번 섹션 참고. 요약:\n\n1. \u003chttps://supabase.com\u003e 프로젝트 생성\n2. `supabase/migrations/0001_init.sql` 을 SQL Editor 에서 실행\n3. `.env.local` + GitHub Actions secrets 에 두 값 추가\n4. 재배포\n\n## 진행 상태\n\n이 프로젝트는 [`omc ultragoal`](https://github.com/cskwork/oh-my-claudecode) 워크플로로\n11개 스토리로 쪼개져 있음.\n\n- 스토리 정의: `.omc/ultragoal/goals.json`\n- 체크포인트 이벤트: `.omc/ultragoal/ledger.jsonl`\n- 컨셉/타깃: `.omc/ultragoal/brief.md`\n\n현재까지: G001~G009 코드 구현 완료. G010(Reddit 런칭) + G011(100 CCU) 는 사람 액션 — `LAUNCH.md` 참고.\n\n## 기여\n\n피드백은 GitHub Issues 환영. 콘텐츠 (레슨/챌린지) PR 도 환영.\n\n## 라이선스\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcskwork%2Flearn-codex-kr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcskwork%2Flearn-codex-kr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcskwork%2Flearn-codex-kr/lists"}