A board leaves as one file and comes back as one — headings are lanes, rows are cards, position is the order

File ▸ Export ▸ writes the frontmost board as Obsidian Kanban Markdown, a
plain Markdown outline, or RFC 4180 CSV; File ▸ Import Board… reads any of
the three back into a fresh board, format detected rather than asked. Every
format encodes order as document position, so an export writes no ranks and
an import mints them in parse order on the ordinary create path. Lossy
exports post a warning-tone loss row naming the comments and attachments the
destination cannot carry. Convert-once: nothing watches, nothing merges.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-09 08:38:06 -04:00
parent 242d013d8c
commit b0c134a896
15 changed files with 2851 additions and 1 deletions
+11
View File
@@ -206,6 +206,12 @@ struct KanbanApp: App {
}
.keyboardShortcut("o", modifiers: .command)
// **Beside Open, not beside Export** (15-import-export.md): the two rows next to each
// other are the two ways a board arrives from disk, and like Open this one needs no board
// in front it makes one. Export lives further down with the board-scoped commands that
// act on the board already there. No default chord, like Welcome's row.
ImportBoardCommand(appModel: appModel)
OpenRecentMenu(appModel: appModel)
Divider()
@@ -217,6 +223,11 @@ struct KanbanApp: App {
DuplicateBoardCommand(appModel: appModel)
SaveAsTemplateCommand(appModel: appModel)
ShareBoardCommand(appModel: appModel)
// **Export joined 2026-08-09** (15-import-export.md) as the fourth row in a row that
// takes the whole board somewhere else a sibling folder, the templates store, a share
// sheet, and now one foreign document. Three named rows rather than one row with a format
// popup; see `ExportBoardMenu` for why, and for why the titles matter.
ExportBoardMenu(appModel: appModel)
RevealInFinderCommand()
AddAttachmentCommand()
// The attachment row's hero pair, as the menu-bar twins 11-command-nexus.md's