TaskGraph
Task list that knows what depends on what and tells you what to do first
TaskGraph
A personal task list that knows what depends on what. Drop tasks in one line each, link the ones that have to happen in order, and the app tells you what is ready right now and what it unblocks.
![]()
What it does
Quick-add line at the top: one line, Enter, done.
Buy pipes #house !1 after:"Measure the wall" before:Install due:friSyntax Meaning #tagadds a tag (any number) !1!2!3(or!high!normal!low)priority after:X(alsodep:,needs:)the task waits for X; X is created when it does not exist yet before:X(alsoblocks:,then:)X waits for the task due:2026-09-20,due:today,due:tomorrow,due:fri,due:+3,due:2wdue date @project(alsoproject:,in:)puts the task into a project; without it the task lands in the project currently on screen after:"Two words"quote values with spaces Task references match an existing title exactly, then by prefix, then by substring.
Projects — every task may belong to one project; the sidebar switches between All projects and each one (with ready / open counts), and the canvas, the plan and the counts follow. With all projects on screen the canvas draws each project as a labelled band, dependencies may cross projects.
Canvas — the dependency graph laid out left to right: finished tasks on the far left, then what is ready (green bar), then what waits for it (amber bar). Drag a card to pin it, drag from a card's port on its right edge (or Ctrl+drag) onto another card to say "this first, then that", click an edge and press Delete to unlink, double-click empty space to add a task there. Wheel zooms, dragging empty space or the right mouse button pans. Auto layout unpins everything, Fit frames the whole graph. Loops are refused.
Plan — "Do now" ordered by priority, how many tasks each one unblocks, due date and age, with the reason next to every task; "Waiting" with what each task waits for; "Done" history. One click ticks a task off and the next ones open up.
Inspector — title, owner, workflow status, priority, due date, tags, notes, evidence, prerequisites and dependents with one-click unlinking, an autocomplete box for adding a prerequisite. Notes are Markdown: they are rendered by default (headings, lists, task boxes, quotes, fenced code,
code, bold, italic, links) and a click turns them into the editor; Esc or clicking elsewhere renders them again. Evidence uses the same Markdown view and editor. Task lists show a workflow status chip and the owner session/agent name.Status board (
Ctrl+B) — columns todo / in progress / review / blocked / done (done keeps the last 7 days). Cards show title, project, priority, owner and how long the task has had its status (?for tasks from before 0.9). Filter by project (case does not matter) and owner,Nobodyfor unassigned (both remembered); click a card for its evidence and notes. Drag a card to another column, use its context menu or pressCtrl+←/→to change its status; the arrow keys move between cards. Stale cards get a warning border, their reason and go first: in progress or review with no change for more than 3 days, blocked for more than 1 day. Both thresholds are boxes on the board (decision 0004). A task from before 0.9 is not judged until it changes (decision 0005), and a done task without a recorded finish time is dated by its creation (decision 0006). The stale thresholds in the board header apply on Enter or when the box is left; a value that is not a number of days shows red.Command palette (
Ctrl+K) across tasks, tabs and actions, plusCtrl+Nnew task,Ctrl+Dmark done,F2rename,Ctrl+Hshow/hide done,Ctrl+Shift+Aauto layout,Ctrl+0fit,Ctrl+Shift+Ltheme,Ctrl+Shift+NAI secretary.Board, Log and MCP are sections of their own, opened from the header (or
Ctrl+B/Ctrl+L/Ctrl+M, or the palette) and filling the whole panel: the status board, the live log with level and text filters next to the files on disk, and everything about the MCP server.Theme switch System / Light / Dark (
Ctrl+Shift+Lcycles; System follows Windows live), self-update from the TomLabs app store.
Data
- Tasks:
%APPDATA%\TaskGraph\tasks.json— plain JSON, saved after every change.TASKGRAPH_DATA_DIRpoints the app at another data folder (tasks, settings and inbox),TASKGRAPH_DATAat another tasks file. - Settings:
%APPDATA%\TaskGraph\settings.json(theme, update channel, log level, show done, update feed, the board's filters, and"Stale": { "ActiveDays": 3, "BlockedDays": 1 }for when a task counts as stale). - Every task records
StatusChangedAt(when its workflow status last changed) andUpdatedAt(when any of its fields last changed; moving the card on the canvas does not count). Tasks saved before 0.9 have neither until they change. - Inbox:
%APPDATA%\TaskGraph\inbox\*.json, see below. - Logs:
%LOCALAPPDATA%\TaskGraph\logs\taskgraph-<date>.log, 14 days kept.
Adding tasks from outside — the inbox
The app rewrites tasks.json after every change, so writing that file from another process while TaskGraph runs
would be overwritten by the next save (the app reloads the file when it notices the change, so the edit is not lost
silently, but the two copies still race). Drop a *.json file into %APPDATA%\TaskGraph\inbox\ instead: it is
imported live (and at start-up) and the file is deleted afterwards, so the folder works as a queue. A file that
cannot be parsed is renamed to *.json.invalid rather than retried forever, and single backslashes in Windows
paths are tolerated.
A file holds one task or an array of them; each task is either a quick-add line or the structured form:
[
"Buy pipes #house !1 after:\"Measure the wall\" due:fri @Bathroom",
{
"title": "Sow basil",
"project": "Herb calendar",
"notes": "South window",
"owner": "Gardening session",
"status": "in-progress",
"evidence": "- Seeds ordered; delivery confirmed.",
"priority": "high",
"tags": ["garden"],
"due": "+7",
"dependsOn": ["Buy seeds"],
"done": false
}
]
line(or a bare string) goes through the same parser as the input box in the app, so the syntax table above applies. A project whose name contains spaces must be quoted there (@"Herb calendar"); theprojectfield never needs that.- In the structured form everything except
titleis optional and only the fields present are applied, so the same file also updates a task. The match is bytitlewithinproject— which is whydependsOntakes titles rather than ids, since an outside script cannot know the ids. Unknown titles are created as new tasks, and a dependency that would close a loop is skipped. dueaccepts what the quick-add line accepts (2026-09-20,today,fri,+7);""clears it.owneris a free-text session/agent name;evidenceis Markdown. Empty strings clear either field, and omitted fields retain existing values. These fields andstatuscan also accompany a quick-addline.statusistodo,in-progress,review,doneorblocked. It describes workflow progress independently of dependency readiness. Settingdonecompletes the task and records the completion time; any other status reopens it and clears that time. A legacydone: truealso sets workflow status todone, anddone: falsereopens a completed task astodo. When bothstatusanddoneare supplied,statustakes precedence.- Existing task files keep the version-1 envelope and their original fields (including unknown extensions).
A missing status reads as
todoor, for a completed task,done; unset owner, evidence and implicit status are omitted on save. See the data model decision.
From PowerShell:
$task = @{ title = 'Sow basil'; project = 'Herb calendar'; priority = 'high'; dependsOn = @('Buy seeds') }
$task | ConvertTo-Json | Set-Content "$env:APPDATA\TaskGraph\inbox\sow-basil.json" -Encoding utf8
MCP server — letting Claude work with the list
TaskGraph hosts an MCP server inside the app (http://127.0.0.1:5230/mcp, streamable HTTP, loopback only), so an
agent works on the same list the window shows and its changes appear immediately. Connect it with:
claude mcp add --transport http taskgraph http://127.0.0.1:5230/mcp
The MCP tab shows whether the server listens, the command above, the tools and the calls Claude has made.
| Tool | What it does |
|---|---|
list_tasks |
tasks in plan order; filter by project, dependency state, owner, workflow status, text, or staleOnly |
list_stale_tasks |
stuck work, most overdue first: in progress or review with no change, or blocked, for longer than the thresholds; optional project and owner; each with since, staleFor and reason |
get_task |
one task with its brief in notes, owner, status, evidence and dependencies |
list_projects |
the projects that exist, with ready / open / done counts |
add_task |
adds a task from a quick-add line or fields; on an existing title in that project it overwrites the fields it is given (use update_task to change a few) |
update_task |
takes project and title plus any of newTitle, notes, priority, due, tags, owner, status, evidence; changes only those, "" (or [] for tags) clears one; never creates a task |
append_notes |
takes project, title and markdown; adds the block to the end of the notes after an empty line |
claim_task |
takes project, title and owner; assigns the session/agent and sets status to in-progress |
report_task |
takes project, title, evidence Markdown and status (review or done, default review); replaces evidence and reports unblocked tasks |
complete_task |
marks a task done (or reopens it) and reports what that unblocked |
link_tasks / unlink_tasks |
{first, then} makes first a prerequisite of then; {task, dependsOn: [titles]} makes each title a prerequisite of task; a loop is refused and nothing is linked |
delete_task |
deletes a task together with the links to it |
Tasks are addressed by title (optionally inside a project), never by id — an outside caller has no way to know ids.
priority takes high / normal / low (also urgent, hi, h, medium, med, n, lo, l), 1 / 2 / 3
(a number or a string) or !1 / !2 / !3 as in a quick-add line. Every argument error names the tool's fields, required ones first, and shows an example call, also
when the arguments could not be read at all (a wrong type or name). update_task checks everything before it changes
anything, so a rejected call leaves the task as it was (decision 0003).
In update_task a field you want to leave alone is omitted or null; '' clears notes, due, owner and evidence
(priority: '' counts as not given), and changed lists only the fields whose value really changed. In the link tools
"" and [] for the shape you do not use count as absent.
For an agent handoff, put the complete brief in notes with add_task, then send a message pointing to the project
and task title. The receiving agent reads get_task, calls claim_task, and reports commits, tests and links with
report_task (review when a review is needed, done when finished). Notes remain the brief; evidence is replaced
by each report. add_task also accepts owner, status and evidence (empty owner/evidence clears them).
Responses include status, done and any owner/evidence; completedAt, statusSince and updatedAt are
present when recorded, and stale carries the reason when the task is stale. state still
means dependency readiness (ready, blocked, done). For example, an explicitly blocked workflow may still
have dependency state ready. list_tasks matches owner names exactly, case-insensitively (owner: "" selects
unowned tasks). Its default state filter is open, or all when a workflow status is given, so status: "done"
finds completed tasks without needing a second filter. Explicit state and status filters are combined.
"server" in settings.json holds enabled, port and an optional token; with a token set, /mcp requires
Authorization: Bearer <token>. GET /health on the same port answers the usual status / version / name.
The server only runs while the app runs. Closing the window therefore does not stop it: while the server is listening, the close button (and Alt+F4) hides TaskGraph to the system tray (decision 0007). Starting TaskGraph again shows that window instead of opening a second copy (decision 0008). A click on the tray icon brings the window back; its menu shows the MCP status, switches "Close to tray" (on by default, also in the palette), installs a downloaded update and quits. Quit (tray menu, Ctrl+Q or the palette) really exits and stops the server. When TaskGraph is not running, the inbox folder above is the way in, and it is also the simpler option for a one-off shell script.
Claude Code hooks
TaskGraph 0.6 had an Agents section fed by four Claude Code hooks posting to /api/agents/hook. The section is gone
since 0.7.0 (decision 0002): on start TaskGraph removes those four
hook entries from ~/.claude/settings.json (CLAUDE_CONFIG_DIR is honoured) and touches nothing else in the file;
before that first rewrite the original is copied to settings.json.taskgraph-0.6.bak next to it. A
copy run with TASKGRAPH_DATA_DIR skips this unless CLAUDE_CONFIG_DIR is set too. The old
%APPDATA%\TaskGraph\agents\ folder is no longer read and can be deleted.
Build
git clone https://tomlabscloud.visualstudio.com/TaskGraph/_git/TaskGraph
dotnet build src/TaskGraph/TaskGraph.csproj
dotnet test TaskGraph.slnx
dotnet publish -c Release produces the portable single-file TaskGraph.exe. tools/Make-Icons.ps1
regenerates icon.ico / icon.png. Releases are built by azure-pipelines.yml through the app store's
publish-desktop-app.yml template: pushes to master feed the nightly channel, v* tags the stable one. The
pipeline signs update.json with the UPDATE_SIGNING_KEY secret (ECDSA P-256); the app only accepts manifests
signed by the matching public key embedded in App.axaml.cs.
The version comes from VersionPrefix in the csproj and is shown in the header; see CHANGELOG.md.
Style
The UI follows the TomLabs "ops console" look shared with IISBlitz (Styles/Tokens.axaml, Styles/Controls.axaml):
dense, hairline borders, one cyan accent, system UI font with monospace for anything technical.
Verifying the UI
TaskGraph embeds the TomLabs.UiAutomation channel: tomlabs-ui start --project src/TaskGraph/TaskGraph.csproj builds
Release, starts the app headless on a fresh copy of tests/ui-fixture and answers on http://127.0.0.1:47831.
Besides the generic endpoints (/screenshot, /tree, /click, /type, /get, …) the app adds /do/tab?arg=canvas|plan|board|logs|mcp
(canvas and plan are tabs of the task workspace, logs and mcp are sections), /do/select?arg=<task title>, /do/project?arg=<name>|all and /do/add?arg=<quick-add line>; the tab argument also takes mcp.
For the tray: /do/close (the window's close button), /do/tray (window visible, tooltip, menu items),
/do/open (a click on the tray icon) and /do/quit (the menu's Quit; the process exits before it answers).
Work phases over MCP
Tasks optionally track phase: brief | work | tests | review | merged | deployed. Status and dependency
readiness retain their existing meaning. Use update_task with phase to set it, or phase: "" to clear it;
omitted/null leaves it unchanged. claim_task defaults an untracked task to brief. report_task accepts phase,
and a review report enforces at least review, preserving an existing later phase when none is supplied.
list_tasks accepts a phase filter alongside its existing state/status filters. list_tasks and get_task
return phase, phaseSince and lastActivityAt (latest status, phase, evidence or notes change), with null for
unknown values on legacy tasks. A done report does not automatically mean merged or deployed.
Changelog
Changelog
All notable changes to TaskGraph, newest first.
0.13.0 — 2026-10-21
Added
- AI secretary: describe a task, clarify prerequisites and successors, review and edit proposals, and apply steps directly to the dependency graph.
- Keyboard shortcut
Ctrl+Shift+Nand command palette action "Ask the secretary". - "Break this down" command palette action for selected tasks to decompose an existing goal.
- Local Ollama provider support by default without sending data off the PC.
- Optional Anthropic Claude API provider with explicit user consent and DPAPI-protected key storage.
0.12.0 — 2026-10-21
Changed
- Internal shared core library
TomLabs.TaskGraph.Coreextracted with no user-visible change or behavior change. - Task model,
tasks.jsonserialization, dependency engine, stale rules, and inbox parsing moved to core. - Introduced
TaskFileReader.TryReadfor safe read-only snapshot inspection andInboxWriter.Dropfor atomic inbox submissions from outside processes.
0.11.0 — 2026-10-19
Added
- Optional work phases: brief, work, tests, review, merged and deployed, with a timestamp and a read-only task chip.
- MCP
update_taskandreport_taskacceptphase;list_tasksfilters by phase. Task responses includephase,phaseSinceandlastActivityAt(status, phase, evidence or notes changes). - Claiming an untracked task starts at brief; reporting review advances to at least review while preserving an existing later phase. Existing workflow statuses and legacy task files retain their behavior.
0.10.1 — 2026-10-13
Fixed
- Starting TaskGraph while it runs (also hidden in the tray) now shows the running window instead of opening a second copy without the MCP server. An update still restarts cleanly.
- The tray tooltip no longer shows "MCP on" without a port for a moment after start.
- The tray notice appears on the screen the window was on, and its timer stops when you click it.
0.10.0 — 2026-10-13
Added
- TaskGraph lives in the system tray: closing the window hides it there while the MCP server runs, so agents keep their task list. A click on the tray icon opens the window; its menu shows the MCP status and offers Quit.
- "Close to tray" setting, on by default (tray menu, command palette,
settings.json); the first hide shows a short notice. - Quit with Ctrl+Q or from the palette; it saves and stops the server.
- A downloaded update can be installed from the tray menu.
0.9.3 — 2026-10-13
Fixed
- Board: a done task without a recorded finish time is dated by its creation, so one created this week stays in the done column and an old one counts as done earlier.
- Board: the stale thresholds are applied on Enter or when you leave the box, not after every keystroke; a value that is not a number of days is shown in red and not applied.
0.9.2 — 2026-10-13
Fixed
tasks.jsonno longer stores values the app computes (selection, ready, layer, score and its hint, what a task waits for). A file written by an older version still loads; the next save leaves those values out.- Board: tasks from before 0.9 are no longer flagged stale on the first start; they are judged once they change.
- Board: done tasks without a recorded finish time count as "done earlier" instead of staying in the done column.
- Board: the
Nobodyowner filter no longer resets itself, and the project filter ignores case.
0.9.1 — 2026-10-13
Fixed
- MCP: only a wrong call is answered with the tool's fields and an example; an internal error is reported as an error.
- MCP
link_tasks/unlink_tasksaccept "" and [] in the fields of the shape you are not using. - MCP
update_taskreports only the fields whose value really changed and saves nothing when nothing changed.
Changed
- MCP priority also accepts urgent, hi, medium, lo and their short forms; the docs say "omit or null to leave a field alone".
0.9.0 — 2026-10-13
Added
- Status board (
Ctrl+B, header button, palette): columns todo / in progress / review / blocked / done, cards with project, priority, owner and time in status, filters by project and owner, the evidence of the selected card. Drag a card, use its context menu or pressCtrl+←/→to change its status; the arrow keys move between cards. - Stale flags: in progress or review with no change for more than 3 days, blocked for more than 1 day. Stale cards
are marked and go first; both thresholds are set on the board and saved in
settings.json. - Every task records when its status last changed and when it last changed at all. Tasks saved before 0.9 show
?until they change. - MCP
list_stale_tasks, andstaleOnlyforlist_tasks. Task answers carrystatusSince,updatedAtandstalewhen known.
0.8.0 — 2026-10-13
Added
- MCP
update_task: changes only the fields it is given (title, notes, priority, due, tags, owner, status, evidence) and leaves the rest of the task alone. A rejected value changes nothing. - MCP
append_notes: adds a Markdown block to the end of a task's notes. link_tasksandunlink_tasksalso take{task, dependsOn: [titles]}, likeadd_task;{first, then}keeps working. A loop anywhere in the list links nothing.
Changed
priorityaccepts1/2/3as a number or a string and!1/!2/!3, next tohigh/normal/low.- Every MCP argument error lists the tool's fields and an example call, including arguments of the wrong type that used to answer only "An error occurred invoking …".
add_task's description says that it overwrites the given fields of an existing task.
0.7.0 — 2026-10-13
Removed
- The Agents section (Claude Code sessions, request history and summaries), its header chips,
Ctrl+Gand its palette entries. AgentOffice shows what the sessions do; TaskGraph keeps the task list and the handoff tools (owner, status, evidence,claim_task/report_task).
Changed
- On start TaskGraph removes the four Claude Code hooks it added to
~/.claude/settings.json(the ones posting to/api/agents/hook) and leaves every other setting and hook as it was; the original file is kept once assettings.json.taskgraph-0.6.baknext to it. The old%APPDATA%\TaskGraph\agents\folder is no longer used and can be deleted.
0.6.5 — 2026-10-09
Added
- Task handoffs with an optional session/agent owner, workflow status (
todo,in-progress,review,done,blocked) and Markdown evidence; completing or reopening a task keeps its status in step. - MCP
claim_taskandreport_tasktools, owner/status filters inlist_tasks, and handoff fields inadd_task,get_taskand inbox imports. Keep the brief in notes and point messages to the task. - Status chips and owner names in the task lists, editable owner/status in the inspector, and evidence rendered and edited as Markdown alongside notes. Existing task files retain their data without adding unset handoff fields.
0.6.4 — 2026-09-24
Changed
- The self-update library comes from nuget.org (TomLabs.AutoUpdate 0.3.2) instead of a git submodule; updates work as before.
0.6.3 — 2026-09-24
Changed
- The theme switch now has a System option that follows Windows live; earlier Light/Dark choices were reset to System once.
Added
- The header button shows the current mode (half circle = System, sun, moon); the command palette can set each mode directly.
0.6.2 — 2026-09-24
Changed
- A request in Agents shows only what came of it — the summary, or the counts (
3 files · 1 command · 4 tool calls) while there is none. The prompt and the commands are no longer in the listing, which is now readable at a glance; clicking a request opens them, together with the files it changed.
0.6.1 — 2026-09-23
Changed
- A request's summary is one line (at most about eight words) instead of up to three bullet points; a longer one is cut on the card and shown whole in the tooltip. Summaries written by 0.6.0 are joined into one line.
0.6.0 — 2026-09-23
Added
- Agents section (
Ctrl+G, the robot in the header): what the Claude Code sessions on this machine are doing. Live shows the active sessions side by side, each a column of the requests typed into it — the prompt, whether the agent works, waits for you, is done or was stopped, the files it changed and the commands it ran. History lists every session of the last 90 days by day, with the whole flow of the selected one. - The history comes from Claude Code's own transcripts, read in the background and cached, so it also covers the time TaskGraph was closed.
- Connect Claude Code adds hooks to
~/.claude/settings.jsonso a new request shows up at once and an agent that waits for a permission or an answer is marked waiting for you — also as a chip in the header. - A finished request gets 1–3 bullet points from Claude Haiku (Messages API with a key, otherwise the
claudeCLI); older ones have a Summarise button."agents": { "summaries": "off" }insettings.jsonturns it off.
0.5.2 — 2026-09-23
Changed
- The log starts with the build and the process id (
TaskGraph 0.5.2 starting as pid 1234), which is what telling two instances apart starts from. TASKGRAPH_DATA_DIRalso moves the log folder, so a second instance or a test run no longer writes into the log of the installed app.
0.5.1 — 2026-09-23
Fixed
- A copy of the app could stay running without a window after an update restart: closing down waited on the web host from the UI thread, which is the very thread a tool call in flight needs. Shutdown no longer blocks, a watchdog ends the process if anything stalls, and the process is ended explicitly once the window is gone. A lingering copy also held the executable open, so the next update could not replace it.
settings.jsonis read case-insensitively, so a hand-written{ "server": { "port": 5231 } }is honoured instead of silently falling back to the defaults.
0.5.0 — 2026-09-23
Added
- Notes take Markdown and are rendered by default: headings, bullet, numbered and task lists, quotes, fenced code,
rules,
code, bold, italic and links, drawn with the app's own type and colours. A click on the note opens the raw text in its place; Esc or moving the focus away renders it again. Text that only looks like markup (2 * 3 * 4,a_variable_name) is left alone.
0.4.1 — 2026-09-23
Fixed
- The header lost the log button: the theme button had been placed in a 10 px spacer column and covered it. The buttons now sit in one row with a separator between "acts on what is on screen" and "opens a section".
0.4.0 — 2026-09-23
Changed
- The log and the MCP server are sections of their own, opened from the header (
Ctrl+L,Ctrl+M, or the command palette) and filling the whole panel, instead of being tabs squeezed next to the canvas with the inspector beside them. Canvas and Plan stay tabs of the task workspace. - The app log no longer drowns in Kestrel and MCP request lines; those sources log from Warning up.
- Picks up TomLabs.AutoUpdate 0.3.0: a release published while the app was downloading the previous one no longer fails with "Downloaded file failed the SHA-256 check" — the updater re-reads the manifest and takes the newer build.
0.3.1 — 2026-09-23
Changed
- Switching the project frames the new graph automatically, instead of leaving the zoom and pan of the previous one behind; the fit now includes the project bands, so their labels are never cut off.
0.3.0 — 2026-09-23
Added
- MCP server hosted inside the app (
http://127.0.0.1:5230/mcp, loopback only): Claude can list what is ready, add tasks, complete them (and hear what that unblocked), link and unlink them, and everything appears in the window at once because it is the same list. Connect withclaude mcp add --transport http taskgraph http://127.0.0.1:5230/mcp. - MCP tab: whether the server listens, the connect command and the
.mcp.jsonsnippet, the tools and the recent calls with their result. GET /healthon the same port, answeringstatus,version,nameand the task counts."server"insettings.json(enabled,port, optional bearertoken).
0.2.1 — 2026-09-23
Fixed
- A task file changed by another process (a script writing
tasks.jsondirectly, a second instance) is now noticed and reloaded while the app runs, instead of staying invisible until a restart — and instead of being overwritten by the next save. The inbox stays the safe way to add tasks from outside; this is the safety net under it.
0.2.0 — 2026-09-23
Added
- Inbox: tasks can be added from outside while the app runs. Drop a
*.jsonfile into%APPDATA%\TaskGraph\inbox\with one task or an array of them, either as a quick-add line or as fields (title,project,notes,priority,tags,due,done,dependsOnby title); the file is imported live and then deleted, and a task with a title that already exists in that project is updated instead of duplicated. A file that cannot be parsed is renamed to*.json.invalid. Until now the running app overwrote anything written intotasks.jsondirectly.
0.1.1 — 2026-09-21
Fixed
- Typing a project name in the inspector crashed the app (the autocomplete list was rebuilt under the open drop-down) and created a transient project for every prefix typed; the project is now applied on Enter or when the box loses focus.
- A maximized window no longer hangs past the screen edge (sidebar text and the title bar were cut off).
Added
- Scripted UI channel (TomLabs.UiAutomation,
TASKGRAPH_AUTOMATION=<port>,--headless) with/do/tab,/do/select,/do/project,/do/add;TASKGRAPH_DATA_DIRpoints the app at another data folder (tests/ui-fixturefor the tool).
0.1.0 — 2026-09-18
Added
- Quick-add line:
Buy pipes @house #diy !1 after:"Measure the wall" before:Install due:fricreates the task, its project, tags, priority, due date and dependencies in one go; unknown referenced tasks are created too. - Projects: a sidebar switcher with ready / open counts scopes the list, the canvas and the plan to one project; with all projects on screen the canvas groups the cards into labelled bands. Tasks move between projects in the inspector or through the palette.
- Canvas: the dependency graph laid out left to right (ready work first, then what waits for it). Drag cards to pin them, drag from a card's port (or Ctrl+drag) onto another card to link them, click an edge and press Delete to unlink, double-click empty space to add a task there, wheel to zoom, drag or right-drag to pan.
- Plan tab: "Do now" ordered by priority, how much each task unblocks, due date and age, with the reason shown; "Waiting" with what each task waits for; "Done" history.
- Inspector: title, priority, due date, tags, notes, prerequisite and dependent lists with one-click unlinking, autocomplete for adding a prerequisite.
- Loops are refused when linking tasks; finished tasks can be hidden.
- Command palette (Ctrl+K) across tasks, tabs and actions; keyboard shortcuts for the common moves.
- Light / dark theme following the OS by default, remembered when switched.
- Tasks stored as JSON in
%APPDATA%\TaskGraph\tasks.json, saved on every change. - Logs tab: live log with level and text filters, log files with tail view; daily rolling files in
%LOCALAPPDATA%\TaskGraph\logs. - Self-update through TomLabs.AutoUpdate from the TomLabs app store (stable / nightly channel).