On macOS my daily driver is Nimble Commander (https://magnumbytes.com/). Super fast, powerful and inspired by Total Commander. It used to be paid but now is free and open source so give it a try. It deserves to be better known.
There was this tech [1] making rounds on HN a while back. Made a big impression on me and it's by the company that co-created the World of Goo 2. I wonder if it was used to make the game.
Nebula was the tech that I watched very closely and it inspired me a lot. It was back in the ancient year of 2000, if I remember correctly, when our game was being published by CDV and I just learned about Project Nomads, based on Nebula. Beautiful engine and I loved the clean, simple and extensible architecture.
I would love to have such tech nowadays, but focused on 2D/light-3D mobile games :)
The most interesting design detail in Nebula1 (the close connection between C++ classes and Tcl) was also its biggest problem in Project Nomads.
A lot of Project Nomads consisted of Tcl scripts which directly called into C++ class interfaces exposed to Tcl. This was extremely flexible, but also put too much power into the hands of gameplay scripters which came up with hair-raising workarounds for missing features in the C++ code heh.
Another design wart was that we also closely integrated Tcl into the asset pipeline (e.g. you could attach small Tcl 'scriptlets' directly to Maya 3D objects which then would be evaluated during the asset export). This means we had to carry a small Tcl interpreter in the Maya plugin all the way to the end even though the actual engine long had dropped any support for Tcl scripting.
Project Nomads scripting left such a deep scar that I removed all scripting features in Nebula3 (which the gscept/nebula version is based off, although I see there is some Python support under addons/scripting), and I remain a big sceptic when it comes to integrating 'scripting languages' into game engines. A probably too extremist pov.
TL;DR: don't expose your low level engine APIs to scripting, and don't use the same scripting API for persistency and/or asset pipeline file formats, it will inevitably end in tears ;)
"gameplay scripters which came up with hair-raising workarounds for missing features in the C++ code"
Why did you fall behind with the "missing features"? What complications slowed down gradual rewriting with improved C++ components and smaller, cleaner, higher level scripts with less workarounds? I suspect inertia (the sunken cost of extant scripts) and cumbersome tooling, knowing more would be interesting.
In part it was kind of a vicious cycle, the dynamically typed scripting interface made it impossible to do any real changes to the C++ code, so towards the end of the project we were stuck between a rock and a hard place.
The scripting interfaces were direct mirrors of essential low-level engine C++ classes. Doing any changes to the C++ interfaces which were called by scripts wouldn't result in compiler errors but crashes at runtime.
Tcl scripts were also impossible to properly debug, and even performance profiling was kinda hard (most problems were not crashes or game logic bugs, but performance problems, where a script spent too much time in the script part and too little in the C++ part).
The *actual* main problem in hindsight was that we failed to think about and provide a proper "gameplay vocabulary" right from the start, e.g. identify and split the gameplay elements into small logic blocks which would be implemented in C++ and only combined / glued together via scripting. In typical arrogant junior coder fashion we mostly spent time down in the guts of the engine, and only paid little attention to the gameplay logic problems, that was something for the gameplay scripters to worry about.
Also, for the few 'senior people' on the team this was our second game project, and the first C++ project. And everybody else had no game development experience at all. We still shipped the game somewhat in time, so there's that ;)
PS: I guess the *actual-actual* problem was that I was a fan of "big idea" designs at the time ;) E.g. stuff like "everything is a Tcl-scriptable object", yes it might look elegant, but conceptual elegance only helps so much in real-world scenarios. It's much more important that a code base is malleable, and an entire game codebase built around a single "big idea" is usually not.
This kind of pitfall has happened a lot to new game engine developers(myself included) - the scripting language shouldn't be the engine, but at the outset, exposing all the internals 1:1 so that "anything is possible" is the obvious thing to do.
I now advocate, when the topic comes up, for the scripting to be strictly used as a configuration language: it can be used to initialize and pass data structures back to the engine, but it shouldn't be controlling the main loop. If you want it to define any specific runtime behavior like an AI policy, it's still more robust to make a targeted micro-runtime and have the scripting language compile to that.
Oh god. On the one hand this idea of carrying scripts on maya objects to be run on asset pipeline sounds really cool from a technical standpoint. BUT this also sounds like a project maintenance nightmare.
I probably share many of your extremist pov on no extension scripts because I have seen weird build time, and pre-run time scripts cause a lot of issues in projects.
Yes, Nimble Commander is wonderful. The developer took a lot of care and created a powerful and very fast tool. As a long time user of Total Commander on Windows I'd be crying sad tears if I had to limit myself to the basics that Finder provides on macOS.
Indeed, Teal looks like it has the right brains behind it (author was involved with several earlier attempts at typed Lua) and is actively maintained. I'm personally watching it for future game development usage.
Oh yes! Notes failing to sync after iOS 13 update is something that happened to me too. And apparently other people as well, as posted on Apple's forums: https://discussions.apple.com/thread/250684880