Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time
For someone who studied accounting, I've never really paid a huge amount
of attention to where my money goes when I stop looking. Generally
speaking, as long as I've got somewhere to live and a steady supply of
cheese and wine I'm not too worried.

So it's funny that I suddenly decided that it would be a good idea to
track my expenses, but there you have it. I thought I'd write a little
Clojure program that would let me enter my recurring and one-off
expenses (in a format reminiscent of Emacs's ~/.diary file) and have it
tell me where all my money got to each week.

To compile it:

  1.  Get Leiningen from and put
      the 'lein' script somewhere in your $PATH.

  2.  Run `lein uberjar'.  Lein will grab all required dependencies and
      produce a `expenses.jar'.

To use it, I create a file called ~/.expenses that looks roughly like

  ## Recurring stuff...

  # This is the default anyway, but you can set the reported week to
  # start whenever you like.
  #set week_start Sunday

  # Amounts we receive are entered as negative numbers...
  fortnightly     -10000  Fortnightly pay (I wish)
  weekly          345.5   Rent (also optimistic)
  monthly         123     Internet+phone

  # Recurring items can have ranges attached to let you reflect changes
  # in amounts over time, etc.
  [--1/3/2009]    monthly         123  Health cover
  [1/3/2009--]    monthly         234  Health cover (the bastards!)

  fortnightly     50      Petrol
  yearly          2345    Gas & Electricity
  yearly          700     Car registration

  # etc...

  # One-off expenditures
  25/02/2009      11.00   Coffee
  25/02/2009      9.50    Lunch      (some extra (ignored) notes here)
  25/02/2009      25.00   Wine
  26/02/2009      25.00   Wine
  27/02/2009      25.00   Wine
  # ... more wine...

Then I point the expenses program at this file to see the report over

$ java -jar expenses.jar ~/.expenses

  Week starting: Sun Feb 22 00:00:00 EST 2009

    Recurring items:

      22/02/2009          Fortnightly pay (I wish)                 5000.00
      22/02/2009          Rent (also optimistic)                  ( 345.50)
      22/02/2009          Internet+phone                          (  30.75)
      22/02/2009          Health cover                            (  30.75)
      22/02/2009          Petrol                                  (  25.00)
      22/02/2009          Gas & Electricity                       (  45.10)
      22/02/2009          Car registration                        (  13.46)

      Subtotal:                                                     4509.44

    Line items:

      25/02/2009          Coffee                                  (  11.00)
      25/02/2009          Lunch                                   (   9.50)
      25/02/2009          Wine                                    (  25.00)
      26/02/2009          Wine                                    (  25.00)
      27/02/2009          Wine                                    (  25.00)

      Subtotal:                                                   (  95.50)

     Total saved: 4413.94

Hooray! I'm fictitiously rich!

And that's basically all it does: it apportions recurring expenses over
each week so you can get a more realistic idea of what they cost you
week-to-week, and makes it easy to record one-off items too. For
recording those one-offs I use a snippet of Emacs lisp which I bind to a

  (defun spend ()
    (let ((now (time-stamp-dd/mm/yyyy))
          (amount (read-number "Amount: "))
          (description (read-string "Description?: ")))
      (with-current-buffer (find-file-noselect "~/.expenses")
        (goto-char (point-max))
        (insert (format "%s\t%.2f\t%s\n"


Simple expenses tracking in Clojure






No releases published


No packages published