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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
---
layout: page
title: "Follow the Blog"
nofollow: true
---
Here's your options for receiving updates about new blog posts:
## Option 1: Email
Email is by far my preferred option for notifying followers of new posts.
The entire email list system for this blog, from storing subscriber email
addresses to the email server which sends the notifications out, has been
designed from scratch and is completely self-hosted in my living room.
I solemnly swear that:
* You will never receive an email from this blog except to notify of a new post.
* Your email will never be provided or sold to anyone else for any reason.
With all that said, if you'd like to receive an email everytime a new blog post
is published then input your email below and smash that subscribe button!
<style>
#emailStatus.success {
color: green;
}
#emailStatus.fail {
color: red;
}
</style>
<input type="email" placeholder="name@host.com" id="emailAddress" />
<input class="button-primary" type="submit" value="Subscribe" id="emailSubscribe" />
<span id="emailStatus"></span>
<script>
const emailAddress = document.getElementById("emailAddress");
const emailSubscribe = document.getElementById("emailSubscribe");
const emailSubscribeOrigValue = emailSubscribe.value;
const emailStatus = document.getElementById("emailStatus");
const solvePow = async (seedHex, target) => {
const worker = new Worker('/assets/solvePow.js');
const p = new Promise((resolve, reject) => {
worker.postMessage({seedHex, target});
worker.onmessage = resolve;
});
const solutionHex = (await p).data;
worker.terminate();
return solutionHex;
}
emailSubscribe.onclick = async () => {
emailSubscribe.disabled = true;
emailSubscribe.className = "";
emailSubscribe.value = "Please hold...";
await (async () => {
setErr = (errStr, retry) => {
emailStatus.className = "fail";
emailStatus.innerHTML = errStr
if (retry) emailStatus.innerHTML += " (please try again)";
};
if (!window.isSecureContext) {
setErr("The browser environment is not secure.", false);
return;
}
const getPowReq = new Request('/api/pow/challenge');
const res = await fetch(getPowReq)
.then(response => response.json())
if (res.error) {
setErr(res.error, true);
return;
}
const powSol = await solvePow(res.seed, res.target);
const subscribeForm = new FormData();
subscribeForm.append('powSeed', res.seed);
subscribeForm.append('powSolution', powSol);
subscribeForm.append('email', emailAddress.value);
const subscribeReq = new Request('/api/mailinglist/subscribe', {
method: 'POST',
body: subscribeForm,
});
const subRes = await fetch(subscribeReq)
.then(response => response.json());
if (subRes.error) {
setErr(subRes.error, true);
return;
}
emailStatus.className = "success";
emailStatus.innerHTML = "Verification email sent (check your spam folder)";
})();
emailSubscribe.disabled = false;
emailSubscribe.className = "button-primary";
emailSubscribe.value = emailSubscribeOrigValue;
};
</script>
## Option 2: RSS
RSS is the classic way to follow any blog. It comes from a time before
aggregators like reddit and twitter stole the show, when people felt capable to
manage their own content feeds. We should use it again.
To follow over RSS give any RSS reader the following URL...
<a href="{{site.url}}/feed.xml">{{site.url}}/feed.xml</a>
...and posts from this blog will show up in your RSS feed as soon as they are
published. There are literally thousands of RSS readers out there. Here's some
recommendations:
* [Google Chrome Browser Extension](https://chrome.google.com/webstore/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp)
* [spaRSS](https://f-droid.org/en/packages/net.etuldan.sparss.floss/) is my
preferred android RSS reader, but you'll need to install
[f-droid](https://f-droid.org/) on your device to use it (a good thing to do
anyway, imo).
* [NetNewsWire](https://ranchero.com/netnewswire/) is a good reader for
iPhone/iPad/Mac devices, so I'm told. Their homepage description makes a much
better sales pitch for RSS than I ever could.
## Option 3: Twitter
New posts are automatically published to [my Twitter](https://twitter.com/{{
site.twitter_username }}). Simply follow me there and pray the algorithm smiles
upon my tweets enough to show them to you! :pray: :pray: :pray:
|