Sprint planning on top of GTD, in Org mode.
GTD is good at getting everything out of your head into a trusted list. It
says little about choosing from that list once it holds four hundred open
items. Scrum is good at choosing: a ranked backlog, a sprint you commit to,
priorities set on whole pieces of work. It assumes someone grooms the backlog
every week. agile-gtd combines the two, so a personal task list sorts itself
the way a well-kept backlog would.
You will have far more open tasks than you will ever do, and that is fine. In any given week only a small part of them matters. The system’s job is to show you that part and keep the rest out of sight without losing any of it.
| From GTD | From Agile |
|---|---|
| Capture everything into an inbox, clarify later | One backlog, sorted most important first |
| Next actions: the physical step you can do now | A sprint: the slice of the backlog you commit to |
| Projects: any outcome that needs several steps | Priority is set on the project, not on each step |
| Someday/maybe and the tickler for parked work | Views cut the backlog at a depth you choose |
| The weekly review catches stuck projects | Deadlines move work up the backlog as they near |
Parent priority. You prioritise the project, and its next actions follow.
Move a PROJ into the sprint and every NEXT inside it appears in the sprint
too. No next action gets left behind because nobody moved it into the sprint.
A single step can still be raised above its project when it is more
urgent than the rest; it is never pushed below it.
Rank. Every task gets one number, computed from four things: its own priority, its project’s priority, how close its deadline is, and whether a scheduled date has come due. Views sort by rank and cut at a rank, so filtering and ordering always agree. A date can only move a task up: an unprioritised task climbs the backlog as its deadline approaches, and a deadline months away leaves it where its priority put it.
Priorities run from A to I. Five views, called ranges, cut the backlog at
increasing depth:
today -> sprint -> upcoming -> all -> someday
due or A..C down to E, every plus parked
overdue and anything priority SOMEDAY work
unprioritised
- Commit to work by giving its project priority
A,BorC. The project’s next actions now show in the sprint. - Leave it on the list without a priority. It shows in
upcoming, the everyday working view, and rises when its deadline gets close. - Stop seeing it every day by demoting it below
E. It stays in the backlog (all) and out of your daily view. - Park it with the
SOMEDAYtag. It leaves every range butsomeday. - Park it until a date with
SOMEDAYand aSCHEDULEDdate. That makes it a tickler, and it comes back into view on that day.
Inside an open agenda you widen or narrow the range on the spot, so one command serves both “what do I do now” and “what is on my plate at all”.
A small todo.org; only the tax return has a date:
* PROJ [#B] Launch the new website
** NEXT Write the landing page copy
** NEXT Pick a hosting provider
* PROJ Renovate the bathroom
** NEXT Get three quotes from plumbers
* NEXT File the tax return
DEADLINE: <2026-09-27 Sun>
* PROJ [#G] Learn Rust
** NEXT Read chapter 4 of the book
* NEXT Try the new ramen place :SOMEDAY:
The Main Agenda (a) at the all range, captured on 23 September 2026:
Next Actions [all] [#B] Priority B NEXT Write the landing page copy NEXT Pick a hosting provider NEXT File the tax return due in 4d Default Priority NEXT Get three quotes from plumbers [#G] Priority G NEXT Read chapter 4 of the book
- The two website actions carry no priority of their own; they sit at
Bbecause their project does. - The tax return has no priority either. Its deadline four days out lifts it to
B. - At
sprintthe list stops after the[#B]group. Atupcomingit stops afterDefault Priority, so Rust stays out of the daily view. - The ramen place appears only at
someday, under its ownSomedayheading.
Put your tasks in todo.org and inbox.org under org-directory, then:
(use-package agile-gtd
:after org
:config
(agile-gtd-enable))Run M-x org-agenda, then a for the Main Agenda, i for the inbox or rs
for stuck projects. agile-gtd-agenda-wider-range and agile-gtd-agenda-narrower-range
change the range of the open agenda; bind them to keys of your choice.
To split work by client or team, register a tag per project:
(setopt agile-gtd-projects '((:tag "alpha" :key ?a)
(:tag "beta")))alpha then gets its own agenda command, wa.
agile-gtd needs Emacs 30.2 or later; CI runs the tests on Emacs 30.2 and 31.1.
It is not on MELPA. It depends on org-ql, org-super-agenda, org-edna and
org-modern from MELPA, and on org-records-mcp, which is not on MELPA either.
MELPA’s org-mcp is a different package and does not work here.
With the built-in package-vc (Emacs 30):
(use-package org-records-mcp
:vc (:url "https://github.com/stfl/org-records-mcp" :branch "main"))
(use-package agile-gtd
:vc (:url "https://github.com/stfl/agile-gtd")
:after org
:config
(agile-gtd-enable))With straight, the org-records-mcp recipe is
(:host github :repo "stfl/org-records-mcp" :branch "main" :files (:defaults "org-records-mcp-stdio.sh")).
- It is opinionated and global.
agile-gtd-enablesets your TODO keywords, priority range, workflow tags, capture templates, agenda files and a set of Org options. Agenda commands and capture templates on the keys it uses are replaced; others are kept. What the package configures lists every change and how to turn parts of it off. - It is for one person. There are no story points, no velocity, no burndown and no shared team backlog.
- It installs no keybindings. The range commands and chain helpers are yours to bind.
- The deadline table is fixed. How many days out a deadline counts as
A,Band so on is not configurable. - org-records-mcp is a hard dependency, even when you never connect an AI assistant.
| You want to know | Read |
|---|---|
| What each state, tag and property means; inbox and capture | The workflow model |
| How priorities, parent priority and deadlines make rank | Priorities and rank |
| What each range shows and how to rotate between them | View ranges |
| Every agenda command and how its blocks are grouped | Agenda commands |
| Registering clients, teams and engagements | Projects |
Chaining steps so the next one becomes NEXT | Task dependencies |
| Querying the workflow from your own org-ql searches | org-ql predicates |
| Giving an AI assistant your agenda through MCP | Views for AI assistants |
What agile-gtd-enable changes in Org | What the package configures |
| Each Org option it sets, and why | Org settings agile-gtd applies |
| What changed between releases | Changelog |
Issues and pull requests are welcome at stfl/agile-gtd. The build uses
Eask and just: eask install-deps, then just build, just lint and just test.