Org Mode for Developers: The Productivity System You Didn't Know You Needed
How I use Emacs org-mode for TODO management, note-taking, literate programming, and writing — and why it beats every modern productivity tool.
Introduction
I've tried every productivity system in existence. Notion. Obsidian. Todoist. Trello. Monday. Asana. A physical notebook and a fancy pen. They all worked for about two weeks before the friction caught up with me.
Then I found org-mode. It's been my productivity system for four years. I've never looked for another one.
Org-mode is not an app. It's a plain text markup format and a set of Emacs tools for organizing anything — tasks, notes, projects, writing, code. It's been around since 2003 and it's still unmatched for what it does.
"Every modern productivity tool is trying to be org-mode with a worse data format and a monthly subscription."
Why Org-Mode for Developers
Developer-specific reasons it works:
- Plain text: Your data is readable, grep-able, version-controllable, and yours forever. No vendor lock-in, no export hell.
- Emacs integration: It lives inside the most extensible editor ever created. You can run code, execute shell commands, and manage git — all from your org file.
- Keyboard-driven: Org-mode was designed for keyboard-first use.
Tabto collapse/expand,Shift-Tabto cycle everything,C-c C-tto change TODO states. - Extensible: Org-mode has
150+keybindings by default, and you can add more. There's a binding for everything.
Step 1: The Basics
Org-mode files are plain text with a lightweight markup:
* Project Dashboard
** TODO Implement user authentication
DEADLINE: <2026-07-01 Mon>
:PROPERTIES:
:Priority: A
:END:
- [ ] Set up JWT middleware
- [ ] Create login endpoint
- [ ] Write tests
- [x] Design token refresh flow
** DONE Migrate database to Postgres
CLOSED: [2026-05-15 Fri]
:PROPERTIES:
:Effort: 8h
:END:
*** Notes on migration
- Used ~pgdump~ for data export
- ~15ms~ query improvement on the users table
- Need to update connection strings in CIThe key elements:
*headings create a hierarchy (collapse/expand withTab)TODO~DONE~CANCare state keywords (cycle withShift-Left/RightorC-c C-t)- [ ]/- [x]are checkboxesDEADLINE:andSCHEDULED:add dates:PROPERTIES:drawer stores metadata**bold**,/italic/,=code=and=verbatim=for formatting
The Agenda View
The real power of org-mode is the agenda — a generated view that collects tasks from all your org files:
C-c a a: Weekly agenda showing scheduled and deadline itemsC-c a t: List of all TODO items across all filesC-c a m: Search for tags across all files
I have my /org directory synced across machines with git. The agenda scans every file in it and shows me exactly what I need to work on today.
- Set up ~
/.config/emacs/config.org~ with org-agenda-files pointing to your org directory - Learn
C-c C-tto cycle TODO states - Learn
C-c C-sto schedule a task - Learn
C-c C-dto set a deadline
Step 2: TODO Management for Real Projects
Here's how I structure my work in org-mode:
Project Files
Each project gets an org file:
#+FILETAGS: :work:backend:
#+TITLE: API Gateway Project
* TODO Rate limiting middleware
DEADLINE: <2026-07-05 Sun>
:PROPERTIES:
:Effort: 4h
:END:
- [ ] Research rate-limiting algorithms (token bucket vs sliding window)
- [ ] Implement middleware
- [ ] Add Redis backend for distributed rate limiting
- [ ] Write integration tests
* TODO API documentation
DEADLINE: <2026-07-10 Fri>Custom TODO States
Default org-mode uses TODO and DONE. I extend it:
(setq org-todo-keywords
'((sequence "TODO(t)" "NEXT(n)" "WAITING(w@)" "BLOCKED(b@)" "DONE(d!)" "CANCELLED(c@)")))- TODO: Not started
- NEXT: Ready to work on now
- WAITING: Blocked by someone else, with a note (@)
- BLOCKED: Blocked by something, with a note
- DONE: Completed, with a timestamp (!)
- CANCELLED: No longer needed, with a note
Step 3: Literate Programming with Org-Babel
This is the feature that makes org-mode uniquely powerful for developers. You can write and execute code inside your org file:
Inline Code Blocks
curl -o /dev/null -s -w "%{time_total}s\n" \
https://api.opama.dev/usersTo process the results:
import json
data = {"latency_ms": 45, "status": "ok"}
print(json.dumps(data, indent=2))#+END_SRC
With C-c C-c, org-mode executes the code block and inserts the result below it. You can chain blocks — a bash block can feed into a Python block, which feeds into an SQL block.
Tangling
You can also extract code blocks into actual source files:
server {
listen 80;
server_name opama.dev;
location / {
proxy_pass http://localhost:3000;
}
}#+END_SRC
Run org-babel-tangle (C-c C-v t) and it writes the nginx config to the file. Your documentation and your configuration are the same file.
"I manage my dotfiles as a single org file that tangles into
/.config/sway/config,.configkittykitty.conf, and ~.zshrc. One file to edit, a hundred files to deploy."
Step 4: Note-Taking with Org-Roam
Org-roam is a Roam Research clone built on top of org-mode. It's a Zettelkasten note-taking system with bidirectional links:
C-c n f: Find or create a note by titleC-c n i: Insert a link to another noteC-c n l: Show backlinks to the current note
The notes are just org files in a flat directory with #+ROAM_KEY and #+ROAM_TAGS metadata. This website you're reading? The blog posts are written in org-mode, stored in my org-roam directory, and exported to the org files you see in the content directory.
Step 5: Time Tracking
Org-mode has built-in time tracking:
C-c C-x C-i: Clock in on the current taskC-c C-x C-o: Clock outC-c C-x C-r: Show clock report
I clock in when I start working, clock out when I switch contexts. The clock table shows me exactly where my time went:
#+BEGIN: clocktable :scope file :maxlevel 2
#+END: clocktableThis generates a table like:
| Headline | Time | |------------------------+-------| | *Total time* | *6h* | | API Gateway project | 4h | | Rate limiting | 2.5h | | API docs | 1.5h | | Infrastructure | 2h | #+TBLFM:
Step 6: Exporting
Org-mode exports to everything — HTML, PDF, Markdown, plain text, LaTeX, ODF:
C-c C-e h o: Export to HTML and open itC-c C-e l p: Export to LaTeX and compile to PDFC-c C-e m m: Export to Markdown
I wrote this site's org-to-HTML pipeline myself (the OrgRenderer component), but org-mode's built-in ox-html exporter is excellent for simpler needs.
Why Org-Mode Wins for Me
Not every developer needs org-mode. But if you match this profile, you should try it:
- You spend a lot of time in Emacs or want an excuse to learn it
- You value plain text and fear vendor lock-in
- You want your notes and your code to live in the same format
- You're willing to invest time in a tool that rewards you for years
The learning curve is real. Org-mode is 150+ keybindings on top of Emacs with its own 1000+ keybindings. But every keybinding you learn is a permanent skill. I've been using it for four years and I'm still learning new features — but I was productive on day one with just TODO states and checkboxes.
A Minimal Starter
If you want to try org-mode without committing to Emacs, start here:
* My First Org File
** TODO Learn org-mode basics
- [x] Understand headings
- [ ] Use TODO states
- [ ] Set up the agenda
- [ ] Try org-babel
** TODO Write a blog post in org-mode
SCHEDULED: <2026-07-05 Sun>Open it in Emacs with M-x org-mode. That's it. The basics work immediately. Dive deeper as you need to.
