My Blog

Steam Frame is complicated

This year Valve released a lot of new hardware. I bought all of it.

The new Steam Controller is excellent, especially for someone who’s spent a lot of time on the Steam Deck. It feels right at home, and has won me over from mouse and keyboard for many games I would have traditionally never used a controller for. The flexibility of the Steam Input API and mapping tools was always nice, but became especially powerful with Steam Deck, and all of that work translates directly to Steam Controller, with endless flexibility in mapping the trackpads, capacitive touch, gyro, and all the standard xinput-like controls. If you’re fine with inline analog sticks, this is a perfect controller.

Steam Machine launched shortly after the controller, and it’s a weird one. It’s a bit pricey, due to the whole… situation… in the technology hardware space lately, but it’s a fairly capable lil’ cube. It’s not going to compete directly with a PS5 Pro or an RTX 4090 or anything like that, but it’s a huge leap above Steam Deck in performance, and I’m happily running everything I’ve wanted to play on it.

SteamOS is still Arch with some quirks, but my Steam Machine, Shiho, is a solid complete PC running games from a bunch of different stores like EGS and itch, and I’m using a distrobox container to do local development work on it, working around the need to unlock the root filesystem and manually keep OS packages installed every time the base OS image updates.

One of my favorite games that I haven’t played in quite a while though is Beat Saber. I was a fairly early adopter of VR, owning an original Rift right after they added room-scale tracking, and original Quest, and most recently the Valve Index. All were great for their time, and I’ll probably never forget the first few minutes of seeing hand tracking work on the Rift, VR is still incredible to me. So when Steam Frame was rumored for a while, I was very intrigued.

I’ve also loved what Valve has done with Proton, making it effectively pointless to use Windows for literally anything anymore, and the Frame running an ARM processor was super interesting, since that was yet another translation layer that needed to be there now. The Steam Frame can run an x86 Windows game on Linux on an ARM CPU, at a playable framerate, just by clicking a play button? Insane.

The hardware is amazing. The headset is incredibly light, very comfortable, nice-fitting, and I’m shocked at how well it stays in place with just the single strap. It’s well-balanced, the controllers are fairly nice, and the tracking is fantastic.

The SoC seems quite capable when running native ARM apps, and the core SteamOS in VR experience is fairly solid. The controls are a little weird, with support for both navigating it with a pointer like a typical VR UI, and support for navigating with the analog sticks and d-pad like on Steam Deck or Big Picture mode. Toggling between the interaction modes is easy and instant, but takes some getting used to.

Desktop mode is… weird. It’s just a small windowed (maybe 720p?) KDE desktop running as an app within the SteamOS UI, no free-floating Qt windows in physical space or anything, though I’m sure that could be done at some point. The default controller bindings only allow left click with the trigger, and scrolling with the analog stick - no right-click, no ctrl key, nothing fancy. Luckily, the Steam Controller pairs easily over Bluetooth to the Frame, and it has the full Steam Deck’s desktop mode integration out of the box, so you get ctrl/alt on the shoulder buttons, right-click on left trigger, arrow keys on d-pad, etc. It’s a little weird though - the on-screen keyboard is part of SteamOS in the VR space, so can only be triggered outside of desktop mode, most easily with the Frame VR controllers, so you need to switch in and out of the desktop mode’s focus state to type anything. None of this is that big of a deal, I mean you’re using KDE in VR, what do you expect lol.

Games though. That’s what you’re supposed to use a Steam Frame for, right? Oh boy.

As of right now, the Frame has only been out a few days, and they’ve already pushed some major updates to SteamOS, so I’m sure a lot of things will improve, but it’s not great right now.

Beat Saber is “Frame Verified”. Great. What does that mean? Apparently it means 72 Hz at 720p, with lots of stutters. Turning down MSAA and manually overriding it to 90 Hz is doable, and shocking that it’s not the default, but this is so far the best experience I’ve had on the Frame, and it was rough. Okay, most of the reviews say the Frame is only fine for running games on-device, but really works best streamed from a PC. Great, it probably shouldn’t be $1059 then, but hey the Index was about that much and it didn’t even have a computer in it, so sure.

So we plug the wireless adapter the Frame includes into the Steam Machine. Steam pops up a “hey install SteamVR?” so I say yes, obviously. So SteamVR installs. “No headset detected”. Okay… weird. I try going to Steam Link settings in the Frame and manually pairing with the Steam Machine. That “works” in that now I’m controlling one of my Steam Machine’s monitors from inside VR, coincidentally the monitor that doesn’t have the SteamVR overlay on it, but okay maybe I need to reboot.

Nothing. I’m sure there’s some user error here but wow is it incredibly unintuitive to just… play a game?

The next day, we get major software updates to both the Frame and the Machine. Now it finds my Frame! However. Beat Saber runs at a nice frame rate internally on the Steam Machine, but the stutters over the wireless adapter ~3 ft away are immediately noticeable. I reboot everything again, re-connect everything, re-pair everything in software, no changes. Unplayable, especially for a rhythm game, but with how stuttery the whole view is, I’d almost call this an epilepsy risk just standing still in the menu.

So I guess we’re back to playing native games for now? They’re not performant, but at least they’re playable. So far this experience is reminding me a lot of the early days of Steam Deck, and that device’s quirks are basically all worked out at this point, so I’m fairly confident that Steam Frame will be an excellent experience in the long-term, but as it is now, I honestly wouldn’t recommend it to anyone.

I hate what Meta has done to Oculus, but the Quest 3 is a much better option until Valve gets their software sorted out. Hopefully that’s soon. I miss my Index :(


To be clear: I’m not saying you should buy a Quest 3. I’m not saying you shouldn’t buy a Frame. I’m not saying I regret buying mine. I wanted a weird beta product because I like those things, but I also like when things work reliably. It’s complicated :)

Steam Deck Silliness

Following up on my first Steam Deck post, I’ve tried some far less practical things with it now too.

Development 💻

For basic desktop app use, the Discover store will let you easily install a lot of apps, including things like VS Code, Qt Creator, Builder, and Godot. Depending on what you want to do, this might be all you need.

If you’re the type of person that’s actually reading a blog like this, you should be using the Beta branch of SteamOS. Then, make sure you know the basics of Arch Linux before you break everything 🙃

On the beta branch, the pacman repos include basically everything you’d expect in upstream Arch. For me, I’ve found a number of basic packages/steps incredibly useful:

# Allow modifying root filesystem and set up pacman:
sudo steamos-readonly disable
sudo pacman-key --init
sudo pacman-key --populate

# Install the most useful development packages:
sudo pacman -S --needed \
  base-devel git git-lfs cmake glibc go go-tools android-tools android-udev
pip3 install --user -U \
  build twine pip setuptools wheel \
  autopep8 flake8

# Enable printer/scanner support:
sudo pacman -S --needed cups print-manager skanlite sane-airscan
sudo systemctl enable --now cups.service

# Media stuff if you want to do video/audio/image-y things:
sudo pacman -S --needed \
  qt5-imageformats libwebp libheif libavif libpng12 \
  imagemagick graphicsmagick pngquant pngcrush \
  ffmpeg livba-utils handbrake-cli
pip3 install --user -U \
  Pillow piexif yt-dlp

ML 💡

Shared VRAM/system RAM makes using GPU compute impractical, but running ML models on CPU with system RAM generally works okay, if a bit slow. Definitely not what the Deck was intended for, but I’ve been surprised at how usable it actually is for running existing models. Definitely wouldn’t use the Deck for training or ML development, but as a target platform it kinda works.

  • Llama 3, Deepseek R1 distills, etc. with CPU is quite usable, for any model that fits in RAM. Llama 3.2 in particular is fast enough to be useful on the Deck.
  • PyTorch works semi-okay with CPU compute, I’ve used Stable Diffusion image generation with < 1MP resolutions on non-SDXL models without issues. The SD Web UI project mostly works fine out of the box, requiring minimal adjustment as long as you keep the models really small.

Dual-boot 🖥️

While the SteamOS bootloader doesn’t currently support booting multiple operating systems from the internal SSD, the Deck is very usable when booting other OSs from microSD or USB. Using a microSD install of Windows works quite well, and lets you easily and cleanly isolate the Windows and SteamOS stuff. Just remember to install the drivers for the microSD reader or you’ll have issues 😛

USB boot for basically any OS works great, especially with a dock/hub. The one thing I still want to try at some point is getting macOS running on it. I feel it’ll be a bit of a stretch to make it at all usable, especially without a dock and external peripherals, but I want to see how far it can go.

Pokémon Pokopia

I like Pokémon. I like Minecraft. I like Animal Crossing. I like Dragon Quest Builders.

I love Pokopia.

The characters are wonderful, with both the generic Pokémon and the main characters like Professor Tangrowth and Chef Dente being well written and fun. The dynamic interactions between them feels real and fun, and makes the world feel “alive” despite being a wasteland where humans have long since disappeared. I love the dialog, the game mechanics, the sense of discovery as you explore the world… it’s all great.

Clefairy says: “Looking at the moon makes me hungry for some reason. You know what I mean?”

Rebuilding the world is fun, with interesting new takes on traditional Pokémon tropes and mechanics. My ditto, Nadeshiko, has been super fun to customize and play with. Currently they wear a plaid shirt and a silly hat. I love how drippy/floppy the dittos look.

My humanoid ditto standing alone in an empty Pokémon Center

Cloud islands are really neat. You can create a dedicated online island that you can share the code for, so anyone can view/play there. It works much better than Animal Crossing New Horizon’s original multiplayer, since it doesn’t require any specific user to be online or “host” the island, and every player can contribute fully to it. It’s effectively a complete online private multiplayer server. Super cool!

Let’s watch something on Ditto TV, while sitting on a big Pikachu chair!

If you have a Switch 2, you should get Pokopia. If you don’t have a Switch 2, Pokopia is a good enough reason to get one.

Niche Phones

I tried two very different phones recently. Those who know me or follow this blog for some reason know that I’ve often gone through too many phones.

Nokia 2780

The Nokia 2780 is a KaiOS 3-based flip phone that tries to offer just enough ‘smart’ functionality without being a smartphone.

KaiOS 3 is fine as a user OS. It has everything you actually need, and very little that you don’t. It’s full of minor bugs, but you get used to them and they’re not typically too problematic. I did have issues with SMS delivery occasionally, sometimes having to wait days for new messages to show up.

The modern T9 typing is excellent, and I found that I quickly reached a usable typing speed. The predictive text and customizable dictionary are great, and I honestly kind of miss it now that I’m on a touch keyboard agian.

Since KaiOS 2 sold better, and they’re not cross-compatible, most of the community-made apps don’t work on the 2780, and you’re limited to a handful of essentials, while missing some others. For example, there’s a usable PDF reader app, but not an ePUB reader.

KaiOS 3 as a developer platform is terrible. The docs are very incomplete, the SDK relies on specific very old Ubuntu and Firefox releases, and it feels abandoned. If you want to build apps, you’re on your own.

The stereotype of Nokia’s amazing build quality is no longer a thing. Nokia is just a brand name at this point, with HMD Global buying back the name from Microsoft a decade ago. Light plastic, cheap feel, the hinge squeaks and the plastic creaks as you use it, especially noticeable while on an actual phone call. The buttons started missing presses within weeks, and had constant double presses in a few months.

Still, I really like this phone. The battery easily lasts a week. Physical buttons are great. As a “phone that is just a phone,” it works well enough. I used it as my primary phone for about two years and it was solid.

Bigme Hibreak Pro

The Bigme Hibreak Pro is an Android-based e-ink phone, with a color or black-and-white option. I got the black-and-white version in white plastic and I kinda love it. It’s the first decent e-ink phone I’ve found that actually works properly in North America, 4G/5G support is solid.

The default OOBE is bad unless you just want to read books and send text messages. Android Auto is semi-broken out of the box, and needs manual fixing due to how the OS is set up to handle variable per-app DPI and text rendering. This is a useful feature for on-device apps as most apps do not end up being very readable on the black-and-white e-ink display without heavy adjustments to their rendering. The Android Auto and Google Maps apps need manual corrections to work on the in-car display, but that leaves them mostly unusable on the actual phone since it’s an app-wide setting that overrides the normal Android system display handling. Not great but you can make it work.

MediaTek’s duraspeed aggressively kills background apps, you basically have to disable it if you want to do something as simple as have music playing while also writing a text message.

adb shell
$ settings put global setting.duraspeed.enabled 0

Once fixed, it’s genuinely nice. E-ink reduces visual noise a lot. Battery life is excellent. Feels like what e-ink phones could have been whenever I’d thought of them in the past.

Still niche, still rough, but finally not a novelty. I’d honestly recommend it to anyone. You won’t be scrolling on TikTok on it, but that’s a good thing. This will be my primary phone going forward and I’m very happy with it!

Astro 💫

Back in 2020, I migrated this blog from Jekyll to Gatsby. Gatsby was much more flexible and feature-rich than Jekyll, but I always had concerns about the long-term maintainability of it, as it had a lot of seemingly-unnecessary complexity. Gatsby worked by transforming content sources (in my case a collection of Markdown files) into a GraphQL API, then providing a React app framework to generate pages from the GraphQL data.

Since then, Gatsby has effectively been abandoned, and many more competitors have arrived. I decided to try Astro, and the migration from Gatsby to Astro was incredibly easy. My build times are dramatically improved, and Astro is much easier to work with. I’m loving the simplicity, and the JSX-like syntax made porting my React components over effortless. Apart from some changes to browser preloading, and removal of the (already broken) Algolia search component, the end result is nearly identical to what I had with Gatsby but with far less complexity. I feel like Astro has struck the perfect balance between features and complexity, with the ability to easily extend it for more advanced use cases.

I’ll probably end up moving platforms again in a few years. It seems like that’s just what I do with this site.