{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Projects",
  "home_page_url": "https://dbuho.me/",
  "feed_url": "https://dbuho.me/projects.json",
  "description": "Open-source and client projects.",
  "authors": [
    {
      "name": "Damián Búho"
    }
  ],
  "items": [
    {
      "id": "01M49E3GYQ7XMKW0EP8CZ41ETQ",
      "url": "https://dbuho.me/project/report-relay/?utm_source=projects&utm_medium=rss",
      "title": "Report Relay",
      "content_html": "<p>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.</p>\n<p>But surprisingly, I didn&#39;t find anything server software that would accept EVERY ONE of them and do something useful with them.\nSo I made one.</p>\n<p>Report Relay relays your reports. It won&#39;t do anything else, or it wouldn&#39;t be called Report Relay.</p>",
      "summary": "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'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't do anything else, or it wouldn't be called Report Relay.",
      "date_published": "2026-09-26T02:59:00.000Z",
      "tags": [
        "Observability"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M3DBRPB5M41XR42ZJ2XPBB1S",
      "url": "https://dbuho.me/project/m6e/?utm_source=projects&utm_medium=rss",
      "title": "M6E Makefile Framework",
      "content_html": "<p>This project started as a personal collection of familiar tools, gained declarative fleur, became a make-implementation of <a href=\"https://dbuho.me/project/projectfile-ci-resolver/\">Projectfile CI</a> and currently transforming into fully declarative library</p>",
      "summary": "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",
      "date_published": "2026-07-01T22:41:53.000Z",
      "tags": [
        "Shell Scripting",
        "Makefile",
        "Continuous Integration"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M3DBNJPMTTFPERSRA15Q0J9C",
      "url": "https://dbuho.me/project/spiderlint/?utm_source=projects&utm_medium=rss",
      "title": "Spiderlint",
      "content_html": "<p>While making personal site, I wanted to be sure that every page is covered.\nMost of the existing tools focused on checking one URL, or checking the rendered directory with html files, but I wanted it all, I don&#39;t grasp the concept of moderation.</p>\n<p>I joined a spider/crawler and a linter in one project, with a shockingly creative name, Spiderlint.\nA thing that produces the most soul crushing reports even if you did your best.</p>",
      "summary": "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'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.",
      "date_published": "2026-09-29T02:59:00.000Z",
      "tags": [
        "Accessibility",
        "Privacy"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9GME7ET8ZWZRD11ZRT6",
      "url": "https://dbuho.me/project/uwindaji-server/?utm_source=projects&utm_medium=rss",
      "title": "Uwindaji Kit",
      "content_html": "<p>I needed an automatic system that could gather and store intelligence with evidence-grade quality.</p>\n<p>It&#39;s an interesting experiment: using &quot;agentic workflows&quot; for something that actually matters.</p>\n<p>Closed-source project.</p>",
      "summary": "I needed an automatic system that could gather and store intelligence with evidence-grade quality. It's an interesting experiment: using \"agentic workflows\" for something that actually matters. Closed-source project.",
      "date_published": "2026-09-01T03:58:52.806Z",
      "tags": [
        "Intelligence",
        "Security"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9GCQ0DCHWAYVDP0SSDC",
      "url": "https://dbuho.me/project/textlint-rule-ukraine/?utm_source=projects&utm_medium=rss",
      "title": "textlint-rule-ukraine",
      "content_html": "<p>I stumbled upon on <a href=\"https://spellingukraine.com/\" rel=\"noopener noreferrer\" target=\"_blank\" class=\"external-link\">SpellingUkraine</a> project and as an avid user of textlint, decided to implement the same logic as a textlint rule.</p>",
      "summary": "I stumbled upon on SpellingUkraine project and as an avid user of textlint, decided to implement the same logic as a textlint rule.",
      "date_published": "2026-05-16T23:58:12.444Z",
      "tags": [
        "Textlint",
        "Ukraine"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9FXPFZRNY7RM2N9Z7V8",
      "url": "https://dbuho.me/project/support-ukraine/?utm_source=projects&utm_medium=rss",
      "title": "Support Ukraine Widget",
      "content_html": "<p>I needed some way to route support to the cause I am passionated about and existing widgets and banners didn&#39;t fit my preferences, so I made my own.</p>",
      "summary": "I needed some way to route support to the cause I am passionated about and existing widgets and banners didn't fit my preferences, so I made my own.",
      "date_published": "2026-07-09T00:15:37.000Z",
      "tags": [
        "Ukraine"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9FNCJG0601W06VPY89B",
      "url": "https://dbuho.me/project/repolinter/?utm_source=projects&utm_medium=rss",
      "title": "Repolinter (fork by Damián Búho)",
      "content_html": "<p>I was looking for a linter that would do the simplest thing: checking for a file present.</p>\n<p>I knew it could be solved by a simplest shell-script, but I wanted something more integral and\nmaintainable.</p>\n<p>I found <a href=\"https://github.com/todogroup/repolinter\" rel=\"noopener noreferrer\" target=\"_blank\" class=\"external-link\">repolinter project from TODO Group</a>, but it was\nstale, abandoned and archived.</p>\n<p>So, I decided to make my first serious fork and refresh it.</p>",
      "summary": "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.",
      "date_published": "2026-05-27T17:27:37.813Z",
      "tags": [
        "Open Source"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9DA4YBZPHC65B1XB75J",
      "url": "https://dbuho.me/project/r8e-http-cache/?utm_source=projects&utm_medium=rss",
      "title": "R8E / HTTP Cache",
      "content_html": "<p>I needed a simple nginx-based proxy that will cache for me arbitrary files.\nSearched for existing solutions and didn&#39;t find fitting.\nSo I made my own on top of my <a href=\"https://dbuho.me/project/o9s-nginx/\">nginx</a> image.</p>\n<p>r8e/http-cache is a part of my experiment about creating uncensorable CI.</p>\n<p>It&#39;s not very practical, but I like making pipelines and fighting censorship.</p>",
      "summary": "I needed a simple nginx-based proxy that will cache for me arbitrary files. Searched for existing solutions and didn'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's not very practical, but I like making pipelines and fighting censorship.",
      "date_published": "2026-09-02T00:15:42.000Z",
      "tags": [
        "Nginx"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9AVT2QZD0CQADWNQPQY",
      "url": "https://dbuho.me/project/projectfile-specification/?utm_source=projects&utm_medium=rss",
      "title": "The Projectfile Specification",
      "content_html": "<p>I hate multitude of files in the roots of my projects, so I decided to add another one to rule them\nall.</p>",
      "summary": "I hate multitude of files in the roots of my projects, so I decided to add another one to rule them all.",
      "date_published": "2026-04-27T00:15:48.064Z",
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9AJTD9JYK531CBZ3P7J",
      "url": "https://dbuho.me/project/projectfile-cli/?utm_source=projects&utm_medium=rss",
      "title": "Projectfile CLI",
      "content_html": "<p>Projectfile CLI is the first consumer of the Projectfile specification</p>",
      "summary": "Projectfile CLI is the first consumer of the Projectfile specification",
      "date_published": "2026-09-11T00:15:39.889Z",
      "tags": [
        "Language: Go"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9AAZCTJHN7MK6ADBJST",
      "url": "https://dbuho.me/project/projectfile-ci-resolver/?utm_source=projects&utm_medium=rss",
      "title": "Projectfile CI Resolver",
      "content_html": "<p>I needed something to unify local pipelines in makefiles with CI, and I had Projectfile specification.\nSo, I made a special kind of bridge that generates Github/Forgejo workflows from abstract DAG stored in Projectfile.</p>",
      "summary": "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.",
      "date_published": "2026-09-11T00:15:39.648Z",
      "tags": [
        "Language: Go"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G9A13NB8JTH1HB8WY23S",
      "url": "https://dbuho.me/project/projectfile-bridges/?utm_source=projects&utm_medium=rss",
      "title": "Projectfile Bridges",
      "content_html": "<p>Bridges were developed simultaneously with <a href=\"https://dbuho.me/project/projectfile-specification/\">Projectfile Specification</a> as its first consumers.</p>",
      "summary": "Bridges were developed simultaneously with Projectfile Specification as its first consumers.",
      "date_published": "2026-09-02T00:15:39.000Z",
      "tags": [
        "Language: Go"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G95QZKE9SVC4A7S524GC",
      "url": "https://dbuho.me/project/o9s-nginx/?utm_source=projects&utm_medium=rss",
      "title": "O9S / Nginx",
      "content_html": "<p>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.\nNginx in <a href=\"https://dbuho.me/post/what-is-b19/\">b19-style</a>.</p>",
      "summary": "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 .",
      "date_published": "2026-09-02T00:15:33.000Z",
      "tags": [
        "Nginx"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8ZHB9H4VA8RS58NSE46",
      "url": "https://dbuho.me/project/ignorelint/?utm_source=projects&utm_medium=rss",
      "title": "Ignorelint is a linter for 20+ kinds of ignore files",
      "content_html": "<p>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&#39;t find any.</p>\n<p>And I was in need of real Crystal project to test my base Crystal image.</p>\n<p>So I made one.</p>",
      "summary": "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't find any. And I was in need of real Crystal project to test my base Crystal image. So I made one.",
      "date_published": "2026-09-02T00:15:20.000Z",
      "tags": [
        "Continuous Integration"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8W491BKNNT5RDEHH2MR",
      "url": "https://dbuho.me/project/f5m-i2p/?utm_source=projects&utm_medium=rss",
      "title": "F5M / I2P",
      "content_html": "<p>I needed I2P container with relevant server (official often looks abandoned).\nAlso, I wanted to compare behaviour of I2P on different JREs\nSo I made one in <a href=\"https://dbuho.me/post/what-is-b19\">b19-style</a></p>",
      "summary": "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",
      "date_published": "2026-09-16T00:15:24.000Z",
      "tags": [
        "Censorship",
        "I2P",
        "Privacy"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8VSNHXQ754TM0QV0EPJ",
      "url": "https://dbuho.me/project/f5m-i2p-reseed/?utm_source=projects&utm_medium=rss",
      "title": "F5M / I2P Reseed",
      "content_html": "<p>I wanted to support <a href=\"https://i2p.net\" rel=\"noopener noreferrer\" target=\"_blank\" class=\"external-link\">I2P network</a>, and I already had multiple nodes.\nSo, I decided to deploy a <a href=\"https://i2p.net/en/docs/guides/reseed-server/\" rel=\"noopener noreferrer\" target=\"_blank\" class=\"external-link\">reseed server</a>,\nbut the procedure felt very akward, so I made an image that automates 95% of the process (you still need to register your server manually)</p>",
      "summary": "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)",
      "date_published": "2026-09-16T00:15:24.000Z",
      "tags": [
        "Censorship",
        "I2P"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8VEEWTS8MR8GA4S4QMJ",
      "url": "https://dbuho.me/project/doomsday-clock-exporter/?utm_source=projects&utm_medium=rss",
      "title": "Doomsday Clock Exporter — Make your O11Y depressing AF!",
      "content_html": "<p>When you did everything right, your observability stack becomes boring.\nJust bunch of green numbers and predictable plots.\nI asked myself, What if I could add the existential dread in my Grafana, just to feel something\nagain?</p>",
      "summary": "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?",
      "date_published": "2026-04-28T03:12:51.317Z",
      "tags": [
        "Prometheus",
        "Language: Go",
        "Docker"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8NX13YG9Q0J451EEES4",
      "url": "https://dbuho.me/project/custodio/?utm_source=projects&utm_medium=rss",
      "title": "Custodio",
      "content_html": "<p>I was a digital nomad for many years, and had multiple surprises.\nFrom floods, volcanos and earthquakes to one less-known holiday in Argentina when all the shops are\nclosed.</p>\n<p>And I don&#39;t like surprises. So I decided to build a service that constantly calculates your risks\nand warns you about things you should now for your location in space and time.</p>\n<p>With respect to privacy, notification fatigue and total customization.</p>",
      "summary": "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'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.",
      "date_published": "2026-05-03T21:35:30.182Z",
      "tags": [
        "Resilience",
        "Security"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    },
    {
      "id": "01M293G8N7ESW3GCC531E81G90",
      "url": "https://dbuho.me/project/b19-ubuntu/?utm_source=projects&utm_medium=rss",
      "title": "B19 / Ubuntu",
      "content_html": "<p>In the beginning, I just wanted to have seamless experience between my daily driver OS (Kubuntu) and\nmy containers.\nWith all due respect to Alpine and other bases, I just didn&#39;t want to keep in mind all the\ndifferences.\nBesides that, I really hated Dockerfiles. Especially continuation slashes in them. Any Dockerfile\ncomplex enough looks like shit. No one loves them. No one wants to edit them.</p>\n<p>Then I added one quality of life feature, then another, made some other images for my tasks and\nended up with 150+ collection of images in a tree with unified behaviour. I have thousands\ncontainers running and I know that some-command-name will work in every one of them.</p>",
      "summary": "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'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.",
      "date_published": "2026-09-11T00:15:19.041Z",
      "tags": [
        "Ubuntu"
      ],
      "authors": [
        {
          "name": "Damián Búho"
        }
      ]
    }
  ]
}