An example output from agenda-html

I absolutely love org mode. I use it extensively almost every day to keep track of tasks and due dates, both for my personal life and at work. A lot of this workflow centres around the org agenda, which compiles all the current and upcoming tasks and due dates from several files into a single view.

The only gripe I had with it was that I had to be within Emacs to use it. This wasn't a deal breaker, but there were often times when I wanted to check my agenda, but I wasn't already in Emacs. In those cases I had to open Emacs and pull up the agenda. This felt a little clunky for something I may check a dozen times every day.

The solution I came up with was a way to automatically generate and export an HTML version of my agenda every 15 minutes on my server. That way I can serve it over HTTP and access it on all my devices. They're also password protected so that strangers on the internet can't access my data.

The heart of this system is a small set of scripts I wrote called agenda-html, which let you export a fully fontified view of the org agenda to HTML without having to open Emacs in a terminal. This means it can be easily scripted.

My org mode files are synchronized between my machines using a self-hosted Nextcloud instance. This means that I have access to all my up to date org documents on a remote machine, which will come in handy very soon.

To start setting things up, I first cloned agenda-html onto the server which hosts my Nextcloud.

I edited config.el and set the location of the org files I wanted included in the agenda. These files are located inside of the Nextcloud storage directory. This would typically be somewhere like /var/www/nextcloud/data/<user>/files/Org. I then set the output for HTML to be /var/www/html/agenda/agenda.html, so that it is served by nginx.

To protect the /agenda path, I then put it behind basic auth.

To do this I downloaded apache2-utils for the htpasswd tool and used it to generate an htpasswd file at /etc/nginx/htpasswd.

htpasswd -c /etc/nginx/htpasswd <user>

I then opened the site's nginx config file in my text editor and added these lines.

location /agenda {
         auth_basic "Agenda Files";
         auth_basic_user_file /etc/nginx/htpasswd;
}

Then I reloaded nginx.

nginx -s reload

Finally I edited root's crontab to run agenda-html.sh every 15 minutes, using this line.

*/15 * * * * /root/agenda-html/agenda-html.sh

To set my new tab page to this agenda, I use an extension for my browsers. This extension can be used to set the new tab page in Chrome, and this one can be used for Firefox.

To ensure I never get bothered by the basic auth dialog when setting my agenda as my new tab page, I save the username and password as part of the URL when setting it.

https://username:password@example.com/agenda/agenda.html

In Firefox, you may get prompted the first time the browser visits the authenticated URL in a session. This can be disabled in about:config by toggling network.auth.confirmAuth.enabled to false.

The agenda-html readme contains a several of tips and suggestions for configuration, such as themeing and agenda layout if you wish to do something similar.

Now every 15 minutes the latest version of my org files are pulled from my Nextcloud storage and exported as an HTML file, which I can view from any device. I'm also able to set as the new tab page in my browser. I'm even able to check it from my phone, or any other device that doesn't have Emacs installed.