- Vue 42.6%
- TypeScript 33.5%
- CSS 18.8%
- JavaScript 4.1%
- Dockerfile 0.6%
- Other 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .github/workflows | ||
| app | ||
| docs | ||
| infra | ||
| public | ||
| scripts | ||
| server | ||
| shared | ||
| tests/unit | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc.json | ||
| compose.yaml | ||
| Dockerfile | ||
| nuxt.config.ts | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
| yarn.lock | ||
Notum
Workspace pessoal de notas local-first, construído com Nuxt 4, Vue 3, TypeScript, PouchDB e CouchDB. Interface desktop baseada na referência fornecida: tema escuro, acentos roxos, painel Hoje e editor com inspector de links/tags/anexos. A versão mobile foi adiada a pedido do projeto.
Rodar localmente
Requisitos: Node.js 22 ou superior e npm.
npm ci
npm run dev
Abra http://localhost:3000. Não é preciso configurar servidor ou login para criar notas. O workspace começa vazio; em Configurações → Carregar exemplos, você pode adicionar os notebooks e notas demonstrativos inspirados no mockup.
Para conferir instalação/offline, use a build de produção (service worker não é habilitado no modo dev):
npm run build
npm run preview
PWA requer HTTPS em produção (localhost é permitido no desenvolvimento). A interface atual é desktop, com largura mínima de 1100px. Não há interface mobile.
Funcionalidades
- Hoje: notas criadas no dia, notas ativas, checkboxes pendentes, notebooks e notas recentes/fixadas. Contadores reais, sem números fictícios.
- CRUD de notas Markdown, salvamento imediato no IndexedDB, pin, status, arquivo e lixeira recuperável.
- Notebooks hierárquicos; rejeição de ciclos e exclusão apenas de notebooks vazios. Tags criáveis/renomeáveis, exclusão apenas sem referências.
- Editor CodeMirror com modos Markdown, visualização renderizada e divisão lado a lado; barra de formatação, atalhos de teclado, modo Foco, checklists, tabelas, código, links, imagens e diagramas Mermaid.
[[wikilinks]], links de entrada/saída derivados e busca local por título, conteúdo, tags e caminho do notebook.- Replicação incremental com CouchDB por gateway autenticado de mesma origem.
- Conflitos preservados: revisão explícita das versões; edições com revisão antiga geram cópia recuperada, sem sobrescrita silenciosa.
- Lixeira sem expiração automática na V1. Exclusão definitiva requer confirmação e replica tombstones.
- Anexos até 10MB: binário em IndexedDB local, fila de upload e filesystem no servidor; metadados no PouchDB. Download remoto sob demanda e cache local.
- Exportação individual
.mde workspace.zipcom árvore Markdown e metadados JSON. - Docker Compose, HTTPS via Caddy, limitação de login via nginx, provisionamento de conta comum e scripts de backup/restore.
Arquitetura
Para criar um diagrama, use Diagrama na barra do editor ou escreva um bloco Markdown com a linguagem mermaid. A visualização renderiza o desenho e mantém o código visível quando há erro de sintaxe. Ctrl/Cmd+B, Ctrl/Cmd+I e Ctrl/Cmd+K aplicam negrito, itálico e link para outra nota.
Componentes → composables → services/repository → PouchDB/IndexedDB
PouchDB → /api/sync → sessão HttpOnly → CouchDB privado
O frontend sempre lê e grava localmente. “Salvo” só aparece depois de put() concluir. A sincronização não bloqueia escrita nem é considerada backup. Configuração remota e segredos ficam em runtimeConfig privado.
Servidor pessoal
- Copie
.env.examplepara.enve defina credenciais únicas. Gere o segredo comopenssl rand -base64 48. - Configure
APP_DOMAINcom um domínio real apontando para sua VPS. Libere portas 80/443. - Inicie e provisione:
docker compose up -d couchdb
docker compose --profile setup run --rm setup
docker compose up -d --build nuxt-app rate-limit reverse-proxy
- Abra o domínio por HTTPS e conecte em Configurações usando
NUXT_ACCOUNT_USERNAMEeNOTUM_USER_PASSWORD. - Repita no segundo desktop. Ambos usam o mesmo banco pessoal.
CouchDB não publica portas no host. O container Nuxt não recebe a senha administrativa. Uma instância atende um proprietário, não um SaaS multiusuário. Nunca altere o proprietário de uma instância que já tem notas locais de outro usuário. Desconectar mantém as notas locais; limpar dados do navegador remove a cópia local.
Backup externo e recuperação
Veja docs/operations.md. O destino externo do Restic deve ser definido por você. A tarefa não fez deploy em VPS nem configurou serviços pagos. Não use dados únicos antes de validar a restauração no seu ambiente.
Verificação
npm run typecheck
npm test
npm run build
Os testes cobrem persistência, edições simultâneas, replicação entre bancos, resolução explícita, revisão obsoleta, lixeira/tombstones, hierarquia, busca e bloqueio de endpoints administrativos. Consulte docs/validation.md para evidências e limites da validação e docs/decisions.md para os spikes de editor e autenticação.
A referência contém “Compartilhar”; publicação/colaboração estão fora da V1 conforme a especificação, portanto esse controle não foi exposto. Os ícones de projetos foram extraídos da imagem fornecida para preservar a direção visual; veja docs/assets.md.