saiken170 downloadsExport Obsidian tasks with due dates to calendar-friendly ICS files. Pro unlocks full-vault auto export, reminders, durations, and advanced filters.
Turn dated Markdown tasks into a calendar you can actually use outside Obsidian.

Hero image uses a live Obsidian note capture plus the plugin's real exported
.icsoutput from the same demo state.
Works offline · One-time payment · Unlimited future updates · No account
Task Calendar Bridge turns the dated tasks you already track in Markdown into a standards-based .ics calendar for Google Calendar, Apple Calendar, Outlook, TickTick, and anything else that speaks ICS. Write the task once in Obsidian, export it, and see it where you actually plan time.
Best fit if you:
| Free | Pro ($9 one-time) | |
|---|---|---|
| Current note export | Unlimited | Unlimited |
| Whole-vault export | Next 25 upcoming tasks | Full vault, no cap |
| Timed events, durations, multi-day events | Yes | Yes |
| Obsidian Tasks + Dataview syntax | Yes | Yes |
| Stable event identity | Yes | Yes |
| Repeating events | No | Yes |
| Reminder alarms | No | Yes |
| Auto-export when notes change | No | Yes |
| Publish outside the vault for calendar subscription workflows | No | Yes |
| Completed/cancelled task export | No | Yes |
| Folder filters | No | Yes |
Free proves the bridge works. Pro makes it stop behaving like a manual export toy.
The paid value is not "more settings." It is the difference between:
If you live out of your calendar, the practical Pro win is:
That is the upgrade story: not "more features," but "this now runs like a real bridge instead of a demo."
The strongest Pro workflow is:
.icsIf you only need occasional one-off exports, Free is enough. If you want your Markdown task system and your calendar to stay in sync like adults, Pro is the point.

Motion proof from the same demo note before and after an edit: the customer onboarding call moves from
14:00with a10mreminder to15:30with a30mreminder, while recurring-event and completed-task proof stays visible on the same export surface.

Static proof from the live Pro demo state: note capture from the Personal vault on the left, and real
current-note.icsoutput from the installed Pro-enabled plugin state on the right. This still shows reminder preservation and completed-task export without faking a SaaS sync layer.
Obsidian users often plan work in Markdown but still need calendar visibility in Google Calendar, Apple Calendar, Outlook, TickTick, or mobile widgets. The usual alternatives are ugly: copy tasks by hand, maintain a brittle script, or accept some app-specific workflow that breaks the moment you switch tools.
Task Calendar Bridge keeps the workflow simple:
.ics calendar fileNo hosted sync layer. No account. No "please trust our server with your planning system."
Create sample task note from the command palette..ics file into your calendar.If that clicks, Pro unlocks the live version of the workflow: full-vault export, auto-export, recurring events, reminders, publish-outside-the-vault, and folder filtering.
Both the Obsidian Tasks emoji vocabulary and Dataview-style inline fields work, and you can mix them:
- [ ] Simple all-day task 📅 2026-08-01 #work
- [ ] Explicit due date [due:: 2026-08-02]
- [ ] Scheduled beats due for placement ⏳ 2026-08-04 📅 2026-08-06
- [ ] Timed call [due:: 2026-08-02] [start:: 14:15] [duration:: 1h]
- [ ] Multi-day workshop [due:: 2026-08-03] [end:: 2026-08-05]
- [ ] High-priority review ⏫ [due:: 2026-08-07]
- [ ] Weekly one-to-one [due:: 2026-08-03] 🔁 every week on Monday (Pro)
- [ ] Reminder alarm [due:: 2026-08-02] [start:: 09:00] [reminder:: 10m] (Pro)
📅 📆 🗓 due, ⏳ scheduled, 🛫 start, or [due:: …], [scheduled:: …]. A scheduled date places the event on the calendar; the due date travels with it as the deadline. Dataview date links ([due:: [[Daily/2026-08-02]]]) work too.[start:: 14:15], 9:30, or 7:00 pm. [duration:: 1h30m], 45, or 1.5h.[ ] open, [/] in progress, [x] done, [-] cancelled. Done and cancelled tasks are excluded unless you turn them on (Pro).every other week, every Monday and Friday, every month on the first Monday, every weekday, and more. A rule that cannot be translated exactly is reported rather than guessed at.#work, #café, #仕事.🔺 ⏫ 🔼 🔽 ⏬ or [priority:: high] — becomes calendar priority.Wondering why a task is missing? Run Show last export report. It lists every skipped task and the reason.
VTIMEZONE, so times stay right across DST and while you travelobsidian:// links back to the source note, which you can turn off before publishing🔁 every 2 weeks on Monday becomes a real recurring event[reminder:: 10m]This matters more than any other setting.
Importing an .ics file copies the events in once and never looks at the file again — you have to re-import after every change. Subscribing points your calendar at a URL and refreshes on its own.
To subscribe, the file has to be reachable over HTTP(S) and it has to come back as the file itself, not as a web page. This is where most setups fail: an ordinary cloud "share" link opens a preview page, and a calendar app fed that link reports that it cannot read the calendar.
The Pro Publish outside the vault setting writes a copy into any folder you choose. To turn that copy into a link you can subscribe to:
?dl=0 at the end of the link to ?raw=1.?download=1 to the end of the link.Turn on auto-export and the published copy keeps itself current.
The exported file carries each task's title, its tags, and — unless you turn off Link events back to their note — the note path, line number, and your vault's name. Publish it to an unguessable or access-controlled link rather than a listed one.
| Calendar | Import once | Subscribe |
|---|---|---|
| Google Calendar | Settings → Import & export → Import | Other calendars → + → From URL |
| Apple Calendar | File → Import | File → New Calendar Subscription |
| Outlook (new / web) | Add calendar → Upload from file | Add calendar → Subscribe from web |
| Outlook (classic Windows) | File → Open & Export → Import/Export | Add calendar → Subscribe from web |
| TickTick | Calendar import | Calendar subscription settings |
Refresh intervals are set by the calendar provider, not by this plugin. Google refreshes on its own schedule — often only every several hours, sometimes longer — and Apple Calendar lets you choose. Neither refreshes on demand, so a subscribed calendar always lags the file a little.
Community plugins (recommended): open Settings → Community plugins, search Task Calendar Bridge, and install it — one click, auto-updates.
.obsidian/plugins/task-calendar-bridge/ inside your vault:main.jsmanifest.jsonstyles.cssCreate sample task note from the command palette to test it.For almost everyone: nothing to do. Event identity is unchanged, so a calendar you have already imported or subscribed to keeps updating in place.
Two exceptions:
#cafe with the accent, #仕事,
#работа — those tags used to be half-read, and the leftover characters were
part of the event title. Fixing that changes the title, and the title is part
of how an event is identified, so those specific events arrive as new ones.
A calendar you subscribe to sorts itself out on the next refresh. If you
imported the file by hand, delete the old copies of those events once.TZID and the
file carries a real VTIMEZONE, instead of being converted to UTC. That is
what makes a repeating 09:00 meeting stay at 09:00 after a DST change rather
than sliding to 08:00. Your calendar app re-renders those events at the
correct local time on its next refresh; the events themselves are the same
events.1.1.0 changes how events are identified so that editing a note stops creating duplicate calendar entries. Because the identity scheme itself changed, the first export after upgrading looks like a new set of events to a calendar you previously imported into. The cleanest path is to delete the calendar you had imported and import (or subscribe to) the new file once. After that, edits update events in place.
Your configured output path is kept as the whole-vault calendar; current-note exports move to their own file so the two can no longer overwrite each other.
npm install
npm test
npm run build
The private signing key lives at scripts/.license-private.key and is ignored by git. Keep it backed up and private.
npm run license:generate -- [email protected]
The generated key can be pasted into Settings → Task Calendar Bridge → License key.