Backend e frontend de uma plataforma de ensino (modelo Hotmart/Kiwify): catálogo de cursos, autenticação e, em construção, acompanhamento de progresso de aprendizado. Projeto de portfólio, em desenvolvimento ativo — a seção Estado atual é honesta sobre o que já funciona e o que ainda não.
apps/main-api (Bun + Elysia, REST) e apps/main-frontend
(React 19 + Vite), mais packages/core (kernel de domínio compartilhado) e packages/shared
(schemas Typebox compartilhados entre API e frontend, base do cliente gerado via OpenAPI).domain → application →
infrastructure, dependência sempre pra dentro, sem o overhead de DDD formal. Por quê:
ADR 001 — Clean Architecture pragmática.admin, instructor, student).ts-mockito, mais suítes de integração e
end-to-end separadas).Veja os diagramas C4 (Context + Container) em
docs/architecture/c4-context-and-container.md.
Resumo: uma SPA (main-frontend) consome a API (main-api) via REST; a API persiste em
PostgreSQL (Drizzle) e usa Redis para o estado OAuth (PKCE); o login social passa pelo Google.
JwtServiceapps/main-api/src/modules)| Módulo | O que faz | Estado |
|---|---|---|
auth-and-users | Cadastro/login, JWT + refresh token, OAuth Google/PKCE, papéis admin/instructor/student | Em uso |
catalog | CRUD de cursos, módulos, aulas e categorias; navegação pública do catálogo | Em uso |
learning | Progresso do aluno, matrícula, acompanhamento de aulas assistidas | Código existe, ainda não registrado no bootstrap |
Pré-requisitos: Bun >=1.3, PostgreSQL, Redis.
Configure apps/main-api/.env com (ver apps/main-api/src/config/env/index.ts para o schema
completo validado com Zod):
Subir tudo (API + frontend) via Turborepo:
Ou individualmente:
learning tem código de domínio mas ainda não está ligado ao bootstrap da API —
não é possível assistir aulas/acompanhar progresso via API hoje.Backend: Bun, Elysia, Drizzle ORM, PostgreSQL, Redis, Awilix (DI), Zod, jose (JWT).
Frontend: React 19, Vite, TanStack Router/Query, Zustand, Tailwind, shadcn/ui, Orval (cliente
gerado a partir do OpenAPI da API).
Compartilhado: TypeScript, Biome, Turborepo, Husky + lint-staged.
DATABASE_URL=
JWT_PRIVATE_KEY= # par RS256
JWT_PUBLIC_KEY=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI=
OAUTH_FRONTEND_CALLBACK_URL=
REDIS_URL=redis://localhost:6380bun installbun run devcd apps/main-api && bun run dev # API em Bun --watch, Swagger em /doc
cd apps/main-frontend && bun run dev # Vite dev servercd apps/main-api
bun test # unitários
bun run test:integration
bun run test:e2e
bun run test:cov