summaryrefslogtreecommitdiffstats
path: root/content/posts/WIP-org-agenda-online/index.org
blob: f2cfdbc79a3cc098212ea031ce7b65b610c8f2e4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#+TITLE: Org Agenda Online
#+DATE: 2021-01-13T20:02:32-05:00
#+DRAFT: true
#+DESCRIPTION:
#+TAGS[]: emacs org-mode agenda
#+KEYWORDS[]: emacs org-mode agenda
#+SLUG:
#+SUMMARY:

I absolutely love [[https://orgmode.org/][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 [[https://orgmode.org/features.html#agendas][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 these
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 are also password protected so that strangers on the internet
can't see my agenda.

The heart of this system is a small set of scripts I wrote called
[[https://github.com/dantecatalfamo/agenda-html][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 [[https://nextcloud.com/][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 [[https://github.com/dantecatalfamo/agenda-html][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=.

#+begin_src sh
htpasswd -c /etc/nginx/htpasswd <user>
#+end_src

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

#+begin_src js
location /agenda {
         auth_basic "Agenda Files";
         auth_basic_user_file /etc/nginx/htpasswd;
}
#+end_src

Then I reloaded =nginx= using the command =nginx -s reload=.

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

#+begin_src
*/15 * * * * /root/agenda-html/agenda-html.sh
#+end_src

Now every 15 minutes the latest version of my org files are pulled
from my Nextcloud storage and exported as an agenda, 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 now that I no longer
have to have Emacs installed on a device.