Real-Fruit-Snacks124 downloadsA calm, Todoist-like task manager for Obsidian — tasks stay as local Markdown files in your vault.
A calm, Todoist-like task manager for Obsidian — every task is a line in a plain Markdown file you own. No account, no external service, no database. Just your notes.
Graphite sits between lightweight checkbox plugins and heavy task-note systems: structured enough to run your day, small enough to stay quiet. Tasks live entirely inside your vault as human-readable Markdown, organized into one file per month — so your task history is greppable, portable, and yours forever.
Graphite is not a Todoist integration. It never connects to Todoist or any external service.
#label and //project inline tokens).graphite-completed code block.Real-Fruit-Snacks/Graphite.main.js, manifest.json, and styles.css from the latest release.<your-vault>/.obsidian/plugins/graphite/.Graphite: Open from the command palette (or click the ribbon icon).| Command | Default hotkey |
|---|---|
Graphite: Open |
— |
Graphite: Quick Add Task |
Ctrl/Cmd + Shift + A |
Graphite: Show Completed Tasks for Active Daily Note |
— |
Graphite: Insert Completed Tasks Block in Active Daily Note |
— |
Graphite: Normalize Labels |
— |
Graphite: Migrate old task file |
— |
While typing a task title, use #label to attach a label and //project to set the project.
Graphite keeps task data in a configurable folder (default _graphite_files/), one Markdown file per month, with attachments beside them:
_graphite_files/
├─ Data/
│ └─ 2026-07.md
└─ Attachments/
└─ <task-id>/
Each task is a Markdown list item with key:: value metadata:
- [ ] Write portfolio case study draft
id:: task-example
created:: 2026-07-05
due:: 2026-07-08
deadline:: 2026-07-10
project:: Client Work
priority:: P2
description:: Keep it short and visual.
labels:: writing, portfolio
Tasks without a project omit project:: and appear in Inbox. Completed tasks use [x] with a completed:: date. Graphite reads and writes only its own data folder, and preserves any lines or properties it doesn't recognize — so hand-editing is safe.
src/
├─ main.ts Plugin lifecycle, commands, events, Daily Notes
├─ taskStore.ts In-memory task state + queued Markdown persistence
├─ parser.ts Markdown → tasks (preserves unknown content)
├─ serializer.ts Tasks → Markdown (non-destructive round-trip)
├─ repeatUtils.ts Recurring-task scheduling
├─ views/ Board view, detail modal, composer, project/label modals
└─ ui/ Shared components (themed dropdown, buttons, icons, popover)
.graphite-* CSS with tokens mapped to Obsidian's theme variables; monospace "manifest" labels for structural chrome.The pure data layer (parser, serializer, recurring math, sorting, store) is covered by a Vitest suite.
npm install
npm run dev # watch build
npm run test # data-layer test suite
npm run verify # tests + typecheck + production build (pre-commit gate)
To auto-copy each build into a vault's plugin folder, set the GRAPHITE_PLUGIN_DIR environment variable or a gitignored .plugin-target file to that folder's path.
Bug reports and feature requests are welcome in Issues. If you're opening a pull request, run npm run verify first.
Graphite is a fork of the belki task manager by Yasin Aribuga, rebuilt and extended under the Terminal Workbench design language.
MIT — see LICENSE. Copyright © Yasin Aribuga (original belki project) and Real-Fruit-Snacks (Graphite fork).