← All projects

Open source · MIT

QTask

Tell it what you want done, in ordinary words.

An AI-first task manager: create projects, break down work and update status by saying so in plain language — with a proper interface underneath for nested projects, subtasks and shared work, and an MCP server so Claude or Cursor can work on the same projects.

Say what you want done

QTask is a task manager built around an AI agent rather than one that had a chatbot added to it later. Agent is a view in the header, beside Projects and Tasks, and it is a legitimate way to do the work — not a novelty next to the real interface.

You talk to it the way you would talk to a colleague:

 create project Kitchen Reno
 Create project Garden and add tasks: Plan layout, Buy soil, Plant herbs
 Mark Schedule inspection as done
 get me tasks for current project

Compound requests work in one message — a project and its sub-project, or a project and several tasks at once — or step by step if you would rather approve each piece separately. Each conversation is a session you can leave and come back to, so a train of thought about one piece of work stays together instead of scrolling away.

It proposes; you decide

This is the part that makes an AI-first task manager trustworthy enough to actually use. Write actions — creating or updating tasks, sharing them, creating projects — arrive as proposals. They collect in a Pending approval bar, and nothing changes until you approve. Reject and it never happened.

Read actions — search, fetch a task, list projects, summarise — just run. There is nothing to approve about being told something, and gating reads would make the agent tedious for the thing you do most.

If you would rather it simply got on with it, Auto-approve agent actions in the account menu applies writes as they come, and you can still reject them afterwards. The default is the cautious one.

Approve a new project and QTask offers to switch your active project to it, so the next thing you say lands where you meant it to.

A real interface, not just a chat box

Everything the agent does, you can do by hand — and the structure it works in is a proper one. Projects nest under projects in a parent/child tree you can drag and reparent. Tasks live in one or more projects and carry subtasks, which can nest inside each other in turn.

ConceptWhat it is
ProjectA workspace grouping related work. Projects nest under other projects.
TaskA work item. Lives in one or more projects, and can hold nested subtasks.
SubtaskA breakdown item inside a task — or inside another subtask. Inherits context from its parent.
StepA checklist line on a task or subtask. Use steps for simple to-do lines; use subtasks when you need status, progress or further nesting.

Most work is scoped to your active project, which is what both the Tasks view and the agent operate inside — so "add a task" is unambiguous without you naming the project every time. There is also search that finds a task by what it meant rather than the words you happened to type, comments, progress rollups, keyboard shortcuts and expense tracking.

Shared work, with roles that mean something

Every project has an owner and optional collaborators, and you can watch work you do not own without being able to disturb it. Five roles draw the lines:

RoleCan
ViewerSee the project and its tasks
ExecutorSee it, update task status, and comment
EditorCreate and edit tasks, and delete their own
ManagerCreate sub-projects, edit and move the project, rearrange structure — but not delete it or manage its members
OwnerEverything, including deleting the project and managing who is on it

Invite someone from the Members panel by email or from a recent-collaborator list; they accept by email link or the notification bell. Inviting on a parent project cascades the same role to every sub-project beneath it. Projects where you are a manager are tinted in the project tree with an amber dot, so a permission you did not expect is visible before you run into it rather than after.

Or drive it from Claude

The built-in agent is not the only way in. QTask ships an MCP server, so Claude Desktop, Cursor or any MCP client can work on the same projects and tasks as first-class operations — discovered on connection, not scraped out of a web page.

The same rule applies there: writes proposed by an external model are staged for your approval. Access is a key you issue and can revoke, not an ambient capability — every API route except /health and /api/auth/* requires a bearer token, including the MCP surface.

For hosted qtask.dev, create an MCP API key under Account menu → External AI (MCP) and run the bridge. For a local install, copy your JWT from the web client and set MCP_JWT in your client's MCP config — mcp-config.example.json in the repository is a working starting point.

npm run mcp          # MCP stdio server — local dev / Cursor
npm run mcp:bridge   # stdio bridge to the hosted /api/mcp

Your data, and whose model

QTask is self-hostable end to end, and the AI backend is pluggable. Run it against a local Ollama and nothing leaves the building — including the embeddings behind semantic search, which are generated locally by default.

Quick start — Node 20+, Docker for MongoDB, Ollama
ollama pull qwen3.5:2b
ollama pull nomic-embed-text

docker compose up -d
cp .env.example .env      # set JWT_SECRET

npm install
npm install --prefix client
npm run dev:all           # API :3000 · web client :5173

Create an account on first visit. Local secrets belong in .env.local, which overrides .env and is not committed; on a production server they go in .env.

Read further

Signed-in users can open Help from the account menu in the web app.