App de notas em markdown inspirado no Obsidian, Evernote e Inkdrop
  • Vue 42.6%
  • TypeScript 33.5%
  • CSS 18.8%
  • JavaScript 4.1%
  • Dockerfile 0.6%
  • Other 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Luiz Figueiredo c5f831bba4
Some checks are pending
Validate Notum / check (push) Waiting to run
refactor: notes editor
2026-10-03 00:45:20 -04:00
.github/workflows first commit 2026-10-01 23:46:41 -04:00
app refactor: notes editor 2026-10-03 00:45:20 -04:00
docs refactor: notes editor 2026-10-03 00:45:20 -04:00
infra first commit 2026-10-01 23:46:41 -04:00
public first commit 2026-10-01 23:46:41 -04:00
scripts first commit 2026-10-01 23:46:41 -04:00
server first commit 2026-10-01 23:46:41 -04:00
shared first commit 2026-10-01 23:46:41 -04:00
tests/unit refactor: notes editor 2026-10-03 00:45:20 -04:00
.dockerignore first commit 2026-10-01 23:46:41 -04:00
.env.example first commit 2026-10-01 23:46:41 -04:00
.gitignore first commit 2026-10-01 23:46:41 -04:00
.prettierignore first commit 2026-10-01 23:46:41 -04:00
.prettierrc.json first commit 2026-10-01 23:46:41 -04:00
compose.yaml first commit 2026-10-01 23:46:41 -04:00
Dockerfile first commit 2026-10-01 23:46:41 -04:00
nuxt.config.ts first commit 2026-10-01 23:46:41 -04:00
package-lock.json refactor: notes editor 2026-10-03 00:45:20 -04:00
package.json refactor: notes editor 2026-10-03 00:45:20 -04:00
README.md refactor: notes editor 2026-10-03 00:45:20 -04:00
tsconfig.json first commit 2026-10-01 23:46:41 -04:00
vitest.config.ts first commit 2026-10-01 23:46:41 -04:00
yarn.lock refactor: notes editor 2026-10-03 00:45:20 -04:00

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 .md e workspace .zip com á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

  1. Copie .env.example para .env e defina credenciais únicas. Gere o segredo com openssl rand -base64 48.
  2. Configure APP_DOMAIN com um domínio real apontando para sua VPS. Libere portas 80/443.
  3. 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
  1. Abra o domínio por HTTPS e conecte em Configurações usando NUXT_ACCOUNT_USERNAME e NOTUM_USER_PASSWORD.
  2. 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.