June 16, 2025
I hate physics
So I finished the docs and they are up and running: https://retrogradedev.github.io/goofy-os/
I hate Jekyll and this theme I picked, but I don't really have time to make something else
Big FS update! We update the lastaccessdate field on file read, but more importantly, we support copying, moving and renaming files! Most of the time spent on this was making the moving/renaming more efficient (instead of copying+deleting the file, we just change the metadata)
So I made the backbuffer optional and measured the timing difference, and damn it's fast. I can't upload more than one screenshot, but it's also much more stable. This screenshot is a comparison of the original fb (top) and new backbuffer (bottom), based on 2 new screen recordings, taken at exact the same moment. The framebuffer is 10-40x times faster (depends on how many pixels have changed).
I finally implemented a basic backbuffer for the VGA framebuffer. The VGA buffer is quite slow, so we write to this second (faster) buffer and copy all the dirty regions when needed. It's still a bit slow so I have to find our whether this is the user->bb or bb->fb part, but I'll start with making this configurable, so I can test the performance impact.
I did quite some work before deciding to make this a real project, so here is a list of things I did already:
- setup a new vite project (duh)
- create a basic physics engine (extremely buggy)
- wrote a render for visual feedback, but it's just a rectangle
- created a basic input/output script executor, with an extremely good example script (PID stuff)
IT'S WORKING! Finally, after all this time, context switching is WORKING with CPU register saving/restoring. The only weird thing: it doesn't work when I turn my battery saver on (I have no idea why lol).
I'm gonna try to merge my old branch where I develop process support with my main branch, maybe slower interrupts fix it?
Ladies and gentlemen we have a…. FILESYSTEM (and a extremely basic file explorer)
We have a basic FAT32 implementation and an ATA disk driver, so we can read, write and update files like a real OS! We can forward a FAT32 formatted .img file to QEMU which our ATA driver can read. The FAT32 parser will parse and process all data or send data back to the ATA driver, which will write it to the disk, so we can reboot and still access our files!
The next bunch of updates will include:
- update to the file explorer GUI to support folders
- parse and write long names (currently we only support the 8.3 format)
- parse metadata time and dates
- parse hidden and read only flags
- make our notepad able to write to the FS
- and FS data to the sysinfo app
Sysinfo app! This was actually quite hard to make, because I had to find a way to get info about our CPU, memory, stack, heap, ... The rust raw_cpuid handles all the hard work related to our CPU. Stack tracking is quite simple: at the entry point save our stack pointer. When we want to get the ucrrent usage, simply fetch the pointer again and calculate the difference.
For the heap: we just change a var each time we do alloc/dealloc
Spent some time polishing our UI. The biggest improvement is probably our way cleaner way of rendering text (you probably won't see this on the screenshot unless you zoom it, but it's WAY smoother). This was actually quite a simple fix: instead of doing color = text_color * pixel_opacity, we do color = text_color * pixel_opacity + bg_color * (1 - pixel_opacity)
I'm here to present: the CALCULATOR!!! I implemented a window manager that keeps track of all apps open and forwards events to them, and this is a example app made with it!
Next up: maybe add a notepad/sysinfo app, improve our Surface* api to rerender only changed parts and polish colors.
Surface API = the piece of code that makes us able to render shapes without rendering them pixel per pixel to the framebuffer
We're ready to ship again! Quick summary of all changes:
- A 10x faster code runner (old one was way to slow, see devlog for details)
- GitHub and Slack OAuth (I saw that the reviewer spent quite some time generating a fake email for the login form, so this is faster)
- Avatars linked to your GH or Slack
- User settings: Change your name, username or link and unlink social accounts.
- Separated username and name in the db (better security, cleaner code and you can now choose 2 types of names!)
- Improved security of the code runners
- Integrated react-hook-form with our auth and setting forms, resulting in a faster feedback loop (so you directly know a username isn't available without clicking a button)
- Some UI changes
I added support for loading github and slack avatars when linked.
Finally, a MASSIVE code runner runtime improvement! We went from 20-60 secs benchmarking a problem with 3 test cases to 3-10 secs! I did this using 2 clever tricks: running all tests in a single code runner process, and keeping a pool of code runners in the background waiting until a user wants to run their code, leading to way faster startup times.
I also updated the code runners to kill itself if the code execution takes longer than 20 seconds.
Upgraded our auth forms to use react hook form, resulting in faster and better form validation
Rewrote our navbar so it works 100% using CSS, without React states, making it way faster to render and more responsive. This took way longer than I wanted :(
Way faster and easier form validation using React-Hook-Form, instead of using our own regex when the user clicks "save). Only implemented it for the settings so far, but it should be much easier to do for the auth pages now.
Probably not worth mentioning it but I made better popups instead of using javascripts alert(). I got an idea that could make our code runner way faster (I saw how long the reviewer had to wait in the proof video), but I didn't implemented it yet
We finally use the real username plugin instead of using the name field. This required some SQL changes and I'm very scared to destroy our prod database, but it works on my machine :)
Very basic settings
Github OAuth support!
Slack OAuth support!
Changed alot of server and docker configs. I also added some labels to let users know about possible wait times and timing inaccuracy. There also is a problem with our db which causes the site to sometimes go down for a few minutes, but I think this is Nest's fault.
We now override the default right-click context menu when clicking in the editor
You can now delete components. Next up: delete and edit wires
We finally have user processes! This took me so long. The final fix was running kernel code using JUMP instead of just calling the entry point. I'm so happy lol, this feature took me 15h (!).
I also installed Zed editor, it's blazing fast but for some reason didn't it log all my time...
Wires! You can also drag components.
We can render components! Wires and dragging components are next
I set up the basic classes and folder structure, and we can draw a grid! Thats it, the buttons don't work
You can... well... simulate electronics, you know?
I got the ELF loading to work, but when the program sends the exit syscall, we can't return to kernel mode for some reason. I spent for 3h debugging it, without a result. I even asked Claude (my original plan was no AI 🥺), but that made it worse, so I think I'll just revert all commits...
Goofy OS is a lightweight, feature-rich operating system built from scratch in Rust. It aims to provide a modern computing experience while showcasing advanced OS concepts and design principles. We feature: - Memory management - Interrupt handling - I/O Handling - Userspace and ELF loading - A fully working desktop env (This might seem very unclear, please check the repo for more details here: https://github.com/RetrogradeDev/goofy-os)
Refactor, realistic and map view
We've launched our site! Check it out at: https://bytesarena.programordie.hackclub.app/
(Just docker stuff this commit)
Render planets
Celestial bodies. I hate maths.
Setup physics engine (rust wasm) and the frontend. Not as easy as I expected, but hey, it works!
A cool rocket simulator
Setup a build script and spent 30 mins fixing a cache bug, which turned out to be not my fault. Now waiting for my ID to be approved for Nest...
A new icon, metadata, a lot of small fixes and a REAMDE. I think we are coming closer to launch...
We support array types! I also added a profanity filter, so you can't swear anymore, sorry...
Finally, after all this time, secure execution on the backend, so finally timed execution time! I needed Docker for this, it's not as scary as it looks like!
Started working on the leaderboard, split some code and updated the styles. I hate CSS.
We now accept one solution per language instead of one per puzzle!
Completed profiles 💪
Finished the homepage, improved execution, updated UI, hated Python for having indents, ...
Forgot to commit 🤐
Compete to solve programming puzzles with the fastest or shortest possible solutions. Submit your own challenges, vote on your favorites, and see who can crack the daily featured problem. Sharpen your skills, challenge the community, and climb the leaderboard—all in one fun, fast-paced platform.
This was widely regarded as a great move by everyone.