Az-nan Triks90 downloadsTwo-way Trello sync (note, vault and folder scope), link auditing and card matching for worldbuilding vaults.
Two-way Trello sync, link auditing and card matching for Obsidian — built for a worldbuilding vault where every note mirrors a card on a single board.
It replaces a set of Templater user scripts driven by ribbon buttons: one plugin, one credential pair, native commands, and a test suite.
This plugin was built for one specific vault, but the entire plugin — code, comments, and everything you see inside Obsidian (commands, settings, the progress panel, Notices, and the Markdown audit reports it writes into your notes) — is in English. There is no language setting.
Acknowledgements — nathonius's Trello plugin is what first got my notes and Trello cards talking to each other, and using it is part of what pushed me to build this one. Thanks for the inspiration.
Every command below is available both from the right sidebar panel and the command palette.
| Command | What it does |
|---|---|
| Sync active note | Pull or push automatically, based on which side changed last |
| Pull from Trello (active note) | Force-pull the note from its card, ignoring timestamps |
| Push to Trello (active note) | Force-push the note to its card, ignoring timestamps |
| Force pull (active note) | Same as "Pull from Trello (active note)", under an explicit "force" label |
| Force push (active note) | Same as "Push to Trello (active note)", under an explicit "force" label |
| Link active note to a card | Fuzzy-matches the file name against the board and writes the id |
| Link active note to a card (pick manually) | Search-and-pick modal over the board's cards — use it when the title match above picks the wrong card, or isn't close enough to fire |
| Resolve conflict (active note), side by side | Side-by-side view when both sides changed at once |
| Undo last sync for the active note | Reverts this note's part of the last recorded sync run |
| Command | What it does |
|---|---|
| Sync a list with its folder | Mirrors one Trello list into one vault folder |
| Sync every list with its folder | Runs all configured list ↔ folder pairs |
| Force pull (mapped folder) | Pick a mapping, then overwrite every note in its folder from Trello, ignoring timestamps |
| Force push (mapped folder) | Pick a mapping, then overwrite every card from its folder's notes, ignoring timestamps |
| Command | What it does |
|---|---|
| Sync all linked notes | Walks the scope folder, fetching the board's cards in one request |
| Force pull (vault) | Overwrite every linked note in scope from Trello, ignoring timestamps |
| Force push (vault) | Overwrite every linked card from scope's notes, ignoring timestamps |
| Create note from a Trello card | Adopt a card with no note yet — the inverse of linking an existing note to a card |
| Audit links (orphan cards and notes) | Cards without notes, notes with broken ids, notes with no card |
| Compare locations against Trello lists | Table of where each linked note lives versus its Trello list |
| Audit changes (Trello change log) | Trello board activity since the last run, grouped by day then by card, into the report note |
| Export change log as HTML | Standalone page of the same change log, each author's avatar embedded — works offline |
| Show sync history | Lists recorded sync runs, newest first |
| Undo last sync run | Reverts the last recorded run's writes |
| Undo a sync run (pick what to undo) | Pick any recorded run, then check exactly which of its writes to undo |
Plus "Toggle dry-run mode", which flips the Dry run setting — a command in the palette, and a switch at the top of the sidebar panel.
A note points at its card through a single frontmatter key:
trello_board_card_id: "<boardId>;<cardId>"
A bare card id is accepted too. Unfilled {{CARD_ID}} template placeholders are
ignored rather than sent to the API.
You never need to type that value by hand: run "Link active note to a card (pick manually)" and search the board's cards by name, or "Link active note to a card" for automatic title-matching.
To find which note is linked to which Trello card, the plugin lists the vault's markdown notes and checks each one's card-link frontmatter key across every folder — used for vault sync, the link/location audits and moved-note detection; it reads nothing outside the vault and sends only card-related data to Trello.
Every sync run is recorded (when Sync history is on), so it can be undone: the last run, the last run for the active note, or any recorded run with individual writes picked one by one. Undo reverts vault writes and, if enabled, the matching Trello writes — it never overwrites something that changed on either side since the run. The Cancel button on the progress panel stops a sync between requests, but a request already sent to Trello can't be recalled mid-flight; undo can put it back afterwards.
Install from Obsidian's Settings → Community plugins → Browse, then search for "Trello Vault Sync".
You can also install manually: download main.js, manifest.json and
styles.css from a GitHub release,
and copy them into <vault>/.obsidian/plugins/trello-vault-sync/, then enable
the plugin in Obsidian's Community Plugins settings.
To build from source instead:
npm install
npm run check
For live development, npm run dev rebuilds main.js on save.
Everything lives in the plugin settings — never in a vault note. Section names below match the settings tab exactly.
data.json), board id with a name-search picker, and "Test
connection".A mapping's template may use {{TITLE}}, {{DESCRIPTION}}, {{URL}}, {{CARD_ID}}
and {{BOARD_ID}}. Unknown placeholders are left untouched. With no template, a new
note gets a minimal frontmatter and the card description.
{{TITLE}} and {{DESCRIPTION}} carry arbitrary Trello card text, so when either one
lands inside the frontmatter fence it is rendered as an auto-quoted, YAML-escaped
string — write title: {{TITLE}}, not title: "{{TITLE}}", or the value ends up
double-quoted. {{CARD_ID}}/{{BOARD_ID}}/{{URL}} are Trello's own fixed-format
ids and are never escaped, so the default "{{BOARD_ID}};{{CARD_ID}}" pattern still
works as written.
src/
core/ pure logic, no Obsidian and no network — where the tests live
trello/ REST client with an injected transport, retry/backoff, secret redaction
obsidian/ VaultGateway interface + the real Obsidian implementation
features/ sync, audit and rollback engines, written against the interfaces
ui/ sidebar view, progress panel, pickers and confirmation modals
settings/ settings shape and settings tab
core/ never imports Obsidian, so the sync decisions, the folder planner and the
report builders run in plain Node under Vitest. features/ depends on the
VaultGateway and TrelloClient interfaces, so the engines are exercised end to end
against an in-memory vault and a stubbed transport.
npm run check # typecheck + hardcode check + tests + production build
npm test # tests only
npm run build # typecheck + production build
npm run dev # watch build
npm run check:hardcode # scans for hardcoded values that belong in settings
indexOf("---", 3) — a ---
inside a YAML value no longer corrupts the note, and BOM/CRLF files are safe. (2) suffix instead of failing.