x-o-r-r-o97 downloadsSync Obsidian checklists with Kan.bn kanban boards. View boards, push note checklists as cards, pull board status back into notes.
Sync your Obsidian checklists with Kan.bn kanban boards — view boards in a sidebar, push note checklists as cards, and pull execution status back into your notes.
Kan.bn is the open-source alternative to Trello. This plugin turns any Obsidian note with checkboxes into a live kanban board and keeps the two in sync — without ever duplicating your board data locally.
#tags, and @mentions from Kan.%%kan:ID%% comments so rewording updates the same card.📅 2026-08-14 or @due(2026-08-14); clearing the date on a note clears the card due date on push.#tags → labels — auto-created with deterministic colours; retro-label existing cards; optional remove when deletes are enabled.@mentions → assignees — matched by workspace member name or email prefix; set on card create.kan_board or a heading can rename the Kan board / list on push.Your boards live on Kan's servers — the plugin is a live API bridge, not a local database.
┌─────────────────────┐ REST API ┌──────────────┐
│ Obsidian (vault) │ ◄───────────────────────► │ Kan.bn │
│ │ │ │
│ Notes = the PLAN │ Push: checklist → cards │ Boards = the │
│ (what needs doing) │ Pull: status + meta → ☑ │ EXECUTION │
│ │ View: live board render │ (progress) │
└─────────────────────┘ └──────────────┘
| Data | Source of truth | Flow |
|---|---|---|
| Plans, checklists, task wording, descriptions | Obsidian notes | Vault → Kan (push) |
| Execution state (in progress / done) | Kan board | Kan → vault (pull) |
| Due dates, labels, members (when pull options on) | Kan board (enriched into note) | Kan → vault (pull) |
Nothing runs in the background except optional auto-pull. Push and pull only run when you invoke a command (or auto-sync tick).
Also listed at community.obsidian.md.
manifest.json, main.js, styles.css)<your-vault>/.obsidian/plugins/kan-sync/
├── manifest.json
├── main.js
└── styles.css
Ctrl/Cmd + R) and enable Kan Sync under Community pluginshttps://github.com/x-o-r-r-o/Kan-Sync as a beta pluginOpen Settings → Kan Sync.
| Setting | Description | Default |
|---|---|---|
| API key | Create at kan.bn/settings → API keys | — |
| Base URL | Change for self-hosted Kan | https://kan.bn/api/v1 |
| Workspace | Workspace public ID — use Detect to auto-fill | — |
| Workspace slug | Optional; used with kan_board_slug for slug-based board lookup (Detect fills this when available) |
— |
| Setting | Description | Default |
|---|---|---|
| Rename-safe ID markers | Append %%kan:ID%% after sync |
On |
| Sync #tags as labels | Tags → Kan labels | On |
| Retro-label existing cards | Add labels when tags appear on synced items | On |
| Sync @mentions as card members | @name → assignees |
On |
| Sync card descriptions | Indented text under an item → card description | On |
| Rename board to match note | Rename Kan board when note / kan_board changes; writes kan_board_id |
On |
| Rename lists to match headings | Rename Kan list when a heading changes | On |
| Reorder lists to match heading order | On push, reorder Kan lists to match heading order in the note | On |
| New card position | Where new cards are inserted in a list (start or end) |
end |
| Allow deletes on push | Remove Kan cards/labels/members/subtasks that disappear from the note | Off |
| Sync sub-items as card checklists | Indented checkboxes → checklist | On |
| Subtask checklist name | Default checklist name on the card (named checklists use indented ###) |
Subtasks |
| Move done cards | Checked note items move cards to first Done list | On |
| Default list name | List for items before any heading | Backlog |
| Setting | Description | Default |
|---|---|---|
| Pull due dates | Write 📅 YYYY-MM-DD from the card |
On |
| Pull labels as #tags | Write card labels as #tags |
On |
| Pull members as @mentions | Write members as @handles |
On |
| Pull card descriptions | Rewrite indented description text under linked items from Kan (keeps subtasks / ### headings) |
Off |
| Done lists | List names treated as completed | Done, Completed, Launched |
| Status section heading | Heading for the status table | ## Kan Board Status |
| Include card titles in status | Off = counts only | On |
| Auto-sync interval (minutes) | 0 = off; auto-pull when note has kan_board frontmatter |
0 |
Board view header (not in Settings) also remembers board type (regular / template), archived visibility, and due-date filter.
Settings → Kan Sync also has an admin section (account, workspace CRUD, invites, roles/permissions, webhooks, integrations/imports, labels). Open it via Kan Sync: Open Kan Sync settings (admin).
All via Command Palette (Ctrl/Cmd + P):
| Command | What it does |
|---|---|
Kan Sync: Open board view |
Sidebar kanban (also ribbon dashboard icon) |
Kan Sync: Push active note's checklist to Kan |
Create/update board, lists, cards from the note |
Kan Sync: Pull Kan board status into active note |
Status table + checkoffs + optional due/tags/mentions |
Kan Sync: Full sync active note (push + pull) |
Push then pull |
Kan Sync: Search boards and cards |
Fuzzy search (also 🔍 in board view) |
Kan Sync: Comment on linked card (cursor line) |
Comment on the card for the current line |
Kan Sync: Attach a file to linked card (cursor line) |
Upload a file (≤50 MB) |
Kan Sync: Attach active note to linked card (cursor line) |
Attach current note as .md |
Kan Sync: Duplicate linked card (cursor line) |
Duplicate the card in its list |
Kan Sync: Delete linked card (cursor line) |
Delete card in Kan (requires Allow deletes on push) |
Kan Sync: Test connection |
Calls /health and /users/me |
Kan Sync: Open Kan Sync settings (admin) |
Jump to Settings → Kan Sync |
Kan Sync: Show Kan instance stats |
Fetch /stats (console + notice) |
Kan Sync: Lookup invite code |
Resolve an invite code via the API |
Kan Sync: Invite member to workspace |
Invite by email |
Kan Sync: Copy workspace invite link |
Copy invite URL/code to the clipboard |
Kan Sync: Import boards from Trello |
Start Trello import flow |
Kan Sync: Import projects from GitHub |
Start GitHub import flow |
Kan Sync: Archive / unarchive board for active note |
Toggle archive on the linked board |
Kan Sync: Favorite / unfavorite board for active note |
Toggle favorite on the linked board |
Kan Sync: Create board from template (active note) |
Uses kan_template_id frontmatter |
Kan Sync: Save linked board as template |
Create a template board from the linked board |
Use normal Markdown checklists. Headings (##–####) become Kan lists.
---
kan_board: Product Launch
---
## Phase 1 — Foundation
- [ ] Lock the launch date 📅 2026-07-20 #P0 @alex
Confirm with leadership and freeze the calendar.
- [ ] Draft announcement
- [ ] Book venue
- [ ] Finalize positioning & core message #P1
- [x] Already done item
## Phase 2 — Assets
- [ ] Ad creatives batch 1 @due(2026-07-27) #marketing
Frontmatter
| Key | Purpose |
|---|---|
kan_board |
Board name (defaults to the note file name) |
kan_board_id |
Written automatically on first push — keeps the link if you rename the board/note |
kan_board_slug |
Written on push/pull when the board has a slug; used with workspace slug for lookup |
kan_workspace_slug |
Optional; also filled from Settings → Workspace slug |
kan_template_id |
Create/link from a template board |
kan_labels |
Seed label names when creating a new board |
Line syntax
| Syntax | Effect on push |
|---|---|
- [ ] / - [x] |
Card (unchecked create/update; checked can move to Done) |
## Heading |
List name |
📅 YYYY-MM-DD or @due(YYYY-MM-DD) |
Card due date; remove it to clear the due date on push |
#tag |
Kan label |
@name |
Card member (workspace name / email prefix) |
| Indented text (not a checkbox) | Card description body |
Indented ### ChecklistName |
Named checklist on the card (items below use that name) |
Indented - [ ] |
Checklist item on the card (default name: Subtasks) |
%%kan:ID%% |
Link to an existing card (added automatically) |
%%kan:ID%% markers.Move cards, add labels/members/due dates in Kan (web or self-hosted). Collaborators can edit the board while your note remains the plan source.
📅, #tags, and @mentions from the card.## Kan Board Status table is written/updated at the bottom (or your custom heading).Kan Sync: Full sync active note (push + pull) — push plan changes, then pull execution state.
- [ ] Ship docs #P1
Audience: new self-hosters.
Include Docker Compose and MinIO notes.
### Writing
- [ ] Outline
- [ ] Screenshots
### Review
- [ ] Peer review
On push, the card description becomes:
From Obsidian: path/to/note.md
Audience: new self-hosters.
Include Docker Compose and MinIO notes.
Indented ### headings under a card create named Kan checklists; sub-item renames and order are pushed when titles change or items move.
kan_board (or rename the note if you rely on the basename) → next push renames the Kan board when Rename board to match note is on.## heading whose cards already have markers → next push renames that Kan list when Rename lists to match headings is on.Enable Allow deletes on push, then on the next push:
@mentions removed → members removedFrom Obsidian: <this note path> are deletedYou can also run Delete linked card (cursor line) with the cursor on a marked item.
Set Auto-sync interval to e.g. 15. Only notes with kan_board in frontmatter auto-pull while active. Pushes stay manual so half-written plans are not pushed.
Set Base URL to your instance’s API root (usually ending in /api/v1). Everything else is the same.
kan_board / kan_board_id.#tag to an already-synced item labels the card on next push when Retro-label is on.dueDate on the card on push.#tags/@mentions on linked lines from Kan (title text is preserved; meta is rebuilt).This section covers items the community scorecard surfaces, per Obsidian developer policies. Also see SECURITY.md.
A Kan.bn account (or an account on your self-hosted Kan instance) and an API key are required for the plugin to function. There is no separate Kan Sync account.
No payment is required for this plugin. Kan.bn or your self-hosted host may have their own plans; this plugin has no in-app purchases.
All remote HTTP uses Obsidian’s requestUrl() API (three call sites in main.js):
GET/POST/PUT/PATCH/DELETE to your configured Base URL (default https://kan.bn/api/v1) with your API key in the Authorization header. Used for boards, lists, cards, labels, members, search, comments, checklists, webhooks admin, imports, etc. Base URL must be https:// (or http://localhost for local self-host). Path IDs are URL-encoded; credentials in the Base URL are rejected.PUT of file bytes to a short-lived https URL returned by Kan (typically S3-compatible object storage). The upload request does not include your API key. Non-https schemes are rejected.GET of an attachment https URL when saving into the vault. Filenames are sanitized (no path traversal); downloads are capped at 50 MB.No other remote hosts are contacted by default. Changing Base URL (self-hosted) redirects all Kan API traffic to that host. Optional Open authorization URL for Trello/GitHub import opens a browser tab only for validated https:// URLs returned by Kan.
Optional auto-sync pull (off by default) schedules a silent pull for the active note when kan_board frontmatter is set. It uses a one-shot timer only while the interval setting is > 0 — not a permanent background poller.
The plugin writes invite links / codes to the system clipboard when you use Copy workspace invite link (and the matching Settings button). The clipboard is never read.
Reads and writes Markdown notes via the Obsidian vault API (vault.read / vault.modify, frontmatter helpers). Does not access files outside the vault.
No analytics, crash reporters, or third-party telemetry. Traffic is only to your Kan API base and Kan-issued upload/download URLs.
Settings can create/update/test/delete Kan webhook endpoints. Obsidian cannot receive inbound HTTP; live event→vault sync needs an external relay.
| Data | Where it lives |
|---|---|
| Boards, lists, cards | Kan's servers (or your self-hosted instance) |
| API key, workspace ID, settings | <vault>/.obsidian/plugins/kan-sync/data.json |
| Status snapshots / enriched lines | In notes when you pull |
| Attachment file bytes | Kan-issued presigned storage URLs |
If you sync your vault (Obsidian Sync, iCloud, git),
data.json— including your API key — syncs with it. Add it to.gitignorefor public repos.
Core sync and board-view paths (not every admin/import route). The plugin client wraps the full Kan REST surface used by Settings admin, card modal CRUD, webhooks, and imports — see docs.kan.bn/api-reference.
| Endpoint | Method | Purpose |
|---|---|---|
/health, /stats, /users/me |
GET | Connection test / stats |
/workspaces |
GET | Detect workspace |
/workspaces/{id} |
GET / PUT / DELETE | Workspace admin |
/workspaces/{id}/boards |
GET / POST | List / create boards |
/workspaces/{slug}/boards/{boardSlug} |
GET | Resolve board by slug |
/boards/{id} |
GET / PUT / DELETE | Fetch / update / delete board |
/lists |
POST | Create lists |
/lists/{id} |
PUT / DELETE | Rename / reorder / delete lists |
/cards |
POST | Create cards (labels + members) |
/cards/{id} |
GET / PUT / DELETE | Detail, update, delete |
/cards/{id}/duplicate |
POST | Duplicate card |
/cards/{id}/labels/{labelId} |
PUT | Toggle label |
/cards/{id}/members/{memberId} |
PUT | Toggle member |
/cards/{id}/comments |
GET / POST | Comments |
/cards/{id}/checklists |
POST | Create checklist |
/checklists/{id}/items |
POST | Add checklist item |
/checklists/items/{id} |
PATCH / DELETE | Update / delete checklist item |
/workspaces/{id}/search |
GET | Search |
/labels |
POST | Create labels |
/labels/{id} |
GET / PUT / DELETE | Label detail / update / delete |
/cards/{id}/attachments/upload-url |
POST | Presigned upload URL |
/cards/{id}/attachments/confirm |
POST | Confirm attachment |
/cards/{id}/activities |
GET | Activity feed |
/workspaces/{id}/webhooks |
GET / POST | Webhook manage |
/workspaces/{id}/members/…, /invites/… |
various | Invites and members |
/integrations/…, import routes |
various | Trello / GitHub import |
| Symptom | Fix |
|---|---|
| "No API key set" | Settings → Kan Sync → paste key from kan.bn/settings |
| Detect shows "No workspaces found" | Invalid key or empty account — test with curl -H "Authorization: Bearer kan_..." https://kan.bn/api/v1/workspaces |
Kan API 401/403 |
Key missing/revoked — create a new one |
| Board view empty | Set workspace ID; hit ↻ |
| Pushed items missing | Only - [ ] creates cards; checked items are skipped unless already linked |
| Duplicate cards after rewording | Turn on ID markers and push once to adopt |
| Pull didn't add tags/due | Enable Pull due dates / tags / mentions; line needs a %%kan:ID%% marker |
| Delete command refused | Enable Allow deletes on push |
| Slug lookup failed | Set Workspace slug (or kan_workspace_slug) and ensure the board has a slug |
| Plugin not listed after manual install | Reload; ensure files sit directly in .obsidian/plugins/kan-sync/ |
Errors also go to the developer console (Ctrl/Cmd + Shift + I).
@mention matching needs workspace name or email prefix; unmatched mentions are logged, never guessed.#tags, auto-sync — v0.2.0New ideas welcome via GitHub issues.
javascript:/data:/credentials); encode path IDs; sanitize attachment filenames (path traversal); validate CSS colours; escape Markdown table cells; redact Bearer tokens in error text; safe window.open for OAuth; webhook/image URL checksindex to match checklist order within its list### checklistsshowEmailsToMembers, webhook update secret, user image URLCONTRIBUTING.md and SECURITY.mdrequestUrl call sites, clipboard write (invite links), optional auto-sync, no payment/telemetrysetInterval with a one-shot timer only while the interval setting is enabled (avoids setInterval+network heuristic)kan_board_slug + kan_workspace_slug (and Settings workspace slug) on push/pull### Name under a card item maps to a Kan checklist of that name#tags update Kan label casing and deterministic colour on pushkan_template_id / kan_labels frontmatter#tags, and @mentions from Kan onto note lines📅 / @due() from a note clears the card due date on pushkan_board_id frontmatter@mention member sync; card detail modal; multi-workspace switcherversions.json#tags, full sync, auto-sync, base URLPlain JavaScript, no build step — main.js is the plugin.
main.jsnode --check main.js for a quick syntax gatePRs and issues welcome.
MIT © x-o-r-r-o
Kan.bn itself is AGPL-3.0 — this plugin is an independent API client and is not affiliated with the Kan team.