Working in the food industry, I can't always have my phone or laptop with me, so I've been looking for a way to have my task list with me through out the day. Dr. Drang (@drdrang) recently shared how he gets his daily To Do list out of Taskpaper and onto paper. His setup inspired me to look at ways I can update my process of creating a daily To Do list with me.
Setup Summary
My current setup includes the following:
- OmniFocus - Keeps all my tasks electronically. This is where my To Do list is generated from.
- Applescript - Used to generate a
.md
file of my current To Do items from OmniFocus. - Marked - Renders the
.md
file and allows me to save the To Do list as a PDF file.
With the PDF, I simply print the list out, stuff it in my binder, and I'm off for the day. I'm not worried about whether or not OmniFocus is always up to date because I spend 20-30 minutes in the late afternoon catching up on email and phone calls. At this point in the day I'll take a few minutes to update OmniFocus, complete any tasks that got done, or add new tasks I collected through the day.
OmniFocus Applescript
The script that generates the .md
file was heavily borrowed from one that Justin Lancy (@veritrope posted on his site about showing completed tasks in OmniFocus in a text file. My script will show all tasks that have a due date +/- 7d from today.
(* | |
File: OmniFocus_Due_List.scpt | |
Revision: 1.0 | |
Revised: 2015-07-01 | |
Summary: Create taskpaper list of tasks due +/- 7d from current date. | |
----------------------------------------------------------- | |
Script based on Justin Lancy (@veritrope) from Veritrope.com | |
http://veritrope.com/code/write-todays-completed-tasks-in-omnifocus-to-a-text-file | |
*) | |
--Set Date Functions | |
set CurrDate to date (short date string of (current date)) | |
set CurrDatetxt to short date string of date (short date string of (current date)) | |
set endDate to (current date) + (7 * days) | |
set endDatetxt to date (short date string of (endDate)) | |
set dateYeartxt to year of (current date) as integer | |
set dateMonthtxt to month of (current date) as integer | |
set dateDaytxt to day of (current date) as integer | |
if dateMonthtxt < 10 then | |
set dateMonthtxt to "0" & dateMonthtxt | |
end if | |
if dateDaytxt < 10 then | |
set dateDaytxt to "0" & dateDaytxt | |
end if | |
--Set File/Path name of MD file | |
set theFilePath to choose file name default name "To Do List for " & dateYeartxt & "-" & dateMonthtxt & "-" & dateDaytxt & ".md" | |
--Get OmniFocus task list | |
set due_Tasks to my OmniFocus_task_list() | |
--Output .MD text file | |
my write_File(theFilePath, due_Tasks) | |
--Set OmniFocus Due Task List | |
on OmniFocus_task_list() | |
set endDate to (current date) + (7 * days) | |
set startDate to (current date) - (7 * days) | |
set CurrDate to date (short date string of (startDate)) | |
set CurrDatetxt to short date string of date (short date string of (current date)) | |
set endDatetxt to date (short date string of (endDate)) | |
tell application id "com.omnigroup.OmniFocus2" | |
tell default document | |
set refDueTaskList to a reference to (flattened tasks where (due date ≥ CurrDate and due date < endDatetxt)) | |
set {lstName, lstContext, lstProject} to {name, name of its context, name of its containing project} of refDueTaskList | |
set strText to "To Do List for " & CurrDatetxt & ":" & return & return | |
repeat with iTask from 1 to count of lstName | |
set {strName, varContext, varProject} to {item iTask of lstName, item iTask of lstContext, item iTask of lstProject} | |
set strText to strText & "▢ " & strName | |
if varContext is not missing value then set strText to strText & " @" & varContext | |
if varProject is not missing value then set strText to strText & " (" & varProject & ")" | |
set strText to strText & return | |
end repeat | |
end tell | |
end tell | |
strText | |
end OmniFocus_task_list | |
--Export Task list to .MD file | |
on write_File(theFilePath, due_Tasks) | |
set theText to due_Tasks | |
set theFileReference to open for access theFilePath with write permission | |
write theText to theFileReference as «class utf8» | |
close access theFileReference | |
end write_File |
The full script: OmniFocus_Due_List.scpt
Side Note: If you happen to be using a version of OmniFocus from the App Store, you need to change line 50 in the script
tell application id "com.omnigroup.OmniFocus2"
to
tell application id "com.omnigroup.OmniFocus.MacAppStore"
and you'll be good to go.
Convert Markdown to PDF
The next step is to take the generated .md
file and render it as a PDF. Again, Marked 2 app comes to my rescue to do the heavy lifting. Marked allows you to use a custom CSS file to render Markdown files, so just like my iThoughtsX outline process, I use a custom CSS file to render my OmniFocus To Do list as a PDF.
One carry over I have from college is the need to write on graph paper. It's what I put in my binder for taking notes and what I have at my desk to collect ideas. While documenting the my steps for this article, I discovered I wanted to add some graph lines to the PDF so I could continue to have graph paper as part of my system. I added a custom CSS file to Marked to generate a 'graph paper' PDF.
/* | |
This document has been created with Marked.app <http://markedapp.com>, Copyright 2011 Brett Terpstra | |
Please leave this notice in place, along with any additional credits below. | |
--------------------------------------------------------------- | |
Title: custom.css | |
Author: Jason Verly (@mygeekdaddy) | |
Description: Custom CSS file to generate 'graph paper' on rendered MD to PDF | |
*/ | |
body { | |
background-color: #fff; | |
background-image: url('graph_paper_sm.png'); | |
-webkit-font-smoothing:antialiased; | |
font-family: 'Helevtica Neue', Avenir, 'Myriad Pro', Arial,Verdana,sans-serif; | |
margin:100px; | |
} | |
html>body | |
{ | |
font-size:13px | |
} | |
li | |
{ | |
font-size:110% | |
} | |
li li | |
{ | |
font-size:100% | |
} | |
li p | |
{ | |
font-size:100%; | |
margin:.5em 0 | |
} | |
h1 | |
{ | |
color:#000; | |
font-size:2.2857em; | |
line-height:.6563em; | |
margin:.6563em 0 | |
} | |
h2 | |
{ | |
color:#111; | |
font-size:1.7143em; | |
line-height:.875em; | |
margin:.875em 0 | |
} | |
h3 | |
{ | |
color:#111; | |
font-size:1.5em; | |
line-height:1em; | |
margin:1em 0 | |
} | |
h4 | |
{ | |
color:#111; | |
font-size:1.2857em; | |
line-height:1.1667em; | |
margin:1.1667em 0 | |
} | |
h5 | |
{ | |
color:#111; | |
font-size:1.15em; | |
line-height:1.3em; | |
margin:1.3em 0 | |
} | |
h6 | |
{ | |
font-size:1em; | |
line-height:1.5em; | |
margin:1.5em 0 | |
} | |
body,p,td,div | |
{ | |
color:#111; | |
font-family: 'Helevtica Neue', Avenir, 'Myriad Pro', Arial,Verdana,sans-serif; | |
word-wrap:break-word | |
margin:20px; | |
} | |
h1,h2,h3,h4,h5,h6 | |
{ | |
line-height:1.5em | |
} | |
a | |
{ | |
-webkit-transition:color .2s ease-in-out; | |
color:#0d6ea1; | |
text-decoration:none | |
} | |
a:hover | |
{ | |
color:#3593d9 | |
} | |
/*h2 em | |
{ | |
color:#111; | |
padding-left:10px; | |
text-shadow:0 1px 0 #FFF | |
}*/ | |
blockquote p | |
{ | |
font-size:110%; | |
font-style:italic; | |
line-height:1.6em; | |
} | |
.footnote | |
{ | |
color:#0d6ea1; | |
font-size:.8em; | |
vertical-align:super | |
} | |
#wrapper img | |
{ | |
max-width:100%; | |
height:auto | |
} | |
dd | |
{ | |
margin-bottom:1em | |
} | |
li > p:first-child | |
{ | |
margin:0 | |
} | |
ul ul,ul ol | |
{ | |
margin-bottom:.4em | |
} | |
caption,col,colgroup,table,tbody,td,tfoot,th,thead,tr | |
{ | |
border-spacing:0 | |
} | |
table | |
{ | |
border:1px solid rgba(0,0,0,0.25); | |
border-collapse:collapse; | |
display:table; | |
empty-cells:hide; | |
margin:-1px 0 23px; | |
padding:0; | |
table-layout:fixed | |
} | |
caption | |
{ | |
display:table-caption; | |
font-weight:700 | |
} | |
col | |
{ | |
display:table-column | |
} | |
colgroup | |
{ | |
display:table-column-group | |
} | |
tbody | |
{ | |
display:table-row-group | |
} | |
tfoot | |
{ | |
display:table-footer-group | |
} | |
thead | |
{ | |
display:table-header-group | |
} | |
td,th | |
{ | |
display:table-cell | |
} | |
tr | |
{ | |
display:table-row | |
} | |
table th,table td | |
{ | |
font-size:1.1em; | |
line-height:23px; | |
padding:0 1em | |
} | |
table thead | |
{ | |
background:rgba(0,0,0,0.15); | |
border:1px solid rgba(0,0,0,0.15); | |
border-bottom:1px solid rgba(0,0,0,0.2) | |
} | |
table tbody | |
{ | |
background:rgba(0,0,0,0.05) | |
} | |
table tfoot | |
{ | |
background:rgba(0,0,0,0.15); | |
border:1px solid rgba(0,0,0,0.15); | |
border-top:1px solid rgba(0,0,0,0.2) | |
} | |
figure | |
{ | |
display:inline-block; | |
margin-bottom:1.2em; | |
position:relative; | |
margin:1em 0 | |
} | |
figcaption | |
{ | |
font-style:italic; | |
text-align:center; | |
background:rgba(0,0,0,.9); | |
color:rgba(255,255,255,1); | |
position:absolute; | |
left:0; | |
bottom:-24px; | |
width:98%; | |
padding:1%; | |
-webkit-transition:all .2s ease-in-out; | |
} | |
figure:hover>figcaption | |
{ | |
/* background:rgba(0,0,0,1) */ | |
} | |
/* Styles used when "Tab-indented text is poetry" is set */ | |
.poetry pre | |
{ | |
display:block; | |
font-family:Georgia, Garamond, serif!important; | |
font-size:110%!important; | |
font-style:italic; | |
line-height:1.6em; | |
margin-left:1em | |
} | |
.poetry pre code | |
{ | |
font-family:Georgia, Garamond, serif!important | |
} | |
/* important rules for keeping line-height from being affected by sub */ | |
sup,sub,a.footnote | |
{ | |
font-size:1.4ex; | |
height:0; | |
line-height:1; | |
position:relative; | |
} | |
sup { | |
vertical-align:super; | |
} | |
sub { | |
vertical-align: sub; | |
top: -1px; | |
} | |
p,h5 | |
{ | |
font-size:1.1429em; | |
line-height:1.3125em; | |
margin:1.3125em 0 | |
} | |
dt,th | |
{ | |
font-weight:700 | |
} | |
table tr:nth-child(odd),table th:nth-child(odd),table td:nth-child(odd) | |
{ | |
background:rgba(255,255,255,0.06) | |
} | |
table tr:nth-child(even),table td:nth-child(even) | |
{ | |
background:rgba(0,0,0,0.06) | |
} | |
@media print { | |
body.custom { | |
background-color: #fff; | |
background-image: url('graph_paper_sm.png'); | |
-webkit-font-smoothing:antialiased; | |
font:normal 1em 'Helevtica Neue', Avenir, 'Myriad Pro', Arial,Verdana,sans-serif; | |
margin:100px; | |
} | |
p { | |
margin-left: 25px; | |
font:normal 1em 'Helevtica Neue', Avenir, 'Myriad Pro', Arial,Verdana,sans-serif; | |
} | |
#wrapper { | |
background: transparent !important; | |
} | |
} |
The custom css can be download here: custom.css
The graph paper image: graph_paper_sm.png
Just print from Marked as you normally would and then use the save as PDF option in the lower left corner.
Implementation
I normally have at least 30 min in the morning to get my day started. This is when I'll open up OmniFocus, clear my OmniFocus inbox, and then generate my To Do list. The difference now is I've got a cleaner looking version of my To Do list than I did with my previous setup. Keeping a paper copy of my tasks lets me easily see what I need to get done, look at what new tasks I can take on today, or look at requests that I may need to defer to later.
As I previously mentioned, this process doesn't require me to have OmniFocus always up to date... and that's okay. I consider this an extension of my GTD system and as long as I reconcile my To Do list at the end of the day, I feel I'm still good.
The output from Marked looks like this:
And the PDF in Preview looks like this:
Next Steps
There are a couple of steps I want to automate in the process to make this even smoother for me.
Set the script to a Keyboard Maestro keystroke trigger to generate the[DONE].md
file and save it to a designated folder.- Add to the script to have Marked open the
.md
file and automatically generate the PDF. - Create a Hazel rule to watch for the PDF and run another script to use Preview to print the PDF.
Special Thanks
A huge thanks to Brett Terpstra (@ttscoff) and Michael Bishop (@miklb) for their help in getting the "graph paper" look to work in Marked. Also a shout out to Justin Lancy (@veritrope) for sharing his Apple script which is core to my automated process.