41554 blogs · [ { "id": "01a08753-25e4-734b-884d-ed5762909372", "title": "Anubis: Distrusting data centers and particular ASNs", "url": "https://blog.rubenwardy.com/2026/08/11/anubis-weigh-datacenters/", "published_at": "2026-08-11T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f1536622", "title": "Using Ansible to configure a Linux VPS", "url": "https://blog.rubenwardy.com/2026/04/28/ansible/", "published_at": "2026-04-28T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f1d36694", "title": "An Ansible role to block abusive subnets using IPSet", "url": "https://blog.rubenwardy.com/2026/04/25/ansible-block-ipset/", "published_at": "2026-04-25T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f2c96166", "title": "Analysis of the Luanti ContentDB AI scrapper DDoS attack", "url": "https://blog.rubenwardy.com/2026/04/16/contentdb-ddos/", "published_at": "2026-04-16T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f3c41e66", "title": "Do I need a coat? - I've made a smartwatch app", "url": "https://blog.rubenwardy.com/2026/04/13/do-i-need-a-coat/", "published_at": "2026-04-13T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f42841db", "title": "OpenTTD and the Transport Tycoon re-release", "url": "https://blog.rubenwardy.com/2026/03/17/openttd-ttd-release/", "published_at": "2026-03-17T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f4a588a9", "title": "Would you like a cookie?", "url": "https://blog.rubenwardy.com/2026/01/15/cookie-consent/", "published_at": "2026-01-15T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f4f7be1b", "title": "My favourite articles of 2025", "url": "https://blog.rubenwardy.com/2026/01/04/interesting-reads-2025/", "published_at": "2026-01-04T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f56188d3", "title": "Eleventy (11ty) string-based translation with i18next", "url": "https://blog.rubenwardy.com/2025/11/25/eleventy-translation/", "published_at": "2025-11-25T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f661524d", "title": "Plant watering system: my first PCB", "url": "https://blog.rubenwardy.com/2025/11/17/plant-watering-first-pcb/", "published_at": "2025-11-17T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f6c600d3", "title": "OpenTTD must-change settings that should be default already", "url": "https://blog.rubenwardy.com/2025/10/05/openttd-settings/", "published_at": "2025-10-05T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f72a6ef5", "title": "Problems with the Online Safety Act: a letter to my MP", "url": "https://blog.rubenwardy.com/2025/08/19/online-safety-act/", "published_at": "2025-08-19T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f81b5f29", "title": "Writing statistics for your Eleventy (11ty) blog", "url": "https://blog.rubenwardy.com/2025/06/01/eleventy-stats/", "published_at": "2025-06-01T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f8a655f2", "title": "How can we own our identity on the Fediverse?", "url": "https://blog.rubenwardy.com/2025/05/25/fediverse-own-your-identity/", "published_at": "2025-05-25T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f8d6a325", "title": "My favourite articles of 2024", "url": "https://blog.rubenwardy.com/2025/03/10/interesting-reads-2024/", "published_at": "2025-03-10T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f95003b8", "title": "Ruben's Virtual World Project", "url": "https://blog.rubenwardy.com/2025/02/12/rvwp/", "published_at": "2025-02-12T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62f961a185", "title": "Bean There: An app to rate coffee shops", "url": "https://blog.rubenwardy.com/2024/12/10/bean-there/", "published_at": "2024-12-10T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fa3271b4", "title": "Why I use Firefox", "url": "https://blog.rubenwardy.com/2024/06/07/firefox-is-awesome/", "published_at": "2024-06-07T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fae6c172", "title": "Detox and React Native: UI testing Android permission flows", "url": "https://blog.rubenwardy.com/2024/05/24/detox-permissions/", "published_at": "2024-05-24T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fbcf49ab", "title": "Why I like and recommend using TypeScript", "url": "https://blog.rubenwardy.com/2024/03/08/typescript-is-awesome/", "published_at": "2024-03-08T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fcc14dcb", "title": "My favourite articles of 2023", "url": "https://blog.rubenwardy.com/2024/01/28/interesting-reads-2023/", "published_at": "2024-01-28T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fd031566", "title": "Five reasons why I write", "url": "https://blog.rubenwardy.com/2023/11/18/why-i-write/", "published_at": "2023-11-18T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fd90a6f6", "title": "Better word counts and reading time in Eleventy (11ty)", "url": "https://blog.rubenwardy.com/2023/10/29/eleventy-wordcount/", "published_at": "2023-10-29T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fdedfe11", "title": "How to find backlinks using Eleventy (11ty)", "url": "https://blog.rubenwardy.com/2023/10/29/eleventy-backlinks/", "published_at": "2023-10-29T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62fe5eb03e", "title": "I've switched to Eleventy (11ty): my thoughts", "url": "https://blog.rubenwardy.com/2023/10/27/switched-to-eleventy/", "published_at": "2023-10-27T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62ff016eeb", "title": "I have joined the IndieWeb", "url": "https://blog.rubenwardy.com/2023/10/10/hello-indieweb/", "published_at": "2023-10-10T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62ffaead13", "title": "Ghosts live in the ground: debugging an electronic circuit", "url": "https://blog.rubenwardy.com/2023/08/29/ghosts-live-in-the-ground/", "published_at": "2023-08-29T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c62ffdad327", "title": "Ten years of Capture The Flag", "url": "https://blog.rubenwardy.com/2023/08/16/minetest-ctf-is-10/", "published_at": "2023-08-16T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c63002e3edb", "title": "Make games not engines: why I'll be using Godot engine", "url": "https://blog.rubenwardy.com/2023/07/14/make-games-not-game-engines/", "published_at": "2023-07-14T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c63002fd90f", "title": "Conquer: a deep-dive into my Luanti mod jam entry", "url": "https://blog.rubenwardy.com/2023/05/31/conquer/", "published_at": "2023-05-31T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6300a12ac3", "title": "Thoughts on native Android development", "url": "https://blog.rubenwardy.com/2023/05/04/android/", "published_at": "2023-05-04T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c630171cc10", "title": "Bing (and DuckDuckGo) shadow banned my website", "url": "https://blog.rubenwardy.com/2023/04/26/bing-ban/", "published_at": "2023-04-26T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c630224982f", "title": "3D-printed IoT lock box using ESP32", "url": "https://blog.rubenwardy.com/2023/03/16/lockbox/", "published_at": "2023-03-16T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6302acafa7", "title": "My favourite programming and game dev articles", "url": "https://blog.rubenwardy.com/2023/02/17/interesting-reads/", "published_at": "2023-02-17T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6302b48e4a", "title": "SDL_GameController: Making gamepads just work", "url": "https://blog.rubenwardy.com/2023/01/24/using_sdl_gamecontroller/", "published_at": "2023-01-24T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c63034f193a", "title": "Large spike in Minetest traffic caused by YouTube video", "url": "https://blog.rubenwardy.com/2022/12/08/contentdb-youtuber-finds-minetest/", "published_at": "2022-12-08T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6303e9ebb8", "title": "Luanti (Minetest) on Steam Deck: usage and review", "url": "https://blog.rubenwardy.com/2022/12/02/minetest-steam-deck/", "published_at": "2022-12-02T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c63041f353f", "title": "Setting up fingerprint auth on Kubuntu (Thinkpad X1)", "url": "https://blog.rubenwardy.com/2022/11/16/thinkpad-x1-fingerprint-auth/", "published_at": "2022-11-16T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6304a3032e", "title": "Minetest Mods: my first Android app", "url": "https://blog.rubenwardy.com/2022/10/22/Minetest-mods-app/", "published_at": "2022-10-22T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6304e295bc", "title": "Devkit CLI: Upload your game to Steam Deck from your dev computer", "url": "https://blog.rubenwardy.com/2022/10/16/steam-deck-upload-game/", "published_at": "2022-10-16T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c630548c349", "title": "Steam Deck is Awesome", "url": "https://blog.rubenwardy.com/2022/10/14/steam-deck-is-awesome/", "published_at": "2022-10-14T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6305d62e9f", "title": "Why I created Renewed Tab, my New Tab extension", "url": "https://blog.rubenwardy.com/2022/07/21/renewed-tab/", "published_at": "2022-07-21T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6306861bc8", "title": "Creating worker NPCs using behavior trees", "url": "https://blog.rubenwardy.com/2022/07/17/game-ai-for-colonists/", "published_at": "2022-07-17T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6307563d86", "title": "ChatGPT: An AI that can write Minetest mods... kinda", "url": "https://blog.rubenwardy.com/2022/06/22/gpt-3-minetest-modding/", "published_at": "2022-06-22T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c630775f887", "title": "Developing ContentDB", "url": "https://blog.rubenwardy.com/2022/03/24/contentdb/", "published_at": "2022-03-24T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6307a5e76c", "title": "Tin Mining - Ludum Dare 48 post-mortem", "url": "https://blog.rubenwardy.com/2022/03/19/ld48-tin-mining/", "published_at": "2022-03-19T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c6307e123b5", "title": "IoT Plant Monitor using ESP32", "url": "https://blog.rubenwardy.com/2022/03/17/plant-monitor/", "published_at": "2022-03-17T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c63087f110b", "title": "Securing Markdown user content with Mozilla Bleach", "url": "https://blog.rubenwardy.com/2021/05/08/mozilla-bleach-markdown/", "published_at": "2021-05-08T00:00:00+00:00" }, { "id": "01a08753-25e5-7015-8f5a-1c630967c9e5", "title": "ForumMate: My return to Android app development", "url": "https://blog.rubenwardy.com/2020/09/13/return-to-android-dev/", "published_at": "2020-09-13T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3066c04b", "title": "Writing a Lua sandbox using sol2 / sol3", "url": "https://blog.rubenwardy.com/2020/07/26/sol3-script-sandbox/", "published_at": "2020-07-26T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde314cf87c", "title": "Extending sol3's implicit type conversion", "url": "https://blog.rubenwardy.com/2020/07/22/sol3-vector-extension/", "published_at": "2020-07-22T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde31d88bef", "title": "Drop shadows in SFML", "url": "https://blog.rubenwardy.com/2020/05/12/sfml-drop-shadow/", "published_at": "2020-05-12T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde32a1b2e9", "title": "Android: Complete, generic data-binding RecyclerView adapter", "url": "https://blog.rubenwardy.com/2020/05/06/android-complete-recyclerview-data-binding/", "published_at": "2020-05-06T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde331551ac", "title": "Why I switched from GitHub to GitLab", "url": "https://blog.rubenwardy.com/2020/05/06/why-i-switched-to-gitlab/", "published_at": "2020-05-06T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3406dcd6", "title": "A Comparison of SFML GUI Libraries: TGUI vs SFGUI vs ImGui", "url": "https://blog.rubenwardy.com/2020/01/21/creating-game-guis-in-sfml/", "published_at": "2020-01-21T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3409f43a", "title": "Rendering a topdown world with layers and z-levels using SFML", "url": "https://blog.rubenwardy.com/2019/04/24/rendering-multi-z-layer-topdown-map-using-SFML/", "published_at": "2019-04-24T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3500cebc", "title": "Getting rid of YouTube Music's \"Are you still listening?\" dialog", "url": "https://blog.rubenwardy.com/2019/04/16/youtube-music-are-you-still-listening-fix/", "published_at": "2019-04-16T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde35caca50", "title": "C++: Self-registering functions using macros for test libraries", "url": "https://blog.rubenwardy.com/2019/02/17/cpp-self-registering-test-macros/", "published_at": "2019-02-17T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde36ab5848", "title": "Porting C++ programs from Linux to Windows using vcpkg, CMake, and Visual Studio", "url": "https://blog.rubenwardy.com/2019/02/15/porting-cpp-to-windows-vcpkg/", "published_at": "2019-02-15T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde37a63021", "title": "RimWorld: Create timelapse from Progress Renderer on Linux", "url": "https://blog.rubenwardy.com/2019/01/25/rimworld-progress-renderer-to-video/", "published_at": "2019-01-25T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde37f03a50", "title": "Raytracer and Rasteriser", "url": "https://blog.rubenwardy.com/2018/09/07/raytracer-rasteriser/", "published_at": "2018-09-07T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde37fae7ce", "title": "Interactive Commit Sorter for Changelogs", "url": "https://blog.rubenwardy.com/2018/08/24/commit-sorter-changelog/", "published_at": "2018-08-24T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde38ef44aa", "title": "Finding and copying DLLs from MinGW-W64 directories to bin directory", "url": "https://blog.rubenwardy.com/2018/05/07/mingw-copy-dlls/", "published_at": "2018-05-07T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde396018df", "title": "Rubix: My Simple Kernel written in C for arm", "url": "https://blog.rubenwardy.com/2018/04/05/simple-kernel-in-c/", "published_at": "2018-04-05T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde39cbf282", "title": "Minetest at Freenode Live 2017", "url": "https://blog.rubenwardy.com/2017/10/29/freenode-live/", "published_at": "2017-10-29T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3aabce26", "title": "Install Autodesk Maya on Ubuntu 17.04", "url": "https://blog.rubenwardy.com/2017/09/30/install-autodesk-maya-ubuntu-17-04/", "published_at": "2017-09-30T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3b5e5aec", "title": "RVWP: Multiplayer Topdown Sandbox Game in C++", "url": "https://blog.rubenwardy.com/2017/08/13/multiplayer-topdown-sandbox-game/", "published_at": "2017-08-13T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3c410970", "title": "Mingw-w64 and CMake: unrecognised option -rdynamic on Ubuntu", "url": "https://blog.rubenwardy.com/2017/03/07/mingw-w64-cmake-unrecognised-option-rdynamic-ubuntu/", "published_at": "2017-03-07T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3c99d34a", "title": "OpenCV: compile images (Mats) into a strip", "url": "https://blog.rubenwardy.com/2016/09/30/opencv-combine-images-into-strip/", "published_at": "2016-09-30T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3d71d583", "title": "How to emit a single particle using SFML's Thor Particle System", "url": "https://blog.rubenwardy.com/2016/09/12/sfml-thor-emit-a-single-particle/", "published_at": "2016-09-12T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3e19d9f7", "title": "How to center a SFGUI window (sfg::Window)", "url": "https://blog.rubenwardy.com/2016/08/16/sfgui-center-window-container/", "published_at": "2016-08-16T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3edb61f5", "title": "Setting up a MonoDevelop solution and project for RimWorld modding", "url": "https://blog.rubenwardy.com/2016/07/21/rimworld-setup-monodevelop/", "published_at": "2016-07-21T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde3fc1ea9f", "title": "Install Monodevelop to build for .NET 3.5 (using Mono 3.14) - RimWorld", "url": "https://blog.rubenwardy.com/2016/07/20/rimworld-install-monodevelop-with-dot-net-3.5/", "published_at": "2016-07-20T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde4016aa99", "title": "Move private repos from Bitbucket to GitHub", "url": "https://blog.rubenwardy.com/2016/06/02/move-private-repos-from-bitbucket-to-github/", "published_at": "2016-06-02T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde40417a86", "title": "Xubuntu / Xfce sync whisker menu favourites", "url": "https://blog.rubenwardy.com/2016/05/24/xubuntu-xfce-sync-whisker-menu-favourites/", "published_at": "2016-05-24T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde40ea7d8b", "title": "Dual boot Ubuntu on ASUS X555LA UEFI laptop alongside Windows 10", "url": "https://blog.rubenwardy.com/2016/05/21/dual-boot-ubuntu-on-asus-x555la-uefi-laptop/", "published_at": "2016-05-21T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde413cb127", "title": "Linking a user account to an external phpBB forum", "url": "https://blog.rubenwardy.com/2016/05/07/2100-link-external-phpbb-forum/", "published_at": "2016-05-07T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde420e8b41", "title": "Getting user profile data from external phpBB forums", "url": "https://blog.rubenwardy.com/2016/05/07/1600-python-phpbb-parser/", "published_at": "2016-05-07T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde42ca0014", "title": "1st Semester of University", "url": "https://blog.rubenwardy.com/2016/02/24/university/", "published_at": "2016-02-24T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde42f67963", "title": "Employee Task Management System", "url": "https://blog.rubenwardy.com/2015/12/10/etms/", "published_at": "2015-12-10T00:00:00+00:00" }, { "id": "01a08753-25e6-7020-ad2b-4dde43516176", "title": "Convert folder of images to PDF with filenames", "url": "https://blog.rubenwardy.com/2015/04/07/convert-folder-of-images-to-pdf-with-filenames/", "published_at": "2015-04-07T00:00:00+00:00" }, { "id": "01a08753-25e7-713a-9b7a-9f103f2621d4", "title": "3D Projection", "url": "https://blog.rubenwardy.com/2015/01/08/3d-projection/", "published_at": "2015-01-08T00:00:00+00:00" }, { "id": "01a08753-25e7-713a-9b7a-9f103faf04ee", "title": "Lotka Volterra - Predator Prey", "url": "https://blog.rubenwardy.com/2014/12/16/lotka-volterra/", "published_at": "2014-12-16T00:00:00+00:00" }, { "id": "01a08753-25e7-713a-9b7a-9f103fcdc739", "title": "Lichess Widgets", "url": "https://blog.rubenwardy.com/2014/11/07/lichess-widgets/", "published_at": "2014-11-07T00:00:00+00:00" }, { "id": "01a08753-25e7-713a-9b7a-9f1040b3cc07", "title": "Lichess", "url": "https://blog.rubenwardy.com/2014/10/26/lichess/", "published_at": "2014-10-26T00:00:00+00:00" }, { "id": "01a08753-25e7-713a-9b7a-9f10415fe2d7", "title": "Bytecode, Compilers and Interpreters", "url": "https://blog.rubenwardy.com/2014/10/22/bytecode-and-compilers/", "published_at": "2014-10-22T00:00:00+00:00" } ] posts Claim your blog
Back to blog.rubenwardy.com
Blog · corpus.blog/blogs/blog.rubenwardy.com/posts

blog.rubenwardy.com

blog.rubenwardy.com

2026

2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014