Referência do Formato de Arquivo

Última revisão: 2026-07-17

Esta página é o contrato exato, tal como gravado em disco, para todo arquivo em um vault do Plainva. Ela é escrita para que uma ferramenta — outro programa, script ou assistente de IA — possa ler e editar arquivos do vault diretamente, com segurança, sem passar pela interface do Plainva. Se você só usa o app, nunca precisa desta página; as demais páginas do guia cobrem o uso normal.

Tudo aqui é texto UTF-8 puro. Notas são Markdown com frontmatter YAML; bancos de dados são YAML. Nada é proprietário e nada é oculto.

Regras de ouro (leia primeiro)

  1. A nota é a fonte da verdade. Uma .base é apenas uma visualização. Os valores das propriedades vivem no frontmatter das notas individuais — nunca dentro da .base. Para alterar um valor, edite a nota.
  2. Notas continuam nativas do Obsidian. No frontmatter de uma nota, escreva sempre escalares e listas simples (string, número, booleano, data ISO, lista YAML). Nunca escreva um objeto aninhado ou uma flag “ativo/selecionado” em uma nota.
  3. Uma .base usa apenas as quatro chaves de nível superior do Obsidian (filters, formulas, properties, views). Adicionar qualquer outra chave de nível superior faz o Obsidian rejeitar o arquivo inteiro. Tudo o que é específico do Plainva vive sob subchaves aninhadas plainva:.
  4. Preserve o que você não entende. Chaves desconhecidas devem sobreviver a um ciclo de leitura/escrita sem alterações. Não “limpe” chaves que você não reconhece.
  5. Escreva UTF-8 sem BOM, com quebras de linha LF.

O vault em um relance

Um vault é uma pasta comum. Os tipos de arquivo que você vai encontrar:

ArquivoO que éEditável como texto
*.mdUma nota: frontmatter YAML + corpo em MarkdownSim
*.baseUma visualização de banco de dados sobre notas (YAML)Sim
index.mdO sumário gerenciado de uma pasta (nome reservado)Sim, com cuidado — veja index.md
log.mdNome reservado, atualmente sem usoDeixe intocado
imagens, PDFs, …AnexosNão (binário)
.plainva/Pasta interna do Plainva (backups, estado)Não — nunca toque

Os nomes reservados index.md e log.md nunca são notas comuns; não crie conteúdo comum sob esses nomes.


Notas (.md)

Uma nota é um arquivo Markdown. Um bloco opcional de frontmatter YAML (entre duas linhas ---) bem no topo guarda suas propriedades; o corpo em Markdown vem em seguida.

---
type: Note
okf_version: "0.1"
tags: [project, active]
status: In progress
due: 2026-07-20
plainva:
  icon: "🚀"
  header_color: "#2f6f6f"
---
# My Project

A **bold** thought that links to [[Another Note]].

- [ ] First task

Campos de frontmatter do OKF

O Plainva segue o OKF (Open Knowledge Format), uma convenção mínima. Dois campos de nível superior:

CampoTipoSignificado
typestringQue tipo de documento é este (Note, Daily Note, Project, …). O único campo que o OKF realmente exige.
okf_versionstringA versão da convenção segundo a qual o arquivo foi escrito, por exemplo "0.1". Coloque entre aspas para o YAML mantê-la como string.

Um arquivo sem type ainda abre normalmente; ele simplesmente “não é conformante com o OKF”. Um okf_version ausente, isoladamente, não é uma violação. Ao criar uma nova nota, adicionar type (e okf_version) é uma boa prática. Veja OKF para a justificativa completa.

Serialização dos valores de propriedade

Cada chave de frontmatter é uma propriedade. Escreva o valor na forma YAML nativa do seu tipo:

Tipo de propriedadeForma YAMLExemplo
Textostring escalartitle: Hello
Númeronúmeropriority: 3
Caixa de seleçãobooleanodone: true
Datastring de data ISOdue: 2026-07-20
Data e horastring de data e hora ISOat: 2026-07-20T14:30:00
Listalista YAML de stringsauthors: [Ada, Alan]
Tagslista YAML de stringstags: [project, active]
Seleção / Statusstring escalar únicastatus: Done
Seleção múltiplalista YAML de stringslabels: [urgent, later]
URL / E-mail / Telefonestring escalarsite: https://example.org
Relação (única)string de link wikiproject: "[[Project Alpha]]"
Relação (múltipla)lista YAML de strings de link wikirelated: ["[[A]]", "[[B]]"]

O valor “ativo” de uma propriedade de Seleção/Status é apenas esse escalar simples. A paleta de opções permitidas e suas cores não vivem na nota — elas vivem na .base que a governa (veja Opções e cores). Isso mantém a nota 100% nativa do Obsidian.

Coloque valores de link wiki entre aspas ("[[X]]"). Um [[X]] sem aspas é uma sequência de fluxo YAML e não será interpretado como você pretende.

O namespace plainva: em notas

Extras específicos do Plainva para notas são agrupados sob uma única chave plainva: para que outros editores possam ignorá-los:

ChaveValorSignificado
icongrafema de emoji, ou lucide:<nome-kebab>Ícone do documento (estilo Notion)
icon_colorcor hex (#rgb / #rrggbb / #rrggbbaa)Tonalidade para um ícone lucide: (emojis a ignoram)
header_colorcor hexFaixa de cabeçalho em largura total
tasksfalseExclui as caixas de seleção desta nota da visualização de Tarefas
templateForlista de links wiki para arquivos .baseAtribui um modelo aos bancos de dados listados (só faz sentido para notas dentro da pasta de modelos)
pimmapeamento (veja abaixo)Âncora que vincula a nota a um evento de calendário, tarefa ou e-mail externo

Todos são opcionais. Se você não escrever nenhum deles, omita a chave plainva: inteiramente. Valores inválidos são ignorados na leitura, nunca tratados como erro.

pim é a âncora das integrações de PIM (veja Calendário & tarefas externas e Captura de e-mail). É um pequeno mapeamento gravado pelo Plainva quando uma nota espelha um objeto externo: uid mais account, e, dependendo do tipo, calendar (notas de reunião), kind: task + list (tarefas sincronizadas) ou kind: email + mailbox (e-mails capturados). Ferramentas devem preservá-lo inalterado; excluí-lo apenas desvincula a nota do seu objeto remoto (nada é excluído remotamente). Exemplo:

plainva:
  pim:
    kind: task
    uid: MTIzNDU2
    account: 3f9c21ab
    list: MDEyMzQ1

templateFor é o contrato de campo da atribuição de modelo (veja Bancos de Dados (.base)): em uma nota dentro da pasta de modelos, ele lista os bancos de dados cujo menu Entrada mostra o modelo por padrão. Os valores são links wiki completos, incluindo a extensão .base — sem qualificação ("[[Tasks.base]]" corresponde ao arquivo desse nome em qualquer pasta, portanto continua funcionando mesmo que o arquivo apenas mude de pasta) ou qualificados por caminho ("[[Projekte/Tasks.base]]" corresponde exatamente a esse caminho). O Plainva grava links sem qualificação e só os qualifica por caminho quando existem dois arquivos .base com o mesmo nome. Um escalar em vez de uma lista é tolerado. Ao criar um item a partir do modelo, templateFor — diferente das demais chaves plainva:não é copiado para a nova nota.


Bancos de dados (.base)

Um arquivo .base é YAML. Ele armazena uma visualização sobre notas — quais notas (fontes), como exibi-las (visualizações), como filtrar e ordenar, e o esquema de colunas. Ele não armazena valores de nota. O formato é compatível com o plugin Bases do Obsidian.

Regras rígidas — violar uma delas faz o Obsidian rejeitar o arquivo inteiro

O próprio Plainva corrige arquivos mais antigos que violam as duas últimas regras na próxima vez que os salva, mas uma ferramenta que escreve diretamente precisa acertá-las de antemão.

Identificadores de propriedade: quando usar o prefixo note.

Isso costuma confundir as pessoas, por isso fica explícito:

OndeFormaExemplo
Chaves do mapa properties:com prefixonote.status, file.name
Lista order: de uma visualizaçãocom prefixo[file.name, note.status]
sort[].property de uma visualizaçãocom prefixonote.due
Dentro de expressões de filtrosem prefixostatus == "Done"
Dentro de subchaves plainva (groupBy, dateField, endField, subItemsProperty)sem prefixogroupBy: status

Regra geral: os campos estruturais voltados para o Obsidian usam note.<key> (e file.<x> para embutidos como file.name, file.folder, file.mtime); tudo dentro de uma fórmula de filtro ou de um bloco plainva usa a chave de frontmatter sem prefixo.

Chaves de nível superior

O mapa de subchaves plainva:

Tudo o que é específico do Plainva tem namespace. Três locais:

properties[<note.key>].plainva — por coluna:

ChaveValorSignificado
inputum dos tipos de entrada abaixoO tipo de campo da coluna
optionslista de objetos de opçãoValores selecionados para seleção/status/seleção múltipla
relationBasecaminho .base vault-relativoBanco de dados de destino da relação (veja Relações)
relationLimitoneCardinalidade: link único. Omita para ilimitado.
reverseOf{ base, property }Marca uma coluna de relação reversa calculada (sem input)

views[i].plainva — por visualização:

ChaveValorSignificado
renderboard / calendar / timeline / graph / pinboardTipo de visualização exclusivo do Plainva (veja abaixo)
groupBychave de propriedade sem prefixoColuna de agrupamento do quadro
dateFieldchave de propriedade sem prefixoData de início do calendário/linha do tempo
endFieldchave de propriedade sem prefixoData de término da linha do tempo
coverImagechave de propriedade sem prefixoPropriedade de imagem de capa da galeria
subItemsPropertychave de propriedade sem prefixoColuna pai de autorrelação para o aninhamento de subitens
widthsmapa de id → pxLarguras de coluna
dateFormatstringFormato de data por visualização (default é implícito — omita)
pinboardOrderlista de caminhos vault-relativosOrdem manual dos cartões do mural NÃO fixados
pinboardPinnedlista de caminhos vault-relativosCartões fixados; a ordem da lista é a ordem da seção
pinboardFilterBytags ou uma chave de seleção múltipla sem prefixoOrigem dos marcadores da barra de chips do mural (tags é implícito — omita)

Além do bloco plainva, uma visualização pode carregar um objeto nativo views[i].filters — os filtros de propriedade por visualização (a mesma gramática de raiz única and/or/not do filters no nível do arquivo). O Plainva armazena aqui as regras de filtro de propriedade, um conjunto por visualização, de modo que cada visualização filtra de forma independente; o filters no nível do arquivo então mantém apenas as fontes. O Obsidian aplica views[i].filters nativamente, por visualização.

views[0].plainva — chaves válidas para o arquivo inteiro, permitidas somente na primeira visualização:

ChaveValorSignificado
fileIconColorcor hexTonalidade do ícone do banco de dados (árvore/abas/cabeçalho)
newItemFolderpasta vault-relativaOnde o botão “Novo” armazena novos itens
newItemTemplatecaminho .md vault-relativoModelo padrão para novos itens
contextFilterslista de chaves de propriedade simplesFiltros de autorreferência (“Esta nota”) — veja abaixo

contextFilters é o equivalente do Plainva ao filtro “this page” do Notion. Cada entrada é uma chave de propriedade; quando o banco de dados está incorporado em uma nota, suas linhas ficam filtradas para essa nota hospedeira através dessa propriedade (resolvido através do índice de links — uma propriedade de relação própria ou de link wiki simples corresponde a linhas que apontam para o hospedeiro, uma coluna reversa calculada corresponde ao que o hospedeiro aponta). Ele deliberadamente não é gravado nos filters nativos, então o Obsidian o ignora e mostra todas as linhas; se aberto de forma autônoma no Plainva, ele também é descartado (sem hospedeiro) e mostra todas as linhas. Várias entradas se combinam com E.

Tipos de entrada

plainva.input é um dos seguintes:

text  number  checkbox  date  datetime
select  status  multiselect
list  tags  url  email  phone
relation

Uma coluna calculada de relação reversa não tem input — ela é identificada apenas por reverseOf.

Opções e cores

Colunas de Seleção/Status/Seleção múltipla podem carregar uma lista de opções selecionadas. Cada opção:

options:
  - value: Open          # required
    color: amber         # optional palette name (see below)
    group: Active        # optional; STATUS only — orders options into stages
  - value: Done
    color: green
    group: Closed

color é um nome de paleta, não uma cor CSS. Nomes válidos: gray, teal, blue, green, amber, coral, purple, pink. Uma cor desconhecida recorre a uma cor derivada do valor.

Tipos de visualização

views[i].type em disco é um tipo nativo do Obsidian. Renderizações exclusivas do Plainva são escritas como type: table mais uma dica plainva.render, para que o Obsidian as degrade a uma tabela simples:

Você quertype em discoplainva.render
Tabelatable
Listalist
Galeriacards
Quadrotableboard
Calendáriotablecalendar
Linha do tempotabletimeline

Filtros

filters seleciona quais notas estão no banco de dados e as restringe.

Condições de fonte decidem a associação:

Múltiplas fontes são simplesmente múltiplas entradas. Nenhum filters = toda nota no vault.

Onde vivem as condições de propriedade: no nível do arquivo, filters se aplica a todas as visualizações. O Plainva, em vez disso, armazena as regras de filtro de propriedade por visualização em views[i].filters (mesma estrutura de raiz única) e mantém apenas as fontes no nível do arquivo, de modo que cada visualização possa filtrar de forma independente. Ambos são válidos para o Obsidian; uma ferramenta pode escrever qualquer um dos dois. Um arquivo legado com condições de propriedade no nível do arquivo continua funcionando — o Plainva as distribui para cada visualização no próximo salvamento.

Condições de propriedade usam nomes de propriedade sem prefixo e estes operadores:

OperadorExpressão
igual astatus == "Done"
diferente destatus != "Done"
contémcontains(labels, "urgent")
não contém!contains(labels, "urgent")
maior / menorpriority > "2", priority < "5"
no mínimo / no máximopriority >= "2", priority <= "5"
está vaziostatus == ""
não está vaziostatus != ""

Estrutura (com raiz única!): um entre and / or / not, cujas entradas são strings de condição — ou um nível de objetos de grupo aninhados {and:[...]} / {or:[...]} (grupos ao estilo Notion). Exemplo combinando uma fonte, uma condição e um grupo OU:

filters:
  and:
    - 'file.folder == "Projects"'
    - 'status != "Done"'
    - or:
        - 'priority == "1"'
        - 'priority == "2"'

Uma .base completa e comentada

filters:
  and:
    - 'file.folder == "Projects"'          # source: notes in the Projects folder
properties:
  note.status:                             # column id is note.-prefixed
    displayName: Status                    # optional Obsidian column label
    plainva:
      input: status
      options:
        - value: Open
          color: amber
          group: Active
        - value: Done
          color: green
          group: Closed
views:
  - type: table                            # first view: also carries file-wide keys
    name: All projects                     # every view needs a name
    order: [file.name, note.status]        # order uses note.-prefixed ids
    plainva:
      fileIconColor: "#2f6f6f"
      newItemFolder: Projects
  - type: table                            # a board is a native table + render hint
    name: Board
    plainva:
      render: board
      groupBy: status                      # groupBy uses the BARE key

Relações (o contrato de duas vias)

Uma relação vincula notas entre si. Isto é o que mais gera erros ao escrever à mão, porque se estende por três lugares. Mantenha os três consistentes.

  1. O valor vive no frontmatter da nota de origem, como um link wiki (ou uma lista deles):

    ---
    type: Task
    project: "[[Project Alpha]]"
    ---
  2. A .base de origem declara a coluna de relação (relationBase = o banco de dados de destino; relationLimit: one para um único link):

    properties:
      note.project:
        plainva:
          input: relation
          relationBase: Projects.base
          relationLimit: one
  3. A .base de destino pode mostrar o inverso com uma coluna calculada. Seus valores não são armazenados em lugar nenhum — são derivados dos links das notas de origem:

    properties:
      note.tasks:
        plainva:
          reverseOf:
            base: Tasks.base       # the source .base (vault-relative path)
            property: project      # the BARE source property key

Exemplo prático: Tarefas ↔ Projetos

Tasks.base

filters:
  and:
    - 'file.folder == "Tasks"'
properties:
  note.status:
    plainva:
      input: status
      options:
        - value: Open
          color: amber
        - value: Done
          color: green
  note.project:
    plainva:
      input: relation
      relationBase: Projects.base
      relationLimit: one
views:
  - type: table
    name: All tasks
    order: [file.name, note.status, note.project]

Projects.base

filters:
  and:
    - 'file.folder == "Projects"'
properties:
  note.tasks:
    plainva:
      reverseOf:
        base: Tasks.base
        property: project
views:
  - type: table
    name: All projects
    order: [file.name, note.tasks]

Tasks/Write proposal.md

---
type: Task
okf_version: "0.1"
status: Open
project: "[[Project Alpha]]"
---
# Write proposal

Projects/Project Alpha.md

---
type: Project
okf_version: "0.1"
---
# Project Alpha

Resultado: em Projects.base, a coluna calculada tasks de Project Alpha lista “Write proposal”, porque o project dessa tarefa aponta de volta para ela. Note que Project Alpha.md não tem chave tasks: — o lado reverso é calculado, nunca armazenado.

O que NÃO fazer com relações

Autorrelações e subitens

Para uma relação cujo destino é o mesmo banco de dados, aponte relationBase para essa mesma .base. Para aninhar filhos sob pais em uma visualização de tabela, defina views[i].plainva.subItemsProperty como a chave de relação pai sem prefixo. Ciclos são tratados; com subitens desativados, as linhas permanecem planas e os valores são mantidos.


index.md (sumário de uma pasta)

index.md é um nome reservado para o sumário de uma pasta.

Se você estiver gerando uma visão geral de pasta à mão, a escolha segura é não adicionar o marcador — assim o Plainva nunca a sobrescreverá.


Visualizações de grafo (plainva.render: "graph")

Uma visualização de grafo é armazenada como qualquer visualização não nativa: type: table mais a dica de renderização. Suas opções vivem no MESMO namespace views[i].plainva:

views:
  - type: table
    name: Net
    plainva:
      render: graph
      graphEdges: [projekt]        # relation property keys drawn as edges
      graphColorBy: status         # select/status property -> node color
      graphSizeBy: prio            # number property -> node size
      graphShowExternal: true      # include relation targets outside the view
      graphShowIncoming: true      # relações de OUTROS bancos de dados que apontam para cá (por exemplo, as tarefas de um projeto)

Todas as chaves de opção do grafo são opcionais; omita-as inteiramente quando não definidas. O Obsidian renderiza o mesmo arquivo como uma tabela simples e não deve gerar erro.

Uma visualização de Quadro (plainva.render: "board") também pode carregar views[i].plainva.boardColumnOrder — uma lista de chaves de coluna de grupo (__UNGROUPED__ marca a coluna sem valor) que lembra uma ordem manual de colunas. Quadros de Seleção/Status, em vez disso, reordenam as options da propriedade. Omita a chave quando não definida.

A visualização de mural (plainva.render: "pinboard")

Um mural é armazenado como qualquer visualização não nativa: type: table mais a dica de renderização. Suas chaves vivem no mesmo namespace views[i].plainva:

views:
  - type: table
    name: Pinboard
    plainva:
      render: pinboard
      pinboardOrder:                  # ordem manual dos cartões não fixados
        - "Notes/Groceries.md"
      pinboardPinned:                 # fixados; a ordem da lista = a ordem da seção
        - "Notes/Idea.md"
      pinboardFilterBy: note.labels   # origem dos marcadores da barra de chips; omitir = tags

Regras: caminhos fixados não são repetidos em pinboardOrder. Cartões que não estão em nenhuma das duas listas são renderizados no topo, do mais recente para o mais antigo (data de criação). Itens cujo arquivo não existe mais ou saiu do conjunto de fontes são ignorados e removidos no próximo salvamento. Quando uma nota é renomeada ou movida, o Plainva reajusta os caminhos em ambas as listas automaticamente; ferramentas externas precisam fazer o mesmo. O Obsidian ignora as chaves e mostra a visualização como uma tabela.

O que não tocar e segurança

Veja também