[HN Gopher] Show HN: 90s.dev - Game maker that runs on the web
___________________________________________________________________
Show HN: 90s.dev - Game maker that runs on the web
Author : 90s_dev
Score : 208 points
Date : 2025-05-20 14:58 UTC (8 hours ago)
(HTM) web link (90s.dev)
(TXT) w3m dump (90s.dev)
| duxup wrote:
| I can't say I fully understand what this is / the capabilities,
| but man I love the aesthetic.
|
| It's interesting how an aesthetic can make an emotional impact
| and draw a lot more interest.
| 90s_dev wrote:
| Thanks!
|
| Explaining stuff _is so hard!_ In fact, this _entire article_
| is just me trying to explain what this is in the shortest way
| possible.
|
| Maybe the shortest version is: 90s.dev is an API around a
| 320x180 web canvas, designed specifically for making games and
| game maker tools, with sharing capabilities built-in, and an
| innovative GUI for making game maker tools quickly and easily.
|
| No, that's still too vague. I give up.
| dflock wrote:
| Show examples of things built with it?
| 90s_dev wrote:
| So far, only the built-in apps are made with it.
|
| You can click them on the desktop-thing when you open the
| app.
|
| So far the only finished app is fontmaker:
| https://90s.dev/os/#sys/apps/fontmaker.app.js
|
| Their source code for all built-in apps are in
| https://90s.dev/os/helloworld.zip (found on
| https://90s.dev/getting-started/download-sdk.html)
| danielvaughn wrote:
| It really is. It's almost harder than building the thing.
| Every time I try explaining my side project, I end up just
| saying "you know...it's easier if I just show you"
| 90s_dev wrote:
| Yep, that's why I decided to make the pages able to have
| interactive demos. Though only the hello world tour and the
| refs guide use it so far.
| dr_kiszonka wrote:
| I would put your text under "Welcome to 90s.dev." If
| possible, I would further simplify it. I took a stab at it
| below but I am no marketer (or a game maker),
|
| 90s.dev simplifies making games and tooling for game creators
| via:
|
| - an expressive API around a 320x180 web canvas,
|
| - built-in sharing capabilities,
|
| - an innovative GUI.
|
| Each bullet would link to a relevant part of the
| documentation. I think you also need a page with examples.
| 90s_dev wrote:
| Thanks, I'll definitely consider using that in the next
| launch.
| johnisgood wrote:
| Is 320x180 generally enough for anything interesting?
| 90s_dev wrote:
| Animal Well uses 320 x 180
|
| https://en.wikipedia.org/wiki/Animal_Well
|
| (In fact I partly made this app so I could make an Animal
| Well clone.)
| johnisgood wrote:
| I'll check it out.
|
| Would it technically be possible, without too much
| difficulty, to increase 320 x 180? Just wondering!
| 90s_dev wrote:
| Technically it is possible right now. If you create
| usr/config.jsln (sample file is in sys/default/) and set
| its size, the screen automatically resizes to it.
|
| I didn't document this because I'm not sure it's the
| right decision. Allowing screen resize does make it more
| flexible, but also leads to decision paralysis for most
| users, who 320 x 180 is probably perfectly sufficient
| for.
|
| That was one of the genius moves of pico8, which tic80
| failed to capture: offering the perfect set of orthogonal
| parameters for you, so you can just make stuff.
| johnisgood wrote:
| Oh, that is interesting. I think it could be worthwhile
| to document it for "advanced" or "power" users /
| developers perhaps, it is good to know that there is no
| such limitation, as I assumed there would be, meaning it
| is more flexible than I thought it to be!
| inanutshellus wrote:
| You can't both honor a constraint and give an out for it.
|
| Remember OG twitter and someone complained about the 140
| character limit. Imagine the reply was "ok fine we'll let
| you use more than 128 characters, but you have to click
| an 'advanced' tab." instead of the "be clever" retort we
| really got from Jack Dorsey. Immediately there'd be no
| constraint at all, just an annoying step where you had to
| click an annoying checkbox.
|
| Point being - if the design is intended to be
| constrained, then it's perfectly reasonable to own that.
| johnisgood wrote:
| I think your example is different, because we are talking
| about something that would be only my code, should it not
| be up to me? And even if it was not feasible right now,
| someone else would write the code to make it possible,
| for their own project. Twitter is not your product, you
| are only using it. And it is also possible to do it, so
| why not document it? That makes no sense. That is akin to
| security through obscurity.
|
| Also he said "but also leads to decision paralysis for
| most users", but it does not have to be the case. Default
| can be whatever you want.
| 90s_dev wrote:
| I think you're both right. It's tricky to know when to
| make something a default and when to make it a constant.
| Especially when it comes to users, who cannot all be
| pleased.
| johnisgood wrote:
| I think it would just kill flexibility, making it the
| default makes more sense to me, and you should leave it
| up to the developers using your product, but it is
| entirely up to you, of course. If I were to turn this
| into a constant, I would document it at the very least in
| the git commit message.
| 90s_dev wrote:
| I think a fun solution to this, and the one I adopted, is
| to leave these power features in here as easter eggs, so
| that devs are rewarded for finding them. At least for me,
| it gives me a sense of the fun and excitement of learning
| GUI dev during the 90s. The screen resizing functionality
| can be found by anyone who digs into the code a little.
| johnisgood wrote:
| That sounds fair to me!
| fidotron wrote:
| I like the aesthetic, but 16:9 and 90s computing together is
| just wrong.
|
| The back breaking not quite square trinitron monsters were the
| best.
| 90s_dev wrote:
| I chose 320 x 180 because of Animal Well. In fact, the whole
| app was originally conceived as a way for me to make an
| Animal Well style game, but more conveniently than using
| Pico8 (Billy Basso implied once that he used Pico8 to
| prototype Animal Well before moving to C++). I still think
| 320 x 180 is the right size for both games and game makers.
|
| For example, here's a very early (mostly broken) prototype of
| 90s.dev
|
| https://90s.dev/v1/
|
| Because of 320x180, it can fit the code editor _and_ the
| mapmaker or spritemaker on the screen at once, and each tab
| is big enough to be usable.
| 90s_dev wrote:
| I think I figured out how to explain it:
|
| I basically wanted to make a much more usable pico8 for game
| prototyping. Hence the 320x180 design, and this prototype:
| https://90s.dev/v1/ But I also wanted the full convenience of
| VS Code, including full type checking and autocompletion
| support for TypeScript. So I designed it to be a _platform_
| that can be used to make and publish the things that pico8 's
| tabs contain.
|
| Now I see that I released this much too soon.
| makapuf wrote:
| Nice, does it work on Firefox?
| 90s_dev wrote:
| I took great pains to make sure it does. The one thing that
| Firefox doesn't support is mounting a local drive so you can
| develop your app, library, or game more quickly, which needs
| https://developer.mozilla.org/en-US/docs/Web/API/Window/show...
| Narishma wrote:
| It doesn't on Firefox ESR.
| 90s_dev wrote:
| Odd. Not sure why.
| makapuf wrote:
| Same for me, it didn't work on firefox so I checked if it
| was only me. I also have ESR
| 90s_dev wrote:
| Downloaded FF ESR just now, working on fixing it.
| 90s_dev wrote:
| Ahh, figured it out.
|
| Firefox ESR doesn't return an iterator from map.values() with
| .find() etc on it.
|
| Okay, fixing now.
| 90s_dev wrote:
| Fixed!
| wonger_ wrote:
| Congrats on shipping!
|
| Based on https://90s.dev/getting-started/hello-world.html, it
| seems like JSX meets pico8. Is that a decent description?
| 90s_dev wrote:
| Thanks! Well, kind of. The JSX is mostly for making the apps
| that comprise gamemaker components, like pico8's spritemaker
| and mapmaker tabs. Once those apps are made, you can use them
| to make game assets. But those apps run in the same canvas that
| games would run in. A mapmaker and a game would use the same
| GUI for drawing into the canvas. But a game would probably
| create a single View and override its draw method to draw most
| of the game, though it could use JSX to build up the views that
| comprise game panels like Minecraft's inventory views.
| nico wrote:
| Looks very cool, just kinda hard getting started
|
| Maybe you could have a little walkthrough of how to build a mini
| game with it?
| 90s_dev wrote:
| Thanks.
|
| The current method of building a game is the same as the
| walkthrough for building an app[1], except you make a custom
| view and override its draw method. For higher performance, you
| can create an OffscreenCanvas and draw into it however you
| want. There's no API to wrap WebGL2 more conveniently than this
| yet.
|
| I definitely should and will wirte a guide that takes you from
| nothing to a full fledged game. But right now, the guides are
| all geared towards making apps, since before we can make games,
| we need to make gamemaker tools, like spritemakers and
| mapmakers.
|
| [1] https://90s.dev/getting-started/hello-world.html
| danielvaughn wrote:
| Love the idea. Ever since I played Dreams on PS4, I've been
| curious about collaborative game development interfaces.
| 90s_dev wrote:
| Collaboration has always been one of my favorite things.
| Shortly after starting this project, the focus began to center
| around making sure users could create first-class apps and
| libraries and easily find and use them in their own creations.
| Much of the API evolved around supporting this idea.
| Sayyidalijufri wrote:
| I think it little bit hard to start getting started
| 90s_dev wrote:
| You're right. I definitely need to put more work into making
| very full tutorials for this.
| eranation wrote:
| Love it, and congrats on shipping! I might be missing something
| but your pitch would be a 10x better launch if I could find some
| basic demo games developed with the engine, unless I just didn't
| look in the right place. Looking forward to the next update!
| 90s_dev wrote:
| I haven't made any games with it yet. I barely finished any of
| the game making tools. The platform _itself_ is relatively
| stable, which is what I spent so much time on. And the hope was
| that the community would help make the game making tools _and_
| the games. But maybe you 're right, maybe I have to finish some
| game maker tools, finish some games, and finish some tutorials
| to make game maker tools and games, and then relaunch in a few
| months.
| rubabu wrote:
| Do you have a video walkthrough of how this works?
| 90s_dev wrote:
| I tried to make it even more interactive than that. If you
| click any of the links on this site that start with `/os/#`
| then it will open (or close) an iframe under it that actually
| launches the app you're linking to. There's also an interactive
| demo on the hello world page: https://90s.dev/getting-
| started/hello-world.html
| 90s_dev wrote:
| Hi, author here.
|
| Thank you everyone for the feedback. It's clear that I launched
| this far too soon.
|
| I'll work on the pain points you all noted, and come back in a
| few months.
| dapperdrake wrote:
| Thank you for launching early.
|
| Definitely launch often.
|
| 10,000 iterations. One down. 9,999 more to go.
| 90s_dev wrote:
| Thanks! That's an encouraging way to look at it, as it allows
| me to ship something that's not 100% perfect yet. But I guess
| no matter how hard we try, it never really is, is it?
| worthless-trash wrote:
| No sir, you didnt launch too soon. You're doing great.
| 90s_dev wrote:
| Thanks! And you are not worthless trash, just in case your
| username was serious.
| electroly wrote:
| It's just right for a Show HN. I was able to find the Hello
| World tour and grasp what's going on here, from previous PICO-8
| and React experience. Looks pretty cool, and I think 16:9 is a
| good pick. PICO-8 being square is awkward.
| 90s_dev wrote:
| Thank you to you and the other replies. You're very
| encouraging. I'll keep iterating, making it more usable and
| its usage more clear. Maybe I can at least finish at least a
| few tasks while it's on HN's front page(!!!) based on
| everyone's feedback. Going to work on finishing the paint app
| right now, hopefully done within an hour.
| 9dev wrote:
| Absolutely not too soon! This is a great project; it's so
| amazingly, ridiculously overengineered, in the best way
| possible! The most beautiful bike shed I have ever seen. You
| even implemented your own reactivity system.
|
| I love it.
| 90s_dev wrote:
| Ha, thanks! Yeah the reactivity system was born out of trying
| to get stuff done quickly. I was tired of manually setting
| variables so I made it easy to "chain" and "adapt" them and
| stuff. Same thing with the (hacky?) auto-layout system.
| Shortcuts to get stuff done quick!
| sneak wrote:
| Why limit it to Microsoft services (github and npm)? Why not let
| it import things from a URL?
|
| Looking forward to your WC2 clone!
| bpshaver wrote:
| Not that you're asking, but https://www.littlewargame.com/ is a
| good WC1/WC2 clone with a lot of good QoL features included.
| 90s_dev wrote:
| Man I wish I was as good at pixel art as those people
| apparently are!
|
| That's part of why I made my app into a _platform_ where you
| can build apps but also share apps, libraries, and game
| assets. I can 't make a game all on my own! I'm hoping people
| make and share spritesheets with this, after someone makes a
| spritemaker app of course. I'll keep working on my basic one.
| 90s_dev wrote:
| Thanks!
|
| Actually I am planning on shifting it towards importing
| 'https://' URLs directly.
|
| Honestly, the main difficulty I have is keeping full TypeScript
| support of remote modules. It's actually _easier_ to do this if
| I import https:// modules directly, though it's not as
| convenient as it could be[1].
|
| But I'm also trying to figure out whether I should continue to
| compile TSX to JS in the service worker[2], which requires no
| special dev-time setup and allows publishing raw .tsx files
| anywhere on the net such as github, or require users to compile
| TSX -> JS ahead of time, which would require a build step.
|
| On top of that, I'm considering going further and making it so
| packages can import bare-specifiers like `import "somelib"` and
| publish a plugin to compile this into an https:// import
| specifier.
|
| [1] https://stackoverflow.com/questions/79628025/is-there-a-
| way-...
|
| [2] I currently use a service worker to map imports like
| `/os/fs/{ghb,npm}/...` to `jsdelivr.net/{gh,npm}/...` and
| compile them and return with the right content-type.
| winslow wrote:
| Does the paint app work for anyone?
| https://90s.dev/os/#sys/apps/paint.app.js
|
| I tried in both Firefox and Chrome on Linux and picking colors
| and clicking I can't draw anything. No logs in the console that
| alert something is wrong.
|
| On a different note I think you've captured the 90s really well.
| I had a moment of realization that the 90s really were like this.
| On first look I was thinking this was more 70s/80s terminals.
| Looking forward to seeing where you take this.
| jszymborski wrote:
| Not working for me either.
| 90s_dev wrote:
| How about now?
| jszymborski wrote:
| Works great!
| electroly wrote:
| I'm not sure it's implemented yet. If you click the "hash"
| button in the upper-left of the window, you can click "View
| Source". From there you can see it's just a mocked up UI, the
| scroll area just draws pinstripes.
| 90s_dev wrote:
| You were right, it wasn't at the time. It works now, except
| for undo/redo.
| 90s_dev wrote:
| Oh, no, sorry for the confusion. The color picker is as far as
| I got with that app, it's relatively new. I can probably get it
| fully working within an hour though.
|
| Also thanks, that's exactly what I was going for! I wanted to
| capture the fun and excitement and raw power of creating GUI
| apps in the 90s (but without all the inconveniences). Hence the
| name 90s.dev
| 90s_dev wrote:
| Working on paint app[1] now:
|
| - [x] Add canvas with semi-transparent background
|
| - [x] Make canvas resizable by dragging corner (min 1x1)
|
| - [x] Show grid on canvas if grid button is checked
|
| - [x] Make zoom adjustable by clicking and dragging zoom
| number up/down
|
| - [x] Show selected color as square over canvas during mouse
| move
|
| - [x] Allow click/drag to change square colors
|
| - [x] Right-click/drag to erase squares
|
| - [x] Support loading/saving bitmap
|
| Hopefully I can finish it while this comment is editable! :D
|
| As features are added, you will see them in the source code.
| Either:
|
| 1. Click the top-left button and click View Source
|
| 2. Download helloworld.zip from Downoad SDK and view
| /fs/sys/apps/paint.app.js
|
| 3. Open https://90s.dev/os/fs/sys/apps/paint.app.js in an
| incognito window
|
| These all show the same live copy of the source for the paint
| app. The reason for the incognito window is because the
| service worker compiles TSX to JS at runtime.
|
| [1] https://90s.dev/os/#sys/apps/paint.app.js
|
| [edit] Ha, I did it! I got all the features working before
| the edit button went away! But it was about 2 hours, not 1.
| As a bonus I'll try to work on undo/redo.
| sureglymop wrote:
| Hey don't stress yourself out okay :) This is so cool,
| cooler than 90% of stuff I see usually see in these posts.
| 90s_dev wrote:
| Thanks, though I'm not stressed. It's an exciting and fun
| challenge to see how much I can get done with my fancy
| GUI API before the edit button goes away :)
| Thoreandan wrote:
| Mentioning the licensing up front would be nice.
| 90s_dev wrote:
| It's basically MIT. I used to have it injected at the top of
| the source files. I forgot why I took it out.
|
| [edit] Just added MIT licenses to the top of all the files.
| roskelld wrote:
| Trying to load it on Firefox (Floorp Browser variant 11.26.0) and
| the examples get stuck on the `Loading` screen. Moving my mouse
| over it draws the cursor and leaves it imprinted on screen so you
| get that permanent trail effect.
|
| In the console I see: Failed to load
| 'https://90s.dev/os/fs/run? code=H4sIAAAAAAAACk2QMW%2BDMBCFd%2F%
| 2BKa4QEKAiiKlMVs1Rqlw4dmy0GjsSNsRE2TVKL%2F16DSYq3d3ef797jTas6A6zl
| CVgIEnhFabBL4L1TfbtP4IMVKGb5BQPUnWogzJTOHJN%2B65AQdmF8%2BiJtOxR9h
| fqNS65PWBFSKqkNlKqXBigE0SaeS1yWrhDFQHPfTn%2BY6HG9vjMtkyjcyP%2Fv%2
| BqbThp3xc%2BxEFiRr8AVWJxRCwUV1olrBkBCAnTcBmv8itXc0GOUABSvPR%2BdGV
| tRurtvp1fWQO86R3jYcWUvtdi668pQCGLwaGi72PYWQPWbmiCb0%2BYG6RtEboyRo
| cxNIQ90XDTchsNJwJal1QQx5KXh5hgZ3mR9e0IvV1gfFKtaaSI7JHSYQKwisHMDwB
| vUhHhZHZf6q2Z1X%2B1HtMh9STmJCpqzTWpW99uHGfz0j7XEYAgAA'. A
| ServiceWorker passed a promise to FetchEvent.respondWith() that
| rejected with 'TypeError: Array(...).keys().map is not a
| function'.
|
| Seems to work fine in Chrome though.
| 90s_dev wrote:
| Thanks for letting me know. Hmm, I don't know what Floorp is
| doing differently. I'd need more of a stacktrace. It works in
| regular Firefox though. Feel free to paste a stacktrace and/or
| stacktrace screenshot on the issues page and I'll take a look.
| Narishma wrote:
| I have the same problem as OP on regular Firefox ESR.
| 90s_dev wrote:
| Just fixed! Thanks for the feedback.
| 90s_dev wrote:
| It should be fixed now! Can you try it again?
| roskelld wrote:
| Tested and it works now!
| gtoast wrote:
| I'm stuck on the first step of the "Getting Started" guide.
|
| 1. I've downloaded helloworld.zip to my local computer, I think.
| 2. I open the filer.app.js by clicking the link on the webpage.
| This open a 90s.dev instance right on the page. 3. Then i'm
| supposed to mount helloworld/app as app and click it, so i click
| the mount button, it asks for the drive name, hi put in
| helloworld/app and click mount but nothing happens.
|
| I must be missing how you're supposed to get helloworld.zip into
| the 90s.dev instance... how do you upload it into the instance?
| 90s_dev wrote:
| Thanks for the feedback.
|
| You're likely using Firefox, right? This feature relies on
| showDirectoryPicker which Firefox doesn't support. You'd have
| to use Chrome for the getting started guide.
|
| Also, the drive name shouldn't have a path. Name it something
| like "foo". I'll udpate the guide to reflect this. Then
| foo/helloworld.app.js will point to
| /some/local/path/helloworld.app.js, as long as you mounted
| "foo" to point to the directory at "/some/local/path"
| kleiba wrote:
| Boo for "Chrome only"!
|
| Could you find a work-around to support firefox as well?
| 90s_dev wrote:
| I took great pains to support Firefox, mostly in my service
| worker.
|
| Unfortunately when it comes to mounting drives for faster
| local development, there's nothing I can do until FF
| supports `showDirectoryPicker`
|
| However, you could just load up a local file server in your
| local directory (python -m http.server 8080) and import
| your file directly: import
| 'http://localhost:8080/index.js'
|
| Then put that one line of code inside usr/myapp.app.js and
| click it in filer[1]
|
| You'll have to use filer to create the file and edit it by
| right-clicking, then type it in and ctrl-s to save or use
| the top-left menu button.
|
| I'll add all of this to the website under some "Using
| Firefox" page or something, for people who can't stand
| Chrome.
|
| [1] https://90s.dev/os/#sys/apps/filer.app.js@usr/
| MrGilbert wrote:
| I love what you did there! It's an awesome project. I directly
| traveled back to my childhood. While I love pico8, I think it's a
| decade too early for me. I grew up with desktop and gui. This
| feels like buying a CD again.
| 90s_dev wrote:
| You might also be interested in Picotron[1], made by the same
| guy who made Pico8. It's basically a desktop OS with the same
| basic design as Pico8 but with slightly looser restrictions.
| I've never really tried it, only looked at his gifs once a long
| time ago, but I think he and I had the same basic idea: make a
| _platform_ that you could make pico8 _in_. We just went
| different routes.
|
| [1] https://www.lexaloffle.com/picotron.php
| 90s_dev wrote:
| It just occurred to me:
|
| Pico8 is to Picotron, as Tic80 is to 90s.dev
|
| or
|
| Pico8 is to Tic80, as Picotron is to 90s.dev
| MrGilbert wrote:
| Thank you! Yes, I'm aware of picotron, I tried the very first
| version of it. I think it's also a great environment. I first
| bought Voxatron years ago, because I really liked the tech
| behind it, and got kinda sad that it didn't evolve.
|
| Anyways, thanks for pointing me to picotron! Think I'll have
| to keep an eye on both projects.^^
| 90s_dev wrote:
| Thanks. Oh man I remember buying Voxatron and thinking it
| was such a cool idea, but not knowing how to use it at all
| or what to do with it beyond the demos. I guess the guy
| behind it probably ran into the same issue. Still a cool
| idea.
| habedi0 wrote:
| This is pretty cool!
| _zaidahmad wrote:
| I'm not even from 90s but this is so cool!!
| 90s_dev wrote:
| Thanks! Hopefully it'll give you an idea of how fun it was to
| make GUI apps in the 90s!
___________________________________________________________________
(page generated 2025-05-20 23:00 UTC)