ToDefer is a web app for managing tasks on a "best-effort" basis.
Go to file
Joseph Graham 3983f86ff5
fix mistake
2023-09-17 13:37:27 +01:00
.vscode new luminus project 2022-10-08 06:19:12 +01:00
env new luminus project 2022-10-08 06:19:12 +01:00
resources fix mistake 2023-09-17 13:37:27 +01:00
src display habit frequency and due date 2023-09-17 12:25:06 +01:00
test/clj/todefer new luminus project 2022-10-08 06:19:12 +01:00
.gitignore new luminus project 2022-10-08 06:19:12 +01:00
.projectile add .projectile to make sure it ignores things we don't want grepped 2023-06-17 07:41:30 +01:00
COPYING add README and COPYING 2022-12-29 12:36:45 +00:00
Capstanfile new luminus project 2022-10-08 06:19:12 +01:00
Dockerfile new luminus project 2022-10-08 06:19:12 +01:00
Procfile new luminus project 2022-10-08 06:19:12 +01:00 update README 2022-12-31 12:05:05 +00:00
project.clj convert all the javascript functionality to ClojureScript 2023-04-21 08:38:58 +01:00


ToDefer is a web app for managing tasks on a "best-effort" basis.

It's based on Luminus and I designed it to work with PostgreSQL.


What ToDefer provides

ToDefer allows one to define named pages containing either "Tasks" or "Habits".

On Tasks pages, one defers tasks either into named categories, or to specific dates. The tasks then dissapear into their categories until either one brings the out manually or they become due (in-the-case of date categories). The due tasks are shown at the top of the page.

On habits pages, each "Habit" has a recurrance frequency. Habits that are not due are hidden away. Habits that are due are shown at the top of the page to be dealt with.

Note that Habits recurr from the date they are marked done, not the date they were due to be done.

What it's not

ToDefer is not a calendar. It is not for recording appointments or holidays or yoga sessions. It maintains lists of tasks.

ToDefer is not a deadline management system. It is actually kind-of like a time-reversed version of a deadline-management system. It's not "this needs to be done by 12th March and I'd like to be reminded a week in advance". It's more like "I don't want to think about this until after the 12th March".

What problem it seeks to solve

When one makes a list of things one would like to do, it often becomes absurdely long. Easily with dozens of tasks on it. And then it just becomes intimidating.

Furthermore there is likely several items on the list that cannot be done right now. Maybe that task can only be done during working hours (call bank or go shopping), or that task can only be done after I get payed etc.

The idea is therefore to stash things away into deferred categories so that one has a short, managable list of things to pay-attention-to today.

Running this code

Here I explain briefly how you may run this code on your workstation for development.


Create a PostgreSQL database and user, and create a file dev-config.edn with credentials. An example of how that might look:

{:dev true
 :port 3000
 ;; when :nrepl-port is set the application starts the nREPL server on load
 :nrepl-port 7000
 ; set your dev database connection URL here
 :database-url "postgresql://localhost/dbname?user=dbuser&password=dbpass"

To start a web server for the application, run:

lein repl

Now you should be able to access the app at http://localhost:3000/.

To create credentials to login type these in the repl (after running (start)):

(in-ns 'todefer.authfunctions)
 (create-user! "youruser" "yourpass")

n.b. ToDefer is not multi-user so if you make multiple logins they will all see the same content.


If you are willing to comply with the requirements of the GNU GPL you may use this code for yourself.

For general info on hosting Luminus apps check out the luminus docs.

To create an admin login, the .jar can be called with an argument "add-user". Here is an example:

set -o allexport
source /var/todefer/env
/usr/bin/java -jar /var/todefer/todefer.jar add-user

It will prompt you for a username and password.


Copyright © 2022 Joseph Graham

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see