More from ./techtipsy
I had a few old ThinkPad batteries lying around. They were big, bulky and not holding much of a charge. Inside those were standard 18650 Li-ion battery cells. I have two TOMO M4 power banks around, and they are fantastic for reusing these old 18650 battery cells inside them. You can even mix and match cells without a worry because they are individually addressed, meaning that any issues with battery charge levels and voltages differing between cells are not a concern. Unfortunately the TOMO M4 lacks modern features, such as USB-C ports and USB-C PD outputs at higher voltages and currents, which makes it less useful and convenient in 2025. I haven’t found any newer designs from them as well that are just as cool. I still wanted to reuse those 18650 cells, so I went to AliExpress and bought some 18650 battery enclosures for testing. One holds 8 cells, another one 10 cells, and the largest one could fit 20 cells inside it. Unfortunately, they all suck and are likely a huge fire hazard in the wrong hands. For the 8-cell variant, I used newly bought 18650 Li-ion cells that were charged up to the same level. This battery enclosure worked quite well, until it didn’t. For whatever reason, the enclosure could not charge itself and other devices at the same time. With the 10-cell variant, I used two different batches of used 18650 Li-ion cells from old ThinkPad batteries, charging them up first. That one worked fine, until it also failed in weird ways. It got quite hot during charging/discharging cycles, and eventually the segment display that’s responsible for displaying the charge level stopped showing certain segments. At that point I lost trust in that enclosure, too. I had the most fun with the 20-cell battery enclosure. My first fuck-up involved using two old battery cells with different charge levels, which resulted in some magic smoke coming out of the PCB of the enclosure itself. Somehow that didn’t break the battery bank enclosure, so I crammed 20 charged up used and mixed 18650 Li-ion cells in it and started charging and discharging it. The batteries got quite hot, likely around 50-70°C based on the temperature readings of my hand.1 At that point I realized I was playing with fire and stopped. The USB-C PD behaviour was different on all power banks. Some were fine with powering a ThinkPad laptop with the appropriate cable, some were flaky with setting the power levels, and some were just useless with certain cable or device combinations. The battery banks rely on a very simple arrangement: the 18650 Li-ion cells are connected in parallel, and the resulting 3.7-4.2V is then boosted up for the appropriate voltage on the control board. This carries risks: if you insert two or more Li-ion cells with different voltages, then one will start charging the others to bring the cells to the same voltage, and that can become uncontrolled and result in a cell overheating and/or exploding. It’s also a horrible idea to mix and match used cells of different capacities and wear levels as they will charge and discharge at different rates. In my experience, a cheap DIY power bank enclosure also carries the risk of attracting attention at an airport security check. After learning how bad these can be, that is an entirely justified suspicion. I ended up throwing all the battery bank enclosures out, the hardware failures and issues made me too concerned about one of these starting a fire. I like controlled fires, but the uncontrolled ones are really not my cup of tea. If you know of a 18650 Li-ion cell battery bank enclosure that works like the TOMO M4 but has modern features (USB-C port, USB-PD, can charge laptops etc.) then please do reach out to me as I’d love to test one out. You can find the contact details below the post. 50-55°C feels very hot to the touch, so it’s a good rule of thumb (no pun intended) for determining the minimum temperature of a hot surface by hand. Disclaimer: not physics advice. ↩︎
A long time ago, there was a small Estonian website called “Mängukoobas” (literal translation from Estonian is “game cave”). It started out as a place for people to share various links to browser games, mostly built with Flash or Shockwave. It had a decent moderation system, randomized treasure chests that could appear on any part of the website, and a lot more.1 What it also had was a basic filtering system. As a good chunk of the audience was children (myself included), there was a need to filter out all the naughty Estonian words, such as “kurat”, “türa”, “lits” and many more colorful ones. The filtering was very basic, however, and some took it to themselves to demonstrate how flawed the system was by intentionally using phrases like “politsei”, which is Estonian for “police”. It would end up being filtered to “po****ei” as it also contained the word “lits”, which translates to “slut”2. Of course, you could easily overcome the filter by using a healthy dose of period characters, leading to many cases of “po.l.i.t.sei” being used. With the ZIRP phenomenon we got a lot of companies wanting to get into the “platform” business where they bring together buyers and sellers, or service providers and clients. A lot of these platforms rely on transactions taking place only on their platform and nowhere else, so they end up doing their best to avoid the two parties from being in contact off-platform and paying out of band, as that would directly cut into their revenue. As a result, they scan private messages and public content for common patterns, such as e-mails and phone numbers, and block or filter them. As you can predict, this can backfire in a very annoying way. I was looking for a cheap mini PC on a local buy-sell website and stumbled on one decent offer. I looked at the details, was going over the CPU model, and found the following: CPU: Intel i*-**** Oh. Well, maybe it was an error, I will ask the seller for additional details with a public question. The response? Hello, the CPU model is Intel i*-****. Damn it. I never ended up buying that machine because I don’t really want to gamble with Intel CPU model numbers, and a few days later it was gone. It’s 2025, I’m nearing my mandatory mid-life crisis, and the Scunthorpe problem is alive and well. fun tangent: the site ended up being like a tiny social network, eventually incorporating things like a cheap rate.ee knock-off where children were allowed to share pictures of themselves. As you can imagine, this was a horrible, horrible idea, as it attracted the exact type of person that would be interested in that type of content. I got lucky by being so poor that I did not have a webcam or a digital camera to make any pictures with, and I remember that fondly because someone on MSN Messenger was very insistent that I take some pictures of myself. Don’t leave children with unmonitored internet access! ↩︎ “slut” is also an actual word in Swedish which translates to “final”. I think. I’m not a Swedish expert, actually. ↩︎
I use Uptime Kuma to check the availability of a few services that I run, with the most important one being my blog. It’s really nice. Today I wanted to set it up on a different machine to help troubleshoot and confirm some latency issues that I’ve observed, and for that purpose I picked the cheapest ARM-based Hetzner Cloud VM hosted in Helsinki, Finland. Hetzner provides a public IPv6 address for free, but you have to pay extra for an IPv4 address. I didn’t want to do that out of principle, so I went ahead and copied my Docker Compose definition over to the new server. For some reason, Uptime Kuma would start up on the new IPv6-only VM, but it was unsuccessful in making requests to my services, which support both IPv4 and IPv6. The requests would time out and show up as “Pending” in the UI, and the service logs complained about not being able to deliver e-mails about the failures. I confirmed IPv6 connectivity within the container by running docker exec -it uptime-kuma bash and running a few curl and ping commands with IPv6 flags, had no issues with those. When I added a public IPv4 address to the container, everything started working again. I fixed the issue by explicitly disabling the IPv4 network in the Docker Compose service definition, and that did the trick, Uptime Kuma made successful requests towards my services. It seems that the service defaults to IPv4 due to the internal Docker network giving it an IPv4 network to work with, and that causes issues when your machine doesn’t have any IPv4 network or public IPv4 address associated with it. Here’s an example Docker Compose file: name: uptime-kuma services: uptime-kuma: container_name: uptime-kuma networks: - uptime-kuma ports: - 3001:3001" volumes: - /path/to/your/storage:/app/data image: docker.io/louislam/uptime-kuma restart: always networks: uptime-kuma: enable_ipv6: true enable_ipv4: false That’s it! If you’re interested in different ways to set up IPv6 networking in Docker, check out this overview that I wrote a while ago.
I love 3D printing. Out of all the tech hype cycles and trends over the last decade, this one is genuinely useful. There’s simply something magical about being able to design or download a model from the internet, send it to a machine, and after a few hours you get an actual physical object in return! I don’t own a 3D printer myself, but I’ve had access to people who are happy to help out by printing something for me. So far I’ve printed the following useful things: a Makita vacuum cleaner holder a dual vertical laptop stand it’s such a simple and cheap design, and yet it works incredibly well if you add some rubberized material to the bottom and inside the laptop holder a dual HDD adapter for a Zimaboard a stand for the Steam Deck a carrying case insert for the Steam Deck a case for the Orange Pi Zero There’s so much more that I’d want to print, like various battery holders, controller stands, and IKEA SKÅDIS mounts. There’s also the option of downloading and printing a whole PC case, which is incredibly tempting. Will I finally be able to build the perfect home server according to my very specific requirements? Probably not, given how often my preferences change, but it would be incredibly cool! And yet I don’t own a 3D printer. The main obstacle for me is the time, I feel like in order to be successful with a 3D printer, I’ll need to at the very least learn the basics of filaments, their properties, what parameters to configure and how, how to maintain a 3D printer, how to fix one when it breaks, how to diagnose misalignment issues etc. I’ll also need space for one, extruding hot melting plastic seems like a thing that I’d want to host in a proper workshop and with actual ventilation. It’s a whole-ass hobby, not a half-ass one. Durability can be problematic with 3D prints, even in my limited experience. For example, I tried positioning the Makita vacuum cleaner holder differently, but ended up putting too much strain on the design, which eventually lead to it completely failing. In other cases, filaments like PLA aren’t suitable for designs where they are attached to warm or hot computer parts, they will warp like crazy. I appreciate the hell out of anyone that shares their designs with the world, and especially those that allow remixing or customizing their designs. There are fantastic designs and ideas out there on sites like Printables, and the creativity that’s on display warms my heart.
Today I learned that Kagi uses Yandex as part of its search infrastructure, making up about 2% of their costs, and their CEO has confirmed that they do not plan to change that. To quote: Yandex represents about 2% of our total costs and is only one of dozens of sources we use. To put this in perspective: removing any single source would degrade search quality for all users while having minimal economic impact on any particular region. The world doesn’t need another politicized search engine. It needs one that works exceptionally well, regardless of the political climate. That’s what we’re building. That is unfortunate, as I found Kagi to be a good product with an interesting take on utilizing LLM models with search that is kind of useful, but I cannot in good heart continue to support it while they unapologetically finance a major company that has ties to the Russian government, the same country that is actively waging a war against Ukraine, an European country, for over 11 years, during which they’ve committed countless war crimes against civilians and military personnel. Kagi has the freedom to decide how they build the best search engine, and I have the freedom to use something else. Please send all your whataboutisms to /dev/null.
More in technology
It was probably going to happen sooner or later, but Microsoft has officially released the source code for 6502 BASIC. The specific revision is very Commodore-centric: it's the 1977 "8K" BASIC variant "1.1," which Commodore users know better as BASIC V2.0, the same BASIC used in the early PET and with later spot changes from Commodore (including removing Bill Gates' famous Easter egg) in the VIC-20 and Commodore 64. I put "8K" in quotes because the 40-bit Microsoft Binary Format version, which is most familiar as the native floating point format for most 8-bit BASICs derived from Microsoft's and all Commodore BASICs from the PET on up, actually starts at 9K in size. In the C64, because there is RAM and I/O between the BASIC ROM and the Kernal ROM, there is an extra JMP at the end of the BASIC ROM to continue to the routine in the lowest portions of the Kernal ROM. The jump doesn't exist in the VIC-20 where the ROM is contiguous and as a result everything past that point is shifted by three bytes on the C64, the length of the instruction. This is, of course, the same BASIC that Gates wanted a percentage of but Jack Tramiel famously refused to budge on the $25,000 one-time fee, claiming "I'm already married." Gates yielded to Tramiel, as most people did then, but I suspect the slight was never forgotten. Not until the 128 did Microsoft officially appear in the credits for Commodore BASIC, and then likely only as a way to push its bona fides as a low-end business computer. Microsoft's source release also includes changes from Commodore's own John Feagans, who rewrote the garbage collection routine, and was the original developer of the Commodore Kernal and later Magic Desk. The source code is all in one big file (typical for the time) and supports six machine models, the first most likely a vapourware 6502 system never finished by Canadian company Semi-Tech Microelectronics (STM) better known for the CP/M-based Pied Piper, then the Apple II, the Commodore (in this case PET 2001), the Ohio Scientific (OSI) Challenger, the Commodore/MOS KIM-1, and most intriguingly a PDP-10-based simulator written by Paul Allen. The source code, in fact, was cross-assembled on a PDP-10 using MACRO-10, and when assembled for the PDP-10 emulator it actually emits a PDP-10 executable that traps on every instruction into the simulator linked with it — an interesting way of effectively accomplishing threaded code. A similar setup was used for their 8080 emulator. Unfortunately, I don't believe Allen's code has been released anywhere, though I'd love to be proven wrong if people know otherwise. Note that they presently don't even mention the STM port in the Github README, possibly because no one was sure what it did. While MACRO-10 source for 6502 BASIC has circulated before and been analysed in detail, most notably by Michael Steil, this is nevertheless the first official release where it is truly open-source under the MIT license and Microsoft should be commended for doing so. This also makes it much easier to pull a BASIC up for your own 6502 homebrew system — there's nothing like the original.
There are a lot of very good reasons to monitor local environmental conditions, especially as they pertain to climate change research and various ecological protection initiatives. But doing so in urban locales is a challenge, as simply mounting a device can be difficult. That’s why a team from MIT’s Senseable City Lab built Octopus, which […] The post MIT’s Octopus is a delightful environmental sensor for urban deployment appeared first on Arduino Blog.