<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects — Seconds to Midnight</title><description>Open-source and client projects.</description><link>https://dbuho.me</link><language>en</language><copyright>© 2026 Damián Búho</copyright><managingEditor>damian.buho@proton.me (Damián Búho)</managingEditor><webMaster>damian.buho@proton.me (Damián Búho)</webMaster><lastBuildDate>Thu, 12 Nov 2026 16:25:21 GMT</lastBuildDate><category>Resilience</category><ttl>60</ttl><image><url>https://dbuho.me/favicon-48x48.png</url><title>Projects — Seconds to Midnight</title><link>https://dbuho.me</link></image><atom:link rel="self" type="application/rss+xml" href="https://dbuho.me/projects.rss"/><item><title>Report Relay</title><link>https://dbuho.me/project/report-relay/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M49E3GYQ7XMKW0EP8CZ41ETQ</guid><description>There are so many ways modern browsers can report about problems on the client side: CSP violations, NEL, COOP, COEP, permissions policies, CAA reports, etc). And some amount of projects that can accept them. But surprisingly, I didn&amp;#39;t find anything server software that would accept EVERY ONE of them and do something useful with them. So I made one. Report Relay relays your reports. It won&amp;#39;t do anything else, or it wouldn&amp;#39;t be called Report Relay.</description><pubDate>Sat, 26 Sep 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;There are so many ways modern browsers can report about problems on the client side: CSP violations, NEL, COOP, COEP, permissions policies, CAA reports, etc). And some amount of projects that can accept them.&lt;/p&gt;
&lt;p&gt;But surprisingly, I didn&amp;#39;t find anything server software that would accept EVERY ONE of them and do something useful with them.
So I made one.&lt;/p&gt;
&lt;p&gt;Report Relay relays your reports. It won&amp;#39;t do anything else, or it wouldn&amp;#39;t be called Report Relay.&lt;/p&gt;</content:encoded><category>Observability</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>M6E Makefile Framework</title><link>https://dbuho.me/project/m6e/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBRPB5M41XR42ZJ2XPBB1S</guid><description>This project started as a personal collection of familiar tools, gained declarative fleur, became a make-implementation of Projectfile CI and currently transforming into fully declarative library</description><pubDate>Wed, 01 Jul 2026 22:41:53 GMT</pubDate><content:encoded>&lt;p&gt;This project started as a personal collection of familiar tools, gained declarative fleur, became a make-implementation of &lt;a href=&quot;https://dbuho.me/project/projectfile-ci-resolver/&quot;&gt;Projectfile CI&lt;/a&gt; and currently transforming into fully declarative library&lt;/p&gt;</content:encoded><category>Shell Scripting</category><category>Makefile</category><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Spiderlint</title><link>https://dbuho.me/project/spiderlint/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M3DBNJPMTTFPERSRA15Q0J9C</guid><description>While making personal site, I wanted to be sure that every page is covered. Most of the existing tools focused on checking one URL, or checking the rendered directory with html files, but I wanted it all, I don&amp;#39;t grasp the concept of moderation. I joined a spider/crawler and a linter in one project, with a shockingly creative name, Spiderlint. A thing that produces the most soul crushing reports even if you did your best.</description><pubDate>Tue, 29 Sep 2026 02:59:00 GMT</pubDate><content:encoded>&lt;p&gt;While making personal site, I wanted to be sure that every page is covered.
Most of the existing tools focused on checking one URL, or checking the rendered directory with html files, but I wanted it all, I don&amp;#39;t grasp the concept of moderation.&lt;/p&gt;
&lt;p&gt;I joined a spider/crawler and a linter in one project, with a shockingly creative name, Spiderlint.
A thing that produces the most soul crushing reports even if you did your best.&lt;/p&gt;</content:encoded><category>Accessibility</category><category>Privacy</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Uwindaji Kit</title><link>https://dbuho.me/project/uwindaji-server/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9GME7ET8ZWZRD11ZRT6</guid><description>I needed an automatic system that could gather and store intelligence with evidence-grade quality. It&amp;#39;s an interesting experiment: using &amp;quot;agentic workflows&amp;quot; for something that actually matters. Closed-source project.</description><pubDate>Tue, 01 Sep 2026 03:58:52 GMT</pubDate><content:encoded>&lt;p&gt;I needed an automatic system that could gather and store intelligence with evidence-grade quality.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s an interesting experiment: using &amp;quot;agentic workflows&amp;quot; for something that actually matters.&lt;/p&gt;
&lt;p&gt;Closed-source project.&lt;/p&gt;</content:encoded><category>Intelligence</category><category>Security</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>textlint-rule-ukraine</title><link>https://dbuho.me/project/textlint-rule-ukraine/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9GCQ0DCHWAYVDP0SSDC</guid><description>I stumbled upon on SpellingUkraine project and as an avid user of textlint, decided to implement the same logic as a textlint rule.</description><pubDate>Sat, 16 May 2026 23:58:12 GMT</pubDate><content:encoded>&lt;p&gt;I stumbled upon on &lt;a href=&quot;https://spellingukraine.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;SpellingUkraine&lt;/a&gt; project and as an avid user of textlint, decided to implement the same logic as a textlint rule.&lt;/p&gt;</content:encoded><category>Textlint</category><category>Ukraine</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Support Ukraine Widget</title><link>https://dbuho.me/project/support-ukraine/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9FXPFZRNY7RM2N9Z7V8</guid><description>I needed some way to route support to the cause I am passionated about and existing widgets and banners didn&amp;#39;t fit my preferences, so I made my own.</description><pubDate>Thu, 09 Jul 2026 00:15:37 GMT</pubDate><content:encoded>&lt;p&gt;I needed some way to route support to the cause I am passionated about and existing widgets and banners didn&amp;#39;t fit my preferences, so I made my own.&lt;/p&gt;</content:encoded><category>Ukraine</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Repolinter (fork by Damián Búho)</title><link>https://dbuho.me/project/repolinter/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9FNCJG0601W06VPY89B</guid><description>I was looking for a linter that would do the simplest thing: checking for a file present. I knew it could be solved by a simplest shell-script, but I wanted something more integral and maintainable. I found repolinter project from TODO Group , but it was stale, abandoned and archived. So, I decided to make my first serious fork and refresh it.</description><pubDate>Wed, 27 May 2026 17:27:37 GMT</pubDate><content:encoded>&lt;p&gt;I was looking for a linter that would do the simplest thing: checking for a file present.&lt;/p&gt;
&lt;p&gt;I knew it could be solved by a simplest shell-script, but I wanted something more integral and
maintainable.&lt;/p&gt;
&lt;p&gt;I found &lt;a href=&quot;https://github.com/todogroup/repolinter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;repolinter project from TODO Group&lt;/a&gt;, but it was
stale, abandoned and archived.&lt;/p&gt;
&lt;p&gt;So, I decided to make my first serious fork and refresh it.&lt;/p&gt;</content:encoded><category>Open Source</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>R8E / HTTP Cache</title><link>https://dbuho.me/project/r8e-http-cache/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9DA4YBZPHC65B1XB75J</guid><description>I needed a simple nginx-based proxy that will cache for me arbitrary files. Searched for existing solutions and didn&amp;#39;t find fitting. So I made my own on top of my nginx image. r8e/http-cache is a part of my experiment about creating uncensorable CI. It&amp;#39;s not very practical, but I like making pipelines and fighting censorship.</description><pubDate>Wed, 02 Sep 2026 00:15:42 GMT</pubDate><content:encoded>&lt;p&gt;I needed a simple nginx-based proxy that will cache for me arbitrary files.
Searched for existing solutions and didn&amp;#39;t find fitting.
So I made my own on top of my &lt;a href=&quot;https://dbuho.me/project/o9s-nginx/&quot;&gt;nginx&lt;/a&gt; image.&lt;/p&gt;
&lt;p&gt;r8e/http-cache is a part of my experiment about creating uncensorable CI.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s not very practical, but I like making pipelines and fighting censorship.&lt;/p&gt;</content:encoded><category>Nginx</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>The Projectfile Specification</title><link>https://dbuho.me/project/projectfile-specification/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9AVT2QZD0CQADWNQPQY</guid><description>I hate multitude of files in the roots of my projects, so I decided to add another one to rule them all.</description><pubDate>Mon, 27 Apr 2026 00:15:48 GMT</pubDate><content:encoded>&lt;p&gt;I hate multitude of files in the roots of my projects, so I decided to add another one to rule them
all.&lt;/p&gt;</content:encoded><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Projectfile CLI</title><link>https://dbuho.me/project/projectfile-cli/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9AJTD9JYK531CBZ3P7J</guid><description>Projectfile CLI is the first consumer of the Projectfile specification</description><pubDate>Fri, 11 Sep 2026 00:15:39 GMT</pubDate><content:encoded>&lt;p&gt;Projectfile CLI is the first consumer of the Projectfile specification&lt;/p&gt;</content:encoded><category>Language: Go</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Projectfile CI Resolver</title><link>https://dbuho.me/project/projectfile-ci-resolver/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9AAZCTJHN7MK6ADBJST</guid><description>I needed something to unify local pipelines in makefiles with CI, and I had Projectfile specification. So, I made a special kind of bridge that generates Github/Forgejo workflows from abstract DAG stored in Projectfile.</description><pubDate>Fri, 11 Sep 2026 00:15:39 GMT</pubDate><content:encoded>&lt;p&gt;I needed something to unify local pipelines in makefiles with CI, and I had Projectfile specification.
So, I made a special kind of bridge that generates Github/Forgejo workflows from abstract DAG stored in Projectfile.&lt;/p&gt;</content:encoded><category>Language: Go</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Projectfile Bridges</title><link>https://dbuho.me/project/projectfile-bridges/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G9A13NB8JTH1HB8WY23S</guid><description>Bridges were developed simultaneously with Projectfile Specification as its first consumers.</description><pubDate>Wed, 02 Sep 2026 00:15:39 GMT</pubDate><content:encoded>&lt;p&gt;Bridges were developed simultaneously with &lt;a href=&quot;https://dbuho.me/project/projectfile-specification/&quot;&gt;Projectfile Specification&lt;/a&gt; as its first consumers.&lt;/p&gt;</content:encoded><category>Language: Go</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>O9S / Nginx</title><link>https://dbuho.me/project/o9s-nginx/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G95QZKE9SVC4A7S524GC</guid><description>Most of my life I spent in web development, so it was obvious that somewhere on this downward spiral I will make my own nginx image. Nginx in b19-style .</description><pubDate>Wed, 02 Sep 2026 00:15:33 GMT</pubDate><content:encoded>&lt;p&gt;Most of my life I spent in web development, so it was obvious that somewhere on this downward spiral I will make my own nginx image.
Nginx in &lt;a href=&quot;https://dbuho.me/post/what-is-b19/&quot;&gt;b19-style&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>Nginx</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Ignorelint is a linter for 20+ kinds of ignore files</title><link>https://dbuho.me/project/ignorelint/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8ZHB9H4VA8RS58NSE46</guid><description>I believe that every file should be covered by some kind of static validator, and when I checked for any existing linter for ignore files, I didn&amp;#39;t find any. And I was in need of real Crystal project to test my base Crystal image. So I made one.</description><pubDate>Wed, 02 Sep 2026 00:15:20 GMT</pubDate><content:encoded>&lt;p&gt;I believe that every file should be covered by some kind of static validator, and when I checked for any existing linter for ignore files, I didn&amp;#39;t find any.&lt;/p&gt;
&lt;p&gt;And I was in need of real Crystal project to test my base Crystal image.&lt;/p&gt;
&lt;p&gt;So I made one.&lt;/p&gt;</content:encoded><category>Continuous Integration</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>F5M / I2P</title><link>https://dbuho.me/project/f5m-i2p/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8W491BKNNT5RDEHH2MR</guid><description>I needed I2P container with relevant server (official often looks abandoned). Also, I wanted to compare behaviour of I2P on different JREs So I made one in b19-style</description><pubDate>Wed, 16 Sep 2026 00:15:24 GMT</pubDate><content:encoded>&lt;p&gt;I needed I2P container with relevant server (official often looks abandoned).
Also, I wanted to compare behaviour of I2P on different JREs
So I made one in &lt;a href=&quot;https://dbuho.me/post/what-is-b19&quot;&gt;b19-style&lt;/a&gt;&lt;/p&gt;</content:encoded><category>Censorship</category><category>I2P</category><category>Privacy</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>F5M / I2P Reseed</title><link>https://dbuho.me/project/f5m-i2p-reseed/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8VSNHXQ754TM0QV0EPJ</guid><description>I wanted to support I2P network , and I already had multiple nodes. So, I decided to deploy a reseed server , but the procedure felt very akward, so I made an image that automates 95% of the process (you still need to register your server manually)</description><pubDate>Wed, 16 Sep 2026 00:15:24 GMT</pubDate><content:encoded>&lt;p&gt;I wanted to support &lt;a href=&quot;https://i2p.net&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;I2P network&lt;/a&gt;, and I already had multiple nodes.
So, I decided to deploy a &lt;a href=&quot;https://i2p.net/en/docs/guides/reseed-server/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; class=&quot;external-link&quot;&gt;reseed server&lt;/a&gt;,
but the procedure felt very akward, so I made an image that automates 95% of the process (you still need to register your server manually)&lt;/p&gt;</content:encoded><category>Censorship</category><category>I2P</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Doomsday Clock Exporter — Make your O11Y depressing AF!</title><link>https://dbuho.me/project/doomsday-clock-exporter/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8VEEWTS8MR8GA4S4QMJ</guid><description>When you did everything right, your observability stack becomes boring. Just bunch of green numbers and predictable plots. I asked myself, What if I could add the existential dread in my Grafana, just to feel something again?</description><pubDate>Tue, 28 Apr 2026 03:12:51 GMT</pubDate><content:encoded>&lt;p&gt;When you did everything right, your observability stack becomes boring.
Just bunch of green numbers and predictable plots.
I asked myself, What if I could add the existential dread in my Grafana, just to feel something
again?&lt;/p&gt;</content:encoded><category>Prometheus</category><category>Language: Go</category><category>Docker</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>Custodio</title><link>https://dbuho.me/project/custodio/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8NX13YG9Q0J451EEES4</guid><description>I was a digital nomad for many years, and had multiple surprises. From floods, volcanos and earthquakes to one less-known holiday in Argentina when all the shops are closed. And I don&amp;#39;t like surprises. So I decided to build a service that constantly calculates your risks and warns you about things you should now for your location in space and time. With respect to privacy, notification fatigue and total customization.</description><pubDate>Sun, 03 May 2026 21:35:30 GMT</pubDate><content:encoded>&lt;p&gt;I was a digital nomad for many years, and had multiple surprises.
From floods, volcanos and earthquakes to one less-known holiday in Argentina when all the shops are
closed.&lt;/p&gt;
&lt;p&gt;And I don&amp;#39;t like surprises. So I decided to build a service that constantly calculates your risks
and warns you about things you should now for your location in space and time.&lt;/p&gt;
&lt;p&gt;With respect to privacy, notification fatigue and total customization.&lt;/p&gt;</content:encoded><category>Resilience</category><category>Security</category><author>damian.buho@proton.me (Damián Búho)</author></item><item><title>B19 / Ubuntu</title><link>https://dbuho.me/project/b19-ubuntu/?utm_source=projects&amp;utm_medium=rss</link><guid isPermaLink="false">01M293G8N7ESW3GCC531E81G90</guid><description>In the beginning, I just wanted to have seamless experience between my daily driver OS (Kubuntu) and my containers. With all due respect to Alpine and other bases, I just didn&amp;#39;t want to keep in mind all the differences. Besides that, I really hated Dockerfiles. Especially continuation slashes in them. Any Dockerfile complex enough looks like shit. No one loves them. No one wants to edit them. Then I added one quality of life feature, then another, made some other images for my tasks and ended up with 150+ collection of images in a tree with unified behaviour. I have thousands containers running and I know that some-command-name will work in every one of them.</description><pubDate>Fri, 11 Sep 2026 00:15:19 GMT</pubDate><content:encoded>&lt;p&gt;In the beginning, I just wanted to have seamless experience between my daily driver OS (Kubuntu) and
my containers.
With all due respect to Alpine and other bases, I just didn&amp;#39;t want to keep in mind all the
differences.
Besides that, I really hated Dockerfiles. Especially continuation slashes in them. Any Dockerfile
complex enough looks like shit. No one loves them. No one wants to edit them.&lt;/p&gt;
&lt;p&gt;Then I added one quality of life feature, then another, made some other images for my tasks and
ended up with 150+ collection of images in a tree with unified behaviour. I have thousands
containers running and I know that some-command-name will work in every one of them.&lt;/p&gt;</content:encoded><category>Ubuntu</category><author>damian.buho@proton.me (Damián Búho)</author></item></channel></rss>