VVO Update: In response to my previous post, I got my first feedback (not counting that from friends and family) in response to a Gemini post: mbays contacted me and suggested that I try implementing my MUD using -- wait for it -- the Gemini protocol itself, and introduced me to streaming, whereby a server continuously sends new text to a client without closing the connection, and compatible clients (such as Lagrange) will display this text without clearing what's already there. With this functionality, it would certainly be possible to implement a MUD using the Gemini protocol. I did a little experimenting and got streaming and user input working (neither of which I had previously built in support for in my custom Twinstar server), so proof of concepting was successful.
That said, given the (by design) lack of control that a Gemini server has over the client's appearance, I certainly couldn't implement any kind of fancy GUI this way, and I do have some ideas along those lines that I think would be legitimate improvements over what is (effectively) a pure old-school terminal UI. So, I decided to first take a shot at developing a client desktop application with a desktop GUI framework.
First try was using Golang and Fyne. Outcome: was not a fan of Fyne. It's probably fine (completely unintentional pun, apologies) given enough practice and familiarity, but I'm not in the most patient of moods right now, so if a framework gives me any trouble out of the gate, it's getting trashed and I'm moving on to the next. So this was a no-go.
Second try was Python and tkinter. This seemed quite promising at first: I was able to build all the screen layouts I wanted using tkinter without issue. I got the client and server (the server being an adapted version of the Golang server I wrote for the first version of VVO) to the point where they were communicating over secure websockets, the database was set up and working, and through the client you could authenticate, get a list of characters, and (but this next part was stubbed out purely on the client side rather than getting actual data from the server) pick a character to log in with and go to the main game screen, complete with minimap. Only took a couple evenings to get that far. Promising!
Things fell apart in a major way when it came time to turn that last step from stub to reality, however (logging in with a character and getting actual map data from the server). The issue I ran into like a brick wall was that Python's threading system does not seem to like to play nice with tkinter. I somehow managed (with a bit of difficulty) to wrestle it into cooperating up to that point, but once I reached that part, I just ran into endless cryptic errors, warnings about deprecated behavior, etc.; and searching online brought up a panoply of equally confused developers and various proposed "solutions" that didn't actually work. Based on this experience, I'd have to say that Python's threading, which I'd never used before in any kind of major way, seems pretty awful in how it's implemented. Definite thumbs-down for usability.
At this point my frustration level is rising fairly high, and since these are similar to some of the kinds of issues I wrestle with at my job, dealing with these frustrations is the last thing I want to be doing with my hobby dev work. Frankly, this entire massive setup phase is nothing but an obstacle to be surmounted to try to get to the actual fun part of the project, which is building out content and then playtesting it with friends and family.
So VVO is now on hiatus, and if I do revisit it in the future, I'll probably throw in the towel on having a custom interface and just implement it as either a classic Telnet server or a Gemini backend per mbays' suggestion (who also generously shared some tips on how to get it working, so thank you mbays and apologies for my flakiness w.r.t. this project).
For the time being though, I kind of feel like I want a break from dev work -- or at least networked dev work -- and maybe I'll focus on creative writing and/or world-building to recharge my batteries. I've been feeling an itch to revisit my sci-fi universes, so maybe I'll scratch that for a bit.