KillSwitch1016 downloadsSync tagged Tasks lines with your own PeckList server, both ways: titles, dates, priority, tags, repeats and done.
Sync task lines in your notes with your own PeckList server, both ways. Write a task in the Tasks plugin's format, tag it #pecklist, and it shows up in PeckList. Change it on your phone and the line in your note follows.
Works on Obsidian desktop and mobile (1.13 or later). Needs the community Tasks plugin and a PeckList server (0.10 or later).
The full guide, with every setting, is at pecklist.com/obsidian.

![]() |
![]() |
| Right-click the bird for the task menu | Suggestions for PeckList lists and tags |
![]() |
![]() |
| The review before the first sync | Settings |
This plugin talks to one server: the PeckList server whose address you enter in its settings, usually one you or your household run yourself. Nothing is sent anywhere else, and there is no telemetry.
obsidian:// link holding your vault's name and the note's path.https://tasks.example.com).tasks:read and tasks:write permissions.#pecklist goes to the default list;#pecklist/Work goes to the list "Work".- or _ stand for spaces, so #pecklist/Home-Projects goes to "Home Projects". A list that doesn't exist yet is made.Templates is left out by default. The plugin never writes into a left-out folder.%%[pecklist:: off]%% to it, and deleting the mark brings it back.Once a line is linked, the plugin adds a hidden id to it, such as %%[pecklist:: 01JC8R5K2Z4N6PX0M3WQ7HB9TA]%%. It's an Obsidian comment, so it doesn't show in reading view. It sits before the dates so the Tasks plugin still reads them. Leave it there: it's how a later edit updates the same task instead of making a new one.
| In the note (Tasks format) | In PeckList |
|---|---|
| The line's text | Title |
#pecklist, #pecklist/List |
The list |
Other tags (#yard, #home/garden) |
Tags (new ones are made) |
| ⏫ or 🔺 / 🔼 / 🔽 or ⏬ | High / medium / low priority |
| 📅 due date | Due date |
| ⏳ scheduled date | Date (start) |
| 🔁 every ... | Repeat |
[x] with ✅ date / [-] with ❌ date |
Done / won't do |
Not synced: 🛫 start and ➕ created stay in the note only. Tags in Tags not sent (by default the Tasks plugin's global filter, such as #task) stay in the note only.
Times: the Tasks plugin's dates have no time of day. A time set in PeckList stays on the server when the date moves in the note.
Repeats in these forms are translated both ways:
Other forms stay as written on each side. PeckList moves a repeating task to its next date. When you tick a repeating line, the Tasks plugin writes the next line itself, and the plugin completes the task once and gives the new line the server's dates.
#pec on a task line suggests your PeckList lists. On a line that syncs, typing another tag suggests tags from your vault and from PeckList together. Everywhere else Obsidian's own tag suggestions show as usual.#pecklist alone go.obsidian/<vault name> by default). It's never written into notes. Changing it, or emptying it for none, updates the tasks already in PeckList.npm install
npm run dev # rebuilds main.js on change
npm run build # type-check and production build
npm run lint
npm test # unit tests, with a fake server and vault
npm run test:contract runs the sync engine against a real PeckList server. Use a throwaway local container, never one with real data:
PECKLIST_URL=http://localhost:18181 PECKLIST_TOKEN=pl_... npm run test:contract
The screenshots in docs/screenshots/ are 2x captures of a demo vault synced to a throwaway local PeckList server.
To try it in Obsidian, copy main.js, manifest.json and styles.css into <vault>/.obsidian/plugins/pecklist/. Use a test vault.
The plugin uses only PeckList's public Task API (/api/v1/), which only ever gains fields, so an older plugin keeps working with a newer server.
src/core/: the Tasks line format, repeats and list tags. No Obsidian imports.src/api/: the Task API client.src/sync/: the sync engine.src/obsidian/ and src/ui/: everything that touches Obsidian.This project started from the Obsidian sample plugin (0-BSD) at commit 07ceb81, keeping its build setup.
The project lives on GitLab, where merge requests go. Issues are welcome on GitLab or GitHub. GitHub is a read-only mirror, where releases for Obsidian are built: push a tag matching manifest.json (plain x.y.z, after npm version) and the mirror's release workflow publishes main.js, manifest.json and styles.css.
AGPL-3.0-or-later, like PeckList.