Spyder 6 project lead: Remote development interface and application UI/UX improvements
I started out using Spyder just like many of you, employing it for my research in modeling and simulation of physical systems all the way back in late 2009, shortly after it was first publicly released. Back then, Spyder didn’t have rich-text help in the Help pane, just plain text that was harder to read and parse. In 2010 I decided to develop this feature myself, which became my first substantial contribution to Spyder. After many more contributions over time, I became the lead maintainer in 2013 when Spyder’s original author Pierre Raybaut moved on.
In 2023, Spyder received a Chan Zuckerberg Initiative Essential Open Source Software for Science Cycle 5 grant, number 384 to support a new remote development architecture for the IDE, as well as related development and maintenance. With this grant, we’ve been able to fund a whole team of developers to work on Spyder—including myself, with this becoming my full-time job.
Let’s go through what I’ve worked on for Spyder 6!
Implementing the remote development frontend
I was in charge of implementing the frontend (or graphical interface) of the new remote development architecture, with Hendrik responsible for the backend. First, I created a generic base class for complex dialogs that need a sidebar, making the existing Preferences layout reusable by other plugins. Similarly, I made the individual preference pane widget modular and generic, as well as added a number of UI improvements to benefit everything that uses it.
With that preliminary work out of the way, I implemented the remote connection manager to create, edit and interact with connections to other hosts. It offers multiple SSH authentication methods with user credentials saved securely. This information is used to automatically open a connection, install the server Hendrik developed, start a Spyder Kernel in the remote machine and create an IPython console connected to it. In Spyder 5, you needed to do all that by hand, which was quite a long and cumbersome process. With the improvements in Spyder 6, you just need to enter your SSH credentials the first time you connect, and Spyder takes care of everything from there with one click!
Finally, I added detailed logging messages for remote connections in the status tab. This helps you more easily track the connection progress, as well as exactly what is happening behind the scenes to aid in debugging any problems that may arise.
Improving UI/UX
Aside from working on the remote connection manager itself, I spent most of my remaining energies during the Spyder 6 cycle working on many UI/UX fixes and enhancements throughout the application. For these, I followed the best design patterns found in modern web applications, so users have an easier time when switching between different environments. The end result was a much more coherent and intuitive UI, as well as a more attractive one.
The biggest single change was a complete overhaul of the plugin manager preferences pane, to make it much more useful and user-friendly as well as add support for listing external along with internal plugins. Previously, it only showed a simple set of checkboxes next to each internal plugin’s name with no other information, and no place to list external plugins (which you’re more likely to want to enable/disable vs. internal ones). After an extensive reworking, it is now a much more informative and appealing scrollable list, showing each plugin’s icon, short description, internal/external status and enable/disable checkbox. Furthermore, external plugins are now shown at the top for easy access, with plugins within each group sorted alphabetically by its localized name to aid navigation.
Another significant improvement was adding support for configuring the Spyder’s interface font. This was requested by many Spyder Chinese users on Windows, where the default font for Latin text is ugly and difficult to read. It’ll also benefit other users who prefer a different UI font than the current default. The work also included other enhancements and fixes throughout the Spyder interface to support this change and fix many font-related inconsistencies.
The Spyder Preferences dialog as a whole got many overall UI improvements, most prominent being a much more organized listing of the preferences panes by group/importance and then alphabetically within them. The sidebar also received a major layout and styling overhaul, making it much less cramped and more refined. The pane area was cleaned up, removing redundant lines and elements, and making the spacing more comfortable and consistent. Finally, numerous bugs, issues and minor tweaks were addressed throughout.
The Plots pane also saw plenty of love, with a much more intuitive zooming and sizing experience. Plots are still fit to the pane by default, but zoom in/out buttons are now enabled by default, and a new toolbar button allows toggling between fit to window and 1:1 actual size. On top of that, zoom level is now saved per plot, and double-clicking a plot shows it full size. Additionally, the toolbar is more organized and users can drag and drop their plots in the thumbnail list to the right to re-order them as they wish. Put together, this solves a significant set of pain points that Spyder users and developers expressed previously about this pane.
I made numerous other UI/UX enhancements across Spyder, far too many to list here. Here’s a sampling of some more:
- Rendering tweaks to menus
- Styling improvements to pane tab bars
- New improved comboboxes
- UI refinements to the Find pane
- Enhancements to hovers, hints & calltips
- Display & layout upgrades to Files/Project
- Remove redundant icons on OK, Cancel, etc, buttons on Linux
Supporting the work of others
Beyond the remote development frontend and the UI/UX work, a large part of my role as a maintainer and leader is supporting the work of others.
I’ve assisted Juan-Sebsatian Bautista, one of our junior developers, in several significant enhancements to Spyder’s UI. In particular, I’ve made UI/UX improvements to the layout and scaling of the empty pane widget and added a message if the emptiness is due to a faulty IPython Console. As part of that work, I also took the opportunity to enhance the About dialog’s layout.
Additionally, I helped Juan-Sebsatian with several significant improvements to the console environments menu. These include showing user-added environments in the console envs menu for easy access, and breaking that menu into sections by environment type for easier navigation. It also consolidates environment tracking functionality previously duplicated between the IPython Console and Python Interpreter plugins.
I aided Angela Remolina’s work on adding real-time file search for the current project to the Switcher (Ctrl-P
), making a number of improvements to its UI.
These changes make the switcher compute file results asynchronously in a separate process to avoid interface freezes and improve performance.
Additionally, it now highlights the matching characters in the project search results, filters the results to only include text files that can edited, clarifies the section layout and improves the tests.
Furthermore, I supported Quentin Peter’s work on the new Debugger pane with more UI/UX improvements.
I added a new postmortem debugging toolbar button, new icons for the Go to Editor
, Interrupt and Debug
, and List Breakpoints
buttons, and section dividers to make the toolbar easier to navigate.
Additionally, I made the breakpoints table collapsible and fixed a theme incompatibility issue in the frames browser.
Finally, I built upon Edgar Margffoy and Stephannie Jimenez’s new modular architecture for running files in Spyder 6, greatly improving its UI and UX. These changes added customizable default run presets for specific file types, making it easier to adjust execution behavior. In addition, the layout of that preference pane and the per-file run configuration dialog are substantially simplified, cleaned up and polished, making the UI easier to use and more intuitive.
Insights going forward
The new remote client plugin was a fascinating set of stress tests for Spyder’s plugin API, originally introduced in Spyder 5. They required implementing close integration with the IPython Console, but without affecting the already extensive connections between the console and several other plugins.
Fortunately, our API passed the test really well, since we were able to have a working prototype of the remote client as a plugin for Linux and Mac in just four months. This means that we’re in good shape to tackle the complex challenges that will come in 6.1 and beyond to add remote development capabilities to other Spyder plugins, such as the Editor and Projects.
What’s next for Spyder?
Next year, I’ll be making more UI/UX improvements on several different fronts.
I’ll integrate the Spyder-Env-Manager plugin, developed by Daniel Althviz and Juan-Sebsatian Bautista, with the remote development client. Spyder-Env-Manager allows you to create Conda environments as well as install and manage packages within them directly from Spyder—no arcane commands or external GUIs, and no separate install of Anaconda needed with our standalone installers. With this integration, you’ll be able to create environments on remote machines just as easily as locally, without needing to install anything on the server.
In addition, I’ll be adding new preferences to allow you to easily associate your Spyder projects with Conda environments. That way, they will be automatically activated both for installing packages and running code, addressing the all too common issue of doing one or the other in the wrong environment without realizing.
Finally, I’ll improve the file/symbol switcher’s look-and-feel and integrate it with other plugins. For example, you’ll be to quickly open or switch to a specific console just by typing its name.
I can’t wait to release these continued enhancements to Spyder’s interface and usability, and as always, happy Spydering!🕸️