The Terminal is You

David de RosierDavid de Rosier
6 min read

The screen flickers.
A green cursor blinks, steady as a heartbeat. You type. Slowly. Carefully. Into a form you didn’t build, but that seems to know what it wants from you.

Tab – next field – the input waits.
You fill the screen, one data fragment at a time.

And then, when you’re done – you press Enter. Not to submit, to release. To hand the entire page – buffered, structured, complete – back to the machine that asked for it.

This isn’t a browser.
It’s 1978.
And you’re sitting in front of a 3270 terminal.

Back then, we didn’t talk about hydration. There were no onChange listeners. The screen was memory. The input was data. The boundaries were clear.

You didn’t submit a form. You returned a shape.


To the user, it was just a screen with a keyboard.
To the system, it was a memory map. A contract.

That form you typed into? It wasn’t HTML, but the idea wasn’t far off. It was a screen buffer, a fragment of memory with just enough metadata to know what was editable, what was protected, and what kind of data each field expected.

The 3270 terminal encoded this directly – inline. Field attributes lived side by side with the text. Protection flags, data types, display properties. In a sense, it was markup before we had a name for it.

And when the user pressed Enter, it didn’t trickle input through events.
It sent only the modified fields back to the mainframe – as a sparse, efficient diff. The system remembered the rest.

Reading the input on the host side? Trivial.
You already knew the address of the screen.
You already knew the offset of the field.
A few lines of C, or even a handful of assembly instructions, could extract what you needed.

This was block mode, a distinct approach from character mode typical for many other terminals. And the device was IBM 3270 connected to a mainframe.


✶ Technical Note

(optional read)

The IBM 3270 was unlike the ANSI or VT100 terminals that modern emulators descend from. It had no default prompt, no live command line. Instead, it worked in block mode: a screen-sized memory buffer representing the full page, partially or completely editable by the user. Changes weren’t streamed character by character – they were sent only when the Enter key was pressed. To minimize data transfer, only the diff – the modified fields – was sent back to the host. The terminal supported a rich set of inline commands to define editable and protected regions, making screen-based forms both efficient and structured.

Notably, the keyboard featured distinct Enter and Return keys – one to transmit the buffer, the other to navigate within it.


Then came the web

The form remained, but it fractured. The single memory map became a tree of elements. A cascade of styles: a sprawl of listeners. Each field became its own source of truth. Each keystroke: a potential event. We hydrated components. We tracked local state. We serialized. Deserialized. We validated on the client to help the user, and again on the server to help ourselves.

We call it reactive, but the system doesn’t react. It flinches. At every input. At every change. The user hasn’t finished typing, and we’re already diffing the DOM.

What was once a single, quiet message is now a conversation the system overhears in fragments.

And if something goes wrong: we re-render, rebind, and rerun the whole dance.

Focus shifts. Keyboard traps.
ARIA roles. Accessibility audits.
Don't forget to debounce the email field so it doesn't spam the backend on every keystroke.

Meanwhile, the backend still just wants to know:

What did the user mean to say?

The browser gave us freedom. Freedom gave us layers.
And layers gave us fragility disguised as flexibility.


And still – step back far enough, and the picture rhymes:

We fill out fields.
We submit them to a remote system.
We wait for validation.
We act based on the response.

That’s not new. That’s a terminal.

Your browser is the new glass screen. Your backend is the new mainframe.
The wire between them may run at gigabit speeds, but the conversation hasn't changed as much as we like to think.

We once had structured memory with a cursor.
Now we have structured markup with a caret.
We once returned a buffer.
Now we return JSON.

The complexity is real. The design is more open, but the essence is familiar. Forms still map intention into structure. Systems still wait for shape before they respond.

So maybe this wasn’t a revolution?
Maybe the web is a long, layered transition from monochrome screens to modern abstraction?
And in that complexity something essential was traded: we lost clarity, and we lost the pause.

If we had forty years to improve how we talk to machines – why is it so hard?
And more importantly – why did we accept that?


There’s beauty in both ends of the story:

The terminal was silent but structured.
The browser is noisy but free.

One trusted the machine.
One trusts the ecosystem.
Both trust the user – eventually.

And in the end, all our forms are still shapes of thought.
Half-finished until we press enter.
Fragmented until we decide: yes, this is what I meant to say.

The old terminals didn’t react in real time.
They waited.
Because the system knew something we often forget:

Not every keystroke is a commitment.
Sometimes, thinking looks like typing.
The terminal waited. The browser guesses.

And maybe that’s the biggest difference: on the terminal, pressing Enter meant something. It was the moment of communication – no input traveled before that key. But the browser listens early. It sends as you type. It guesses before you're done. “Submit” becomes symbolic. A button of false finality. You didn’t finished but your data already left.


The terminal is you

Still blinking. Still buffering.
Still deciding when the shape is ready.


Postscript

Not everything old deserves revival, but not everything modern deserves reverence.

We didn’t lose the terminal – we just renamed it “the browser.” And we’ll keep building, changing, hoping to discover a better way. But it’s worth pausing – sometimes – to remember what it felt like when the machine waited for us to finish thinking.


✶ Appendix: The quiet computer in the terminal

The IBM 3270 wasn’t a dumb screen. It was a semi-intelligent machine, quietly orchestrating screen state, input rules, and display behavior – before a single byte ever left for the host.

Inside? A custom 8-bit microcontroller. A local display buffer (RAM). A keyboard decoder. And ROM-based firmware that knew how to enforce field rules, cursor zones, even lock the keyboard on error.

This wasn’t just hardware – it was pre-UX UX. It shaped the interaction, in silicon.

And there were firmware cartridges. Literal plug-in ROMs that let the terminal emulate other types, switch keyboard layouts, or expand capabilities. Some terminals even loaded microcode updates from the host at boot, like BIOS patches over coaxial cable.

It connected to the system not via RS-232, but via coax (or – optionally – via telephone line) – speaking block-mode protocols to a cluster controller that routed traffic from dozens of terminals at once.

0
Subscribe to my newsletter

Read articles from David de Rosier directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

David de Rosier
David de Rosier

I’m David. I design systems, teach ideas, and write operating systems for fun (in assembly, because why not). I’ve worked in banks, taught JavaScript to Java developers, deployed software over a satellite, and written code that talks to real hardware and code that talks back. I’m not here to teach. I’m here to think out loud – and maybe help others do the same. If you like RISC-V, Rust, Assembly (little-endian only), metaphors, or words that boot with purpose, you’re in the right place.