ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Mobile-first vocabulary learning MVP built with Next.js App Router, TypeScript, Tailwind, Supabase-ready data boundaries, and a server-only Gemini route.
This project targets Node 18.17.x so it also works with the current local runtime. If PowerShell asks whether to run the Microsoft shell integration script, choose R (Run once) or A (Always), then enter the npm command at the normal PS> prompt.
npm install
npm run dev
Open http://localhost:3000. The app requires Supabase configuration and an authenticated user; it loads only the signed-in user's workspace data.
.env.example to .env.local and add the project URL and anon key.supabase/migrations/001_initial_schema.sql through supabase/migrations/009_retry_missed_daily_reminders.sql in numeric order in the Supabase SQL editor. If earlier migrations are already applied, run only the missing migrations.save_review database function.Create users in Supabase Auth with a password. Any user with an existing Supabase account can sign in; the app uses direct signInWithPassword and does not provide a register flow.
The Supabase browser/server helpers and CRUD mapping live in src/lib/supabase. With a configured project, the app redirects unauthenticated visitors to /auth, loads the selected workspace's folders, words, progress, and review logs, and persists new words, folders, ratings, and workspaces through RLS-protected queries.
Push reminders use standard Web Push with Supabase Cron and an Edge Function. A reminder is sent once per user's local day, only if their daily review goal is still unfinished. Supabase Free includes enough scheduled function calls for the once-a-minute timezone check at small scale, but its projects may pause after a week of inactivity.
Run supabase/migrations/007_daily_push_reminders.sql after migrations 001-006, then supabase/migrations/008_custom_daily_review_goal.sql and supabase/migrations/009_retry_missed_daily_reminders.sql, in the Supabase SQL editor.
Generate a VAPID key pair locally with node scripts/generate-vapid-keys.mjs. Copy VAPID_PUBLIC_KEY into .env.local and your Vercel environment variables. This public key is intentionally exposed to the browser by next.config.mjs; do not put the private key there. In Supabase Dashboard, open Edge Functions → Secrets and add VAPID_KEYS (the JSON value printed by the script), VAPID_CONTACT_EMAIL, and PUSH_CRON_SECRET. Never share or commit the private VAPID_KEYS value.
Install the Supabase CLI, then connect and deploy the function:
supabase login
supabase link --project-ref <your-project-ref>
supabase functions deploy send-daily-reminders
Generate a long random PUSH_CRON_SECRET locally, then store that same value in Supabase Vault as push_cron_secret. Also store the project URL as push_project_url and its publishable key as push_publishable_key:
select vault.create_secret('https://<project-ref>.supabase.co', 'push_project_url');
select vault.create_secret('<publishable-key>', 'push_publishable_key');
select vault.create_secret('<same-cron-secret>', 'push_cron_secret');
Schedule the dispatcher once in the Supabase SQL editor:
select cron.schedule(
'daily-push-reminders',
'* * * * *',
$$
select net.http_post(
url := (select decrypted_secret from vault.decrypted_secrets where name = 'push_project_url') || '/functions/v1/send-daily-reminders',
headers := jsonb_build_object(
'Content-Type', 'application/json',
'apikey', (select decrypted_secret from vault.decrypted_secrets where name = 'push_publishable_key'),
'x-cron-secret', (select decrypted_secret from vault.decrypted_secrets where name = 'push_cron_secret')
),
body := '{}'::jsonb
) as request_id;
$$
);
Restart the Next.js app after adding the public VAPID key. Sign in, open Settings → Daily push reminder, choose a time, and enable notifications. On iPhone or iPad, add the app to the Home Screen first; Web Push requires iOS/iPadOS 16.4 or later.
The Edge Function uses @negrel/webpush for the Web Push protocol. Its maintainers note that the cryptographic implementation has not had an independent expert audit, so reminder payloads deliberately contain no private vocabulary data.
Add GEMINI_API_KEY to .env.local. The key is only read in src/app/api/generate-sentence/route.ts; it is never exposed to the browser. The add-word modal shows generated text for editing before saving.
After changing .env or .env.local, stop and restart npm.cmd run dev; Next.js reads server environment variables at startup. Do not use a NEXT_PUBLIC_ prefix for the Gemini key.