Automatically export outstanding tasks from your Obsidian vault to CSV for ManicTime integration.
An Obsidian plugin that monitors your customer project files and automatically exports outstanding tasks to CSV format. Integrates seamlessly into your Obsidian workflow with command palette support, automatic file watching, and configurable export options.
This is a TypeScript port of the markdown-task-export C# console application, adapted for Obsidian with enhanced UI features.
- 🎨 Command Palette Integration - Export tasks with keyboard shortcuts
- 🔄 Automatic Export - Watch for file changes and auto-export
- ⚙️ Settings Panel - Fully configurable export behavior
- 🎯 Ribbon Icon - Quick access from sidebar
- 📊 Status Bar - Shows last export time
- 🔔 Notifications - Success/error feedback
- 🚀 Debounced Updates - Efficient file watching
- 📁 Selective Monitoring - Only watches relevant folders
- ⚡ High Performance - Async processing, file caching
Plugin not yet published to community store
- Open Obsidian Settings
- Navigate to Community Plugins
- Search for "Task Export Tool"
- Click Install and Enable
- Download the latest release from GitHub Releases
- Extract
main.js,manifest.json, andstyles.cssto:VaultFolder/.obsidian/plugins/task-export-to-csv/ - Reload Obsidian
- Enable plugin in Settings → Community Plugins
# Clone repository
git clone https://github.com/tailormade-eu/obsidian-task-export-plugin.git
cd obsidian-task-export-plugin
# Install dependencies
npm install
# Build plugin
npm run build
# For development with auto-reload
npm run dev- Install and enable the plugin
- Open Settings → Task Export Tool
- Configure "Customers Folder" path (default:
Customers) - Press
Ctrl/Cmd + P→ "Export Outstanding Tasks" - Find
outstanding_tasks.csvin your vault root
Via Command Palette:
- Press
Ctrl/Cmd + P - Type "Export Outstanding Tasks"
- Press Enter
- Notification shows export success
Via Ribbon Icon:
- Click the export icon (📊) in left sidebar
- Open Settings → Task Export Tool
- Enable "Auto Export"
- Choose trigger: "On Save" or "On File Change"
- Edit any
.mdfile in Customers folder - CSV automatically updates in background
View last export time and status in bottom status bar:
- ✅ "Last export: 2 minutes ago" (success)
⚠️ "Export failed" (error - click for details)
| Setting | Description | Default | Type |
|---|---|---|---|
| Output Path | CSV file location (relative to vault) | outstanding_tasks.csv |
Text |
| Customers Folder | Root folder with customer files | Customers |
Text |
| Auto Export | Enable automatic export | false |
Toggle |
| Export on Save | Trigger on file save | true |
Toggle |
| Export on Modify | Trigger on any modification | false |
Toggle |
| Show Notifications | Display export notifications | true |
Toggle |
| CSV Delimiter | Choose comma or semicolon delimiter | , (comma) |
Dropdown |
| Compress Levels | Remove empty hierarchy columns | false |
Toggle |
| Include Header | Include CSV header row in output | true |
Toggle |
| Debounce Delay | Wait time after changes (seconds) | 3 |
Number |
Note for European Users: If Excel doesn't open the CSV correctly, try changing the delimiter to semicolon in settings. Many European locales use semicolon as the standard CSV delimiter since comma is used as the decimal separator.
Settings → Plugin Options → Task Export Tool
| Command | Description | Default Hotkey |
|---|---|---|
| Export Outstanding Tasks | Manually trigger export | None |
| Toggle Auto-Export | Enable/disable automatic export | None |
| Open Export Settings | Jump to plugin settings | None |
Assign hotkeys via: Settings → Hotkeys → Search "Task Export"
YourVault/
├── Customers/ ← Configured folder
│ ├── Customer A/
│ │ ├── Project 1.md
│ │ └── Project 2.md
│ └── Customer B/
│ └── SubFolder/
│ └── Project X.md
├── outstanding_tasks.csv ← Output file
└── .obsidian/
└── plugins/
└── task-export-to-csv/
Standard Markdown task checkboxes:
## Section
- [ ] Outstanding task
- [x] Completed task (ignored)
- [ ] Task with sub-items
- [ ] Sub-task (nested)
### Subsection
- [ ] Another taskCSV with dynamic columns (comma-separated by default, configurable to semicolon):
CustomerName,Level1,Level2,Level3,Task
Customer A,Project 1,Section,Outstanding task
Customer A,Project 1,Section,Task with sub-items
Customer A,Project 1,Section,Sub-task (nested)
Customer A,Project 1,Section,Subsection,Another taskNotes:
- Level columns: The plugin uses generic
Level1..LevelNcolumns for hierarchical path data. These contain, in order: any subfolder segments under the customer folder, then the project (markdown file) name, followed by markdown header segments and parent task text as present. - Compression: When
Compress Levelsis enabled the CSV will omit empty trailingLevelcolumns for each row; when disabled rows are padded to the maximum level depth. - The delimiter can be changed to semicolon (
;) in the plugin settings for better compatibility with European Excel versions.
Example
For a file under the Customers folder such as Customers/<CustomerName>/<Subfolder...>/<ProjectName>.md containing a top-level task in a Section, a produced CSV row will look like:
CustomerName,Level1,Level2,Task
<CustomerName>,<Subfolder>,<ProjectName>,Section - Outstanding task- TypeScript
- Obsidian Plugin API
- esbuild (bundling)
- Node.js (development)
obsidian-task-export-plugin/
├── src/
│ ├── main.ts # Plugin entry point
│ ├── settings.ts # Settings interface
│ ├── exporter.ts # Export logic
│ ├── parser.ts # Markdown parsing
│ ├── csv-writer.ts # CSV generation
│ ├── file-watcher.ts # File monitoring
│ └── types.ts # TypeScript interfaces
├── manifest.json # Plugin metadata
├── package.json # Dependencies
├── tsconfig.json # TypeScript config
├── esbuild.config.mjs # Build config
└── README.md
app.vault.getMarkdownFiles()- File enumerationapp.vault.read(file)- File readingapp.vault.adapter.write()- CSV writingapp.workspace.on('file-modified')- File watchingaddCommand()- Command registrationaddSettingTab()- Settings UIaddRibbonIcon()- Sidebar iconaddStatusBarItem()- Status bar
- File Caching: Only re-parse modified files
- Debouncing: Waits for changes to settle (configurable delay)
- Async Processing: Non-blocking file operations
- Selective Watching: Only monitors Customers folder
- Incremental Updates: Smart change detection
- Initial scan of 100 files: < 2 seconds
- Auto-export after file change: < 500ms
- Memory footprint: < 10MB
- CPU usage: Minimal (idle when no changes)
npm install# Development build with watch mode
npm run dev
# Production build (minified)
npm run build
# Type checking
npm run check
# Lint code
npm run lint# Run tests
npm test
# Run tests with coverage
npm run test:coverageInstall Hot Reload Plugin for automatic plugin reload during development.
- Open Developer Tools:
Ctrl/Cmd + Shift + I - Check Console tab for logs
- Use
console.log()in code - Set breakpoints in Sources tab
- Check console for errors:
Ctrl/Cmd + Shift + I - Verify files in
.obsidian/plugins/task-export-to-csv/:main.jsmanifest.jsonstyles.css(optional)
- Check Obsidian version compatibility in
manifest.json - Disable and re-enable plugin
- Verify "Auto Export" is enabled in settings
- Check "Customers Folder" path is correct
- Ensure files are
.mdformat - Check console for errors
- Try manual export first
- Verify output path is writable
- Check at least one unchecked task exists
- Look for error notifications
- Check console for detailed errors
- Try different output location
- Disable "Export on Modify" (use "On Save" instead)
- Increase "Debounce Delay" in settings
- Check file cache is working (look for "Using cached" in console with verbose logging)
- Reduce number of files in Customers folder
- Basic task extraction
- Command palette integration
- Auto-export on file changes
- Settings panel
- Export templates
- Multiple output formats (JSON, XML)
- Task filtering (by date, tags)
- Statistics dashboard
- Direct ManicTime API integration
- Custom task patterns
- Scheduled exports
- Export history
Contributions welcome!
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Add tests for new functionality
- Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Use TypeScript strict mode
- Follow Obsidian plugin conventions
- Add JSDoc comments for public APIs
- Keep methods focused and testable
- Write tests for new features
- markdown-task-export - C# console application version
MIT License - See LICENSE file for details
- 🐛 Report Bugs: GitHub Issues
- 💬 Discussions: GitHub Discussions
- 📖 Documentation: Wiki
- ⭐ Star the repo if you find it useful!
- Built with the Obsidian Plugin Developer Guide
- Inspired by the need for better task tracking integration
- Thanks to the Obsidian community
Created for personal use in managing customer project tasks with time tracking integration.