
Store your projects and tasks as SQLite
What happens to your OmniFocus data once a project is complete? Do you just archive and carry on with your life? Have you ever wanted to archive your data in an accessible form, separate from your current OmniFocus database?
of-store
is an objective-c program that will export all your completed tasks and projects to SQLite. Each task and project is stored, along with:
- Database ID (useful for telling apart duplicates with the same name)
- Name
- Position in the folder hierarchy
- Creation and completion dates
Query your data at leisure using powerful SQL statements, filtering, sorting or counting by date or project category. See what projects get completed the fastest and which lag, when you’re most productive, and when you need to up your game.
Requirements
of-store
will run with OmniFocus 1 and OmniFocus 2 pro. Sorry, OmniFocus 2 standard users: the lack of extensive Scripting Bridge support in OmniFocus 2 Standard means that this program does not support of-store. of-store
can only grab data that you haven’t yet archived.
Installation
Grab of-store
as a compiled binary or install from source.
Running
Open up terminal and cd
to the appropriate folder. To test out the binary (and make sure everything is working right), enter:
1 | ./of-store --debug --out=foo.db |
You should get something like the following:
1 2 3 4 5 6 7 | Connecting to bundle: com.omnigroup.OmniFocus2 Setting database path to foo.db Project saved: Project1 Task saved: Task1 Task saved: Task2 ... 40 projects and 236 tasks recorded. |
Your data will now be written to the file foo.db
. If you want the program to run silently, just leave out the --debug
flag.
Excluding folders
Sometimes you don’t want to record a certain set of tasks. You can exclude projects in a given folder with the --exclude
flag:
1 2 3 4 5 | # Excludes all projects whose top-level folder is "Folder" ./of-store --exclude=Folder --out=foo.db # Excludes all projects whose top-level folder is either "Foo" or "Bar" ./of-store --exclude="Foo,Bar" --out=foo.db |
Running periodically
I recommend setting up a launch daemon to run this script every day or what-have-you. I keep my launch daemons in check with Lingon. If you specify an output file that already exists to of-store
, it will attempt to open it as SQLite and append to it. In this way you can slowly build up a giant database of your tasks.