Open Taiwan Calendar

approved

by aione314159

Taiwanese almanac calendar: public holidays, day-off adjustments, lunar dates and solar terms in a month or year view, with a sidebar view, a floating window and periodic notes. - This plugin has not been manually reviewed by Obsidian staff.

โ†“ 35 downloadsUpdated 23d agoMIT

Open Taiwan Calendar โ€” public holidays, substitute days, lunar dates and solar terms for Obsidian

A Taiwanese almanac calendar for Obsidian: public holidays, substitute-day adjustments, the lunar calendar and the solar terms, with month/year view switching, a sidebar view and a draggable floating window. Pairs with QuickAdd to create daily, weekly, monthly, quarterly and yearly periodic notes.

Latest release Total downloads Obsidian 1.13.0+ Desktop only No network access MIT License

๐Ÿ“ฅ Download ยท ๐Ÿ’ก Features ยท ๐Ÿ—“๏ธ Holiday Data Strategy ยท ๐Ÿ› ๏ธ Installation ยท ๐Ÿž Report an issue

English ยท ็น้ซ”ไธญๆ–‡

The calendar in the Obsidian sidebar, next to a daily note

Month view in the floating window, showing Taiwanese public holidays and make-up workdays Year view, with all twelve months and their lunar month names


Features

  • A month view showing the lunar date, the solar terms and Taiwanese festivals in every cell, and a year view showing all twelve months.
  • Public holidays, substitute holidays and make-up workdays follow the calendar announced by the Directorate-General of Personnel Administration.
  • A sidebar view and a floating window that can be dragged anywhere and resized; both scale themselves to fit their container.
  • Every cell opens the periodic note for that day, week, month, quarter or year, and shows a dot when the note already exists.
  • Your own events and reminders, stored in the daily notes themselves and marked on the calendar as a coloured dot in a row beside the "this day has a note" dot, never overlapping it.
  • Reminders fire on a rule of your own โ€” the day before and again on the day, say โ€” through a dialog, a corner notice, a desktop notification, or any combination.
  • The day's events are written into the top of the daily note, inside a comment-marked block that is rewritten without touching anything else in the file.
  • Reading view draws the note's own entries as a block at the top, so the frontmatter reads as rows rather than as raw YAML โ€” or as nothing at all, which is what Obsidian shows when "Properties in document" is set to hidden.
  • A day with anything on it is framed on the grid in the same orange the block uses, so a marked day opens to a block of the same colour.
  • A quick-add dialog that reads the date out of a plain sentence ("remind me on Saturday to take the laptop home"), and shows what it read so you can correct it before saving.
  • Optional QuickAdd integration, plus template tokens for the lunar date, the solar term and the festival name.
  • Dot size (small / medium / large) and hover preview are settings, alongside the normal / compact layout.
  • Traditional Chinese and English interface, following the Obsidian display language.
  • No network access whatsoever. The holiday table ships with the plugin, and a CI step fails the release if any network call site appears in the bundle.

Requirements

Periodic notes come from either the core Daily Notes plugin or the community Periodic Notes plugin, so at least one of them has to be enabled. Weekly notes are also recognised from the Calendar plugin's settings. A granularity that no provider has enabled stays visible in the calendar but is not clickable, and says so on hover.

Usage

  • Open the calendar in the sidebar with the Open sidebar command, or toggle the floating window from the ribbon icon or the Toggle floating calendar command.
  • Click a date to open its daily note, creating it first if it does not exist yet. The week numbers down the left edge, the quarters in the year view, and the year / month / quarter in the heading do the same for their own granularity.
  • Ctrl-click (Cmd-click on macOS) opens the note in a new split.
  • Today in the toolbar moves the grid back to today and opens today's note, creating it if it is not there yet โ€” exactly what clicking today's cell does.
  • Right-click a cell for the note menu; hover over one to preview it, once "Open Taiwan Calendar" is enabled under Page Preview.
  • Add an event with the Add an event or reminder command, the calendar icon in the toolbar, by right-clicking the day you want it on, or by selecting a line in a note and picking Add a reminder / Add an event from the editor menu โ€” the selected text becomes the sentence.
  • The dialog's dates start at the daily note you have open, if you have one, and each has a calendar button beside it. Moving the start date takes the end date with it, and the end can never fall before the start.
  • Show reminders and events opens a list of everything you have entered, split into reminders and events, with what is running today at the top and what is finished greyed out at the bottom.
  • The settings page carries the layout (normal or compact), the fading of past dates, the QuickAdd choices per granularity, an editor for the holiday data, the switch for the reading-view block, the event and reminder options with the list of everything you have added, and a one-click setup that configures daily notes end to end.

Events and Reminders

Entries live in the daily notes themselves. Adding one writes it into the otc-events property of every daily note its dates cover โ€” creating those notes if they are not there โ€” so a nine-day trip appears in all nine days. There is no side file and no database: the data syncs, versions and merges exactly like the rest of your notes, is editable by hand in Obsidian's property panel, and survives the plugin being uninstalled.

---
date: 2026-08-29
otc-events:
  - id: da25b36f-cde1-427b-94b7-16d49a20a2b8
    title: Take the laptop home
    start: 2026-08-29
    end: 2026-08-29
    color: "#e07a5f"
    remindDaysBefore: [1, 0]
    remindTime: "09:00"
---

A reminder is a list of "days before" plus a time. 1, 0 fires once the day before and once on the day itself; 0 alone fires only on the day. A reminder whose time has already passed when Obsidian opens fires on opening rather than being skipped for the day. Which channels it uses โ€” dialog, corner notice, desktop notification โ€” is one setting for the whole vault rather than a field on every entry.

Reminders and events get separate default dot colours, so the two kinds of entry are told apart at a glance on the grid.

Reading view draws those entries at the top of the note, one row each: the colour, the title, the dates and the reminder rule in words. It is read-only โ€” the frontmatter and the quick-add dialog are the two places an entry is edited โ€” and it can be switched off under Settings โ†’ Appearance. It is drawn whatever Obsidian's own "Properties in document" setting is on, since that setting decides between a raw YAML table and nothing at all, and neither answers "what is on today".

Installation

Search for "Open Taiwan Calendar" under Settings โ†’ Community plugins โ†’ Browse.

To install it by hand, download main.js, manifest.json and styles.css from the latest release into <vault>/.obsidian/plugins/open-taiwan-calendar/, then reload Obsidian.

Holiday Data Strategy

  • Fixed-date public holidays (New Year's Day, Peace Memorial Day, Children's Day, Labour Day, National Day) and the three major lunar festivals (Lunar New Year, Dragon Boat Festival, Mid-Autumn Festival) plus the Qingming solar term (Tomb Sweeping Day) are computed algorithmically, so they display correctly for any year.
  • The three commemoration days made into holidays by the 2025 amendment (Confucius' Birthday on 9/28, Taiwan Retrocession and Guningtou Victory Memorial Day on 10/25, Constitution Day on 12/25) are likewise computed algorithmically, and only take effect from 2025 onwards โ€” years before the amendment are not retroactively marked as holidays.
  • Substitute-day adjustments (the "make-up workdays" and "substitute holidays" announced each year by the Directorate-General of Personnel Administration) are built in for the years that already have an official announcement. Future years that are not yet covered fall back to the purely algorithmic version without substitute-day adjustments; once the official announcement is published, you can paste or update the JSON under "Holiday data" in the settings page to override it.

Adding a new year's data yourself

Once the Directorate-General of Personnel Administration publishes the calendar for a new year, there is no need to wait for a plugin update โ€” paste it in yourself and it takes effect straight away:

  1. Open Settings โ†’ Open Taiwan Calendar
  2. Find Day-off adjustment override (JSON) in the Holiday data section
  3. Paste that year's JSON
  4. Click anywhere outside the editor โ€” it is saved and applied as soon as the box loses focus

The Holiday data section of the settings page, with the day-off adjustment override JSON editor

Format next to the editor re-indents the JSON; Insert example fills in one sample entry dated tomorrow, which you then edit into what you need.

The JSON maps a year to an array of every special date in it:

{
  "2027": [
    { "date": "01-01", "name": "Founding Day",        "isHoliday": true,  "isMakeupWorkday": false },
    { "date": "02-06", "name": "Lunar New Year's Eve", "isHoliday": true,  "isMakeupWorkday": false },
    { "date": "02-20", "name": "Make-up workday",     "isHoliday": false, "isMakeupWorkday": true  },
    { "date": "04-05", "name": "Day off in lieu",     "isHoliday": true,  "isMakeupWorkday": false }
  ]
}

date is MM-DD, isHoliday marks a day off, and isMakeupWorkday marks a Saturday or Sunday that is worked. Malformed entries are dropped one by one, so a mostly-correct paste still applies.

Attribution

Open Taiwan Calendar is an independent implementation with its own holiday engine, rendering and state handling, and no UI framework beyond React.

Lunar dates and solar terms are computed by lunar-typescript; periodic notes are read and created through obsidian-daily-notes-interface.

Development

npm install
npm run dev     # watch mode
npm run build   # type check + lint + emit main.js

License

MIT โ€” see LICENSE.

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.