ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Soal anak
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Web app latihan soal pilihan ganda untuk anak SD–SMA. Spesifikasi lengkap ada di docs/brief.md, prototipe di docs/prototype.html.
| Topik | Keputusan |
|---|---|
| Model akun | Satu akun orang tua (login Google) dengan profil anak. HP mengingat profil terakhir. "Ganti pemain" tanpa kunci tambahan |
| Auth + database | Firebase (project baru markas-latihan): Auth dengan Google, Firestore. Semua baca/tulis data lewat server Next.js (Admin SDK). Security Rules menolak akses langsung dari browser |
| Kunci jawaban | Diperiksa di server. Browser hanya menerima soal tanpa kunci |
| Batas AI harian | 20 paket per anak, 60 per akun. Merapikan soal admin 30 per akun. Bisa diatur lewat env |
| Model AI | claude-sonnet-5-5 (effort medium, server-side fallback aktif) untuk membuat soal, claude-haiku-5-5 untuk merapikan. Bisa diatur lewat env. Perkiraan ± USD 0,03 per paket 5 soal; biaya tercatat per permintaan di families/{uid}/logAi |
| Sesi ditinggal | Hadiah dihitung sebagian: tiap jawaban benar langsung disimpan saat dicek di server |
| Admin | PIN 4 angka di-hash di server, 5 percobaan lalu jeda 5 menit, reset lewat login orang tua |
| Hosting | Vercel, subdomain *.vercel.app dulu |
npm install
npm run dev # butuh FIREBASE_SERVICE_ACCOUNT di .env.local
Tanpa kredensial, pakai Firebase Emulator (butuh Java):
npm run emulators # terminal 1
npm run dev:emu # terminal 2
Katalog komponen: /katalog.
Semua bertipe Secret, dicentang untuk Production dan Preview. Variabel baru hanya terbaca oleh deploy berikutnya.
| Nama | Isi |
|---|---|
FIREBASE_SERVICE_ACCOUNT | Seluruh isi file JSON service account Firebase |
ANTHROPIC_API_KEY | Kunci Claude API (sk-ant-…) dari Claude Console |
Cek dengan membuka /sehat di alamat deploy: harus tampil "Beres!" dan "Kunci Claude API: terpasang".
Opsional (punya nilai bawaan):
| Nama | Bawaan | Isi |
|---|---|---|
AI_LIMIT_PER_PLAYER / AI_LIMIT_PER_FAMILY | 20 / 60 | Jatah paket soal AI per anak / per keluarga per hari (WIB) |
AI_LIMIT_RAPIKAN | 30 | Jatah "Rapikan soal" + baca foto per keluarga per hari |
AI_LIMIT_ESAI | 100 | Pemeriksaan jawaban esai per anak per hari |
AI_MODEL_SOAL | claude-sonnet-5-5 | Model pembuat soal & soal mirip |
AI_MODEL_RAPIKAN | claude-haiku-5-5 | Model merapikan teks soal admin |
AI_MODEL_ESAI | claude-haiku-5-5 | Model memeriksa jawaban esai per poin |
AI_MODEL_BACA_FOTO | claude-sonnet-5-5 | Model membaca foto soal |
lib/firebase/config.ts (publik).FIREBASE_SERVICE_ACCOUNT (JSON service account, satu baris) wajib di server: .env.local dan Vercel → Settings → Environment Variables.firestore.rules: semua akses langsung dari browser ditolak. Data hanya lewat route app/api/* yang memeriksa token login orang tua.*.vercel.app tidak otomatis diizinkan: alamat preview dan alamat produksi masing-masing harus ditambahkan.families/{uid} createdAt, adminPinHash (scrypt), pinGagal, pinKunciSampai
families/{uid}/players/{id} name, kelas, theme, academicYear, rewards, createdAt
families/{uid}/players/{id}/sesi/{sesiId} paket soal lengkap dengan kunci (tidak pernah dikirim ke browser sebelum dijawab), jawaban
families/{uid}/players/{id}/attempts/{sesiId} riwayat latihan selesai: mapel, topik, level, sumber, skor, jawaban per soal (esai: teks anak, hasil per poin, hadiah, koreksi)
families/{uid}/players/{id}/topikStat/{hash} statistik topik per level (best, last, tries) untuk saran
families/{uid}/soalPilihan/{id} soal pilihan orang tua (judul, kelas, mapel, teks asli, soal, saklar acak pilihan)
families/{uid}/gambarSoal/{id} potongan gambar soal (JPEG base64 ±≤ 180 KB, setId paket); foto halaman utuh tidak disimpan
families/{uid}/adminSesi/{sha256} sesi mode admin (60 menit)
families/{uid}/pemakaian/{YYYY-MM-DD} jatah AI harian (WIB): total, perPemain, rapikan, esai.{pemainId}
families/{uid}/logAi/{id} model, token masuk/keluar, hasil per permintaan AI (tanpa isi foto)