summaryrefslogtreecommitdiff
path: root/content
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-10-18 11:06:18 +0800
committereltrac <hi@eltr.ac>2026-10-18 11:06:18 +0800
commitaee76fbea55c64b5f0773b27679aa9db78f6cbb8 (patch)
treea080346862e9c4f208f27237d863b93e63df1013 /content
parent32539dca03f8b6c2aa613ba322e16e3bb74d950d (diff)
[draft] new
Diffstat (limited to 'content')
-rw-r--r--content/en/article/weepinbell.md67
1 files changed, 67 insertions, 0 deletions
diff --git a/content/en/article/weepinbell.md b/content/en/article/weepinbell.md
new file mode 100644
index 00000000..adf76f11
--- /dev/null
+++ b/content/en/article/weepinbell.md
@@ -0,0 +1,67 @@
++++
+title = 'Why a New Webmention Receiver?'
+subtitle = 'The Birth of Weepinbell and How I Designed It'
+slug = ''
+tags = []
+categories = ''
+date = 2026-10-18T09:39:09+08:00
+draft = true
+toc = true
++++
+
+I have been blogging in English for some time, but this is my first time participating in an IndieWeb conversation. So I think I should introduce myslef.
+
+I'm Eltrac. I'm mainly a web developer but I like all kinds of thing about programming. I code in Go, Clojure and Lua, and I explore new tech all the time. I usually blog more than three times a week, but most of my posts are written in Chinese. I recently became an active member of [Codeberg e.V.](https://codeberg.org/Codeberg-e.V.) and have been working on my own FOSS project [weepinbell](https://codeberg.org/eltrac/weepinbell) for a while.
+
+In this post, I will talk about why I developed weepinbell, how I designed its architecture, what I think of the IndieWeb movement and many things.
+
+## Why weepinbell?
+
+I wrote to [Brennan](https://brennan.day/) recently and he was really nice to mention weepinbell [on his blog](https://brennan.day/i-love-sharing-cool-stuff-made-by-people/#other-cool-things). In that email, I talked about how I set a new goal for weepinbell (i.e. an alternative to webmention.io) because of Aaron Parecki rewriting webmention.io with Claude. Later, in [Aaron's response](https://aaronparecki.com/2026/10/17/5/rebuilding-my-indieweb-projects) to [Brennan's new post](https://brennan.day/the-indieweb-now-has-genai-and-claude-built-in-what-do-we-do/), he mentioned weepinbell as "a direct response to my rewrite".
+
+I would like to make things clear. I didn't start developing weepinbell because of Aaron's rewrite. I started early in this May to learn Clojure. I've been blogging (in Chinese) for years and of course I love the concept of IndieWeb. Naturally, my practice project for learning a new language involves IndieWeb technologies.
+
+The motive is that I want to get my hands dirty with the Webmention standard. I read through the [W3C specification document](https://www.w3.org/TR/webmention/) and started putting things in *parentheses*. You can still find snippets from that document in my code as comments. I bascially code against the specification.
+
+```clojure
+ (if-let [error-msg (check-request source target allowlist)]
+ ;; respond if request verification failed
+ (bad-request {:status 400
+ :message error-msg})
+ ;; proceed if request is ok
+ (do
+ ;; The receiver SHOULD check that target is a valid
+ ;; resource for which it can accept Webmentions.
+ ;; This check SHOULD happen synchronously to reject
+ ;; invalid Webmentions before more in-depth verification begins.
+ ;;
+ ;; Webmention verification SHOULD be handled asynchronously
+ ;; to prevent DoS (Denial of Service) attacks.
+ (put! wmc new-wm)
+ ;; respond with 201 when Webmention passed checks and
+ ;; was sent into queue, include a Location header
+ (let [wm-id (digest (str source target))
+ wm-url (str (:base-url config) "/api/mention/" wm-id)
+ response {:status 201
+ :message "Webmention is accepted and pending for verification."
+ :url wm-url}]
+ (created wm-url response))))))
+```
+
+This snippet is from [receiver.clj](https://codeberg.org/eltrac/weepinbell/src/commit/fef78a78f2672701362c83032e0784f6cd94af05/src/weepinbell/webserver/receiver.clj#L47-L68).
+
+After the initial *quick and rough* implementation, I stopped working on weepinbell for a few months. And it had been receiving Webmentions for my blog during that time. Everything worked and I was content. It was bascially a personal tool.
+
+Then the webmention.io rewrite came to my attention.
+
+Why does it bother me? I don't even use webmention.io any more. I see some of my friends seeking alternatives, and... there aren't many to choose from! There is [webmentiond](https://github.com/zerok/webmentiond/) by Horst Gutmann and some other implementations here and there. My friend [Chlorine](https://codeberg.org/chlorine) developed [CircleAt](https://codeberg.org/chlorine/circleat) in Rust. Frankly, none of them truly count as "alternative to webmention.io".
+
+Don't get me wrong. I think many of them are great for their purpose, i.e. small service one can self-host. However, they can be quite difficult for the non-tech IndieWeb folks. ==They need a public instance.==
+
+## For both individuals and large groups
+
+……
+
+## Slowing Down for Refactoring and Testing
+
+## Parsing Microformats: Frustrating Experience