Sugar19k downloadsA powerful visual task management plugin. Visualize and manage tasks created by the Tasks plugin, supporting both emoji and Dataview task formats. Support Feishu Task syncing.
A powerful visual task management plugin for Obsidian.
Multi-View Calendar — Task / Year / Month / Week / Day / Gantt — six views with seamless switching
Festival Display — Solar festivals, lunar festivals, and 24 solar terms
Data Visualization — Task heatmap, daily task counts, 8 gradient palettes
Smart Task Management — Global filter, priority tags, 6 date fields, time precision (HH:mm), smart write-back with line drift protection
Timeline Canvas — Continuous minute-positioned timeline in Week/Day/Sidebar views: click-to-create, edge resize (15-min snap), WYSIWYG drag with landing preview
Mobile Ready — Long-press menus as bottom sheets, touch drag, swipe paging, floating navigation dock, responsive layouts
Instant Startup — Skeleton screen renders immediately; the full-vault first scan runs asynchronously, so opening the layout is never blocked
Daily Note Integration — Embedded editor with edit/preview mode toggle
Sidebar View — Task search, filter & sort + daily timeline
Highly Customizable — Festival colors, heatmap palettes, task display count, and more
Dual Format — Full support for Tasks plugin (emoji) and Dataview plugin (inline field) formats
Recurring Tasks — daily/weekly/monthly/yearly repeat with virtual instances shown across all views (Year/Month/Week/Day/Task/Gantt)
Feishu Sync — Bidirectional task sync with Feishu (Lark) via OAuth 2.0
Year View

Gantt View

Week Timeline View

Sidebar View (Task List + Daily Timeline)

Day View with Embedded Editor

| Item | Requirement |
|---|---|
| Obsidian | 1.13.0 or later |
| Platform | Desktop and mobile (isDesktopOnly: false) |
| Optional | Tasks and/or Dataview — the plugin parses both formats natively; installing them is not required |
| Optional | Obsidian core Daily Notes or the Periodic Notes community plugin, for the Day View embedded editor |
| Optional | A Feishu (Lark) account and a self-built Feishu app, for task sync |
The plugin only reads and writes standard Markdown task lines. Your notes stay plain text — uninstalling it leaves your vault fully intact.
Also available from the plugin directory: https://community.obsidian.md/plugins/gantt-calendar
BRAT: Add a beta plugin for testinghttps://github.com/sustcsugar/obsidian-gantt-calendarmain.js, manifest.json and styles.css from the latest Release<your-vault>/.obsidian/plugins/gantt-calendar/gantt-calendarAll three files are required. Copying only
main.jsleaves the plugin unstyled and it will not load.
Re-run the same channel you installed with. For a manual install, overwrite the three files and disable/re-enable the plugin. Settings in data.json are preserved.
Three equivalent entry points:
Gantt Calendar: Open Calendar View (defaults to Month), Open Task View, or Open SidebarUse the view switcher on the left of the toolbar to move between the six views.
| Command | What it does |
|---|---|
Gantt Calendar: Open Calendar View |
Opens the main view, switched to Month |
Gantt Calendar: Open Task View |
Opens the main view, switched to Task |
Gantt Calendar: Open Sidebar |
Opens the right-sidebar view |
Gantt Calendar: Feishu Task Bidirectional Sync |
Runs one Feishu sync immediately |
All commands are available in the command palette and can be bound to hotkeys.
Click Add Task (the + button, top-right of the toolbar) to open the create modal, or just type a task line into any Markdown file:
- [ ] 🎯 Complete project documentation 📅 2025-12-20
The task appears in every view immediately — no reload needed.
Tasks with a start and a due date become real Gantt bars and timeline blocks:
- [ ] 🎯 Complete project documentation 🛫 2025-12-10 📅 2025-12-20
Add a time to the minute and the task lands on the timeline canvas:
- [ ] 🎯 Daily standup 📅 2025-12-20 09:30
| Action | Where | Result |
|---|---|---|
| Drag a task card | Month / Week | Reschedules the task in the source file |
| Click empty canvas | Week / Day / Sidebar | Creates a task at that time (15-min snap) |
| Drag a block's top/bottom edge | Week / Day / Sidebar | Adjusts start/end; hold Alt for 5-min precision |
| Drag a Gantt bar / endpoint | Gantt | Shifts dates, or changes the progress percentage |
| Right-click any task | Everywhere | Edit / set priority / postpone / cancel / delete |
| Click a task | Configurable | Jumps to the source file, or opens the edit panel |
Enable Obsidian's core Daily Notes (or Periodic Notes) plugin, then open Settings → Gantt Calendar → Daily Notes and turn on Use Obsidian daily note settings. The Day View now loads that date's note in an embedded editor next to the task timeline.
Alternatively, switch off that toggle and set the folder / filename format / template path manually.
- [ ] 🎯 Complete project documentation ⏫ ➕ 2025-01-10 🛫 2025-01-12 ⏳ 2025-01-14 📅 2025-01-15 #work
| Emoji | Meaning | Emoji | Meaning |
|---|---|---|---|
🎯 |
Global filter marker | 🔺 |
Highest priority |
⏫ |
High priority | 🔼 |
Medium priority |
🔽 |
Low priority | ⏬ |
Lowest priority |
➕ |
Created date | 🛫 |
Start date |
⏳ |
Scheduled date | 📅 |
Due date |
✅ |
Completion date | ❌ |
Cancelled date |
🔁 |
Recurring task | #tag |
Tag |
- [ ] 🎯 Complete project documentation [priority:: high] [created:: 2025-01-10] [start:: 2025-01-12] [scheduled:: 2025-01-14] [due:: 2025-01-15] #work
| Field | Meaning | Field | Meaning |
|---|---|---|---|
priority:: |
Priority | created:: |
Created date |
start:: |
Start date | scheduled:: |
Scheduled date |
due:: |
Due date | completion:: |
Completion date |
cancelled:: |
Cancelled date | repeat:: |
Recurrence rule |
Which formats are parsed is configurable — Tasks only, Dataview only, or Both (default).
YYYY-MM-DD (e.g. 2026-04-27)YYYY-MM-DD HH:mm (e.g. 2026-04-27 14:00)Timed tasks render as positioned blocks on the Week / Day / Sidebar timeline canvases. Date-only tasks and spans of 24 h or more land in the all-day row.
The checkbox character drives the status. Built-in statuses:
| Symbol | Status | Symbol | Status |
|---|---|---|---|
|
Todo | x / X |
Done |
! |
Important | - |
Cancelled |
/ |
In progress | ? |
Question |
> |
Started | — | — |
Custom statuses can be added in Settings → Gantt Calendar → Tasks → Task status, each with its own symbol, colours, and description.
- [ ] 🎯 Weekly review 🔁 every week on Monday 📅 2026-01-05
- [ ] 🎯 Pay rent 🔁 every month on 1 📅 2026-01-01
- [ ] 🎯 Water the plants 🔁 every 3 days 📅 2026-01-05
- [ ] 🎯 Change filter 🔁 every 6 months when done 📅 2026-01-05
| Rule fragment | Meaning |
|---|---|
every day |
Daily |
every 3 days |
Every N days |
every week on Monday |
Weekly on a given weekday |
every month on 15 |
Monthly on the 15th |
every year on 01-01 |
Yearly on Jan 1 |
every weekday |
Every Mon–Fri |
when done |
Next date is computed from the completion date instead of the scheduled date |
The plugin renders virtual instances of recurring tasks across Year / Month / Week / Day / Task / Gantt views. How many future instances are shown is set by Settings → Gantt Calendar → Tasks → Recurring instance count (0 disables them).
Editing a recurring task edits the source line. Virtual instances are read-only projections — real instances are materialised by the Tasks plugin when you complete an occurrence.
# Project Phoenix
- [ ] 🎯 Kick-off meeting 🛫 2026-04-20 10:00 📅 2026-04-20 11:30 ##meeting
- [ ] 🎯 Write technical design ⏫ 🛫 2026-04-21 📅 2026-04-28 #design
- [ ] 🎯 Review with stakeholders 🔼 🛫 2026-04-29 📅 2026-04-30 #review
- [ ] 🎯 Ship v1.0 🔺 🛫 2026-05-01 📅 2026-05-15 #release
- [ ] 🎯 Weekly sync 🔁 every week on Friday 📅 2026-04-24 15:00 #meeting
The plugin uses a toolbar + content area layout:
On mobile the toolbar is replaced by a floating Navigation Dock — one-thumb access to view switching and key actions. On desktop narrow windows (≤520px) the Day View switches to the same vertical split as mobile.
[t, t+60), due-field → backward [t-60, t))"22:00 → 18:00")+N collapse beyond 3Two-tab sidebar for quick task access:
Task List Tab
Daily Timeline Tab
Right-click any task for:
⚠️ Back up your vault before enabling sync. The sync engine is under active development and pushes/pulls write directly into your Markdown files.
offline_access, calendar:calendar:readonly, task:task:read, task:task:write, task:tasklist:read, task:tasklist:writehttps://open.feishu.cn/api-explorer/loadingcode parameter from the callback URL back into the plugin.bidirectional / import-only / export-only), Conflict resolution, and optionally an Auto sync interval (minutes; 0 disables it).Gantt Calendar: Feishu Task Bidirectional Sync, or press Sync now in settings.Use Test sync to push/pull only the 5 tasks with the nearest due dates — a safe way to verify the connection before a full run.
Settings live under Settings → Gantt Calendar, organised into five tabs.
| Setting | Description |
|---|---|
| Language | Follow system / English / 中文 |
| Default view | View shown when the plugin opens (Day/Week/Month/Year/Task/Gantt) |
| Task card click | Jump to the Markdown source file, or open the edit panel |
| Show nav button text | Show text labels next to the toolbar view-switch icons |
| Developer mode | Emit verbose debug logs instead of statistics + errors only |
| Timezone | Fixed UTC offset — affects "today" and calendar highlighting (DST is not auto-handled) |
| Time format | 24-hour (14:30) or 12-hour (2:30 PM) |
| Setting | Description |
|---|---|
| Use Obsidian daily note settings | Read folder / format / template from core Daily Notes or Periodic Notes (recommended) |
| Daily Note folder | Manual mode only — folder holding the daily notes |
| Daily Note filename format | Manual mode only — e.g. yyyy-MM-dd |
| Daily Note template path | Manual mode only — template used when creating a note (blank = empty file) |
| Date filter field | Field used by calendar views to place tasks (Task View can switch this per-session) |
| Week start | Monday or Sunday |
| Show lunar dates | Lunar text in Year / Month / Week views |
| Show festivals & solar terms | Coloured highlight markers on lunar text |
| Festival colours | Separate colours for solar festivals, lunar festivals, and solar terms |
| Group | Settings |
|---|---|
| Day View | Show Daily Note; layout — side-by-side or stacked |
| Month View | Tasks per day (1–10, also caps spanning-bar lanes); lunar font size (8–18 px) |
| Year View | Show daily task count; lunar font size; enable heatmap; heatmap palette (8 options); 3D heatmap effect |
| Gantt | Start field & end field mapping (created / start / scheduled / due / completion / cancelled) |
| Task card display | Toggle checkbox, tags, priority, and extra content per view (Day / Week / Month / Sidebar) |
| Group | Settings |
|---|---|
| Task basics | Global filter marker (e.g. 🎯 , TODO , #task — ⚠ requires restart); enabled formats (Tasks / Dataview / Both); show global filter in task text; task note folder path |
| Task creation | Target heading for new tasks in the daily note; default priority; recurring instance count |
| Task status | Default statuses plus custom ones — each with symbol, description, and light/dark colours |
See Setting up Feishu sync above. Key items: task list selection, target file for pulled tasks (default gantt-calendar-feishu-sync.md), sync direction, conflict resolution, auto-sync interval, and push filters (paths / completion status / date).
My tasks don't show up.
- [ ] followed by text.- [ ] 🎯 …). Change or clear it in Settings → Tasks → Global filter marker — this requires an Obsidian restart.I changed the global filter and nothing happened. That setting is read once at load. Fully restart Obsidian (not just toggle the plugin).
Dragging a task in the calendar didn't change the file. Check that the target line was not edited in another pane meanwhile — the plugin detects line drift and refuses the write rather than corrupting your notes. Refresh the view and try again.
Gantt view is empty.
The Gantt start/end field mapping doesn't match your tasks. Set them in Settings → Views → Gantt — e.g. start = start date, end = due date.
Recurring tasks show up many times. Those are virtual instances. Lower or zero the count in Settings → Tasks → Recurring instance count.
Lunar dates disappeared. Lunar display is auto-disabled when the interface language is not Chinese; re-enable it manually under Settings → Calendar.
The Day View has no editor. Either enable Obsidian's core Daily Notes (or Periodic Notes) and turn on Use Obsidian daily note settings, or switch it off and fill in the folder + filename format manually.
"Today" is off by an hour. The timezone setting is a fixed UTC offset and does not follow DST. Set it to follow the system, or pick a region without DST.
Feishu sync says authorization is required / expired.
Re-authorize in Settings → Sync. Authorization codes expire in ~5 minutes — grab the code from the callback URL promptly.
Sync overwrote my notes. Restore from a backup or Obsidian's File Recovery core plugin. Always back up before using sync.
git clone https://github.com/sustcsugar/obsidian-gantt-calendar.git
cd obsidian-gantt-calendar
npm install
npm installruns apostinstallthat removes a stray nestedobsidiancopy pulled in byobsidian-daily-notes-interface. This is expected.
| Command | Purpose |
|---|---|
npm run dev |
esbuild watch build — rebuilds main.js on save |
npm run build |
Type-check (tsc --noEmit) + production bundle |
npm run lint |
ESLint (eslint-plugin-obsidianmd recommended config) |
npm test |
Jest test suite (verbose) |
npm run test:watch |
Jest in watch mode |
npm run bench |
Timeline model micro-benchmark |
npm run version |
Bump manifest.json + versions.json via version-bump.mjs |
Symlink or copy the project folder into <vault>/.obsidian/plugins/gantt-calendar/, run npm run dev, then reload the plugin (Ctrl/Cmd+P → Reload app without saving, or toggle it off/on in settings). Output is a single CommonJS bundle main.js with obsidian and electron left external.
main.ts Plugin entry — views, commands, settings tab, managers
src/
GCMainView / GCSidebarView Obsidian ItemView shells (React mounts)
ui/
App.tsx Mounts ModalProvider + TooltipProvider + 6 views
views/ Year / Month / Week / Day / Task / Gantt
sidebar/ SidebarApp + TaskListPanel + DailyTimelinePanel
components/ Icon, DropdownMenu, Modal, TooltipProvider,
ContextMenu, TaskCard, Toolbar
modals/ TaskFormModal, ConfirmDialog, SyncResultDialog,
modalHost (imperative bridge for non-React callers)
store/calendarStore.ts zustand store for view state + filters
data-layer/
TaskStore Facade consumed by views
├── EventBus Publish/subscribe
├── TaskRepository In-memory Map cache + file index
│ └── MarkdownDataSource Vault scan (batches of 50, metadataCache)
└── SyncManager (optional) Multi-source sync orchestration
tasks/ Four-step parser + write-back (drift protection)
gantt/wrappers/ Custom SVG Gantt renderer
settings/ Builder-pattern settings tab
commands/ Command registration (common / conditional / feishu)
i18n/ i18n runtime + en/zh locale JSON
tests/ Jest suites (parser steps, drift, recurrence, …)
Key conventions
src/utils/bem.ts — no hard-coded stringssrc/utils/RegularExpressions.ts — no inline regexsrc/utils/tooltipManager.ts — do not reimplementupdateTaskProperties() — never patch Markdown text directlycreateEl / addEventListener outside base components, hosts, and the icon wrapperContributions of all kinds are welcome — bug reports, feature requests, translations, and code.
Open an Issue and include:
Please search existing issues first.
git checkout -b fix/gantt-drag-jitterupdateTaskProperties(), declarative React.tests/.npm run lint
npm run build
npm test
#123.The repository's own rules: never commit or push automatically; commits are made deliberately by the author. Please keep commit history on your branch clean and rebase rather than merge from
master.
UI strings live in src/i18n/locales/. To add a language, copy en.json, translate the values, and register the locale in src/i18n/i18n.ts. Keep the key structure identical.
manifest.json, package.json, and versions.json ("<version>": "<minAppVersion>"). npm run version handles manifest.json + versions.json.npm run buildv prefix (e.g. 1.6.3)master and the tagmain.js, manifest.json, and styles.css — the community plugin store pulls from thereFound a bug or have a suggestion? Open an Issue
Enjoying the plugin? Give it a ⭐!