Terminal Trove Talks with Miguel de Icaza

Curator on July 28, 2026

21 hours ago • 11 min read 1785196800000
Terminal Trove Talks with Miguel de Icaza

Welcome to our third Terminal Trove Talks, a series of interviews with developers, maintainers and creators of software for the terminal.

In our third interview, we have the pleasure of interviewing Miguel de Icaza, creator of Midnight Commander (mc), the famous blue dual-pane file manager that has been helping people navigate files and directories from the terminal since the 1990s.

Miguel also created SwiftTerm, a VT100/Xterm terminal emulator library for Swift; TermKit, a terminal UI toolkit for Swift applications; and La Terminal, an SSH and Mosh client for iPhone and iPad.

He is also known for helping start GNOME, Mono and Xamarin and now spends much of his time working on Xogot and the Godot ecosystem.

Miguel shares how DOS and Norton Commander inspired Midnight Commander, how its early users turned him into an open source maintainer, the evolution from XtermSharp to SwiftTerm, the challenges of GPU-accelerated terminal rendering, the renewed interest in terminal applications, his plans for TermKit and the terminal tools he uses most often.


Let’s start with the origins of Midnight Commander.

You began the project in the early 1990s, and it later became one of the best-known dual-pane file managers for the terminal, with its signature blue interface.

Could you give us a short history of how it started and explain what problem you were trying to solve at the time?

Miguel: "Before I came to Unix, I was an avid DOS user, where many user interfaces were created entirely for the 80x25 screen. People were experimenting and creating lovely, useful interfaces for that universe.

In that era, one of my favourite ways of organising and exploring the world was Norton Commander, which I used for all sorts of things.

At the time, I was deeply into patching programs, and I had viewed the binary dumps of many programs. It became second nature to look at an executable binary and tell what kind of data I was looking at, or what compiler had been used to build it. You could tell from the strings in the binary.

When I came to Unix, I missed the speed of exploring and organising the file system that I had come to love in DOS, and this was my crutch for moving to the Unix world."



Midnight Commander is still actively maintained today and is packaged across Linux, macOS, BSD and other Unix-like systems.

Looking back, did you ever expect it to have this kind of longevity and continued use among so many developers?

Miguel: "It always brings a smile to my face when someone tells me, ‘mc is the first tool I install on my system,’ but at the time I was merely building something to make my life easier and more enjoyable.

More important than thinking about its longevity, this was my first project that I released to the public. I had users who submitted bug reports and feature requests. These users later turned into contributors and, in turn, made me into an open source maintainer.

This was one of the best learning experiences I could have hoped for. I still remember the early contributors very fondly: Janne Kukonlehto, Pavel Machek, Pavel Roskin, Radek Doulik, Dugan Porter, Jakub Jelinek, Torben Fjerdingstad, Fred Leeflang, Norbert Warmuth, Paul Sheer and many, many more.

I have stayed in touch with some of them. I have worked on and off with Radek Doulik over the years, and I still read about the adventures of some of the other contributors who have gone on to do amazing work on Linux.

Some people I have lost track of, and I wish I knew what happened to them. I sometimes Google them and do not find much."



You built SwiftTerm, a VT100/Xterm terminal emulator library, and TermKit, a terminal UI toolkit, in the Swift programming language.

What made you want to build these libraries in Swift, and why was Swift the language of choice for them?

Miguel: "The story of SwiftTerm started many years before Swift, when Microsoft attempted to make .NET a viable platform on the web with Silverlight. I had a dream that I would write a terminal emulator using it, if we could only get it out of the browser, but it was a hotly contested topic for reasons too long to go into here.

In the meantime, I think Fabrice Bellard wrote a minimal xterm emulator in JavaScript, and this became the foundation of xterm.js. They got to the web before my dream could materialise.

I first ported xterm.js to C# and created XtermSharp. But it is very hard to let go of terminal apps. They are so efficient and so convenient. After all these years, I still do most of my work in terminal windows, and I still use them the way that I used them with Linux, with plenty of terminals open at any given time.

For a while, I thought I was going to be left all alone and would be one of the last dinosaurs on Earth that did not adapt. But the last few years have seen a renaissance of tools for the command line, and it now seems to be in full swing.

To answer your question, being a terminal person makes you see the world in grids of 80x24, or 200x50 nowadays. It is like owning a hammer: you see nails everywhere.

I also loved my iPhone and needed to have my own opinionated port of the terminal emulator. My opinion originally was purely: ‘It will have as many new features as possible, with a nice UI, and will pass as many tests as I can get my hands on.’"


When building SwiftTerm, what turned out to be harder than expected?

Miguel: "I am not a good, or remotely passable, GPU programmer, and getting the hardware-accelerated rendering right took me forever, despite several attempts over the years.

They were never great and never mergeable. You can still see the corpses of the multiple attempts on GitHub.

Eventually, I read the source code for many terminal emulators that had more talented GPU people working on them, including Windows Terminal, Ghostty, WezTerm and a few others.

I ended up settling on a variation of the Ghostty model. It turned out to work really well, but I cannot take credit for it."


Terminal emulation involves supporting many compatibility trade-offs, from legacy escape sequences to modern Unicode characters, grapheme clusters, inline images and newer terminal capabilities.

How do you decide what SwiftTerm should strictly support, what it should extend and what is acceptable to leave out?

Miguel: "There was a period when many capabilities felt fringe, making them seem dangerous to adopt. They almost felt like dead ends.

In some other cases, during the dark era of TUI apps, efforts to standardise new features moved at a very slow pace, so it was easy to sit back, relax and wait for gravity and entropy to do their work.

But as this new revolution of terminal-based apps happened, people started relying on lots of new extensions, obscure features and more of the terminal’s capabilities.

These days, it feels like a very easy decision to implement support for new capabilities that are gaining traction."


You also built La Terminal, a full iOS SSH client built on SwiftTerm.

What did shipping a mobile application teach you about terminal UX on mobile devices that building the library alone could not?

Miguel: "I feel like a bee going from flower to flower, collecting different projects. Each project teaches you new things.

For example, nowadays I am obsessed with blending game development with the Apple UI, and each day brings a new set of challenges.

One day you are happily polishing an animation for a button, the next day you are implementing a graph editor, and the next day you are trying to render an audio file efficiently."


Since releasing SwiftTerm, have you seen the library being used in other projects or production applications?

If so, which uses have been the most interesting to you?

Miguel: "I have lost track of how many people are using SwiftTerm. For a while, I used to keep a folder on my phone containing SwiftTerm-based apps from the App Store, but it has become harder to do that.

With this influx of TUI-based agents, there has also been an explosion in contributions to SwiftTerm: fixing issues, improving the terminal and putting it through its paces. Many of them are using SwiftTerm on macOS rather than iOS.

But I am particularly fond of a-Shell, which is a really clever system for running what appears to be a complete Unix system.

I had been a user for a long time, and Nicolas Holzschuch recently replaced its old terminal emulator with SwiftTerm. I love when things like this happen."


You originally wrote gui.cs, an early C# console UI library that evolved into Terminal.Gui, and later ported gui.cs to Swift by creating TermKit.

Were there any significant challenges with this port? Do you also have plans to adopt a declarative API design, or something close to a SwiftUI, Ink or React-style API, for creating console UIs with TermKit?

Miguel: "I love SwiftUI, and I would love to see a front end that is SwiftUI-like for it. But I do not think I want to build a custom idiom for it.

I think I would rather plug into something like SwiftCrossUI and have TermKit be its backend.

That said, I would like to revisit TermKit in a few ways. I think the layout system that I devised, and that seemed very clever at the time, is not that great.

I would like to go back to a traditional container model, like the one you see in GTK, with a request-size and assign-size protocol and different containers built on that model.

Second, I think we need a design system added to its core and should move away from the very trivial and simplistic model it has now. There are some nice Python libraries that have pushed this idea with great success."


What’s next for your projects?

Do you have any new ones planned for the near future?

Miguel: "Right now, I spend most of my time on Xogot and the Godot universe, but one of these days I will deploy a web app for real ;-)"


Lastly, which terminal tools do you use most frequently, apart from the ones you have built yourself?

Miguel: "jless, less and top are in heavy rotation.

Thanks for the chance to let me reminisce.

Cheers!

Miguel"


Midnight Commander is available through package managers across Linux, macOS, BSD and other Unix-like systems. SwiftTerm and TermKit are available on GitHub.

You can follow Miguel on GitHub, Bluesky, Mastodon and his blog. You can also follow his current work through the Xogot blog.

If you are interested or know someone who might be interested in being interviewed for Terminal Trove Talks, please reach out to us using the email address in the about section.

Resources

  1. Midnight Commander website
  2. Midnight Commander GitHub (Midnight Commander on Terminal Trove)
  3. SwiftTerm GitHub
  4. SwiftTerm documentation
  5. TermKit GitHub
  6. TermKit documentation
  7. La Terminal
  8. Xogot

EOF

SHARE VIA
Back

Get Updates On Terminal Trove.

No spam, just updates on Terminal Trove. See an example update.