Per-project TODO.org files with org-projectile

A TODO.org file is one of the first things I create when starting a new project. I use this file to organize all of the project's milestones and tasks, as well as to track time spent on different items.

One disadvantage with this approach is that scheduled tasks will not appear in the org-agenda without adding the TODO.org's path to org-agenda-files. Doing this by hand can be tedious, especially with a lot of projects.

Thankfully there is a package to help with this: org-projectile. I already use projectile to navigate my projects; org-projectile sits on top of that and adds some useful features:

  • I can jump to the TODO list for a project quickly.
  • I can capture tasks for the current project with a few key presses.
  • All of my project TODO.org files can be added to my agenda with a few lines of code. This makes scheduling project tasks much easier.

I made a couple of changes to integrate it better with my setup. By default org-projectile adds every registered projectile project, but not everything indexed by projectile has a TODO.org file.

This small function filter the list to only projects that exist:

(defun sodaware/org-projectile-todo-files ()
  "Fetch a list of org TODO files for projects that actually exist."
  (seq-filter #'file-exists-p (org-projectile-todo-files)))

;; Add org-projectile files to org.
(setq org-agenda-files
      (append org-agenda-files (sodaware/org-projectile-todo-files)))

I also created a helper function to open the TODO.org file for the current project:

(defun sodaware/org-projectile-goto-project-file ()
  "Open the TODO.org file for the current project."
  (interactive)
  (org-projectile-goto-location-for-project (projectile-project-name)))

My org-projectile configuration looks like this:

(use-package org-projectile
  :after (org)
  :config
  (org-projectile-per-project)
  :custom
  (org-projectile-per-project-filepath "TODO.org"))

(use-package org-projectile-helm
  :after org-projectile
  :bind (("C-c n p" . org-projectile-helm-template-or-project)
	 ("C-c p O" . sodaware/org-projectile-goto-project-file)))

I suck at self-promotion

The Finally Finish Something 2021 game jam finished on Sunday, and Splodey Boats 2000 received a whopping two ratings. Even though they were overwhelmingly positive, I'm still disappointed with how little feedback it received.

I think a big part of this is that even though I reviewed plenty of games, I never directly asked people to review mine.

This pattern is repeated in other areas. I like creating stuff, but I'm always hesitant to share what I've made outside of my own spaces. I think a big part of that is a fear of negative feedback; constructive feedback is fine, but online comments tend to be quite blunt and not all that useful.

I've been spending time on improving how I get things done, but I haven't spent any time on promoting what I've done. As much as I dislike self-promotion, I think it's an important step in improving other areas that I'm working on.

It takes courage to put yourself out there.


Importing CSV files into ledger using reckon

I've been using ledger to manage my accounts for a couple of years, but I've never been 100% happy with the importing process. The process usually goes like this:

  1. Login to my bank and export transactions to a CSV file.
  2. Modify it so that ledger can read it.
  3. Run the convert command to change it to ledger syntax.
  4. Go through the converted file and add categories as needed.

It's not too painful, but there's enough friction to put me off from doing it regularly. As part of my improve my processes goal I wanted to revisit this process and smooth off some rough edges.

There are a number of CSV conversion tools for ledger, and after some experimentation I settled on reckon.

With reckon the import process looks like this:

  1. Login to my bank and export transactions to a CSV file.
  2. Run the reckon command and categorize transactions one-by-one.

It's a much more streamlined process, and categorizing transactions on the command line is nice and easy. One feature I really like about reckon is that it can learn account names from existing files. This makes the data-entry part much quicker, and for some accounts it can be run unattended without making mistakes.

reckon can also use a custom token file when categorizing transactions, so with a little work I could eliminate the manual entry part entirely.


Writing PHP with Emacs - Free sample now available

The Writing PHP with Emacs book page has been updated with a free chapter. It covers adding syntax checking to Emacs via flycheck.

The book is currently priced at $9.99, but will be increasing to $19.99 on March 31st. All future updates are included with the initial purchase.

Read the free chapter: Checking syntax (and more) with flycheck


Groundhog Day Resolutions - February 2021

The first month of the year went very quickly (which apparently is a yearly experience for me). Most of my focus was spent on getting myself organized for the year ahead, but I also spent some time working on games. Here's how January went:

January's primary goals

1. Finalize my 2021 major goals

I now have a list of 12 primary goals to complete this year.

2. Finalize my 2021 secondary goals

I completed my initial list, although I think I'll add more as the year progresses.

3. Set up the 2021 hub page

My 2021 hub page is now online.

4. Release Splodey Boats 2000

This took up a lot of time and energy, but it was nice to get a game completed and released. Splodey Boats 2000 is available for download on itch.io.

January's secondary goals

1. Run 70 miles

I missed one run due to freezing rain, but otherwise I kept to my schedule.

Primary goals for February

1. Finish version 0.3 of Craft Roulette

This mostly involves getting the user-facing forms working correctly and cleaning up a bunch of behind-the-scenes code. My current plan is to have the new version ready for release by the end of March.

2. Finish version 0.7 of Writing PHP with Emacs

The core content is nearly complete, so I'd like to get that finished so I can move on to the "recipes" section of the book.

3. Complete one session of deliberate practice

There were some things I wanted to put into Splodey Boats but didn't have the experience to do. I'd like to spend some time practicing so that I'm able to do it for my next game.

Secondary goals for February

1. Run 90 miles

Weekly miles are ramping up and I need to stay on top of things.

2. Create detail pages for all my major goals

There are a few goals on the list that are a little "fluffy" and need some clarification.

3. Write a post-mortem for Splodey Boats 2000

Post-mortems are really helpful for finding out what worked (and what didn't) during game development. This project went quite smoothly,

January was difficult but successful. Creating Splodey Boats took up a lot of my time and energy, but I'm happy with how it turned out. It felt good to release something this early in the year, and I'm already thinking of ideas for other games I can work on.