
\documentclass[12pt]{article}
\usepackage[T2A,OT1]{fontenc}
\usepackage[default]{cantarell}
\usepackage[a4paper, top=20mm, bottom=20mm, left=20mm, right=20mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[russian, english]{babel}
\usepackage{tabu}
\usepackage{hyperref}
\usepackage{parskip}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage{float}
\floatstyle{boxed}
\restylefloat{figure}
\usepackage{setspace}
\onehalfspacing
\author{Artyom Bologov}
\date{\today}
\title{Transparent UIs}
\makeatletter
\def\endenv{\expandafter\end\expandafter{\@currenvir}}
\makeatother
\begin{document}
\maketitle

\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{./assets/transparent-ui.png}

While I’m not an active member of the
\href{https://malleable.systems}{Malleable Systems Collective},
I am sympathetic to the cause.
I want to make programs that are inspectable and modifiable.
Programs that give the agency back to the user.

But how do I marry rich layered Object-Oriented UIs with user-facing transparency?
\href{https://forum.malleable.systems/t/a-symbol-oriented-gui/126}{How do I allow the user to peek into what’s behind the UI}?
How can they change what’s there, right from inside the program?
I have some ideas and I’ll list them here.
But I’m mostly clueless really.

I need to introduce one term first: \emph{transparency}.
Not the transparent background (update June 2025: no, not Apple Liquid Glass design either!),
Google transparency reports, or referential transparency of FP.
Rather the ability of the user to peek inside the program and see how it works.
As in: how do we make line-by-line interfaces more \emph{transparent}?

I know introducing new term is not the best move.
But I have no better term for what I’m researching.
So bear with me.

\section*{Shell and REPL} \label{shell}

So there were these mysterious things called TTYs.
With a line-by-line interaction and printed paper.
That’s where
\href{run:customize-ed}{ed, the least customizable editor}
originated from.

TTYs naturally result in shells and REPLs.
This text-only synchronous interface to query one’s computer.

And having this back-and-forth with a computer is not the most inspectable thing.
The program hides behind the lines one’s allowed to input.

Yet this interface is also extremely simple.
Easy to make \emph{transparent} too.
Just add some meta-commands allowing to peek into system’s state.
That’s what e.g. \verb|psql| does even nowadays.
Regular text is SQL queries, backslash-prefixed—commands.

One can build sub-shells/sub-REPLs with this too.
Some programs have an interactive inspector as a separate command or function.
\href{https://cl-community-spec.github.io/pages/inspect.html}{Common Lisp has an inspect function in the standard, for example}.
Some might simply expose the internal state of the language to the user/developer.
\href{https://stackoverflow.com/questions/47866783/override-repl-output}{Like this despicable Python REPL modification}.
It’s easy to make the program \emph{transparent} with line interface.

\section*{Visual Mode and Commands} \label{command}

Now the next step in editor evolution was vi.
And Emacs.
And vim.
And nano.
Screen/visual command-oriented editors.
All relying on CRTs and full-screen terminal programs.

This extrapolates to other programs too.
You look at the screen showing the data you’re acting on.
And you use commands (usually bound to keyboard keys) to act on it.

Now this introduces two challenges:

\begin{itemize}\item How does one know what keys and commands do?
\item How does one inspect what’s behind the UI one’s looking at?
\end{itemize}

Keys and commands are easy—just add a new command showing help for other commands.
Maybe for itself too.
Press something like Emacs’ \verb|C-h k| and the key you’re curious about.
And it’ll show you the information screen/frame/tab/whatever describing the command.
Press \verb|C-h f| and search commands by their name, with the same outcome—help screen.
Easy!

Now the challenge of the UI dissection.
The best \emph{transparency} feature I’m aware of is Emacs’ \verb|describe-*| commands like \verb|describe-face|.
\href{#gui}{There are better ways, but these will come after the era of vi-sual programs}.

\section*{Widgets and Desktop GUIs} \label{gui}

TTYs and CRTs are fun, but what if we have color screens and pointing devices?
GUI frameworks!
Starting with Lisp Machines, Smalltalk, and continuing until today with GTK, Qt, and others.
Featuring widgets (like buttons.)
Windows.
Mouse interactions.
\href{https://wikipedia.org/wiki/WIMP_(computing)}{WIMP, you know}.

A mouthful: multidimentional asynchronous screen-based interactions.
\href{https://eklhad.net/philosophy.html}{Which are complicated and alienating some of us people}.
Something so complex that it’s hard to make \emph{transparent}, right?

Maybe, but...
One notable feature of Smalltalk (and Glamorous Toolkit in particular) is the ability to inspect widgets:

\begin{itemize}\item Click on the widget with something like right mouse button or \verb|Alt-click|.
\item Select an option in the context menu.
\item And look at the function or object behind the widget.
\item Or, at least, at the general class definition for this widget.
\end{itemize}

\href{https://merveilles.town/@aartaka/114378106709379195}{Thanks to the fediverse},
I also learned that
\href{https://blender.stackexchange.com/questions/303963/how-to-find-out-what-buttons-without-a-python-tooltip-actually-do#303965}{Blender does that too}!
\href{https://makepad.nl}{And Makepad, a revolutionary shader-based GUI toolkit for Rust}!

Actually, let’s talk about Makepad some more.
They have an ambitious goal of making the design vs. development dichotomy disappear.
The widgets map to Rust-resident DSL, and the DSL maps straight to widgets.
A nice promise that marries graphicality with inspection and source-available mindsets.

Once we have widget inspection, we might want to inspect windows and whole screens.
The former is achievable in
\href{https://stumpwm.github.io}{my beloved StumpWM}:
It allows to list X window properties and even act on windows programmatically.
So yes, GUI programs might provide REPLs/RPCs/shells for self-modification.

\section*{Interlude on Debuggers} \label{debuggers}

There’s this saying: <q>If you know assembly, every program is Open-Source</q>.
Much in the same vein, having a program-attacheable debugger makes it automatically inspectable...
Given that you understand how to use the debugger and make sense of what you see there.
So yes, that’s one way to make a UI transparent—force your user to debug it themselves!

\section*{Client-Server and Web Platform} \label{web}

It’s not enough that we had the separation between data and widgets displaying it.
Now we have a whole set of computers hidden behind the UIs we see!
So some of the data is simply inaccessible to the user.
No way to know the layout of the DB or the model that widgets (HTML \& custom elements) are built from.

The problem is split between two of the front-end architectures, actually:

\begin{itemize}\item Server-Side Rendering bakes the data into the UI. This allows little to no inspection of the API.
\item While most JavaScript frameworks generate the UI from data/API client-side. Which makes UI elements much less inspectable and controllable.
\end{itemize}

Both are bad, for different reasons.
Yet the general problem is there: network and dynamic content generation make Web UIs less \emph{transparent}.
For that, I have no better answer than Dev Tools.

Inspect the dynamic state of the DOM with JS Console.
Pick on generated/baked elements in the Inspector.
Check API calls in the Network tab.

Which is good, because one can dissect at least the widgets/elements/nodes.
This kind of tooling might have been useful to the (visual, graphical) UIs above too!
But it feels like we’re missing out on something nonetheless.
Like somehow mapping API calls to DOM nodes or deobfuscating page-generating JS.
But yeah, client-server architecture(s) are incapacitating to a degree.

\section*{VR} \label{vr}

Now that’s the one I’m entirely oblivious to.
Mentioning it for compleness only.
3D space, all around the person with the ability to move around.
No idea how to make a UI for inspecting this dimentionality.

No, flat interfaces won’t cut it.
Even though some VR programs still use flat interfaces and pointing devices.
Such an archaic idea.
So a good inspector will make these \emph{transparent}, at least.
But that’s about it.
Doesn’t scale to 3D.

The further we go with the evolution of UIs, the harder it is to make them \emph{transparent}.
Sigh.

\section*{Conclusion} \label{conclusion}

So we have progressively complicating interfaces.
With less \emph{transparency}.
And we have some overly simplistic ways to make these more understandable:

\begin{itemize}\item Meta commands.
\item Help commands.
\item Documentation and tutorials.
  (that I neglected to mention and that should not even be on the list—better \emph{transparency} tools make these redundant.)
\item Debuggers.
\item Injectable REPLs and APIs.
\item Graphical widget/element/node/network/window/environment inspectors.
\item ???
\end{itemize}

We have a long way to go if we want to reclaim tech back.
And I personally have no ideas on how to make our tech more \emph{transparent}.
(Besides the ones I listed—they are missing from most programs today, and that’s a mishap!)
But it has to be \emph{transparent}.
Let’s work for it.

\par\noindent\rule{\textwidth}{0.4pt}
Copyright 2022-2025 Artyom Bologov (aartaka).
Any and all opinions listed here are my own and not representative of my employers; future, past and present.

\end{document}
