Show HN: MacMind – A transformer neural network in HyperCard on a 1989 Macintosh

Posted by hammer32 1 day ago

Counter140Comment40OpenOriginal

I trained a transformer in HyperCard. 1,216 parameters. 1989 Macintosh. And yes, it took a while.

MacMind is a complete transformer neural network, embeddings, positional encoding, self-attention, backpropagation, and gradient descent, implemented entirely in HyperTalk, the scripting language Apple shipped with HyperCard in 1987. Every line of code is readable inside HyperCard's script editor. Option-click any button and read the actual math.

The task: learn the bit-reversal permutation, the opening step of the Fast Fourier Transform. The model has no formula to follow. It discovers the positional pattern purely through attention and repeated trial and error. By training step 193, it was oscillating between 50%, 75%, and 100% accuracy on successive steps, settling into convergence like a ball rolling into a bowl.

The whole "intelligence" is 1,216 numbers stored in hidden fields in a HyperCard stack. Save the file, quit, reopen: the trained model is still there, still correct. It runs on anything from System 7 through Mac OS 9.

As a former physics student, and the FFT is an old friend, it sits at the heart of signal processing, quantum mechanics, and wave analysis. I built this because we're at a moment where AI affects all of us but most of us don't understand what it actually does. Backpropagation and attention are math, not magic. And math doesn't care whether it's running on a TPU cluster or a 68030 from 1989.

The repo has a pre-trained stack (step 1,000), a blank stack you can train yourself, and a Python/NumPy reference implementation that validates the math.

Comments

Comment by edwin 21 hours ago

There’s something quietly impressive about getting modern AI ideas to run on old hardware (like OP's project or running LLM inference on Windows 3.1 machines). It’s easy to think all the progress is just bigger GPUs and more compute, but moments like that remind you how much of it is just more clever math and algorithms squeezing signal out of limited resources. Feels closer to the spirit of early computing than the current “throw hardware at it” narrative.

Comment by wdbm 20 hours ago

There is an absolutely beautiful rendering of the Mona Lisa encoded at some point in the digits of pi. If you know the position, it's really easy to plot the image.

But first you have to find that position.

Comment by zoky 15 hours ago

This is both simultaneously false, and true but largely meaningless. If you mean the Mona Lisa is somehow directly encoded somewhere in pi, then of course it’s not. It’s just a number.

If you mean that when you feed the numbers starting with some offset of pi into a specific algorithm you will get a rendering of the Mona Lisa, then yes, but so what? Allow me to introduce you to the PiMona algorithm. I won’t bother you with the implementation details, but it takes exactly one integer parameter. If it’s 3, it produces a beautiful rendering of the Mona Lisa. Anything else and it generates random garbage. Turns out, it’s really easy to find where the Mona Lisa is encoded in pi! It’s right there at the start.

But let’s say you meant that the digits of pi at some offset, when encoded properly and fed into any algorithm that is theoretically capable of generating the Mona Lisa will cause that algorithm to do so, then sure. But that’s also true of random noise, and says more about the algorithm and the nature of random numbers than about the Mona Lisa somehow being encoded into the fabric of the universe (which I’m sure isn’t what you meant, but I’m just saying there’s nothing really special about pi in that regard, except that as far as we know, it continues infinitely).

Comment by hammer32 19 hours ago

Exactly. Working in a constrained environment invites innovation.

Comment by Unbeliever69 19 hours ago

Now do this on a Casio Watch next :)

Comment by hyperhello 23 hours ago

Hello, if there are no XCMDs it should work adequately in HyperCard Simulator. I am only on my phone but I took a minute to import it.

https://hcsimulator.com/imports/MacMind---Trained-69E0132C

Comment by hammer32 22 hours ago

I had no idea your simulator existed. No XCMDs, correct; everything is pure HyperTalk. I just ran a few training steps and they complete in a second or two. Thank you for importing it!

Comment by hyperhello 22 hours ago

I gotta ask. Your scripts have comments like -- handlers_math.hypertalk.txt at the top. Are you using some kind of build process for a stack?

Comment by hammer32 21 hours ago

More of a copy-paste process. The scripts are written as .txt files in Nova on my Mac Studio, then pasted one at a time into HyperCard's script editor on the classic Mac. The files are kept separate because SimpleText has a 32 KB text limit.

Comment by hyperhello 21 hours ago

As an alternative, you might consider letting Hypercard itself open the text files and 'set the script of' as needed.

Comment by hammer32 20 hours ago

Yup, that would have been easier. It's been decades since I've done anything with HyperCard. I had to re-take the built-in intro course again :)

Comment by jasomill 13 hours ago

Would that overcome the size limit?

Does HyperCard implement its on text handling for the HyperTalk editor that doesn't rely on the TextEdit toolbox service (which IIRC is the source of SimpleText's 32 kB limit)?

Comment by hyperhello 12 hours ago

Fields appeared to use TE and I suppose the script editor was pretty much limited to 32 kB of text for that reason, although you could have any size of text in a variable.

Comment by jasomill 12 hours ago

Curiousity got the better of me, and I just tested it in Infinite Mac.

The HyperTalk editor is indeed limited to 32 kB.

It's certainly possible that this limit only applies to editing scripts, as it's unlikely TextEdit was used in the process of interpreting them, but I don't have time tonight to investigate.

Later versions of HyperCard supported OSA scripts as well, now I'm also curious what the size limit is for (presumably) compiled AppleScripts stored in HyperCard stacks.

Comment by watersb 16 hours ago

This is great!

I first studied back-propagation in 1988, at the same time I fell in love with HyperCard programming. This project helps me recall this elegant weapon for a more civilized age.

Comment by hammer32 3 hours ago

Building this definitely felt like constructing a lightsaber from spare parts: slow, deliberate, but it works and you understand every piece of it.

Comment by nxobject 14 hours ago

I love this. From reading the nuts-and-bolts "parameters" (haha) of your implementation, I get the impression that the fundamental limit is, well, using a 32-bit platform to address the sizes of data that usually need at least 48 bits!

Comment by hammer32 3 hours ago

Thanks! The precision was a happy surprises, HyperTalk uses Apple's SANE library, which gives you 80-bit extended precision. The interpreter speed and the lack of arrays were a challenge. Rediscovering what HyperCard could do was half the fun of this project.

Comment by gcanyon 23 hours ago

It's strange to think how modern concepts are only modern because no one thought of them back then. This feels (to me) like the germ theory being transferred back to the ancient greeks.

Comment by hammer32 23 hours ago

Right? Backprop was published in 1986, a year before HyperCard shipped. Attention is newer, but a small model like this was buildable.

Comment by 19 hours ago

Comment by jeffbee 19 hours ago

People did think of many of these core concepts decades ago, but they did not have the resources to put them into practice.

Comment by anthk 22 hours ago

Lisp is from 1960's and with s9 you can do even calculus with ease, in an interpreter small enough to fit in two floppies.

On the Greeks, Archimede almost did 'Calculus 0.9'.

Comment by kdhaskjdhadjk 22 hours ago

I think it's incredible to see the potential that is still locked up in old hardware. For example the 8088 MPH demo. Amazing what he was able to do with an 8088 and CGA. All this time the hardware had that potential, but it took decades to figure out how to unlock it, long after the hardware was considered obsolete. Imagine the sort of things that might be done later down the road with hardware of 0-20 years ago if somebody really dug into it to that level.

Comment by ashleyn 22 hours ago

Retro console homebrew and demoscene are all about this. There's a lot of fun stuff going on in N64 homebrew right now: https://www.youtube.com/watch?v=rNEo0aQkGnU

Comment by anthk 7 hours ago

On the N64, an equirectangular viewer a la QT3D or the current street view is not precisely a wonder.. m68k's could do that at a similar resolution. It's simple 3D in the end.

For the rest, yes, it's really astounding until you push these polygons while moving around in a game loop...

Comment by qingcharles 18 hours ago

8088 MPH demo is revolutionary. I have a plan to try and backport the developments from that demo, plus other optimizations learned in the last 40 years, back into the original 8088 Elite PC version. I had Gemini Pro write a PoC using 8088 assembler to create a CGA flat-poly renderer for the ships, which worked great. Next step is to use Claude to disassemble the original Elite binary so I can figure out where the rendering code lives and try to start patching it.

Comment by andai 19 hours ago

Comment by tomcam 21 hours ago

That 8088 MPH demo is a tour de force. Which tells you that the millions of Apple laptops being bricked right now instead of being recycled could have some amazing use if it were possible to wipe them clean and reuse. Sigh.

Comment by andai 19 hours ago

Well, we've set it up so the survival of employees and their families is tied to old products being bricked.

Comment by anthk 7 hours ago

They created a better Pacman for Atari 2600, better Outruns for Amiga's and whatnot.

Comment by tty456 19 hours ago

Where's the code for the actual HyperCard and building of the .img? I only see the python validator in the repo.

Comment by hammer32 18 hours ago

The stack is the code. You can view it directly for each button or examine the per-page script. As far as I know there isn't a compiler that lets you write standalone code and turn it into a stack. The stacks are dropped into Disk Copy disk images to preserve their resource forks. Both modern macOS and Git both strip resource forks, so the disk image is the only reliable container for distribution.

Comment by tty456 18 hours ago

So a hypercard is compiled machine code of button clicks and key presses? Weird. I guess that could be macro'd somehow

Comment by hammer32 18 hours ago

HyperTalk is an interpreted scripting language. The scripts are stored as plain text inside the stack and interpreted at runtime. It's kind of like a Visual Basic form where the UI and the code live in the same file. You can open any script, read it, edit it and immediately run the newly edited script.

Comment by rcarmo 17 hours ago

Neat. Looks like I found my new benchmark for my ARM64 JIT for BasiliskII :)

(still debugging it, but getting closer to full coverage)

Comment by hammer32 3 hours ago

The training loop is heavy on floating-point math and string parsing, so it should exercise the JIT nicely. I'd love to hear how it performs!

Comment by immanuwell 20 hours ago

The architecture of macmind looks pretty interesting

Comment by hammer32 19 hours ago

Thank you! The constraints made it interesting. HyperCard doesn't have arrays, so the entire model, weights, activations, gradients, is stored as strings in hidden fields. All of the matrix math is done with "item i of field".

Comment by DetroitThrow 23 hours ago

This is very cool. Any more demos of inference output?

Comment by hammer32 22 hours ago

Thanks! The quickest way to try it is the HyperCard Simulator link someone just posted in this thread: https://hcsimulator.com/imports/MacMind---Trained-69E0132C — go to the Inference card, click New Random to fill in 8 digits, then click Permute. The model predicts the bit-reversed permutation of all 8 positions. The pre-trained stack gets all inputs correct.