More from videah's blog
Plex has this Relay feature that basically pipes your traffic through their servers if direct access isn't possible for whatever reason, bypassing NAT and presumably cutting down on their support tickets. For free users the relay is capped at a measly 1 Mbps and the [ever-growing expense that is the Plex Pass subscription service only bumps this up to a whopping 2 Mbps. I can imagine this being useful for a selection of people. But as this feature is turned on by default, it's very easy for any issues with your server's network configuration to go unnoticed. It turns out my port-forwarding rule for Plex hadn't been working for several months (thanks Ubiquiti) and I never noticed because the relay feature was masking the problem. So... you're telling me Plex isn't meant to be almost unusably slow this whole time...? It doesn't help that the remote-access configuration UI has been very buggy for 6+ years, making it impossible to tell if the issue is with your server or the broken interface. So please don't make the same mistakes as me. Make sure your Plex client is actually connecting to your server directly, and use a Port Forward Checker.
Credits / Attribution Some of the art used around this blog are by other people. Here is a list of them: Smug Videah by Kelevtov Rantsona Sidebar Videah by ScruffKerfluff Callout Pixel Art Videah by lockedsdcard Videah Mutant Standard Emoji by Caius Nocturne
I bought an e-reader recently, specifically the Kobo Libra 2. I felt like I wasn't reading books/manga as much as I wanted and I think the convenience of being able to carry my entire library around with me will help with that. I own an iPad Pro but I wanted a device I didn't need to think about charging that often and wouldn't give me eye strain. This post is a bundle of notes about my current reading setup. I had owned a Kindle Paperwhite before but it was so locked down that I couldn't find any joy out of using it since I was forced to use it how Amazon product managers wanted me to. The Libra 2 I spent several hours doing research and I think the Libra 2 is the best device on the market at the moment, at least for my needs. I picked it up in white to try and make an important psychological distiction. I wanted it to differ from every other electronic rectangle I own and treat it more like a nice book rather than a computer that will inevitably make me angry. Which all things considered is quite funny with all the computer nonsense I ended up doing to it. It's got a 7-inch screen which is a little shy of the perfect Tankōbon volume size, but close enough that manga is comfortable to read. I remember reading somewhere that the screen has one of the best contrast ratios in an e-reader and it is indeed very good. Navigation buttons are a dying breed in the e-reader space but I really can't live without them. Using a touchscreen to navigate is hateful and is really fake skeumorphism. You can pretend all you want but it does not feel like you are flipping a page! Thankfully the Libra 2 has two buttons on the side where you hold it so you can go back and forth with just one hand. I got the very overpriced official SleepCover case in orange. Matches my iPad case. Stops the plastic from making flexing sounds. It can let your e-reader stand upright for some reason. Book Management The only real book management software in town for e-readers is Calibre but it's stuck in the late 2000's UNIX school of UI design and I reaaally don't want to deal with that kind of thing anymore. I want organising my books to feel comfy. I also don't want it to depend on having my laptop with me, constantly wiring it to my e-reader to sync new books. It's not perfect but Calibre-Web works better for me. Despite the confusing name it's a completely distinct project that just happens to be compatible with Calibre's database format. I have it hosted on my personal VPS so I can access it anywhere and can give friends access if I need to. It's not quite Plex for books but it is close. The bootstrap UI is a little dated but it works for what I need. I'm keeping my eye on a relatively new project called Librum that's in its infancy. If it matures it promises some nice features like syncing reading positions and its own dedicated client. Reader Software The default reader software the Libra 2 comes with is called Nickel and it's fine. It looks and runs ok enough and the built in Kobo Sync functionality can be tweaked to work with my Calibre-Web instance by replacing the endpoint in a config file, which I have to give Rakuten props for letting you do. But sideloaded files can be very broken. I was half way through a book before I realised Nickel was just throwing all of my notes and highlights into the void whenever I closed it, which was very rude. This is apparently a common problem that's been around for a while and it seems Rakuten have no plan to fix it anytime soon. I went looking around for some open source alternatives. Most people reach for KOReader. It runs on pretty much everything and is packed with an ungodly amount of features and has a steady community built around it. But if I'm being honest I just can't find any enjoyment using it. The user interface just isn't up to snuff. It feels impossible to navigate and there is no real library view, only a file manager. When I'm holding my e-reader I don't want to be reminded that it is a computer all the time. It's meant to be a book! I came across Plato which is made exclusively for Kobo devices and worked on by the guy responsible for bspwm. It's really fast and responsive, more so than Nickel even. The UI is pretty much exactly what I'm looking for. It's not nearly as feature complete as KOReader but it's written in Rust which is a language I feel confident enough in to tweak and implement things to my hearts desire. I've already made a small change that got merged upstream too! Syncing Originally I was using Kobo Sync with the endpoint changed to point to my Calibre-Web instance to sync my books wirelessly. But it was buggy and slow and could only pull in KEPUB files. Plato has a built in hook system that lets you run arbitrary binaries when a directory is opened. Using this I wrote a small CLI tool that just pulls every book that hasn't been downloaded yet from my Calibre-Web instance using the OPDS protocol. I've stuck the code for this tool up on my Github if anyone else is interested in using it! In the future I would like to take advantage of this hook system to also sync reading positions and other metadata Plato stores. Tailscale VPN I love plugging as many of my devices into my Tailscale network as I can and I thought it'd be a fun little project to try and get it running on the Libra 2. Someone had already done most of the work by getting it to run on the Kobo Sage. It turns out it's a little harder for the Libra, I had to spend a ridiculous amount of time compiling some missing kernel modules in a horrendously slow emulated x86 emulator just to get this thing running. The joys of owning an ARM laptop. I think being able to type ping kobo and have it Just Work makes all the hours spent worthwhile though ☺️ I packaged all the work I done up nicely in an install script so it should be dead easy to get this working on your Libra 2 as well. Tailscale has a built in AirDrop-esque file transfer feature that I find really useful for quickly sending PDFs to my e-reader that I don't necessarily want to be a permanent part of my library. Unfortunately I couldn't get Tailscale SSH working which was one of the main reasons I attempted this in the first place 😢 I'm not sure why but my first guess would be that I need iptable packet filtering but that would require swapping out the whole kernel which I don't feel comfortable doing at the moment. Maybe some day though. SSH The Libra 2 only has telnet support out of the box behind a developer cheat code (typing devmodeon into the search bar) which is fine because I'd be using it over a Tailscale wireguard connection anyway. My threat model doesn't exactly involve people bruteforcing telnet over public WiFi just to steal my furry books. But for completions sake I stuck the Dropbear SSH server on mine and then disabled telnet. Storage The Libra 2 has 32gb of internal storage which is pretty huge for books considering how small EPUBs usually are. But I like reading manga which can be pretty hefty. An average volume is 200mb, with stuff like Uzumaki coming in at 800mb. What if I need to store every uncompressed volume of One Piece for offline reading in the event of the apocalypse? Most e-readers treat manga as secondary to books and rarely offer higher storage options or mini-SD card slots anymore. Thankfully the Libra 2 has a mini-SD slot... it's just an internal one not meant to be user accessable 🫠 Image taken by MobileRead user 'supermighty' This is better than not being able to upgrade the storage at all though and was actually one of the main things that pushed me in the Libra 2's direction when doing research. Someone on the MobileRead forums replaced the SD card and posted instructions on how to do so. I haven't done this for mine yet but I plan on giving it a shot and sticking something utterly ridiculous like 512gb or 1tb in there. It seems like a pretty risky/messy mod to do though, the slot and card are caked in waterproofing glue that you'll need to reapply afterwards if you're like me and enjoy reading in the bath. Even if this seems excessive it does let me sleep easier at night knowing I can replace the internal storage in the event it somehow fries itself. Dictionary This is a feature I didn't know I wanted till I used it. It's a pretty big leg-up over reading physical books when I can easily hold down on a word I'm not sure about. I'm using the ebook-reader-dict project which is based on Wiktionary since that's the one Plato recommends and is designed to work with. Unfortunately it's a bit hit or miss. I'm not too happy about the quality of the definitions sometimes, I'll probably look at alternatives at some point. Plato renders the definitions without any padding which looks a bit weird. I can probably fix this easily in the code later though. Feels good using open source software sometimes. Font For reading, I use the font Atkinson Hyperlegible which you might know from Cohost, but it's also used by the very blog you're looking at now! I've fallen in love with it as it's really easy to read even when the text is very small. Very pretty and accessible.
Since things are uh... collapsing? I thought it'd be a good idea to finally get my blog up and running. Come in, get comfy and take a look around! Cozy right? Getting Started (Again) Ok admittedly, this is my 4th attempt at making a blog. This time I'm using Zola which is like Hugo or Jekyll but more Rust-y and less JavaScript-y. I can't make any comparisons beyond that because I haven't used either, but my initial impressions of Zola are good! The theme you're looking at I made from scratch using Tailwind which is the only way I can do frontend web stuff now. I wanted to move away from what I had been using in the past (Ghost) and have my blog sit in a git repo in plain text instead. How I currently have things set up means when I push any changes to the blog's GitHub repo an action runner will automatically build my site (in about 17ms!), compile Caddy, embed the site into the binary using caddy-embed (in... a lot more than 17ms!), then finally push it as an image to DockerHub. My server will then see this new image, hot-swap it, and start serving my blog straight from memory! Little Gremlin I hope you like my little rantsona in the sidebar! He took the longest to get working out of everything if you can believe it. I can disable him on a per-article basis, you don't have to worry about him 🤔-ing the more serious posts. You can't see him unfortunately (try looking at this page on a larger screen) but I hope you like my little rantsona in the sidebar! He took the longest to get working out of everything if you can believe it. I can disable him on a per-article basis, you don't have to worry about him 🤔-ing the more serious posts.
More in technology
After living with Apple’s 27.0 OSs since launch, I have some more annoyances to get off my chest. This time, it’s all about how tabs and menus have gotten worse. I’ve already ranted about the Liquid Glass material in general, but these two design changes in particular have really been grinding my gears. I’ll reiterate that Apple’s latest OSs look substantially nicer to me than the previous set… but that only makes these setbacks more glaring. Also, many of these issues aren’t nearly as bad in light mode — but I use dark mode exclusively on all platforms. Apple offers this appearance setting, so I think it’s fair to criticize them when it’s not holding up. First up, let’s talk tab bars. I think these looked awful in the original Liquid Glass redesign, and in 27.0 they look even worse. Below is an example of three tab bars from Safari in macOS. All of them are in dark mode. The top example is from macOS 26 with the “clear” Liquid Glass setting, the middle is macOS 27 with the default (mid-slider) version of Liquid Glass, and the bottom is macOS 27 with Liquid Glass at its most tinted. In each, the middle tab is selected (though I think the word “tab” is being quite generous to these globs). In macOS 26, there was practically no difference between the clear and tinted versions of tabs. Similarly, the clearest and default/middle tabs in macOS 27 are effectively the same. Because of this, I’m leaving out the redundant examples. Even though I still think it’s ugly, I vastly prefer the macOS 26 version of these three options. It offers the most contrast, and it makes more sense in dark mode: the background is darker and the foreground of the active tab is lighter. The middle example is what tabs look like in the default (mid-slider) version of Liquid Glass in macOS 27. There’s now only a very faint outline around the active tab, and practically no difference in background colours. To me, this is unreasonably subtle. The effect is even worse when there are a lot of tabs open. Lastly, there’s macOS 27 with the fully tinted Liquid Glass setting. It’s better, but it still looks less correct to me than the tab design from macOS 26. It’s difficult to put into words how much I loathe the look of this new tab bar design. I don’t mind the more “bubbly” look of Liquid Glass throughout the 27 OSs for the most part. It gives UI elements more dimension than in the 26 OSs. But it doesn’t work for tabs. Because the bubbly look is inside a trough, the active tab’s glass effect ends up looking like a blur on the top and bottom. This reduces contrast further and makes the active tab harder for me to pick out. Even in dark mode with full tint, I find the active tab less visually clear than in 26’s clear mode. Now, I’m sure there are at least a few people reading who don’t see what the fuss is about. If that’s you, I assure you that the difference is more stark when you’re not comparing things side by side. It’s not impossible for me to pick out the active tab, but I think it’s trickier than it needs to be! But, if you still don’t believe me, here’s a little experiment. Which of these do you think is most legible? The text/background colours in the above image are based on the foreground/background colours used in the tab bar instances above. First is clear in macOS 26, then the default from macOS 27, then fully tinted in macOS 27. I think they’re all pretty awful, but I prefer the macOS 26 clear version. Again, this is because I’m using dark mode. In dark mode, light text appears on a darker background. Similarly, active UI elements have a lighter background than their surrounding elements. I’m sure there are counter-examples, but this is how just about everything else works in Apple’s own apps! It should be noted that Safari uses the system default tab bar design. I also see this design in Apple’s Terminal app, in Pixelmator Pro, and elsewhere. I don’t use Xcode daily anymore, but you’ll also find them there — though in true Xcode fashion, they’re ever so slightly nonstandard and also don’t respect your tint setting. Below is a screenshot of Xcode using my current settings of dark mode with fully tinted Liquid Glass. Up next: menus. Below is an image showing four versions of the same menu in macOS. Top left is macOS 26 clear, top right is macOS 26 tinted, bottom left is macOS 27 default (mid-slider), and bottom right is macOS 27 fully tinted. It’s a similar story here. In macOS 26’s dark mode, I had no problem with system menus even when Liquid Glass was set to clear. In macOS 27, even in the fully tinted mode, the menus have much lower contrast. They also now lose all of Liquid Glass’s refractive effects when at their most tinted. I think this is less of an issue than the tab design changes, but it’s still a downgrade. Again, I’m certain many people don’t care about this. Some might wonder why I’m not turning on accessibility settings to help with these things, if they bother me so much. I’ve flirted with this (especially the “Increase Contrast” setting), but those settings have many knock-on effects. 1 But honestly, I don’t think accessibility settings should be required to have a reasonable amount of contrast in a design system. Maybe Apple disagrees, but I really hope more dark mode tweaks are coming. The “Increase Contrast” setting is under System Settings -> Accessibility -> Display -> Increase Contrast. Interestingly, you can use this setting along with the clearest version of Liquid Glass to almost get back to how things looked in macOS 26’s version of tinted. However, it adds contrast-y lines around many UI elements that I find extremely distracting. It also alters colours on some elements to, strangely, make them less contrast-y. It feels unevenly applied and poorly implemented in several apps. ↩
Trump wants to add a citizenship question and ban questions on race
I recently watched the talk by Scott Jenson titled "Are we really going to use the same Desktop UX forever?" https://www.youtube.com/watch?v=V7AfAcQwLW0&t=445s. He's a great presenter, really articulate and concise. The kind of speaker that you'd
My mail, WhatsApp and Signal now live in one app I built myself. I called it Contact. It is not a chat app and not an AI app, it sits somewhere in between. When I tried to draw what it is in my notebook, a factory came out. This post explains that drawing, starting with a puzzle. A puzzle for the class At Jurre's school the day starts with a "binnenkomer", a small opening activity, and every child takes a turn. The message that it was his turn next came in through the WhatsApp group of his class. So one evening Jurre sat down and made his own: nine dots, and a rule. "Je moet elk stipje in een eigen vakje hebben, maar je mag maar twee vierkanten tekenen." Every dot in its own box, but you may only draw two squares. Jurre's puzzle: the rule on top, nine dots, and one of the solutions He wanted copies, a clean one for everybody. I took a photo, which lands in my own photo library at home within seconds. In Contact I opened a session and typed what I wanted: take the latest photo, make a printable page with the text and the empty puzzle, without the solution, and print it. One page first. The agent did not know where the printer was. It scanned the network, found a Canon that was asleep, told me so, and waited until I switched it on. Along the way it found the original message from the class group in Contact's own WhatsApp archive, so it knew what the page was for. The session in Contact: the agent looks for the printer, I tell it what to make Printing, on a printer that nobody had set up for this The first page came out faded, one cartridge was nearly empty. The agent found a print mode that still gave deep black, and then the copies came out. Within the hour there was a stack on the table: the empty square, the nine dots, the rule in a proper font. The next morning Jurre took them to his class. The result: the puzzle without the solution, ready to hand out in class That small evening has everything in it. Someone has an idea. It comes in, somebody decides it matters, a machine with enough context and energy turns it into a thing, and the thing goes back to the people. That is the factory. The drawing The drawing from my notebook: people, ideas, triage, the machine with its chimney, and the long arrow back On the left: people. They have ideas, and those come in every shape: a mail, a WhatsApp, a voice message, a screenshot, a sketch on a sheet of paper. Then triage, the funnel. Not everything needs me, and not everything needs me now. Contact reads everything that comes in on the machine in the homelab: my own hardware, boring Debian, offline. It sorts what needs me from what can wait, and groups messages into conversations per person or per topic, whatever app they came from. Fewer apps, less fiddling, but more context and more control. Contact on the laptop, here with sample data: what needs me, drafts, and a conversation with a draft reply waiting Then the machine itself: creation plus context. A session is an agent working on one thing, started from a conversation with one tap. What makes it good is not the model, it is the context it gets. My notes and rules. Every log line of all my apps and computers, well over a million signals a day. The photo library. Customer files and documented source code. The conversation it came from. The machine knows where it stands before it starts. On top sits the chimney: energy, in tokens, compute and memory. This is the part that is new. Context used to be a pile of documents. With enough energy it becomes fluid, you can shape it. Ask it, rewrite it, turn it into a page, a prototype or a print. The chimney, measured: tokens per model I will be honest about the chimney. Some weeks we burn millions of tokens on a single feature, and I do not always know if it was worth it. Let the record show that I spare no cost or effort to chase software feel. But a factory with a chimney and no meter is something to keep an eye on. Out of the machine come artifacts: a draft reply, a preview page, a prototype, a printed puzzle, a website, a game. Nora wanted a game too. She drew a rainbow and told me about a unicorn on a skateboard collecting colours in a fluffy world of clouds, and that became the game. Same factory, different input. Nora's input for her game: a rainbow, clouds and colours to collect Nora playing the game that came out of her drawing Another product of the same factory: the music app, native on iOS and on Android And then the long arrow at the bottom: feedback. Ideas, artifacts and products go back to the people. A draft reply goes back to the customer, after I read it and approve it on my phone; Contact never sends anything by itself. The puzzle went back to the class. What people say about it comes in again on the left, and the loop closes. Not a chat app, not an AI app There are apps for people: Teams, Slack, WhatsApp. There are apps for AI. Contact is neither. It sits between them, on them and in them, at the crossing of people and machine. It is made for making things, and for learning while you do. When it works I hardly notice it: a message comes in, a session picks it up, a draft is waiting when I look. It runs as a native app on the iPhone, the Vision Pro and the laptop, all sharing one idea of what a conversation and a session are. On the Vision Pro the sessions float next to each other, a very nice way to watch several streams of work at once. On the iPhone it is with me all day. A few weeks ago I wrote about making my own Android; that taught me how far you get without touching the operating system, if you own the data, the screens and the concept. Contact is what came out of that lesson. The hardest word When making is cheap and fast, the difficult part is saying no. At one point I asked for my lock screen to show the state of the factory: what waits for me, which session has a question. It was built, I tested it on my phone in the evening, and it worked. I looked at it and decided it was not useful to me. Back to plain notifications, the same evening, nothing left behind. The lock screen experiment: built, tested, and switched off again the same evening My personal reflection helps here. Writing in the notebook makes my norms visible: privacy, the feel of software, and the rule "das Beste oder nichts". That rule leads to "no" quite often. A not-doing choice is a real choice, and now that almost anything can be made, it may be the most important one. Conclusion Contact is a small factory. People and their ideas go in, triage decides what matters, a machine with context and energy makes something, and it goes back to the people. The trick is not the model, it is the context. And the courage to throw away what you made when it is not good enough. So if your inbox feels like a pile of messages, maybe it is a pile of ideas waiting for a factory.