yinshaohua42 downloadsA unified calendar view syncing events from Google Calendar, CalDAV, and ICS feeds into one beautiful interface.
A unified calendar view for Obsidian that aggregates events from Google Calendar, CalDAV servers, and ICS feeds into a single month view — with Chinese lunar calendar, solar terms, and public holiday annotations.

.ics URLisDesktopOnly: false)main.js, manifest.json, and styles.css from the latest release<Vault>/.obsidian/plugins/uni-calendar/Open Settings → UniCalendar to configure calendar sources.
For Feishu/Lark CalDAV performance notes and troubleshooting, see Feishu CalDAV diagnostics.
| Setting | Default | Description |
|---|---|---|
| Sync interval | 15 min | How often to auto-sync all sources |
| Show lunar calendar | On | Display lunar dates and festivals in month cells |
| Show holidays | On | Overlay public holiday and workday annotations |
| Month overflow mode | Expand | How to handle cells with more events than fit |
Use Settings → UniCalendar → Event title filters to hide noisy events across all calendar sources without deleting the underlying event data.
Each rule supports two modes:
Examples:
WaytoAGI晚8点共学 with exact match hides only events whose title is exactly WaytoAGI晚8点共学WaytoAGI with contains hides any event whose title contains WaytoAGIMatching is case-insensitive and ignores leading/trailing or repeated whitespace.
Ctrl/Cmd+P) and search for Open calendar< and > arrows in the view headerUniCalendar operates entirely locally. Calendar credentials are stored in your vault's plugin data file (<Vault>/.obsidian/plugins/uni-calendar/data.json). No data is sent to any third-party service other than the calendar providers you explicitly configure. Holiday data is fetched from the jsdelivr CDN on first load and cached locally.
# Optional: enable external dependencies for this shell session.
# This keeps node_modules out of OneDrive-synced project directories.
. .\setenv.ps1
# Install dependencies.
# With setenv.ps1 loaded, this installs to the external directory.
# Without setenv.ps1, the same command installs to local ./node_modules.
npm run deps:install
# Watch mode (auto-recompile on save)
npm run dev
# Production build
npm run build
# Run tests
npm test
# Lint
npm run lint
Use npm run deps:install in both modes. By default, it behaves like npm install and creates local ./node_modules. To opt in to external dependencies, dot-source setenv.ps1 in the current PowerShell session before running npm scripts:
. .\setenv.ps1
The script sets EXTERNAL_NODE_MODULES to C:/local_data/<project-folder>/node_modules and updates NODE_PATH/PATH for the session. With that variable set, npm run deps:install installs dependencies into the external directory, and build/test/lint resolve tools from there. Without that variable, scripts fall back to the project directory's node_modules. Do not create a symlink or junction back to node_modules. See External node_modules guide for the reusable setup details.
Copy main.js, manifest.json, and styles.css to <Vault>/.obsidian/plugins/uni-calendar/ and reload Obsidian to test locally.