Aplicativo web de listas compartilhadas em tempo real.
NossaLista permite criar, compartilhar e editar listas colaborativas com sincronizacao em tempo real. Usuarios novos recebem um tutorial guiado no primeiro login para aprender criacao, compartilhamento, edicao e acompanhamento realtime. O sistema suporta notificacoes online em tempo real e push do navegador opcional (ativacao/desativacao pelo usuario no menu da conta).
Status atual:
- MVP em desenvolvimento ativo
- Backend e frontend implementados no monorepo
- Onboarding guiado no primeiro login (com replay manual no menu da conta)
- Personal Access Tokens (PAT) para autenticar clientes MCP/API externos, gerenciaveis em "Conexoes (API/Assistentes)" no menu da conta
- Rebranding global do frontend com linguagem
Fresh Lists, paridade light/dark e switch de tema exposto na UI - Shell autenticado mobile refeito com headers compactos, sheets para conta/notificacoes e acoes de lista reorganizadas
- Landing page publica com CTAs separados para cadastro e login em modais distintos
- Fluxo deslogado centralizado na landing (
/), com/loginmantido apenas como redirecionamento legado para/?auth=login - CI ativo para frontend e backend
- Release automática em
maincom tag SemVer patch e deploy automático emdev - Deploy manual em
devpara branches/SHAs não mergeados via RC tag auditável - Deploy manual em
prodcom aprovação de environment e tag estável existente
| Camada | Tecnologia |
|---|---|
| Frontend | React 19 + TypeScript + Vite |
| Backend | Java 25 + Spring Boot 4 |
| Real-time | Spring WebSocket (STOMP + SockJS) |
| Auth | Google OAuth2 + email/senha + sessao JWT em cookie HttpOnly |
| BD Producao | PostgreSQL |
| BD Dev | PostgreSQL |
| BD Testes | H2 (MODE=PostgreSQL); Testcontainers-PostgreSQL (opt-in, testes sensíveis ao banco) |
| Migrations | Flyway |
| Infra | Raspberry Pi 4 + K3s + Cloudflare Tunnel |
A maioria dos testes do backend roda em H2 (rápido). Testes de repositório, validação de migration e o
McpServerIntegrationTestestendemAbstractPostgresITe rodam contra um PostgreSQL real via Testcontainers (exige Docker) — verbackend/QUALITY.md.
- O JWT de sessao web e transportado somente por cookie HttpOnly: em producao,
__Host-nl_sessioncomPath=/,Secure,SameSite=Laxe validade de 7 dias. O frontend nunca le nem envia esse JWT emAuthorization. - Cada mutacao autenticada pela sessao exige o cookie
XSRF-TOKENe o headerX-XSRF-TOKEN; Axios o obtem emGET /api/auth/csrf. Authorization: Bearere reservado aos PATsnlmcp_...e access tokens OAuth do MCP. Bearer JWT de sessao legado recebe 401.- Em producao, a borda Cloudflare deve redirecionar HTTP para HTTPS com 308 antes de qualquer request atingir o tunnel. HSTS ainda nao e habilitado, pois depende de auditoria dos demais subdominios.
nossalista/
|- backend/
|- frontend/
|- docs/
|- .agents/skills/
|- contracts/
|- k8s/
|- docker-compose.yml
|- CLAUDE.md
|- AGENTS.md -> CLAUDE.md
O backend expoe um servidor MCP embutido em POST /mcp
(Streamable HTTP), autenticado por OAuth 2.1 (Authorization Code + PKCE — claude.ai e
Claude Code conectam via "Add connector" sem copiar credencial manualmente), Personal
Access Token (nlmcp_...) para conectar assistentes de IA (Claude Code, Claude
Desktop, Cursor) as listas do usuario. Guia de conexao, tools disponiveis e modelo de
seguranca em docs/mcp.md; passo a passo para o usuario final na propria tela Conexoes
(API/Assistentes) → "Como conectar?" do app. As 13 tools sao instrumentadas com rate limit
por usuario nas mutacoes e metricas Prometheus por tool (mcp_tool_calls_total,
mcp_tool_duration_seconds) — ver docs/observability/.
.agents/skills/interface-design: skill local para projetar e auditar interfaces de produto com memoria em.interface-design/system.md, mantendo consistencia de espacamento, profundidade, superficies e padroes de componentes.
- Java 25
- Node.js 22+
- Docker e Docker Compose
docker compose up -dO docker-compose.yml sobe apenas o Postgres de desenvolvimento. As credenciais sao
parametrizadas por variaveis de ambiente com defaults de dev, e a porta e exposta
somente no loopback (127.0.0.1:5432), nunca em toda a rede:
| Variavel | Default (dev) |
|---|---|
POSTGRES_DB |
nossalista_dev |
POSTGRES_USER |
nossalista |
POSTGRES_PASSWORD |
nossalista |
docker compose up funciona sem configuracao adicional (usa os defaults). Para
sobrescrever, copie .env.example para .env na raiz e ajuste os valores — o
.env e ignorado pelo git e pelo build da imagem (.dockerignore).
cd backend
./mvnw spring-boot:run -Dspring-boot.run.profiles=devBackend em http://localhost:8080.
cd frontend
npm install
npm run devFrontend em http://localhost:5173.
Para subir apenas o frontend com API mock em memoria:
cd frontend
npm install
npm run dev:mockValidação unificada de qualidade (lint + types + cobertura + complexidade + ratchet):
./scripts/quality.sh --pre-commit # subset rápido (<= 30s)
./scripts/quality.sh --full # tudo + ratchet de baselineRoda nos dois ecossistemas (Maven + npm), produz uma tabela OK/regrediu, e
falha se alguma métrica regrediu vs. .quality-baseline/*.json. Disparado
automaticamente via Husky no git commit. Detalhes em
docs/quality-gate.md. Dívida pré-existente em
docs/quality-gate-debt.md.
- Tema visual oficial do frontend:
Fresh Lists - Direcao visual:
Playful Editorialna identidade unificadaleoferolive design, com paleta basevioleta + teal - Modos
lightedarkcompartilham a mesma linguagem visual e os mesmos componentes - A landing usa dois fluxos distintos:
- CTA principal abre cadastro
- CTA secundario abre login
- A landing publica deve permanecer minimalista: hero curto, preview principal unico e apoio enxuto
- Modais e formularios principais seguem o mesmo padrao de textbox, label, helper text, feedback e hierarquia de botoes
- A area autenticada mobile agora prioriza conteudo acima da dobra:
- headers compactos
- menu da conta e notificacoes em bottom sheet
- acoes secundarias em overflow quando necessario
- cards da Home com alvo de toque primario no card inteiro, busca local por nome/tipo e estados informativos sem checkbox decorativo
- escala compacta em cards/sheets/action rows para reduzir scroll e friccao
- Rotas protegidas com usuario deslogado redirecionam para
/(nao mais para/login?redirect=...) - Contrato de URL para orquestrar auth na landing:
/?auth=login|register/?auth=login®istered=1&email=...
cd frontend
npm run lint
npm run format:check
npm run stylelint
npm run typecheck
npm run test:coverage
npm run build
npm run bundle:check
npm run test:e2e:pr
npm run test:e2e:fullstackcd backend
./mvnw -B -Pstrict-quality verify
./mvnw -B -Pregression-tests test
./mvnw -B -DskipTests package
java -jar target/nossalista-0.0.1-SNAPSHOT.jar --spring.profiles.active=ciDetalhes de quality gate do backend em backend/QUALITY.md.
- Frontend: ESLint, Prettier, Stylelint, TypeScript (
tsc --noEmit), Vitest com coverage >= 80%, build, bundle budget e suite E2E Playwright@prbloqueante. - Backend:
verifycom Checkstyle, PMD, SpotBugs, ArchUnit, JaCoCo (>= 80% linhas e >= 75% branches), build e suite de regressao. - Seguranca e compliance: EditorConfig check, gitleaks, semgrep, npm audit (high+) e licencas (job
security-and-compliance). - SCA de dependencias: OSV-Scanner (
osv-scanner.yml) cobre backend (Maven) e frontend (npm); em PR reporta so vulnerabilidades novas, em push namain/cron semanal faz scan completo e publica SARIF na aba Security. Substituiu o OWASP Dependency-Check/NVD (verdocs/DECISIONS.mdD-027, issue #70). Em fase de validacao: ainda nao e required check. - Smoke backend: subida do jar com profile
cie validacao de/actuator/health. - Full-stack E2E: workflow
frontend-e2e-fullstack.ymlroda diariamente (06:00 UTC / 03:00 America/Sao_Paulo) e tambem viaworkflow_dispatch.
-
Manifests Kubernetes em
k8s/ -
Ambientes:
- Dev:
release.ymlcriavX.Y.Ze disparadeploy-on-tag.yml; para branches/SHAs não mergeados, usardeploy-branch-dev.yml, que geravX.Y.Z-rc.<sha> - Prod:
deploy-prod.ymlpromove uma tag estável existente (vX.Y.Z) com aprovação obrigatória no environmentproduction
- Dev:
-
Fonte de verdade da versão implantada:
- imagem do Deployment recebe explicitamente
ghcr.io/...:<tag> - annotations
deploy.nossalista/tagedeploy.nossalista/shasão atualizadas no cluster - cada workflow de deploy publica
Deployment Summaryno GitHub Actions comTag version deployada, imagem, SHA e ambiente GET /api/healthretornaversion,gitSha,gitTag,environmentebuildTime
- imagem do Deployment recebe explicitamente
-
Imagens publicadas:
- Dev:
ghcr.io/leoferolive/nossalista-dev:latest+ tags RC/estáveis para rastreabilidade - Prod:
ghcr.io/leoferolive/nossalista:latest+ tag estávelvX.Y.Z
- Dev:
-
Guardrails de deploy:
deploy-branch-dev.yml:refé obrigatório (sem default), evitando deploy acidental demaindeploy-on-tag.yml: valida formato de tag estável e setagerefapontam para o mesmo commitdeploy-prod.yml: aceita apenas tag estávelvX.Y.Zexistente no repositório
-
Operação manual (fallback):
kubectl apply -f k8s/dev/
kubectl apply -f k8s/prod/
kubectl get pods -n nossalista-dev
kubectl get pods -n nossalista
kubectl get deployment nossalista-dev -n nossalista-dev -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
curl http://nossalista.home/api/health
curl https://nossalista.leoferolive.com.br/api/healthREADME.mdCLAUDE.mdeAGENTS.mddocs/**backend/QUALITY.mdfrontend/README.md
Indice rapido de docs em docs/README.md.