mrcnkobu118 downloadsCalendar-driven daily planning, timeline rendering, and time tracking for Obsidian
Tascal is an Obsidian plugin for day planning around a generated timeline. It syncs ICS calendars, manages scheduled and unscheduled tasks in daily notes, tracks time spent on tasks, and can import backlog items from project notes.
Tascal treats the daily note as rendered output. It manages the content beneath the configured headings and preserves checkbox changes when the note is rebuilt.
Example timeline:
## Timeline
<!-- tascal:start -->
**2/5** done | 2h/8h30m | **TT 1h15m** | *sync 09:10*
- *08:00–09:00 (free)*
- [x] 09:00–10:00 *(work)* Team standup
- [ ] > 10:00–11:30 Deep work *· tracking*
- *11:30–12:00 (free)*
- [ ] 12:00–12:30 Lunch *· rc*
- [ ] 12:30–14:00 Project review
- [x] 14:00–15:00 Code review *· rs:2026-02-05*
- *15:00–22:00 (free)*
<!-- tascal:end -->
Example unscheduled section:
## Unscheduled
<!-- tascal:unscheduled:start -->
- [ ] Send invoice *(20m)*
- [ ] Prepare slides *(45m)*
<!-- tascal:unscheduled:end -->
Tascal fetches events from ICS calendar URLs such as Google Calendar, Outlook, or iCloud and merges them into the day store for the active daily note.
Command: Tascal: Sync calendar
The timeline is rendered under the configured heading, Timeline by default.
*· rc**· rs:YYYY-MM-DD*Command: Tascal: Update timeline
Manual events are created through Tascal modals and stored in the day store.
Command: Tascal: Add event
Unscheduled tasks belong to a specific date but do not have a time slot yet.
Commands:
Tascal: Add unscheduled taskTascal: Manage unscheduled tasksTascal can scan configured source directories for project notes and import backlog items into the active daily note's unscheduled tasks.
Each project note must contain frontmatter with a stable project id:
---
tascal-project-id: tascal
---
and an inbox block:
## Tascal Inbox
<!-- tascal:inbox:start -->
- [ ] Draft release notes {est: 30m}
- [ ] Review sync errors {av: 2026-03-25, est: 45m}
- [ ] Clean up timeline parsing
<!-- tascal:inbox:end -->
Supported inbox syntax:
[ ] available and not yet imported[-] imported into Tascal and still open[x] completed in TascalSupported metadata:
est: estimate such as 20m, 1h, 1h30mav: make the item importable on or after a date in YYYY-MM-DDid: stable task id, added automatically by Tascal on first import when missingdoneAt: completion date written back by TascalMetadata parsing is forgiving:
: after the key is optional, so both {est: 30m} and {est 30m} workAV, Est, and doneAt are all accepted:Workflow:
Tascal: Import project tasks from a dated daily note.loadedAt timestamp on import, and tracks the imported item in a persistent registry.Command: Tascal: Import project tasks
Recurring scheduled items are defined in settings rather than in the note.
Example weekly rules:
09:00, 60m on Mon, Tue, Wed, Thu, Fri
10:00, 30m on Wed
Events can be moved to another date and optional new start time.
Command: Tascal: Manage rescheduled events
Tascal records time tracking entries directly on scheduled events.
Commands:
Tascal: Start time trackingTascal: Stop time trackingTemplates make repeated manual events faster to create.
Current settings areas:
General: timezone, managed heading names, plugin statusProject Sources: directories scanned for project inbox notesCalendars: ICS feed URLs and labelsWorking Hours: default day bounds and per-day overridesRecurring Rules: structured weekly and monthly recurring itemsTemplates: manual-event presets and linked-note defaults| Command | Description |
|---|---|
| Sync calendar | Fetch ICS calendars and rebuild the timeline |
| Update timeline | Rebuild timeline from cached data, recurring rules, and current store state |
| Add event | Add a manual scheduled event, optionally from a template |
| Edit event | Edit, delete, or reschedule an existing scheduled event |
| Add unscheduled task | Add a date-scoped task without a time slot |
| Manage unscheduled tasks | Complete, move, schedule, reopen, or delete unscheduled tasks |
| Manage rescheduled events | Review and re-reschedule future rescheduled events |
| Start time tracking | Begin tracking time for a selected event |
| Stop time tracking | End the current tracking session |
| Import project tasks | Import available backlog items from project inbox notes |
| Path | Contents |
|---|---|
.tascal/days/YYYY-MM-DD.json |
Per-day store for scheduled events, unscheduled tasks, tracking, suppressions, and sync metadata |
.tascal/source-task-registry.json |
Persistent registry for imported source-backed project tasks |
.tascal/rescheduled.md |
Legacy rescheduled task entries used during rebuild/import flows |
.tascal/recurring.md |
Legacy recurring markers used for older recurring-event compatibility |
main.js, manifest.json, and styles.css from the latest release.your-vault/.obsidian/plugins/tascal/.git clone <repo-url>
cd tascal
npm install
npm run build
Copy main.js, manifest.json, and styles.css into your vault's plugin directory.
YYYY-MM-DD format.tascal-project-id, and only tasks inside inbox markers are considered.lib to ES2020 so modern APIs (Object.entries, String.padStart, String.trimEnd, etc.) are properly typed, clearing the community-scan no-unsafe-* warnings.prefer-const, require-await, template-expression typing) and added an npm run lint script wired to the same type-checked ruleset. No runtime changes.MIT