jrnl is a simple journal application for your command line. Journals are stored as human readable plain text files - you can put them into a Dropbox folder for instant syncinc and you can be assured that your journal will still be readable in 2050, when all your fancy iPad journal applications will long be forgotten.
Optionally, your journal can be encrypted using the 256-bit AES.
Journals aren't only for 13-year old girls and people who have too much time on their summer vacation. A journal helps you to keep track of the things you get done and how you did them. Your imagination may be limitless, but your memory isn't. For personal use, make it a good habit to write at least 20 words a day. Just to reflect what made this day special, why you haven't wasted it. For professional use, consider a text-based journal to be the perfect complement to your GTD todo list - a documentation of what and how you've done it.
to make a new entry, just type
jrnl yesterday: Called in sick. Used the time to clean the house and spent 4h on writing my book.
and hit return. yesterday:
will be interpreted as a timestamp. Everything until the first sentence mark (.?!
) will be interpreted as the title, the rest as the body. In your journal file, the result will look like this:
2012-03-29 09:00 Called in sick.
Used the time to clean the house and spent 4h on writing my book.
If you just call jrnl
, you will be prompted to compose your entry - but you can also configure jrnl to use your external editor.
jrnl has to modes: composing and viewing.
jrnl -n 10
will list you the ten latest entries,
jrnl -from "last year" -to march
everything that happened from the start of last year to the start of last march. If you only want to see the titles of your entries, use
jrnl -short
Keep track of people, projects or locations, by tagging them with an @
in your entries:
jrnl Had a wonderful day on the #beach with @Tom and @Anna.
You can filter your journal entries just like this:
jrnl @pinkie @WorldDomination
Will print all entries in which either @pinkie
or @WorldDomination
occurred.
jrnl -n 5 -and @pineapple @lubricant
the last five entries containing both @pineapple
and @lubricant
. You can change which symbols you'd like to use for tagging in the configuration.
Note:
jrnl @pinkie @WorldDomination
will switch to viewing mode because although now command line arguments are given, all the input strings look like tags - jrnl will assume you want to filter by tag.
Timestamps that work:
Install jrnl using pip:
pip install jrnl
Alternatively, install manually by cloning the repository:
git clone git://github.com/maebert/jrnl.git
cd jrnl
python setup.py install
chcp 1252
before using jrnl
(Thanks to Yves Pouplard for solving this!)Crypto
package to encrypt journals, which has some known problems with installing within virtual environments.The first time launched, jrnl will create a file called .jrnl_config
in your home directory.
It's just a regular json
file:
{
journal: "~/journal.txt",
editor: "",
encrypt: false,
password: ""
tagsymbols: '@'
default_hour: 9,
default_minute: 0,
timeformat: "%Y-%m-%d %H:%M",
highlight: true
}
journal
: path to your journal fileeditor
: if set, executes this command to launch an external editor for writing your entries, e.g. vim
or subl -w
(note the -w
flag to make sure jrnl waits for Sublime Text to close the file before writing into the journal).encrypt
: if true
, encrypts your journal using AES.password
: you may store the password you used to encrypt your journal in plaintext here. This is useful if your journal file lives in an unsecure space (ie. your Dropbox), but the config file itself is more or less safe.tagsymbols
: Symbols to be interpreted as tags. (See note below)default_hour
and default_minute
: if you supply a date, such as last thursday
, but no specific time, the entry will be created at this timetimeformat
: how to format the timestamps in your journal, see the python docs for reference
highlight
: if true
and you have clint installed, tags will be highlighted in cyan. Note on
tagsymbols
: Although it seems intuitive to use the#
character for tags, there's a drawback: on most shells, this is interpreted as a meta-character starting a comment. This means that if you typejrnl Implemented endless scrolling on the #frontend of our website.
your bash will chop off everything after the
#
before passing it to jrnl). To avoid this, wrap your input into quotation marks like this:jrnl "Implemented endless scrolling on the #frontend of our website."
Or use the built-in prompt or an external editor to compose your entries.
Can do:
jrnl --json
Why not create a beautiful timeline of your journal?
With
jrnl --tags
you'll get a list of all tags you used in your journal, sorted by most frequent. Tags occuring several times in the same entry are only counted as one.
jrnl --markdown
Markdown is a simple markup language that is human readable and can be used to be rendered to other formats (html, pdf). This README for example is formatted in markdown and github makes it look nice.
You can encrypt your existing journal file or change its password using
jrnl --encrypt
If it is already encrypted, you will first be asked for the current password. You can then enter a new password and your plain journal will replaced by the encrypted file. Conversely,
jrnl --decrypt
will replace your encrypted journal file by a Journal in plain text.
Should you ever want to decrypt your journal manually, you can do so with any program that supports the AES algorithm. The key used for encryption is the SHA-256-hash of your password, and the IV (initialisation vector) is stored in the first 16 bytes of the encrypted file. So, to decrypt a journal file in python, run
import hashlib, Crypto.Cipher
key = hashlib.sha256(my_password).digest()
with open("my_journal.txt") as f:
cipher = f.read()
crypto = AES.new(key, AES.MODE_CBC, iv = cipher[:16])
plain = crypto.decrypt(cipher[16:])
jrnl
to jrnl.py
)-short
option that will only display the titles of entries (or, when filtering by tags, the context of the tag).jrnl_config
will get automatically updated when updating jrnl to a new versionkey
has been renamed to password
in config to avoid confusion. (The key use to encrypt and decrypt a journal is the SHA256-hash of the password.)