Skip to content
A Hacker's Way of Getting Stuff Done
Branch: master
Clone or download
Latest commit 55baf96 May 9, 2016
Type Name Latest commit message Commit time
Failed to load latest commit information.
test removed a redundant TODO. Feb 1, 2014
.gitignore updated readme. Nov 22, 2013
.jshintrc organized the code into modules. updated jshintrc Sep 1, 2013
.travis.yml updated travis. Jan 28, 2014 FIXED #33 - done.txt being corrupted after task completion. Nov 22, 2013
Gruntfile.js removed copyright date from license since it does not have any legal … Sep 12, 2013 Update May 9, 2016
index.js factored out private methods to their own modules for better code cov… Jan 29, 2014


This project is no longer maintained (at least for a while).

If you want to be the maintainer, contact me at

JFDI Travis CI Build Status   JFDI NPM version

Table of Contents

A Hacker's Way of Getting $#!% Done

Every Saga Has a Beginning

It all started with the JFDI Methodology and the JFDI Manifesto.

In a nutshell, JFDI is a command line interface to help you focus what goals you can achieve right now.

Why a Command Line Interface?

Because, we geeks live in the terminal.

Using something that is already running, and is most of the time available in front of your eyes, will help you overcome the inertia of launching a separate app to manage your goals – Here's why:

Adding a JFDI goal is as simple as typing jfdi save the world.

You don't have to wait for…

  • your shiny dandy GTD desktop app to launch…
  • index its tasks…
  • connect to the Internet…
  • sync recent data…
  • render a pretty UI…

If after all that hassle, you will still need to click an "add task" button, just to add a simple goal, than it is too much work already.

And when it is too much work, your subconscious will resist to use that app forever.

  • That's why there are hundreds of TODO applications out there, which people have hard time habituating;
  • And that's why the majority of people are not satisfied with their "task management software".

Now compare how you would JFDI, instead:

Type your goal, hit _enter_ and bang!* it's there.

* Yes, this does make a "bang!" sound effect in your mind ;).

No process can be less interruptive, and faster!

The main aim of the application is to help you accomplish what need to be get done today, with as little distraction as possible.

So unlike other productivity pr*n apps, you will not find dates, schedules, reminders, labels… to distract you away in JFDI.

Why "Right Now"?

Because it's f*cking " JFDI " !

Planning Is a Bummer!

Admit it, most of the time you don't plan launching a manless spaceship to the moon. Your typical runway is something like…

  • Fix bug id UNP9959: "Unicorns and ponies should live together".
  • Remember the milk.
  • Save the world.

Why torture your brain by setting due dates weeks from now to those simple tasks?!

JFDI what you can do right now, and bump the rest to tomorrow.

It is Plain Text Files, Baby!

Do you know what is universally reachable, and modifiable, without needing to download any special software?

A plain text file!

You can edit your text file on your Mac, on your PC, on your smart phone, on your tablet, on Mars, and on the moon…

Moreover, text files are damn fast to edit; they do not distract you.

What JFDI does is similar:

JFDI maintains plain text files in a synchronization directory of your choice.

If you set your synchronization directory to something like:


given that /home/procrastinator/Dropbox/ is your Dropbox folder, JFDI will put three text files to that folder:

  • today.txt,
  • tomorrow.txt,
  • and done.txt;

then you can edit these files wherever you want.

And once you are done, they will be synchronized everywhere.

When You Don't Have Access to jfdi CLI

Since those files are plain text files, you can use any text editor to modify them even if you don't have access to jfdi command line interface.

Since JFDI data files are plain text files, they are universally portable.

For instance you can use an editor like textastic to edit your goal list on your smart phone or tablet, and then when you are back in front of your computer, you can use jfdi to modify those files from where you left.

JFDI gives you the liberty to modify your files however you like.

It only has a single requirement:

Keep each goal on a separate line.

It will play nicely, as long as you remember to keep each goal on its own line.

And as long as you follow this simple rule, you can edit your text files in whichever text editor you like, and when you run jfdi again, it will catch up and parse the files properly.

Supported Platforms

JFDI does not have any platform-specific dependencies.

You should be able to run it on any platform that supports Node.JS.

It should work properly in all major Windows, Mac OSX, and Linux platforms.

If you face any particular issue with your platform file an issue.

Project Directory Structure

The directory structure of the project is as follows:

  • test: Unit tests.
  • lib: Helper modules.
  • i18n: Localization (not implemented yet)
  • config: Custom configuration (not implemented yet)
  • data: Configuration folder (do not touch).
  • index.js: The entry point of the program.
  • This file you are looking at.
  • Things that has been done so far.
  • Boring copyright stuff.
  • package.json: npm package information.

Where Can I Get Help?

Here are the places you can get help:

  • If you are experiencing a problem, or if you have found a bug, or if you want some cool sh*t to be implemented you can file an issue;
  • If you want to figure out how a specific command works, this README that you are reading right now will be helpful;
  • And you can always send an e-mail to

Where Is the Documentation?

Currently the only documentation is this README file that you are looking at. It will be regularly updated as new features are added to the project.

You can also get command line help if you type jfdi -h or jfdi --help in the console.

In addition to this README file, you can also read this blog post for usage examples, and installation details.


If you write reviews in your blog, send an e-mail to and it will be cited here, as an additional resource, ASAP.

Can I Get the Cutting-Edge Version?

If you are okay to trade up slight unstability for added coolness, additional commands and more features; then you might want to check out the develop branch.

The develop branch is more frequently updated than the master branch. You will probably have a "mostly working" app, with incomplete tests.

Any code that breaks the tests are generally not pushed to develop, therefore the develop branch is generally safe with missing tests and documentation.

To use the develop branch, git clone and npm link it as follows:

[root@john.doe:~]#git clone
[root@john.doe:~]#git checkout develop
[root@john.doe:~]#cd JFDI
[root@john.doe:~]#npm link

If you have issues setting up the develop version, send an e-mail to

How Do I Setup JFDI?

Setting up your JFDI environment is easy.

Setup for Linux / Mac

You should have Node.JS installed, first.

Once you have Node.JS installed, just run:

sudo npm install -g jfdi

in your terminal, and you will have JFDI installed globally.

Setup for Windows

It is similar to Linux setup. After having installed Node.JS, just run.

npm install -g jfdi

in the command prompt, and you are done.



For Linux users setting up an alias like alias j="sudo jfdi"; may save you a few keystrokes.


You might need root privileges to use JFDI.

If the command examples given below do not work for you, replace jfdi with sudo jfdi, and try them again.

If they still fail, file a bug report.

To configure your JFDI, just type jfdi to the terminal.

[root@john.doe:~]# jfdi

And you will get a prompt similar to this:

### Set Your JFDI for the First Time ###

    It looks like this is the first time you are using JFDI.
    Don't worry, it's easy.

    The only thing you need to configure is a folder to
    store your JFDI data.

    Where do you want to store your JFDI data?
    Enter the full path ( like: /home/ninja/Dropbox/JFDI/ ).

prompt: path:

Just type in the full path of a valid folder on your system.

prompt: path:  /home/procrastinator/Dropbox/JFDI/

and then press enter. You will get the following notification upon success:

### Yay! ####

    Ready to go! You can use JFDI now.


    for usage examples.

You can further verify everything is set up by checking your JFDI data directory:

[root@john.doe:~]# ls /root/Dropbox/JFDIExample/ -al
total 8
drwxr-xr-x  2 root root 4096 Sep 10 17:22 .
drwx------ 11 root root 4096 Sep 10 13:50 ..
-rw-r--r--  1 root root    0 Sep 10 17:22 done.txt
-rw-r--r--  1 root root    0 Sep 10 17:22 today.txt
-rw-r--r--  1 root root    0 Sep 10 17:22 tomorrow.txt

If everything is set up correctly, once you run jfdi once more, you will get the following message:

[root@john.doe:~]# jfdi

### JFDI List For Today ###

   *Zero Inbox* for today! Hooray!

   Sample Usage:
       Add a Goal       : jfdi [-a] "Save the world; one goal at a time."
       List Goals       : jfdi -l
       List All Commands: jfdi -h

Which means that you are all set! Congratulations!


Displaying Help

[root@john.doe:~]# jfdi -h

Adding a Goal


[root@john.doe:~]# jfdi Save the cheerleader, save the world.

Or you can use quotes if you have special characters in your goal:

[root@john.doe:~]# jfdi "Save the cheerleader, (save the world)."


This quotation feature works similar in all other JFDI commands too. So if you have special text which might be parsed as a command, just put it inside quotes to use it.

Here is a sample response:

[root@john.doe:~]# jfdi Save the cheerleader, save the world.

The above command will output the updated goals list.

### JFDI List For Today ###

0 Save the cheerleader, save the world.

Listing Goals

Just type jfdi.

[root@john.doe:~]# jfdi

The above command will output:

### JFDI List For Today ###

0 learn kung-fu
1 buy milk.
2 Save the cheerleader, save the world.

Deferring a Goal

Use jfdi -d <goal id>.

For the above list of goals, using

[root@john.doe:~]# jfdi -d 1

will output:

### JFDI List For Today ###

0 learn kung-fu
1 Save the cheerleader, save the world.

(note that "buy milk" goal for id 1 has been moved)

Appending Text to a Goal

Use jfdi -m <goal id> -D "<text to append>".

Note that you will need to enclose your text in quotes ("") if it has multiple words.

You can also use the parameters in their long forms:

jfdi --append <goal id> --text "<text to append>"

As in:

jfdi --append 1 --text " Save the universe, too."

Prepending Text to a Goal

Use jfdi -m <goal id> -D "<text to append>".

Note that you will need to enclose your text in quotes ("") if it has multiple words.

You can also use the parameters in their long forms:

jfdi --append <goal id> --text "<text to append>"

As in:

jfdi --append 1 --text "Find the cheerleader. "

Replacing Text within a Goal

Use jfdi -r <goal id> -D "<text to replace>" -w "<replacement>". You can also use the parameters in their long forms:

jfdi --replace <goal id> --text "<text to replace>" --with "<replacement>"

As in:

jfdi --replace 1 --text "Cheerleader" --with "Blonde Immortal Cheerleader"


The --replace parameter accepts regular expressions too. So you can use something like

`jfdi --replace 1 --text "Ch.{2,2}rl[ea][ea]d.r" --with "Blonde Immortal Cheerleader"`

and do the same replacement.

Listing Deferred Goals

Use jfdi tomorrow.

For the above today queue, using

[root@john.doe:~]# jfdi tomorrow

will output something similar to the following:

### Upcoming JFDI Stuff ###

0 buy milk.

Moving a Goal Back to Today's Queue

Use jfdi -e <id>.

For the above tomorrow queue, using

[root@john.doe:~]# jfdi -e 0

will output

### JFDI List For Today ###

0 buy milk.
1 learn kung-fu
2 Save the cheerleader, save the world.

You can see that "buy milk" goal has been moved to the top of your tomorrow queue.

Marking a Goal as Done

It's as easy as jfdi <id>.

For the above example, using

[root@john.doe:~]# jfdi 1

will output

### JFDI List For Today ###

0 buy milk.
1 Save the cheerleader, save the world.

Now you know kung fu!

Searching for Goals

  • Use jfdi -f <phrase> for today's goals.
  • Use jfdi -f <phrase> tomorrow for tomorrow's goals.

For the above goals list,

[root@john.doe:~]# jfdi -f milk


[root@john.doe:~]# jfdi -f "milk"

will output:

### "milk" for Today ###

0 buy milk.


[root@john.doe:~]# jfdi -f ponies tomorrow

will output:

### "ponies" for Tomorrow ###

0 find ponies and rainbows

(given that there exists such a goal in your tomorrow's queue)


That's a basic summary of what you can do with JFDI. There are many aliases to the above commands; so, for example, instead of using jfdi -e <id> you can use jfdi --expedite <id>, too. Type jfdi --help for more information on the available commands that you can use.

Things to Be Implemented

See the issue list for what's coming up next.


file an issue if you want more stuff.


Each functional change in JFDI code increments the version number.

The version of the project is maintained at package.json; and it has MAJOR.MINOR.PATCH format.

  • MAJOR version changes are breaking, incompatible API changes.
  • MINOR version changes are enhancements and new functionality that have been added in a non-breaking, backwards-compatible manner.
  • PATCH version changes are non-breaking, backwards-compatibile bug fixes.

With the following exception:

Although the maintainers of this codebase will try to the best abilities not to introduce breaking changes, any version less than 1.0.0 are exempt from the above rules, and may introduce breaking changes at any time.

Each major version of JFDI will be maintained as tagged snapshots for each version.

Deployment Policy

  • Everything is implemented and tested on the develop branch first;
  • Then unit tests are written on the develop branch for the changes;
  • Once the CI is all green, develop branch is merged into master.
  • Once the master gives all green on the on the CI too, then the final module is npm published.

How Do I Contribute?

JFDI is in active development, and any contribution is highly appreciated.

Contribution is simple. Just follow these steps:

  1. Fork this repository;
  2. Switch to the develop branch (git checkout develop);
  3. Create a feature branch (git checkout -b my-awesome-feature);
  4. Commit your changes (`git commit -am 'Added a great feature.');
  5. Push to the branch (git push origin my-awesome-feature);
  6. Create a new pull requests.

I Have A Question

File an issue or Send an e-mail to


JFDI is distributed under the MIT license. You can play with it however you like.

See for details.

Contact Information

Project Owner: Volkan Özçelik

You can’t perform that action at this time.