Jonny McConnell44 downloadsWeekly time-blocking canvas with Tasks-plugin backlog, drag-and-drop scheduling, and Google Calendar integration.
A drag-and-drop weekly planner for Obsidian. Turn your vault tasks into a visual schedule — drag any task onto the calendar grid, resize it to set duration, and optionally push everything to Google Calendar with two-way sync.

Most task plugins show you what to do. Time Blocks shows you when.
AGENTS.md guide lets AI tools read your backlog and schedule blocks directly via data.json.A 7-day, hour-by-hour canvas with configurable workday bounds (default 8 am–6 pm), sticky day headers, and a live current-time indicator.


Automatically scans your entire vault for tasks written in Obsidian Tasks emoji format (- [ ] task text 📅 2025-07-15 ⏫) and displays them in a resizable sidebar. Tasks already scheduled for the current week are hidden.


A single-day sidebar view for focused planning. Navigate between days with arrow buttons. Supports the same drag-and-drop, resize, completion toggle, and delete actions as the weekly grid.
Two layers of calendar integration:


Switch from "show all" to a custom multi-line query using the Obsidian Tasks query syntax. 16 rule types: status, due/path/tag/priority filters, sort, and limit.
not done
tag includes #work
priority above low
due before 2025-09-01
sort by priority
limit to 20 tasks

This plugin is currently in pre-release. Choose the option that fits you:
https://github.com/jonmccon/obsidian-time-blocksBRAT keeps the plugin updated automatically when new releases are published.
main.js, styles.css, and manifest.json.<vault>/.obsidian/plugins/time-blocks/
git clone https://github.com/jonmccon/obsidian-time-blocks.git
cd obsidian-time-blocks
npm install
npm run build
# Copy main.js, styles.css, manifest.json → <vault>/.obsidian/plugins/time-blocks/
| Setting | Description | Default |
|---|---|---|
| Workday start | First hour shown on the grid (0–12) | 8 |
| Workday end | Last hour shown on the grid (12–24) | 18 |
| Default task duration | Minutes when a task is first dropped (15–240) | 30 |
| Backlog mode | All tasks or Custom query |
All tasks |
| Tag filter | (All tasks) Only show tasks with this tag | (empty) |
| Show completed tasks | (All tasks) Include done tasks in backlog | Off |
| Custom query | (Custom query mode) Multi-line filter, one rule per line | (empty) |
| Task block color | Background color for scheduled task blocks | #7B61FF |
| Calendar event color | Background color for ICS/GCal event blocks | #4285F4 |
| Calendar feeds | ICS feed URLs (read-only overlay, HTTPS only) | (none) |
| Enable two-way sync | Push/pull to Google Calendar via OAuth | Off |
| Calendar API client ID | Your GCP OAuth 2.0 client ID | (empty) |
| Target calendar | Calendar ID to push blocks into | primary |
| Conflict resolution | Ask / Local wins / Remote wins | Ask each time |
One filter rule per line. Rules are ANDed together. Lines starting with # are comments.
| Rule | Example | Description |
|---|---|---|
not done / done |
not done |
Filter by completion |
due before <date> |
due before 2025-09-01 |
Due date before |
due after <date> |
due after 2025-01-01 |
Due date after |
due on <date> |
due on 2025-07-15 |
Exact due date |
path includes <text> |
path includes projects/ |
File path filter |
path does not include <text> |
path does not include archive |
Exclude path |
description includes <text> |
description includes meeting |
Title search |
tag includes <tag> |
tag includes #work |
Tag filter |
tag does not include <tag> |
tag does not include #someday |
Exclude tag |
priority is <level> |
priority is high |
Exact priority |
priority above <level> |
priority above medium |
Priority threshold |
priority below <level> |
priority below medium |
Priority ceiling |
sort by <field> |
sort by due |
Sort (priority / due / description) |
limit to <N> tasks |
limit to 20 tasks |
Result cap |
Two-way sync pushes your scheduled blocks to Google Calendar and pulls remote changes back. It uses OAuth 2.0 with PKCE — no client secret is required.
http://127.0.0.1 as an Authorized redirect URI.⚠️
data.jsonstores your live OAuth refresh token. Do not commit.obsidian/plugins/time-blocks/data.jsonto a public repository. To revoke access, click Sign out in settings or visit Google Account permissions.
| Strategy | Behaviour |
|---|---|
| Ask each time | Conflict is reported but skipped — resolve manually |
| Local wins | Obsidian's version overwrites Google Calendar |
| Remote wins | Google Calendar event overwrites local block |
RRULE recurrence rules; recurring events only appear for their original date.TZID parameters are treated as local time rather than converted from the specified timezone.The GitHub Pages preview at jonmccon.github.io/obsidian-time-blocks lets you try the full interface — drag-and-drop, week navigation, task search — without installing anything. No vault or Obsidian required.
Tasks must follow the Obsidian Tasks emoji format:
- [ ] Task title
- [ ] Task with due date 📅 2025-07-15
- [ ] High-priority task ⏫ 📅 2025-07-10
- [x] Completed task
- [ ] Tagged task #work #q3
- [ ] Scheduled to work on it ⏰ 2025-07-11
Priority emojis (highest → lowest): 🔺 ⏫ 🔼 🔽 ⏬
Time Blocks ships an AGENTS.md guide for AI tools and automation scripts. It documents:
ScheduledBlock data modeldata.json directly to schedule tasksThis means tools like Hermes, Claude, or custom scripts can read your backlog and populate your weekly schedule programmatically.
npm install # install dependencies
npm run build # type-check + bundle
npm run dev # watch mode
npm run lint # ESLint
npm test # Vitest unit tests (173+ tests, no Obsidian install needed)
npm run test:watch # test watch mode
Tests cover: weekUtils, icsParser, queryFilter, taskQuery, gcal/*.
See CHANGELOG.md for the full version history.