Dokumentacja formatu plików

Stan na: 2026-07-17

Ta strona to precyzyjny kontrakt formatu na dysku dla każdego pliku w vaulcie Plainva. Jest napisana tak, aby narzędzie — inny program, skrypt lub asystent AI — mógł czytać i bezpiecznie edytować pliki vaultu bezpośrednio, bez przechodzenia przez interfejs użytkownika Plainva. Jeśli używasz tylko aplikacji, ta strona nigdy nie jest Ci potrzebna; pozostałe strony podręcznika opisują zwykłe użycie.

Wszystko tutaj to zwykły tekst UTF-8. Notatki to Markdown z frontmatter YAML; bazy danych to YAML. Nic nie jest zastrzeżone i nic nie jest ukryte.

Zasady podstawowe (przeczytaj najpierw)

  1. Notatka jest źródłem prawdy. .base to tylko widok. Wartości właściwości znajdują się we frontmatter poszczególnych notatek — nigdy w .base. Aby zmienić wartość, edytujesz notatkę.
  2. Notatki pozostają Obsidian-natywne. We frontmatter notatki zapisuj wyłącznie proste skalary i listy (string, liczba, boolean, data ISO, lista YAML). Nigdy nie zapisuj zagnieżdżonego obiektu ani flagi „aktywne/wybrane” w notatce.
  3. .base używa tylko czterech kluczy najwyższego poziomu Obsidian (filters, formulas, properties, views). Dodanie jakiegokolwiek innego klucza najwyższego poziomu sprawia, że Obsidian odrzuca cały plik. Wszystkie dane specyficzne dla Plainva znajdują się pod zagnieżdżonymi podkluczami plainva:.
  4. Zachowaj to, czego nie rozumiesz. Nieznane klucze muszą przetrwać cykl odczytu/zapisu bez zmian. Nie „porządkuj” kluczy, których nie rozpoznajesz.
  5. Zapisuj UTF-8 bez BOM, z zakończeniami linii LF.

Vault w skrócie

Vault to zwykły folder. Typy plików, które napotkasz:

PlikCo to jestEdytowalny jako tekst
*.mdNotatka: frontmatter YAML + treść MarkdownTak
*.baseWidok bazy danych na notatkach (YAML)Tak
index.mdZarządzany spis treści folderu (nazwa zarezerwowana)Tak, z rozwagą — patrz index.md
log.mdNazwa zarezerwowana, obecnie nieużywanaZostaw w spokoju
obrazy, PDF-y, …ZałącznikiNie (binarne)
.plainva/Wewnętrzny folder Plainva (kopie zapasowe, stan)Nie — nigdy nie dotykaj

Zarezerwowane nazwy index.md i log.md nigdy nie są zwykłymi notatkami; nie twórz zwykłej treści pod tymi nazwami.


Notatki (.md)

Notatka to plik Markdown. Opcjonalny blok frontmatter YAML (między dwiema liniami ---) na samej górze zawiera jej właściwości; po nim następuje treść Markdown.

---
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

Pola frontmatter OKF

Plainva stosuje się do OKF (Open Knowledge Format), minimalnej konwencji. Dwa pola najwyższego poziomu:

PoleTypZnaczenie
typestringJakiego rodzaju to dokument (Note, Daily Note, Project, …). Jedyne pole, którego OKF rzeczywiście wymaga.
okf_versionstringWersja konwencji, względem której plik został zapisany, np. "0.1". Ujmij w cudzysłów, aby YAML zachował ją jako string.

Plik bez type nadal otwiera się bez problemu; jest po prostu „niezgodny z OKF”. Samo brakujące okf_version nie jest naruszeniem. Gdy tworzysz nową notatkę, dodanie type (i okf_version) jest dobrą praktyką. Pełne uzasadnienie znajdziesz w OKF.

Serializacja wartości właściwości

Każdy klucz frontmatter to jedna właściwość. Zapisz wartość w natywnej formie YAML odpowiadającej jej typowi:

Typ właściwościForma YAMLPrzykład
Tekstskalar stringtitle: Hello
Liczbaliczbapriority: 3
Pole wyborubooleandone: true
Datastring daty ISOdue: 2026-07-20
Data i godzinastring daty i godziny ISOat: 2026-07-20T14:30:00
Listalista YAML ze stringamiauthors: [Ada, Alan]
Tagilista YAML ze stringamitags: [project, active]
Wybór / Statuspojedynczy skalar stringstatus: Done
Wielokrotny wybórlista YAML ze stringamilabels: [urgent, later]
URL / E-mail / Telefonskalar stringsite: https://example.org
Relacja (pojedyncza)string linku wikiproject: "[[Project Alpha]]"
Relacja (wielokrotna)lista YAML ze stringami linków wikirelated: ["[[A]]", "[[B]]"]

„Aktywna” wartość właściwości typu Wybór/Status to po prostu ten zwykły skalar. Paleta dozwolonych opcji i ich kolory nie znajdują się w notatce — znajdują się w nadrzędnym pliku .base (patrz Opcje i kolory). Dzięki temu notatka pozostaje w 100% Obsidian-natywna.

Ujmuj wartości linków wiki w cudzysłów ("[[X]]"). Nieocudzysłowione [[X]] to w YAML sekwencja flow i nie zostanie sparsowane tak, jak zamierzasz.

Przestrzeń nazw plainva: w notatkach

Specyficzne dla Plainva dodatki do notatek są zgrupowane pod jednym kluczem plainva:, dzięki czemu inne edytory mogą je ignorować:

KluczWartośćZnaczenie
icongrafem emoji lub lucide:<nazwa-kebab>Ikona dokumentu (w stylu Notion)
icon_colorkolor hex (#rgb / #rrggbb / #rrggbbaa)Tonacja ikony lucide: (emoji ją ignorują)
header_colorkolor hexPasek nagłówka na pełną szerokość
tasksfalseWyklucza pola wyboru tej notatki z widoku Zadania
templateForlista linków wiki do plików .basePrzypisuje szablon do wymienionych baz danych (istotne tylko dla notatek wewnątrz folderu szablonów)
pimmapowanie (patrz niżej)Kotwica wiążąca notatkę z zewnętrznym wydarzeniem kalendarza, zadaniem lub e-mailem

Wszystkie te pola są opcjonalne. Jeśli nie zapisujesz żadnego z nich, pomiń klucz plainva: całkowicie. Nieprawidłowe wartości są ignorowane przy odczycie, nigdy traktowane jako błąd.

pim to kotwica integracji PIM (patrz Kalendarz i zewnętrzne zadania i Przechwytywanie e-maili). To małe mapowanie zapisywane przez Plainva, gdy notatka odzwierciedla zewnętrzny obiekt: uid plus account, a w zależności od rodzaju calendar (notatki ze spotkań), kind: task + list (zsynchronizowane zadania) lub kind: email + mailbox (przechwycone e-maile). Narzędzia powinny zachowywać je bez zmian; usunięcie go jedynie odłącza notatkę od jej zdalnego obiektu (nic nie jest usuwane zdalnie). Przykład:

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

templateFor to kontrakt pola przypisania szablonu (patrz Bazy danych (.base)): na notatce wewnątrz folderu szablonów wymienia bazy danych, w których menu Wpis domyślnie pokazuje ten szablon. Wartości to całe linki wiki wraz z rozszerzeniem .base — w formie gołej ("[[Tasks.base]]" pasuje do pliku o tej nazwie w dowolnym folderze, więc przetrwa samo przeniesienie folderu) albo kwalifikowanej ścieżką ("[[Projekte/Tasks.base]]" pasuje dokładnie do tej ścieżki). Plainva zapisuje gołe linki i kwalifikuje je tylko wtedy, gdy istnieją dwa pliki .base o tej samej nazwie. Skalar zamiast listy jest tolerowany. Gdy wpis jest tworzony z szablonu, templateFor — w odróżnieniu od pozostałych kluczy plainva:nie jest kopiowany do nowej notatki.

Linki


Bazy danych (.base)

Plik .base to YAML. Przechowuje widok na notatki — jakie notatki (źródła), jak je pokazywać (widoki), jak filtrować i sortować oraz schemat kolumn. Nie przechowuje żadnych wartości notatek. Format jest zgodny z wtyczką Bases w Obsidian.

Zasady twarde — złamanie jednej sprawia, że Obsidian odrzuca cały plik

Sam Plainva naprawia starsze pliki naruszające dwie ostatnie zasady przy następnym zapisie, ale narzędzie piszące bezpośrednio musi je od razu zastosować poprawnie.

Identyfikatory właściwości: kiedy używać przedrostka note.

To najczęstsza pułapka, więc wprost:

GdzieFormaPrzykład
Klucze mapy properties:z przedrostkiemnote.status, file.name
Lista order: widokuz przedrostkiem[file.name, note.status]
sort[].property widokuz przedrostkiemnote.due
Wewnątrz wyrażeń filtrabez przedrostkastatus == "Done"
Wewnątrz podkluczy plainva (groupBy, dateField, endField, subItemsProperty)bez przedrostkagroupBy: status

Reguła praktyczna: pola strukturalne zwrócone do Obsidian używają note.<key> (i file.<x> dla wbudowanych, jak file.name, file.folder, file.mtime); wszystko wewnątrz formuły filtra lub bloku plainva używa gołego klucza frontmatter.

Klucze najwyższego poziomu

Mapa podkluczy plainva:

Wszystko, co specyficzne dla Plainva, ma nadaną przestrzeń nazw. Trzy miejsca:

properties[<note.key>].plainva — na kolumnę:

KluczWartośćZnaczenie
inputjeden z typów wejścia poniżejTyp pola kolumny
optionslista obiektów opcjiKuratorowane wartości dla wybór/status/wielokrotny wybór
relationBaseścieżka .base względna do vaultuDocelowa baza danych relacji (patrz Relacje)
relationLimitoneKardynalność: pojedynczy link. Pomiń dla braku ograniczeń.
reverseOf{ base, property }Oznacza kolumnę obliczanej relacji odwrotnej (bez input)

views[i].plainva — na widok:

KluczWartośćZnaczenie
renderboard / calendar / timeline / graph / pinboardRodzaj widoku dostępny tylko w Plainva (patrz niżej)
groupBygoły klucz właściwościKolumna grupowania tablicy
dateFieldgoły klucz właściwościData początkowa kalendarza/osi czasu
endFieldgoły klucz właściwościData końcowa osi czasu
coverImagegoły klucz właściwościWłaściwość okładki galerii
subItemsPropertygoły klucz właściwościKolumna nadrzędna relacji do samej siebie do zagnieżdżania elementów podrzędnych
widthsmapa id → pxSzerokości kolumn
dateFormatstringFormat daty per widok (default jest domyślny — pomiń go)
pinboardOrderlista ścieżek względnych do vaultuRęczna kolejność NIEPRZYPIĘTYCH kart na tablicy korkowej
pinboardPinnedlista ścieżek względnych do vaultuPrzypięte karty; kolejność na liście odpowiada kolejności w sekcji
pinboardFilterBytags lub goły klucz wielokrotnego wyboruŹródło etykiet paska chipów tablicy korkowej (tags jest domyślne — pomiń ten klucz)

Oprócz bloku plainva, widok może nieść natywny obiekt views[i].filtersfiltry właściwości dla poszczególnych widoków (ta sama jednokorzeniowa gramatyka and/or/not co filters na poziomie pliku). Plainva przechowuje tu reguły filtrów właściwości, po jednym zestawie na widok, dzięki czemu każdy widok filtruje niezależnie; filters na poziomie pliku zachowuje wtedy tylko źródła. Obsidian stosuje views[i].filters natywnie dla każdego widoku.

views[0].plainva — klucze dotyczące całego pliku, dozwolone wyłącznie na pierwszym widoku:

KluczWartośćZnaczenie
fileIconColorkolor hexTonacja ikony bazy danych (drzewo/karty/nagłówek)
newItemFolderfolder względny do vaultuGdzie przycisk „Nowy” zapisuje nowe elementy
newItemTemplateścieżka .md względna do vaultuDomyślny szablon nowych elementów
contextFilterslista prostych kluczy właściwościFiltry samoodniesienia („Ta notatka”) — patrz niżej

contextFilters to odpowiednik filtra „ta strona” z Notion w Plainva. Każdy wpis to klucz właściwości; gdy baza danych jest osadzona w notatce, jej wiersze są ograniczane do tej notatki głównej za pośrednictwem tej właściwości (rozwiązywane przez indeks linków: właściwość relacji, czyli strona właścicielska, lub zwykła właściwość z linkiem wiki dopasowuje wiersze wskazujące na notatkę główną, a obliczana kolumna odwrotna dopasowuje to, na co wskazuje notatka główna). Celowo nie jest zapisywany w natywnym filters, więc Obsidian go ignoruje i pokazuje wszystkie wiersze; przy samodzielnym otwarciu w Plainva jest on również pomijany (brak notatki głównej) i pokazywane są wszystkie wiersze. Wiele wpisów łączy się logiką AND.

Typy wejścia

plainva.input to jeden z:

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

Obliczana kolumna odwrotna nie ma input — jest identyfikowana wyłącznie przez reverseOf.

Opcje i kolory

Kolumny Wybór/Status/Wielokrotny wybór mogą nieść kuratorowaną listę opcji. Każda opcja:

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 to nazwa palety, nie kolor CSS. Prawidłowe nazwy: gray, teal, blue, green, amber, coral, purple, pink. Nieznany kolor przechodzi na kolor wyprowadzony z wartości.

Typy widoków

views[i].type na dysku to natywny typ Obsidian. Widoki dostępne tylko w Plainva są zapisywane jako type: table plus wskazówka plainva.render, dzięki czemu Obsidian degraduje je do zwykłej tabeli:

Chcesztype na dyskuplainva.render
Tabelatable
Listalist
Galeriacards
Tablicatableboard
Kalendarztablecalendar
Oś czasutabletimeline

Filtry

filters wybiera, które notatki znajdują się w bazie danych, i zawęża je.

Warunki źródła decydują o przynależności:

Wiele źródeł to po prostu wiele wpisów. Brak filters w ogóle = każda notatka w vaulcie.

Gdzie znajdują się warunki właściwości: na poziomie pliku filters obowiązuje dla każdego widoku. Plainva zamiast tego przechowuje reguły filtrów właściwości dla każdego widoku osobno w views[i].filters (ta sama jednokorzeniowa struktura) i zachowuje na poziomie pliku tylko źródła, dzięki czemu każdy widok może filtrować niezależnie. Oba warianty są zgodne z formatem Obsidian; narzędzie może zapisać dowolny z nich. Starszy plik z warunkami właściwości na poziomie pliku nadal działa — Plainva rozdziela je do poszczególnych widoków przy najbliższym zapisie.

Warunki właściwości używają gołych nazw właściwości i tych operatorów:

OperatorWyrażenie
jest równestatus == "Done"
nie jest równestatus != "Done"
zawieracontains(labels, "urgent")
nie zawiera!contains(labels, "urgent")
większe / mniejszepriority > "2", priority < "5"
co najmniej / co najwyżejpriority >= "2", priority <= "5"
jest pustestatus == ""
nie jest pustestatus != ""

Struktura (jednokorzeniowa!): jedno z and / or / not, którego wpisy są stringami warunków — lub jeden poziom zagnieżdżonych obiektów grup {and:[...]} / {or:[...]} (grupy w stylu Notion). Przykład łączący źródło, warunek i grupę OR:

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

Kompletna, opisana .base

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

Relacje (kontrakt dwustronny)

Relacja łączy notatki ze sobą. To najbardziej podatna na błędy rzecz do napisania ręcznie, ponieważ obejmuje trzy miejsca. Utrzymaj wszystkie trzy spójne.

  1. Wartość znajduje się we frontmatter notatki źródłowej, jako link wiki (lub ich lista):

    ---
    type: Task
    project: "[[Project Alpha]]"
    ---
  2. Źródłowa .base deklaruje kolumnę relacji (relationBase = docelowa baza danych; relationLimit: one dla pojedynczego linku):

    properties:
      note.project:
        plainva:
          input: relation
          relationBase: Projects.base
          relationLimit: one
  3. Docelowa .base może pokazać relację odwrotną za pomocą kolumny obliczanej. Jej wartości nie są nigdzie przechowywane — są wyprowadzane z linków notatek źródłowych:

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

Przykład krok po kroku: Zadania ↔ Projekty

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

Wynik: w Projects.base obliczana kolumna tasks dla Project Alpha wymienia „Write proposal”, ponieważ pole project tego zadania linkuje z powrotem do niej. Zauważ, że Project Alpha.md nie ma klucza tasks: — strona odwrotna jest obliczana, nigdy przechowywana.

Czego NIE robić w relacjach

Relacje do samej siebie i elementy podrzędne

Dla relacji, której celem jest ta sama baza danych, skieruj relationBase na tę samą .base. Aby zagnieździć dzieci pod rodzicami w widoku tabeli, ustaw views[i].plainva.subItemsProperty na goły klucz relacji nadrzędnej. Cykle są obsługiwane; przy wyłączonych elementach podrzędnych wiersze pozostają płaskie, a wartości są zachowane.


index.md (spis treści folderu)

index.md to zarezerwowana nazwa dla spisu treści folderu.

Jeśli generujesz przegląd folderu ręcznie, bezpiecznym wyborem jest nie dodawać znacznika — wtedy Plainva nigdy go nie nadpisze.


Widoki grafu (plainva.render: "graph")

Widok grafu jest przechowywany tak jak każdy niekative widok: type: table plus wskazówka render. Jego opcje żyją w TEJ SAMEJ przestrzeni nazw views[i].plainva:

views:
  - type: table
    name: Net
    plainva:
      render: graph
      graphEdges: [projekt]        # klucze właściwości relacji rysowane jako krawędzie
      graphColorBy: status         # właściwość wybór/status -> kolor węzła
      graphSizeBy: prio            # właściwość liczbowa -> rozmiar węzła
      graphShowExternal: true      # dołącz cele relacji spoza widoku
      graphShowIncoming: true      # relacje z INNYCH baz danych, które tu wskazują (np. zadania projektu)

Wszystkie klucze opcji grafu są opcjonalne; pomiń je całkowicie, gdy nieustawione. Obsidian renderuje ten sam plik jako zwykłą tabelę i nie może zgłosić błędu.

Widok Tablica (plainva.render: "board") może dodatkowo nieść views[i].plainva.boardColumnOrder — listę kluczy kolumn grupujących (__UNGROUPED__ oznacza kolumnę bez wartości), która zapamiętuje ręczną kolejność kolumn. Tablice Wybór/Status zamiast tego zmieniają kolejność options właściwości. Pomiń klucz, gdy nieustawiony.

Widok tablicy korkowej (plainva.render: "pinboard")

Tablica korkowa jest przechowywana tak jak każdy nienatywny widok: type: table plus wskazówka render. Jej klucze znajdują się w tej samej przestrzeni nazw views[i].plainva:

views:
  - type: table
    name: Pinboard
    plainva:
      render: pinboard
      pinboardOrder:                  # ręczna kolejność nieprzypiętych kart
        - "Notes/Groceries.md"
      pinboardPinned:                 # przypięte; kolejność listy = kolejność sekcji
        - "Notes/Idea.md"
      pinboardFilterBy: note.labels   # źródło etykiet paska chipów; pomiń = tags

Zasady: przypięte ścieżki nie powtarzają się w pinboardOrder. Karty spoza obu list renderują się na górze, od najnowszych (czas utworzenia). Wpisy, których plik już nie istnieje lub opuścił zestaw źródłowy, są ignorowane i usuwane przy najbliższym zapisie. Gdy notatka zostanie przemianowana lub przeniesiona, Plainva automatycznie przekierowuje ścieżki na obu listach; narzędzia zewnętrzne muszą robić to samo. Obsidian ignoruje te klucze i pokazuje widok jako tabelę.

Nie dotykaj i bezpieczeństwo

Zobacz też