TaskMarkMarkdown-Based Schedule & Task Management VS Code Extension Write your schedules and tasks in a
MotivationTaskMark aims to empower developers by bringing schedule and task management directly into the environment they use most: VS Code. The Problem
The Solution
Built With
Features
📅 Calendar ViewSwitch between three granularity levels to check your schedule.
Interactions:
📊 Timeline View (Gantt Chart)Visualize schedule durations and project spans as a Gantt chart.
🏷️ Tags & ColorsCategorize schedules and tasks visually with tags.
Define tag colors inside the Any of the following CSS color formats are accepted:
Values that do not match any of these formats are rejected with a warning and the tag falls back to the deterministic generated color. 🔁 Recurring SchedulesAutomatically expand recurring schedules. Tasks (
Options can be combined using commas. If a limit is not explicitly defined, recurrences will continually expand up to a safe maximum of 3650 occurrences (approx. 10 years).
|
| Syntax | Description | Applies to |
|---|---|---|
@tags ... @end |
Tag color definition block | — |
# YYYY-MM-DD |
Date header | — |
# YYYY-MM-DD : YYYY-MM-DD |
Date range header (start : end) | — |
- Text |
Schedule (Event) | — |
- [ ] Text |
Uncompleted task | — |
- [x] Text |
Completed task | — |
HH:mm-HH:mm |
Time range (Start-End) | Schedules |
HH:mm |
Start time only | Schedules |
#Tag |
Tags (Multiple allowed) | Both |
@repeat(...) |
Recurring items | Schedules only |
> Group Name |
Group header (tags optional) | — |
> - Item |
Items inside group | Both |
🗂️ Group Colors
Attach a tag directly to a group header to control its display color in both the Calendar and Timeline views.
# 2026-03-01
> Sprint #Dev
> - [ ] Implement feature A
> - [ ] Write tests
If no tag is specified on the group header, the group box and its bar use the default accent color. Each child item continues to use its own tag color independently.
Note: When a schedule inside a group uses
@repeat, the group header tag is correctly applied to all expanded instances by referencing the original date where the group was defined.
📅 Date Range Header
Use # YYYY-MM-DD : YYYY-MM-DD to define events or tasks that span multiple days as a single entry. Unlike @repeat, this does not create separate items for each day — the Timeline renders it as one continuous bar, and all Calendar views show it on every day within the range.
# 2026-03-01 : 2026-03-10
- Conference Trip #Important
- [ ] Prepare conference materials #Dev
Note: If the end date is invalid or earlier than the start date, the range is ignored (a warning is shown) and the header is treated as a single date.
Note: Date range items are always treated as all-day — any time specification (
HH:mm) is ignored in the Timeline view.Note:
@repeatis ignored when used under a date range header.endDatetakes priority.
Usage
- Open a
.tmdextension file. - Open the TaskMark view using any of the following methods:
- Click the preview icon in the editor title bar
- Press
Ctrl+Shift+V(macOS:Cmd+Shift+V) - Run
TaskMark: Open Viewfrom the Command Palette (Ctrl+Shift+P)
- View the Calendar / Timeline interface in a new panel.
- Edit the
.tmdfile side-by-side; the view will reflect changes in real-time.
Extension Settings
You can also define global tag colors in your VS Code settings.json to reuse them across multiple .tmd files.
taskmark.tagColors: A JSON object mapping tag names (without#) to CSS color values. The same formats accepted inside the@tagsblock are supported here (hex,rgb()/rgba(),hsl()/hsla(), named colors).
{
"taskmark.tagColors": {
"Important": "#e74c3c",
"MTG": "#3498db",
"Dev": "#2ecc71"
}
}
Note: Tags defined within a .tmd file via the @tags block will take precedence over global settings.
taskmark.fontSize: Font size (in px) applied to the calendar views (Monthly/Weekly/Daily) and Gantt timeline labels. Default:14. Values outside the range10–24are clamped.
{
"taskmark.fontSize": 16
}
Feedback & Support
Found a bug or have a feature request? Please feel free to open an issue on our GitHub Repository. Your feedback helps make TaskMark better for everyone!
Project Structure
TaskMark/
├── src/
│ ├── extension.ts # Extension entry point
│ ├── TaskmarkPanel.ts # Webview panel management
│ ├── parser.ts # .tmd file parser
│ ├── gantt.ts # Gantt entity builder for the Timeline view
│ ├── messages.ts # Webview message types and shared helpers
│ ├── template.ts # Webview HTML template
│ ├── utils/
│ │ └── debounce.ts # Generic debounce utility
│ └── test/
│ ├── runTest.ts # Integration test runner
│ └── suite/
│ ├── index.ts # Test suite entry point
│ ├── parser.test.ts # Unit tests for the parser
│ ├── gantt.test.ts # Unit tests for Gantt entity building
│ ├── TaskmarkPanel.test.ts # Unit tests for panel messages and helpers
│ ├── template.test.ts # Unit tests for the HTML template
│ ├── debounce.test.ts # Unit tests for the debounce utility
│ └── extension.test.ts # Integration tests for the extension
├── media/
│ ├── main.js # Webview frontend logic
│ ├── style.css # Webview frontend styling
│ └── screenshots/ # Images used in README
├── syntaxes/
│ └── tmd.tmLanguage.json # Syntax highlighting definitions
├── sample.tmd # Sample file
└── package.json
Development
Running Tests
This project uses Mocha for testing. There are two ways to run the tests depending on your needs:
1. Unit Tests (Recommended / Fast)
Runs pure logic tests (e.g., the .tmd parser) without requiring the VS Code Extension host.
npm run test:unit
2. Integration Tests
Downloads a VS Code instance and runs tests inside the extension host environment.
npm test
Both test types are automatically run on every push and pull request via GitHub Actions CI.
Contributing
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch from
develop(git checkout -b feat/your-feature) - Make your changes and run the tests (
npm run test:unit) - Open a Pull Request targeting the
developbranch
Please open an issue first for significant changes so we can discuss the approach.
License
This project is licensed under the MIT License - see the LICENSE file for details.


