TomLabs Apps
← All applications

TaskGraph

Task list that knows what depends on what and tells you what to do first

windows desktop tasks avalonia Personal

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.

icon

What it does

  • Quick-add line at the top: one line, Enter, done.

    Buy pipes #house !1 after:"Measure the wall" before:Install due:fri
    
    Syntax Meaning
    #tag adds a tag (any number)
    !1 !2 !3 (or !high !normal !low) priority
    after:X (also dep:, needs:) the task waits for X; X is created when it does not exist yet
    before:X (also blocks:, then:) X waits for the task
    due:2026-09-20, due:today, due:tomorrow, due:fri, due:+3, due:2w due date
    @project (also project:, 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, Nobody for unassigned (both remembered); click a card for its evidence and notes. Drag a card to another column, use its context menu or press Ctrl+←/→ 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, plus Ctrl+N new task, Ctrl+D mark done, F2 rename, Ctrl+H show/hide done, Ctrl+Shift+A auto layout, Ctrl+0 fit, Ctrl+Shift+L theme, Ctrl+Shift+N AI 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+L cycles; 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_DIR points the app at another data folder (tasks, settings and inbox), TASKGRAPH_DATA at 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) and UpdatedAt (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"); the project field never needs that.
  • In the structured form everything except title is optional and only the fields present are applied, so the same file also updates a task. The match is by title within project — which is why dependsOn takes 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.
  • due accepts what the quick-add line accepts (2026-09-20, today, fri, +7); "" clears it.
  • owner is a free-text session/agent name; evidence is Markdown. Empty strings clear either field, and omitted fields retain existing values. These fields and status can also accompany a quick-add line.
  • status is todo, in-progress, review, done or blocked. It describes workflow progress independently of dependency readiness. Setting done completes the task and records the completion time; any other status reopens it and clears that time. A legacy done: true also sets workflow status to done, and done: false reopens a completed task as todo. When both status and done are supplied, status takes precedence.
  • Existing task files keep the version-1 envelope and their original fields (including unknown extensions). A missing status reads as todo or, 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

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+N and 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.Core extracted with no user-visible change or behavior change.
  • Task model, tasks.json serialization, dependency engine, stale rules, and inbox parsing moved to core.
  • Introduced TaskFileReader.TryRead for safe read-only snapshot inspection and InboxWriter.Drop for 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_task and report_task accept phase; list_tasks filters by phase. Task responses include phase, phaseSince and lastActivityAt (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.json no 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 Nobody owner 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_tasks accept "" and [] in the fields of the shape you are not using.
  • MCP update_task reports 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 press Ctrl+←/→ 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, and staleOnly for list_tasks. Task answers carry statusSince, updatedAt and stale when 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_tasks and unlink_tasks also take {task, dependsOn: [titles]}, like add_task; {first, then} keeps working. A loop anywhere in the list links nothing.

Changed

  • priority accepts 1/2/3 as a number or a string and !1/!2/!3, next to high/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+G and 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 as settings.json.taskgraph-0.6.bak next 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_task and report_task tools, owner/status filters in list_tasks, and handoff fields in add_task, get_task and 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.json so 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 claude CLI); older ones have a Summarise button. "agents": { "summaries": "off" } in settings.json turns 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_DIR also 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.json is 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 with claude mcp add --transport http taskgraph http://127.0.0.1:5230/mcp.
  • MCP tab: whether the server listens, the connect command and the .mcp.json snippet, the tools and the recent calls with their result.
  • GET /health on the same port, answering status, version, name and the task counts.
  • "server" in settings.json (enabled, port, optional bearer token).

0.2.1 — 2026-09-23

Fixed

  • A task file changed by another process (a script writing tasks.json directly, 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 *.json file 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, dependsOn by 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 into tasks.json directly.

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_DIR points the app at another data folder (tests/ui-fixture for the tool).

0.1.0 — 2026-09-18

Added

  • Quick-add line: Buy pipes @house #diy !1 after:"Measure the wall" before:Install due:fri creates 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).