
    
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
                
    
        
    
            
    
        
    
            
{"version":"https:\/\/jsonfeed.org\/version\/1","title":"blog.kronis.dev","home_page_url":"https:\/\/blog.kronis.dev\/","feed_url":"https:\/\/blog.kronis.dev\/blog.json","description":"My blog, where I attempt to collect my thoughts and share the occasional interesting topic with others","author":{"name":"Kristi\u0101ns Kronis"},"items":[{"title":"On Anthropic","date_published":"2026-02-28","id":"https:\/\/blog.kronis.dev\/blog\/on-anthropic","url":"https:\/\/blog.kronis.dev\/blog\/on-anthropic","content_html":"<p>It's been a while since I last looked over the pond, at what the Americans are doing. The problem is that they just keep doing more stuff, to the point where if I were to write about them, it would be a long post and it becomes less and less possible to hide behind sarcasm and not condemn that whole administration.<\/p>\n<p>At the same time, in absolute terms I am nobody so that gives me some safety, but as a European, it's also hard to hide my disgust at blatant disregard for human rights, human life and our European values - especially when there's foreign interference that aims to meddle with the EU, NATO and also support far right, and borderline fascist, parties like AfD.<\/p>\n<h3>A measured take on AI and safety<\/h3>\n<p>Today, however, I'm not doing a long political post, rather I'd like to just reference this one post that Anthropic recently made: <a href=\"https:\/\/links.kronis.dev\/KAYKp29Vup\">Statement from Dario Amodei on our discussions with the Department of War<\/a><\/p>\n<p>In the post, they do a little patriotic blurb about wanting to help Americans and keep them safe, which I don't take an issue with. Even though I'd say that the administration is trampling over the legacy of what was once a democratic ally, I doubt anyone would take an issue with wanting to keep your people safe - I don't have a problem with Americans in general, the same way I have some friends in Israel while holding similar disdain for the actions of that state.<\/p>\n<p>Anthropic then proceeds to reiterate that they don't have \"ad hoc\" limitations on the use of their models, but that they take an issue with two particular use cases, where it is impossible to use the technology responsibly:<\/p>\n<p><img loading=\"lazy\" title=\"01-anthropic-limitations\" alt=\"01-anthropic-limitations\" src=\"\/user\/pages\/blog\/on-anthropic\/01-anthropic-limitations.jpg\"><\/p>\n<p>They do share a considerable amount of detail, but I'd say that their assessment is correct. With the current state of AI, using it for either mass surveillance or fully autonomous weapons systems would be deeply problematic and in quite a few cases, also severely illegal - though it's not that it has stopped the current administration before.<\/p>\n<p>No matter how you look at it, their response is fairly measured and in any other governmental system, that should be met with nothing other than agreement from the powers that be, while a lot of other use cases could be pursued, money exchanged, and Americans kept safe. However, that was not the response that they got. Almost immediately, there was backlash from the government, which is ridiculous - since the only things they could have opposition on is that they do, as a matter of fact, actually want to use AI for those very unsafe and illegal use cases.<\/p>\n<p>Luckily, a lot of people from both OpenAI and Google got together and signed an open letter in protest of that: <a href=\"https:\/\/links.kronis.dev\/ZLyuanaaSN\">We Will Not Be Divided<\/a><\/p>\n<p>Here's a snapshot:<\/p>\n<p><img loading=\"lazy\" title=\"02-we-will-not-be-divided\" alt=\"02-we-will-not-be-divided\" src=\"\/user\/pages\/blog\/on-anthropic\/02-we-will-not-be-divided.jpg\"><\/p>\n<p>Again, the position of not letting technologies with no fundamental possibility to take responsibility over its actions kill people feels like the bare minimum. How did that <a href=\"https:\/\/links.kronis.dev\/Xn8PTM58mj\">old warning from IBM in the late<\/a>...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/on-anthropic\/03-openai-agreement.jpg"},{"title":"Buying some drives from Datablocks","date_published":"2026-02-12","id":"https:\/\/blog.kronis.dev\/blog\/buying-some-drives-from-datablocks","url":"https:\/\/blog.kronis.dev\/blog\/buying-some-drives-from-datablocks","content_html":"<p>A while back, I learnt of the practice of buying white label and recertified hard drives: the idea being that large batches of good drives sometimes get returned to OEMs by hyperscalers. They can then be retested and sold either with the branding, or with the branding removed (although can sometimes have small scratches and such).<\/p>\n<p>Essentially, if I decide to get a white label drive, then the original manufacturer is off the hook in regards to what happens with it, however, it can still very much be a good drive with a low RMA rate (less than a percent), so I can actually get a really good deal.<\/p>\n<p>One such vendor that is available in Europe is <a href=\"https:\/\/links.kronis.dev\/a8qW8x2EOK\">Datablocks<\/a>, I think I heard about them on HackerNews and saved the link for later. Eventually, I decided to get a few 1 TB HDDs from them because I found out that the regular Seagate 1 TB drives I usually got from a local e-commerce store went up in price from like 40-50 EUR all the way to 110 EUR, which I think is pretty insane. Not sponsored by them in any way, just decided to share my experience.<\/p>\n<h3>The good<\/h3>\n<p>I don't really use high capacity drives, because I get them in multiples for backup reasons and having spares, and since I compress my data and don't really have that much of it, 1 TB drives still make sense (unless there's a good deal on 2 TB drives, which there wasn't). <\/p>\n<p>There were still some in stock, so I went for the desktop drives:<\/p>\n<p><img loading=\"lazy\" title=\"00-datablocks-drives\" alt=\"00-datablocks-drives\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/00-datablocks-drives.jpg\"><\/p>\n<p>Look at that: that's 35 EUR for a 1 TB drive, even cheaper than Seagate drives used to be back when the prices were actually decent. There was shipping I had to pay to get them delivered to Latvia, which was short of 30 EUR total - that wasn't too pleasant, but since I got two drives for about 70 EUR, the total came out to around 100 EUR, which is still somehow cheaper than a single drive from a local store.<\/p>\n<p>Shipping was done through DPD and the package arrived within a week, safely:<\/p>\n<p><img loading=\"lazy\" title=\"01-the-box\" alt=\"01-the-box\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/01-the-box.jpg\"><\/p>\n<p>There was some of that packing paper inside (maybe the box itself is a bit too big for the contents), and the drives themselves were wrapped in bubble wrap nicely:<\/p>\n<p><img loading=\"lazy\" title=\"02-the-packaging\" alt=\"02-the-packaging\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/02-the-packaging.jpg\"><\/p>\n<p>Here are the drives, nothing special about them, they came in sealed packages, just like new ones do:<\/p>\n<p><img loading=\"lazy\" title=\"03-the-drives\" alt=\"03-the-drives\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/03-the-drives.jpg\"><\/p>\n<p>For comparison's sake, here's one of the Seagate drives (actually the last new one I had), as you can see, they look pretty similar and there's also no obvious scratches or defects that I can notice:<\/p>\n<p><img loading=\"lazy\" title=\"04-drive-comparison\" alt=\"04-drive-comparison\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/04-drive-comparison.jpg\"><\/p>\n<p>Same on the back, visually, everything looks okay:<\/p>\n<p><img loading=\"lazy\" title=\"05-drive-comparison-back\" alt=\"05-drive-comparison-back\" src=\"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/05-drive-comparison-back.jpg\"><\/p>\n<p>Now, at work I've run into issues with using HDDs, mostly due to random reads and writes being bad due to their nature: in particular, when trying to host an instance of S3 compatible software, such as <a href=\"https:\/\/links.kronis.dev\/np6IrwR22V\">Garage<\/a>. There, the read and write performance plummets when the files are chunked, or alternatively, you have to give up storage efficiency by...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/buying-some-drives-from-datablocks\/10-datablocks-crystal-disk-info-2.jpg"},{"title":"Why Europe needs open source","date_published":"2026-02-08","id":"https:\/\/blog.kronis.dev\/blog\/why-europe-needs-open-source","url":"https:\/\/blog.kronis.dev\/blog\/why-europe-needs-open-source","content_html":"<p>Okay, so I'm a little bit late with this one.<\/p>\n<p>A while back, there was <a href=\"https:\/\/links.kronis.dev\/ECfsr6dVKL\">a post on LWN<\/a> about the European Commission calling for evidence on open source. If you want, you can have a look at the <a href=\"https:\/\/eur-lex.europa.eu\/legal-content\/EN\/TXT\/?uri=intcom%3AAres%282026%2969111\">EUR-Lex<\/a> post for yourself:<\/p>\n<p><img loading=\"lazy\" title=\"01-eur-lex\" alt=\"01-eur-lex\" src=\"\/images\/0\/1\/-\/e\/u\/01-eur-lex-3fb88383.jpg\"><\/p>\n<p>The gist of it is, that Europe has become quite dependent on foreign tech, which means risks both in regards to the supply chain itself, as well as the overall governance - and given the state of the world, isn't a really good situation to be in:<\/p>\n<blockquote>\n<p>The EU faces a significant problem of dependence on non-EU countries in the digital sphere. This reduces users' choice, hampers EU companies' competitiveness and can raise supply chain security issues as it makes it difficult to control our digital infrastructure (both physical and software components), potentially creating vulnerabilities including in critical sectors. <\/p>\n<p>In the last few years, it has been widely acknowledged that open source &ndash; which is a public good to be freely used, modified, and redistributed &ndash; has the strong potential to underpin a diverse portfolio of high-quality and secure digital solutions that are valid alternatives to proprietary ones. By doing so, it increases user agency, helps regain control and boost the resilience of our digital infrastructure.<\/p>\n<\/blockquote>\n<p>For a long time, it has been happening silently in the background, various systems being built, integrated and operated, or sometimes changing ownership to that of presumed allied countries, with nobody paying it much attention - such as the <a href=\"https:\/\/links.kronis.dev\/gC1EFVJzeg\">Netherlands DigiD identity system<\/a> almost getting sold to the US.<\/p>\n<p>It's not even the case of various large systems that might get treated like public utilities, but rather even the foundational building blocks, from OSes like Windows Server and RHEL (still controlled by a foreign company, despite being more open than Windows), to databases like DB2, SQL Server, Oracle and others, alongside a huge amount of proprietary solutions, frameworks and even libraries.<\/p>\n<p>The thing is, that the risks of vendor-lock have been known for a long time, though sadly we have to contend with adages such as:<\/p>\n<blockquote>\n<p>Nobody ever got fired for choosing IBM.<\/p>\n<\/blockquote>\n<p>Replace IBM in that sentence with any mainstream large tech company, be it Microsoft, Google, or maybe even entire platforms like AWS. People keep waving their hands around and saying that proprietary technology is good, actually, since it often comes with support (not that you can't be the support for an open-source solution, or even pay someone to support you, but apparently that eludes most people; it might just be about covering your ass in case something goes wrong, but I'll explain why it doesn't actually work). Couple that with the sales departments of those companies having a lot of resources at their disposal and large govt. contracts being right up their alley, and the friction for using that tech as opposed to FOSS or even source-available software will often be lower.<\/p>\n<p>Now, four weeks have passed since the call was open, so it's not like I would want to submit anything formal, but at the same time I at...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/why-europe-needs-open-source\/01-eur-lex.jpg"},{"title":"My dad passed away","date_published":"2026-02-01","id":"https:\/\/blog.kronis.dev\/blog\/my-dad-passed-away","url":"https:\/\/blog.kronis.dev\/blog\/my-dad-passed-away","content_html":"<p>Near the end of the last year, my father, P&#275;teris Kronis, passed away. It has been months since and I was thinking about whether I should write about it or not, but in the end decided to put this out there anyway. It was a sad, humbling and human experience. I wanted to write something, to both share in that experience and to also remember him, in writing.<\/p>\n<h3>What happened<\/h3>\n<p>I live in his old city apartment and look after it, while I work in the city as a software developer, whereas he and mom lived together in the countryside home. It just so happened that this was one of the few times when mom had been out of the house in recent memory - visiting another lady, a family friend, in Italy for a week or two, to see the sights and nature. I had joked that this was a sort of \"vacation\" for her, because otherwise a lot of her time was spent looking after the house, keeping it more clean than both me and dad would otherwise, cooking and looking after the dogs. Some time after her leaving, dad sounded more sickly on the phone.<\/p>\n<p>I was planning to visit him at the end of the work week, for the weekend, as I often did with my parents, being on the phone with both him and mom in the days leading up to it - how he was feeling, what medicine to better bring to him and so on. Me and mom had both told him that if it gets bad, then he should drive to the nearby city (a 15 minute drive, approximately) and see the doctor there, yet he had pretty consistently responded with: \"I'll wait and see.\" It wasn't completely out of the ordinary, because we all had previously had things like a common cold, that did not seem to actually require much medical attention, and he wouldn't really say that it was much different this time.<\/p>\n<p>I had been on the phone with him just that Friday, but by Saturday, the day when I was actually getting into the bus and going to visit him, he would no longer pick up his phone. A part of me felt like this shouldn't be that big of a deal, because mom would sometimes also not pick up when busy with something or outside, yet a part of me couldn't shake the feeling that it was a sort of bad omen. By the time I arrived, he had already passed. I found him in his bed. <\/p>\n<p>I called mom about what to do. I called the emergency number after, they sent an ambulance, they confirmed that he had passed away, I guess \"dead with no signs of violence\" is the term that gets put on the document in such cases. One of them told me that his chest was blue in color, and that it was most likely something to do with his lungs - where a person tries to take a breath but doesn't get enough oxygen,...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/my-dad-passed-away\/01-chamaenerion-angustifolium.jpg"},{"title":"Sometimes Dropbox is just FTP: building a link shortener","date_published":"2026-01-21","id":"https:\/\/blog.kronis.dev\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener","url":"https:\/\/blog.kronis.dev\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener","content_html":"<p>There is this <a href=\"https:\/\/links.kronis.dev\/JOx5cgqmsa\">one old HackerNews post<\/a> that sometimes people reference, when talking about how engineers view software:<\/p>\n<p><img loading=\"lazy\" title=\"01-dropbox-is-just-ftp\" alt=\"01-dropbox-is-just-ftp.jpg\" src=\"\/user\/pages\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener\/01-dropbox-is-just-ftp.jpg\"><\/p>\n<p>It's an observation of how the trend goes:<\/p>\n<ul>\n<li>a new product or service comes out<\/li>\n<li>an engineer looks at it and says \"Anyone could build this for themselves\"<\/li>\n<li>it proceeds to do really well and becomes popular regardless<\/li>\n<\/ul>\n<p>There's even <a href=\"https:\/\/links.kronis.dev\/OIvXqZe2gZ\">an XKCD about this<\/a> and you can <a href=\"https:\/\/links.kronis.dev\/onYsklvfEB\">look at the Dropbox revenue<\/a> for yourselves:<\/p>\n<p><img loading=\"lazy\" title=\"02-dropbox-revenue.jpg\" alt=\"02-dropbox-revenue.jpg\" src=\"\/user\/pages\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener\/02-dropbox-revenue.jpg\"><\/p>\n<p>Sometimes these products or services more or less outlive the relevance of the software that already existed and could be used to build something like that at the time. Why? Well, in part, I don't doubt that engineers underestimate the staying power of something that is pleasant to use and also solves a problem that the user has, even if it's nothing groundbreaking on a technical level.<\/p>\n<p>Sometimes it's not even completely new ideas or software, either. For example, look at <a href=\"https:\/\/links.kronis.dev\/UN6cBUPLlj\">Linear<\/a>, it is just a slightly better <a href=\"https:\/\/links.kronis.dev\/AXOW19lB80\">Jira<\/a> that already existed before, which in turn is maybe a bit better than <a href=\"https:\/\/links.kronis.dev\/nXIs5AONF4\">Redmine<\/a>. Similarly, <a href=\"https:\/\/links.kronis.dev\/yOKZJ9gOkN\">Obsidian<\/a> is just Notepad++ with Dropbox, which could just be Notepad++ with SFTP.<\/p>\n<p>And yet, all of those are useful and are doing pretty well! Except in some cases, the engineer is right and Dropbox is, indeed, just SFTP.<\/p>\n<h3>My previous setup<\/h3>\n<p>Let's talk about link shorteners. I use them on this very blog, as you can see above - in part due to the CMS that's running this blog sometimes having weird behavior around complex URLs, other times because a URL gets super long and I want to include something nice instead, e.g. a URL to a map to tell a delivery driver <em>exactly<\/em> how to get to my place when delivering something, or maybe some instructions for an event, or how to access a particular document.<\/p>\n<p>There are some out there that you can just use, however they might not be around forever, might inject ads and other stuff before the redirect (they have to earn money somehow as well), in addition to there always being the option of self-hosting something yourself. For a while, that's exactly what I did. There is a pretty cool open source project out there, that is called <a href=\"https:\/\/links.kronis.dev\/a8e8h\">YOURLS<\/a>. It has served me well for a while and was pretty much perfect for not making me rely on external services. <\/p>\n<p>Here's what it looks like, in case you're curious:<\/p>\n<p><img loading=\"lazy\" title=\"03-yourls-main-ui\" alt=\"03-yourls-main-ui.jpg\" src=\"\/user\/pages\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener\/03-yourls-main-ui.jpg\"><\/p>\n<p>It even supports a pretty nice statistics view, in case you're curious about where your traffic is coming from and all sorts of other stuff:<\/p>\n<p><img loading=\"lazy\" title=\"04-yourls-statistics\" alt=\"04-yourls-statistics.jpg\" src=\"\/images\/0\/4\/-\/y\/o\/04-yourls-statistics-c07810cc.jpg\"><\/p>\n<p>At the same time, as an engineer, I view it as a liability. I trust that the developers are doing their best, but what if there's a vulnerability, maybe not even in their code, but in one of the dependencies? What about keeping the database that it needs up to date? What if one day it decides to break, like I've had happen plenty of times with PostgreSQL WAL getting corrupted and needing manual intervention? Even if nothing breaks there, sooner or...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/sometimes-dropbox-is-just-ftp-building-a-link-shortener\/04-yourls-statistics.jpg"},{"title":"I blew through 24 million tokens in a day","date_published":"2025-10-20","id":"https:\/\/blog.kronis.dev\/blog\/i-blew-through-24-million-tokens-in-a-day","url":"https:\/\/blog.kronis.dev\/blog\/i-blew-through-24-million-tokens-in-a-day","content_html":"<p>Suppose I have a legacy project, or even just an older project that I worked on previously and now want to carry over the mechanisms that made it work, to a new one.<\/p>\n<p>All sorts of custom functionality, wrappers around the underlying library components with custom functionality, like being able to tell when any input field or input element has been touched and a form should be considered dirty (prompt before navigating away), as well as links and navigation logic that integrates with this, custom utilities for i18n built on top of pre-existing solutions, validators, date and number formatting utilities (maybe with <a href=\"https:\/\/links.kronis.dev\/30jlb\">moment.js<\/a> and <a href=\"https:\/\/links.kronis.dev\/krpxj\">currency.js<\/a> integrated) and so much more.<\/p>\n<p>There might be dozens, or sometimes hundreds of files in a project that otherwise has over a thousand source files, obviously not coupled as loosely as it might be (e.g. a collection of separate packages), because clearly nobody has the time for setting that up and that's never how these things evolve over projects that span 5 or more years. <\/p>\n<p>Yet, I don't want the business functionality. I don't want the constants from that project. I don't want the router routes, but I want the logic for having nested routes, I want the logic for highlighting the route group in the navbar\/sidebar when a route below that is active, I want at least some of the permission checks and the more generic bits of redirects to the login page, error handlers and error boundaries and so much more.<\/p>\n<p>You'll notice that this example is front end centric, but it might as well be back end centric as well. In either case, what I have a lot of are requirements, since otherwise I'd be writing everything from scratch and that never works out well, especially when there are perfectly serviceable implementations somewhere for me to reference, instead of rediscovering the edge cases anew. But maybe I want to migrate it all to <a href=\"https:\/\/links.kronis.dev\/lic07\">TypeScript<\/a>, maybe I want to move from <a href=\"https:\/\/links.kronis.dev\/avt02\">Vuetify<\/a> to <a href=\"https:\/\/links.kronis.dev\/d6zla\">Quasar<\/a>, perhaps I even want to explore implementing the same functionality with <a href=\"https:\/\/links.kronis.dev\/uyxto\">Pinia<\/a>, or get rid of it.<\/p>\n<p>The one thing I don't have, however, is time. Nor do I think I necessarily have enough motivation or working memory to go through 100 components and update all of them in a specific way. Everyone has deadlines and even if it's a personal project, the evenings are only so long. So, it's the perfect use case for generative AI, right?<\/p>\n<h3>Generative AI and its main problem<\/h3>\n<p>Well, sort of. Having generative AI at your fingertips does a few good things:<\/p>\n<ul>\n<li>it follows boilerplate adjacent tasks pretty well<\/li>\n<li>even more so if you can give examples of what to do and not to do<\/li>\n<li>furthermore, whatever it spits out isn't too hard to verify as correct\/incorrect<\/li>\n<li>it doesn't get tired and demotivated, you can also steer it in a particular direction easily<\/li>\n<\/ul>\n<p>In other words, it's like having a very motivated junior developer that sometimes does completely erroneous things, but at the same time has like no ego and will carry...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/i-blew-through-24-million-tokens-in-a-day\/01-rate-limit.jpg"},{"title":"AIOs are superb, thermal pastes are the same?","date_published":"2025-10-13","id":"https:\/\/blog.kronis.dev\/blog\/aios-are-superb-thermal-pastes-are-the-same","url":"https:\/\/blog.kronis.dev\/blog\/aios-are-superb-thermal-pastes-are-the-same","content_html":"<p>Here's a short post: I think AIOs or All-In-One coolers are the superior cooling solution, both to air coolers and custom liquid cooling loops for the average user!<\/p>\n<p>Recently, I got some new thermal paste, because my CPU temps were still a bit higher than I'd like under full load. While gaming they'd hover around 70 C and under some benchmarks they'd go up to 80 C whereas with Prime95 they'd rise so far that the CPU would thermal throttle to prevent damage. This is on a Ryzen 7 5800X, a series which is known to run a bit hot, but at the same time I wondered whether I could improve things a bit.<\/p>\n<p>I realized that I more or less dreaded the idea of having to take off the CPU cooler and to repaste it and assemble everything again, mostly due to the mounting mechanisms that I've seen a lot of AM4 coolers use - those annoying pressure latches that are hard to secure properly, as well as the fact that good air coolers can be quite bulky and I sometimes just get cut or scraped by the fins on them.<\/p>\n<h3>AIOs are very nice, you should get one<\/h3>\n<p>But then I remembered that I moved over to having an AIO which leaves it as a really simple errand and the case doesn't even feel all that crowded:<\/p>\n<p><img loading=\"lazy\" title=\"01-aio.jpg\" alt=\"01-aio\" src=\"\/user\/pages\/blog\/aios-are-superb-thermal-pastes-are-the-same\/01-aio.jpg\"><\/p>\n<p>Now, the fact that everything is a bit dusty and that I use tape for managing some cables (don't worry, nothing has melted yet, it might look like a mess but it works) aside, you can see for yourself - there are some screws that I can easily unscrew or rescrew with my hands without getting a screwdriver out. It's about as easy as installing an AIO can get.<\/p>\n<p>I got the Aigo ACSE 240 on AliExpress a while back for about 54 EUR and I have to say that it was money well spent, they also have or at least had some of the more affordable case fans as well! This setup pretty much replaced me needing like 5 case fans and the temps are pretty good, all while there isn't too much noise.<\/p>\n<p>I will admit that I wouldn't recommend them over other brands at the time because it seems like most prices on AliExpress went up a good 40% and I've literally 0 idea why - for that price you can probably find something on local e-commerce stores for cheaper, even from more reputable or at least mainstream brands:<\/p>\n<p><img loading=\"lazy\" title=\"01-aio-store.jpg\" alt=\"01-aio-store\" src=\"\/user\/pages\/blog\/aios-are-superb-thermal-pastes-are-the-same\/01-aio-store.jpg\"><\/p>\n<p>Either way, the argument remains that as long as you go for literally any AIO with good reviews that fits in your case and your budget, you'll probably have a pretty decent time. And yes, although they might need a refill in like 5 years or might need a replacement if and when the pump dies, they are still affordable enough for this not to be a super big problem.<\/p>\n<p>So what's this whole thing about the thermal paste? Well, the temps were still a bit high for my liking, so...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/aios-are-superb-thermal-pastes-are-the-same\/08-prime95.jpg"},{"title":"I&#039;m an e-waste consumer","date_published":"2025-10-11","id":"https:\/\/blog.kronis.dev\/blog\/im-an-e-waste-consumer","url":"https:\/\/blog.kronis.dev\/blog\/im-an-e-waste-consumer","content_html":"<p>In my previous article about my investments on Revolut in 2025 (plot twist: AMD's value just spiked and fell a bit afterwards, that's how those things go), I mentioned that I live a fairly Spartan lifestyle and get the things I need, rather than the ones I might want.<\/p>\n<p>A part of this is finding the pieces of hardware that fit my needs without being exorbitantly expensive. For example, my main PC currently has these parts in it:<\/p>\n<ul>\n<li>ASRock B450 Pro4 R2.0 motherboard (AM4)<\/li>\n<li>a Ryzen 7 5800X 8c\/16t CPU<\/li>\n<li>2x16 GB of G.Skill 3600 MHz DDR4 RAM<\/li>\n<li>an Intel Arc B580 with 12 GB of VRAM<\/li>\n<li>an assortment of various drives, HDDs for data due to historical discounts, nowadays more SATA SSDs and also an NVMe boot drive after the SATA boot SSD melted (blog post about that later)<\/li>\n<li>an Aigo ACSE 240 AIO cooler that I got off of AliExpress<\/li>\n<\/ul>\n<p>I've settled on the setup with incremental updates and replacing failing parts over the years, without spending bank on any single part. My previous CPUs (and the ones still running in my homelab servers, a pair of low TDP 200GE Athlons that draw up to just 35W) sometimes came off of AliExpress, whereas sometimes there was new old stock in some e-commerce stores in my country for good prices as well.<\/p>\n<p>In a word, I try to get parts with good value and then to squeeze as much out of them as possible - tuning the CPU OC so it can punch a little bit above its weight class, picking up the new faster RAM sticks when the DDR4 prices are finally nice (in opposition to DDR5 prices right now), as well as experimenting with a dual GPU setup, which sadly didn't work out well, but let me settle on a setup that's either way hopefully good enough to last me until around 2030.<\/p>\n<p>However, I've got an admission to make.<\/p>\n<h3>I am responsible for some e-waste<\/h3>\n<p>Things are way more shaky when it comes to peripherals. While getting a mainstream CPU or HDD\/SSD will generally be a fairly consistent experience, when it comes to buying keyboards, mice, headsets and microphones, as well as webcams, it's like the wild west out there. There are decent quality products that you can get for cheap out there: and I don't mean <\/p>\n<blockquote>\n<p>\"Oh hey, spend 100 EUR on this Logitech keyboard.\"<\/p>\n<\/blockquote>\n<p>cheap, instead I mean <\/p>\n<blockquote>\n<p>\"Spend &lt;60 EUR for a keyboard that will last you for years\" <\/p>\n<\/blockquote>\n<p>cheap. A good tradeoff between the value the product brings and its actual cost, which is harder to do than you might imagine. Some of the things I've found out were good purchases in that regard include:<\/p>\n<ul>\n<li>Fifine microphones (currently rocking a K669)<\/li>\n<li>Savio webcams (the CAK-01, at that price point everything else looks like trash)<\/li>\n<li>previously the wired Genesis Argon 100\/120 and 200 headphones (good sound, dirt cheap)<\/li>\n<li>but now the wired White Shark Ocelot GH-2042 headphones (mic is not good on any of them, but the sound quality is great for the price, again...<\/li><\/ul>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/im-an-e-waste-consumer\/06-alibaba-listing.jpg"},{"title":"My investments in 2025 so far","date_published":"2025-10-09","id":"https:\/\/blog.kronis.dev\/blog\/my-investments-in-2025-so-far","url":"https:\/\/blog.kronis.dev\/blog\/my-investments-in-2025-so-far","content_html":"<p>I thought I'd make a casual blog post and talk a little bit about the investments I have done in 2025 so far and how they've turned out. I guess sometimes talking about our finances is a bit of a faux pas, but I don't really care about it that much and I think it's an interesting topic. Secondly, I am obviously not a financial advisor and none of what I say is actual financial advice, just my personal look at things.<\/p>\n<p>In general, I live a fairly Spartan lifestyle - most of my money goes into either my savings or investments and I generally only buy the things I really need. For example, even though I use a computer daily, it's not some top of the line rig, but rather a setup with a Ryzen 7 5800X (OCed a bit and with a budget AIO, but still) and an Intel Arc B580, by all accounts pretty mid or entry level hardware. I did end up upgrading to RAM that's a bit faster at 3600 MHz and also had to move over to an NVMe boot drive, but that's because the old SSD I was running on melted. There will be a blog post about this later, but my expectations are that this exact setup will last me until 2030. Similarly, I don't really wear designer clothes or even have a car and most of the games and other entertainment I enjoy is also somewhat budget oriented (like buying games on a Steam sale a few years after release).<\/p>\n<p>Why live frugally? Because my expectations are that the economy won't always be in a very good state and I generally value the ability to not stress over what I will do financially next month or even year more than I do about having a lavish lifestyle. Secondly: I live in Latvia and as a consequence most people here, myself included, aren't doing amazingly financially. You can compare the average developer salaries in Latvia with either the rest of the EU or even US and weep for me. There's of course the ability to start your own business, but my risk tolerance is a bit too low for that, so I generally look for ways to invest money without doing too high risk investments, nor let inflation eat it all up.<\/p>\n<p>And it doesn't end with just me. If my parents or even friends need that sort of a help, I'm happy to be able to help them - for example, one of my friends ended up with a cancer diagnosis and while she's undergoing chemo, she can't really work and in her part of the world the treatment itself is covered by insurance, but it's not like the world around her just stands still and she couldn't really cover everything without a bit of help. Where governments and the systems around them fail, people have to just pick up the slack.<\/p>\n<p>But back to the investments, in the January of this year, I put around 14'000 EUR into a bunch of different...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/my-investments-in-2025-so-far\/08-shopify.jpg"},{"title":"The great container crashout","date_published":"2025-08-31","id":"https:\/\/blog.kronis.dev\/blog\/the-great-container-crashout","url":"https:\/\/blog.kronis.dev\/blog\/the-great-container-crashout","content_html":"<p>At the start of this month, I had an outage where more or less everything I host went down. In part, it was due to failing builds, in part due to bad networking, in part due to broken cloud dependencies, alongside software just being plain finicky. The good news is that I resolved most of the issues, everything was back up and running and eventually I even figured out <a href=\"https:\/\/links.kronis.dev\/g0j7o\">that you need to setup static routes if you want servers on Contabo to be able to talk to one another directly<\/a>.<\/p>\n<p>Unfortunately, this weekend, everything broke again. My homepage was down. My blog was down. I couldn't even connect to some of my servers. For a second I thought that maybe it was finally the time for me to be hacked and someone to steal all of my data or something and take over the servers... but nope, it was just more of software being obtuse garbage. Today, I'll tell you a bit more about the perils of self-hosting, though admittedly situations like this make me write increasingly profanity laden posts, which I don't normally do.<\/p>\n<h3>Tailscale is broken<\/h3>\n<p>Either way, allons-y, everything is down:<\/p>\n<p><img loading=\"lazy\" title=\"01-no-containers.jpg\" alt=\"01-no-containers\" src=\"\/user\/pages\/blog\/the-great-container-crashout\/01-no-containers.jpg\"><\/p>\n<p>No containers are running, quite possibly because the servers can't reach the leader node for the Docker Swarm setup, whereas Tailscale shows that we're logged out, which explains that. I've also got host records setup so that nodes can access sites hosted on each other directly through the Tailscale IP addresses (if I ever decide to cut off public access to anything I host, so things would keep working), which is a bit of a problem because suddenly they also can't pull new container versions.<\/p>\n<p>Why are we logged out? The most I've done is update the Tailscale version a few times, but it's kind of horrible when such a base networking component is pulled out from under your feet, not unlike someone doing that to a rug that you're standing on. It seems like there are <a href=\"https:\/\/links.kronis.dev\/b6mou\">a few people experiencing similar issues<\/a> with the latest version, but I honestly couldn't tell you the cause at the moment.<\/p>\n<p>Either way, we log in:<\/p>\n<p><img loading=\"lazy\" title=\"02-tailscale-login.jpg\" alt=\"02-tailscale-login\" src=\"\/user\/pages\/blog\/the-great-container-crashout\/02-tailscale-login.jpg\"><\/p>\n<p>Great! Except it would be nice if a service that's supposed to be fairly automated wouldn't randomly need human intervention. Nothing changed about the nodes in the question, yet I was still logged out. I didn't even get an e-mail along the lines of: \"Hey, nodes A, B and C have been disconnected from the tailnet due to reason X, please log back in if necessary.\" Nor could I even connect to some of the nodes because me primarily using Tailscale to access them in the first place. <\/p>\n<p>I did work around all that, but it's pretty clear that Tailscale can't be the backbone of all my networking.<\/p>\n<h3>Docker is broken<\/h3>\n<p>Except even after a server restart (just in case), the Docker service shows <code>inactive (dead)<\/code> under its status. It's not even that the containers won't run, but rather the solution to run the containers is dead. Another server restart did eventually help...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/the-great-container-crashout\/14-build-failures.jpg"},{"title":"Building brittle software","date_published":"2025-08-05","id":"https:\/\/blog.kronis.dev\/blog\/building-brittle-software","url":"https:\/\/blog.kronis.dev\/blog\/building-brittle-software","content_html":"<p>So, for most of the week, my blog, homepage and some other sites have been down, so let's talk about brittle software!<\/p>\n<p>It all started, when I wanted to have a quick look at the font stack on my homepage, since I've forgotten exactly what it was and there's <a href=\"https:\/\/links.kronis.dev\/xcdnb\">this one lovely site<\/a> that gave me some inspiration. Unfortunately, when I went to open the site, my browser refused to do that:<\/p>\n<p><img loading=\"lazy\" title=\"01-site-down.jpg\" alt=\"01-site-down\" src=\"\/user\/pages\/blog\/building-brittle-software\/01-site-down.jpg\"><\/p>\n<p>(you'll notice that a lot of the details in this post are redacted, I got a bit curious about how many environment details I'd still accidentally let slip by if I tried to do that for a post, so let's see)<\/p>\n<p>It wasn't an issue of the site loading slowly, it wasn't a database connection failing, or even Apache2 failing to reverse proxy the requests to the Docker container that is responsible for the exact site. Instead, the whole thing was just down.<\/p>\n<p>That's quite odd, since I do have monitoring set up, <a href=\"https:\/\/links.kronis.dev\/12m1b\">Uptime Kuma<\/a>, which has generally worked pretty well and previously had alerts to Mattermost set up, but since I no longer run my own Mattermost instance (so I'd have less software to keep patching constantly), was hooked up to my mail server.<\/p>\n<p>Was the mail server also down, that notifications had failed to appear in my inbox? Aside from the fact that in the future I might also need to hook the monitoring up to some 3rd party mailbox (rate limits and privacy be damned), opening the monitoring site itself on another server showed that everything had been down more or less since the start of the month:<\/p>\n<p><img loading=\"lazy\" title=\"02-down-for-a-while.jpg\" alt=\"02-down-for-a-while\" src=\"\/user\/pages\/blog\/building-brittle-software\/02-down-for-a-while.jpg\"><\/p>\n<p>Normally, that'd be pretty terrible! It's like most of my online presence had been wiped out for a little bit, but the good news is that it's not particularly important - it's not like people can't receive healthcare or other essential services during this downtime, it mostly just hosts this blog, my homepage, as well as a few sideprojects here and there.<\/p>\n<p>In that sense, not having SLAs is freeing, but on the other hand - also annoying. You see, I purposefully pick <a href=\"https:\/\/links.kronis.dev\/i7iga\">software and stacks that are quite boring<\/a>, with the idea that I'll have fewer surprises along the way.<\/p>\n<h3>Docker Swarm issues<\/h3>\n<p>Unfortunately, there are still plenty of those, regardless of what I do:<\/p>\n<p><img loading=\"lazy\" title=\"03-no-such-image.jpg\" alt=\"03-no-such-image\" src=\"\/user\/pages\/blog\/building-brittle-software\/03-no-such-image.jpg\"><\/p>\n<p>So, it was complaining that the Docker images for my software could not be found neither locally, nor in my custom Docker Registry. That should never happen. Even if the registry is down, there's no reason for the local image to disappear.<\/p>\n<p>Yet, this had been just one such time. Digging around in the logs, I could also see this for some of the services:<\/p>\n<pre><code>network sandbox join failed: subnet sandbox join failed for \"10.0.2.0\/24\": error creating vxlan interface: file exists<\/code><\/pre>\n<p>For what it's worth, it seems like folks online have run into <a href=\"https:\/\/links.kronis.dev\/1lnv0\">similar issues<\/a>, seems like it's just one of those things that you run into if you have a cluster for long enough, not exactly a point in...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/building-brittle-software\/16-tl-dr.jpg"},{"title":"Stop killing games and the industry response","date_published":"2025-07-06","id":"https:\/\/blog.kronis.dev\/blog\/stop-killing-games","url":"https:\/\/blog.kronis.dev\/blog\/stop-killing-games","content_html":"<p>Recently, there's been a <a href=\"https:\/\/links.kronis.dev\/3d9d6\">European Citizens' Initiative called \"Stop Destroying Videogames\"<\/a> which by now has hit the milestone of 1'000'000 signatures. You're still encouraged to sign it if you care about its goals and are a EU citizen, since not all of those are likely to be valid signatures, but overall this is a pretty positive trend:<\/p>\n<p><img loading=\"lazy\" title=\"01-stop-killing-games.jpg\" alt=\"01-stop-killing-games\" src=\"\/user\/pages\/blog\/stop-killing-games\/01-stop-killing-games.jpg\"><\/p>\n<p>If it does indeed get enough valid signatures, it will <a href=\"https:\/\/links.kronis.dev\/y7l88\">get passed on to the European Commission<\/a> and new laws might get passed as a consequence. However, there has been some opposition to it, so today I'd like to briefly describe what it's about, as well as why some of the people disagree with it, and why they might be quite wrong in doing so.<\/p>\n<h3>Why are video games being killed<\/h3>\n<p>First up, the actual objectives are pretty concise, here they are:<\/p>\n<blockquote>\n<p>This initiative calls to require publishers that sell or license videogames to consumers in the European Union (or related features and assets sold for videogames they operate) to leave said videogames in a functional (playable) state.<\/p>\n<p>Specifically, the initiative seeks to prevent the remote disabling of videogames by the publishers, before providing reasonable means to continue functioning of said videogames without the involvement from the side of the publisher.<\/p>\n<p>The initiative does not seek to acquire ownership of said videogames, associated intellectual rights or monetization rights, neither does it expect the publisher to provide resources for the said videogame once they discontinue it while leaving it in a reasonably functional (playable) state.<\/p>\n<\/blockquote>\n<p>It was all more or less kicked off by <a href=\"https:\/\/links.kronis.dev\/8hrw0\">a YouTube creator named Accursed Farms<\/a>, who illustrated why this matters with the example of the game <a href=\"https:\/\/links.kronis.dev\/5wsjm\">The Crew<\/a>:<\/p>\n<p><img loading=\"lazy\" title=\"02-videos.jpg\" alt=\"02-videos\" src=\"\/user\/pages\/blog\/stop-killing-games\/02-videos.jpg\"><\/p>\n<p>So what does this mean on a practical level?<\/p>\n<p>Suppose you bought a game like The Crew back when it came out, in 2014. The game is about racing around in cars and can be played both in singleplayer modes and multiplayer modes, with other players. However, the game is made in such a way, that the account management functionality depends on servers, hosted by Ubisoft. This means that once some time passes and supporting those servers is no longer viable (once that AWS bill starts racking up and there are no new sales), Ubisoft is going to turn them off, just like they did in 2024, making the game unplayable.<\/p>\n<p>Even the singleplayer components: you just wanting to race around cars in a world with you and other NPCs in it, is no longer viable. Essentially, you didn't \"buy\" the game, but in a sense were \"renting\" it for an indeterminate amount of time, a lease that expired due to the publishers and developers no longer wanting to provide that service for you. Yet, it wasn't marketed to you as a subscription, you thought that you were buying something, but were instead just being misled.<\/p>\n<p>I don't think that's acceptable, not even remotely. Objectively, there are also no good reasons (there are reasons, just not good ones) for things to be that way: singleplayer games in general have been around...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/stop-killing-games\/05-it-is-that-simple.jpg"},{"title":"AI, artisans and brainrot","date_published":"2025-06-27","id":"https:\/\/blog.kronis.dev\/blog\/ai-artisans-and-brainrot","url":"https:\/\/blog.kronis.dev\/blog\/ai-artisans-and-brainrot","content_html":"<p>Recently, I went to a software development event in Germany, where, at the conclusion of one of the days, I was hanging out in a hotel room with a friend of mine. Earlier, she had been exploring ways to get full VMs running on her Linux system easily, for doing some development work and experimentation with Docker on them.<\/p>\n<p>Another friend had suggested <a href=\"https:\/\/links.kronis.dev\/9w6xu\">VirtualBox<\/a> as a starting point.<\/p>\n<p>I looked at what she was trying to do, and suggested that maybe <a href=\"https:\/\/links.kronis.dev\/01k7z\">Vagrant<\/a> might also be a good fit, due to her wanting to make some of the output of her experimentation easily transferable and reproducible elsewhere (the Vagrant files might be a little bit better for that, than just some Bash scripts that talk to VirtualBox), in addition to wanting a bunch of stuff to be executed during startup.<\/p>\n<p>Obviously, both of us were actually kind of new to Vagrant, due to me having found Docker (and OCI containers in general) more suitable for my needs, also using cloud VPSes for anything longer term and also Ansible for automating configuring my boxes as needed, whereas she hadn't worked that much on the infrastructure side and didn't really feel like paying for cloud resources for something like this. There's nothing wrong with VMs and her choice here was nice, especially because she felt like wanting to learn more about various setups and experiment.<\/p>\n<p>That's where we hit our first roadblock. I also told her about <a href=\"https:\/\/links.kronis.dev\/pahgc\">Docker Swarm<\/a> as a pretty lightweight and simple to use, setup and operate orchestrator. There is nothing wrong with Swarm itself, but we did hit a snag when trying to get the cluster initiated. What we needed to do was:<\/p>\n<ul>\n<li>retrieve the correct IP address on the leader node<\/li>\n<li>use that IP address in <code>--advertise-addr<\/code> when <a href=\"https:\/\/links.kronis.dev\/9syr4\">initializing the cluster<\/a><\/li>\n<li>retrieve and save the join token after the cluster is initialized<\/li>\n<li>on the other follower nodes, retrieve and use this token to join the cluster<\/li>\n<\/ul>\n<p>She was going through the docs bit by bit and trying things that didn't really work (yet) and that were frustrating. At one point, she had decided to take a pause for a bit and suggested I give it a shot. Admittedly, I didn't care much about Vagrant: I knew <a href=\"https:\/\/links.kronis.dev\/g0apk\">what we wanted to do<\/a> and the exact details of <em>how<\/em> we'd do that on the line-by-line level felt less important, so I just threw a prompt, a bit like the list above, at one of the AI tools at my disposal.<\/p>\n<p>For this, I needed a few iterations and I got decently far: the AI generated code used the correct IP address within the script with <code>#{ip}<\/code>, initialized the cluster correctly AFTER actually waiting for Docker to startup in the container (another snag which I hit along the way, which needed another iteration) and could seemingly retrieve the join token. Where I had gotten stuck was that I'd still need to make it available to the other nodes and they were sitting in a waiting loop in their own script, waiting to...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/ai-artisans-and-brainrot\/01-ai-hype-cycle.jpg"},{"title":"More PC shenanigans: my setup until 2030","date_published":"2025-06-13","id":"https:\/\/blog.kronis.dev\/blog\/more-pc-shenanigans-my-setup-until-2030","url":"https:\/\/blog.kronis.dev\/blog\/more-pc-shenanigans-my-setup-until-2030","content_html":"<p>Previously, I explored why having two Intel Arc cards in the same PC is a bit of a mess: <a href=\"https:\/\/links.kronis.dev\/58jcj\">Two Intel Arc GPUs in one PC: worse than expected<\/a><\/p>\n<p>A little bit later, I discovered that Windows 11 fixes some of the issues and that most games and programs, but not all, mostly work: <a href=\"https:\/\/links.kronis.dev\/gpble\">What is ruining dual GPU setups<\/a><\/p>\n<p>Now that I had an OS that's a little bit more cooperative, I decided to go from my setup with the Intel Arc B580 and AMD Radeon RX 580 to a dual Intel Arc setup, with both the A580 and B580 in the same computer, and see if I can fix the problematic software myself:<\/p>\n<p><img loading=\"lazy\" title=\"01-intel-arcs\" alt=\"01-intel-arcs\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/01-intel-arcs.jpg\"><\/p>\n<p>So, without further ado, let's get into it!<\/p>\n<h3>A slightly cursed setup<\/h3>\n<p>You might have noticed in the previous examples that the inside of my case was quite messy. While I did attend to it later and managed to mostly improve everything, for running two GPUs I needed to make sure that all of the cables at the bottom of the case stay there, otherwise they risk hitting the fans and both creating noise, as well as preventing them from working:<\/p>\n<p><img loading=\"lazy\" title=\"02-using-tape\" alt=\"02-using-tape\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/02-using-tape.jpg\"><\/p>\n<p>At that point I just looked at some of the other places where I have cables that are too long and just decided to tape them down as well, since it's quite unlikely that the tape would melt and since it doesn't conduct electricity either, there are very few risks related to doing that:<\/p>\n<p><img loading=\"lazy\" title=\"03-using-more-tape\" alt=\"03-using-more-tape\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/03-using-more-tape.jpg\"><\/p>\n<p>As for the GPU itself, you can see how little clearance there is and why using tape might not have been the worst solution:<\/p>\n<p><img loading=\"lazy\" title=\"04-gpu-clearance\" alt=\"04-gpu-clearance\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/04-gpu-clearance.jpg\"><\/p>\n<p>Of course, when two of those are added in the same case, things do get pretty crowded, which makes me think that perhaps I'd need a bigger case for this setup to truly work:<\/p>\n<p><img loading=\"lazy\" title=\"05-new-setup\" alt=\"05-new-setup\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/05-new-setup.jpg\"><\/p>\n<p>The good news is that the setup itself works and a little bit better than before: Windows 11 lets me choose which games and programs should run on what GPU and since there is no AMD\/Nvidia GPU in there, games like Delta Force also cannot decide on their own whim that they don't want to run on an Intel GPU, since those are the only ones that are available!<\/p>\n<p>Aside from that, you will notice that I got rid of the top case fans, because those were pretty messy and it turns out that the CPU cooler is not good enough either way:<\/p>\n<p><img loading=\"lazy\" title=\"06-working-so-far\" alt=\"06-working-so-far\" src=\"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/06-working-so-far.jpg\"><\/p>\n<p>I would have actually stuck with this setup, if not for some rather interesting problems down the road...<\/p>\n<h3>There is some quite cursed software out there<\/h3>\n<p>The first issue, was that even when all of the monitors are plugged into the main card, the framerate of videos and such (on YouTube, for example) is really bad when the browser is running with hardware acceleration on and is using the secondary GPU, my old A580. The fact that this doesn't work well kind of defeats the whole point of the setup: if I can't play a game on the B580 while watching...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/more-pc-shenanigans-my-setup-until-2030\/07-visual-artifacts.jpg"},{"title":"It works on my Docker","date_published":"2025-05-16","id":"https:\/\/blog.kronis.dev\/blog\/it-works-on-my-docker","url":"https:\/\/blog.kronis.dev\/blog\/it-works-on-my-docker","content_html":"<p>I like the concept of containers and I like <a href=\"https:\/\/links.kronis.dev\/ysakp\">Docker<\/a>. Despite jails and LXC also having been around for a while, Docker has really nice DX and no wonder that it's pretty widely used nowadays (as well as the other OCI compatible solutions).<\/p>\n<p>It's a pretty good way to get rid of some of the environment specific requirements and also have a consistent way of packaging applications, giving and limiting their resources, providing configuration and all that. I use it to run most of the software on my servers and some of the software locally nowadays, when it works, it's great.<\/p>\n<p>However, they are lying to you. The core premise is that if you build a container and it runs, then the same container with the same configuration will run elsewhere, for example: locally, on your CI server and also on your environments.<\/p>\n<p>That is false.<\/p>\n<h3>There is no software reproducibility in the real world (your enterprise Java app at $DAYJOB)<\/h3>\n<p>Have a look at this, I have an application that runs locally, in a container that I built:<\/p>\n<p><img loading=\"lazy\" title=\"01-app-is-running\" alt=\"01-app-is-running\" src=\"\/images\/0\/1\/-\/a\/p\/01-app-is-running-b9418974.jpg\"><\/p>\n<p>Then, when the same <code>Dockerfile<\/code> is used to build it on a CI server, when deployed on the environment, I get a circular dependency error:<\/p>\n<p><img loading=\"lazy\" title=\"02-circular-dependency-error\" alt=\"02-circular-dependency-error\" src=\"\/user\/pages\/blog\/it-works-on-my-docker\/02-circular-dependency-error.jpg\"><\/p>\n<p>You might think that there are configuration changes or something else that is causing this issue. Nope, because if I change the configuration:<\/p>\n<p><img loading=\"lazy\" title=\"03-configuration-changes\" alt=\"03-configuration-changes\" src=\"\/user\/pages\/blog\/it-works-on-my-docker\/03-configuration-changes.jpg\"><\/p>\n<p>Then the error also changes:<\/p>\n<p><img loading=\"lazy\" title=\"04-another-error\" alt=\"04-another-error\" src=\"\/user\/pages\/blog\/it-works-on-my-docker\/04-another-error.jpg\"><\/p>\n<p>The error itself is cause by working on a legacy project that has circular dependencies, but Spring Boot gives you a way around that until you can fix the code (that time hopefully not being never), where you can <a href=\"https:\/\/links.kronis.dev\/kj6f6\">enable that configuration<\/a>, as mentioned above:<\/p>\n<pre><code>spring.main.allow-circular-references=true\nspring.main.lazy-initialization=true<\/code><\/pre>\n<p>Of course, that does nothing for explaining why it works locally in a container, but not in the same sort of container if it's built on a CI server. <\/p>\n<h3>What a mess<\/h3>\n<p>And honestly? I don't care. <\/p>\n<p>If it doesn't work, then it doesn't work and no amount of appeal to complexity of modern software will make me not hate this. <\/p>\n<p>That said, I don't hate Docker. I hate <a href=\"https:\/\/links.kronis.dev\/02pbt\">Spring Boot<\/a>. <\/p>\n<p>Maybe not for creating a viable alternative to the likes of <a href=\"https:\/\/links.kronis.dev\/96ipg\">ASP.NET<\/a> but in the JVM ecosystem, that part is actually really nice, especially because of all the integrations and how productive it can make you when things work. Maybe not even for the performance impact it has compared to <a href=\"https:\/\/links.kronis.dev\/rdscc\">some of the other options<\/a> since the likes of <a href=\"https:\/\/links.kronis.dev\/tzw5o\">Dropwizard<\/a> can be slower and I still enjoy those, since productivity and ease of use do often trump raw performance.<\/p>\n<p>But definitely for their approach to <a href=\"https:\/\/links.kronis.dev\/j6pv8\">dependency injection<\/a>, where a lot of it is done at runtime, as well as all of the proxying garbage that goes on under the hood, often ruining not just your stack traces, not only your transactional code, but also plenty of your sanity along the way. If you have a framework that throws runtime errors for code that you could have checked at runtime, you have largely failed to create a good DI...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/it-works-on-my-docker\/01-app-is-running.jpg"},{"title":"Windows bootloader: it just works","date_published":"2025-05-11","id":"https:\/\/blog.kronis.dev\/blog\/windows-bootloader-it-just-works","url":"https:\/\/blog.kronis.dev\/blog\/windows-bootloader-it-just-works","content_html":"<p>Here's a blog post of something positive that I recently experienced: the Windows bootloader is actually kinda cool!<\/p>\n<p>I did move from Windows 10 to Windows 11 by installing it on a new 1 TB SSD, which will give me way more space than my old ~240 GB SSD had, in addition to future proofing it a bit more, as well as <a href=\"https:\/\/links.kronis.dev\/gpble\">allowing my dual GPU setup to mostly work<\/a> (even despite the interesting title of that blog post, it turned out to be mostly fine).<\/p>\n<p>However, there were also some arguably stupid things that the Windows 11 installer did, which ended up with me having to move the bootloader over to another drive, in addition to shrinking the partitions to accommodate it. But let's not get ahead of ourselves here. Let's start by illustrating that the typical partition layout on a drive for a Windows 11 install might look like the following:<\/p>\n<ul>\n<li>EFI partition (500 MB) - this contains the bootloader for your UEFI setup<\/li>\n<li>MSR partition (16 MB) - this doesn't have user accessible data but is needed for Windows to work properly<\/li>\n<li>data partitions for your drives (however much space you have) - where your \"C: drive\" would reside<\/li>\n<li>recovery partition (650 MB) - this contains some tools for recovering from situations where the OS isn't bootable (<a href=\"https:\/\/links.kronis.dev\/os9uq\">WinRE<\/a>)<\/li>\n<\/ul>\n<p>When you install Windows 11 on a blank drive, typically all of these will be created.<\/p>\n<h3>My situation<\/h3>\n<p>In my case, while I did install the OS on a blank drive, I still had a drive with Windows 10 connected to it (my old SSD), so the installer basically saw that there already is an EFI partition on the old drive and reused it, instead of creating another one on the new drive. Basically, this saved about 500 MB of space (which I don't care about) but also means that I can't wipe the old drive, because then the system would no longer boot.<\/p>\n<p>Obviously, this was not acceptable, so I came up with a slightly wild plan: instead of reinstalling the whole thing again, I would just shrink the data partition on the new drive, move it a bit to the right, also move the MSR partition, and then squeeze the EFI partition from the old drive (straight up cloning it) in at the very start of the new drive. Then, all I'd have to do is wipe the old one clean and tell the BIOS to use the bootloader on the new drive:<\/p>\n<p><img loading=\"lazy\" title=\"00-the-setup\" alt=\"00-the-setup\" src=\"\/user\/pages\/blog\/windows-bootloader-it-just-works\/00-the-setup.jpg\"><\/p>\n<p>In general, this is something that you'd regard as a \"bad idea\", because there's a serious chance of things going wrong and experiencing data loss. Thankfully, I also had some Seagate 1 TB HDDs laying around as well as both some 2.5\" and 3.5\" enclosures, so I could just flash <a href=\"https:\/\/links.kronis.dev\/vf0gy\">Rescuezilla<\/a> on a USB drive and use it to backup the entire drive that I was about to mess around with:<\/p>\n<p><img loading=\"lazy\" title=\"01-backups\" alt=\"01-backups\" src=\"\/user\/pages\/blog\/windows-bootloader-it-just-works\/01-backups.jpg\"><\/p>\n<p>Honestly, it is great software! It's based on <a href=\"https:\/\/links.kronis.dev\/nwvq2\">Clonezilla<\/a> except also has a nice GUI and a desktop environment alongside tools like <a href=\"https:\/\/links.kronis.dev\/ulvtm\">GParted<\/a>...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/windows-bootloader-it-just-works\/06-partition-scheme.jpg"},{"title":"What is ruining dual GPU setups","date_published":"2025-05-09","id":"https:\/\/blog.kronis.dev\/blog\/what-is-ruining-dual-gpu-setups","url":"https:\/\/blog.kronis.dev\/blog\/what-is-ruining-dual-gpu-setups","content_html":"<p>Recently I posted about the woes of <a href=\"https:\/\/links.kronis.dev\/58jcj\">trying to run two Intel Arc GPUs in the same system<\/a> and how I couldn't easily use Windows 10 because it doesn't let me split tasks between them properly, nor use one of the cards for encoding in OBS, because the support for choosing which GPU to use for encoding just isn't there for Intel Arc cards (I'd need an Nvidia card for that, or wait until someone writes that feature).<\/p>\n<p>Since then, I ended up moving to Windows 11 and some things got better, but others not so much. Since I have more information to share, I figured that I might as well make another blog post. For what it's worth, Windows 11 actually seems more stable than Windows 10 for me: I haven't had a GPU crash or system freeze since installing it, the resource usage is okay and with <a href=\"https:\/\/links.kronis.dev\/bcpvt\">Rufus<\/a> you still can make a local user account easily.<\/p>\n<p>I'm surprised to say this, but it genuinely might replace Linux Mint as my daily driver distro, especially because it has compatibility with all of my games and a lot of the software I use anyways. Or rather, it should, even in my dual GPU setup, though things aren't always as simple. You see, there is a menu under <code>System &gt; Display &gt; Graphics<\/code> which lets you easily choose, which program will be handled by which of your GPUs:<\/p>\n<p><img loading=\"lazy\" title=\"gpu-profile-set\" alt=\"gpu-profile-set\" src=\"\/user\/pages\/blog\/what-is-ruining-dual-gpu-setups\/gpu-profile-set.jpg\"><\/p>\n<p>I love that menu. Most of the time Windows is smart enough to decide which GPU to use for what (though they totally should have backported that feature to Windows 10), which typically would be used to make games or other demanding software run on your dedicated card, leaving things like your browser or video players etc. running on the integrated GPU, if your CPU has one in it. At the same time, it works perfectly fine for my dual GPU setup, where my Intel Arc B580 is the gaming card and my old RX 580 is the secondary card for browsers and things like video encoding.<\/p>\n<p>There are some exceptions, such as you can run the OBS window on whatever GPU you want, but configure which GPU to use for the encoding inside of the program. Similarly, for video editing, I might run DaVinci Resolve on the RX 580 but use the encoder in the B580 because at that point I don't need its computing power for anything else, such as when trying to play\/stream\/record a game. For most software and games, however, it's far simpler: the OS tells the process which GPU to use and it does so.<\/p>\n<p>Under the hood, the Windows preferences are stored in the registry, under <code>Computer\\HKEY_CURRENT_USER\\Software\\Microsoft\\DirectX\\UserGpuPreferences<\/code>, with the following data format:<\/p>\n<ul>\n<li><code>Name<\/code> - path to the executable, like: <code>C:\\Program Files\\Mozilla Firefox\\firefox.exe<\/code><\/li>\n<li><code>Type<\/code> - string value, so: <code>REG_SZ<\/code><\/li>\n<li><code>Data<\/code> - preference value (see below)<\/li>\n<\/ul>\n<p>Implied default value for <code>Let Windows decide<\/code>:<\/p>\n<pre><code>GpuPreference=0;<\/code><\/pre>\n<p>Value for default power saving GPU:<\/p>\n<pre><code>GpuPreference=1;<\/code><\/pre>\n<p>Value for default high power GPU:<\/p>\n<pre><code>GpuPreference=2;<\/code><\/pre>\n<p>It can also refer to a specific GPU, not just...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/what-is-ruining-dual-gpu-setups\/brothers-in-arms.jpg"},{"title":"Software licenses and hyperscalers","date_published":"2025-05-03","id":"https:\/\/blog.kronis.dev\/blog\/software-licenses-and-hyperscalers","url":"https:\/\/blog.kronis.dev\/blog\/software-licenses-and-hyperscalers","content_html":"<p>Software licensing is a bit of a mess.<\/p>\n<p>There's many different licenses out there that are meant to protect either the users of the project, the developers, or any corporate interests. Some licenses are proprietary and geared explicitly towards commercial interests, though others are meant to ensure the viability of open source projects, or just free software as a movement in general.<\/p>\n<p>Generally, the open source ones fall into one of two camps:<\/p>\n<ul>\n<li>permissive licenses: <a href=\"https:\/\/links.kronis.dev\/xli09\">MIT<\/a>, <a href=\"https:\/\/links.kronis.dev\/qwx9g\">BSD<\/a>, <a href=\"https:\/\/links.kronis.dev\/qq5c3\">Apache 2.0<\/a>, which have minimal restrictions and are the closest to \"do whatever you want\" you can get<\/li>\n<li>copyleft licenses: <a href=\"https:\/\/links.kronis.dev\/ift62\">GPL<\/a>, <a href=\"https:\/\/links.kronis.dev\/6ykah\">LGPL<\/a>, <a href=\"https:\/\/links.kronis.dev\/9nk7j\">AGPL<\/a>, which require the derivative works to remain under the same license, which cannot be changed<\/li>\n<\/ul>\n<p>In most cases (except for maybe LGPL), the copyleft licenses more or less \"infect\" the rest of your project and affect what you can do with the rest of it, which does matter a lot. There's also many others out there, but for now let's just focus on the well known ones. Because most of the examples out there kinda suck due to how non-specific they are, let's imagine some concrete situations.<\/p>\n<h3>What do the software licenses mean<\/h3>\n<p>Suppose I want to run an online file converter of some sort as a business: you subscribe to it with PayPal and in exchange can use an API where you upload files and get outputs. Let's see how the different licenses can alter my experience as a developer.<\/p>\n<p>Let's say that I have a PDF file processing library that I do not change in any other way, merely include in my project, which is the most common case when it comes to dependencies (imagine your typical <code>npm install<\/code>, Maven, NuGet or any other dependency management solution).<\/p>\n<p>How does this affect the license of my software:<\/p>\n<ul>\n<li>MIT: no changes, I can license it however I want<\/li>\n<li>BSD: no changes, I can license it however I want<\/li>\n<li>Apache 2.0: no changes, I can license it however I want<\/li>\n<li>LGPL: dynamic linking is okay, but static linking would have obligations for the linked code; network use doesn't count<\/li>\n<li>GPL: if I distribute the service (e.g. executables), the code that uses it must be GPL licensed; network use doesn't count<\/li>\n<li>AGPL: much like the above GPL, except network use also counts, all of my service becomes AGPL<\/li>\n<\/ul>\n<p>Do I have to publish ALL of my source:<\/p>\n<ul>\n<li>MIT: no, only need to include the original license\/notice<\/li>\n<li>BSD: no, only need to include the original license\/notice<\/li>\n<li>Apache 2.0: no, only need to include the original license\/notice<\/li>\n<li>LGPL: no, only would have to distribute any changed LGPL code, but not applicable here, since we just include that library<\/li>\n<li>GPL: if I distribute the service (e.g. executables), then I have to release the service source code; network use doesn't count<\/li>\n<li>AGPL: much like the above GPL, except that offering the service to anyone else also means the source must be distributed<\/li>\n<\/ul>\n<p>Now, let's say that I also have a DOCX file processing library, that I do change - maybe there...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/software-licenses-and-hyperscalers\/modern-infrastructure.jpg"},{"title":"Less free will is good, actually","date_published":"2025-04-12","id":"https:\/\/blog.kronis.dev\/blog\/less-free-will-is-good-actually","url":"https:\/\/blog.kronis.dev\/blog\/less-free-will-is-good-actually","content_html":"<p>There's this one sci-fi short story called <a href=\"https:\/\/links.kronis.dev\/9j6lg\">What's Expected of Us<\/a>, that I quite enjoyed. It was <a href=\"https:\/\/links.kronis.dev\/0bvg5\">published back in 2005 by Nature<\/a>, though if you want, you can also read <a href=\"https:\/\/links.kronis.dev\/0bk56\">an archived copy<\/a> of it.<\/p>\n<p>The premise of the story is quite simple, there's a device called a Predictor:<\/p>\n<blockquote>\n<p>By now you've probably seen a Predictor; millions of them have been sold by the time you're reading this. For those who haven't seen one, it's a small device, like a remote for opening your car door. Its only features are a button and a big green LED. The light flashes if you press the button. Specifically, the light flashes one second before you press the button.<\/p>\n<\/blockquote>\n<p>It has a fictional circuit with a negative time delay, essentially it sends a signal back in time. From the perspective of the user, it is a device that predicts the future and which cannot be fooled: if you are going to press the button one second in the future, then the light will come on now, whereas if you won't press the button, there will be no light. Therefore, every time the light comes on, you will press the button shortly afterwards.<\/p>\n<p>The focus in the story was not as much on the time travel aspect, but rather the implications of this: that there is a set future in which things go a particular way and from your present perspective, nothing you do can change it because every decision of yours, even ones to attempt changing things, are predetermined and participate in that future, you just don't know that you're going to make them until you do. <\/p>\n<p>That is more or less the school of thought of <a href=\"https:\/\/links.kronis.dev\/em60v\">determinism<\/a>, which posits that there is no indeterminable force that's driving the universe, but rather that what happens is one long string of cause and effect. There is a bit more nuance to it and attempts at making determinism be compatible with the idea of free will, but the story simplifies things a bit.<\/p>\n<p>In the story, this implied that there isn't free will, which sent a lot of people into a deep depressive state:<\/p>\n<blockquote>\n<p>Typically, a person plays with a Predictor compulsively for several days, showing it to friends, trying various schemes to outwit the device. The person may appear to lose interest in it, but no one can forget what it means &mdash; over the following weeks, the implications of an immutable future sink in. Some people, realizing that their choices don't matter, refuse to make any choices at all. Like a legion of Bartleby the Scriveners, they no longer engage in spontaneous action. Eventually, a third of those who play with a Predictor must be hospitalized because they won't feed themselves. The end state is akinetic mutism, a kind of waking coma. They'll track motion with their eyes, and change position occasionally, but nothing more. The ability to move remains, but the motivation is gone.<\/p>\n<\/blockquote>\n<p>From my perspective, the concept of not having free will doesn't sound that bad. <\/p>\n<p>If you...<\/p>","date_modified":"2026-02-28"},{"title":"Two Intel Arc GPUs in one PC: worse than expected","date_published":"2025-04-10","id":"https:\/\/blog.kronis.dev\/blog\/two-intel-arc-gpus-in-one-pc-worse-than-expected","url":"https:\/\/blog.kronis.dev\/blog\/two-intel-arc-gpus-in-one-pc-worse-than-expected","content_html":"<p>Over the years, I've had quite a few different GPUs:<\/p>\n<ul>\n<li>GeForce 9800 GT (this one melted to the point where reflow soldering wouldn't help)<\/li>\n<li>GeForce GTX 650 Ti (this one ended up being too weak for most games, I gave it away to a friend)<\/li>\n<li>Radeon RX 570 (this one ended up not having enough VRAM for modern games)<\/li>\n<li>Radeon RX 580 2048SP (this one was pretty good, but a bit unstable, especially in VR)<\/li>\n<\/ul>\n<p>More recently, however, I've moved my main PC over to some Intel GPUs, due to their nice amount of VRAM, XeSS being a bit better than FSR in my experience (even though the support for it isn't quite as widespread), but most of all, them also being affordable when Nvidia seems to be charging an arm and a leg for their GPUs. While I would have otherwise gotten a new AMD GPU, I wanted to support more market competition and the price felt just right.<\/p>\n<p>Initially I started with the A580 and thought that it wasn't all that good, but it turns out that even after the driver issues had been mostly patched out, it was actually my CPU that was the problem: the <a href=\"https:\/\/links.kronis.dev\/bkgxl\">Ryzen 5 4500<\/a> (which I got for ReBAR support, not wanting to hack around with my old <a href=\"https:\/\/links.kronis.dev\/zdrvv\">Ryzen 7 1700<\/a>, which wasn't officially supported). Essentially, all of <a href=\"https:\/\/links.kronis.dev\/dhwmo\">the synthetic benchmarks that I could find online<\/a> were lying to me and it wasn't as good as my previous CPU, quite possibly due to only having 8MB of L3 cache, despite me being able to otherwise OC it pretty well.<\/p>\n<p>I would get low framerates in games, with the causes for that not being entirely obvious: it would almost never hit 100% usage but after upgrading to the <a href=\"https:\/\/links.kronis.dev\/k7ppl\">Ryzen 7 5800X<\/a> all of the issues seemed to disappear even in combination with the A580. In other words, suddenly the framerates were way better, not just when it comes to the B-series card where people suggested that there's driver overhead for the older CPUs, but also on the A-series card as well.<\/p>\n<p>By then, I had already acquired the successor by Intel (somehow managing to get the limited edition for a pretty okay price), which means that I had two Intel GPUs:<\/p>\n<ul>\n<li><a href=\"https:\/\/links.kronis.dev\/qr43b\">ASRock Arc A580 Challenger<\/a><\/li>\n<li><a href=\"https:\/\/links.kronis.dev\/inyax\">Intel Arc B580 Limited Edition<\/a><\/li>\n<\/ul>\n<p>Now, they are decently powerful on their own in combination with the better CPU, but I have noticed that if I try to play a demanding game and record\/stream it at the same time, the encoder still seems to get overloaded with either of the GPUs and there's no real way for me to tell the OS:<\/p>\n<blockquote>\n<p>\"Hey, I want you to prioritize the recording, so the game framerate would just dip more, but the overall recording\/stream would remain stable.\"<\/p>\n<\/blockquote>\n<p>Because a lot of people suggest that the Intel Arc cards are pretty good for encoding and that you could get a card just for that, it seemed like it'd be a pretty good setup: since the A580 that I have is essentially a...<\/p>","date_modified":"2026-02-28","image":"\/user\/pages\/blog\/two-intel-arc-gpus-in-one-pc-worse-than-expected\/01-attempted-pc-setup.jpg"}]}
