ESP32-S3 Bench Guide
ESP32‑S3 N16R8 벤치 가이드: 실시간 핀아웃, 강의, 시뮬레이터 및 벤치 로그
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Plataforma de preparação para certificações AWS com gamificação, modos de estudo adaptativos e pipeline de conteúdo via IA.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Plataforma de preparação para certificações AWS com gamificação, modos de estudo adaptativos e pipeline de conteúdo com IA.
O AWS Lab Quest é uma aplicação web em português para preparação de certificações AWS. A experiência combina prática contínua de questões com elementos de RPG: o aluno ganha XP, sobe de nível, desbloqueia conquistas e evolui com base no próprio desempenho.
A plataforma atende diferentes ritmos de estudo, de revisões rápidas a simulados completos, com geração e manutenção contínua de conteúdo por IA.
XpWeightConfig), níveis, badges e 12 conquistas automáticas.usageHash, avaliação e regeneração contínua.Os três modos-base seguem uma progressão de formalidade. Arena e Trilhas reaproveitam a mesma mecânica de pergunta/revelação do Simulado.
| Modo | Descrição |
|---|---|
| Lab | Quests temáticas geradas por IA com contexto personalizado (ex.: música, games, esporte). |
| KC (Knowledge Check) | Bateria de questões por serviço/tópico para revisão pontual. |
| Simulado | Prova completa com timer, marcação de questões, revisão pré-envio e score final. |
| Arena | Batalhas contra bosses temáticos: cada acerto causa dano no boss. |
| Trilhas | Trilhas guiadas por tópico, com estágios e progressão por desbloqueio. |
┌─────────────────────────────────┐ ┌──────────────────────┐
│ awlq-app │ │ awlq-worker │
│ (Next.js 16) │ │ (BullMQ + Node.js) │
│ │ │ │
│ App Router ─ API Routes │ │ source-fetch │
│ Zustand ─ Framer Motion │ │ question-generation │
│ Better Auth ─ Prisma │ │ feedback-analysis │
│ Supabase Realtime │◄────│ performance-compute │
│ │ │ quality-review │
└────────────┬────────────────────┘ │ email-send │
│ └──────────┬───────────┘
▼ ▼
┌──────────────┐ ┌─────────────────────────┐
│ PostgreSQL │ │ Redis (BullMQ queues) │
└──────────────┘ └─────────────────────────┘
│
┌──────┴──────┐
│ Supabase │ ← Storage (avatars, badges) + Realtime
└─────────────┘
awlq-app: frontend, páginas, rotas de API e autenticação (operações síncronas).awlq-worker: processamento em background (operações assíncronas e mais custosas).packages/db/prisma/schema.prisma.WorkerTrigger (poll a cada 30s por trigger-poller.ts);Mecanismo central do produto para manter o banco de questões atualizado e calibrado.
StudySessionHistory (respostas do usuário)
→ feedback-analysis.worker (marca áreas fracas, correctRate < 60%)
→ question-generation.worker (prompt Gemini ponderado por ExamBlueprintDomain)
→ performance-compute.worker (correctRate, índice de discriminação)
→ quality-review.worker (IA aposenta ou reescreve questões de baixa qualidade)
→ de volta ao pool de estudo
source-fetch.worker (em paralelo): baixa Exam Guides da AWS → extrai domínios do blueprint
Cada worker possui concorrência limitada (concurrency: 1 para jobs que usam IA). Jobs são idempotentes quando possível; colisão de usageHash é o único caso aceitável de no-op silencioso.
| Camada | Tecnologia |
|---|---|
| Framework | Next.js 16 (App Router) + React 19 |
| Linguagem | TypeScript 5 |
| Estilo | Tailwind CSS 4 + Radix UI |
| Auth | Better Auth 1.5 (email/senha, sessões) |
| ORM | Prisma 7 + PostgreSQL |
| Storage & Realtime | Supabase |
| AI | Google Gemini API (@google/generative-ai) |
| Estado | Zustand 5 |
| Animações | Framer Motion 12 |
| Resend (HTTP API) |
| Camada | Tecnologia |
|---|---|
| Filas | BullMQ 5 + IORedis |
| ORM | Prisma 7 (DB compartilhado) |
| AI | Google Gemini API |
| Logs | Pino 9 |
| Runtime | Node.js 22 / Bun |
git clone https://github.com/wallacemt/aws-lab-quest.git
cd aws-lab-quest
# App
cd awlq-app && npm install
# Worker
cd ../awlq-worker && npm install
cd ..
cp .env.example awlq-app/.env
cp .env.example awlq-worker/.env
Edite os arquivos .env com base na seção Variáveis de ambiente.
docker compose up -d postgres redis
O
docker-compose.ymlda raiz orquestra todos os serviços. Para desenvolvimento local, suba apenaspostgreseredise execute app/worker fora do Docker.
cd awlq-app
npm run db:generate
npm run db:migrate
npm run db:seed
Após qualquer alteração de schema, execute
npm run prisma:generatetambém emawlq-worker/, que usa o mesmoschema.prismacom client gerado próprio.
Em terminais separados:
# Terminal 1 — App Next.js
cd awlq-app && npm run dev
# Terminal 2 — Worker BullMQ
cd awlq-worker && npm run dev
Acesse: http://localhost:3000
Crie os arquivos .env a partir de .env.example.
| Variável | Descrição |
|---|---|
DATABASE_URL | URL de conexão PostgreSQL |
REDIS_URL | URL do Redis (ex.: redis://localhost:6379) |
BETTER_AUTH_SECRET | String aleatória com pelo menos 32 caracteres |
BETTER_AUTH_URL | URL base da aplicação |
GEMINI_API_KEY | Chave da Google Generative AI |
SUPABASE_URL | URL do projeto Supabase |
SUPABASE_SERVICE_ROLE_KEY | Service role JWT do Supabase |
SUPABASE_ANON_KEY | Anon key do Supabase |
RESEND_API_KEY | Chave da API do Resend (somente servidor) |
RESEND_FROM_EMAIL | Endereço remetente verificado no Resend |
| Variável | Padrão | Descrição |
|---|---|---|
GEMINI_MODEL | gemini-2.5-flash | Modelo Gemini para geração |
POLLINATIONS_API_KEY | — | Chave para geração de imagens de badges |
ADMIN_EMAIL | — | Email do admin inicial (seed) |
ADMIN_PASSWORD | — | Senha do admin inicial (seed) |
WEAK_AREA_THRESHOLD | 0.60 | Taxa mínima de acerto para área fraca |
TRIGGER_POLL_INTERVAL_MS | 30000 | Intervalo do poller de triggers (ms) |
LOG_LEVEL | info | Nível de log do worker |
A autenticação usa Better Auth 1.5 (email/senha), com configuração em lib/auth.ts e helpers de cliente em lib/auth-client.ts.
accessStatus: pending./admin/users (ou via SystemConfig.auto_approve_users).api/admin/* usam requireAdmin(request) e validam sessão e role === "admin".Vitest (environment: "node", globals habilitado), com um vitest.config.ts por pacote.
# awlq-app
cd awlq-app
npm run test
npx vitest run src/__tests__/arena.test.ts
npx vitest run -t "nome do teste"
# awlq-worker
cd awlq-worker
npm run test
Antes de abrir PR, o mínimo exigido em CONTRIBUTING.md:
# awlq-app
npm run lint
npx tsc --noEmit
npx next build
# awlq-worker
npx tsc --noEmit
Para subir toda a stack em modo próximo de produção:
# Uma vez
docker network create rt-network
# Build + start
docker compose up -d --build
Serviços principais:
rt-awslq-app (porta 3000)rt-awslq-worker (rede rt-network)Comandos úteis:
docker compose logs -f
docker compose down
docker compose restart worker
aws-lab-quest/
├── awlq-app/ # Next.js app (frontend + API)
│ └── src/
│ ├── app/ # App Router: páginas e API routes
│ ├── components/ # Componentes reutilizáveis (ui/, layout/)
│ ├── features/ # Domínios com components/hooks/screens/services
│ ├── hooks/ # Custom hooks React
│ ├── lib/ # Singletons: auth, prisma, ai, storage, redis, levels, achievements
│ └── stores/ # Zustand stores
│
├── awlq-worker/ # Worker BullMQ (background)
│ └── src/
│ ├── workers/ # Processadores por fila (source-fetch, question-generation, ...)
│ ├── services/ # Lógica de negócio desacoplada da fila
│ ├── shared/ # Compartilhado com o app (buildUsageHash, validateQuestion, persistQuestion)
│ ├── cron/ # Jobs recorrentes (ScheduledJob)
│ └── queues/ # Filas BullMQ + tipos de payload
│
├── packages/db/prisma/ # Schema Prisma, migrations e client compartilhado
├── docs/ # Documentação técnica complementar
├── docker-compose.yml
└── .env.example
Convenção no app: src/app/ permanece fino (roteamento + data fetch no servidor) e a lógica de domínio fica em src/features/<domínio>/.
/admin/upload (tipo: Exam Guide).PDF/Markdown → Extração → Segmentação de blocos → Gemini API
→ Validação (schema, mínimo de opções) → Deduplicação (usageHash)
→ Persistência no banco
O worker também gera variantes mais difíceis de questões já respondidas para reduzir repetição em simulados futuros.
As conquistas são desbloqueadas automaticamente ao salvar histórico de Lab/KC/Simulado.
A galeria em /achievements mostra progresso, status de unlock e link público de compartilhamento.
| Documento | Descrição |
|---|---|
| achievements-system.md | Sistema de conquistas e desbloqueio |
| simulado-pdf-pipeline.md | Pipeline PDF → Questão |
| platform-upgrade-2026-03.md | Arquitetura e melhorias recentes |
| question-ingestion-refactor-2026-03.md | Refactor do worker de ingestão |
| create-lab-quest-v1.md | Como criar um Lab Quest |
| CONTRIBUTING.md | Como contribuir com o projeto |
Contribuições são bem-vindas. Consulte o guia de contribuição para reportar bugs, sugerir melhorias e enviar pull requests.