A Lovely Harmless Monster

Computer

My current computer is a Thinkpad x250 laptop, released in 2015. I bought it used many years ago to use as a portable computer; when my desktop computer died, it became my main workstation. I keep it connected to a monitor, keyboard and mouse at all times. It ran Windows 7 until April 2025, when I decided to start using linux. After a false start with Fedora, I installed Debian 12 with XFCE on April 15, 2025, and it's been serving me well since. It's still quite functional for most of my use cases, and can even stream gameplay footage at 480p, but I do sometimes wish I had a computer that could run newer games. Click here to see a desktop screenshot with my system specs.

Tags: topics, stuff, tech

I Hate The Person Linux Turns Me Into

Saturday April 12th, 2025

Tags: archive, LinuxSaga, rant, tech

I don't have anything planned this weekend outside of the usual chores, so I embarked on the project of setting up linux on my computer. I had made the decision weeks ago, but I wanted to wait until we finished this round of archipelago streams, because I knew it might take days or weeks to get my streaming setup working and stable again. We finished on Thursday, so on Friday I backed up all my essential files, and today I did a clean install. I had stuck with Windows 7 as long as possible, but it's time to finally pull the plug.

Archipelago is the thing that finally convinced me: most of the game integrations don't work with Windows 7, and the April 1 update killed Windows 7 support completely. I could've stuck with the old version--none of the newly supported games are in my wheelhouse--but my options would still be extremely limited. Most supported games that otherwise run fine on 7, like VVVVVV, have randomizers that require windows 10. It doesn't make sense to me, because you can write a program for Windows 7 and it'll still work on Windows 10. There's backwards compatibility. I don't know why people use new APIs just because they exist.

Anyway, the installation went fine, all my hardware seems to be supported (it's a Thinkpad, so no surprises there) but every single facet of using the software has required painstaking research to figure out what I'm supposed to do. The app store on this version of linux (fedora XFCE) is called "dandified yum dragora", a terrible and meaningless name I'll never remember, so it will always be duke nukem forever to me. Some of the programs I want to use are on there, but a lot of them aren't. I installed VLC to watch videos, and it didn't come with any of the codecs it apparently needs to work. Codecs? I thought the whole point of VLC is that it doesn't require codecs. I was thrilled in 2009 when VLC came along and I no longer had to mess with "k-lite codec pack" and the like.

After googling and finding dozens of forum threads for ways to install the codecs and trying 3 or 4 of them, I finally gave up and took someone's advice to install VLC from "flatpack" instead. Flatpack is like DNF, but different. It doesn't have a UI, so I had to use a command prompt to install it.

The two main uses for a computer are 1. using the web, and 2. watching videos. Linux came with firefox, so #1 was at least taken care of, but I shouldn't have to go into the command prompt to do the very next thing on the list. Off to a bad start!

Once it said it was finished installing, it wasn't installed, so I had to google what to do next. I logged out and back in. It's there now.

Next I had to install Chrome for when my spouse wants to use my computer. This was a piece of cake! I went to the chrome website, I clicked the "get chrome" button, it downloaded a file, I double-clicked it and installed chrome. I hate chrome, but you gotta hand it to them, they make it easy to use their program. If only every program cared about whether people use it.

Next I needed to install bizhawk, for games. It's not on any of the app stores, but it wasn't too hard to set up. I downloaded a .tar.gz file (which is like a zip file but worse) and extracted the contents into a folder. I tried running the executable, but nothing happened. This took some figuring out, but basically the program doesn't run if you click the executable directly, you have to make a desktop shortcut. So I did that, and it launched, but I couldn't play any games. As it turns out, this version doesn't come with any of the firmware you need. Everything, everything on linux requires at least two or three extra steps nobody tells you about.

I googled the bizhawk firmware and downloaded all of them. I got a couple NES and PSX games to work. When I tried to set up the PSX controller, the icons for triangle, square and O don't show up. Just X. So I'll have to trial-and-error to figure out which fields correspond to which buttons. But first I have to figure out why all of the buttons on my controller aren't working. When I first tried to configure it, start and select weren't working. I unplugged it and plugged it back in. Now L and R aren't working. When I use hardwaretester.com, all of the buttons are recognized, so I don't know what the problem is. AFAICT, Linux doesn't have a gamepad configuration tool, so I have no way to even troubleshoot it.1

Okay, let's forget about programs for a minute and talk about UI: at a glance, modern linux desktops don't look too bad. Some of them even have themes where everything doesn't look completely flat. Nice! Way better than modern Windows.

However, even on themes modeled after Classic Windows, the illusion of user-friendliness shatters as soon as you try to use it. You immediately find yourself confronted with missing UI functionality you weren't even aware you need until it's gone, at which point you realize how indispensable it is.

For example, on my default installation, the color of the active window's title bar was the same as inactive title bars, no matter what theme I used. Not being able to tell which window has focus meant I would start typing a chat message in Discord, and suddenly whatever I had open in Firefox would start responding to a bunch of hotkeys I didn't intend to press. Maddening!

There are about a million different settings menus that sound like they might let you change UI colors, such as "Display", "Appearance", "Color profiles", "Desktop", "Panel", "Panel Profiles", "Window Manager", "Window Manager Tweaks", "XF Dashboard", etc. etc. Can you guess which one of these has the option to change the active window title bar color? If you guessed "none of them", you would be correct. I had to go into the folder for the theme I'm using, create a CSS file, and add a line of CSS I'd have never known about if I didn't happen to find a forum thread where someone asked this question. There isn't even a placeholder file with a bunch of example code I can uncomment, I have to somehow know what the elements are called.

What about the taskbar? Looks normal, but observe: The Firefox taskbar item isn't all the way to the left, even though it was the first program I opened:

The web browser has been the main program I use on a computer for at least 20 years. I have 20 years of muscle memory that says the web browser is always the very first thing on the taskbar. If this is ever not the case, I drag it all the way to the left so it is the first thing. On linux, of course dragging doesn't do anything.

I stumbled on the answer on my own, which is good because I have no idea what these things are called or how to google them. They're not icons; they have icons, but what do you call the thing the icon and text label lives on? The answer is "window buttons", apparently, but I've never consciously thought of them as "buttons" before now. I didn't need a name for them, because they worked the way they're supposed to.

Anyway, you have to go into "Panel Preferences"--"panel" is what the taskbar is called on linux, even though the word "taskbar" isn't trademarked and they could just call it that--and enable the setting for the "sorting order" to "allow drag-and-drop". Why isn't this the default? Why do I have to request special permission?

You are a computer. Let me drag. Let me drop.

Speaking of dragging, here's a UI thing no amount of googling or experimentation is helping with: when you move or resize a window, it has this little tooltip in the middle showing the current position and size of the window. I see how this could be useful in some circumstances, but there's a bug where it doesn't properly erase and redraw the tooltip when you move the window, causing this "snaking" effect I find incredibly annoying. So I'd like to turn this feature off please.

I had to take a photo of my screen with my phone, because there's no way to make the screenshot key take a screenshot. Pressing it opens the screenshot-taking program, but it won't let you open this program while a window is in motion. Want to take a screenshot while you're moving a window? "Fuck you", that's what linux has to say.

I can't find a single piece of documentation or official communication that acknowledges this feature exists. I found one reddit thread with someone asking how to turn it off, and no one had any idea what he was talking about. What are the magic words I need to find a solution? "XFCE window size tooltip" seems like a good bet, but googling that brings up nothing but unrelated problems using the same words. Is it not a tooltip? What is it? I want to throw my computer from the window of a moving train. I want to walk into the sea.

I hate what linux turns me into. I turn into a gibbering problem-solving maniac. I can't cope with everything being broken at once. It's not just adjusting to a new workflow, it's building a new workflow from scratch atom by atom. My brain wants to fix everything at once, and it's so hard to interrupt the doom cycle. My spouse practically had to physically drag me away from the keyboard so I could get to the laundry room before it closes. It's ADHD kryptonite.

It's like being overwhelmed by sidequests in Skyrim, except I get a new sidequest when I open the menu. I get a new sidequest for every page of the inventory, every tab on the skill tree, every item slot I try to equip. I press the "jump" button and I'm given a sidequest to complete before I unlock jumping. No quest targets appear on my compass except the ones to the north. I have to do sidequests to unlock east, west and south.

I would not play this game. I would uninstall it immediately. But this isn't a game. It's the software I need to do literally everything. No one should have to endure this.

Well, I could complain about broken UI literally all day. The whole reason I'm here is because of archipelago, so let's fire up the new version and have a lo--

Fatal Python error: init_fs_encoding: failed to get the 
Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f215ebd95c0 (most recent call first):
  <no Python frame>

Apr 13 2025 See Kami's response to this post, I'm sorry, but you're holding it wrong, and my response, Linux Mint.

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. It doesn't come with one, but I found a program called input remapper that allowed me to remap every gamepad button to a key on the keyboard. So it's like JoyToKey except that I have to use it for everything, not just keyboard games. Whatever works, I guess. ↩︎

Linux Mint

Sunday April 13th, 2025

Tags: archive, correspondence, LinuxSaga, rant, tech

In response to my last post, Kami wrote a reply which boils down to:

Just get Linux Mint.

A reader named Mark sent a reply with much the same advice. I appreciate both of your responses.

When I used Mint, I had a number of problems similar to the ones described in my previous post, but the worst is that the filesystem would gradually become more and more corrupt as I used it. I would randomly find myself unable to do anything because the entire hard drive would become locked down to "read only" mode. When I rebooted, the OS wouldn't load, and it would bring me to a grub prompt. I could run a fsck command, which would temporarily fix the problem and allow me to use the computer a little longer, but the filesystem would inevitably become corrupt again. Each time I ran fsck, it took a little bit longer, eventually needing 30-45 minutes to run its course; and each time this happened, I would have less and less time before the filesystem shit itself again. Eventually it would reach a point of unrecoverability, and I would need to wipe the hard drive and reinstall the OS. This happened about once a month.

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

Mobile Data Banditry

Thursday May 01st, 2025

Tags: archive, hacks, internet, long, phones, tech

I have a cheap no-contract phone plan that offers a couple gigabytes of data plus "unlimited talk and text" for $15 a month. Since this is supplementary to my home internet, the couple GB is usually enough, if I'm careful to use mostly text-based applications. Every once in awhile there's a new podcast I want to download and listen to immediately, or I want to look at a site on the adweb, but these occasions are rare and I've gotten pretty good at rationing my data to last all 30 days.

In April, I ran out on day 29. So close! I knew I'd be fine without for a day, I could still text my partner and I could still call someone if there was an emergency. But when this happens, I get curious whether there might be a way to circumvent the data restriction.

You see, my phone is still receiving data. Text is data. I can visit the website for my phone carrier and pay my bill. I can send and receive multimedia messages, that's potentially a lot more data than a text. My phone still says I'm connected to LTE. Clearly there's a normal data connection there and my carrier is just limiting what sources of data I can connect to. But what if I can fool the network into thinking I'm doing approved data activities when I'm not?

I touch on technical concepts about which I have some basic understanding but am not an expert. If you don't care about my kibitzing, here's the

TL;DR

I didn't find a way to fool it, but I think MMS has some untapped potential, I discovered a loophole that gives me access to some useful google web functions, and I might have forced my cell phone provider to fix a very cute exploit.

background: what is a phone?

I pride myself on having approximate knowledge of many things, but I'll be honest, I don't have a clue how phone networks operate. Modern ones, I mean. When you're talking about old copper-wire POTS1, I can trace a conceptual line from the telegraph and electrical sound modulation to pulse dialing and switchboards with human operators; then to touch-tone dialing and electronic switchboards controlled by DTMF tones. I may not understand the fine details, but I get the gist.

Now that everything is cell phones and VOIP, I have no clue. It's a black box. I know people have set up their own home PBX/VOIP systems with software like asterisk, but I can't conceptualize how it works. I know it involves "leasing" a phone number, but how? From who? Who owns phone numbers? The government? Do I call up the FCC and say "one phone number, please"? I think it probably involves multiple levels of intermediate wholesalers, and I can't imagine the total expense is anything but prohibitive.

Likewise, I have no idea how cell phones differentiate "stuff that comes through the phone number" and "stuff that comes through the internet". So, my first idea is totally hypothetical and based on shit I don't understand.

method 0: MMS

Multimedia Messaging Service (MMS) is an extention of the old Short Message Service (SMS) used for texts. These days, it's most famous for being abused by texting apps that want to cosplay as full-featured chat programs, with reactions and rich media, so if you're in a group text with a bunch of people using iphones, it's this annoying bullshit smeared over dozens of sprawling incoherent messages:

conversation screenshot

The future of communication.

But before Apple did what Apple always does to standards, it was a perfectly nice way to send pictures or voice messages to your friends. It seems like the maximum size for an MMS message is 300KB, 600KB, or 1MB, depending on which google result you believe and whether your carrier is using the most recent standard.

So, it seems like it should be fairly simple to send any size file you want in chunks encoded as png images or Base64 text.

The hard part would be automating a system that can send via whatever pipe MMS messages are sent through. I don't have a computer with a phone number, and I don't know how to send anything to a phone number.

But interestingly, the server my carrier uses to relay MMS is http!

mobile access settings screenshot

Luckily, the photo editor on my phone has a weird bug that makes images look gnarly and cybre whenever I use the pen tool. Redaction-core!

If the MMS data is sent over httpโ€”assuming it's not somehow encrypted (the "wapenc" in the url could be a clue that it's being encrypted or it could just mean encoding, I have no idea)โ€”it should be possible to snoop on the packets, figure out how they're being sent, and reverse-engineer a way to send your own data through that pipe. And this is where my well of technical knowledge has run dry. I have no idea how to do what I described. I just suspect it may be possible.

method 1: hang on a sec

But wait... you don't necessarily have to text someone from a phone number. Every (?) cell phone carrier gives you an e-mail address. It's your phone number @ a special domain, like 5558675309@txt.carrier.com. So you'd just need to encode the data chunks, e-mail them, then reassemble. This is a system someone could actually build. Sending large amounts of data this way might cause you to get rate limited or throttled, but ah, that would mean the "unlimited texting" they promised is a filthy lie, wouldn't it? Then they got a lawsuit on their hands ๐Ÿ™ƒ

But hey, with smaller files, encoding shenanigans might not even be necessary. At first, I assumed that MMS systems won't let you attach arbitrary file types, because when I try to include an attachment in a text message, the options presented by the android UI are pretty limited:

attachment modal screenshot

But if I'm sending an email, I'm not restricted to what this UI will allow me to attach. Can I text myself Super Mario Bros.?

An MMS message that reads "additional media content is included. Please check the message in detail.

Hm, okay, "Please check the message in detail." I can probably do that by... uh... "long-pressing" on it?

screenshot of message details. It shows a size of 41 kilobytes.

This time I cropped out the part of the UI with alpha transparency and it didn't fuck it up at all. What's the deal, phone?

Okay, 41KB. Mario is in there somewhere, in some form. How do I get him out? Mario's not equipped to survive in computer world. He doesn't have a frisbee made of light or anything.2

At first I assumed it's impossible and the system isn't built for these kinds of attachments, so I went through a whole bunch of rigamarole trying to send it with a .txt extension, copy the text, and turn it back into a .nes file on the other end, which didn't work (it just strips the part where all the binary data's hidden.) Then I tried to encode the rom into Base64 and decode it, which also didn't work. I spent a lot of time trying to figure out what I was doing wrong (I think it has something to do with incompatible line ending format between the two programs I was using) which is part of what made it take so long for me to finish writing this.

But I had an epiphany, and none of that was necessary. Turns out all I needed to do was long-press on the message and choose the worst-named function in UI history:

"share" ๐Ÿ™„

It gave me a list of different apps I could share it with. One of the options was the file manager. When I "shared" the message with it, I got to choose a location where I wanted to save it:

screenshot of message: smb001.nes copied to android storage

And there you have it. It always appends 001 to the filename for some reason, but otherwise it's the same file. I texted myself an NES rom via e-mail and it works in Nesoid. No metered data required.

screenshot of super mario bros being played on a horizontal phone with virtual buttons

Finally, Mario the way it's meant to be played: while smooshing your thumbs against indiscernible spots on an unyielding glass screen.

So now that I know it works, it's time to test the limits.

First off, I don't know whether this is obvious, but you do need an active data connection to get the attachments. I tried turning mobile data off, and messages will come through, but it's just the SMS text notifying you that you received something; none of the data in the MMS layer is accessible over the edge network. Once I turned LTE back on, it came in properly.

I know it works on a data connection that's been suspended for going over the cap, but it wouldn't work if I were suspended for nonpayment; even though there is an active LTE connection, I wouldn't be able to get calls or texts.

  • I tried it with the Dragon Warrior 3 rom, which is 512KB, and that went through fine.

  • I wanted to see if it would allow me to send an APK, so I found one small enough, a tiny storage analysis utility called DiskUsage. It sent and installed with no issues.3 โš ๏ธ This should go without saying, but do not install random apk files from the web, or open any executable file from an unknown source. Doing so may may put your phone at risk. โš ๏ธ

  • I wanted to send a different file type between 600KB and 1MB, so I looked through my downloads and found a 700KB .mobi copy of Frank Herbert's Children of Dune. It also went through no problem.

  • I sent a .7z archive of a GBA rom slightly more than 1MB, expecting it to fail, but it went through. Might the limit not be 1MB after all? Hm...

  • A 5MB PDF? No probalo ๐Ÿ‘Œ

  • A 16MB game boy advance rom? Well, now it gets complicated.

I assume it failed, and thus the file size limit is somewhere between 5 and 16MB, but I can't be sure, because it didn't bounce back on the e-mail end or give me some sort of undeliverable message warning on the phone end. It just silently failed. Or, maybe it hasn't failed yet.

This is where we get to the big caveat for this method: not only is it very slow, it's slow in an unpredictable way. A 5MB file might go through almost immediately, or a 50k file might take 10 minutes. The GBA rom might show up eventually, but at this point it's been half an hour, which is longer than any other file has taken, so I'm assuming the network unceremoniously discarded it. If this changes, I'll add an erratum here.4

Still, if it's not urgent, this is a way to get a non-trivial amount of data without counting against your cap. I can definitely see a scenario where it's practical to have a system where you send an SMS containing the URL for a file to an e-mail inbox on a server you control, a script fetches the file, and the system replies with the file attached. With a very low monthly cap, it's prudent to preserve every precious megabyte possible.

method 2: elite hacking skills

I have access to my carrier's website. What if I use the browser developer tools and drop an <iframe> on the page that loads the website I want?

Well, chromium-based browsers on Android (the one I use is Kiwi Browser) do have developer tools, just like Chrome on PC, but it's barely functional on a phone. When you try to edit a page element, the keyboard pushes the UI up to completely obscure what you're typing, so I had to type the tag in a text editor, carefully position my cursor, and use the paste button on the keyboard.

android chromium dev tools screenshot

The ultimate development environment. A real hacker can sense the code.

I wanted the iframe to contain this website, so I pasted this just after the body tag:

<iframe src="http://bluelander.bearblog.dev">

Having the carrier website open in one tab and the developer tools open in another tab uses about 900% of my available ram, and doing anything at all with the dev tools slowed everything to a crawl, but eventually I managed to paste the tag and switch back to the site tab without the browser crashing. There was a big white box superimposed over the site that may have been an iframe failing to load the requested content, or may have just been general jank. I could no longer scroll or interact with the site in any way. I realize now that I should have used the TLS version of the URL, since it probably won't want to load an http iframe on an https site even under the best conditions, but if by some miracle the https version worked, this still clearly wouldn't be functional enough to rely on.

method 3: the samsung/telecom goodwidget pact

I have a samsung phone, so it comes with its own terrible built-in browser that I never use and can't uninstall. However, when I was experimenting, I discovered something shocking: even when data is restricted, google search is 100% functional in the samsung browser. Additionally, it's faster than any other website I use over LTE, ever.

I have an unlocked xcover 4 that originates from outside the US and a BYOP plan, so I assume samsung has worked out a deal with all the carriers to prioritize google search traffic, so people using samsung phones won't complain that the search widget sucks.

When I discovered this, I immediately set out to discover what limitations are placed on it. What I'm allowed to do is very granular: I can do a google search or a google image search. All of the instant search results still work, so I can find the weather for my area, or convert cups to millilitres, or calculate the square root of 7, or see the tallest punk singers in descending order of height.5

As soon as I tap on one of the results, the connection fails, even if it's an AMP page.

I can't go to most google subdomains directly, but some of them sort of work if I do a google search and then click on the link from the google search results. For example, nothing happens if I type books.google.com into the URL bar, but if I search for "google books" and click the link in the result, I have pretty much full access. I thought this would be a way to get to public-domain books, but gbooks itself doesn't seem to host any full texts, even ones it has the rights to. If I search for "Frankenstein", I can't find, like, a text version from Project Gutenberg. It's just various commercial publications, at best all I can get is a preview. You can find noncommercial versions, but they all link to a $0 purchase in the google play store, which I would argue is slightly less free than actually free.

I was able to get to google translate, which was exciting because there was a chance I could use the old anti-firewall trick: you can use google translate as a proxy to view whatever webpage you want, just "translate" a page that's already in english from another language into english. But no dice. Google Translate loaded, it looked like it was going to work, but when I clicked the link to view the translated page, just an infinite throbber.

While I was at it, I also took a stab at seeing if the google web cache would work, but nope, no connection.

Some subdomains are accessible, but less functional. If I search for "google drive", the link takes me to a splash page inviting me to log in, even if I'm already logged in. Clicking the link fails to do anything. Weirdly, youtube works, even when I type youtube.com into the address bar, but it has no video thumbnails and (naturally) I can't watch videos there. I guess this is so you can get fast results when you do a video search with the widget. And some subdomains like gmail and google news don't work at all.

I tried every google product I could think of that might be a backdoor to useful dataโ€”docs, sites, chat, voice, hangouts, blogger, podcasts, even weird shit like google arts and cultureโ€”and if I could access any of them at all, I was stymied as soon as I tried to do anything useful with them. They locked everything down as tightly as possible. That said, I consider this a small victory, because there are useful things I can do with my phone when I'm out of data. If I ever desperately need to prove who won the 1942 World Series to win a bar bet, there's nothing my telecom can do to stop me!

very glitchy screenshot of google search results with a purple line on it

Oh no, I brought back the wrong sports almanac, this is the blaseball result!

method 4: sneak in through the help docs

This one's my favorite. Not only did it almost work, but it reminds me of a classic windows exploit only 90s kids will remember.

So, I'm back to Kiwi Browser. I load up my carrier's homepage. I'll be using this site to demonstrate the steps.

Tap the little lock icon in the URL bar, and tap where it says "Connection is secure".

Screenshot

screenshot

It'll show you some info about the page's encryption status.

UI screenshot

I didn't want the joke to wear thin, so I begrudgingly downloaded a different image editor. Don't worry, the glitchy isn't going anywhere.

At the bottom, tap "what do these mean?" and it'll take you to the google support page about TLS certificates.

web screenshot

Normally there's not many places you can go from here, but I'm logged in, and it's inviting me to take a look at my account settings.

From there, I can tap the waffle menu at the top and get access to a bunch of google services.

web screenshot

Now, this modal didn't work when I was using google in the samsung browser: it gave me a throbber that spun for a minute but eventually errored out.

web screenshot

It would give me a similar error if I tried to tap my account picture.

But here, it came up right away. So I tap News, and it takes me to google news. I wasn't able to get there with the samsung trick! Excited, I tap the waffle menu again and tap "drive". It takes me straight to my google drive account. I can see all my files.

But something's amiss. I can see the file names, but there are no thumbnails, and the javascript or CSS didn't load properly, because the page looks broken (I was too excited to think to screenshot this, a shame I will never live down) but I tapped one of my files, and... nothing. A throbber that throbbed forever. I force-closed kiwi browser, opened it again, tried to get back to the google help doc, and this time nothing happened. They caught me. I don't know how they noticed it so quickly, maybe it's because I was already fucking around to see what I could get away with, but that door is now closed. Still though, what a thrill. For just a moment, I could say... I'm in ๐Ÿ˜Žโšก๐Ÿ–ฅ๏ธ

If you're not familiar with it, the Windows 98 trick involves using a byzantine series of help menus to bypass the login screen, as immortalized in this gif.

conclusions

Method #4 ended up inconclusive, but it was exciting to find a back door, even if they did immediately slam it shut.

Method #3 is interesting, but probably not an actual exploit, and I don't know how universal it is, i.e. whether it's all samsung phones or just my specific model, or even if it would still work if my OS was up to date. Still, it's an actually useful feature I didn't know I had before.

Method #2 was a silly idea I didn't expect to work, but it was fun to discover new depths of just how bad an interface can be.

MMS is definitely the most promising option. I never guessed it would allow you to receive any type of file, as long as you know how to operate the arcane UI. The 5MB limit makes it tricky, but I remember in the days of shaky dial-up and only-barely-less-awful DSL, it wasn't uncommon to find large files distributed as dozens of chunks you stitch together with a program like hjsplit. Desperate times call for creative solutions.

I think we could be getting more milage out of MMS as a text delivery platform, too. If I had the technical chops, I think the first thing I would make is a relay to accept text messages, turn them into a wikipedia search query, and reply with a text-only version of the requested article. This should work even on the cheapest pre-paid normalphones that aren't useful multimedia devices, and I know wikipedia has its limitations, but having a cheap device with a cheap connection that lets you instantly find information about anything, well, it reminds me of something

xkcd comic

[view big] [transcript]

So uh, if you read this far, thanks! Hope you had a good time. The moral of the story is: fuck around and find out, because fucking around is fun, and learning is cool ๐Ÿฆ

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. Plain ol' telephone service. ↩︎

  2. But maybe he should. Nintendo: call me ๐Ÿค™ ↩︎

  3. Sidenote: not only did it install just fine, it's also a surprisingly useful app. It's essentially an Android version of SpaceMonger, the free 1.40 release of which has been my go-to storage analysis program on Windows for years. ↩︎

  4. Today protonmail sent me an error notice that says "Your message could not be delivered for more than 12 hour(s). It will be retried until it is 2 day(s) old." Which is kind of a weird failure mode. Also, since writing this, I've tried different attachment sizes to see if I can pinpoint the exact limit, and nothing larger than 5MB has sent, so looks like I got it in 1. ↩︎

  5. Joey Ramone was 6'6"? Holy shit. ↩︎

Android Browsers are Weird

Tuesday May 06th, 2025

Tags: blog, crafting, phones, tech

In the old days, Android phones all came with an app installed that was just called Browser. This was usually an official Google app, and it was just a wrapper around android's WebView. This is a system component that's always been part of Android, and it's a web renderer that any app can use. If you use an app like Instagram or Facebook and click a link, it often uses WebView to render it, rather than opening a dedicated browser. This is because Facebook wants to keep you using Facebook, and if it opens a full browser, you can type in a URL or open a new tab to go somewhere else. Facebook wants you to just tap the "back" button and go back to Facebook, so unless you start clicking links, that's the only option you get.

The popular third-party browsers on early Android, like Kiwi and Dolphin, were simply wrappers around the WebView API that offered additional features or a better UI than the default Android browser. Some mobile browsers, like Brave and Opera,1 market themselves heavily and include malware or deceptive services to profit off the users in some way; but fundamentally they're just the same WebView implementation under the hood.2

There are exceptions; the android version of Firefox still uses a version of their Gecko engine, but as a result it's slower and clunkier than the ones that use WebView.

I use Via. It's also just a wrapper around WebView like Kiwi and Dolphin were, but unlike those browsers, it hasn't yet capitalized on its popularity by adding ads or other malware. It's fast, it stays out of the way, and it even has some basic ad-blocking functionality. It's not as comprehensive as uBlock Origin, but it makes the corporate web somewhat usable on a mobile device.

Now, I haven't mentioned the elephant in the room, which is Chrome: at some point, Android stopped coming with an app called "Browser"3 and started including Chrome, which makes sense: they want to unify all their OS stuff under the Chrome umbrella, because in many ways, everything is becoming a web app. ChromeOS can run Android apps, and many modern Android apps are made with the same javascript frameworks that websites are made with. The distinction is becoming less meaningful.

Here's what I don't understand: surely the android version of Chrome is also a wrapper around WebView, right? So why do sites look different on Chrome than they do in Via? I've been mildly obsessed with this question, because I opened my site in Chrome and noticed a lot of text is the wrong size. Other than <h1> <h2> etc, and the navigation bar and footer, all the text on this site should be exactly the same size. I carefully crafted page elements so that, for example, the Browse section of the front page is two neat columns in harmony with the rest of the text. But on Chrome, the text in those columns is smaller. The "browse" item in the navbar is too small, the navbar items don't line up nicely in three rows, and the overall text size is much larger than it should be.

I've pored over the CSS. I can't figure out where the discrepancy is coming from. I can't figure out why it doesn't look exactly the same as it does in Via. It should. Chrome must use WebView under the hood, right? Or maybe now it's more accurate to say WebView is using Chrome. Either way, it should all be the same. The Chrome app is 30MB, which is bigger than Via's 12 MB, but that's probably accounting for Chrome's google profile integration and other data-mining malware. There's no way it contains an entirely separate rendering engine; the desktop version is around 200MB. Idkwtf.

In Mobile Data Banditry, I used my browser's development tools4 to modify my mobile carrier's web site to insert an <iframe> and see if it would allow me to bypass their data restrictions.5 I complained about the user experience on a phone:

But it was at least possible in 2022. Now it doesn't seem to be. There may be some browser that offers this functionality, but crucially, I can't use the developer tools on mobile Chrome to see what CSS it's applying and why. Mobile Chrome doesn't even seem to have a view source function. It's 100% for consumption.

I have a tendency to fixate on small details---you wouldn't believe how long it took me to make sure the little arrow on the "Browse" drop-down changes back and forth correctly---but here, I'm going to have to tap out. I don't have a comb fine-toothed enough to figure out how to make the CSS look normal in Chrome, nor do I have the spoons to care. My official recommendation is not to use Chrome; if you do, zooming out to 90% makes it look closer to how I intend. Beyond that, I can't help you ๐Ÿฆ

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. Opera used to be great; it was my go-to browser for most of the 2000s, back when there was an actual browser ecosystem. It was bought by a vulture capital cabal in 2016 and has since used its name recognition to facilitate scams↩︎

  2. Reader Goofpunk believes Brave and Opera are in fact using Chromium components rather than WebView; I haven't installed either browser (for obvious reasons) but if true, this makes the whole ecosystem that much more confusing to me: Why would they choose to use Chromx instead of WebView? What's the difference, but more importantly, why is there a difference?? ↩︎

  3. Your phone may still come with an app called Browser, but it's probably from your phone manufacturer or carrier, not Google. Samsung phones in particular like to change your default browser back to Samsung's Browser every time your device has an update: it's a wrapper around WebView with some added malware. ↩︎

  4. In that entry, I incorrectly stated that Android browsers are based on Chromium; my understanding now is that "Chromium" is just the name used by the open-source components of Chrome. If you want to get technical, the engine used by all of these browsers is called Blink. Hopefully you can understand my confusion. What is the exact relationship between WebView, Blink and mobile Chrome?  ↩︎

  5. It didn't, but I still think it was a clever idea. ↩︎

My headphones keep crashing

Monday May 19th, 2025

Tags: blog, LinuxSaga, tech

Occasionally my headphones will suddenly start repeating the last audio sample it received, machine-gun-like; this lasts about 10 seconds, then the headphones disconnect, then a few seconds later they reconnect. It sounds just like when a game crashes and your sound driver doesn't know what to do with the garbled data, so it just repeats the last sample over and over until you either kill the program or restart your computer.

It's tempting to blame this development entirely on linux, but it's happening with my phone, too. It's much less frequent on my phone, and I can go most of a workday with only one or two crashes, but at home, it's reaching a point where I can't even get through a 30-minute video without a crash or two. Linux seems to be the catalyst, but it's not quite so clear-cut.

If you're a regular reader, you might be aware that I use a somewhat specialized pair of headphones:

alt text

These are 3M Worktunes Connect headphones, and despite their poor rating on the product page, they're the best headphones I've found that meet my needs. They provide 24dB of noise reduction, they're fully wireless and they have a battery that lasts all day on a charge. They've really become an indispensable part of my kit. They protect me from the noise pollution of urban life,1 but more importantly, they've improved my executive function tremendously. I can leave them on for most of the day and listen to things as I do what needs doing. I can listen to podcasts, videos, audiobooks and music all day at work. When I get home, I usually disconnect them from my phone and pair them to my computer. That way, whatever I'm watching or listening to, I can continue watching or listening to when I get up and do something else. I can make dinner, or wash dishes, or take care of Sunny's needs without it feeling like a chore, because my focus isn't interrupted.

I have a pair of wired headphones I use for streaming2 and I've been using those until I can figure out what's going on with these. The cable isn't long enough to reach the computer on my desk, so I have my microphone on its tripod plugged in via USB, and my headphones are plugged into that. It works, but it's a lot harder to get up and do something when I have to pause whatever I'm listening to.

Bluetooth has always been a terrible unreliable technology, but I never had anywhere near this many problems before I started using linux. They never crashed like this, and I've been using them for a long time. I'm on my third pair. They typically last 1-2 years, and when they fail, it's always been a physical fault: the wire frame snaps from repeated flexing, or the button breaks. I've never had to replace them because of a software issue before. Sometimes they'll disconnect from whatever they're paired to for no reason, bluetooth is flaky, but never like this. The fact that it's also happening with my phone makes me wonder what in the world can be happening.

I don't know much about how bluetooth works, but here's my theory: the headphones must have some small amount of memory to store the device address of every bluetooth device it's been paired with. I believe this is necessary because every bluetooth connection is a handshake between two devices; even though they don't have a display and their input is limited to a single button, the headphones must contain a tiny computer to make this handshake, and because it would be annoying to complete the pairing process every time, it has a small amount of flash memory to store the device history. How many devices will a person pair the headphones to in the lifetime of the product? The headphones can probably store like 50-100 addresses, which the designers assumed is massive overkill, nobody will ever pair them to that many audio devices.

Well, the linux bluetooth driver, being open-source and thus not as purpose-made or well-tested as manufacturer's driver, may be doing something to cause this storage to fill up. It's not using a different address every time, because I don't have to "re-pair" the headphones each time they crash. There might be some sort of garbage collection that's not being done properly, causing the buffer to overrun and the headphones, not designed to deal with this failure mode, simply crash.

This is all conjecture, but that's the only story that makes sense to me. That would explain why they're much more stable with my phone, and why I never had this issue before switching to linux. All that said, I'm not sure exactly how I'm supposed to fix it. The manual says the headphones have a "factory reset" mode that can be activated by continuing to hold the button for 7 seconds after I turn them off, but that doesn't seem to do anything on mine

At some point I intend to get a dedicated bluetooth transmitter, like this:

That way I can just connect my computer with a 3.5mm headphone jack and hopefully won't have to worry about software at all. It'll degrade the audio quality somewhat, but I mostly listen to speech when I'm at home anyway, and if I'm listening to music, it's usually through my good speakers.

The transmitter pictured is currently $35 at the Bezos Bazaar, which is more than I'd like to spend just to get headphone functionality back. There are cheaper options, but they mostly seem designed for car use, so I don't expect the range will be very good at all. Having a dedicated transmitter with a proper antenna will hopefully give me a better connection, because it also tends to break up if I move too far away from the source, turn on the microwave, etc.

What's unclear at this point is whether I'll also need to replace my headphones. At this point in time they're working fine, I'm at work and they've been connected to my phone all morning without issue. But without the ability to do a factory reset, or troubleshoot them at a hardware level, it's hard to be 100% sure the crashing won't persist. I don't want to spend $35 and find out the problem really was the headphones all along.3

I say all this now before my next proper linux update, because this is the biggest issue I've experienced since switching, and I can't even definitively blame it on linux. But you have to admit, the circumstantial evidence is hard to ignore. Other than this, it's been relatively smooth! Tune in next time to hear about the good stuff! And a handful of minor nitpicks!

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. Some might be wondering why I don't "just" get active noise-cancelling headphones. I've tried them, and they don't work for me. They work fine for the consistent drone of the bus engine, but every time it hits a bump or pothole, the sound shoots through my skull as if the headphones are little ear trumpets funneling the sound directly into my auditory cortex. ↩︎

  2. Bluetooth headphones add an unacceptable amount of lag for streaming, because I hear myself a split second after I talk. The 3M headphones have a 3.5mm jack for wired mode, but incredibly the audio is still processed as if it's being used in bluetooth mode. The lag is still present and the battery needs to have a charge, so they don't turn into normal headphones once the non-replaceable battery dies, they just become e-waste unhinged engineering. ↩︎

  3. There are some cheaper options in the Ma Market, and ethically I really don't know if there's much difference these days, but there is a greater risk of not getting what I paid for. I checked ebay and, like all common household goods, I don't see any used ones being sold at a second-hand appropriate price. What a pointless website that turned out to be, huh? ↩︎

Kiki URL Rewrites With Managed Hosting

Saturday April 26th, 2025

Tags: blog, kiki, meta, tech

Just a quick note about URL redirects with kiki: the user guide gives some steps for enabling URL rewriting (under the heading "SEO-Friendly Permalinks") for use with the "easy" style of permalinks. For example, instead of example.com/index.php?page=blog, it's much cleaner to simply have example.com/blog.) I figure most people using kiki would prefer this setup, if possible.

The steps in the documentation assume you're running your own apache server1 and have access to the configuration, but with a managed hosting provider (such as mine) the process is different. It took some figuring out, but here's what worked for me:

Create a file in your root folder called .htaccess. It should be a text file with only the following lines:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]

Here's what each line does:

RewriteEngine on enables the URL rewriting feature.

RewriteCond %{REQUEST_FILENAME} !-d says this rule only applies to anything that isn't an existing folder name.

RewriteCond %{REQUEST_FILENAME} !-f says this rule only applies to anything that isn't an existing file name.

RewriteRule ^(.*)$ index.php?page=$1 [L,QSA] is what does the rewriting. ^(.*)$ is what's know as a "wildcard expression".2 It ensures that the rule applies to whatever the visitor types after the .com/.3 the $1 is a reference tag. It refers to whatever appears in the first (in this case only) set of parentheses. So if a visitor types example.com/whatever, as long as "whatever" isn't an existing file or folder name, that it'll display as if the person instead visited example.com/index.php?page=whatever. Importantly, this doesn't forward the visitor, it actually changes the URL. That's the difference between a rewrite and a redirect; I confused the terminology in a previous draft, sorry about that.

[L,QSA] is part of the Apache rule. L means "last", i.e. "stop after you process this rule." QSA is a flag that allows the rule to work with queries, i.e. anything after the ? in the URL.4

Big thanks to RaVBaker for helping me piece this together, particularly his extended example. This stuff is tricky and most of the tutorials out there do not explain things well.

The solution may be different for you depending on your hosting provider, but hopefully this will point you in the right direction.

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. I unfortunately don't have any information about nginx. ↩︎

  2. To get even more into the weeds: the ^ means "the beginning of the line". The $ means "the end of the line". The . means "any letter, number or symbol". The * means "I'll keep looking for the previous thing until you tell me to stop". Putting the wildcard in parentheses like (.*) means you can refer to whatever is between them later in the expression with $1. Regular expressions are very powerful, but they can make your head spin a bit. ↩︎

  3. Or in my case of course, .zone/ ↩︎

  4. See RewriteRule Flags at Apache.org. ↩︎