---
title: "Site Update: I Fixed the Patron Page"
date: 2022-05-18
---
So I fixed [the patron page](https://christine.website/patrons) and the
underlying issue was stupid enough that I feel like explaining it so you all can
learn from my mistake.
For those of you playing the christine dot
website home game, look
[here](https://github.com/Xe/site/commit/e2b9f384bf4033eddf321b5b5020ac4847609b37)
to see the fix and play along!
My blog is basically a thin wrapper around two basic things:
1. Markdown files (such as for this article you are reading right now)
2. Static files (such as for the CSS that is making this article look nice)
When I create a package out of my blog's code, I have a layout that resembles
the directory structure in my git repo:
```console
$ ls -l /nix/store/crc94hqyb546w3w9fzdyr8zvz3xf3p1j-xesite-2.4.0
total 64
dr-xr-xr-x 2 root root 4096 Dec 31 1969 bin/
dr-xr-xr-x 2 root root 20480 Dec 31 1969 blog/
-r--r--r-- 24 root root 8663 Dec 31 1969 config.dhall
dr-xr-xr-x 2 root root 4096 Dec 31 1969 css/
dr-xr-xr-x 2 root root 4096 Dec 31 1969 gallery/
-r--r--r-- 52 root root 5902 Dec 31 1969 signalboost.dhall
dr-xr-xr-x 12 root root 4096 Dec 31 1969 static/
dr-xr-xr-x 2 root root 4096 Dec 31 1969 talks/
```
Here is my git repo for comparison:
```console
$ ls -l
total 188
drwxr-xr-x 2 cadey users 20480 May 18 20:21 blog/
-rw-r--r-- 1 cadey users 77521 May 18 20:15 Cargo.lock
-rw-r--r-- 1 cadey users 1795 May 18 20:15 Cargo.toml
-rw-r--r-- 1 cadey users 198 Oct 30 2020 CHANGELOG.md
-rw-r--r-- 1 cadey users 2779 Apr 5 20:32 config.dhall
drwxr-xr-x 2 cadey users 4096 Apr 16 11:56 css/
-rw-r--r-- 1 cadey users 1325 Jan 15 2021 default.nix
drwxr-xr-x 2 cadey users 4096 Mar 15 2020 docs/
drwxr-xr-x 2 cadey users 4096 Mar 21 20:23 examples/
-rw-r--r-- 1 cadey users 1882 Apr 30 16:13 flake.lock
-rw-r--r-- 1 cadey users 6547 Apr 24 20:35 flake.nix
drwxr-xr-x 2 cadey users 4096 Jun 17 2020 gallery/
drwxr-xr-x 6 cadey users 4096 Mar 21 20:23 lib/
-rw-r--r-- 1 cadey users 887 Jan 1 2021 LICENSE
drwxr-xr-x 2 cadey users 4096 Dec 18 00:06 nix/
-rw-r--r-- 1 cadey users 1467 Feb 21 20:39 README.md
drwxr-xr-x 2 cadey users 4096 Mar 21 21:21 scripts/
-rw-r--r-- 1 cadey users 5902 May 18 16:44 signalboost.dhall
drwxr-xr-x 5 cadey users 4096 Apr 5 20:32 src/
drwxr-xr-x 12 cadey users 4096 Jan 10 17:22 static/
drwxr-xr-x 2 cadey users 4096 Nov 10 2021 talks/
drwxr-xr-x 4 cadey users 4096 Apr 16 09:56 target/
drwxr-xr-x 2 cadey users 4096 May 15 07:59 templates/
```
The main problem is that my site expects all of this to be in the current
working directory. In my site's systemd unit I have a launch script that looks
like this:
```nix
script = let site = packages.default;
in ''
export SOCKPATH=${cfg.sockPath}
export DOMAIN=${toString cfg.domain}
cd ${site}
exec ${site}/bin/xesite
'';
```
However the Nix store isn't writable by user code. My patreon API client looked
for its credentials in the current working directory. When I set it up on the
target server I put the credentials in `/srv/within/xesite/.patreon.json`,
thinking that the `WorkingDirectory` setting would make it Just Work:
```nix
WorkingDirectory = "/srv/within/xesite";
```
But this was immediately blown away by the `cd` command on line 4 of the script.
I have fixed this by making my Patreon client put its credentials in the home
directory explicitly with this fragment of code:
```rust
let mut p = dirs::home_dir().unwrap_or(".".into());
p.push(".patreon.json");
```
This will make the Patreon credentials get properly stored in the service's home
directory (which is writable). This will also make the patrons page work
persistently without having to manually rotate secrets every month.
Here's a good lesson for you all, make sure to print out the absolute path of
everything in error messages. For the longest time I had to debug this from this
error message:
```
patrons: xesite::app: ".patreon.json" does not exist
```
I was looking at the directory `/srv/within/xesite` and I saw it existing right
in front of my eyes. This made me feel like I was going crazy and I've been
putting off fixing it because of that. However, it's a simple fix and I was
blind.
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa