Se você quer usar o produto
Comece em Scanner ou Manual. Depois siga para Execução para ver máquina mock e animação.
Apresentação Técnica Interativa
Guia visual para onboarding: organização do código, fluxo ponta a ponta, contratos de integração e decisões de arquitetura já aplicadas no projeto.
Esta página ficou organizada para onboarding. Antes de mergulhar nos detalhes, use estes três blocos para saber por onde ler.
Comece em Scanner ou Manual. Depois siga para Execução para ver máquina mock e animação.
Leia nesta ordem: Visão Geral, Arquitetura, Pastas, Domínio do Cubo e Integração da Máquina.
O backend, o planner e o mock já estão prontos. O próximo passo é trocar o mock pelo firmware real do ESP32.
O sistema lê um cubo 3x3 por câmera, valida o estado, calcula a solução lógica, anima a resolução e já prepara o plano mecânico para integração futura com ESP32.
Frontend e backend convivem no mesmo app Next.js. A separação é feita por camadas e contratos tipados, não por múltiplos repositórios.
Páginas App Router e componentes para scanner, edição manual, execução e onboarding técnico.
src/app + src/componentsModelagem do estado, validação semântica, aplicação de movimentos e serialização para solver.
src/lib/cubeSessão consolidada de execução e player de animação baseado em logicalMoves.
src/lib/solve-session + src/hooksPlanejamento mecânico abstrato, contratos tipados e gateway mock para troca futura pelo ESP32.
src/lib/machine + src/types/machine.tsAPI routes Next.js para validate, solve, machine start e machine status.
src/app/apiA árvore abaixo reflete os diretórios mais importantes da base atual.
srcappPáginas e API routespage.tsxHome e navegação principalscan/page.tsxFluxo de scannermanual/page.tsxMontagem manualsolve/page.tsxExecução completaarchitecture/page.tsxApresentação técnicaapi/Endpoints internoscomponentsUI por contexto de usoscanner/Captura guiada e revisãosolve/Player e sessão de execuçãocube/Viewer 2D do cubolibLógica de domínio e integraçãocube/Domínio do cuboscanner/Leitura de cor da câmerasolve-session/Sessão consolidada de execuçãomachine/Planner, contratos e mocktypesContratos TypeScript compartilhadosdocsDocumentação técnica consolidadaRotas visuais e endpoints API no padrão App Router.
Componentes focados em UX para cada fluxo do produto.
Domínio puro do cubo: estado, regras, movimentos e solver.
Planejamento mecânico abstrato, mock e contratos de gateway.
Tipos compartilhados entre interface, APIs e domínio.
Documentação de arquitetura, scanner, solver, animação e máquina.
Esta camada existe separada da interface para garantir previsibilidade, testes e reuso entre scanner, manual, API e animação.
CubeState representa o cubo completo com 6 faces. Cada face tem exatamente 9 stickers.
type Face = "U" | "R" | "F" | "D" | "L" | "B";
type Color = "white" | "red" | "green" | "yellow" | "orange" | "blue";
type FaceStickers = [Color, Color, Color, Color, Color, Color, Color, Color, Color];
type CubeState = Record<Face, FaceStickers>;Porque a regra do cubo é a mesma em qualquer entrada (scanner/manual). A UI apenas coleta dados e exibe resultados; a verdade do negócio fica em `src/lib/cube`.
O scanner usa `getUserMedia`, guia visual 3x3 e revisão manual obrigatória. O cubo pode estar resolvido ou bagunçado.
Uma face por vez em ordem `U/R/F/D/L/B`, com confirmação explícita.
Heurística leve com confiança por face, sem visão computacional pesada no MVP.
Usuário edita qualquer sticker antes de enviar para validação/solve.
O backend garante que só estados coerentes cheguem ao solver. Isso evita falhas silenciosas e melhora mensagens para o usuário.
Checa estrutura, cores, contagem e centros.
POST /api/cube/validate
{ "cubeState": { ... } }Recebe CubeState válido e retorna movimentos lógicos.
POST /api/cube/solve
{
"jobId": "cube-001",
"initialCubeState": { ... },
"logicalMoves": ["R", "U", "R'", "U'", "F2"]
}A animação usa apenas `logicalMoves` e `initialCubeState`. Ela não depende de comandos mecânicos para avançar frame a frame.
O planner converte solução lógica em um plano físico serializável para integração futura com a máquina.
Semântica do cubo, independente de hardware.
["R", "U", "R'", "U'", "F2"]Ações executáveis por uma controladora física.
{
"jobId": "cube-001",
"actions": [
{ "type": "home", "target": "all" },
{ "type": "clamp", "name": "A", "state": "close" },
{ "type": "turn_face", "actuator": "right", "degrees": 90 }
]
}A integração já está preparada por contrato e mock. O firmware real ainda não foi implementado.
/api/healthstatus geral da aplicação
/api/cube/validatevalidar CubeState
/api/cube/solvegerar logicalMoves
/api/machine/startiniciar máquina mock
/api/machine/statusconsultar status da execução
A UI inicia a animação quando `GET /api/machine/status` retorna `started`. O restante da animação roda localmente com os movimentos lógicos já calculados.
Reduz fricção de desenvolvimento e facilita demo, mantendo tipagem compartilhada e deploy simplificado.
Priorizou confiabilidade prática com revisão manual, sem criar dependência de modelos pesados para esta fase.
Mantém a experiência visual desacoplada do hardware e permite teste completo mesmo sem ESP32 real.
Permite trocar apenas o gateway da máquina quando firmware estiver pronto, preservando páginas, endpoints e tipos centrais.