- Docker (com Compose v2)
- Node >= 26 (o pnpm baixa a versão definida em
devEnginesautomaticamente) - pnpm (
corepack enableinstala a versão definida empackage.json)
Monorepo com pnpm workspaces. As versões compartilhadas ficam no catalog do pnpm-workspace.yaml.
| Pacote | Descrição |
|---|---|
apps/server |
API GraphQL (Hono + GraphQL Yoga + Pothos + Kysely/PostgreSQL) |
apps/boletim |
Sistema de Boletim (React + Relay + Vite) |
apps/admin |
Sistema do Administrador (React + Relay + Vite) |
packages/ui |
Componentes React compartilhados (Tailwind + shadcn com Base UI) |
packages/relay |
Environment do Relay |
packages/shared |
Utilitários compartilhados entre front-end e servidor |
packages/vite-config |
Configuração do Vite usada pelos apps |
pnpm install: Instala as dependências do projeto- Copie o arquivo
.env.exampledoapps/serverpara.env pnpm dev: Inicia os containers do projeto- Se a porta 3000 estiver ocupada, use
SERVER_PORT=3010 pnpm dev: a API sobe na 3010 e os apps passam a chamá-la lá
- Se a porta 3000 estiver ocupada, use
pnpm db:reset: Recria o banco do zero e alimenta com dados de teste (só em desenvolvimento)- Abra o Sistema de Boletim em
http://localhost:8080- RM
12345 - Senha
usefaz123
- RM
- Abra o Sistema do Administrador em
http://localhost:8081- E-mail
lucasgdbittencourt@gmail.com - Senha
usefaz123
- E-mail
pnpm stop: Desliga o projeto.
E-mails (links de redefinição de senha) saem pelo SMTP do Gmail. Para testar sem enviar nada, use MAIL_DRIVER=log no .env do servidor: o e-mail, com o link, aparece no log (docker logs server).
pnpm lint/pnpm lint:fix: Lint e formatação com Biomepnpm typecheck: Gera os artefatos do Relay e checa os tipos de todos os pacotespnpm build: Gera o build de produção de todos os apps
No servidor (pnpm --filter @usefaz/server <script>, ou docker compose exec server pnpm <script>):
migrate/rollback: Aplica as migrations pendentes / desfaz a últimadb:types: Gera os tipos do Kysely (src/database/types.ts) a partir do banco, depois de uma migrationdb:reset: Recria o banco com os dados de teste (só em desenvolvimento)
- Sessão: cookie
httpOnlycom um token opaco (só o hash fica no banco), um por app (X-Usefaz-App). Senhas com argon2id. - GraphQL: só aceita persisted queries em produção. O
relay-compilerde cada app grava as operações emapps/server/persisted-operations/; rodepnpm relaydepois de mudar uma query ou mutation. - Erros: falhas que o usuário pode corrigir voltam como dado (
error { field userMessage }); vejapackages/ui/README.md. - Uploads: avatares no
public/do servidor (STORAGE_DRIVER=local) ou num bucket S3 (STORAGE_DRIVER=s3e as variáveisS3_*).
![]() Boletim com notas, faltas e médias |
Foto de perfil |
![]() Erro do servidor no formulário |
![]() Recuperação de senha |
![]() Modo offline (PWA) com a última cópia salva |
![]() Tema de Natal |
Datas comemorativas (Natal, Halloween, Páscoa, Festa Junina, entre outras) decoram o boletim e a foto do aluno. Para ver um tema fora da época, use ?tema=natal (ou ?tema=off para desligar).
![]() Login |
![]() Perfil |
![]() Boletim |
![]() Tema de Natal |
@lucasgdb |
|---|










