Validate your RSS feed

Published on

203 min read
Table of contents

Today a dear user made me aware that my RSS feed broke. There was a XML Parsing Error for cri.dev/rss.xml.

ASAP after work I checked the validity through validator.w3.org/feed/ and in fact there were some issues with it.

Apparently a mismatched tag </link> was causing the parser to go berserk.

w3-feed-validator.png
After understanding the issue, I simplified the rss.md (which generates the rss.xml through devblog) and used scripting.com/rss.xml as an example.

Stripped away all the tags I didn’t need, and this is the resulting version of rss.md:

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>Christian Fei's Blog</title>
<link><![CDATA[https://cri.dev]]></link>
<description>A blog about my programming adventures in Elixir, Node.js and JavaScript</description><item>
<title><![CDATA[How to index a NTFS partition on Mac]]></title>
<link><![CDATA[https://cri.dev/posts/2012-12-23-enable-indexing-of-ntfs-partition-on-mac/]]></link>
<guid><![CDATA[https://cri.dev/posts/2012-12-23-enable-indexing-of-ntfs-partition-on-mac/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Replace links in files with Regular Expressions]]></title>
<link><![CDATA[https://cri.dev/posts/2013-03-29-replace-links-in-files-with-regular-expressions/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-03-29-replace-links-in-files-with-regular-expressions/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Berlin - April 2013]]></title>
<link><![CDATA[https://cri.dev/posts/2013-04-21-berlin-april-2013/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-04-21-berlin-april-2013/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Auto mount partition on Linux the easy way]]></title>
<link><![CDATA[https://cri.dev/posts/2013-05-08-auto-mount-partitions-on-linux-the-easy-way/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-05-08-auto-mount-partitions-on-linux-the-easy-way/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to lazy load Disqus comments]]></title>
<link><![CDATA[https://cri.dev/posts/2013-06-06-how-to-lazy-load-disqus-comments/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-06-06-how-to-lazy-load-disqus-comments/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to: Gzip compression of CSS and JS files on S3 with s3cmd]]></title>
<link><![CDATA[https://cri.dev/posts/2013-07-16-how-to-gzip-compression-of-css-and-js-files-on-s3-with-s3cmd/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-07-16-how-to-gzip-compression-of-css-and-js-files-on-s3-with-s3cmd/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Keep SSH connection alive]]></title>
<link><![CDATA[https://cri.dev/posts/2013-09-17-keep-ssh-connection-alive/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-09-17-keep-ssh-connection-alive/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple templating with regular expressions]]></title>
<link><![CDATA[https://cri.dev/posts/2013-10-12-simple-templating-with-regular-expressions/]]></link>
<guid><![CDATA[https://cri.dev/posts/2013-10-12-simple-templating-with-regular-expressions/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[About vanity metrics and social media bullshit]]></title>
<link><![CDATA[https://cri.dev/posts/2014-01-04-about-vanity-metrics-and-social-media-bullshit/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-01-04-about-vanity-metrics-and-social-media-bullshit/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Create a new Github repository from the command line]]></title>
<link><![CDATA[https://cri.dev/posts/2014-01-05-create-a-new-github-repository-from-the-command-line/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-01-05-create-a-new-github-repository-from-the-command-line/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simplest Apache configuration for hosting multiple sites]]></title>
<link><![CDATA[https://cri.dev/posts/2014-01-18-simplest-apache-configuration-for-hosting-multiple-sites/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-01-18-simplest-apache-configuration-for-hosting-multiple-sites/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[node and sudo: now kiss]]></title>
<link><![CDATA[https://cri.dev/posts/2014-01-19-node-and-sudo-now-kiss/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-01-19-node-and-sudo-now-kiss/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Updating dynamic fields and nested arrays in MongoDB]]></title>
<link><![CDATA[https://cri.dev/posts/2014-03-04-updating-dynamic-fields-and-nested-arrays-in-mongodb/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-03-04-updating-dynamic-fields-and-nested-arrays-in-mongodb/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[A closer look at Angular&#39;s dependency injection]]></title>
<link><![CDATA[https://cri.dev/posts/2014-05-26-A-closer-look-at-Angular&#39;s-dependency-injection/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-05-26-A-closer-look-at-Angular&#39;s-dependency-injection/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[DRY dependency injection in Angular with gulp-ng-annotate]]></title>
<link><![CDATA[https://cri.dev/posts/2014-06-30-DRY-dependency-injection-in-Angular-with-gulp-ng-annotate/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-06-30-DRY-dependency-injection-in-Angular-with-gulp-ng-annotate/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[A practical workflow for resizing images with ImageMagick]]></title>
<link><![CDATA[https://cri.dev/posts/2014-07-05-A-practical-workflow-for-resizing-images-with-ImageMagick/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-07-05-A-practical-workflow-for-resizing-images-with-ImageMagick/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to setup Drone CI on a DigitalOcean droplet]]></title>
<link><![CDATA[https://cri.dev/posts/2014-08-02-How-to-setup-Drone-CI-on-your-server/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-08-02-How-to-setup-Drone-CI-on-your-server/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to configure Drone behind an nginx proxy on a subdomain]]></title>
<link><![CDATA[https://cri.dev/posts/2014-08-03-How-to-configure-Drone-behind-an-nginx-proxy-on-a-subdomain/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-08-03-How-to-configure-Drone-behind-an-nginx-proxy-on-a-subdomain/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[PhoneGap issue, &#39;device ready&#39; not fired after 5 seconds]]></title>
<link><![CDATA[https://cri.dev/posts/2014-08-20-Solution-to-PhoneGap-issue-device-ready-has-not-fired-after-5-seconds/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-08-20-Solution-to-PhoneGap-issue-device-ready-has-not-fired-after-5-seconds/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Angular: Filter already selected items from ng-options]]></title>
<link><![CDATA[https://cri.dev/posts/2014-08-22-Angular-Filter-already-selected-items-from-ng-options/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-08-22-Angular-Filter-already-selected-items-from-ng-options/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[A list of Angular style guides]]></title>
<link><![CDATA[https://cri.dev/posts/2014-10-27-a-list-of-angular-style-guides/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-10-27-a-list-of-angular-style-guides/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Keep Docker container running]]></title>
<link><![CDATA[https://cri.dev/posts/2014-12-23-keep-docker-container-running-with-upstart-and-dockers-restart-policy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2014-12-23-keep-docker-container-running-with-upstart-and-dockers-restart-policy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Debugging acceptance tests with Angular and Cucumber]]></title>
<link><![CDATA[https://cri.dev/posts/2015-01-09-Debugging-acceptance-tests-with-Angular-and-Cucumber/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-01-09-Debugging-acceptance-tests-with-Angular-and-Cucumber/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to zsh and hub auto completition]]></title>
<link><![CDATA[https://cri.dev/posts/2015-01-16-How-to-zsh-and-hub-auto-completition/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-01-16-How-to-zsh-and-hub-auto-completition/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Write your Protractor tests in Cucumber]]></title>
<link><![CDATA[https://cri.dev/posts/2015-01-17-Write-your-Protractor-tests-in-Cucumber/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-01-17-Write-your-Protractor-tests-in-Cucumber/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Start your coding kata the right way]]></title>
<link><![CDATA[https://cri.dev/posts/2015-02-21-start-your-kata-the-right-way/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-02-21-start-your-kata-the-right-way/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to use morgan with node-simple-router]]></title>
<link><![CDATA[https://cri.dev/posts/2015-02-23-How-to-use-morgan-with-node-simple-router/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-02-23-How-to-use-morgan-with-node-simple-router/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to make a pull request on GitHub from the command line]]></title>
<link><![CDATA[https://cri.dev/posts/2015-03-04-How-to-pull-request-from-command-line/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-03-04-How-to-pull-request-from-command-line/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Speed up your docker container by caching node_modules]]></title>
<link><![CDATA[https://cri.dev/posts/2015-03-06-Cache-speed-up-docker-node-modules/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-03-06-Cache-speed-up-docker-node-modules/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Angular ui-router: define multiple states with same base url]]></title>
<link><![CDATA[https://cri.dev/posts/2015-04-23-Angular-ui-router-same-url-different-state/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-04-23-Angular-ui-router-same-url-different-state/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[About business value and confidence in legacy projects]]></title>
<link><![CDATA[https://cri.dev/posts/2015-04-27-About-business-value-and-confidence-in-legacy-projects/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-04-27-About-business-value-and-confidence-in-legacy-projects/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Functional JavaScript: Write your own negate/not function]]></title>
<link><![CDATA[https://cri.dev/posts/2015-05-09-Functional-JavaScript-write-your-negate-not-function/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-05-09-Functional-JavaScript-write-your-negate-not-function/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Write a damn README]]></title>
<link><![CDATA[https://cri.dev/posts/2015-05-24-write-a-damn-readme/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-05-24-write-a-damn-readme/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Conforming to protocols in JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2015-07-04-Conforming-to-protocols-in-JavaScript/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-07-04-Conforming-to-protocols-in-JavaScript/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Backup mongodb from a docker container to host]]></title>
<link><![CDATA[https://cri.dev/posts/2015-07-05-Backup-mongodb-database-from-docker-container-to-host/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-07-05-Backup-mongodb-database-from-docker-container-to-host/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[The simplest way to set vagrant default directory]]></title>
<link><![CDATA[https://cri.dev/posts/2015-07-07-The-simplest-way-to-set-vagrant-default-directory/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-07-07-The-simplest-way-to-set-vagrant-default-directory/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to invalidate AppCache]]></title>
<link><![CDATA[https://cri.dev/posts/2015-08-12-How-to-invalidate-app-cache/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-08-12-How-to-invalidate-app-cache/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Always $digest after you expect]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-15-Always-$digest-after-you-expect/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-15-Always-$digest-after-you-expect/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Favor Viewmodel over $scope]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-18-Favor-Viewmodel-over-$scope/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-18-Favor-Viewmodel-over-$scope/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[What Elixir and Angular have in common]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-19-What-Elixir-and-Angular-have-in-common/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-19-What-Elixir-and-Angular-have-in-common/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Introduction to AngularJS]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-20-Introduction-to-AngularJS/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-20-Introduction-to-AngularJS/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Jekyll new post script]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-24-Jekyll-new-post-script/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-24-Jekyll-new-post-script/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Elixir Plug order matters!]]></title>
<link><![CDATA[https://cri.dev/posts/2015-10-25-Elixir-Plug-order-matters/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-10-25-Elixir-Plug-order-matters/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Using a daily activity log]]></title>
<link><![CDATA[https://cri.dev/posts/2015-11-23-Using-a-daily-activity-log-to-keep-track-of-your-studies-and-bookmarks/]]></link>
<guid><![CDATA[https://cri.dev/posts/2015-11-23-Using-a-daily-activity-log-to-keep-track-of-your-studies-and-bookmarks/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Forking is a commitment]]></title>
<link><![CDATA[https://cri.dev/posts/2016-01-07-Forking-is-a-commitment/]]></link>
<guid><![CDATA[https://cri.dev/posts/2016-01-07-Forking-is-a-commitment/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[I was at fosdem 2016 and it was awesome!]]></title>
<link><![CDATA[https://cri.dev/posts/2016-02-03-i-was-at-fosdem-2016-and-it-was-awesome/]]></link>
<guid><![CDATA[https://cri.dev/posts/2016-02-03-i-was-at-fosdem-2016-and-it-was-awesome/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Discourse first installation steps]]></title>
<link><![CDATA[https://cri.dev/posts/2016-05-28-discourse-first-installation-steps/]]></link>
<guid><![CDATA[https://cri.dev/posts/2016-05-28-discourse-first-installation-steps/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Use Simple-Jekyll-Search on your blog in these easy steps]]></title>
<link><![CDATA[https://cri.dev/posts/2017-02-05-Use-Simple-Jekyll-Search-on-your-blog-in-these-easy-steps/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-02-05-Use-Simple-Jekyll-Search-on-your-blog-in-these-easy-steps/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to read Hacker Newsletter]]></title>
<link><![CDATA[https://cri.dev/posts/2017-02-10-How-to-read-Hacker-Newsletter/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-02-10-How-to-read-Hacker-Newsletter/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Chaining and indenting after the return statement]]></title>
<link><![CDATA[https://cri.dev/posts/2017-02-22-Chaining-and-indenting-after-the-return-statement/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-02-22-Chaining-and-indenting-after-the-return-statement/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Trying out Redash]]></title>
<link><![CDATA[https://cri.dev/posts/2017-02-24-Trying-out-Redash/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-02-24-Trying-out-Redash/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[npm package kata]]></title>
<link><![CDATA[https://cri.dev/posts/2017-03-22-npm-package-kata/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-03-22-npm-package-kata/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[how i build my site]]></title>
<link><![CDATA[https://cri.dev/posts/2017-03-23-how-i-build-my-site/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-03-23-how-i-build-my-site/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[how i deploy my site]]></title>
<link><![CDATA[https://cri.dev/posts/2017-03-24-how-i-deploy-my-site/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-03-24-how-i-deploy-my-site/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Prevent accidental quit of iTerm]]></title>
<link><![CDATA[https://cri.dev/posts/2017-03-27-Prevent-accidental-quit-of-iTerm/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-03-27-Prevent-accidental-quit-of-iTerm/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[My dotfiles]]></title>
<link><![CDATA[https://cri.dev/posts/2017-03-30-My-dotfiles/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-03-30-My-dotfiles/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Loop jekyll data directory files]]></title>
<link><![CDATA[https://cri.dev/posts/2017-04-15-Loop-jekyll-data-directory-files/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-04-15-Loop-jekyll-data-directory-files/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Keeping an eye on your Crypto-currency trades with Übersicht]]></title>
<link><![CDATA[https://cri.dev/posts/2017-10-13-Keeping-an-eye-on-your-Crypto-currency-trades-with-Uebersicht/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-10-13-Keeping-an-eye-on-your-Crypto-currency-trades-with-Uebersicht/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Building the new version of pomodoro.cc in the open]]></title>
<link><![CDATA[https://cri.dev/posts/2017-10-21-Building-the-new-version-of-pomodoro.cc-in-the-open/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-10-21-Building-the-new-version-of-pomodoro.cc-in-the-open/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Mapping historic market data]]></title>
<link><![CDATA[https://cri.dev/posts/2017-12-11-Mapping-historic-market-data/]]></link>
<guid><![CDATA[https://cri.dev/posts/2017-12-11-Mapping-historic-market-data/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[A story about npm publish / unpublish]]></title>
<link><![CDATA[https://cri.dev/posts/2018-01-31-a-story-about-npm-publish-unpublish/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-01-31-a-story-about-npm-publish-unpublish/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[setup nginx as a reverse proxy with basic auth for an upstream]]></title>
<link><![CDATA[https://cri.dev/posts/2018-02-07-setup-nginx-as-a-reverse-proxy-with-basic-auth-for-an-upstream/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-02-07-setup-nginx-as-a-reverse-proxy-with-basic-auth-for-an-upstream/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Offloading my Inbox items to /discover]]></title>
<link><![CDATA[https://cri.dev/posts/2018-04-05-Offloading-my-Inbox-items-to-discover/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-04-05-Offloading-my-Inbox-items-to-discover/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fix issue with Pandoc, MacOS Sierra and pdflatex / xelatex]]></title>
<link><![CDATA[https://cri.dev/posts/2018-04-09-Fix-issue-with-Pandoc-MacOS-Sierra-and-pdflatex-xelatex/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-04-09-Fix-issue-with-Pandoc-MacOS-Sierra-and-pdflatex-xelatex/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Easy rate limit with Promise.all and p-limit]]></title>
<link><![CDATA[https://cri.dev/posts/2018-04-12-Easy-rate-limit-API-calls-with-p-limit/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-04-12-Easy-rate-limit-API-calls-with-p-limit/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes about Blockchain for Smart Communities]]></title>
<link><![CDATA[https://cri.dev/posts/2018-04-12-Notes-about-Blockchain-for-Smart-Communities-trentosmart-TSCW18/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-04-12-Notes-about-Blockchain-for-Smart-Communities-trentosmart-TSCW18/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fix Python 2.7 issue on OSX: bad interpreter]]></title>
<link><![CDATA[https://cri.dev/posts/2018-04-18-Fix-Python-2-7-issue-on-OSX-bad-interpreter/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-04-18-Fix-Python-2-7-issue-on-OSX-bad-interpreter/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Cryptosheet.cc, The Launch]]></title>
<link><![CDATA[https://cri.dev/posts/2018-06-20-Cryptosheet.cc-The-Launch/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-06-20-Cryptosheet.cc-The-Launch/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Using Cryptosheet.cc, aggregations]]></title>
<link><![CDATA[https://cri.dev/posts/2018-06-26-Using-Cryptosheet.cc-Aggregate-account-balance-by-exchange-and-currency-pair/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-06-26-Using-Cryptosheet.cc-Aggregate-account-balance-by-exchange-and-currency-pair/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[pm2 deploy fast]]></title>
<link><![CDATA[https://cri.dev/posts/2018-07-03-pm2-deploy-shallow-git-repository-with---depth-also-known-as-fetch-fast/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-07-03-pm2-deploy-shallow-git-repository-with---depth-also-known-as-fetch-fast/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[clean android device storage]]></title>
<link><![CDATA[https://cri.dev/posts/2018-07-11-clean-android-device-storage-move-files-to-sd-card-remove-junk-files/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-07-11-clean-android-device-storage-move-files-to-sd-card-remove-junk-files/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Using Cryptosheet.cc, Extract cumulative wallet size]]></title>
<link><![CDATA[https://cri.dev/posts/2018-07-28-Using-Cryptosheet.cc-Extract-the-cumulative-historic-wallet-size-for-a-specific-crypto-currency-and-exchange/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-07-28-Using-Cryptosheet.cc-Extract-the-cumulative-historic-wallet-size-for-a-specific-crypto-currency-and-exchange/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Make Anaconda executables available in your PATH (fish shell)]]></title>
<link><![CDATA[https://cri.dev/posts/2018-10-06-Make-Anaconda-executables-available-in-your-PATH-fish-shell/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-10-06-Make-Anaconda-executables-available-in-your-PATH-fish-shell/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Start an npm script with pm2]]></title>
<link><![CDATA[https://cri.dev/posts/2018-10-18-Start-an-npm-script-with-pm2/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-10-18-Start-an-npm-script-with-pm2/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[my current blogging stack]]></title>
<link><![CDATA[https://cri.dev/posts/2018-10-31-my-current-blogging-stack/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-10-31-my-current-blogging-stack/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Publishing org scoped npm packages with travis]]></title>
<link><![CDATA[https://cri.dev/posts/2018-11-28-Publishing-org-scoped-npm-packages-with-travis/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-11-28-Publishing-org-scoped-npm-packages-with-travis/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes about Crash course in Machine Learning]]></title>
<link><![CDATA[https://cri.dev/posts/2018-12-09-Notes-about-Crash-course-in-Machine-Learning/]]></link>
<guid><![CDATA[https://cri.dev/posts/2018-12-09-Notes-about-Crash-course-in-Machine-Learning/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to fix Ansible error about &quot;undefined variable&quot;]]></title>
<link><![CDATA[https://cri.dev/posts/2019-04-04-How-to-fix-Ansible-error-The-task-includes-an-option-with-an-undefined-variable/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-04-04-How-to-fix-Ansible-error-The-task-includes-an-option-with-an-undefined-variable/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Get last non-empty cell value in a spreadsheet]]></title>
<link><![CDATA[https://cri.dev/posts/2019-04-07-Get-last-non-empty-cell-value-in-a-spreadsheet/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-04-07-Get-last-non-empty-cell-value-in-a-spreadsheet/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Upgrade MongoDB 3 to 4 on Ubuntu]]></title>
<link><![CDATA[https://cri.dev/posts/2019-07-16-Upgrade-MongoDB-3-to-4-on-Ubuntu/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-07-16-Upgrade-MongoDB-3-to-4-on-Ubuntu/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fun with single letter commands]]></title>
<link><![CDATA[https://cri.dev/posts/2019-07-19-Fun-with-single-letter-commands/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-07-19-Fun-with-single-letter-commands/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Build for a slow connection]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-25-Build-for-a-slow-connection/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-25-Build-for-a-slow-connection/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple ad and trackers blocking with DNS]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-26-Simple-ad-and-trackers-blocking-with-DNS/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-26-Simple-ad-and-trackers-blocking-with-DNS/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Deploy Eleventy site with Github Actions on AWS S3]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-29-Deploy-Eleventy-site-with-Github-Actions-on-AWS-S3/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-29-Deploy-Eleventy-site-with-Github-Actions-on-AWS-S3/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Preferred way of defining flags in bash]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-29-Preferred-way-of-defining-flags-in-bash/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-29-Preferred-way-of-defining-flags-in-bash/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple telegram message with GitHub Actions]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-29-Simple-telegram-message-with-GitHub-Actions/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-29-Simple-telegram-message-with-GitHub-Actions/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[AWS Lambda + S3 + ffmpeg = Timelapse]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-30-AWS-Lambda-+-S3-+-ffmpeg-Timelapse/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-30-AWS-Lambda-+-S3-+-ffmpeg-Timelapse/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Run Cypress Integration Tests with GitHub Actions Workflow]]></title>
<link><![CDATA[https://cri.dev/posts/2019-08-31-Run-Cypress-Integration-Tests-with-GitHub-Actions-Workflow/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-08-31-Run-Cypress-Integration-Tests-with-GitHub-Actions-Workflow/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[my blogging stack in 2020]]></title>
<link><![CDATA[https://cri.dev/posts/2019-10-27-my-blogging-stack-in-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-10-27-my-blogging-stack-in-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[completed hacktoberfest 2019]]></title>
<link><![CDATA[https://cri.dev/posts/2019-12-08-completed-hacktoberfest-2019/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-12-08-completed-hacktoberfest-2019/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[better web scraping with node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2019-12-11-better-web-scraping-with-nodejs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-12-11-better-web-scraping-with-nodejs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[the color fe1]]></title>
<link><![CDATA[https://cri.dev/posts/2019-12-12-the-color-fe1/]]></link>
<guid><![CDATA[https://cri.dev/posts/2019-12-12-the-color-fe1/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Raspberry SSH over Wi-Fi not working]]></title>
<link><![CDATA[https://cri.dev/posts/2020-01-03-Raspberry-SSH-connect-over-Wi-Fi-Wireless-not-working-host-not-found/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-01-03-Raspberry-SSH-connect-over-Wi-Fi-Wireless-not-working-host-not-found/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[The cleanest way to maintain connect / express middlewares in Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-01-28-The-cleanest-way-to-maintain-connect-express-middlewares-in-node-js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-01-28-The-cleanest-way-to-maintain-connect-express-middlewares-in-node-js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Recover from failed lerna publish]]></title>
<link><![CDATA[https://cri.dev/posts/2020-01-29-How-to-recover-from-failed-lerna-publish/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-01-29-How-to-recover-from-failed-lerna-publish/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Lazy loading images in 2020]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-05-Lazy-loading-images-in-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-05-Lazy-loading-images-in-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Connect to MongoDB with monk in Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-08-Connect-to-mongo-with-monk-in-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-08-Connect-to-mongo-with-monk-in-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Minimal environments with dotenv and Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-08-Minimal-environments-with-dotenv-and-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-08-Minimal-environments-with-dotenv-and-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simplest Vanilla JavaScript static site blog search for Jekyll, Hugo, 11.ty]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-08-Simplest-Vanilla-JavaScript-static-site-blog-search-for-Jekyll,-Hugo,-11.ty-eleventy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-08-Simplest-Vanilla-JavaScript-static-site-blog-search-for-Jekyll,-Hugo,-11.ty-eleventy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[So Long, and Thanks for All the Veggies]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-13-So-Long-and-Thanks-for-All-the-Veggies/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-13-So-Long-and-Thanks-for-All-the-Veggies/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Twitter OAuth by example in Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-15-Twitter-OAuth-by-example-in-Nodejs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-15-Twitter-OAuth-by-example-in-Nodejs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple .npmrc management]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-25-Simple-npmrc-management/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-25-Simple-npmrc-management/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Take a photo with raspistill on a Raspberry Pi]]></title>
<link><![CDATA[https://cri.dev/posts/2020-02-29-Take-a-photo-with-raspistill-on-a-Raspberry-Pi/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-02-29-Take-a-photo-with-raspistill-on-a-Raspberry-Pi/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[About Cloudflare&#39;s support for ccTLDs and gTLDs]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-01-About-Cloudflare&#39;s-support-for-ccTLDs-and-gTLDs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-01-About-Cloudflare&#39;s-support-for-ccTLDs-and-gTLDs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[First steps with Darklang]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-02-First-steps-with-Darklang/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-02-First-steps-with-Darklang/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Send a Telegram message with Darklang]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-04-Send-a-Telegram-message-with-Darklang/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-04-Send-a-Telegram-message-with-Darklang/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Twitter OAuth Login by example with Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-05-Twitter-OAuth-Login-by-example-with-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-05-Twitter-OAuth-Login-by-example-with-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to create a Twitter application for user login with OAuth]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-07-How-to-create-a-Twitter-application-for-user-login/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-07-How-to-create-a-Twitter-application-for-user-login/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Twitter OAuth Login with fastify and Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-07-Twitter-OAuth-Login-with-fastify-and-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-07-Twitter-OAuth-Login-with-fastify-and-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Ultimate web scraping with browserless, puppeteer and Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-08-Ultimate-web-scraping-with-browserless,-puppeteer-and-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-08-Ultimate-web-scraping-with-browserless,-puppeteer-and-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Crawling a web site with browserless, puppeteer and Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-09-Crawling-a-web-site-with-browserless,-puppeteer-and-Node.js/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-09-Crawling-a-web-site-with-browserless,-puppeteer-and-Node.js/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to solve: Please specify which branch you want to rebase against]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-27-How-to-solve-Please-specify-which-branch-you-want-to-rebase-against/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-27-How-to-solve-Please-specify-which-branch-you-want-to-rebase-against/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to connect puppeteer to a Proxy]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-30-How-to-connect-puppeteer-to-a-Proxy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-30-How-to-connect-puppeteer-to-a-Proxy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to solve Puppeteer Chrome Error ERR_INVALID_ARGUMENT]]></title>
<link><![CDATA[https://cri.dev/posts/2020-03-30-How-to-solve-Puppeteer-Chrome-Error-ERR_INVALID_ARGUMENT/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-03-30-How-to-solve-Puppeteer-Chrome-Error-ERR_INVALID_ARGUMENT/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Full list of Chromium Puppeteer flags and command line switches]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-04-Full-list-of-Chromium-Puppeteer-flags/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-04-Full-list-of-Chromium-Puppeteer-flags/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Boring software development]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-05-Boring-software-development/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-05-Boring-software-development/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Preferred Visual Studio Code theme in 2020]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-07-Preferred-Visual-Studio-Code-theme-in-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-07-Preferred-Visual-Studio-Code-theme-in-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[devblog: yet another static site generator, seriously]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-19-devblog-yet-another-static-site-generator-seriously/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-19-devblog-yet-another-static-site-generator-seriously/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to exclude Google Analytics in your Cypress E2E tests]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-23-How-to-exclude-Google-Analytics-in-your-Cypress-E2E-tests/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-23-How-to-exclude-Google-Analytics-in-your-Cypress-E2E-tests/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Resuming Elixir by self-hosting plausible analytics]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-24-Resuming-Elixir-by-self-hosting-plausible-analytics/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-24-Resuming-Elixir-by-self-hosting-plausible-analytics/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Road to Elixir: Monitor Crypto assets]]></title>
<link><![CDATA[https://cri.dev/posts/2020-04-28-Road-to-Elixir:-Monitor-Crypto-assets/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-04-28-Road-to-Elixir:-Monitor-Crypto-assets/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Nullish coalescing in Node.js 14 and JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-01-Nullish-coalescing-in-Node.js-14/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-01-Nullish-coalescing-in-Node.js-14/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Optional chaining in Node.js 14 and JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-01-Optional-chaining-in-Node.js-14/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-01-Optional-chaining-in-Node.js-14/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Ad blocking with Raspberry Pi and Pi-hole]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-03-Ad-blocking-with-Raspberry-Pi-and-Pi-hole/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-03-Ad-blocking-with-Raspberry-Pi-and-Pi-hole/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Using µcompress to dramatically optimize static assets]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-03-Using-ucompress-to-dramatically-optimize-static-assets/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-03-Using-ucompress-to-dramatically-optimize-static-assets/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Minimal dark mode with CSS and JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-07-Minimal-dark-mode-with-CSS-and-JavaScript/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-07-Minimal-dark-mode-with-CSS-and-JavaScript/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Validate your RSS feed]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-07-Validate-your-RSS-feed/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-07-Validate-your-RSS-feed/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Elixir trick: start an Observer window with mix]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-10-Elixir-trick:-start-an-Observer-window-with-mix/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-10-Elixir-trick:-start-an-Observer-window-with-mix/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Privacy-friendly alternatives to popular services and tools]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-12-Privacy-and-Coherence/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-12-Privacy-and-Coherence/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Setting up a Verdaccio npm registry]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-15-Setting-up-a-Verdaccio-npm-registry/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-15-Setting-up-a-Verdaccio-npm-registry/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fixing 431 Request Header Fields Too Large in Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-18-Fixing-431-Request-Header-Fields-Too-Large-in-Nodejs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-18-Fixing-431-Request-Header-Fields-Too-Large-in-Nodejs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Clean up Mac OS: How I freed 35GB of space]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-20-Clean-up-Mac-OS-How-I-freed-35GB-of-space/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-20-Clean-up-Mac-OS-How-I-freed-35GB-of-space/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Testing in Node.js by example using the SOLID principles]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-20-Testing-in-Nodejs-by-example-using-the-SOLID-principles/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-20-Testing-in-Nodejs-by-example-using-the-SOLID-principles/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Authenticated uplinks with verdaccio]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-26-Authenticated-uplinks-with-verdaccio/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-26-Authenticated-uplinks-with-verdaccio/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Upgrade HTTP requests with X-Forwarded-Proto Header in HAProxy]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-26-Upgrade-HTTP-requests-with-X-Forwarded-Proto-Header-in-HAProxy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-26-Upgrade-HTTP-requests-with-X-Forwarded-Proto-Header-in-HAProxy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Upgrading MongoDB 3.6 to 4.2 with brew]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-26-Upgrading-MongoDB-36-to-42-with-brew/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-26-Upgrading-MongoDB-36-to-42-with-brew/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Solve Verdaccio EINTEGRITY error]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-27-Solve-Verdaccio-EINTEGRITY-error/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-27-Solve-Verdaccio-EINTEGRITY-error/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes on &quot;Code BEAM V 2020&quot;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-05-28-Notes-on-Code-BEAM-V-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-05-28-Notes-on-Code-BEAM-V-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Install Homeassistant on Raspberry Pi]]></title>
<link><![CDATA[https://cri.dev/posts/2020-06-07-Install-Homeassistant-on-Raspberry-Pi/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-06-07-Install-Homeassistant-on-Raspberry-Pi/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Most valuable developer linux notebooks in 2020]]></title>
<link><![CDATA[https://cri.dev/posts/2020-06-20-Most-valuable-developer-linux-notebooks-in-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-06-20-Most-valuable-developer-linux-notebooks-in-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Aggregations with sub-documents in MongoDB]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-06-Aggregations-with-sub-documents-in-MongoDB/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-06-Aggregations-with-sub-documents-in-MongoDB/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Get distinct field names of sub documents in MongoDB]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-06-Get-distinct-field-names-of-sub-documents-in-MongoDB/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-06-Get-distinct-field-names-of-sub-documents-in-MongoDB/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to solve Docker &#39;Incompatible CPU detected&#39;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-06-How-to-solve-Docker-Incompatible-CPU-detected/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-06-How-to-solve-Docker-Incompatible-CPU-detected/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to solve Docker &#39;docker-credential-desktop not installed or not available in PATH&#39;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-06-How-to-solve-Docker-docker-credential-desktop-not-installed-or-not-available-in-PATH/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-06-How-to-solve-Docker-docker-credential-desktop-not-installed-or-not-available-in-PATH/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes on &#39;Marketing for Developers&#39; - devmarketing.xyz]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-08-Notes-on-Marketing-for-Developers-devmarketingxyz/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-08-Notes-on-Marketing-for-Developers-devmarketingxyz/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple event tracking with Plausible Analytics]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-14-Simple-event-tracking-with-Plausible-Analytics/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-14-Simple-event-tracking-with-Plausible-Analytics/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to fix possible EventEmitter memory leak detected]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-16-How-to-fix-possible-EventEmitter-memory-leak-detected/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-16-How-to-fix-possible-EventEmitter-memory-leak-detected/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Made 13 Dollars with Brave and Basic Attention token]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-17-Made-13-Dollars-with-Brave-and-Basic-Attention-token/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-17-Made-13-Dollars-with-Brave-and-Basic-Attention-token/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Techniques to improve SEO for a static website or blog]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-18-Techniques-to-optimize-SEO-for-a-static-website-or-blog/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-18-Techniques-to-optimize-SEO-for-a-static-website-or-blog/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple email trick to manage your newsletters]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-21-Simple-email-trick-to-manage-your-newsletters/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-21-Simple-email-trick-to-manage-your-newsletters/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Don&#39;t buy the AirPods Pro - Another Rattlegate story]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-23-Dont-buy-the-AirPods-Pro---Another-Rattlegate-story/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-23-Dont-buy-the-AirPods-Pro---Another-Rattlegate-story/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[4 Most powerful Mini-PCs in 2020]]></title>
<link><![CDATA[https://cri.dev/posts/2020-07-28-4-Most-powerful-Mini-PCs-in-2020/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-07-28-4-Most-powerful-Mini-PCs-in-2020/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple Time-lapse with a Raspberry Pi]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-01-Simple-Time-lapse-with-a-Raspberry-Pi/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-01-Simple-Time-lapse-with-a-Raspberry-Pi/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Watermark images with montage (ImageMagick)]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-01-Watermark-images-with-montage-ImageMagick/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-01-Watermark-images-with-montage-ImageMagick/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[DIY IoT door monitor with ESP8266]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-03-DIY-IoT-door-monitor-with-ESP8266/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-03-DIY-IoT-door-monitor-with-ESP8266/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[&#39;But I have nothing to hide.&#39;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-08-But-I-have-nothing-to-hide/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-08-But-I-have-nothing-to-hide/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Raspberry Pi as a local server for self hosting applications]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-12-Raspberry-Pi-as-a-local-server-for-self-hosting-applications/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-12-Raspberry-Pi-as-a-local-server-for-self-hosting-applications/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[What is a retrospective?]]></title>
<link><![CDATA[https://cri.dev/posts/2020-09-24-What-is-a-retrospective/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-09-24-What-is-a-retrospective/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes on “I&#39;ve got nothing to hide”]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-02-Notes-on-I-have-got-nothing-to-hide/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-02-Notes-on-I-have-got-nothing-to-hide/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Get things done for real]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-11-Get-things-done-for-real/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-11-Get-things-done-for-real/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fast virtual scrolling with preact]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-12-Fast-virtual-scrolling-with-preact/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-12-Fast-virtual-scrolling-with-preact/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes &quot;Edward Snowden interviewed by Ron Paul&quot;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-18-Notes-Edward-Snowden-interviewed-by-Ron-Paul/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-18-Notes-Edward-Snowden-interviewed-by-Ron-Paul/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Why privacy matters - Glenn Greenwald]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-18-Notes-Glenn-Greenwald-Why-Privacy-matters/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-18-Notes-Glenn-Greenwald-Why-Privacy-matters/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Show realtime visitors on your website with Plausible Analytics and CloudFlare Workers]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-20-Show-realtime-visitors-on-your-website-with-Plausibleio-and-CloudFlare-Workers/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-20-Show-realtime-visitors-on-your-website-with-Plausibleio-and-CloudFlare-Workers/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[The High Privacy Cost of a “Free” Website]]></title>
<link><![CDATA[https://cri.dev/posts/2020-10-21-The-High-Privacy-Cost-of-a-Free-Website/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-10-21-The-High-Privacy-Cost-of-a-Free-Website/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Bangle watch as an accelerometer mouse]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-02-Bangle-watch-as-an-accelerometer-mouse/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-02-Bangle-watch-as-an-accelerometer-mouse/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to fix xcode-select no developer tools found]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-02-How-to-fix-xcode-select-no-developer-tools-found/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-02-How-to-fix-xcode-select-no-developer-tools-found/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Top resources for Bangle.js Watch Development]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-02-Top-resources-for-Banglejs-Watch-Development/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-02-Top-resources-for-Banglejs-Watch-Development/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Communicating with Bangle.js Watch over BLE with Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-03-Communicating-with-Banglejs-Watch-over-BLE-with-Nodejs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-03-Communicating-with-Banglejs-Watch-over-BLE-with-Nodejs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Fix npm process killed during npm install]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-04-Fix-npm-process-killed-during-npm-install/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-04-Fix-npm-process-killed-during-npm-install/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to make Polls with Plausible Analytics]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-05-How-to-make-Polls-with-Plausible-Analytics/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-05-How-to-make-Polls-with-Plausible-Analytics/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Test driving a HackerNews scraper with Node.js]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-06-Test-driving-a-HackerNews-scraper-with-Nodejs/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-06-Test-driving-a-HackerNews-scraper-with-Nodejs/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Tracking HackerNews history in git]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-06-Tracking-HackerNews-history-in-git/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-06-Tracking-HackerNews-history-in-git/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Cleanup docker dangling images]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-18-Cleanup-docker-dangling-images/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-18-Cleanup-docker-dangling-images/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Indie makers and the Sunk Cost Fallacy]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-18-Indie-makers-and-the-Sunk-Cost-Fallacy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-18-Indie-makers-and-the-Sunk-Cost-Fallacy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[What is technical debt?]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-25-What-is-technical-debt/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-25-What-is-technical-debt/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Node.js 15 is here]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-27-Nodejs-15-is-here/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-27-Nodejs-15-is-here/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Notes on &#39;Blogging for Business&#39;]]></title>
<link><![CDATA[https://cri.dev/posts/2020-11-28-Notes-on-Blogging-for-Business/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-11-28-Notes-on-Blogging-for-Business/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[GreeMta Madrid Green Sustainability challenge]]></title>
<link><![CDATA[https://cri.dev/posts/2020-12-02-GreeMta-madrid-green-sustainability-challenge/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-12-02-GreeMta-madrid-green-sustainability-challenge/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to convert Pandas Series column values to lowercase]]></title>
<link><![CDATA[https://cri.dev/posts/2020-12-03-How-to-convert-Pandas-Series-column-values-to-lowercase/]]></link>
<guid><![CDATA[https://cri.dev/posts/2020-12-03-How-to-convert-Pandas-Series-column-values-to-lowercase/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[2020 - A retrospective]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-02-2020---A-retrospective/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-02-2020---A-retrospective/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Experimenting with Webmention]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-03-experimenting-with-webmention/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-03-experimenting-with-webmention/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[From Mac to Linux]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-03-mac-linux/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-03-mac-linux/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Pair AirPods with Linux Ubuntu]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-04-Pair-AirPods-with-Linux-Ubuntu/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-04-Pair-AirPods-with-Linux-Ubuntu/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Best affordable 3D printers under 500 dollars in 2021]]></title>
<link><![CDATA[https://cri.dev/3d-printing/2021-01-05-best-3d-printer-beginners-2021/]]></link>
<guid><![CDATA[https://cri.dev/3d-printing/2021-01-05-best-3d-printer-beginners-2021/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[About donations, free and paid content]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-05-About-donations-free-paid-content/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-05-About-donations-free-paid-content/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[20 common 3D printing mistakes and how to solve them]]></title>
<link><![CDATA[https://cri.dev/3d-printing/2021-01-09-most-common-mistakes-3d-printing/]]></link>
<guid><![CDATA[https://cri.dev/3d-printing/2021-01-09-most-common-mistakes-3d-printing/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Getting started with Mastodon]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-19-getting-started-mastodon-social-network-twitter-alternative/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-19-getting-started-mastodon-social-network-twitter-alternative/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[A retrospective of 100k yearly pageviews]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-22-A-retrospective-of-100k-yearly-pageviews/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-22-A-retrospective-of-100k-yearly-pageviews/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Put that in the URL, please]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-28-Put-that-in-the-URL-please/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-28-Put-that-in-the-URL-please/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Comments on cri.dev are BACK]]></title>
<link><![CDATA[https://cri.dev/posts/2021-01-30-Comments-on-cridev-are-BACK/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-01-30-Comments-on-cridev-are-BACK/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[5$/month Self Hosted VPN with WireGuard]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-01-5-dollar-easy-self-hosted-vpn-setup/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-01-5-dollar-easy-self-hosted-vpn-setup/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Let&#39;s learn some Elixir, again]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-01-Lets-learn-some-Elixir-again/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-01-Lets-learn-some-Elixir-again/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[My notes while learning Elixir]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-04-Learning-Elixir-Notes/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-04-Learning-Elixir-Notes/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[My reading stack with Miniflux/RSS &amp; Pocket]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-09-my-reading-stack-miniflux-rss-pocket/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-09-my-reading-stack-miniflux-rss-pocket/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[3D printed Bitcoin desk watcher]]></title>
<link><![CDATA[https://cri.dev/3d-printing/2021-02-11-3d-printed-bitcoin-desk-watcher/]]></link>
<guid><![CDATA[https://cri.dev/3d-printing/2021-02-11-3d-printed-bitcoin-desk-watcher/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Bitcoin is trademarked. Is it really?]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-17-Bitcoin-trademark/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-17-Bitcoin-trademark/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Read mbox file with mutt or Thunderbird]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-18-read-mbox-gmail-export-linux-mutt-thunderbird/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-18-read-mbox-gmail-export-linux-mutt-thunderbird/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Beware of new Ledger phishing emails from myledgerlive]]></title>
<link><![CDATA[https://cri.dev/posts/2021-02-19-beware-ledger-email-phishing-emails-from-myledgerlive/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-02-19-beware-ledger-email-phishing-emails-from-myledgerlive/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Learn Elixir - A study path]]></title>
<link><![CDATA[https://cri.dev/posts/2021-03-03-learn-elixir-study-path/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-03-03-learn-elixir-study-path/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Tracking RSS subscriptions with UTM parameters]]></title>
<link><![CDATA[https://cri.dev/posts/2021-03-10-tracking-rss-readers-subscriptions-utm-parameters/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-03-10-tracking-rss-readers-subscriptions-utm-parameters/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Self-hosted Miniflux + Wallabag]]></title>
<link><![CDATA[https://cri.dev/posts/2021-03-23-private-self-hosted-reading-rss-miniflux-wallabag/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-03-23-private-self-hosted-reading-rss-miniflux-wallabag/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Manage multiple network connections in Manjaro (Wireguard VPN + Pi-hole)]]></title>
<link><![CDATA[https://cri.dev/posts/2021-03-24-manjaro-setup-network-connections-vpn-pi-hole/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-03-24-manjaro-setup-network-connections-vpn-pi-hole/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[What apps I&#39;m currently self-hosting]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-05-currently-self-hosting-apps/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-05-currently-self-hosting-apps/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple Static site/blog search in 14 Lines of JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-06-simple-static-site-blog-search-javascript-client/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-06-simple-static-site-blog-search-javascript-client/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Cos’è e com’è stato sviluppato il Lean Validation Playbook]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-06-sviluppo-lean-validation-playbook/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-06-sviluppo-lean-validation-playbook/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Switching to CloudFlare Pages, from AWS S3 + CloudFlare DNS]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-13-switching-to-cloudflare-pages-first-impressions-review/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-13-switching-to-cloudflare-pages-first-impressions-review/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Beware of Monero mining attack through GitHub Actions and malicious Pull requests]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-15-monero-mining-attack-github-actions-pull-request/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-15-monero-mining-attack-github-actions-pull-request/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Making Minimal Analytics]]></title>
<link><![CDATA[https://cri.dev/posts/2021-04-28-fullstack-nodejs-preact-minimal-web-analytics-introduction/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-04-28-fullstack-nodejs-preact-minimal-web-analytics-introduction/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to test a function that works with time]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-06-test-javascript-nodejs-function-time-date/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-06-test-javascript-nodejs-function-time-date/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Lazy loading images in 11ty/eleventy]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-11-how-to-lazy-load-images-eleventy/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-11-how-to-lazy-load-images-eleventy/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Simple Server-sent events example in Node.js/JavaScript]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-11-simple-server-sent-events-sse-eventsource-nodejs-javascript/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-11-simple-server-sent-events-sse-eventsource-nodejs-javascript/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Self-hosting with nginx + docker-compose]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-14-self-hosting-with-nginx-docker-compose-linode-digitalocean/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-14-self-hosting-with-nginx-docker-compose-linode-digitalocean/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to solve manjaro different login, missing plasma desktop package]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-22-how-to-solve-manjaro-different-login-missing-plasma-desktop/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-22-how-to-solve-manjaro-different-login-missing-plasma-desktop/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How many visitors block ads and web analytics?]]></title>
<link><![CDATA[https://cri.dev/posts/2021-05-23-how-many-plausible-analytics-untracked-visitors-adblock/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-05-23-how-many-plausible-analytics-untracked-visitors-adblock/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Discontinuing comments]]></title>
<link><![CDATA[https://cri.dev/posts/2021-06-02-discontinuing-comments/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-06-02-discontinuing-comments/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Experiment: Navigating the web with JavaScript disabled]]></title>
<link><![CDATA[https://cri.dev/posts/2021-06-03-navigating-the-web-with-javascript-disabled/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-06-03-navigating-the-web-with-javascript-disabled/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[manjaro connect bluetooth keyboard at login screen]]></title>
<link><![CDATA[https://cri.dev/posts/2021-06-06-manjaro-connect-bluetooth-keyboard-at-login-screen/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-06-06-manjaro-connect-bluetooth-keyboard-at-login-screen/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[7 Visual Studio Code extensions I regularly use]]></title>
<link><![CDATA[https://cri.dev/posts/2021-07-14-7-Visual-Studio-Code-extensions-I-regularly-use/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-07-14-7-Visual-Studio-Code-extensions-I-regularly-use/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[Spotlight not working on Big Sur: how to fix Spotlight index on MacOS Big Sur]]></title>
<link><![CDATA[https://cri.dev/posts/2021-07-14-mac-os-big-sur-spotlight-rebuild-index-not-working-no-applications/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-07-14-mac-os-big-sur-spotlight-rebuild-index-not-working-no-applications/]]></guid>
<description><![CDATA[]]></description>
</item><item>
<title><![CDATA[How to execute a remote script with Ansible]]></title>
<link><![CDATA[https://cri.dev/posts/2021-07-17-how-to-run-remote-script-ansible-linux-debian-ubuntu/]]></link>
<guid><![CDATA[https://cri.dev/posts/2021-07-17-how-to-run-remote-script-ansible-linux-debian-ubuntu/]]></guid>
<description><![CDATA[]]></description>
</item></channel>
</rss>

This file is processed with devblog and loops through the collections of posts, creating a list of <item> elements that represent the RSS feed.

The reverse nunjucks filter is needed because files are listed in alphabetical order, which means I would have the oldest post first otherwise.

Validating the RSS feed in the CI

I wanted to add this build step in the Continuous Integration I have set up with a GitHub Actions workflow.

If the validation of the RSS feed fails, the CI should not deploy a new version of the blog to cri.dev

Looking on NPM I found this little gem (pun intended) called feed-validator.

Which I use in my GitHub Actions workflow’s main.yml in the following way:

...
- name: build
run: |
npm run build
npm run compress

- name: start server
run: |
npm start &

- name: rss validation
run: |
npx feed-validator http://127.0.0.1:8080/rss.xml

- name: uat
uses: cypress-io/github-[email protected]
- name: deploy
env:
AWS_ACCESS_KEY_ID: $
AWS_SECRET_ACCESS_KEY: $
run: |
npm run deploy-with-assets

...

You could also run it via file with the [-c FILE_PATH] option.

This small module calls the validation endpoint on validator.w3.org for me. In other words, this could be done with a cURL call, but that’s for another time.

Here the code that does the API call to validator.w3.org.

Here’s the full rss.xml feed, if you’re into that.

PS: did you remember that RSS was initially called RDF Site Summary, and then Really Simple Syndication or Rich Site Summary? ~ Wikipedia