ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
내 속도에 맞춰 계속 다시 짜주는 학습 계획
Translation pending
EducationTypeScript · PLpgSQLGitHub @gnghkimOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Your learning, at your pace. 내 속도에 맞춰 계획하고, 자투리 시간에 공부하고, 배운 내용을 기록하는 개인 학습 웹앱입니다. 현재 도서 학습 관리, LR3 말하기·쉐도잉, LR4 표현 복습과 단어장까지 구현되어 있습니다. 홈 화면에 설치해 앱처럼 쓰고 정한 시각에 알림을 받을 수 있습니다. Next.js 웹앱, Supabase의 인증·DB·비공개 파일 저장소, Python Worker로 구성됩니다. 영어 학습에서는 버튼을 눌렀을 때만 AI로 내용을 전송합니다. 녹음은 분석 전에 기기에서 확인할 수 있고, 서버 음성은 기본 30일 보관하며 계속 보관하거나 삭제할 수 있습니다. 원래 인식 문장과 수정본을 구분하며 발음 점수는 제공하지 않습니다.Read the full README ↗
Your learning, at your pace.
내 속도에 맞춰 계획하고, 자투리 시간에 공부하고, 배운 내용을 기록하는 개인 학습 웹앱입니다.
현재 도서 학습 관리, LR3 말하기·쉐도잉, LR4 표현 복습과 단어장까지 구현되어 있습니다. 홈 화면에 설치해 앱처럼 쓰고 정한 시각에 알림을 받을 수 있습니다. Next.js 웹앱, Supabase의 인증·DB·비공개 파일 저장소, Python Worker로 구성됩니다.
| 기능 | 할 수 있는 일 |
|---|---|
| 도서·교재 라이브러리 | 직접 등록, Google Books·YES24 검색, PDF 페이지·목차 추출 후 등록 |
| 학습 계획 | 목표와 가용 시간에 따른 일정 생성, 진도 기록 후 재계획, 오늘 할 일·캘린더 |
| 교재·강의 | Unit이나 강처럼 챕터로 나뉜 자료를 등록. 강의 링크를 주면 AI가 목차와 일정을 제안하고, 커리큘럼을 붙여 넣어도 목차와 길이를 뽑음. 일정은 순서대로 잡히지만 아무 챕터나 골라 공부하면 남은 일정에서 빠짐 |
| 계획 수정 | 일정 미리보기 후 확정, 읽는 속도·방식·목표 변경, 잠시 멈춤과 보관, 요일별 가용 시간 조정 |
| 오늘 화면 | 세션의 완료·진행 중·놓침 구분, 이번 주 일곱 칸 요약, 밀린 분량 정리 안내 |
| 간편 기록·통계 | 모바일에서 빠르게 학습 기록, 기간별 학습량·시간·활동일 확인 |
| 독서 타이머 | 읽기 시작으로 시간을 재고, 집중 화면을 누르면 화면 가득 큰 시계. 그동안 화면이 꺼지지 않고, 잠시 멈췄다 이어 읽기. 끝내면 기록창에 시간이 채워짐 |
| AI 독서 도우미 | 도서 정보와 입력한 목차를 바탕으로 분석, 실제 진도에 따른 학습 코칭 |
| 영어 쓰기 | 영어 학습에서 초안 작성·복원, AI 대화·첨삭·표현 정리 |
| YouTube 학습 | 링크 일괄 저장, 마지막 위치 이어보기, 배속·구간 반복, 시각별 메모와 자막 기반 질문 |
| 말하기·쉐도잉 | AI 단문·모범 음성, 녹음·전사·표현 피드백, YouTube 5–30초 구간 연습 |
| 학습 타이머 | 일시 정지·종료, 실제 재생·녹음 시간 기록, 화면 숨김 시 자동 정지 |
| 홈 화면 설치 | 브라우저에서 설치해 앱처럼 열기. 오프라인 사용은 제공하지 않음 |
| 매일 알림 | 정한 시각에 오늘 할 분량을 한 줄로 알림. 못 채운 날은 알리지 않음 |
| 독서 회상 | 기록한 직후 책을 덮고 기억나는 것을 적으면, 간격을 두고 복습에서 다시 물음 |
| 표현 복습 | AI 피드백의 표현을 복습함에 저장하고 1·3·7·14·30일 간격으로 다시 확인 |
| 단어장 | 단어만 적어 넣으면 AI가 한국어 뜻과 짧은 예문을 채우고 다음 날부터 복습에 등장 |
| 학습 중 단어 담기 | 듣거나 쓰다가 만난 단어를 화면을 떠나지 않고 담기. 듣기·말하기·쓰기 공통 |
| 텔레그램 튜터 | 텔레그램에서 영어로 대화하면 실수를 고쳐 주고 다시 써 보게 함. 고친 실수는 복습 카드가 되어 텔레그램 퀴즈와 웹 복습에 함께 나옴. 설정에서 코드로 연결 |
영어 학습에서는 버튼을 눌렀을 때만 AI로 내용을 전송합니다. 녹음은 분석 전에 기기에서 확인할 수 있고, 서버 음성은 기본 30일 보관하며 계속 보관하거나 삭제할 수 있습니다. 원래 인식 문장과 수정본을 구분하며 발음 점수는 제공하지 않습니다.
자세한 사용법은 영어 학습 안내, 독서 기록, 학습 통계, 매일 알림, 표현 복습, 단어장, 독서 회상, 교재와 강의를 참고하세요.
.node-version), pnpm 9.15.0 (packageManager).include 지원이 필요하다.Next.js 16.3.5, React 19.3.0, TypeScript 5.9.3, Tailwind 4.3.3을 사용한다. Next.js 플러그인의 peer 범위에 맞춰 ESLint 9.39.1을 고정했다. JS 의존성은 pnpm-lock.yaml, Worker 의존성은 requirements.lock으로 고정한다.
아래 명령은 PowerShell 기준입니다. 처음 내려받을 때:
git clone https://github.com/gnghkim/paceon.git
cd paceon
pnpm install --frozen-lockfile
docker info
supabase start
supabase migration up --local
Copy-Item apps/web/.env.example apps/web/.env.local
supabase status
supabase status에서 확인한 로컬 publishable key를 apps/web/.env.local의 NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY에 입력합니다. URL은 기본값 http://127.0.0.1:55321을 사용합니다. 이미 환경 파일이 있다면 복사하지 말고 필요한 항목만 수정합니다.
그다음 웹앱을 실행합니다.
pnpm dev
AI·PDF 없이도 직접 도서 등록, 학습 계획·기록, YouTube 링크 저장과 재생을 사용할 수 있습니다. AI와 PDF 처리는 아래 Worker 설정을 추가합니다. supabase start가 Supabase 스택을 관리하고, Docker Compose는 Worker를 관리합니다.
| 서비스 | 주소 |
|---|---|
| 웹 | http://localhost:3000 |
| 웹 health | http://localhost:3000/api/health |
| Worker health | http://localhost:8000/health |
| Worker API 문서 | http://localhost:8000/docs |
| Supabase API | http://127.0.0.1:55321 |
| Supabase Studio | http://127.0.0.1:55323 |
| 테스트 메일함 | http://127.0.0.1:55324 |
| PostgreSQL | 127.0.0.1:55322 |
PaceOn은 다른 로컬 Supabase 프로젝트와 공존하도록 553xx 포트를 사용한다. Shadow DB는 55320, 비활성 pooler는 55329, Edge debugger는 18083이다.
Windows에서 기본 Vector 로그 수집기가 host.docker.internal:2375에 연결하지 못해 반복 종료되는 것을 확인했다. 이 프로젝트에서는 선택 기능인 [analytics]를 비활성화했다. DB, Auth, Storage, Realtime, Studio는 그대로 실행되며 Studio의 중앙 로그 수집은 제공하지 않는다.
| 파일 | 설정 |
|---|---|
apps/web/.env.local | Supabase 공개 URL·publishable key, 웹의 AI/PDF 활성화, 선택적 도서 검색·YouTube OAuth 설정 |
services/ai-worker/.env | Supabase 서비스 역할 키, OpenAI 키·모델, Worker의 AI/PDF 활성화, 알림용 VAPID 키 한 쌍 |
.env.example | 루트의 참고 목록. Next.js가 읽는 실제 설정 파일은 아님 |
Copy-Item services/ai-worker/.env.example services/ai-worker/.env
Worker 파일에 필요한 값을 입력합니다.
SUPABASE_URL=http://host.docker.internal:55321
SUPABASE_SERVICE_ROLE_KEY=<로컬 Supabase service_role 키>
AI_ENABLED=true
OPENAI_API_KEY=<OpenAI API 키>
OPENAI_MODEL=gpt-5.4-mini
PDF_ENABLED=true
OPENAI_TRANSCRIBE_MODEL=gpt-4o-mini-transcribe
OPENAI_TTS_MODEL=gpt-4o-mini-tts
OPENAI_TTS_VOICE=marin
OPENAI_MODEL은 이 프로젝트에서 실제 연동을 확인한 설정 예시이며, 계정에서 사용할 수 있는 Responses API 구조화 출력 지원 모델로 바꿀 수 있습니다. PDF만 사용할 때는 AI_ENABLED=false로 두고 OpenAI 키 없이 실행할 수 있습니다.
docker compose --env-file services/ai-worker/.env -f docker/docker-compose.yml up -d --build
Worker가 실행되면 웹의 apps/web/.env.local에서도 사용할 기능의 AI_ENABLED=true, PDF_ENABLED=true를 설정하고 웹 서버를 재시작합니다. 웹 스위치만 켜면 Worker가 처리하지 못한 요청이 대기 상태로 남을 수 있습니다.
알림을 쓰려면 VAPID 키 한 쌍이 필요합니다. 공개키는 웹의 NEXT_PUBLIC_VAPID_PUBLIC_KEY에, 같은 쌍의 공개·비밀키와 연락처는 Worker의 VAPID_PUBLIC_KEY·VAPID_PRIVATE_KEY·VAPID_SUBJECT에 넣습니다. 비밀키는 Worker에만 둡니다. 키가 없으면 설정 화면이 그렇게 알리고 발송기는 아예 돌지 않으며, 나머지 기능은 그대로 동작합니다. 키를 만드는 방법과 발송 규칙은 매일 알림에 있습니다.
apps/web/.env.local의 YES24_API_KEY에 입력합니다. Google Books 키는 같은 파일의 GOOGLE_BOOKS_API_KEY입니다.NEXT_PUBLIC_를 붙이지 않습니다. 실제 환경 파일과 CLI의 키 출력은 Git에 포함하지 않습니다.세부 설정은 AI, PDF, 영어 학습 문서를 참고하세요.
pnpm typecheck
pnpm lint
pnpm build
pnpm test
pnpm db:test
pnpm db:types:check
pnpm test:ai:worker
# 빌드 및 Supabase Local 준비 후:
pnpm test:books:integration
pnpm test:learning:integration
# Supabase Local과 AI Worker가 실행 중일 때:
pnpm test:speech:integration
pnpm db:test:api
pnpm db:test:locks
# 웹과 Worker가 실행 중일 때:
pnpm test:smoke
docker compose ps
docker compose exec -T ai-worker pip check
supabase status
docker exec supabase_db_PaceOn pg_isready -U postgres
pnpm test는 도서 입력·Provider·API 테스트와 scheduler 독립 import, Vitest 일정 계산 테스트를 실행한다. DB·Docker·웹 서버 없이 실행 가능하다. test:books:integration은 빌드 후 Supabase Local과 임시 프로덕션 서버에서 실제 인증·도서 등록·격리를 확인하고 테스트 계정을 삭제한다. pnpm --filter @paceon/scheduler test로 엔진만 검사할 수 있다. test:smoke는 실제 HTTP 응답 상태·JSON 계약을 검사한다. 필요하면 WEB_HEALTH_URL과 WORKER_HEALTH_URL로 주소를 바꿀 수 있다.
영어 학습 API·YouTube·음성 요청·단어 비교도 pnpm test에 포함됩니다. test:learning:integration은 실제 Auth와 LR1/LR2 경로를, test:speech:integration은 실제 Storage 업로드·재시도·격리·음성 삭제를 검증합니다. 영어 학습 통합 검사는 AI 큐에 요청을 접수하므로 실제 Worker가 켜져 있으면 제공자 호출이 발생할 수 있습니다. 음성 통합 검사는 잘못된 오디오를 사용해 제공자 호출 전에 거절되는지 확인합니다.
2026-09-17 기준 웹/스케줄러 305개(단위 253, 스케줄러 52), Worker 93개, DB 536개 검사가 통과합니다. 실제 OpenAI 음성 생성·전사·피드백 저장과 단어 뜻 채우기도 확인했습니다. 이는 당시 검증 결과이며 현재 변경의 검증은 위 명령으로 수행합니다.
db:test는 실제 PostgreSQL에서 RLS·외래키·입력 제약·이력 보존·계획 버전을 검증하고 rollback한다. db:test:api는 임시 Auth 사용자 두 명을 생성해 실제 토큰으로 REST 격리와 동시 쓰기를 검증한 뒤 계정을 삭제한다. 이 명령은 localhost Supabase만 허용하며 키를 파일이나 로그에 출력하지 않는다.
db:test:locks는 Docker의 supabase_db_PaceOn에 두 DB 연결을 열어 외래키 잠금이 이미 잡힌 상황에서도 서로 다른 진도 기록을 동시에 삽입할 수 있는지 확인한다. 테스트용 계정과 자료는 종료 시 제거한다.
개발 seed가 필요하면 pnpm db:reset을 실행한다. PaceOn 로컬 DB 데이터를 삭제하고 migration·seed로 재생성하므로 개인 데이터를 저장한 이후에는 먼저 보관한다. seed는 로그인할 수 없는 Alice/Bob fixture이며 비밀번호를 포함하지 않는다. DB 변경 후 pnpm db:types로 공통 타입을 재생성한다.
두 health endpoint의 check: "liveness"는 해당 프로세스가 응답한다는 의미다. DB 연결이나 AI 제공자 준비 상태를 보장하지 않는다. DB 준비 상태는 별도 명령으로 확인한다.
프로덕션 실행 확인은 pnpm build 후 pnpm --filter @paceon/web start를 사용한다. 개발 서버와 동일한 3000 포트를 쓰므로 먼저 개발 서버를 종료한다.
웹 터미널에서 Ctrl+C를 누른 뒤:
docker compose down
supabase stop
이 명령은 PaceOn 프로젝트를 대상으로 하며 Supabase 로컬 데이터는 보존한다.
apps/web 인증 · Today/서재/캘린더 · 영어 학습·복습·단어장 · 도서/계획 API · 디자인 토큰
packages/books 도서 검증 · Google Books/Manual/YES24 Provider
packages/shared 공통 타입
packages/scheduler 일정 생성·재계획·속도 추정 · Vitest
packages/ai-schema AI 작업 입력·결과 검증
packages/pdf-schema PDF 처리 한도·결과·확인 입력 검증
services/ai-worker FastAPI · AI/PDF/음성/단어/알림 작업 소비자 · 격리 PDF·오디오 파서
supabase 도메인 migration · 비로그인 개발 seed · pgTAP 테스트
docker Worker Compose
tests 패키지 import · health HTTP · Auth/REST 격리·동시성 테스트
docs 요구사항 · 설계 · 구현 준비 및 실행 계획
LR4의 표현 저장·복습과 단어장, PWA 설치와 알림은 구현했습니다. 다음 단계는 영어 학습 기록의 통계 통합과 LR5 추천입니다. 확장 범위는 영어 학습 명세서에 정리되어 있습니다.
현재 제한:
개발 문서: 영어 학습 · 텔레그램 튜터 · 표현 복습 · 문장 기록 · 완료 기록 · 단어장 · 매일 알림 · 통계 · PDF · AI · 도서 · 스케줄러 · 데이터베이스 · 자체 서버 운영 · 아키텍처 · 제품 요구사항 · 디자인.