orgwarrior
Your org agenda from the command line, taskwarrior-style. Every task
gets a short ID, and orgwarrior ID VERB acts on it.
orgwarrior doesn't read your org files itself. It asks your running Emacs to do the work, so your agenda files, TODO keywords, custom agenda commands, logging, habits and refile targets behave exactly as they do in Emacs.
- You don't need to change your Emacs config. orgwarrior loads its own code into Emacs when it needs to.
- IDs don't change. A task's ID comes from its file and title, so it's the same in every view and from one day to the next.
orgwarrior-web puts the same agenda on a web page for your phone. orgwarrior-mcp gives it to Claude.
Quick start
Want the web page or Claude too? Install
orgwarrior-web or
orgwarrior-mcp instead of
this. Each one brings the orgwarrior command along, and installing more
than one of them with pipx or uv fails, since they'd share it.
You'll need Emacs 29 or later with its server running, and your org settings loaded in it. Any of these works:
emacs --daemon, or your system's Emacs service (systemctl --user enable --now emacson most Linux systems).- On a Mac with Homebrew,
brew services start emacs(orbrew services start emacs-plus@30for emacs-plus). - If you keep Emacs open as an app, add
(server-start)to your init file. orgwarrior then works while Emacs is open.
If you're new to org, these lines in ~/.emacs.d/init.el are enough to
start with (restart Emacs after changing it):
(setq org-agenda-files '("~/org") ; every .org file in ~/org
org-default-notes-file "~/org/inbox.org" ; where orgwarrior add writes
org-refile-targets '((org-agenda-files :maxlevel . 2))
org-log-done 'time) ; when you finished, for closed
Create ~/org/inbox.org too, even empty. Then install orgwarrior one of
these ways:
brew install aleksozolins/tap/orgwarrior # macOS or Linux
yay -S orgwarrior # Arch, with any AUR helper
pipx install orgwarrior # Python 3.11+, or: uv tool install orgwarrior
Installing orgwarrior-web or orgwarrior-mcp also installs this command, so you only need one of them.
orgwarrior --check # checks Emacs, your agenda files and the rest
orgwarrior # today's agenda
orgwarrior help # all the commands on one screen
--check says what's missing and how to fix it. Once it's happy, you'll
see what your Emacs agenda shows.
To act on a task, use the ID shown beside it:
orgwarrior c1 done -m "booked for the 20th"
orgwarrior 32 sched fri
orgwarrior add call the dentist :@phone: s:fri
A task can start with any of your TODO keywords (orgwarrior add NEXT call the dentist). Out of the box, org's are TODO and DONE, and a word that
isn't one of yours stays part of the title.
To update, use the tool you installed with: brew upgrade, your AUR
helper, pipx upgrade orgwarrior, or uv tool upgrade orgwarrior. alias ow=orgwarrior saves typing.
Homebrew and the AUR install the man page. With pipx or uv, copy it to
where man looks, and do it again after each upgrade:
mkdir -p ~/.local/share/man/man1
orgwarrior help --man > ~/.local/share/man/man1/orgwarrior.1
Everyday use
| command | what it does |
|---|---|
orgwarrior |
shows the default view (today) |
orgwarrior week, orgwarrior fri, orgwarrior all |
this week, one day, or every open TODO |
orgwarrior +@phone, orgwarrior next +@phone |
tasks with a tag, or in a TODO state with a tag |
orgwarrior flu shot |
searches text; add --archive to search archived tasks too |
orgwarrior projects.org |
shows a file's outline |
orgwarrior c1 |
shows a task: where it lives, its text, notes and child headings |
orgwarrior c1 done, orgwarrior c1 wait |
sets any of your TODO keywords, asking for a note where org would |
orgwarrior c1 sched fri 14:00, orgwarrior c1 due +2w |
sets dates, written the way org reads them |
orgwarrior c1 +@home -someday, orgwarrior c1 pri A |
changes tags and priority |
orgwarrior c1 refile projects |
refiles under a matching heading, or to the top of a matching file; with no target, lists them |
orgwarrior c1 clock in, orgwarrior clock out |
clocks in and out; orgwarrior clocked week totals the time |
orgwarrior c1 clocks add yesterday 14:00-15:30 |
logs time already spent, without touching a running clock |
orgwarrior closed week |
lists what you finished, day by day, archived tasks included (needs org-log-done) |
orgwarrior c1 edit |
opens the task in Emacs, in this terminal |
orgwarrior add event Dentist @fri 10:30 |
adds an event (a plain timestamp, no keyword) |
orgwarrior c1 when sat 10:30 |
moves an event to another date |
Most commands take several IDs at once: orgwarrior c1 32 done.
orgwarrior help TOPIC explains each part with examples (help dates,
help refile, help clock…), and --help works after any command.
How it works
Org is the task manager. orgwarrior is a friendlier set of commands on top of it, the way Git's everyday commands sit on top of its internals.
orgwarrior orgwarrior-web orgwarrior-mcp
(a terminal) (a browser) (Claude, any MCP client)
\ | /
orgwarrior.el, loaded into your running Emacs
|
Org mode ──▶ your .org files
Each command goes to your Emacs daemon through emacsclient.
orgwarrior's elisp then has Org do the work: build the agenda, change a
heading, read a date. Org writes the file just as it would from the
agenda buffer, so logging, repeaters, [1/3] cookies and hooks all work
as usual.
- IDs are short hashes of the file and the heading's title, like Git's
commit IDs. Changing a task's keyword, tags or dates keeps its ID.
Renaming or refiling it gives it a new one, and orgwarrior prints the
change (
6a → 91). An old ID stops matching instead of pointing at a different task. For a day afterwards, while Emacs runs, a new task that would get the same ID gets a longer one. - Notes: where Emacs would ask for a note (
@inorg-todo-keywords, or aLOGGINGproperty), orgwarrior asks in the terminal.-mgives it up front. - Safety: if a file has unsaved changes in Emacs, orgwarrior refuses to
touch it rather than save someone's half-finished edit.
killasks before deleting. - Read-only files: a file that isn't writable (
chmod a-w) is shown but never changed. This is meant for a calendar that a script exports to org, from vdirsyncer or Google for example. Every change to it is refused, it's never offered as a place to refile or add to, and orgwarrior-web's calendar feed leaves it out, since your calendar app already has the original. orgwarrior-web's docs/calendar.md shows how to set one up.
Configuration
Everything is optional. The config file is
~/.config/orgwarrior/config.toml (or under $XDG_CONFIG_HOME, or
wherever ORGWARRIOR_CONFIG points).
config.toml.example
lists every key with comments.
| key | what it does |
|---|---|
default_view |
the view plain orgwarrior shows (default today) |
socket |
the Emacs server socket, if it isn't the default (also -s or ORGWARRIOR_SOCKET) |
prefix_format |
an org-agenda-prefix-format used only by orgwarrior |
tags |
inline puts tags after the title (the default), right aligns them right |
time_grid |
true keeps Org's time grid |
color |
auto (color on a terminal, unless NO_COLOR is set), always or never |
[views] |
name = "key" makes an org-agenda-custom-commands entry a view; a week here replaces the built-in one |
[add] |
where add writes: a file (otherwise Emacs's org-default-notes-file), a heading to file under, and captured = true to stamp a :CAPTURED: time |
[add.event] |
the same, for add event |
[refile] |
new_in and new_suffix for refile --new; usual, the target a front end offers first |
[colors] |
colors for a role or TODO keyword: bold cyan, #ff8f88, on-green… (see orgwarrior help colors) |
[web] |
settings for orgwarrior-web; orgwarrior ignores them |
Troubleshooting
Start with orgwarrior --check. It checks Emacs, your init file, your
agenda files, where add writes and your config, and says what to fix.
- "no Emacs daemon is running": start Emacs as a daemon
(
emacs --daemon), or add(server-start)to your init file if you keep Emacs open as an app. If your daemon runs under another name (emacs --daemon=work), setsocket = "work"in the config. - Every view is empty: Emacs has no
org-agenda-files. Set them in your init file ((setq org-agenda-files '("~/org")); a directory works), or add a file withC-c [, as you would for Org's agenda. - "There's no file to add to":
addwrites toorg-default-notes-fileunless[add] filenames another file. Point it at your inbox. - "… is encrypted and not open in Emacs": an agenda file is
.gpg, and orgwarrior can't type its passphrase. Open it in Emacs once (it stays decrypted while Emacs runs), or take it out oforg-agenda-files. - "Emacs tried to ask a question": something in your Emacs, such as a hook, wanted to ask something. orgwarrior can't answer, so it stops. Do the same thing in Emacs itself to see what it asks.
- Colors look wrong:
color = "never"orNO_COLOR=1turns them off, and[colors]changes any of them.
From Python
Other programs can use the same code through orgwarrior.api;
orgwarrior-web is built on it. Views, tasks and actions come back as
plain data.
from orgwarrior.api import Orgwarrior
ow = Orgwarrior() # uses your config.toml and daemon
ow.view("wait +@phone") # [{"text", "id", "spans"}, ...]
ow.show("c1") # {"id", "file", "path", "lines", "children"}
ow.show("c1", html=True) # ... plus "html": its text as org exports it
ow.act(["c1"], "done", note="booked")
With Claude
Claude Code, or any AI agent with a shell on the machine running your Emacs, can use orgwarrior for you. A skill file teaches it how: reading views and IDs, the verbs, adding tasks, and asking before it deletes anything.
mkdir -p ~/.claude/skills/orgwarrior
orgwarrior help --skill > ~/.claude/skills/orgwarrior/SKILL.md
Then ask things like "what's due this week?" or "what did I get done
yesterday?". Run the command again after an upgrade to pick up new
features. Put your own preferences (your inbox's tags, keywords it should
leave alone) in ~/.claude/CLAUDE.md, which the command never
overwrites.
Where Claude can't run commands on that machine (claude.ai, the phone apps), orgwarrior-mcp gives it the same agenda as MCP tools.
Development
git clone https://github.com/aleksozolins/orgwarrior
cd orgwarrior
uv tool install --editable . # the orgwarrior command runs this checkout
uv run pytest # all tests, including the ERT suite
scripts/dev-daemon # a throwaway emacs -Q daemon on test files
scripts/dev-orgwarrior today # orgwarrior against that daemon
scripts/dev-daemon stop
The dev daemon never touches your real Emacs, config or org files. It only writes to its own copy of the test files. The scripts run on Linux and macOS. Tested on Emacs 29.4 (Org 9.6) and 31.1 (Org 9.8).
Claude (Anthropic's AI) was used in developing orgwarrior. I review all the code, and every behavior is covered by tests.
Contributing
I read every issue and fix what I can, bugs first. Pull requests are
welcome. For anything big, open an issue first so we can talk it through.
uv run pytest runs every test (Development).
License
GPL-3.0-or-later, the same as Emacs and Org.
Metadata
Release files for orgwarrior 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| orgwarrior-0.4.2.tar.gz | 785.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| orgwarrior-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 893.3 kB
Release files / orgwarrior-0.4.2.tar.gz
| Download URL | orgwarrior-0.4.2.tar.gz |
|---|---|
| Size | 785.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
51867493d02506f520a25896429400b80237abb50ce4bbcb741b4ca2f8d384de
|
|
BLAKE2b-256 checksum How to use checksums |
36a281f3569cc103ad164cc993ee5e316a919f0e916b2a2ef1de379c56adfb7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / orgwarrior-0.4.2-py3-none-any.whl
| Download URL | orgwarrior-0.4.2-py3-none-any.whl |
|---|---|
| Size | 107.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4902a2d9d839dcaa86490d350db0196202a282e4c226980dc2f3bf1d75157fb5
|
|
BLAKE2b-256 checksum How to use checksums |
f79ef94348408afe49f876a5379e77b80c42454d951a31136de9b9c434187694
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for orgwarrior 0.4.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for orgwarrior-0.4.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.