frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

Open in hackernews

Show HN: I wrote a "web OS" based on the Apple Lisa's UI, with 1-bit graphics

https://alpha.lisagui.com/
227•ayaros•5h ago
https://lisagui.com/info.html

This is a web OS I wrote in vanilla JS that looks like the Apple Lisa Office System (1983-85), with other contemporaneous influences and additional improvements and features. It's currently in alpha and isn't remotely bug free. I had been holding off on posting this here until it was somewhat presentable and useful. Please note; the Lisa conforms more literally to the desktop metaphor than most modern GUIs - some of the important differences are mentioned in the readme.

This is a complete recreation of the UI in JS; it all renders to a single canvas element. It's not a CSS theme, and not an emulator ported to JS. None of the code is written by Apple. I'll be happy to elaborate more in the comments, but the short version is the entire UI is defined outside the DOM using JS objects. Thus, every interface element - menus, windows, controls, and even typefaces - was recreated from scratch. There are no font files - I wrote my own typesetting system, which supports combining multiple text styles and generates new glyph variants on the fly.

Many of the technical decisions I made were motivated by a desire to have this look the same in every browser. That's harder to do with the DOM and CSS, and why I moved as much logic as I could to JS. Also, the only part of the project outside of vanilla JS and standard web APIs is the Gulp toolkit, which I'm using as a minification/build tool. No vibe coding was used to make this!

This is based on a UI from the 80s, and won't work well on your phone. If you insist on running it that way, turn on trackpad mode in the touchscreen settings panel of the preferences app. For best results, install it as a PWA (add it to your home screen). Also there are some odd Android bugs; the native touchscreen keyboard is currently broken, and there's an issue with the cursor when dragging windows.

I realize there's not a whole lot to do within LisaGUI right now; I've got a big list of additional features and apps I'll be adding in the future. I've been working on this project for a while, and I'm eager to hear people's feedback and answer questions about it.

Comments

mysterydip•4h ago
I'm on mobile so only able to try a couple things, but impressed with how responsive it is! Thanks for sharing
ayaros•3h ago
Thanks for looking!
Jonovono•4h ago
Crazy cool, wow!
subjectsigma•4h ago
Just clicking around I accidentally highlighted the background element or something, which caused the whole page to turn blue. Then no matter what I clicked I couldn't get it to un-select. Making everything blue didn't ruin the experience or anything but it was a little annoying. Safari 18.5 (20621.2.5.11.8) and Google Chrome 138.0.7204.93.
humptybumpty•4h ago
Same on iphone. Maybe a swipe or something and it selected the whole page blue

Edit: doing nothing will do the autoselect. Odd

pvg•4h ago
I think that tint is intended to emulate the look of the Lisa CRT.
ayaros•4h ago
Yes, that's correct. There's a variety of palettes to choose from in the preferences!
rgovostes•4h ago
I had the same reaction, but it's intentional. Open the Preferences app, check Decorate Desktop, and then select something other than Pale Blue Dot from the color palette picker.
ayaros•4h ago
Unless the canvas element itself is being selected - which would be a big oversight on my part, that's the default color palette, which is a blue tint to mimic the Lisa's CRT. Right now, it isn't applied until the settings start loading.

If this is causing any confusion I might put a priority on saving this setting in a way where it can be applied immediately as the page is loaded.

subjectsigma•2h ago
I think you and other commenters are correct - it's just the theming. I can't get it to not have the tint on startup and it goes away when changing the theme as rgovostes described. The reason I was confused was because it starts out as black-and-white and then turns blue, and the blue is basically the same color as selecting text! Oh well, I feel silly now.
ayaros•2h ago
Yeah. This is part of why I wanted to get this on places like HN eventually. This is valuable user feedback! For the longest time I kept this project totally secret.

What I'll probably do is serialize the setting data to localstorage so it's available before the system starts up and loads from IndexedDB.

smokel•4h ago
Perhaps I'm doing something wrong, but the line widths in the characters are quite inconsistent. For example the two l's in "install" have different widths. This makes something pretty amazing look slightly disappointing.

(Tested in Firefox and Chrome on desktop.)

ayaros•4h ago
I'll take a closer look at this. Might be a kerning issue.

EDIT: I'm honestly not sure what this issue might be... If you're up for sending me a screenshot, there's an email link at the bottom of https://yaros.ae/.

rgovostes•4h ago
The shadow text style and fatbits editor in the Preferences app really took me back. Other than a lack of close buttons on windows, it's remarkable that you can strip away 40 years of UX "innovation" and the result is still productive and intuitive.

(Edit: Menus staying open after one click was a welcome improvement that I think came much later.)

layer8•4h ago
You can double-click on the icon in the top left corner of a window to close it. (Which, I guess, is just the shorthand for File > Set Aside.)
ayaros•4h ago
Yes.

Setting aside specifically places something on the desktop. Save-able documents have a "save and put away" option which "refiles" it back in its folder without putting it on the desktop.

You made me realize I still need to add a separate "put away" option on all windows regardless, so there's always a menu command that can be used to refile something.

The desktop isn't a normal directory - I discuss this in the readme a bit.

ayaros•3h ago
Yes, sticky menus arrived much later. I put the extra effort to add them here because everyone's so used to them now. Both options work - you can single-click to keep a menu open, or you can hold down the mouse and drag to open a menu which closes when you release the mouse.

There's at least one Mac extension I know of that lets you use sticky menus on earlier versions of Mac OS, like System 6. I figured I'd backport that feature a little further, so to speak...

EDIT: Also, forgot to mention it in this reply, but you double click the titlebar icon to close the window.

hackyhacky•4h ago
How did you research this? Do you own a Lisa?
layer8•4h ago
There are Lisa emulators out there: https://emulation.gametechwiki.com/index.php/Apple_Lisa_emul.... And you can find ROMs on macintoshrepository.org.
ayaros•3h ago
Yes I do, a Lisa 2/10! LisaEm was also invaluable. Also, just a general obsession with vintage computers and UIs helped quite a bit!
ayaros•4h ago
The Lisa doesn't have square pixels, so the canvas is scaled to be 1.5x as high as it is wide. This generally looks fine on high-dpi displays, because there's technically twice as much space to render with (pixels are 2px wide by 3px high). However, things will look distorted on a lower resolution display (where pixels are 1px wide by 1.5px high). That's just a compromise I made when designing this.

The good news is, if you have a large enough low-dpi display, and you make the window big enough, the automatic integer scaling settings will kick in, and the pixels themselves will be displayed larger. This can be forced via the preferences app (under the display options). If you screw this up, then restart LisaGUI while holding the shift key to reset the scaling settings.

EDIT: Unrelated to this, there are a couple minor bugs with PWAs on iOS relating to the positioning of the canvas. These can be resolved by rotating your device to a different orientation and then rotating it back to the original position... but this is annoying.

EDIT 2: To close windows, just double click the icon in the titlebar! This "collapses the window back into an icon."

ivape•1h ago
How do you handle dynamic window/font scaling regardless of browser size (you get it for free with html mostly).
ayaros•31m ago
It's integer scaling; it involves changing the width, height, and style attributes of the canvas dynamically. I have a whole class that handles this, and let me tell you it took a lot of effort to get working properly and involved juggling around quite a few parameters, including the DPI, the border width, the pixel aspect ratio, and more. I had to use a ResizeObserver object to detect changes in the size of the DOM's body element.

To get the canvas to be consistently smooth, I had to apply a lot of contrast using a CSS filter, and I set image-rendering to pixelated, IIRC.

FerkiHN•4h ago
Wow this is mega cool!
ayaros•3h ago
Thanks! <3
fitsumbelay•4h ago
very cool, plus so much tasty design and functional tips that spark inspiration. I really love that look of aliased type that still reaches for that calligraphic look that's _just_ beyond the GUI's capacity to display. Nostalgia shmacking me in the taste buds with this one ...
ayaros•3h ago
Yes. The text styles were fun to do. They aren't implemented the same way QuickDraw does it, but it's close enough.
londons_explore•3h ago
> minor bugs with PWAs on iOS

There are major bugs with PWA's, and I suspect most of them stem from the tens of billions of dollars per year of app store revenue that would be undermined if PWA's actually became useful...

frumplestlatz•3h ago
Users aren’t demanding and have never demanded good PWA support. I suspect it has more to do with that.
yoz-y•3h ago
Random people have no business of knowing what a “PWA” is. So of course they don’t ask specifically for that.

People asking for “I just want to have fully featured apps coming from wherever” are aplenty. Apple has pushed app snippets and in-AppStore one shot apps for a long time. These would be much better as PWAs.

Not because PWAs are inherently better. I believe native programs are superior. However history has shown that vast majority of apps are just poorly wrapped websites.

As an aside, iOS PWA support is really phoned in. For example they introduced environmental css variables for safe insets. And then provided no way to test them outside of real device or a simulator.

slivanes•2h ago
I’d bet they would if they were offered a nearly 30% price reduction.
ayaros•3h ago
Well, yeah... of course. Thankfully, mobile support hasn't been the highest priority.
dang•2h ago
We detached this subthread from https://news.ycombinator.com/item?id=44483280.
reconnecting•3h ago
Amazing turn on/off effect!
ayaros•3h ago
Thanks! I put a lot of effort into making sure it was just right. The delay right after shutdown before the button panel shows up where you see absolutely nothing before noticing your own reflection in the blackness of your screen was also intentional!
revskill•3h ago
Cool but color hurt my eyes.
ayaros•3h ago
In the preferences app, you can set the brightness after clicking "Set Conveniences," and you can change the color palette after clicking "Decorate Desktop." You may have to play around a little to find a setting that is most comfortable to you.
JSR_FDED•3h ago
This is amazing! Thanks for the excellent memories!
ayaros•3h ago
Thank you! I'm happy you enjoyed it!
jonathanlydall•3h ago
Very cool.

Something I recommend doing for the mouse cursor on mobile is to make it work like Microsoft’s Remote Desktop on iOS (possibly Android too, but I’m an iPhone user so don’t know for sure) where the cursor isn’t where you tap on the screen, but you kind of pan anywhere on the screen which proportionally moves the cursor which is somewhere not under your finger. It’s a bit hard to explain, you just need to try using RDP on Microsoft’s free Windows App on your mobile device.

ayaros•3h ago
Thanks. And yes, I did that! Under preferences, go to the touchscreen options panel, then enable trackpad mode!
john-aj•1h ago
That is surprisingly pleasant to use, actually!
ayaros•1h ago
Yes, one thumb on each side works great in landscape mode. Eventually I'll have to add some UI feedback to this mode when toggling it on or off, which shouldn't be too hard to do with a little CSS since the trackpad and button are just div elements overlaid on top of the canvas.
Avshalom•3h ago
> Author's note: I pronounce the letters in GUI separately. Why would you ever pronounce it "gooey?" Please don't do that. Just don't.

Solidarity!

johnklos•2h ago
...because fighting about silly things that are just fun to poke each other about is much more fun than fighting about things like politics in this day and age...

vi versus emacs, vi versus vim, (guh sound)IF versus (j sound)IF, m68k versus x86, Mac versus Amiga, BSD versus Linux, et cetera.

ayaros•2h ago
Yes, I know right! Imagine what kind of beautiful world we could live in if we spent trillions of dollars on this instead of the military industrial complex!
bbarnett•1h ago
Where I grew up, in the 80s, it was a toss between a mouse and trackball for people. Same sort of arguments.

I kind of like both.

ayaros•2h ago
Thankfully someone agrees with me!
bbarnett•1h ago
Initialisms are just that!

Otherwise, how can you tell snmp from sntp from smtp!

Avshalom•1h ago
There! Are! Dozens! Of! Us!

(actually there's a shit ton of us who learned computers via text and pronounce things correctly)

ayaros•54m ago
YES
wpm•1h ago
We should pronounce all acronyms/initialisms.

TUI = tooey

CLI = clee

TCP/IP = tickipip

GPT = gipity

DNS = dunce

HTTP = Hittup

USB = Oosbuh

USB-C = Oosbuhc

ayaros•54m ago
This is pure evil
hoistbypetard•5m ago
> GPT = gipity

I'm calling foul on that one. It's "Jay pay tay". Which sounds the same as the French phrase "J'ai pété" or "I farted."

That makes me laugh more than gipity.

g_host56•2h ago
very cool!
ayaros•1h ago
<3 <3 <3
sfblah•2h ago
So I played the puzzle game on this Lisa and it appears unsolvable to me, which sort of surprised me. Has anyone else given it a shot?

Here's a picture of how far I got: https://imgur.com/a/QhnnC4X

phyzix5761•2h ago
Yeah, I was able to solve it
ayaros•2h ago
Oh, it's totally solvable, but it's tricky! You kind of have to strategically "snake" the letters around a bit to sequentially place them in the right spots - you get less and less room to do so as you place more and more tiles.
Shorel•1h ago
If it is randomly generated, half of the puzzles are unsolvable.
Cieric•2h ago
This is pretty cool and it's surprising how well it works on mobile. I think the shuffle puzzle game has a bug where it can generate unsolvable puzzles. I ran into a parity issue. I solved it with the blank in the upper left but got no response from the game so I don't believe that was the intended solution.

Also checked with an online solver and it verified that there was no solution.

ayaros•1h ago
I haven't gone as far as verifying puzzles are solvable - right now I only verify the state of the puzzle is valid. Maybe in the future. For now I guess it will be like solitaire, where if you can't solve it you'll have to reshuffle it.

Incidentally, I'm planning on adding solitaire as the next game!

Shorel•1h ago
I remember making that puzzle in C++.

Half of the random states created are solvable, and the other half are unsolvable.

My solution was not checking if the puzzle is solvable (the mathematics of this seem complicated), but starting with a solved one and then do a fixed number of random movements.

ayaros•1h ago
That's a good idea.
Cieric•1h ago
Oh nice. I don't actually know how to play solitaire, but I know Microsoft used the method of randomly generating them, solving them and then saving solvable seeds. (I believe they had 2 that weren't solvable somehow though so maybe it was a human solving them and it was a typo or mistake)

Also, I was just checking around to see if there were any good methods for telling if a puzzle is solvable without solving it. Seems geeks for geeks have some code for it.

https://www.geeksforgeeks.org/dsa/check-instance-15-puzzle-s... The only other solution I can think of is detecting both configurations (blank in bottom right or top left) and displaying something when either is reached.

BubbleRings•35m ago
Great work, great memories on the Lisa.

But sheesh! The first time I play the numbers puzzle on a computer in my life, and the first time in 30 years that I play it at all, and I find out some joker has snapped two of the pieces out and reversed them, making it unsolvable?! Diabolical!

rustystump•1h ago
These are the kinds of show hn I live for. Tasty vanilla js + learning about an esoteric "Lisa GUI" well before my time. Bravo!

I would love to see a breakout style game or something in the demo/examples but that is my inner child speaking.

ayaros•1h ago
Thank you. That means a lot to me!

That's a good game idea. The next game I'm going to do will be solitaire. I was also thinking of trying to eventually make something like the mazewar game from the Xerox Alto to pay my respects to Xerox, although I know that will be an undertaking, especially adding in networking...

ckrapu•1h ago
Very cool.
ayaros•55m ago
Thank you!
DigiEggz•15m ago
Love both the project and the landing page design. Thank you for creating this!!
leakycap•11m ago
I never realized it, but I'd never even used an emulated Lisa - until today! Thanks for bringing life back to this old platform and letting us relive the thinking that led off the GUI. Cheers.
hoistbypetard•9m ago
I never spent a lot of time using Lisa, but I got several opportunities to kick the tires as a Mac repair tech in the early 90s. I even fixed a Lisa or two, and converted one to a "Mac XL". You've captured the UI really nicely, and it was fun to click around. Good job!
kaoD•8m ago
The font looks weird and uneven horizontally (some characters are "fatter" like if they were randomly bold). Is it supposed to look like that? Firefox + Windows.

A non-anthropomorphized view of LLMs

http://addxorrol.blogspot.com/2025/07/a-non-anthropomorphized-view-of-llms.html
48•zdw•1h ago•11 comments

Building the Rust Compiler with GCC

https://fractalfir.github.io/generated_html/cg_gcc_bootstrap.html
58•todsacerdoti•1h ago•0 comments

Intel's Lion Cove P-Core and Gaming Workloads

https://chipsandcheese.com/p/intels-lion-cove-p-core-and-gaming
28•zdw•1h ago•0 comments

I extracted the safety filters from Apple Intelligence models

https://github.com/BlueFalconHD/apple_generative_model_safety_decrypted
225•BlueFalconHD•3h ago•130 comments

Show HN: I wrote a "web OS" based on the Apple Lisa's UI, with 1-bit graphics

https://alpha.lisagui.com/
227•ayaros•5h ago•74 comments

Nobody has a personality anymore: we are products with labels

https://www.freyaindia.co.uk/p/nobody-has-a-personality-anymore
21•drankl•1h ago•14 comments

More than 1 in 5 Show HN posts are now AI-related, get > half the votes/comments

https://ryanfarley.co/ai-show-hn-data/
203•rfarley04•2d ago•117 comments

Jane Street barred from Indian markets as regulator freezes $566 million

https://www.cnbc.com/2025/07/04/indian-regulator-bars-us-trading-firm-jane-street-from-accessing-securities-market.html
180•bwfan123•9h ago•98 comments

Why English doesn't use accents

https://www.deadlanguagesociety.com/p/why-english-doesnt-use-accents
46•sandbach•2h ago•27 comments

Get the location of the ISS using DNS

https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/
249•8organicbits•11h ago•75 comments

Opencode: AI coding agent, built for the terminal

https://github.com/sst/opencode
100•indigodaddy•6h ago•23 comments

Functions Are Vectors (2023)

https://thenumb.at/Functions-are-Vectors/
142•azeemba•8h ago•75 comments

Backlog.md – CLI that auto-generates task files (took my Claude success to 95 %)

https://github.com/MrLesk/Backlog.md
65•mrlesk•3h ago•13 comments

Async Queue – One of my favorite programming interview questions

https://davidgomes.com/async-queue-interview-ai/
76•davidgomes•6h ago•52 comments

Lessons from creating my first text adventure

https://entropicthoughts.com/lessons-from-creating-first-text-adventure
16•kqr•2d ago•1 comments

I don't think AGI is right around the corner

https://www.dwarkesh.com/p/timelines-june-2025
102•mooreds•2h ago•123 comments

Crypto 101 – Introductory course on cryptography

https://www.crypto101.io/
7•pona-a•2h ago•0 comments

Metriport (YC S22) is hiring engineers to improve healthcare data exchange

https://www.ycombinator.com/companies/metriport/jobs/Rn2Je8M-software-engineer
1•dgoncharov•6h ago

Cool People [pdf]

https://www.apa.org/pubs/journals/releases/xge-xge0001799.pdf
63•ilamont•6h ago•18 comments

Corrected UTF-8 (2022)

https://www.owlfolio.org/development/corrected-utf-8/
31•RGBCube•3d ago•22 comments

Paper Shaders: Zero-dependency canvas shaders

https://github.com/paper-design/shaders
3•nateb2022•2d ago•0 comments

Hannah Cairo: 17-year-old teen refutes a math conjecture proposed 40 years ago

https://english.elpais.com/science-tech/2025-07-01/a-17-year-old-teen-refutes-a-mathematical-conjecture-proposed-40-years-ago.html
328•leephillips•8h ago•71 comments

Collatz's Ant and Σ(n)

https://gbragafibra.github.io/2025/07/06/collatz_ant5.html
21•Fibra•6h ago•3 comments

Toys/Lag: Jerk Monitor

https://nothing.pcarrier.com/posts/lag/
42•ptramo•9h ago•36 comments

Mirage: First AI-Native UGC Game Engine Powered by Real-Time World Model

https://blog.dynamicslab.ai
14•zhitinghu•22h ago•10 comments

Overclocking LLM Reasoning: Monitoring and Controlling LLM Thinking Path Lengths

https://royeisen.github.io/OverclockingLLMReasoning-paper/
46•limoce•10h ago•0 comments

Serving 200M requests per day with a CGI-bin

https://simonwillison.net/2025/Jul/5/cgi-bin-performance/
297•mustache_kimono•23h ago•265 comments

Hidden interface controls that affect usability

https://interactions.acm.org/archive/view/july-august-2025/stop-hiding-my-controls-hidden-interface-controls-are-affecting-usability
538•cxr•1d ago•382 comments

1945 TV Console Showed Two Programs at Once

https://spectrum.ieee.org/dumont-duoscopic-tv-set
32•pseudolus•1d ago•10 comments

LLMs should not replace therapists

https://arxiv.org/abs/2504.18412
51•layer8•2h ago•65 comments