<feed xmlns='http://www.w3.org/2005/Atom'>
<title>weepinbell/src/weepinbell/processor.clj, branch master</title>
<subtitle>A Webmention receiver written in Clojure</subtitle>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/'/>
<entry>
<title>processor: refactor processor; replace mf2j with mf2clj</title>
<updated>2026-09-23T02:15:19+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-09-21T13:34:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=8e616731cd8ef5ace2bfaa3546a5a8bff6699ce0'/>
<id>8e616731cd8ef5ace2bfaa3546a5a8bff6699ce0</id>
<content type='text'>
- replace mf2j with mf2clj
- remove utils.clj completely
- refactored processor, use Chain of Responsibilities pattern and pass
around maps to reuse data (so we don't have to make a separate HTTP
request just to parse microformats, etc.)
- test: add more test cases to verifier test
- test: add basic test cases to all processing steps
- add more logging to each processing steps. good for debugging.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- replace mf2j with mf2clj
- remove utils.clj completely
- refactored processor, use Chain of Responsibilities pattern and pass
around maps to reuse data (so we don't have to make a separate HTTP
request just to parse microformats, etc.)
- test: add more test cases to verifier test
- test: add basic test cases to all processing steps
- add more logging to each processing steps. good for debugging.
</pre>
</div>
</content>
</entry>
<entry>
<title>processor, webhook: send webhooks with customizable payload</title>
<updated>2026-09-19T04:10:45+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-09-16T09:03:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=ef9ca471427b636c1fa42244923a04c548a04d82'/>
<id>ef9ca471427b636c1fa42244923a04c548a04d82</id>
<content type='text'>
- processor will call hook functions with webmention data
- refactor webhook.clj massively
- add dynamic parameter substitution for urls, e.g. {source} {target}
{event}......
- add config option :webhook-request, a function with parameters [hook,
data] that returns a map (resembling {:headers ... :body ...}).
webhook.clj uses this function to generate payload.
- allow map besids URL string in config option :webhook. if it's a URL,
sends webhook request to it with payload generated by :webhook-request;
if it's a map, it should be like {:url ... :request-fn ...}, which
specifies a payload generator.
- add request-fn preset :ntfy
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- processor will call hook functions with webmention data
- refactor webhook.clj massively
- add dynamic parameter substitution for urls, e.g. {source} {target}
{event}......
- add config option :webhook-request, a function with parameters [hook,
data] that returns a map (resembling {:headers ... :body ...}).
webhook.clj uses this function to generate payload.
- allow map besids URL string in config option :webhook. if it's a URL,
sends webhook request to it with payload generated by :webhook-request;
if it's a map, it should be like {:url ... :request-fn ...}, which
specifies a payload generator.
- add request-fn preset :ntfy
</pre>
</div>
</content>
</entry>
<entry>
<title>processor, verifier, webhook: tidy up log msg/level; improve code style</title>
<updated>2026-09-14T09:15:10+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-09-14T08:02:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=435e63927da0594e410f6100e3e2e0f5f64cfbf2'/>
<id>435e63927da0594e410f6100e3e2e0f5f64cfbf2</id>
<content type='text'>
processor: tidy up log msg and level; improve code style

- all messages start with a lower-case letter
- all webmention-related logging contains first 8-digit of its id
- use WARN level when something is deleted, not INFO
- use WARN level when exceptional cases happen, not ERROR
- get rid of emojis in log messages

utils: digest-short function for logging

verifier: tidy up log messages; improve code style

- use `cond` instead of nested `if`s
- same message format as processor's logs

webhook: tidy up log messages; send webhooks robustly

- use same logging formats as processor and verifier
- handle error, 4xx, 5xx status and log them
- move logging inside webhook module, away from core.clj
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
processor: tidy up log msg and level; improve code style

- all messages start with a lower-case letter
- all webmention-related logging contains first 8-digit of its id
- use WARN level when something is deleted, not INFO
- use WARN level when exceptional cases happen, not ERROR
- get rid of emojis in log messages

utils: digest-short function for logging

verifier: tidy up log messages; improve code style

- use `cond` instead of nested `if`s
- same message format as processor's logs

webhook: tidy up log messages; send webhooks robustly

- use same logging formats as processor and verifier
- handle error, 4xx, 5xx status and log them
- move logging inside webhook module, away from core.clj
</pre>
</div>
</content>
</entry>
<entry>
<title>refactor(processor): do not depend on config directly</title>
<updated>2026-05-12T02:45:32+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-12T02:45:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=88594298502531868a7b6b55cfcc899dc2e93ddf'/>
<id>88594298502531868a7b6b55cfcc899dc2e93ddf</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>style: format all source code</title>
<updated>2026-05-09T05:39:25+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-09T05:39:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=541d6a751c1deca1b67ddba8daac6aea35038a04'/>
<id>541d6a751c1deca1b67ddba8daac6aea35038a04</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(processor, verifier): not deleting wm when url respond with HTTP error</title>
<updated>2026-05-08T07:24:17+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-08T07:24:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=9925b406e162eb5a5a46d12fa06909c54c28cd4d'/>
<id>9925b406e162eb5a5a46d12fa06909c54c28cd4d</id>
<content type='text'>
Content-Type checks are somehow written in process-webmention function,
when it should be in verify-mention function, which causes weepinbell
not deleting Webmention when one of target and source is not found (or
any other HTTP status code that is not 2**)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Content-Type checks are somehow written in process-webmention function,
when it should be in verify-mention function, which causes weepinbell
not deleting Webmention when one of target and source is not found (or
any other HTTP status code that is not 2**)
</pre>
</div>
</content>
</entry>
<entry>
<title>refactor(processor): separate verification from processor logic</title>
<updated>2026-05-06T03:56:09+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-06T03:56:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=90f2c68c6e718f60f7b84f4ea8c840801245ddc8'/>
<id>90f2c68c6e718f60f7b84f4ea8c840801245ddc8</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(processor): make process-webmention public</title>
<updated>2026-05-06T03:36:10+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-06T03:36:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=94051f0d73bb8c32be303e045239968892bc9e3d'/>
<id>94051f0d73bb8c32be303e045239968892bc9e3d</id>
<content type='text'>
you can't test it if it's private
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
you can't test it if it's private
</pre>
</div>
</content>
</entry>
<entry>
<title>fix(processor): cannot use &lt;! outside of go-loop</title>
<updated>2026-05-06T03:30:35+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-06T03:30:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=f5e63ff9704582affe74dba844f3578a0bed5008'/>
<id>f5e63ff9704582affe74dba844f3578a0bed5008</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>refactor(processor): a thin wrapper of process-webmention</title>
<updated>2026-05-06T03:25:41+00:00</updated>
<author>
<name>eltrac</name>
<email>hi@eltr.ac</email>
</author>
<published>2026-05-06T03:25:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.eltr.ac/weepinbell.git/commit/?id=15b357f569055dcac47c9716e23d75d536da8645'/>
<id>15b357f569055dcac47c9716e23d75d536da8645</id>
<content type='text'>
process-webmention used to start a go-loop directly.
this commit separates go-loop from processing logic,
core.clj now calls to processor/start, the wrapper
function.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
process-webmention used to start a go-loop directly.
this commit separates go-loop from processing logic,
core.clj now calls to processor/start, the wrapper
function.
</pre>
</div>
</content>
</entry>
</feed>
