duany86 downloadsManage tasks in a TickTick-style month, week, and three-day timeline, with Chinese lunar dates, public holidays, and makeup workdays.
一款为 Obsidian 打造的滴答清单风格月视图任务管理插件,支持农历显示、节假日标注和调休信息展示。
English speakers: see the English section below for installation, usage, the task file format, and privacy details.
Obsidian 设置 → 第三方插件 → 浏览,搜索「Monthly Tasks」→ 安装 → 启用。插件已在官方社区目录里,之后的更新也在这个页面点一下就能拿到。
社区目录安装时,客户端只逐个下载 Release 里的
main.js、manifest.json、styles.css三份文件——节假日兜底数据就打包在main.js里,所以离线也能显示已内置年份。
monthly-tasks-*.zipmonthly-tasks.obsidian/plugins/(如果没见过这个目录:在 Obsidian 里点左下角仓库图标 →「在系统资源管理器中显示仓库」,进去就能看到 .obsidian)monthly-tasks 文件夹整个放进去,变成 .obsidian/plugins/monthly-tasks/(里面应有 main.js、manifest.json、styles.css)duany2026/obsidian-monthly-tasksCtrl/Cmd + P)搜索「月历任务」顶栏视图菜单切到「三天视图」:三天 3 列 × 24 小时铺开,带时间的任务画成时间块。
⏰ 段,不动备注、不重排文件22:00~02:00)的任务也会归到这里,时间块则以红色虚线描边提示任务以标准 Obsidian checklist 格式存储:
- [ ] 完成任务 📅 2026-04-22
- [x] 已完成任务 📅 2026-04-21
- [ ] 跨天任务 🛫 2026-04-22 📅 2026-04-25
- [ ] 带时间的任务 ⏰ 09:00~12:00 📅 2026-04-22
- [ ] 高优先级任务 🔴 📅 2026-04-22
- [ ] 中优先级任务 🟡 📅 2026-04-22
任务自动保存到 任务/YYYY年任务列表.md 文件中(统一归集,不写入日记文件)。
设置页分四档,行名与下表一致:
| 分区 | 设置项 | 说明 | 默认值 |
|---|---|---|---|
| 显示 | 默认视图 | 打开月历默认用哪一档:大月 / 小月 / 大周 / 小周 / 三天视图;顶栏切换后这里会跟着变成最后用的那一档 | 大月 |
| 显示 | 显示已完成任务 | 在月历中显示已完成的任务 | 开启 |
| 显示 | 已完成隐藏删除线 | 打开后已完成任务隐藏删除线(同时隐藏过期任务的红色竖线) | 开启 |
| 显示 | 显示农历 | 显示中国传统农历日期 | 开启 |
| 显示 | 显示节假日 | 显示法定节假日与调休上班 | 开启 |
| 显示 | 每周第一天 | 周日 / 周一 / 周六 | 周日 |
| 显示 | 每日任务显示数量 | 每个日期格子最多显示的任务数量;当天面板超过这个数默认收起,「查看全部」也按它出现 | 5(可选 3–10) |
| 任务 | 默认全天任务 | 新建任务时默认为全天任务(不带具体时间) | 开启 |
| 任务 | 归档周期 | 决定新任务写入哪个文件(按年 YYYY年任务列表.md 或按月 YYYY年MM月任务列表.md);切换不影响已有文件,历史任务仍全部显示。下拉里的示例文件名跟着当天走 |
按年 |
| 任务 | 记录位置 | 任务文件的存放位置;若已有同名任务文件,插件优先使用它。已保存的文件夹被删掉时,下拉里会补一项「(已失效)」回显原路径 | 默认(任务/) |
| 类别管理 | 已知类别 | 维护创建弹窗与漏斗面板里的顺序和颜色。类别本身是任务行尾的 #标签,在这里增删不会改动任何笔记 |
生活、学习 |
| 节假日数据 | 启动时自动刷新节假日 | 启动时预取今年及前后各一年(共三年)的节假日数据 | 关闭 |
| 节假日数据 | 刷新节假日数据 | 手动强制刷新上述三年 | 按钮 |
界面语言不提供单独选项:始终跟随 Obsidian 的界面语言(简体中文 / 繁体中文 / English)。
归档文件名始终是简体中文(
YYYY年任务列表.md/YYYY年MM月任务列表.md),不随界面语言变——繁体和英文界面上看到的示例也是这个写法,因为插件真正写盘用的就是它。
插件数据存储在插件设置中:
data.json - 用户设置和节假日缓存任务/YYYY年任务列表.md - 任务内容文件按顺序尝试,任一源成功即采用:
cdn.jsdelivr.net → fastly.jsdelivr.net → gcore.jsdelivr.net → raw.githubusercontent.com),任一可达即采用——主域名在部分网络下不可达,只试一个会表现为「刷新失败且时好时坏」403 与 Cloudflare 人机验证页(HTML 而非 JSON),因此这一级实际不起作用——主源抖动时就是失败,而不是"切到备份源"。插件仍会尝试它,因为该状况可能随对方策略变化而恢复main.js 一起分发的 BUILTIN_HOLIDAYS 数据块(2022–2026 官方数据,离线可用)插件只在获取节假日数据时联网,访问的就是上面列出的那几个地址(holiday-cn 的 CDN 镜像与 timor.tech),请求内容只有年份,不携带任何笔记内容、路径、设置或身份信息。
data.json 设置、可选的 holidays.json 覆盖文件)main.js 的 BUILTIN_HOLIDAYS 标记块里。为什么不只放一个 JSON 文件:从插件市场安装时 Obsidian 只下载 main.js、manifest.json、styles.css 三份,仓库里的 holidays.json 不会进你的插件目录——只依赖外部文件的话,市场安装的用户就完全没有离线兜底holidays.json 仍是可编辑的数据源,改完跑 node scripts/sync-holidays.mjs 同步进 main.js(CI 会拦住两者漂移)holidays.json,它按年覆盖内置副本,没写进去的年份仍由内置数据兜着。格式:{
"2026": [
{ "date": "2026-01-01", "name": "元旦", "type": "legal", "isOff": true },
{ "date": "2026-05-09", "name": "班", "type": "workday", "isOff": false }
]
}
┌─────────────────────────────────────────────┐
│ ◀ 2026年4月 ▶ │
├─────┬─────┬─────┬─────┬─────┬─────┬─────┤
│ 日 │ 一 │ 二 │ 三 │ 四 │ 五 │ 六 │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ │ │ │ 1 │ 2 │ 3 │ 4 │
│ │ │ │ │ │ 清明 │ 清明 │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
│ 清明│ │ │ │ │ 班 │ │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ ... │
└─────────────────────────────────────────────┘
| 模块 | 说明 |
|---|---|
| TaskModel | 任务数据模型,包含任务解析、优先级提取等工具函数 |
| TaskParser | 任务解析器,负责解析 Obsidian 库中的任务,管理缓存 |
| Calendar | 日历工具,生成月历网格数据 |
| LunarCalendar | 农历转换,支持 1900-2100 年的农历日期转换 |
| HolidayManager | 节假日管理器,管理法定节假日和调休信息 |
| MonthlyView | 月历视图,渲染日历网格和任务列表 |
| CreateTaskModal | 创建任务弹窗,处理任务创建表单 |
| DatePickerModal | 日期选择器弹窗,支持快速切换年月 |
| MonthlyTasksPlugin | 插件主类,管理插件生命周期 |
| MonthlyTasksSettingTab | 设置界面,提供用户配置选项 |
main.js 为唯一源码,直接手工维护,无构建步骤)holidays.json 内置兜底(详见「节假日数据」一节)Monthly Tasks is a TickTick-style task view for Obsidian. It lays your tasks out on a month grid, a single week, or a three-day hour-by-hour timeline, and marks Chinese lunar dates, statutory holidays, and make-up workdays on the calendar. Tasks are stored as ordinary Obsidian checklist lines in a Markdown note inside your vault — there is no database and no account. The interface follows Obsidian's own language (Simplified Chinese, Traditional Chinese, or English); the view title and the command palette entries stay in Chinese.
From the community directory: Settings → Community plugins → Browse, search for "Monthly Tasks", install, then enable. Updates are one click on the same page.
Manual installation:
monthly-tasks-<version>.zip from the Releases page.monthly-tasks containing main.js, manifest.json, styles.css, holidays.json, versions.json, README.md, and LICENSE..obsidian/plugins/ directory, so you end up with .obsidian/plugins/monthly-tasks/.Installing from the directory downloads only main.js, manifest.json, and styles.css. The offline holiday fallback (2022–2026) is embedded in main.js for exactly that reason, so a directory install still shows built-in years with no network. You can also install BRAT and add duany2026/obsidian-monthly-tasks.
Switch views from the menu in the view's top bar. The English labels are:
| Label | What you get |
|---|---|
| Month · Cells | The whole month, tasks written inside each day cell |
| Month · Agenda | The whole month, cells show dots only, tasks listed below |
| Week · Cells | One week only, tasks written in the cells |
| Week · Agenda | One week only, tasks listed below |
| 3-Day Timeline | Three days × 24 hours, timed tasks drawn as draggable blocks |
Which one opens by default is the "Default View" setting; the menu writes your last choice back into it.
⏰ segment of that task line and never touches your notes or their order. Timed tasks snap to the nearest 15 minutes. Tasks without a time — or with a broken range such as 22:00~02:00 — collect in the sticky all-day strip under the column headers, collapsed to one line showing the per-day counts.Tasks are standard Obsidian checklist lines with emoji markers:
- [ ] Task 📅 2026-04-22
- [x] Done task 📅 2026-04-21
- [ ] Multi-day task 🛫 2026-04-22 📅 2026-04-25
- [ ] Timed task ⏰ 09:00~12:00 📅 2026-04-22
- [ ] High priority task 🔴 📅 2026-04-22
- [ ] Medium priority task 🟡 📅 2026-04-22
- [ ] Task with a category 📅 2026-04-22 #生活
📅 is the due date, 🛫 the start date of a multi-day task (it then shows on every day in between), ⏰ the time range, 🔴 / 🟡 the priority, and a trailing #tag the category. Because these are plain checklist lines, tasks written by other plugins and by hand are read and displayed too.
Everything goes into one archive note rather than into your daily notes: 任务/YYYY年任务列表.md by year, or 任务/YYYY年MM月任务列表.md by month ("Archive Period" setting). The folder is the "Location" setting. Those file names are always Simplified Chinese, whatever your interface language is, because that is literally what gets written to disk. Your own headings and unrelated content in the note are left alone.
Four groups: Display (default view, show completed tasks, hide strikethrough for completed, show lunar dates, show holidays, first day of week, how many tasks each day cell shows before collapsing), Tasks (default all-day task, archive period, location), Category Management (order and colour of the categories shown in the create dialog and the filter panel — a category is just a #tag on the task line, so adding or deleting one here never edits a note), and Holiday Data (auto-refresh on startup, manual refresh button).
The plugin only goes online to fetch holiday data, and only to the sources listed in the 节假日数据 section: the holiday-cn CDN mirrors, then timor.tech, then the built-in fallback. A request carries nothing but a year — no note content, no paths, no settings, no identity. There is no account, no paid feature, no telemetry, and nothing is uploaded.
Prefetching on startup is off by default. Otherwise data is fetched on demand when you browse to a year that is neither cached nor built in (2022–2026 are built in; holiday-cn covers 2007 onward). Failures back off for 5 minutes. Offline, everything still works for cached and built-in years. Reads and writes stay inside your vault (the task notes) and the plugin's own folder (data.json for settings and the holiday cache, an optional holidays.json that overrides built-in data year by year).
Obsidian 0.15.0 or newer, desktop and mobile (no isDesktopOnly). Mobile is a first-class layout, not a squeezed desktop view: cells scroll in place without a scrollbar and fade at the bottom to hint there is more, and the time input is a single pill that opens the system time picker wherever you tap it. Lunar conversion covers 1900–2100.
MIT License — see LICENSE.
完整版本历史见 CHANGELOG.md——GitHub Release 的说明也从同一处提取,本文不再重复维护一份。
这里刻意不写「当前版本 vX.Y.Z」:版本号已在
manifest.json、versions.json、CHANGELOG 与源码头注释四处维护,每加一处重复就多一处发版时漏改、进而与线上 Release 分叉的地方。
仓库根目录即插件目录,.github/workflows/release.yml 在推送标签时自动打包,但先卡一道门禁:标签必须与 manifest.json 的 version 逐字相同、不带 v 前缀,且版本号是 x.y.z 三段式,versions.json 里必须登记了这一版——不满足就直接失败退出,而不是产出一个社区目录永远认不到的发行版(目录是按「tag == manifest.version」去找 Release 再下载资产的,v1.8.4 这种写法它匹配不上)。
Release 里挂四个资产:main.js、manifest.json、styles.css 三份独立文件(客户端安装时逐个下载的就是这三份),外加一个手动安装用的 zip。zip 内含 main.js、manifest.json、styles.css、holidays.json、versions.json、README.md、LICENSE 七个文件,不含 data.json(.gitignore 已排除)——其中存有作者本机的设置(如节假日自动刷新开关)与节假日缓存,会让新用户安装后即继承作者设置、启动就联网预取。插件的联网口径是:默认不预取(启动预取由「启动时自动刷新」控制,默认关);浏览到未内置年份(2022-2026 以外)时会按需向在线数据源请求该年数据(源链与已知状况见「节假日数据」一节)。
duany (@duany2026)
MIT License - 详见 LICENSE 文件
欢迎提交 Issue 和 Pull Request!改代码前请先读 CONTRIBUTING.md——里面记着换行符约定、版本号要对齐的四处、发版流程、手机端「不热更新所以改了没生效」的排查前提,以及任务文件写入的数据安全红线。