惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
博客园 - 【当耐特】
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
D
Docker
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
The Cloudflare Blog
雷峰网
雷峰网
A
About on SuperTechFans
小众软件
小众软件
博客园 - Franky
博客园 - 聂微东
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
Engineering at Meta
Engineering at Meta
宝玉的分享
宝玉的分享
aimingoo的专栏
aimingoo的专栏
量子位
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
罗磊的独立博客
Martin Fowler
Martin Fowler
D
DataBreaches.Net
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Secure Thoughts
Project Zero
Project Zero
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
S
Schneier on Security
Blog — PlanetScale
Blog — PlanetScale
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
Security Latest
Security Latest
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
CXSECURITY Database RSS Feed - CXSecurity.com
J
Java Code Geeks

Hacker News

Introducing Claude Opus 4.7 Qwen Studio The Future of Everything is Lies, I Guess: Where Do We Go From Here? GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis Moving a large-scale metrics pipeline from StatsD to OpenTelemetry / Prometheus GitHub - Nightmare-Eclipse/RedSun: The Red Sun vulnerability repository GitHub - SethPyle376/hiraeth: Local AWS emulator focused on fast integration testing, with SQS support, SQLite-backed state, and a debug-friendly web UI. GitHub - macOS26/Agent: Any AI, replaces Claude Code, Cursor, OpenClaw. Over 18 LLM providers (Claude, OpenAI, Gemini, Ollama, Zai, HF, Qwen) wired into a native Mac app that writes code, builds Xcode projects, bumps versions, manages git, automates Safari, use AppleScript, JS or Accessibility, extend Agent! w/ MCP Servers, run tasks from your iPhone via Messages. YouTube now lets you turn off Shorts I Made a Terminal Pager Burgers | マクドナルド公式 Commands — HackerNews CLI documentation ChatGPT for Excel PiCore - Raspberry Pi Port of Tiny Core Linux Live Nation illegally monopolized ticketing market, jury finds Google Broke Its Promise to Me. Now ICE Has My Data. Founding Engineer at Adaptional | Y Combinator CRISPR takes important step toward silencing Down syndrome’s extra chromosome GitHub - saffron-health/libretto: The AI toolkit for building reliable browser automations US v. Heppner (S.D.N.Y. 2026) no attorney-client privilege for AI chats [pdf] Unexpected €54k billing spike in 13 hours: Firebase browser key without API restrictions used for Gemini requests Retrofitting JIT Compilers into C Interpreters IPv6 – Google The Accursèd Alphabetical Clock Cybersecurity Looks Like Proof of Work Now Fragments: April 14 Cal.com Goes Closed Source: Why AI Security Is Forcing Our Decision | Cal.com - Scheduling Software for Online Bookings Laravel raised money and now injects ads directly into your agent When moving fast, talking is the first thing to break Too much Discussion of the XOR swap trick – Heather Cafe Introduction to Spherical Harmonics for Graphics Programmers The Grand Line Building a Z-Machine in the worst possible language High-Level Rust: Getting 80% of the Benefits with 20% of the Pain GitHub - duguyue100/midnight-captain: Inspired by Midnight Commander, tailored to my taste. How to build a `git diff` driver · Jamie Tanna | Software Engineer Center for Responsible, Decentralized Intelligence at Berkeley The Local Universe’s Expansion Rate Is Clearer Than Ever, but Still Doesn’t Add Up - A new synthesis of astronomical measurements confirms a persistent mismatch that could point to physics beyond current models The air throughout our homes is infused with microplastics. But there are things you can do to breathe less of them The disturbing white paper Red Hat is trying to erase from the internet – OSnews The Future of Everything is Lies, I Guess: Annoyances ‘Abhorrent’: the inside story of the Polymarket gamblers betting millions on war Productive procrastination — Max van IJsselmuiden maps, territory and LMs 447 Terabytes per Square Centimetre at Zero Retention Energy: Non-Volatile Memory at the Atomic Scale on Fluorographane Show HN: Pardonned.com – A searchable database of US Pardons 20 Years on AWS and Never Not My Job The Seasons are Wrong Artemis II crew splashes down near San Diego after historic moon mission We gave an AI a 3 year retail lease in SF and asked it to make a profit | Andon Labs How a dancer with ALS used brainwaves to perform live On filing the corners off my MacBooks Installing every* Firefox extension OpenClaw’s memory is unreliable, and you don’t know when it will break Steve Blank Nowhere Is Safe Chimpanzees in Uganda locked in vicious 'civil war', say researchers watgo - a WebAssembly Toolkit for Go linux/Documentation/process/coding-assistants.rst at master · torvalds/linux GitHub - callumlocke/json-formatter: Makes JSON easy to read. Founding Product Engineer at Bild AI | Y Combinator A compelling title that is cryptic enough to get you to take action on it GitHub - Keychron/Keychron-Keyboards-Hardware-Design: Industrial design files for Keychron keyboards and mice. 100+ models with CAD assets in STEP, DXF, DWG, and PDF. Source-available, with commercial use allowed for original compatible accessories within the license terms. [ANNOUNCE] WireGuardNT v0.11 and WireGuard for Windows v0.6 Released 1D-Chess Helium Is Hard to Replace Cooperative Vectors Introduction | Evolve Keeping a Postgres queue healthy — PlanetScale Our response to the Axios developer tool compromise Do Americans read print books, e-books or audiobooks more? The Zettelkasten Method in Obsidian: A Practical Setup Guide Artemis II Is Competency Porn and We Are Starving For It WeakC4 Flight Viz — Cockpit View A Mexican surveillance giant you’ve never heard of is now watching the U.S. border Surelock: Deadlock-Free Mutexes for Rust RISC-V 101 – what is it and what does it mean for Canonical? | Ubuntu The Problem That Built an Industry How Much Linear Memory Access Is Enough? | Solidean Investigating Split Locks on x86-64 Simplest hash functions Sybilproof reputation mechanisms (2005) [pdf] What is a property? How Complex is my Code? Static code analysis in Kotlin — tools overview Toffoli gates are all you need PGLite evangelism dcmake: a new CMake debugger UI Clojure on Fennel part one: Persistent Data Structures Fragments: April 2 Python Release Python install manager 26.1 The Life and Death of the Book Review - Liberties Introducing Database Traffic Control — PlanetScale Bitcoin miners are losing $19,000 on every BTC produced as difficulty drops 7.8% God sleeps in the minerals Building slogbox Apple Silicon and Virtual Machines: Beating the 2 VM Limit Who was “Not Even Wrong” first? Pokemon Evolution Vs Darwinian Evolution The APL Programming Language Source Code
Using a 1978 terminal in 2026 (DEC VT-100)
Nikhil Jha · 2026-04-28 · via Hacker News

I spent the last few weeks making a coding agent for the terminal. This strikes me as anachronistic: the terminal is technology from before my lifetime, and I’m using it as the interface to exhilarating, terrifying, cutting-edge, trillion dollar modern day research.

I find the juxtaposition nice. It’s a reminder that I build on what came before me, and others will build on what I leave behind.

All modern terminals are (roughly) emulations of a single terminal released in 1978: the Digital Equipment Corporation VT-100. In theory, I could take the app that I built and run it on the VT-100. If my software ran there, would it run everywhere?

To find out, I bought a VT-100 and decided to use it as my main terminal. Here’s what I learned.

What is a VT-100?

A VT-100 is a terminal: a screen and a keyboard that you plug into a computer. It’s roughly analogous to the Terminal or Console or Command Prompt app on your computer today. It is not a computer itself. The VT-100’s protocol (i.e. ANSI escape sequences, more on this later) are used today by all modern terminals.

Vim running on the VT-100

The VT100 has a CRT display and a keyboard.

You power it on from a stick switch near the power supply. After flipping the switch it makes a startup beep noise. While on there’s an high-pitch whine from the CRT. The pitch is high enough that a couple of my friends can’t hear it at all.

The VT-100 has Intel inside (there’s an 8080 in there) and 3 KB RAM. This is less than you need to get to the moon (4 KB, Apollo 11).

The keyboard I have is from a VT120, and it is unfortunately awful: the keys are mushy, don’t register without a deep press, and are placed awkwardly for modern usage. We have innovated on keyboard design since then.

Inside the VT-100

How do terminals work?

On the terminal end it is pretty simple. There is one stream of bytes going into the VT-100, and one stream of bytes coming out of the VT-100. When you send bytes in via a computer, they show up on the VT-100’s screen. When you type on the keyboard, bytes come out.

How do interactive apps like vim work? Special sequences of text called “ANSI escape sequences” can be used to move the VT100’s cursor around. For example, ^[D moves the cursor left. Similar sequences are used for colors1, italics, bolding, and other visual features. By moving the cursor around and writing formatted text, programmers can build interactive apps.

The computer end is surprisingly complicated. On Linux and MacOS, there are ttys (teletypewriters) and ptys (pseudoterminals) that exist as files in /dev.

A pty has two sides, the host and the client, where the host is controlled by your terminal. The client side is a tty. This is how virtualized (i.e. non-hardware / modern) terminals work.

The kernel tty subsystem is remarkably complicated for legacy reasons. It has a raw mode and a cooked mode (chat… it’s cooked) (this isn’t a joke that’s actually what it’s called). If you’re bored you can put your terminal into cooked mode by running stty cooked.

In cooked mode, the kernel handles “line discipline”, which handles more than I expected: echoing characters you type to the screen, generating SIGTERM on Control + C2, flow control, and even line editing (the kernel can natively handle ^W and ^U, try running cat and typing).

If you want full control over the terminal you need to uncook the terminal from userspace first (raw mode). This lets application developers decide what happens when keys are pressed without the kernel getting in the way.

The raw and cooked modes are shorthand for a particular list of configuration flags that the kernel’s TTY subsystem has. There are options that are not set in either mode, such as IXON for flow control. But nobody needs flow control in 2026 (foreshadowing).

How do you use a VT-100?

The VT-100 speaks the RS-232 standard, which is in common use today. You can go to the store and buy a cable that plugs into the VT-100, and it’ll show up under /dev/ttyUSB0.

I had a mild skill issue plugging it in. I bought a wrongly keyed cable, so I had to run jumper wires instead of using the connector properly. I looked at the wiring diagram and tried wiring the TX, RX, and ground to the cable and tried to send bytes to it via echo foo > /dev/ttyUSB0 but it didn’t work. I then brought out the oscilloscope and noticed that it was sending in both directions. RX and TX were flipped. Classic.

Was that enough to run my app on the VT-100?

Unfortunately, that’s where the ease ended. Nobody3 today uses an external terminal over a USB connection. Why would you want to do that? USB devices have metadata associated with them that tells Linux the device on the other end is a printer or something, not an external terminal.

Oscilloscope trace

Issue #1: Flow control

At this point I could echo a couple of bytes into the tty device and see them on the VT-100, or cat bytes out of the device and see them on my Mac. However, if I tried to run my shell pointed at the tty device it blew up and half the characters would drop.

The issue was that the VT-100 has inline flow control that expects the host (i.e. the computer) to stop sending bytes if it is overwhelmed. It appears that this feature either never existed in MacOS or was removed at some point. We tried forcing it via stty but it just didn’t work.

We ended up running a Linux VM and setting the same option, which immediately worked.

This is enough to get bash and vim and other simple apps working.

Issue #2: Full terminal redraws are painful

The VT-100 is slow. It runs at 9600 baud4. That might sound like a lot, but text that contains a lot of ANSI escape sequences quickly exceeds this budget. The VT-100 doesn’t even support sending at the full 9600 baud continuously with any escape sequences. Text containing escape sequences is limited to even less than 9600.

At this speed, full screen redraws are slow. The solution to this is a “differential renderer”: a renderer that keeps track of the screen state and makes the minimal edit to minimize flicker. We thought we were doing this in our app but it turned out there were a few cases where we were redrawing and should not have been.

Issue #3: Assuming too much escape sequence compatibility

Our app was emitting escape sequences that the VT-100 didn’t understand. Normally the terminal ignores incorrect escape sequences, but there were a few hard blockers.

First, Unicode: the modern standard for computer text5. The VT-100 only supports ASCII6 characters. Our interface was mostly ASCII already, but a few characters looked nicer with Unicode, e.g. box drawing characters and loading spinners. We solved this by adding an ASCII-only mode.

Fun fact: one of our enterprise customers later requested ASCII-mode as a feature because their terminals didn’t have Unicode either. We got to tell them we have it already :)

Second, OSC sequences. The VT100 safely throws away standard ANSI escapes it doesn’t understand, but OSCs7 are a new format that it doesn’t understand at all. If you emit one, it prints the raw text of the OSC to the screen. I added a special “legacy” mode where the app never emits an OSC.

Impressions

After getting it working, using the VT-100 in person was delightful! I basically only need vim and my app to work, so except for the keyboard it is very usable. I think everyone who came by to check it out appreciated the contrast of old vs new technology.

I would like to try more things, so let me know if there’s something you want to see running on the VT-100!

1

the VT100 is monochrome, but later terminals added color

2

if I explain signals this blog post will never end

3

citation needed

4

baud is a weird unit meaning symbols per second

5

supports many languages, emojis, and special symbols

6

English text: a-z, numbers, and punctuation

7

used for e.g. hyperlinks, terminal titles