• M4B files, audiobooks, Android

    I have an unlicensed audiobook file that fell off the back of a truck. It’s an M4B file. How to play it on Android?

    Long answer short, probably any audio player will manage to play it. Musicolet, Voice Audiobook Player, and VLC can all play it fine on Android. It’s basically just an M4A file, or MP4 file. If a player doesn’t recognize it, try renaming it from .m4b to .m4a or .mp4. I’ll probably use Voice to play it: that’s a dedicated audiobook player and does a nice job playing at 1.4x speed.

    On Linux, file identifies it as “ISO Media, MP4 Base Media v1 [ISO 14496-12:2003]”. fprobe identifies it as “mov,mp4,m4a,3gp,3g2,mj2” and/or “isomiso2mp41”. Inside is an AAC audio stream at 44.1kHz, 64 kb/s stereo, nearly 14 hours of book audio. There’s also a bunch of chapter markers, one per book chapter, which index into the audio.

    The file also has a stream of text of some sort: VLC identifies it as a tx3g subtitle file. I couldn’t find any tool to extract the data, I’m not even sure how big it is or what it contains. There’s also a third stream which is a 500×500 mjpeg, I’m imagining it’s the cover image for the audiobook.

  • Vibe coding a Mastodon thread unroller

    Just had my first experience using an AI (Claude Code) to write a whole program start to finish. See the result here.

    The AI coding was amazing. With about 60 minutes of “work” and $5.50 I had my result. (I then spent another 30 minutes and $3 tinkering without much improvement.) It would have taken me 4+ tedious hours to do this myself and while my resulting code would probably be better, the AI code was more than adequate for my one-off needs.

    A key part of this project’s success is how simple it was. It was a Python program to download some data from a Mastodon server and format it as HTML. I could just look at the HTML output and decide if it was working. I didn’t even bother reading the Python code the AI generated. If I cared more about what the system itself was doing, how the Python script worked, it would still have been useful but taken a lot more work on my part to review everything.

    I’ve been using LLMs for awhile now in chat interfaces and am impressed with them, but they are clearly just stochastic parrots, text prediction machines. Claude Code felt different. It’s still mostly an LLM but it has enough of a reasoning engine in it that I could give it high level instructions and it’d figure things out on its own. That’s really impressive to me.

    I don’t think AIs are going to replace human programmers entirely anytime soon. Part of why this project went so well is I have some expertise in this kind of thing, so I knew how to tell it to (say) cache all the data from Mastodon once up front and then generate HTML locally. Or to rewrite images to make them smaller. That’s hard-won knowledge from years of building systems. But the actual scutwork of looking up Mastodon APIs and remembering how to resize images in Python? Claude did that just fine.

    Anyway I’m sold on vibe coding, at least for a certain kind of workaday code where you can easily inspect the output and decide it’s good enough. And you don’t care how good the code is. I’m certain there’s still plenty of need for human expertise for more important or complicated systems but this AI experience was very impressive.

    The application

    I took a trip to SE Asia recently and used Mastodon to share a bunch of postcards as a Mastodon thread. Now that I’m home I wanted a nice static copy of all that easy to view and share forever. There’s a bunch of Mastodon thread unrollers but I didn’t like the output of any of them.

    Here’s the HTML output Claude and I produced. I’m pretty happy with it!

    That’s the final output, the customer deliverable. It looks good! Even better the HTML it generated is quality. Reasonable semantic HTML, simple structure, nothing too stupid in it. That’s better than any other automated tool I’ve ever used.

    There’s also the intermediate product, the Python and shell scripts it generated. Those are also pretty good. I didn’t really read them, I’m running on vibes here, but on a quick glance it looks like reasonably OK Python code that I could understand and maintain. I would not trust Claude to do more complicated things but for this straightforward task it is good.

    Claude Code even thoughtfully generates and updates a README explaining what it does. You can also get it to export a conversation of your chat log, which in some sense is the “real” programming I did.

    Getting the AI to write the application

    I never wrote or edited any code. I did all of this within the Claude Code shell. It wrote the code. I mostly didn’t run any code either, the agent does that for you.

    High level development was in two pieces: write a Mastodon downloader to a local database, then write an HTML formatter from that local data. Then a lot of iteration, particularly on the HTML portion. I’d tell it things like “change the layout so images are only one column” or “change this text to a different font and color”.

    Here’s the important choices I made:

    1. I broke the project into two parts: download the Mastodon data from the API to local disk, then generate HTML on local disk. That’s an important pattern for projects like this, it lets you iterate on the HTML presentation much faster without spamming the API.
    2. I told Claude to write simple static HTML. These tools have an alarming habit of bringing in React and other Javascript garbage.
    3. I tried out a couple of strategies to make the pages smaller, finally settling on using downsampled JPGs. I’m not sure if Claude would have thought to suggest that, I wish I’d asked!
    4. About a quarter of the way into the project I thought to ask Claude to use git. It happily did so, checking in code as appropriate.

    I’ve got the conversation stored away (well most of it, it got “compacted”). Here’s some key prompts I gave it:

    I want to write a Python script that downloads a bunch of posts from my Mastodon account. I want it to download a single thread: my original post and all of my replies, about 100 of them. Every post contains photos or videos that should also be downloaded. I want you to keep the original JSON data from the Mastodon API and also extract everything into a simple sqlite database with columns for post timestamp, post text, and references somehow to the images in the post. the images are important!

    you’ve made two errors already converting datatypes. did you make any others? think hard about the code you wrote and try to fix anything else before I run it again

    now I want you to make a nice HTML view of all the posts and pictures from the mastodon thread that I downloaded. I want the output HTML to be a simple static HTML file without any javascript dependencies, no frameworks, definitely no react. it should have minimal CSS styling but something that looks nice and modern. The images are most important, I want to be sure they look good. the images have alt tags on them in the mastodon posts, those shoudl be displayed as captions. And I want you to generate all this HTML from the downloaded files, do not make any requests on the Internet like to the Mastodon API. can you do that? tell me how you will proceed before doing it so I can review.

    I ran it. It only downloaded two posts: the original and one reply. but not the others. the third post is a reply to the reply, did you remember to recurse and load the thread?

    can you write code to generate smaller images to save bandwidth? ie, resize the original JPGs to new JPGs which aren’t bigger than 800 pixels. I also want it so if the user clicks on one of the JPGs in the HTML view, it links to the full size image. it can just link directly to the JPG, don’t need an HTML page for each full size image. write code to generate the smaller files, alter the HTML generator to use those files, and alter the deploy script to deploy both the smaller JPGs and the originals to my server.

    Some observations

    Some interesting things Claude did:

    1. It made a couple of errors converting types from JSON output (numbers to strings, datetimes). I fixed those one at a time and got annoyed so I scolded it and told it to look at its own code and fix any other errors. It made some more changes I didn’t review, and the resulting code worked first time.
    2. I asked it to download a font from Google Fonts and use it locally. It tried to download it with curl and was blocked (a security policy in the Claude agent?) So then it just wrote a Python script to download the fonts instead and ran it. It’s hacking its own sandbox!
    3. Its first attempt to download fonts failed, wrong URLs. It detected the errors and did something itself to find the correct URLs and ran the download a second time. That also had one error for one font variant and it realized it didn’t need it so just ignored that error.
    4. It got confused with HTML templates and Javascript, some sort of problem with { quoting. It sort of hacked its way into fixing it just like a junior programmer would. It got there in the end!
    5. It did OK with an open ended “can you think of anything to improve”. It suggested adding some good generic HTML things like ARIA tags, print CSS, lightbox view, social media sharing. It also suggested adding map integration or location tags to the posts, a very thoughtful suggestion for my travel app!

    I don’t love the Claude Code UI. It’s some terminal UI thing and very chat-oriented. I think the VS.Code integrated tools like Cursor are probably better for more careful coding. OTOH this worked well for my one-off task. I like how Claude Code has a very agent-centric design, it’s actively doing things on your behalf. It’s much more like giving instructions to a junior programmer rather than having someone pair programming with you making suggestions.

  • Nest Thermostat Gen 2 charging without a C wire

    Long story short: if you have an old Nest installed without a C wire, it may not charge when the heat is on.

    My Nest Gen 2 from 2014 went offline yesterday with a low battery warning. So I had to learn about Nest battery charging. Some details…

    I have a 20+ year old furnace (heat only) and old wiring. Here’s a reference on thermostat wiring. As shown above I only have three wires: R, W, and G. R is the power, it’s always at 24V. W is the heater control: connect it to R and the heater turns on. (Phind taught me how to hotwire my furnace!). G is the fan control, I think for turning the fan on without heat.

    What’s missing there is the C wire. C is a common neutral, and if I had one I could charge the battery by drawing 100-200mA of current between R and C. Any modern house should have a C wire and any fancy thermostat really wants one.

    Nest Gen 2 works without a C wire. The way it works is charging off W and R. But here’s the problem, it can’t charge while the heat is turned on. I think this explains my Nest’s problem with low charge, it’s been cold and the heater has been running a lot. (Even when it does charge, it only does so at 20mA, that’s very little power.) When the battery charge gets below 3.7V it will shut off the networking just to keep the thermostat running. That’s a nice feature, at least you still have heating!

    The temporary fix for a charging problem is to pull the Nest off the wall and plug in a charger to the Micro USB port. This is very easy, the Nest is designed to be removable with a nice socket.

    Not sure what the long term fix is. I called Nest Support and, to their credit, they had a detailed troubleshooting script even for my 10 year old product. We got as far as them asking me to turn off wifi (to rule out a networking power drain problem) and then charge the battery up to 3.9V via USB before calling them back. I haven’t done that.

    I guess I’m hoping this problem will only happen rarely on very cold days and that the power saving mode is enough to keep the heat on for me. I don’t think this problem has happened before, at least not often. I’m planning on upgrading to a heat pump with cooling in the next year or two. At that point I’ll get new modern wiring and a new thermostat.

    Battery voltages

    My real question is whether after 10 years it would be expected that the Next Gen 2 battery might be worn out and no longer hold a charge. The Gen 2 has a sealed-in lithium battery. Online advice is 50/50 on whether it should last this long. Sadly the support team didn’t answer my direct question about longevity.

    You can see the battery voltage in Settings / Technical Info / Power. I’ve seen the battery as low as 3.65V and still operating (but offline). The highest I’ve seen is 3.88V. I thought the support guy gave me a target voltage of 3.9V but now I wonder if that’s even possible. Google’s docs only say that over 3.7V is what you want. This community answer gives a normal range of 3.7-3.9V.

    One “fun fact”: if WiFi is marginal, the radio will draw more power to stay connected. I wonder if that’s why support told me to turn off networking for testing.

    Nest is a bad product

    Google Nest makes bad products. Don’t buy Nest products. If you need a thermostat, buy an Ecobee or Sensi instead. I’ve had a lot of trouble with this Nest thermostat over the years. Like the time they shipped a firmware that broke battery charging and bricked all the thermostats until you took them off the wall and plugged them in to USB. Or all the times the servers are down. Or until I figured out how to turn off all the fancy learning features that don’t work very well and just use it as a $40 programmable thermostat.

    To be fair, the Nest thermostat has mostly worked for 10 years. And the hardware is very nice. The real problem here is a thermostat should be a really simple and reliable device. It’s just a switch! It should be expected to last for 20+ years. I appreciate that Nest reinvented the product category, most HVAC thermostats are awful. They had real software and UI! But it just has never been quite as good as I hoped.

    My particular problem at my house is the lack of a proper power supply. That’s not Nest’s fault. It’s impressive the device works at all without a C wire, most newer thermostats don’t. They also have an adapter kit you can add to work around the lack of a C wire.

  • VPN services for Windows in 2025

    With the recent anti-porn laws I know a few gentlemen in Texas and Florida with a newfound desire to use a VPN service. I don’t really use a VPN but would like to be of help, here’s what I learned. I’m keeping an eye towards simplicity for non-tech-savvy folks. This post is uncompensated, I am not selling VPNs or profiting in any way from what I’m writing here.

    tl;dr: try Proton VPN for free.

    Wirecutter recommends Proton VPN or Tunnelbear for free VPN and Mullvad, TunnelBear, or Proton VPN for commercial VPN. The other common VPN service I see recommended is NordVPN. I’d also consider Mozilla VPN, they are reselling Mullvad.

    Avoid any other VPN service. Many of them are sleazy or scammy. A VPN gets to see all your Internet traffic and can profit from or subvert you in various awful ways. You must trust them.

    If you use a VPN regularly you should expect to pay about $60/year for the service.

    Of the reliable services, the main difference is their charging model and free service (if any). Proton VPN has a genuinely free tier you can try first with no payment details. NordVPN has a 30 day trial but you have to give payment details up front (and ask for a refund if you cancel.) Mullvad has no free trial but you only have to pay 5€ for one month to try it. TunnelBear has a 7 day free trial, not sure if it requires payment details to try.

    Proton VPN, what’s the gotcha?

    I was surprised Wirecutter recommended Proton VPN as an unlimited free service, I didn’t think any free VPN would be worth trying.

    I set up Proton VPN on Windows and it seems to genuinely work. The installer has a bit of up-sell, installs of other Proton products. But you can opt-out. Also Proton’s a reputable company, the products they’re offering are reasonable.

    The VPN is fast. I tested from my gigabit Sonic fiber and Cloudflare’s test got me up to 800Mbps / 600Mbps with zero packet loss and 31ms latency. Compare 900/800 and 5ms without the VPN. Honestly this result is very good, way better than I expected for a free service.

    So what’s the catch? Wirecutter notes you can’t choose which country your egress is in. I was limited to US only. Fine for me but if your goal is to look like you’re in some other country to watch foreign TV, you’ll need to pay. I have to think there’s some other hidden limitations with the free service, I’d assume if I’m making heavy use of Proton VPN I’d end up paying for it.

    Proton VPN seems to work via UDP Wireguard by default but has other protocol options. My connection ended up in Seattle at Datacamp (AS212238), with IP address 149.40.62.22. There’s some nice advanced features for split tunneling, DNS management, port forwarding, etc. All paid features.

    Overall I’m impressed with Proton’s free service. Maybe there really is no major gotcha, it’s just an honest loss leader.

  • Sunpower solar for 2024

    I’ve had my house solar system in Grass Valley for three full years now. It’s working great, just as designed. Some quick data:

    YearProduced (kWh)Used
    20241559416543
    20231537314688
    202217700?16000?

    2023 and 2024 data are from the MySunPower app. I don’t have full data for 2022 so the numbers are estimates from PG&E’s usage data. I suspect PG&E’s numbers are just larger than what MySunPower measures and have no way of knowing which is accurate. I should go back in a month when PG&E’s accounting has settled and try to collect the data from them.

    Anyway, comparing 2023 and 2024 I generated about the same power both years. But I used 1855kWh more. 1336 of that is charging my car.

    The car is new for 2024. I charged it another 679kWh in San Francisco, so a total of 2100kWh for the year. I was guessing it’d be about 3000kWh so that’s better than I expected.

    Update: NEM true-up

    Just got the surprise $700 electric bill, the true-up for the year. The bill is very difficult to read and I can’t make sense of it, but it’s roughly correct(ish) so I’ll go with it.

    The actual charge for “NEM Electric charges” is $630.95 for 579.3 kWh. That doesn’t really square with the $695.26 for 121 kWh in the monthly breakdown.

    SunPower bankruptcy

    2024 is the year SunPower went bankrupt. A lot of operations seem to be continuing. But the mySunPower web application is broken now. Near as I can tell the SSL certificates expired, plus maybe some servers are down. No word on if it will be back. The mobile app is still up though, here are some screenshots from it.

  • Adobe malware with Chrome cooperation

    The fuck is this?

    Adobe somehow managed to install itself as an extension in my web browser giving itself permission to read and change all your data on all websites. Without my consent or cooperation. And Chrome just allowed it.

    Fortunately some other part of Chrome was like “hold up, that’s not right” and warned me about it. But only after it was installed. Again, the fuck is this?

    Meanwhile, the essential security and ad blocking software I rely on is being crippled by Chrome, ostensibly for security reasons. They allow Adobe to do this bullshit and don’t allow me to let uBlock Origin do the same thing even when I explicitly install it.

    This is where I remind you that Adobe software, in particular Acrobat, has been responsible for more security intrusions in web browsers than pretty much any piece of software out there.

    The current Adobe Acrobat on Windows is just awful btw. They invented some new UI toolkit that doesn’t look like any other Windows app. It also doesn’t work, the process of trying to save a file to a directory is particularly awful.

    Why is this possible?

    Update: a friend who used to work on Chrome commented that this is a long-standing challenge with Chrome. The Windows browser allows other apps to install extensions by dropping a folder or file in the right place. That makes sense, there’s lots of scenarios where that’d be a good idea. So Chrome may be doing the right thing here. My only quibble is the UI could be clearer, maybe “Adobe attempted to install this extension, would you like to allow it?” The way it is written now looks like it was fully installed even though as a disabled extension, it wasn’t really.

    Adobe though, they can fuck right off. Acrobat is so aggressive about subverting your Windows machine. It’s gotten worse in Windows 11 now that Microsoft has made file associations so difficult. The legitimate freeware I want doesn’t really install itself as a file handler correctly but Adobe of course is paying a whole team of geniuses finding new ways to worm its way into your operating system.

  • Google Timeline shutdown, data preservation

    Google Timeline is one of my favorite lesser-known products, a detailed place by place diary of everywhere I’ve been with my phone for the last eight years. Unfortunately they are shutting down the web product and replacing it with a mobile-only product. The deadline is December 8, in five days. I’ve been putting off figuring it out until now. These docs were helpful as was this article and this one.

    Update: after some evaluation, the new mobile product is fairly nice. It’s a comprehensive thing inside Maps, it’s not an afterthought. It does have reasonable data export. When I first wrote this post I was cranky at the change and my view has softened some since.

    Migrating to new Timeline mobile

    The first thing I did was use Google Takeout to download all my old timeline data from the web application. A timeline-only archive was fast, just a few minutes, and a 50MB download. It contains a lot of data but what I wanted most was the single JSON file with my GPS history in it. (The rest of it are the semantically analyzed files: very useful but not as cool).

    The other thing I did was to migrate to Google Timeline on my phone. That’s the only option now, and it’s not as good as the old web application. But it’s what they have.

    The migration was relatively simple. Once I disabled my Private DNS ad blocker, that is, with it enabled the app would not get past one stage of the signup process. No error, just a refresh.

    To set up mobile Timeline you have to launch Google Maps on your primary phone, find your way to the Timeline part of the app, and run through a setup wizard. It asks some questions about your preferences. Then it says it will download all your data and it’s done. (This is the part that Private DNS was breaking.) Afterwards it gives a summary of the options you picked, here’s mine:

    I’m unclear on whether it really copied all my data over. It said it’d only download a couple MB, not the 50MB+ compressed the takeout had in it. I do see old trips of mine over the years so some data copied over. My guess is it only kept the semantic tracks, not the detailed point by point logs.

    The new Timeline mobile product looks pretty nice in general. It’s got an easily browsable list of old trips, just like the webapp had. Too bad it’s confined to my tiny phone.

    Once I finished the migration the web application no longer works for me.

    Exporting data

    I cannot find any data export option in the new mobile Timeline product. I’ve asked a question on the help forums. I fear Google may have removed this feature. If so, I am very unhappy about that.

    To export your mobile Timeline data, in Android Settings (not Maps) go to Settings > Location > Location Services > Timeline > Export timeline data. This option was not available for me at first after setting up mobile Timeline, I had to reboot my phone and then it appeared.

    The export is a single file named Timeline.json. Mine is about 15MB (compare 800MB for the Google Takeout). The data does seem complete, it goes back 8+ years just like my old web Timeline data did. It’s a different format though. The meat of it is in a section called semanticSegments, see some examples here. It looks to be a hybrid of analyzed data with place IDs etc and then some raw GPS coordinates. I think it’s not as fine grained as the old web Timeline export but am not sure.

    There is also a backup system for timeline data that operates separately from the rest of Android backups. You have to enable it separately within the Maps app under Timeline. But I think those backups can only be used to restore a phone, there’s no way to get at the data in them.

    Thoughts on location tracking

    I love location tracking. I have a continuous record of where I’ve been for some 12 years. I built a whole location tracking product. It’s so powerful having an automatic diary and travelogue! And Google Timeline’s semantic analysis is great, they do an excellent job turning a random string of lat/lon pairs into a story like “you went to Venice, went to this museum, spent two hours at this restaurant”. I love being able to review my history like that.

    Google didn’t build this timeline product out of the kindness of their own heart. They did it to justify their advertising surveillance of users. Because as nice as it is for me to remember where I went shopping three years ago in Dublin, it’s way more valuable to Google to know that for many of their users. The bargain was they’d also make that data available to us, the users, as a form of transparency and quid pro quo. It felt reasonable to me.

    Now the bargain has enshittified. Google is still doing just as much surveillance as always, moreso now that ad networks have sprawled and grown. There’s probably 20 location vendors who know where I am most of the time thanks to trackers in Chrome, the Android ecosystem, and its various apps. It’s not great but we’ve been living this way a few years now with some abuses but also some advantages. But now Google has weakened one of the best of those advantages, the Timeline web application. Update: not entirely fair, the new mobile app does seem like a serious product.

  • MuOS on Anbernic

    I’m still tinkering with my Anbernic RG35XX, a remarkable cheap retro gaming handheld. This time around I’m looking at muOS, the most popular third party firmware. It’s a Linux distribution with emulators bundled up and a decent simple UI. It has pretty good hardware compatibility with the console, stuff like Bluetooth is said to work.

    The installer takes a long time but when it finishes you’re left with a tidy system. Here’s what’s on the SD card after install

    Number  Start (sector)    End (sector)  Size       Code  Name
       1           73728           90111   8.0 MiB     EF00  spare
       2           90112          155647   32.0 MiB    EF00  boot-resource
       3          155648          188415   16.0 MiB    EF00  env
       4          188416          319487   64.0 MiB    EF00  boot
       5          319488         8708095   4.0 GiB     EF00  rootfs
       6         8708096       124735484   55.3 GiB    0700  roms

    More or less like the Anbernic stock OS with a bewildering array of tiny partitions related to system booting. Sensibly they put the roms on the last partition where it can be resized easily. One nice thing about muOS: when you install it, it resizes that partition to use up the rest of your SD card. The popular tiny-best-set-go collection of ROMs is about 8GB, so you can fit a full capable retrogaming system with ROMs in a 16GB SDcard.

    Surprisingly that ROMS partition isn’t empty after installing the stock muOS distribution. But I don’t think it has any copyrighted games in it. It’s got 3.7GB of stuff in it though. Not sure what all is there, it looks like stuff RetroARCH needs like emulation libraries, music files, shaders, some cheats.

    The root filesystem is 1.3GB. The core system seems to be based on busybox. I don’t see any evidence of apk though, so maybe not Alpine. Something custom? No systemd either, no surprise. /opt has openssh, java (?!), and a big directory for openssh with bloated things like tailscaled, syncthing, and rclone in it. Useful software but not quite in keeping with the tiny core. Odd hybrid, I wonder if it’s documented.

    It seems to work to unpack the Tiny Best Set into the ROMS directory on muOS and have a bunch of playable games. No need to use the second SD slot.

  • Google Pixel vs. screen casting

    Roku has a nice feature where you can easily mirror video from your Android or Apple phone or tablet right to your TV. Super easy from my Samsung tablet: just launch “Smart View”, select the Roku on your LAN, and off it goes. There’s some nice extra UI for mirroring vs second screen, etc.

    None of this works on my Pixel phone. I launch “Cast” and it just sits there, not finding any devices, no feedback why.

    I was guessing it was some sort of networking gremlins until I asked an AI. Turns out this is just Google screwing over its customers on its flagship Android phone. Details here

    Rokus accept casting via Miracast and Apple Airplay. Google dropped Miracast from its Pixel phones in 2013 in order to push its own Chromecast protocol.

    Thanks Google! That anti-trust action can’t happen fast enough.

    I’ve never really read about Miracast before. It’s a widely adopted standard, basically “HDMI over Wi-Fi”. Seems to work great. Shame Google crippled their phones to not support it. I did find some Miracast apps on the Play Store but there’s a bunch of them, they all look dodgy, and they all want to charge me a surprising amount of money. So I’ll just stream from my Samsung tablet that works.

    I was already holding off upgrading to another Pixel phone, here’s another reason to switch over to Samsung. The Android on my tablet is quite nice.

  • Anbernic firmware options

    Still tinkering with this retrogaming handheld, an Anbernic RG35XX-H. Curious now about firmware options. Sources include here (out of date) and here and here and this AI answer.

    • Stock Anbernic firmware. Mostly running RetroArch, presumably does a good job with hardware drivers. My specific model is downloadable here. Latest seems to be dated 2024-10-18. I think the version that shipped with my device is 2024-01-12. (I updated and it seems nicer, more consistent UI.) One thing I’m clear about is whether there are 64 bit versions. The version that shipped is 32 bit.
    • MOD4, the stock firmware modified with things like an FTP server, NTP to set the clock, etc.
    • cbepx-me mods, another modified stock firmware.
    • Knulli, a fork of Batocera, an OS popular with the RPi crowd. The FAQ says it’s forked because of a license issue with closed source kernels. I couldn’t even find a Batocera download for the RG35XX. Koriki is another Batocera fork you see mentioned sometimes, made to be smaller / lighter.
    • muOS. Another full featured custom system, not sure what distinguishes it from the others. It looks like a pretty solid product though and folks on Reddit like it. Said to boot fast.
    • GarlicOS, so called to remind people of OnionOS, a firmware for a different retrogaming device. More info here. It’s.. medium sized, if I can say that? 250MB for the rootfs. Comes in 32 and 64 bit versions. The install instructions make it sound like you put it on top of the stock firmware, huh.
    • MinUI with an emphasis on being minimal. Quite small, 60MB for the whole thing (with extras) compared to 2GB for some others. Somewhat limited set of emulators for consoles. It installs on top of the Anbernic firmware.

    Broadly speaking the firmware is doing two things.

    1. Booting and device drivers and basic system stuff. Also enhancements like network support, customizability of the UI, etc.
    2. A series of emulators. RetroArch is king here but there’s others.

    I can imagine a lot of room for experimentation with usability, convenience features like networking, etc. Seems like a fun and vital area of hackery.

    Update: a little poll on Reddit has MuOS as the popular choice by far.