Português
Começar

← Todos os templates · Notas e wikis

Faça deploy de Trilium Notes em um clique

Uma base de conhecimento hierárquica para grandes coleções de notas pessoais

Uma alternativa auto-hospedada para Notion, Evernote e Obsidian.

O que é Trilium Notes?

O Trilium Notes é um app de notas gratuito e de código aberto feito para grandes bases de conhecimento pessoais, uma alternativa ao Notion, ao Evernote e ao Obsidian para quem quer as notas no próprio servidor. As notas formam uma árvore tão profunda quanto você quiser, e uma mesma nota pode ficar em vários lugares ao mesmo tempo. Além de texto formatado com tabelas, imagens e fórmulas matemáticas, uma nota pode ser código, um canvas do Excalidraw, um mapa mental, um mapa geográfico ou um mapa de relações, e atributos e scripts transformam notas em pequenas ferramentas. Cada nota guarda as próprias revisões, e a busca por texto completo a encontra de novo.

O servidor é quase o mesmo app, no navegador, com uma visualização pensada para o toque no celular, e os apps de desktop para Windows, macOS e Linux sincronizam com ele. As notas protegidas são criptografadas com a sua senha, uma nota pode ser compartilhada publicamente por um link, e um web clipper salva páginas a partir do navegador. Este template cria uma base de conhecimento nova e vazia com a senha informada antes de o Trilium responder a qualquer pessoa. O porém: o Trilium é para uma pessoa só, com uma senha e sem contas para outras pessoas, e não tem app oficial para celular.

Hospedagem de Trilium Notes no Pethost

  1. Você entra no Pethost com uma passkey, GitHub ou Google. Ainda não tem máquina? Você escolhe um plano, e o link espera até ela ficar pronta.
  2. Novo projeto abre em Trilium Notes. Você preenche o que ele pede e clica em Criar projeto: Senha.
  3. Em um ou dois minutos Trilium Notes está no ar no próprio endereço com HTTPS. Os segredos são gerados ao acaso, e os dados vão para o backup noturno.
  4. É um projeto como qualquer outro: você ou seu agente podem alterá-lo, fazer rollback ou restaurá-lo.

Perguntas sobre Trilium Notes

O Trilium Notes é gratuito?

Sim. O Trilium é de código aberto sob a licença AGPL-3.0 e não tem plano pago: o servidor, os apps de desktop e a sincronização são todos gratuitos.

O que é o TriliumNext?

O TriliumNext é o projeto da comunidade que deu continuidade ao Trilium. O desenvolvedor original do Trilium, Zadam, entregou a ele o repositório do Trilium, e hoje o projeto publica o app de novo com o nome Trilium Notes. Um banco de dados do Trilium original abre nele sem nenhum passo especial.

Trilium ou Obsidian: qual escolher?

O Obsidian guarda arquivos Markdown em uma pasta em cada dispositivo, tem código fechado e vende a própria sincronização. O Trilium guarda as notas em um banco de dados no seu servidor, é de código aberto e sincroniza os apps de desktop com o seu servidor de graça. Os pontos fortes do Obsidian são os plugins e os arquivos comuns; os do Trilium são a árvore de notas, a clonagem de notas e os muitos tipos de nota.

Existe app do Trilium para celular?

Não existe um app oficial. O servidor do Trilium tem uma interface móvel para o navegador do celular, e há apps da comunidade: TriliumDroid e Pocket Trilium para Android e Trinote para iOS.

Dá para importar minhas notas do Evernote ou em Markdown para o Trilium?

Sim. O Trilium importa as exportações ENEX do Evernote e arquivos Markdown, e exporta notas em Markdown ou HTML, então suas notas saem tão facilmente quanto entraram.

De quanta memória e disco Trilium Notes precisa?

Trilium é leve: cerca de 100 MB de memória; o banco de dados cresce com suas notas e anexos, e os backups diários, semanais e mensais do próprio Trilium ficam ao lado dele. No Pethost, o plano Starter basta, com espaço para outros apps ao lado.

Arquivo Docker Compose de Trilium Notes

O template é este compose.yaml e as variáveis gravadas no .env do projeto quando ele é criado. O Pethost roda o arquivo exatamente como está escrito.

Containers: trilium (triliumnext/trilium:v0.106.1).

Volumes, no backup noturno: data.

services:
  trilium:
    image: triliumnext/trilium:v0.106.1
    restart: unless-stopped
    environment:
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      # Requests come through the proxy: the client's own address is the one it forwards, so that
      # a stranger's wrong passwords do not lock everyone out of signing in.
      TRILIUM_NETWORK_TRUSTEDREVERSEPROXY: uniquelocal
    # A new Trilium offers its setup to whoever opens it first, then asks them for the password.
    # So while it has no password, it runs on port 8081, which nobody reaches: a new knowledge base
    # is made there with the password given, and only then does Trilium answer on 8080.
    command:
      - sh
      - -c
      - |
        set -e
        if ! node -e '
          const { DatabaseSync } = require("node:sqlite");
          const db = new DatabaseSync(process.env.TRILIUM_DATA_DIR + "/document.db", { readOnly: true });
          const row = db.prepare("select value from options where name = ?").get("passwordVerificationHash");
          process.exit(row?.value ? 0 : 1);
        ' 2>/dev/null; then
          TRILIUM_PORT=8081 node ./main.mjs &
          setup=$$!
          node -e '
            const base = "http://127.0.0.1:8081";
            const setUp = async () => {
              const status = await fetch(base + "/api/setup/status").then((r) => r.json());
              if (!status.isInitialized) {
                const made = await fetch(base + "/api/setup/new-document?skipDemoDb", {
                  method: "POST",
                  headers: { "content-type": "application/json" },
                  body: JSON.stringify({ locale: "en" })
                });
                if (!made.ok) throw new Error("new-document: " + made.status + " " + (await made.text()));
              }
              const password = process.env.ADMIN_PASSWORD;
              const set = await fetch(base + "/set-password", {
                method: "POST",
                body: new URLSearchParams({ password1: password, password2: password }),
                redirect: "manual"
              });
              if (set.status !== 302) throw new Error("set-password: " + set.status + " " + (await set.text()));
            };
            (async () => {
              let failure;
              for (let i = 0; i < 180; i++) {
                try {
                  return await setUp();
                } catch (error) {
                  failure = error;
                  await new Promise((done) => setTimeout(done, 1000));
                }
              }
              console.error(failure);
              process.exit(1);
            })();
          '
          kill $$setup
          wait $$setup || true
        fi
        chown -R node:node /home/node
        exec su -c "node ./main.mjs" node
    volumes:
      - data:/home/node/trilium-data

volumes:
  data:

Mais em Notas e wikis