4.1 KiB
4.1 KiB
Converting Sources to OKF
Guides for transforming existing knowledge into conformant OKF bundles.
From Notion Export
Notion exports as markdown with properties in YAML-like format.
Steps
- Export from Notion as Markdown & CSV
- Clean filenames — remove UUID suffixes (
Page Name abc123def.md→page-name.md) - Map properties to frontmatter:
| Notion Property | OKF Field |
|---|---|
| Type (select) | type (required) |
| Name | title |
| Tags (multi-select) | tags |
| Last Edited | timestamp |
| URL | resource |
- Convert links — Notion uses
[Page Name](Page%20Name%20abc123def.md). Convert to clean relative paths:[Page Name](./page-name.md) - Remove Notion artifacts — empty toggle blocks, breadcrumb headers, cover image references
- Add missing
typefield — if Notion had no "Type" property, ask the user what type to assign
Edge cases
- Notion databases: each row becomes a concept. Database title becomes the directory name.
- Nested pages: respect the hierarchy. Child pages go in subdirectories.
- Inline databases: flatten into a list in the parent concept's body.
- Notion formulas/rollups: drop them — they don't translate to static markdown.
From Obsidian Vault
Obsidian vaults are already close to OKF. Main differences: wikilinks and potentially missing type field.
Steps
-
Convert wikilinks to standard links:
[[Note Name]]→[Note Name](./note-name.md)[[Note Name|Display Text]]→[Display Text](./note-name.md)[[Note Name#Heading]]→[Note Name](./note-name.md#heading)
-
Ensure
typefield exists in every frontmatter block. Common mappings:
| Obsidian pattern | Suggested OKF type |
|---|---|
| Daily notes | Log |
| MOC / index note | Convert to index.md (reserved file) |
| Permanent notes | Reference |
| Literature notes | Reference |
| Project notes | Playbook or domain-specific |
-
Convert tags:
- Inline
#tag→ move to frontmattertags: [tag] - Nested
#parent/child→ flatten totags: [parent, child]or keep asparent/child
- Inline
-
Handle embeds:
![[Note]]— convert to a regular link or inline the content![[image.png]]— keep as standard markdown image
-
Remove Obsidian-specific syntax:
%%comments%%→ remove> [!callout]→ convert to blockquote or heading- Dataview queries → remove (dynamic, not portable)
What to keep as-is
- Standard markdown formatting (headings, lists, tables, code blocks)
- Existing YAML frontmatter (just add
typeif missing) - Standard markdown links (already OKF-compatible)
- Mermaid diagrams (standard markdown fenced blocks)
From CSV / Spreadsheet
Each row becomes one concept document.
Steps
- Identify column mapping:
| Column role | Maps to |
|---|---|
| Primary identifier / name | Filename (slugified) |
| Category / kind | type field |
| Short description | description field |
| Tags / labels | tags field |
| URL / link | resource field |
| Last modified date | timestamp field |
| All other columns | Body content (as table or sections) |
- Generate one
.mdper row:
---
type: {category_column}
title: {name_column}
description: {description_column}
tags: [{tag1}, {tag2}]
timestamp: {date_column}T00:00:00Z
---
# {name_column}
| Field | Value |
|-------|-------|
| Column3 | {value} |
| Column4 | {value} |
- Generate index.md from the full list:
# {Sheet Name}
- [{row1_name}](./{row1_slug}.md) - {row1_description}
- [{row2_name}](./{row2_slug}.md) - {row2_description}
- Generate log.md with creation entry:
# Update Log
## {today_iso8601}
- **Creation**: Generated {N} concepts from spreadsheet import.
Edge cases
- Empty cells: omit the field entirely (don't write empty strings)
- Multi-value cells (comma-separated): parse into YAML list for
tags - Very long text cells: put in body as a section, not in frontmatter
- Duplicate names: append a disambiguator (e.g.,
widget-v1.md,widget-v2.md)