|
1912
|
Something in Hardware by @tejusj98 | Stardance
|
tejusj98
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-03T03:46:03Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I made: I built a custom 3-key vertical mechanical macropad optimized for streamlined, rapid-fire gaming inputs (perfect for fast character swaps or macro hotkeys). The hardware is powered by a Seeed Studio XIAO RP2040 on a custom 2-layer PCB, and it runs on KMK (CircuitPython) for easy, plug-and-play configuration. What was challenging: The biggest hurdle was wrestling with the CAD modeling workspace in Fusion 360. Ensuring the custom “sandwich-mount” enclosure perfectly accommodated the 0.4mm printing tolerances of my PCB while precisely lining up 2.90mm screw holes through both the top plate and bottom tub took some meticulous alignment and timeline troubleshooting. What I’m proud of: Instead of just copying the standard horizontal/landscape layouts from the documentation, I stepped out of my comfort zone to design a unique, minimalist vertical column layout. Hand-routing the PCB and tailoring a custom case around that vertical layout from scratch felt incredibly rewarding. What to know for testing: Because the firmware relies on KMK, it is completely beginner-friendly and handles remapping on the fly. You can just open up main.py in the repository, edit the keymap array to whatever bindings or macros you want, and drop it straight onto the board like a flash drive—no massive C compilers or development environments required.", "repo": "https://github.com/tejuas98/my-first-macropad", "demo": ""}]...
|
[{"post_id": 1257, "ts": "2026 [{"post_id": 1257, "ts": "2026-06-03T03:43:18Z", "hours": 0.3667, "text": "Exploring KidCad features “it feels so tuff”"}, {"post_id": 955, "ts": "2026-06-02T18:40:23Z", "hours": 0.3667, "text": "My first thing in hardware is A Unique Hack Club Macropad"}]...
|
Title: Something in Hardware by @tejusj98 | Starda Title: Something in Hardware by @tejusj98 | Stardance
Devlogs:
My first thing in hardware is A Unique Hack Club Macropad
Exploring KidCad features “it feels so tuff”
Ships:
What I made: I built a custom 3-key vertical mechanical macropad optimized for streamlined, rapid-fire gaming inputs (perfect for fast character swaps or macro hotkeys). The hardware is powered by a Seeed Studio XIAO RP2040 on a custom 2-layer PCB, and it runs on KMK (CircuitPython) for easy, plug-and-play configuration. What was challenging: The biggest hurdle was wrestling with the CAD modeling workspace in Fusion 360. Ensuring the custom “sandwich-mount” enclosure perfectly accommodated the 0.4mm printing tolerances of my PCB while precisely lining up 2.90mm screw holes through both the top plate and bottom tub took some meticulous alignment and timeline troubleshooting. What I’m proud of: Instead of just copying the standard horizontal/landscape layouts from the documentation, I stepped out of my comfort zone to design a unique, minimalist vertical column layout. Hand-routing the PCB and tailoring a custom case around that vertical layout from scratch felt incredibly rewarding. What to know for testing: Because the firmware relies on KMK, it is completely beginner-friendly and handles remapping on the fly. You can just open up main.py in the repository, edit the keymap array to whatever bindings or macros you want, and drop it straight onto the board like a flash drive—no massive C compilers or development environments required....
|
1793000994.9766853
|
1793087394.9766853
|
|
1920
|
Grove by @EthanK | Stardance
|
EthanK
|
1
|
6.94
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-01T19:07:01Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a desktop application that is available on all platforms, mobile coming soon. It is built on Tauri, a lightweight equivalent to electron with a bit of rust backend, and with its light infrastructure of majority being a single HTML file, this make the app very light, about 9MB. I developed this look through experimentation and brought it out to this project, designed to be a subscription free, nicer, opensource, simpler version of TickTick, an app I use very much everyday. Hope you all enjoy the feel of the carefully crafted animations and the simplicity of this app. As always, I am always open to suggestions and feedback and the landingpage it is hosted on even has a place for you to add your feedback with github issues or you can always send me an email. I will continue expanding on this project as I am getting more and more ideas for it and i will try my best to keep the releases always updated with the latest changes. Enjoy!", "repo": "https://github.com/3t1-1aN/Grove_organic_todo_website", "demo": "https://grove-todo.vercel.app"}]...
|
[{"post_id": 6019, "ts": "2026 [{"post_id": 6019, "ts": "2026-06-10T02:50:40Z", "hours": 0.5522, "text": "In general for anyone checking out the app in its beta stage: if something’s unclear, start by checking the onboarding guide. Additionally, explanations for all the app’s features are covered on the landing page. if it is still not mentioned there or you find it really unclear, please put it as an issue for me to check out on my github and I will gladly make the required changes. Thank you"}, {"post_id": 3656, "ts": "2026-06-06T18:07:01Z", "hours": 3.3828, "text": "Made the app android compatible while adding quality of life features overall"}, {"post_id": 385, "ts": "2026-06-01T18:56:17Z", "hours": 3.3969, "text": "added a page to my product landing page to post screenshots of the actual product"}]...
|
Title: Grove by @EthanK | Stardance
Devlogs:
adde Title: Grove by @EthanK | Stardance
Devlogs:
added a page to my product landing page to post screenshots of the actual product
Made the app android compatible while adding quality of life features overall
In general for anyone checking out the app in its beta stage: if something’s unclear, start by checking the onboarding guide. Additionally, explanations for all the app’s features are covered on the landing page. if it is still not mentioned there or you find it really unclear, please put it as an issue for me to check out on my github and I will gladly make the required changes. Thank you
Ships:
This is a desktop application that is available on all platforms, mobile coming soon. It is built on Tauri, a lightweight equivalent to electron with a bit of rust backend, and with its light infrastructure of majority being a single HTML file, this make the app very light, about 9MB. I developed this look through experimentation and brought it out to this project, designed to be a subscription free, nicer, opensource, simpler version of TickTick, an app I use very much everyday. Hope you all enjoy the feel of the carefully crafted animations and the simplicity of this app. As always, I am always open to suggestions and feedback and the landingpage it is hosted on even has a place for you to add your feedback with github issues or you can always send me an email. I will continue expanding on this project as I am getting more and more ideas for it and i will try my best to keep the releases always updated with the latest changes. Enjoy!...
|
1792979765.0658946
|
1793066165.0658946
|
|
1923
|
My first slack bot! by @ghostyt7582 | Stardance
|
ghostyt7582
|
1
|
1.35
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T17:55:01Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a basic slack bot with some commands. A ping command, a whitelist command (lists whitelisted users), an echo command for whitelisted users, A help command (lists all commands), and a random command that spits fun facts. This was my first introduction into node.js and it was not as hard as i thought it would be.", "repo": "https://github.com/GhostService/HC-stardance-slack-bot", "demo": "https://slack.com/oauth/v2/authorize?client_id=2210535565.11258825024868&scope=users:read,app_mentions:read,channels:history,chat:write,commands&user_scope="}]...
|
[{"post_id": 2400, "ts": "2026 [{"post_id": 2400, "ts": "2026-06-04T21:11:36Z", "hours": 0.3508, "text": "I added better logging to console, and i also added comments in my code. I also updated the README.md per reviewer request."}, {"post_id": 925, "ts": "2026-06-02T17:49:52Z", "hours": 0.4131, "text": "I added a command that lists all whitelisted users and their corresponding IDS."}, {"post_id": 906, "ts": "2026-06-02T17:15:59Z", "hours": 0.3036, "text": "Today I cleaned up the structure of my code and I implemented 2 new features. One is a whitelist for slack ids (currently stored in ENV but i will be making a command later) and the other is an echo command that does exactly as it says when a whitelisted user runs the command."}, {"post_id": 342, "ts": "2026-06-01T17:21:22Z", "hours": 0.4183, "text": "I copied most of the code from the guide and added some other stuff, a empty README file, another command, a example gitignore i found online, and an example .env file."}]...
|
Title: My first slack bot! by @ghostyt7582 | Stard Title: My first slack bot! by @ghostyt7582 | Stardance
Devlogs:
I copied most of the code from the guide and added some other stuff, a empty README file, another command, a example gitignore i found online, and an example .env file.
Today I cleaned up the structure of my code and I implemented 2 new features. One is a whitelist for slack ids (currently stored in ENV but i will be making a command later) and the other is an echo command that does exactly as it says when a whitelisted user runs the command.
I added a command that lists all whitelisted users and their corresponding IDS.
I added better logging to console, and i also added comments in my code. I also updated the README.md per reviewer request.
Ships:
This is a basic slack bot with some commands. A ping command, a whitelist command (lists whitelisted users), an echo command for whitelisted users, A help command (lists all commands), and a random command that spits fun facts. This was my first introduction into node.js and it was not as hard as i thought it would be....
|
1792994213.0638123
|
1793080613.0638123
|
|
1942
|
Apollo 15 Lunar Rover Model by @fish-in-a-puddle | Apollo 15 Lunar Rover Model by @fish-in-a-puddle | Stardance...
|
fish-in-a-puddle
|
1
|
10.69
|
52
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T23:43:46Z", "hours": 10.0, "multiplier": 5.0, "payout": 52, "blessing": "neutral", "text": "The Apollo 15 Lunar Rover Model V0 is a prototype for an Arduino-powered, Bluetooth-controlled model of the Lunar Roving Vehicle used for the Apollo 15 mission. A few months ago, I watched the NASA livestream where they announced the contracts for various lunar missions. After watching an hour of cool new design presentations, I was inspired to make a project that pays homage to the Apollo missions. Enter the Apollo 15 Lunar Rover Model! It can be controlled manually with Bluetooth controls or set to drive itself with the help of two ultrasonic sensors and two IR sensors. There are also two LED “headlights” that can be controlled manually or turn on and off automatically based on the light level (detected by a photoresistor). The servo motor, which will eventually have a decorative receiver dish attached to it, turns from side to side randomly. Before I could make it look cool, though, I had to test all the different parts and make sure they could a) fit in the chassis size I wanted to use and b) actually work the way I expected. This project has been a great learning experience so far - I’ve improved my coding skills a lot and I’m going to learn a lot about 3D modeling in the next couple weeks as I create the chassis for the V1. The hardest part of making this project has been working with the cardboard frame. Cardboard is great for prototypes because it’s super cheap and easy to cut and glue, but it tends to sag after a week. Plus, it’s not pretty and really takes away from the whole “model” thing. But using the cardboard did work well for the V0 and I’m proud of how it’s turned out.", "repo": "https://github.com/fish-in-a-puddle/Apollo_15_Lunar_Rover_Model", "demo": ""}]...
|
[{"post_id": 56956, "ts": "202 [{"post_id": 56956, "ts": "2026-08-29T00:17:36Z", "hours": 0.6867, "text": "Today I finally got back to work on the 3d model and made a tester to print and make sure everything fits. Tomorrow I’ll actually print it (my 3D printer isn’t big enough for the whole thing to fit on the plate, so I’ll cut the model in half and put it together post printing). I only got a couple hours of sleep last night so this devlog is brought to you by boygenius which I listened to so I wouldn’t fall asleep. thank you boygenius save me boygenius PLEASE BOYGENIUS PLEASE SAVE ME"}, {"post_id": 49247, "ts": "2026-08-17T22:42:02Z", "hours": 1.4503, "text": "So, I’m a couple days late but I’m about to ship! Finished adding images and videos, added instructions for using a Bluetooth app (the custom one did not work out because mit app inventor is not super good at finding Bluetooth devices) and updated my bill of materials."}, {"post_id": 47183, "ts": "2026-08-14T21:57:16Z", "hours": 1.9664, "text": "Wrote the README and organized some of my files. Still need to take and upload images/demo video and test the control app but otherwise it is done. If all goes well, I will ship the project tomorrow!"}, {"post_id": 47031, "ts": "2026-08-14T17:01:54Z", "hours": 0.8931, "text": "Unfortunately, my Lapse is not recognizing that I have a Hackatime project to sync with so imagine I have about two more hours of logged time here :( but ANYWAYS the code is DONE! The app just needs to be TESTED! I am WRITING the DOCS and once I’m done of that, the Apollo 15 Lunar Rover Model v0 will be SHIPPED! Are you happy? I’m happy. But seriously, I just need to make a wiring schematic, a tutorial for building the cardboard frame, a demo video and write the README."}, {"post_id": 44792, "ts": "2026-08-10T20:06:17Z", "hours": 0.4892, "text": "I LOST MY TIMELAPSE TO THE CRUELTY OF HACKATIME ;-; so it says half an hour but it was actually more like an hour and forty-five minutes that it took to get the bluetooth and auto drive to work in one sketch, finish the first draft of the app and start writing the bill of materials. Integrating the auto drive into the bluetooth sketch was actually way easier than expected and working the commands into the app wasn’t too tricky either. The bill of materials, though, may actually kill me. Stay tuned to find out if I survive long enough to ship this guy."}, {"post_id": 42896, "ts": "2026-08-07T21:02:48Z", "hours": 2.2628, "text": "The rover model can now be controlled using bluetooth! After a couple hours of troubleshooting, I was able to use an arduino bluetooth serial app I downloaded from the app store (the custom app isn’t ready) to send commands to the rover. The next step is to make it possible to turn the self-driving mode on and off through bluetooth."}, {"post_id": 41335, "ts": "2026-08-05T14:17:30Z", "hours": 1.4761, "text": "Over the past few days, I have tested several different configurations of sensors to give the rover the ability to navigate on its own. The most effective setup ended up being two ultrasonic sensors on the front of the rover and an IR sensor on each side. I’ve tested it several times and these sensors seem to be picking up about 80-90% of the objects in the robot’s path, which I am satisfied with for now. The next step is to add bluetooth controls to the rover so it can be driven using an app. I will start by using a bluetooth serial app that I already have, but I will eventually build a custom app as well."}, {"post_id": 38270, "ts": "2026-07-31T16:08:00Z", "hours": 1.9297, "text": "Finally, the Lunar Rover model can be built! After waiting a while for the motors to arrive, I built a cardboard frame as a prototype and 3d printed some wheels to get the rover rolling. So far it only runs a test sketch to go forwards, backwards and turn a bit (which really freaked out my dog), but next I’m going to have it navigate on its own using an ultrasonic sensor. Then I’ll add some of the extra features, like Bluetooth control, headlights that turn on when it’s dark and a servo to make the receiver dish sweep from side to side. I do realize that at the moment this guy looks absolutely nothing like the actual lunar rover, but I will be modeling a 3d printed chassis and painting it to look like the real thing. Plus, I’m going to add two little astronauts in the seats, because this was not an autonmous vehicle. It was similar to a space golf cart and by god I will do it justice."}]...
|
Title: Apollo 15 Lunar Rover Model by @fish-in-a-p Title: Apollo 15 Lunar Rover Model by @fish-in-a-puddle | Stardance
Devlogs:
Finally, the Lunar Rover model can be built! After waiting a while for the motors to arrive, I built a cardboard frame as a prototype and 3d printed some wheels to get the rover rolling. So far it only runs a test sketch to go forwards, backwards and turn a bit (which really freaked out my dog), but next I’m going to have it navigate on its own using an ultrasonic sensor. Then I’ll add some of the extra features, like Bluetooth control, headlights that turn on when it’s dark and a servo to make the receiver dish sweep from side to side. I do realize that at the moment this guy looks absolutely nothing like the actual lunar rover, but I will be modeling a 3d printed chassis and painting it to look like the real thing. Plus, I’m going to add two little astronauts in the seats, because this was not an autonmous vehicle. It was similar to a space golf cart and by god I will do it justice.
Over the past few days, I have tested several different configurations of sensors to give the rover the ability to navigate on its own. The most effective setup ended up being two ultrasonic sensors on the front of the rover and an IR sensor on each side. I’ve tested it several times and these sensors seem to be picking up about 80-90% of the objects in the robot’s path, which I am satisfied with for now. The next step is to add bluetooth controls to the rover so it can be driven using an app. I will start by using a bluetooth serial app that I already have, but I will eventually build a custom app as well.
The rover model can now be controlled using bluetooth! After a couple hours of troubleshooting, I was able to use an arduino bluetooth serial app I downloaded from the app store (the custom app isn’t ready) to send commands to the rover. The next step is to make it possible to turn the self-driving mode on and off through bluetooth.
I LOST MY TIMELAPSE TO THE CRUELTY OF HACKATIME ;-; so it says half an hour but it was actually more like an hour and forty-five minutes that it took to get the bluetooth and auto drive to work in one sketch, finish the first draft of the app and start writing the bill of materials. Integrating the auto drive into the bluetooth sketch was actually way easier than expected and working the commands into the app wasn’t too tricky either. The bill of materials, though, may actually kill me. Stay tuned to find out if I survive long enough to ship this guy.
Unfortunately, my Lapse is not recognizing that I have a Hackatime project to sync with so imagine I have about two more hours of logged time here :( but ANYWAYS the code is DONE! The app just needs to be TESTED! I am WRITING the DOCS and once I’m done of that, the Apollo 15 Lunar Rover Model v0 will be SHIPPED! Are you happy? I’m happy. But seriously, I just need to make a wiring schematic, a tutorial for building the cardboard frame, a demo video and write the README.
Wrote the README and organized some of my files. Still need to take and upload images/demo video and test the control app but otherwise it is done. If all goes well, I will ship the project tomorrow!
So, I’m a couple days late but I’m about to ship! Finished adding images and videos, added instructions for using a Bluetooth app (the custom one did not work out because mit app inventor is not super good at finding Bluetooth devices) and updated my bill of materials.
Today I finally got back to work on the 3d model and made a tester to print and make sure everything fits. Tomorrow I’ll actually print it (my 3D printer isn’t big enough for the whole thing to fit on the plate, so I’ll cut the model in half and put it together post printing). I only got a couple hours of sleep last night so this devlog is brought to you by boygenius which I listened to so I wouldn’t fall asleep. thank you boygenius save me boygenius PLEASE BOYGENIUS PLEASE SAVE ME
Ships:
The Apollo 15 Lunar Rover Model V0 is a prototype for an Arduino-powered, Bluetooth-controlled model of the Lunar Roving Vehicle used for the Apollo 15 mission. A few months ago, I watched the NASA livestream where they announced the contracts for various lunar missions. After watching an hour of cool new design presentations, I was inspired to make a project that pays homage to the Apollo missions. Enter the Apollo 15 Lunar Rover Model! It can be controlled manually with Bluetooth controls or set to drive itself with the help of two ultrasonic sensors and two IR sensors. There are also two LED “headlights” that can be controlled manually or turn on and off automatically based on the light level (detected by a photoresistor). The servo motor, which will eventually have a decorative receiver dish attached to it, turns from side to side randomly. Before I could make it look cool, though, I had to test all the different parts and make sure they could a) fit in the chassis size I wanted to use and b) actually work the way I expected. This project has been a great learning experience so far - I’ve improved my coding skills a lot and I’m going to learn a lot about 3D modeling in the next couple weeks as I create the chassis for the V1. The hardest part of making this project has been working with the cardboard frame. Cardboard is great for prototypes because it’s super cheap and easy to cut and glue, but it tends to sag after a week. Plus, it’s not pretty and really takes away from the whole “model” thing. But using the cardboard did work well for the V0 and I’m proud of how it’s turned out....
|
1792983077.8732796
|
1793069477.8732796
|
|
1954
|
The Emerald Engineers Website by @Rizzington_I | S The Emerald Engineers Website by @Rizzington_I | Stardance...
|
Rizzington_I
|
1
|
17.0
|
190
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T02:46:38Z", "hours": 17.0, "multiplier": 11.05, "payout": 190, "blessing": "neutral", "text": "I created a website for my team that has information about my team and who we are and what we do. Rather than just creating any other boring site I have designed a dynamic background that makes the site more interesting. Other than that I have also created a 3D visualizer where viewers can drag the image around and take a look at our robot from the past season at various angles. There is also a fun Team Gallery page with captions and funny moments from our season. The Meet the Team page shows us our members and who we are. The hardest part of making this website was the 3D visualizer and the dynamic background. Both elements require complex javascript which made it extremely hard to code. I spent almost half of my time dedicated just to both of those elements in this website just because of how much time it took to perfect it. For the visualizer I ended up taking over 72 photos to get everything at the right angle and compress all the images together with javascript in order to get the visualizer working. I put a lot of time into perfecting the small kinks here and there to make this site stand out so I hope you enjoy it!", "repo": "https://github.com/Rizzington-III/FTC-Team-Website-32483", "demo": "https://rizzington-iii.github.io/FTC-Team-Website-32483/index.html"}]...
|
[{"post_id": 73995, "ts": "202 [{"post_id": 73995, "ts": "2026-09-26T14:17:34Z", "hours": 8.6269, "text": "DevLog #5: Final Touches In this final Devlog I have spent countless hours touching up on final edits to make sure this project is ready to ship. It took a lot of configuring to get the site running up on GitHub pages and unfortunately because this website is a part of my team repository I cannot create it. DONT WORRY: I found a solution… Instead, I have put the website code into a new repository where I have admin access and I have added the link for the GitHub Pages! I hope you guys enjoy it and I’ll put the link here if you want to check it out. BTW: I reccomend taking a look at the Team Gallery and the Robot Page as I would consider those the fun parts of the site. LINK: https://rizzington-iii.github.io/FTC-Team-Website-32483/index.html Enjoy!"}, {"post_id": 23013, "ts": "2026-07-05T18:46:08Z", "hours": 4.7439, "text": "The Article Hub page is complete with scrolling containers for differing categories that hold cards with the article title, date, article-class, as well as an image. These cards are linked to HTML pages that contain the actual article but those are yet to be updated. Now I’ve moved onto the robot page where I am going to insert information on our past season’s robot (ARC). I am currently trying to put in a 3D image visualizer where the user can drag around the see the image, which is going to be our robot. I’ve also added contact details that are linked onto the sidebar. One thing that was really annoying was formatting and making sure that the containers are all aligned because some of the scrolling containers overlapped into other categories and it looked really messy. Turns out in the end it was just one misplaced line between two css classes."}, {"post_id": 19904, "ts": "2026-07-01T10:32:37Z", "hours": 2.5964, "text": "So far this is what I have finished: The sidebar is complete but I may still have to add other pages The About Us, Meet the Team, Sponsor Us, Feedback, Mission Statement, and Outreach page are complete. Although some of them have placeholder images for the time being until I can dig up the right ones from my phone. The stuff that I am currently working on: I am working on the Article Hub page which is essentially a page that contains more pages. It has links to these small blog posts (articles) that could be useful for other robotics teams that participate in the upcoming season. The stuff that still hasn’t been touched: The robot page isn’t done and all the links to the blogs lead me to a blank white page. So I still have more work to do. Back to what I’m working on: In the article hub, for some reason the div cards that are links to their respective articles are placed correctly in my first section which is labeled latest releases. On the other hand in my second section (Hardware Articles), the cards don’t start in the same spot and for some reason the title of the Hardware Article is covered behind the scrolling container of the first section. By the way the article cards are div cards that are linked to the html blog pages as well as contain the title of the article, an image, the date, and what type of info is covered: (hardware, software, team management, exclusive stories). Debugging this is going to take some extra time but all great things take time and hopefully this turns out well."}, {"post_id": 19066, "ts": "2026-06-30T08:09:48Z", "hours": 1.2281, "text": "Currently on the website I am working on the outreach page of our team website. I am part of a FTC (FIRST Tech Challenge) team and I am coding this website for our team. This is going to be our second year and we want to share our knowledge from the past season to other rookie teams which is why we have created this website. I have added an Article Hub page which I will start to edit next once the outreach page is done. The article Hub contains articles for teams and viewers to read which have information that can help teams be successful during their season. The outreach page that I am working on right now contains an image carousel that I have the css styling for on a different page. I tried to create a version two but make it smaller and it worked but for some reason it doesn’t allow the div card with text show up. When I change images I can see the text show up and then vanish as it moves from one image to another. I tinkered with this for a while and I’m either going to have to re-create a new css styling class for the image carousel or shift it to the right. For some reason if I keep the carousel to the right with the text on the left it works perfectly but if do it the other way around it messes it up."}]...
|
Title: The Emerald Engineers Website by @Rizzingto Title: The Emerald Engineers Website by @Rizzington_I | Stardance
Devlogs:
Currently on the website I am working on the outreach page of our team website. I am part of a FTC (FIRST Tech Challenge) team and I am coding this website for our team. This is going to be our second year and we want to share our knowledge from the past season to other rookie teams which is why we have created this website. I have added an Article Hub page which I will start to edit next once the outreach page is done. The article Hub contains articles for teams and viewers to read which have information that can help teams be successful during their season. The outreach page that I am working on right now contains an image carousel that I have the css styling for on a different page. I tried to create a version two but make it smaller and it worked but for some reason it doesn’t allow the div card with text show up. When I change images I can see the text show up and then vanish as it moves from one image to another. I tinkered with this for a while and I’m either going to have to re-create a new css styling class for the image carousel or shift it to the right. For some reason if I keep the carousel to the right with the text on the left it works perfectly but if do it the other way around it messes it up.
So far this is what I have finished: The sidebar is complete but I may still have to add other pages The About Us, Meet the Team, Sponsor Us, Feedback, Mission Statement, and Outreach page are complete. Although some of them have placeholder images for the time being until I can dig up the right ones from my phone. The stuff that I am currently working on: I am working on the Article Hub page which is essentially a page that contains more pages. It has links to these small blog posts (articles) that could be useful for other robotics teams that participate in the upcoming season. The stuff that still hasn’t been touched: The robot page isn’t done and all the links to the blogs lead me to a blank white page. So I still have more work to do. Back to what I’m working on: In the article hub, for some reason the div cards that are links to their respective articles are placed correctly in my first section which is labeled latest releases. On the other hand in my second section (Hardware Articles), the cards don’t start in the same spot and for some reason the title of the Hardware Article is covered behind the scrolling container of the first section. By the way the article cards are div cards that are linked to the html blog pages as well as contain the title of the article, an image, the date, and what type of info is covered: (hardware, software, team management, exclusive stories). Debugging this is going to take some extra time but all great things take time and hopefully this turns out well.
The Article Hub page is complete with scrolling containers for differing categories that hold cards with the article title, date, article-class, as well as an image. These cards are linked to HTML pages that contain the actual article but those are yet to be updated. Now I’ve moved onto the robot page where I am going to insert information on our past season’s robot (ARC). I am currently trying to put in a 3D image visualizer where the user can drag around the see the image, which is going to be our robot. I’ve also added contact details that are linked onto the sidebar. One thing that was really annoying was formatting and making sure that the containers are all aligned because some of the scrolling containers overlapped into other categories and it looked really messy. Turns out in the end it was just one misplaced line between two css classes.
DevLog #5: Final Touches In this final Devlog I have spent countless hours touching up on final edits to make sure this project is ready to ship. It took a lot of configuring to get the site running up on GitHub pages and unfortunately because this website is a part of my team repository I cannot create it. DONT WORRY: I found a solution… Instead, I have put the website code into a new repository where I have admin access and I have added the link for the GitHub Pages! I hope you guys enjoy it and I’ll put the link here if you want to check it out. BTW: I reccomend taking a look at the Team Gallery and the Robot Page as I would consider those the fun parts of the site. LINK: https://rizzington-iii.github.io/FTC-Team-Website-32483/index.html Enjoy!
Ships:
I created a website for my team that has information about my team and who we are and what we do. Rather than just creating any other boring site I have designed a dynamic background that makes the site more interesting. Other than that I have also created a 3D visualizer where viewers can drag the image around and take a look at our robot from the past season at various angles. There is also a fun Team Gallery page with captions and funny moments from our season. The Meet the Team page shows us our members and who we are. The hardest part of making this website was the 3D visualizer and the dynamic background. Both elements require complex javascript which made it extremely hard to code. I spent almost half of my time dedicated just to both of those elements in this website just because of how much time it took to perfect it. For the visualizer I ended up taking over 72 photos to get everything at the right angle and compress all the images together with javascript in order to get the visualizer working. I put a lot of time into perfecting the small kinks here and there to make this site stand out so I hope you enjoy it!...
|
1793004760.7792833
|
1793091160.7792833
|
|
1958
|
7X7 Led matrix by @saidcim | Stardance
|
saidcim
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T10:10:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built an LED matrix controlled by an ESP32C6 Supermini. The challenging part was determining the size of the matrix and the IC that would control it. Initially, I wanted to make it 9x9, but due to design complexity and the capabilities of the HT16K33, I had to make it 7x7. I adjusted the ground plane on the PCB to avoid reducing the wireless communication range of the ESP32C6 board.", "repo": "https://github.com/saidcim/7x7-Led-matrix", "demo": ""}]...
|
[{"post_id": 14264, "ts": "202 [{"post_id": 14264, "ts": "2026-06-23T09:18:43Z", "hours": 0.9356, "text": "I created a demo site to see if a 7x7 matrix is sufficient for letters, numbers, and animations."}]...
|
Title: 7X7 Led matrix by @saidcim | Stardance
Dev Title: 7X7 Led matrix by @saidcim | Stardance
Devlogs:
I created a demo site to see if a 7x7 matrix is sufficient for letters, numbers, and animations.
Ships:
I built an LED matrix controlled by an ESP32C6 Supermini. The challenging part was determining the size of the matrix and the IC that would control it. Initially, I wanted to make it 9x9, but due to design complexity and the capabilities of the HT16K33, I had to make it 7x7. I adjusted the ground plane on the PCB to avoid reducing the wireless communication range of the ESP32C6 board....
|
1792875257.9487216
|
1793739257.9487216
|
|
1973
|
Fight, Beginner Game Making Project by @Sunny | St Fight, Beginner Game Making Project by @Sunny | Stardance...
|
Sunny
|
1
|
10.0
|
29
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T23:00:30Z", "hours": 10.0, "multiplier": 2.98, "payout": 29, "blessing": "neutral", "text": "Following Brackeys Godot tutorial, I developed a 2D platformer. As my first project with the Godot engine, the experience was a significant learning curve. The difficulty stemmed primarily from minor errors, such as script indentation or simple typos, which proved unexpectedly time-consuming to troubleshoot. While I am not particularly satisfied with this initial attempt, I have already begun work on a second game and aim to produce a much higher quality result.", "repo": "https://github.com/KirkSunny/Learning-Beginner-Game", "demo": "https://sunnykirk.itch.io/fight"}]...
|
[{"post_id": 3703, "ts": "2026 [{"post_id": 3703, "ts": "2026-06-06T19:12:38Z", "hours": 9.885, "text": "Added Maacks Game Template"}]...
|
Title: Fight, Beginner Game Making Project by @Sun Title: Fight, Beginner Game Making Project by @Sunny | Stardance
Devlogs:
Added Maacks Game Template
Ships:
Following Brackeys Godot tutorial, I developed a 2D platformer. As my first project with the Godot engine, the experience was a significant learning curve. The difficulty stemmed primarily from minor errors, such as script indentation or simple typos, which proved unexpectedly time-consuming to troubleshoot. While I am not particularly satisfied with this initial attempt, I have already begun work on a second game and aim to produce a much higher quality result....
|
1792994190.5904865
|
1793080590.5904865
|
|
1983
|
rasterminal by @PavolUlicny | Stardance
|
PavolUlicny
|
1
|
470.39
|
8580
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T16:24:17Z", "hours": 449.0, "multiplier": 19.99, "payout": 8580, "blessing": "neutral", "text": "rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys.", "repo": "https://github.com/PavolUlicny/rasterminal", "demo": "https://github.com/PavolUlicny/rasterminal/releases/tag/v0.1.0-alpha.2"}]...
|
[{"post_id": 70278, "ts": "202 [{"post_id": 70278, "ts": "2026-09-18T21:10:51Z", "hours": 6.11, "text": "Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now."}, {"post_id": 68728, "ts": "2026-09-15T17:06:41Z", "hours": 6.6975, "text": "Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special."}, {"post_id": 66825, "ts": "2026-09-12T18:42:57Z", "hours": 8.5847, "text": "Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps"}, {"post_id": 64252, "ts": "2026-09-08T14:55:07Z", "hours": 2.3467, "text": "Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!"}, {"post_id": 63837, "ts": "2026-09-07T20:19:19Z", "hours": 10.4164, "text": "Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping."}, {"post_id": 62122, "ts": "2026-09-05T11:43:50Z", "hours": 9.5678, "text": "Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios."}, {"post_id": 59763, "ts": "2026-09-01T18:10:34Z", "hours": 4.3639, "text": "Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less."}, {"post_id": 58964, "ts": "2026-08-31T15:12:04Z", "hours": 3.8394, "text": "Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP."}, {"post_id": 58269, "ts": "2026-08-30T17:14:59Z", "hours": 8.6936, "text": "Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell."}, {"post_id": 56881, "ts": "2026-08-28T21:26:16Z", "hours": 9.6883, "text": "I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up."}, {"post_id": 55585, "ts": "2026-08-27T15:06:53Z", "hours": 8.8714, "text": "Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find."}, {"post_id": 54695, "ts": "2026-08-25T19:14:01Z", "hours": 10.7308, "text": "Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc."}, {"post_id": 53861, "ts": "2026-08-24T15:48:08Z", "hours": 10.9639, "text": "Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them."}, {"post_id": 53278, "ts": "2026-08-23T18:46:58Z", "hours": 13.1411, "text": "Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going."}, {"post_id": 52574, "ts": "2026-08-22T19:13:37Z", "hours": 11.0969, "text": "Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799"}, {"post_id": 51884, "ts": "2026-08-21T19:41:32Z", "hours": 6.9825, "text": "Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults."}, {"post_id": 51275, "ts": "2026-08-20T20:14:42Z", "hours": 6.7119, "text": "Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup"}, {"post_id": 50683, "ts": "2026-08-20T00:07:13Z", "hours": 12.3297, "text": "Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks."}, {"post_id": 49184, "ts": "2026-08-17T20:28:00Z", "hours": 14.5689, "text": "Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…"}, {"post_id": 48227, "ts": "2026-08-16T15:09:59Z", "hours": 3.5944, "text": "My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891"}, {"post_id": 48078, "ts": "2026-08-16T11:20:07Z", "hours": 11.47, "text": "Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can."}, {"post_id": 47112, "ts": "2026-08-14T19:18:15Z", "hours": 9.0333, "text": "Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance."}, {"post_id": 46486, "ts": "2026-08-13T18:38:49Z", "hours": 10.6753, "text": "Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging."}, {"post_id": 44676, "ts": "2026-08-10T16:23:20Z", "hours": 4.0767, "text": "Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well."}, {"post_id": 44513, "ts": "2026-08-10T09:59:08Z", "hours": 6.8483, "text": "Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719"}, {"post_id": 43513, "ts": "2026-08-08T20:35:37Z", "hours": 7.6361, "text": "Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that."}, {"post_id": 42752, "ts": "2026-08-07T17:00:51Z", "hours": 3.5125, "text": "Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)"}, {"post_id": 42161, "ts": "2026-08-06T19:24:06Z", "hours": 8.2153, "text": "Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome"}, {"post_id": 39599, "ts": "2026-08-02T18:05:04Z", "hours": 7.4436, "text": "Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \\n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!"}, {"post_id": 38478, "ts": "2026-07-31T21:36:35Z", "hours": 7.7572, "text": "Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode."}, {"post_id": 37806, "ts": "2026-07-30T19:08:29Z", "hours": 2.7436, "text": "Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things."}, {"post_id": 37656, "ts": "2026-07-30T15:25:21Z", "hours": 9.285, "text": "Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design."}, {"post_id": 36697, "ts": "2026-07-28T22:28:53Z", "hours": 9.9361, "text": "Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs."}, {"post_id": 35924, "ts": "2026-07-27T17:55:43Z", "hours": 8.7953, "text": "So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916"}, {"post_id": 33607, "ts": "2026-07-23T17:38:48Z", "hours": 4.5575, "text": "Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults."}, {"post_id": 32607, "ts": "2026-07-21T21:48:11Z", "hours": 4.4442, "text": "Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:"}, {"post_id": 30923, "ts": "2026-07-18T22:17:24Z", "hours": 8.6892, "text": "Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more."}, {"post_id": 29772, "ts": "2026-07-16T21:27:23Z", "hours": 0.7175, "text": "Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!"}, {"post_id": 29484, "ts": "2026-07-16T13:40:29Z", "hours": 4.9444, "text": "Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough."}, {"post_id": 28408, "ts": "2026-07-14T17:26:16Z", "hours": 9.2258, "text": "Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation."}, {"post_id": 27302, "ts": "2026-07-12T19:23:17Z", "hours": 10.3522, "text": "Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones."}, {"post_id": 24314, "ts": "2026-07-07T20:18:01Z", "hours": 5.1908, "text": "Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty."}, {"post_id": 23070, "ts": "2026-07-05T20:10:12Z", "hours": 10.4403, "text": "Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported."}, {"post_id": 19371, "ts": "2026-06-30T17:34:50Z", "hours": 5.1925, "text": "Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without."}, {"post_id": 18685, "ts": "2026-06-29T21:27:29Z", "hours": 13.4722, "text": "Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome."}, {"post_id": 17021, "ts": "2026-06-27T17:00:39Z", "hours": 5.7733, "text": "Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path."}, {"post_id": 16313, "ts": "2026-06-26T15:28:43Z", "hours": 5.1883, "text": "Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors)."}, {"post_id": 15932, "ts": "2026-06-25T21:35:36Z", "hours": 1.9053, "text": "Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better."}, {"post_id": 15741, "ts": "2026-06-25T16:48:43Z", "hours": 4.9903, "text": "Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features."}, {"post_id": 15551, "ts": "2026-06-25T08:50:38Z", "hours": 3.7597, "text": "Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds."}, {"post_id": 15117, "ts": "2026-06-24T15:43:58Z", "hours": 6.87, "text": "Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)"}, {"post_id": 13839, "ts": "2026-06-22T17:59:12Z", "hours": 5.2097, "text": "Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)"}, {"post_id": 12798, "ts": "2026-06-20T22:37:18Z", "hours": 7.6314, "text": "Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline."}, {"post_id": 12171, "ts": "2026-06-19T21:42:34Z", "hours": 6.6653, "text": "Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)"}, {"post_id": 10115, "ts": "2026-06-16T18:24:38Z", "hours": 4.0297, "text": "Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support."}, {"post_id": 9453, "ts": "2026-06-15T20:20:25Z", "hours": 4.6839, "text": "Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:"}, {"post_id": 8652, "ts": "2026-06-14T11:36:32Z", "hours": 5.2058, "text": "Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools."}, {"post_id": 8162, "ts": "2026-06-13T16:37:29Z", "hours": 2.8394, "text": "Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell."}, {"post_id": 7990, "ts": "2026-06-13T10:20:35Z", "hours": 2.4908, "text": "Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/"}, {"post_id": 7643, "ts": "2026-06-12T19:26:54Z", "hours": 8.7975, "text": "I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else."}, {"post_id": 6791, "ts": "2026-06-11T11:35:25Z", "hours": 3.6575, "text": "Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions."}, {"post_id": 5755, "ts": "2026-06-09T17:34:17Z", "hours": 4.1133, "text": "Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main."}, {"post_id": 4897, "ts": "2026-06-08T13:53:56Z", "hours": 3.2906, "text": "Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day."}, {"post_id": 4320, "ts": "2026-06-07T16:09:10Z", "hours": 6.2586, "text": "Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes."}, {"post_id": 3846, "ts": "2026-06-06T22:11:48Z", "hours": 3.5269, "text": "I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster."}, {"post_id": 3572, "ts": "2026-06-06T15:51:49Z", "hours": 2.4386, "text": "Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now."}, {"post_id": 2939, "ts": "2026-06-05T20:55:20Z", "hours": 3.9267, "text": "I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later."}, {"post_id": 2739, "ts": "2026-06-05T14:38:57Z", "hours": 1.3417, "text": "I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it."}, {"post_id": 2631, "ts": "2026-06-05T08:21:00Z", "hours": 3.3225, "text": "Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while."}, {"post_id": 2311, "ts": "2026-06-04T18:46:14Z", "hours": 3.1892, "text": "Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this."}, {"post_id": 386, "ts": "2026-06-01T18:58:14Z", "hours": 0.6783, "text": "I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal."}, {"post_id": 359, "ts": "2026-06-01T17:59:06Z", "hours": 4.5428, "text": "Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏"}]...
|
Title: rasterminal by @PavolUlicny | Stardance
De Title: rasterminal by @PavolUlicny | Stardance
Devlogs:
Hey everyone, I want to introduce my project! rasterminal is a full software 3D rasterizer and model viewer that runs entirely in your terminal. The whole rendering pipeline is implemented from scratch. I only rely on third-party libraries for load-time things like 3D model parsing, image parsing, and decompression. It doesn’t touch the GPU at all, running purely on the CPU. That makes it completely safe for SSH usage, though it does come with a performance cost. I use multithreading to recover some of what’s lost, and the result is still significantly faster than any other terminal 3D viewer I’ve come across. Right now I’m focused on broader 3D format feature support and transparent material rendering. If you want to try it out, I’d love to hear what you think, feedback and issues are very welcome over on GitHub. https://github.com/PavolUlicny/rasterminal Thanks for any support! 🙏
I just implemented KTX2 and Basis texture support, which are special compressed texture formats. So now any models with these textures are viewable in rasterminal.
Well, I tried to refactor the main rendering loop for like the third time, because it’s horrifyingly indented, but it has defeated me once again. At this point, I’m confident that it’s impossible to do without a noticeable drop in performance, or g++ is just ragebaiting me. I installed a rainbow indentation neovim plugin just to show the absurdity of this.
Reworked the whole readme with better instructions, screenshots and a gif. The gif was super annoying to polish, because i used asciinema which records all the setup escape sequences so there were gaps at the start and end that i had to manually read and remove. And I also had to perfectly close it exactly when it did one full rotation and that took like an hour to perfect. At least now I don’t have to touch the readme for a while.
I just added unlit material support, which means materials that are supposed to stay intentionally unaffected by lighting render correctly. Pretty straightforward change, just read it at load time and then check if that material is unlit during the lighting pass and skip it.
I wired in Webp image format support by vendoring in google’s libwebp decoding library. It wasn’t that hard to wire into the source code, the hard part was the vendoring, dealing with licenses and professional vendoring practices. Only thing that remains to add for full gltf extension support is avif image support, but I’ll do that later.
Because of all the libraries I added, the binary size increased significantly. I don’t use most of the vendored code, so I added build flags to ignore unused code in the final binary. Other than that, I added some other performance flags and also a CMakePresets.txt. It took longer than it should’ve, because I tested and benchmarked a bunch of other configs and flags. I put off PGO for now.
I did a hot-loop performance cleanup run, because the hot loops were getting slower with new features, and I found a big optimization opportunity in clip-near call sites: clip_near slices off the part of a triangle that pokes behind the camera’s near plane, but almost every triangle is fully in front of it with nothing to clip. The pipeline still called it for all of them, and in the compiled binary that common case just copied all three vertices to memory and back, millions of times a frame. The fix was to check inline whether the triangle is fully in front and skip the call entirely if so. Result on a 2.77M-triangle model: median frame time dropped from 21.1 ms to 19.2 ms, about 8.7% faster.
Working on adding transparency support. For that, I have to completely rework the rendering loop and the rasterizers, so basically the whole core of the project. It’s going very badly. And since performance is a big factor here, I’m going for a template approach so the transparency overhead doesn’t affect non-transparent meshes.
Transparency is basically done, with caveats. Transparency works correctly, but transmission , which is completely different, is simplified to transparency. So for spec-complete gltf, I would need to implement the whole transmission pipeline, which I’m way too lazy to do right now. So for now, we just simplify it to transparency and call it a day.
Transparency is fully done and merged. Did some polish, cleanup and optimization on the transparency branch and successfully merged into main.
Added full native 32 bit support for all platforms Didn’t have to redesign any of the source code (thankfully), just some warning suppressing and fixing some static casts. Also added a CI job that’ll flag future 32 bit compatibility regressions.
I tried to rewrite the STL loader from scratch for more performance But it’s taking super long and I’m way too bored with it, so I think I’ll just abandon the branch and work on something else.
Replaced tinyobjloader with rapidobj for way faster obj parsing But after actually replacing it and integrating it into the source code, i realized it’s not worth it, because rapidobj just has too many downsides and isn’t very actively supported anymore. For example, it doesn’t support multiple mtl files, which is against the spec. So if i want to keep it spec compliant, I need to find a workaround for it, which just isn’t worth the speed increase of rapidobj, even if it’s like 4x faster (from my testing on a large obj) The graph is from this article: https://aras-p.info/blog/2022/05/14/comparing-obj-parse-libraries/
Added deduplicating vertices to the stl loader. After two unsuccessful and unmerged branches, I finally did something useful on main. I used to deduplicate the vertices in stl_reader and then reduplicate them in the loader. But now, we just dedup in stl_reader and use those. That also allowed me to enable ambient occlusion, which was disabled for stl before. And now crease smoothing fully works too. And it’s faster (runtime wise, load time is slower because of ambient occlusion and crease smoothing that weren’t there before). So an all-round very positive change, and also an end to my non-merging dry spell.
Adapted the arg parsing and CLI behaviour to the GNU standard Now, rasterminal’s CLI behaves under the GNU CLI standards, so on par with most linux tools.
Working on adding supersampling anti-aliasing Still a work in progress and I might not merge it into main, because it’s a lot of work for not that much benefit. I have to catch a lot of bad_allocs and things like that for super large SSAA sizes, which is really annoying and can affect performance. SSAA works by rendering at a higher resolution and then downscaling for better edges (makes edges smooth and fade-in instead of jagged) Picture with 2x SSAA and without SSAA:
Added support for wrap modes for textures Only in glTF and OBJ models (the only ones that support it) and verified with the Khronos group sample assets model. Also added PLY texture support.
Made the shading mode branches compile time instead of runtime in the renderer with templates Did the same template if constexpr (compile time if branches) thing that we already do for opaque/transparent models with the shading mode (was a runtime per triangle if branch before), which improved performance. It basically just makes a new copy of the function for each shading mode x each transparency mode, so 4x2 which is 8 slightly different functions and uses the correct one on each call. That increases binary size and icache pressure, but drops per triangle or per pixel if branches that hurt performance, so it’s an overall performance win. Benchmarked across a ton of different resolutions, models, shading modes, etc. (the benchmark by itself took like 2 hours to run)
Optimized the transparent cleanup path in the renderer After rendering the model in the transparent path, we have to resolve the transparent pixels, which basically just pastes in the pixels behind it and sometimes tints it based on how dark and what color the transparent material is (tinted glass will make the things behind it darker, normal glass will be mostly completely untinted). Before, the resolve function looped over every single pixel in the frame, even non-transparent and background ones. This is obviously wasteful. So I made it find the smallest box, in which all the transparent pixels of the whole frame fit and just looped over that. It recovered the overhead of the transparent resolve on models with smaller transparent parts, but it also made fully transparent or mostly transparent models slightly slower (it still basically loops over almost the whole screen on these types of models, so keeping track of the smallest bounding box while also still doing the same work as before made it a little slower). But the performance benefits for the average model outweighed the losses on rare fully transparent models. In the image, you can see the benchmark results versus the baseline.
Added TEXCOORD_1 support glTF sometimes authors a second TEXCOORD set (first one is TEXCOORD_0, 0 indexed numbering). The official spec only requires support for the first two TEXCOORD sets, even though there can theoretically be any number of them in a model. That said, major model exporters don’t author any more than the two sets, so to avoid extra work, I only added support for 0 and 1. (not merged into main yet, I want to polish it a little and maybe add KHR_texture_transform support on top of it first)
Added texture transform into the TEXCOORD branch and merged it into main Not that hard, just read it, pass it to the rasterizer and then display it. I did have a very sneaky bug in the loader that made the whole feature render wrong, where I just had to negate one value to fully fix it, but now everything fully works. Below you can see the Khronos test asset for texture transforms. (tick means fully working, clearcoat is not yet implemented so it doesn’t show as working)
Added proper OBJ bump map support OBJ bump maps are textures for simulating bumps and wrinkles on models. Blender used to author bump maps as normal maps for some reason, so I made it automatically detect if it’s a normal map disguised as a bump map and handle it well, since there are a lot of old Blender OBJ models in the wild. But it also handles bump maps as bump maps normally, so it’s basically the best of both worlds.
Completely removed gouraud shading mode Gouraud was previously the main shading mode, but now I’ve just completely removed it. It was by far the slowest, while not adding any actual value to the project. Blinn-phong lighting is faster AND it supports more features (normal maps, etc.), so there was just no point in keeping gouraud. Now that I’ve removed it, the project has less code to maintain and a faster default shading mode with more features.
Split the tests into sub-directories The test suite is now very long (20k LOC across 47 files), so i decided to split it into sub-directories instead of just having 47 files in one flat dir. It’s cleaner, more maintainable and looks better.
Pararelized the wireframe shading mode I did a bunch of small things alongside it, but the main feature for this devlog is the pararelization of the wireframe shading mode. It was previously fully single threaded, but it wasn’t that hard to pararelize, i just had to make the function it used to write into the framebuffer (draw_line) CAS atomic, to avoid race conditions. Now wireframe is the fastest shading mode in basically all scenarios. Below, you can see a performance benchmark (built into rasterminal using a flag) with wireframe mode on a super dense mesh and how the wireframe mode looks like (you can also cycle the colors).
Added a release workflow, manpage and changelog I added a github release workflow that works alongside the changelog and released the first pre-release version: v0.1.0-alpha.1 Also added a manpage and an install target to make and cmake that installs the binary, docs and manpage into the path.
Wasted 7 hours of my life Did a bunch of smaller cleanups and fixes, and then I tried to template the unlit and lit paths in the rasterize_flat function, which turned out to be a performance regression. Awesome.
Completely removed the shadow map Before, rasterminal built a shadow map on model load and displayed it during runtime. I now completely removed it, because it was slower during load, slower during runtime, sometimes looked broken on curved surfaces and added essentially no value. Here, the first picture is with the shadow map and the second is without.
Working on portability Did a bunch of small fixes and improvements in the last ~week. Right now I’m on vacation for the next couple of days, so I won’t be active. I am currently working on broader terminal and platform support, so older systems and terminals will be able to run cleanly with some fallbacks or will fail loud with a clear message about what isn’t supported.
Working on adding 256 color support Some older terminals can’t display full 24bit RGB colors and use a 256 color palette instead. I’m adding a fallback so the older terminals can still use rasterminal. It still calculates the full old RGB colors, but then just maps them to the nearest 256 color with LUTs. On a side note, I switched my terminal emulator from Kitty to Ghostty.
Working on terminal color capability detection I am adding automatic terminal capability detection, meaning that rasterminal will get the terminal type and either refuse to render on super old or “dumb” terminals, degrade on some terminals and render normally on modern ones.
Working on a –color compatibility flag The color terminal compatibility thing I was working on has landed in the branch, now I’m adding a –color flag to override the automatic capability detection for situations like ssh, where we almost always degrade to the 256 color pallete for maximum compatibility. So now you’re gonna be able to use the right color mode even if the automatic detection is wrong for your situation.
Changed the 24bit to 256 color palette conversion logic Until now, the conversion picked the closest color possible mathematically. But from testing on a bunch of different models, I’ve realized that it doesn’t actually look very close to the human eye. So I swapped it out for a different method, called CIELAB distance. Now it still doesn’t look perfect, but as a fallback for older terminals it’s close enough.
Finally merged color-fallback, I can move onto other things The branch is finally merged. I’ve accumulated a bunch of usability and code quirks and issues that i can finally get to now that the branch is merged. So now I’ll be reworking all the CLI flags, camera and other components. And we also passed the 700 commit mark with this merge!
Did a bunch of small code quality and usability improvements Fixed a Windows bug that crashed the program on model sizes bigger than 2GB, improved the orbit usability (fixed mouse drag behavior when models are turned upside down), and did a few cleanups and fixes in the CLI parsing. I’m planning on adding a few CLI flags that I think can be very useful for some people, specifically better spin settings, starting camera angle/zoom control and a few more.
Added –spin-speed and –spin-direction flags Added CLI flags for the spin speed and direction. The speed is in deg/s and the directions is simply left or right. Here’s what 1000 deg/s looks like spinning to the right:
Added more CLI flags for startup customizability Added flags to set the camera pitch, yaw and zoom on startup. Now every runtime-settable variable can be set during startup through the CLI. The R button now resets the state to the CLI set state, not to factory defaults.
So, i found two memory bugs in a widely used terminal input library I was researching terminal input libraries to use for this project because my current approach was so buggy that it wasn’t worth fixing. Both of them are memory bugs in the libtermkey library. There are forks of the lib with this fixed, but since many projects still rely on this lib, i submitted them anyways. I’ve also confirmed that the bug is present on my machine on Ubuntu 24.04 LTS on Neovim, because it links the vulnerable shared library. I didn’t mark them as CVEs (hopefully that isn’t a problem). If anyone want’s to look at the bug reports, they are at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891 and https://bugs.launchpad.net/ubuntu/+source/libtermkey/+bug/2161916
Working on completely rewriting the current input parsing handling The current input handling is subpar at best; it interprets a lot of random keys as escape, which currently quits the program (This will also be changed to Q and Ctrl+C only. Kind of a no-brainer since this is the more standard choice for TUIs - for example btop - and it also means I don’t have to deal with the headache of distinguishing function keys and others from escape) and has a lot of other quirky behavior that needs fixing. I’ll also try to improve robustness against malformed input like a leaky SSH session. There are a lot of various edge cases and situations where you have no way to distinguish real input from malformed input. This is all a very major pain in the ass. And I thought figuring out the raw mode output would be the hard part. And after all this, I’ll end up with way less attention than strictly slower, less robust competitors, just because they already have an audience from other projects. I bet nobody will even read this. I’m basically talking to myself right now. Or maybe, just to spite me, the algorithm will push this more than my other devlogs.
Still working on the input parsing system It is very hard and I keep finding bugs and reasons to redesign it. I’m in pain. I do think I’m getting closer to the final robust design.
Finally committed and pushed the input rework Tested it on both linux and windows and everything seems to work. No inputs interpreted as other inputs, all edge cases handled, just works. Finally can move onto other things.
Did a smaller fix and added a pretty big feature First, let’s talk about the small fix: I Fixed a super long model name showing up in the HUD in it’s full length, often blocking out other HUD elements. Previously, the HUD would display a model name of any length. Now there’s a hard cap of 24 chars, with any name longer than that truncated (middle style truncation) to fit into that limit. And now the big feature: Added a first person noclip-style camera mode. It’s accessed with the –first-person flag and let’s you explore the model as a floating camera (not bound like the default orbit camera). It was honestly easier to implement than I thought it would be. With it, I added two new keybinds special to the first person mode - E and V for going up and down. They don’t do nothing in orbit mode. Also added a second –first-person-speed flag for controlling the initial movement speed. It is also controllable during runtime with scrolling or +/- (I didn’t know what to bind these to in this mode since you can’t zoom like in orbit mode and this was the only place where they fit). In the photos, you can see some angles taken in the first person mode that weren’t possible in the default orbit mode.
Completely redesigned and rewrote the HUD The HUD used to be just a single line at the bottom of the screen aligned to the left. It looked pretty bad, but it did tell the user everything they needed to know. [picture 1] First, I added model name sanitization, so models with control bytes like newline ( \n ), line feed or other symbols like emojis can’t break the whole program when trying to display them in the HUD. Then, I completely redesigned the whole HUD to look better and be more robust, while still telling the user everything they need to know. I went with this design [picture 2]: On the left, you only have the model name. In the middle, first you have the current shading mode (highlighted in cyan), then the lighting mode in plain white and then the background color in gray. All three middle indicators are separated with a dot and are different colors, so nobody can confuse them. On the right, there’s 3 boolean indicators: spin (if the model spin is on), backface cull (if it’s currently culling backfaces) and texture (if it’s showing the texture, isn’t there at all on models without a texture). They are gray if inactive and cyan if active. The last thing on the right is just the fps number. There can also be optional indicators: Wireframe color (in the middle, after the shading mode) which only shows up in wireframe mode. [picture 3] First person speed multiplier (on the right, between the bools and the fps number) which shows up only in first person mode. [picture 4] I also made each “island” cleanly disappear when the terminal’s width is too low instead of just slowly getting cut off letter by letter. I think this design looks better, less cluttered and is pretty easy to understand at a glance. I would very much appreciate a star on GitHub!
Added issue templates + contributing documentation Added templates and a config for submitting GitHub issues, for both bug reports and feature requests. Also added a CONTRIBUTING.md for clear instructions on how to make, structure and audit code contributions. (tests, linters, formatting, etc.) I tried to make some optimizations to the renderer by auditing the compiler generated assembly and looking for inefficiencies, but everything i tried turned out to actually hurt performance. And GitHub actions decided to have a major outage right when i pushed the commits, so that’s awesome
Minor comment cleanup Just did some comment cleanup: Deleted redundant comments and why comments Removed separator comments Compressed or rewrote some really long comments (without removing the info they give)
Working on adding support for the Kitty protocol Some modern terminals like Kitty and Ghostty have support for the Kitty protocol. It’s a feature that allows you to display high resolution content like images and videos in the terminal without it looking super pixelated. There’s also the Sixel protocol, which is basically the same thing but a little worse and more widely supported (even Windows terminal has it). I’ll add Sixel after i merge Kitty to main. It is very clearly a worthwhile feature and I have been planning to add it from the start of the project. Today I finally decided that it’s time. Most of the work is already done on the branch and i’m just polishing out the bugs and issues before I merge. In the photos, you can see the comparison between using just the block characters and using Kitty. It is a night and day difference. Although the performance isn’t great at that high of a resolution, but I’m still working on optimizing that.
Found a bug in Ghostty’s kitty protocol handling Ghostty is a modern and fast terminal emulator that i personally use. While testing the kitty protocol feature in rasterminal, I found a Ghostty bug that lagged my whole computer after a few minutes. I tested it in Kitty (terminal emulator) and there it worked fine. I looked at Ghostty’s code vs Kitty’s, found the bug and reported it to the Ghostty maintainers. Mitchell himself (the creator) fixed it in like 2 hours. Honestly I’m kinda sad I didn’t get to become a contributor and fix the bug, but since it was a small fix and I already described it in the issue, I get why Mitchell just fixed it in main. Here’s the full issue: https://github.com/ghostty-org/ghostty/discussions/13719
Fully merged and done with Kitty Finally completed the kitty protocol implementation. It is kinda slow, since the resolution is so much bigger, so I will try to optimize the high-res performance even more. So now the next two big milestones are: Add Sixel on top of kitty, that’ll be a lot of work Optimize the rasterizer even more I was thinking of maybe adding gpu rendering as an option for super large meshes or high-res scenarios, but idk. I’ll definetly keep the pure cpu renderer for computers without gpus, but I’m not sure about a gpu implementation. It would be hard to do, less portable and it might not even work that well.
Working on adding full Sixel support Working on adding support for the other mainstream terminal pixel protocol of the main two - Sixel. Already did fully implemented the kitty protocol last time, so once I’m done with this one, I’ll be done with terminal protocols (at least for the near future, hopefully). There are some other ones like the iterm2 protocol, but that one’s pretty rare and I won’t add it unless I really don’t have anything better to do. It’s basically done, just need to polish it and test it on a bunch of terminals and operating systems to make sure everything works before merging.
Fully merged sixel Fully merged the sixel protocol implementation. Works on all platforms everywhere that supports it. So now both high-res terminal protocols done. Moving onto other minor things and especially performance.
Working on improving performance With the addition of the high-res protocols, the target resolutions quickly went from hundreds or thousands of pixels to millions. So I now desperately need to improve performance. So far it’s looking promising: A whole model covering the camera 6 moving at 4k went from about 8 fps to 20-30 fps. Not ideal yet, but I think we’re on the right track. Super dense meshes (more than 2 million polygons) improved 2-3x Meshes with transparent parts improved about 2x While these wins may seem really big (they kinda are), the jump in resolutions still means they are barely usable interactively. I do want to add gpu acceleration later (with the cpu path as a fallback), but until then I want to make it as fast as I possibly can.
My reported bug in libtermkey has been fixed in the newest version Just got an email from one of the maintainers that the crash bug i reported a month ago was fixed in the new release. libtermkey is a terminal input parsing library that I considered using and found a crash bug in. The bug was already fixed in neovim’s fork of the library, so i just pointed the maintainers at that fix. For anybody interested, here’s the issue link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1142891
Still optimizing… Spent the first ~7 hours trying to find microoptimizations and each one was either a wash or worse somehow. The compiler works in mysterious ways. At some point, I just gave up and let Claude have a go at the optimizing. Surprisingly it actually came up with a lot of interesting optimization techniques and solutions that I definitely couldn’t have come up with on my own. But it found so much, that the whole diff adds 5k lines of code. So now I’ll be cleaning up, testing, and maybe further optimizing that diff…
Finally merging the performance branch It’s finally time to merge the performance branch. I basically redesigned the whole renderer and rasterizer around high resolution workloads, where it would still choose the old high-poly paths where they were faster. Even snuck in some SSE2 SIMD code (picture), although I will probably be switching to a dispatch SIMD library like Google’s Highway. Not entirely sure it will be Highway or even if I will do that yet, that depends on the code complexity and before/after benchmarks.
Cleanup and restructuring changes After I just merged three big feature branches (kitty and sixel graphics protocols and the high-res performance branch), I needed to do some overdue cleanup and refactoring. And so I did: Collapsed the super long changelog entries into way more readable and legible points Restructured the src directory into multiple subdirectories because it had like 50 files already Sadly completely removed the Make build system, so now you can only build with CMake (CMake is very much evil and even more evil but it’s the only one of the two that supports windows and I was tired of managing two build systems) Removed the –graphics-scale flag, so now everything renders at native resolution And some small docs and comment cleanup
Working on assimp integration Yop, I’m adding the Open Asset Import Library as a fallback for any model formats that aren’t natively supported with their own dedicated loader (only ones with dedicated loaders are glTF2, PLY, STL and OBJ). I’m still keeping the dedicated loaders, because they are more feature-complete, to-spec and wayyy faster (especially the glTF one). I added it because I feel like for a 3D model viewer, support for many formats, even niche and obscure ones, is pretty important, even though nobody might use them. This roughly doubled compile time and almost quadrupled binary size, which also made CI take way longer (of course). It somehow made the MacOS runners take 50 minutes to compile (from the previous 3 minutes), but I fixed that by bounding the number of processes CMake can spawn to the number of threads on the runner (previously was using -j which spawns as many as it wants and it was spawning about 230 of them). I’m still testing how it handles various model formats and trying to find any reachable segfaults.
Still working on the assimp intgration Currently trying various models from all the different model formats that assimp loads. So far found a segfault, some weird behavior and integration mistakes that I made. Also found a small bug in assimp itself, for which I’ve submitted the PR with the fix to their GitHub repo. For anyone interested, here’s the PR: https://github.com/assimp/assimp/pull/6799
Fuzzing my assimp wrapper I’m trying a bunch of hand-crafted models from all the formats that I can load and trying to find things that dont load or render properly. Also had AI write me a simple fuzzer in python and I’m just letting it run for a few hours. Also auditing the assimp loader paths against my wrapper to find any format specific behaviour that should be handled. I’ve already found a bunch of things and I’m still finding more. Assimp has a lot of weird quirks and issues that I keep running into. Honestly kinda regretting the decision to integrate it, but since I’m already so deep in, I’ll just keep going.
Merged the full assimp integration into main I really don’t have much to say here, I’ve already put all the info about the branch into the past devlogs. All the formats work and the wrapper is very sturdy. I’ve found more bugs in assimp itself than my code (devlog on that soon). So, rasterminal can now load basically any 3D model you throw at it. Some of the formats assimp supports are so niche, I’ve never even heard of them.
Cutting a release The repo is in a pretty complete and polished state, so I’ll cut a release here. This will also probably be the last release before I ship, so I’m making sure that nothing is broken and everything works on every platform. I’ve still got a lot of work to do though, even after the end of stardance, like animations, glTF PBR, format completeness for every format, GPU acceleration, etc.
Found a bunch of terminal cleanup gaps Most of them are Windows or cmd.exe specific (nothing ever works on Windows), but some are present on POSIX too. The Windows specific ones are: cmd.exe for some unknown reason doesn’t turn off the raw input sequences, so arrow keys don’t work like they should, even though I explicitly turn it off (????????) (I hate Windows, they always have to do something unexplainable for no reason just so your code doesn’t work as it should) when you terminate the program with ctrl+c or ctrl+break while actively dragging the model around, it sometimes leaks mouse escape sequences into the next prompt bunch of other weird small stuff that nobody cares about And the few on POSIX are mostly ctrl+z suspend/resume behaviour not recovering the terminal and the same thing with ctrl+\ (SIGQUIT). I’m still working on fixing these. Most of the windows ones are already fixed, but I haven’t even started with the linux/POSIX ones. I have postponed the planned release to when I fix these + any other issues I find.
I HATE WINDOWS Windows just doesn’t work. It doesn’t work. Nothing works on Windows. Everything breaks. I don’t get it. THE UNIT TESTS PASS ON WINDOWS CI BUT WHEN I ACTUALLY RUN THE TESTS ON WINDOWS IT FAILS????? HOW IS THAT EVEN POSSIBLE. The release is now definitely getting delayed by at least a week because I keep running into more and more and more and more and more and more and more and more and more issues. I hate Windows. Microslop is the only company that could mess up a basic terminal emulator. And I also have to reboot my PC every time I fix something and push it and then reboot to get back to linux. this is torture. At one point I tried to do it on a Windows VM on linux but that was too slow so I just gave up.
Merged the full Windows console restoration branch My nightmare is over. I hopefully won’t have to deal with Windows for a while now. Summary of what is now fixed/handled on Windows: Ctrl+C, Ctrl+Break and Q exits fully recover the terminal’s state Ctrl+C and Ctrl+Break don’t leak mouse escape sequences into the next prompt if you terminate while actively dragging a model A bunch of other minor Windows or cmd.exe specific quirks Only thing that isn’t handled (didn’t find a good way to handle it) is task manager “end process”. It kills the program without cleaning up and sometimes freezes the shell.
Fully fixed and merged the first POSIX cleanup item Well, would you look at that! That took significantly less time than the Windows fix. It is partly because it was a smaller fix and only part whole POSIX fix, while the Windows one was the whole thing and also the foundation had already been laid out from the Windows work and I just integrated the POSIX path into that, but it is also very much because Microsoft is a horrible, terrible company that can’t make good software. I mean, look at GitHub, they have been going downhill ever since they got acquired by Microsoft. Now that I got that out of my system, here’s what was fixed: If the program cannot enable raw mode at startup, it safely fails instead of continuing and corrupting the terminal state If the cleanup gets interrupted, it retries cleanup so it doesn’t leave the terminal state corrupted after one failed attempt Onto the next POSIX fix: handling SIGQUIT and SIGHUP.
Added handling for SIGINT, SIGTERM, SIGQUIT and SIGHUP I don’t really have much to say here, I just added the full per-spec handling for all these. Only remaining POSIX-only gap is now SIGSTOP/SIGCONT (stop/resume process). I’m also starting school now, so I’ll be working on this less.
Working on SIGSTOP and SIGCONT handling SIGSTOP and SIGCONT are POSIX signals for stopping and resuming a running process. I’m working on adding handling for these, so you can safely pause and unpause rasterminal at any time. This is a lot of work, since until now, we just set up the terminal on program start and cleaned up when the program exited. There’s a lot of quirks and weird scenarios that I have to handle, for example if another signal gets sent while cleaning up the terminal for SIGSTOP. I’m trying to catch as many edge cases by just doing random things while using the program and also with the help of AI to come up with potentially uncaught scenarios.
Did some polish and cleanup of the platform layer Did final polish and cleanup of the platform layer since I want to actually finally cut a release relatively soon and I just did a lot of work there. Fixed things like useless tests, outdated or wrong comments and some platform specific quirks. Probably actually gonna cut a release soon (this time for real). Also added early rejections for BVH and CSM files, since they contain no model geometry (they can’t currently be displayed at all) and documented the change. The code is basically done (hopefully, I really don’t want to find another big gap that’s gonna take a week to close), I just want to correct anything wrong in the README, changelog, manpage or help menu and maybe make them look a little better before cutting a release and shipping.
Last pre-release checks and cleanup I’m finally ready to release v0.1.0-alpha.2. Only notable thing I changed here is that I changed the default thread count: It now defaults to hardware concurrency everywhere. Other than that, I of course did final documentation checks and fixes and now I’m just waiting for CI to pass so I can tag it and let the release workflow do the last step. So this is hopefully the last devlog before my ship!
Refactored the platform layer The whole platform layer was just one file until now. Since I did a lot of work on it recently, it grew to over 2400 lines of code. It was super confusing and disorienting. So I decided to refactor it (split it) into 8 files, based on what they handle: console.h - saving/restoring terminal state control.h - termination signal handling file.h - file operations (64bit) input_reader.h - handling input (not parsing, that is it’s own file) shared_memory.h - shared memory handling for the kitty protocol terminal_io.h - writes output to the terminal terminal_query.h - querying the terminal for things like graphics capability, etc. timing.h - frame timing and sleeps
Miscellaneous fixes and improvements Fixed two races in platform code (one MacOS, one Windows) Removed build flags that disabled some compiler security hardening at the cost of a little performance Fixed the test framework to not freak out on NaN in near assertions Improved thread launching and handling in loaders and renderer So overall just boring fixes and improvements, nothing special.
Code quality and CI improvements Finally did the long overdue main loop refactor. The main loop is now way shorter, more readable and more testable. I just split off some of the main loop’s work into it’s own modules, which made them way better looking and also, since they are now standalone modules, actually testable. A big win for repo structure. In the process, I also replaced the input handling’s long if chain that made each character do it’s job with a switch statement. It’s more readable and theoretically faster, although since I compile it with -O3, it probably made no difference or an unnoticeable one at best. I also finally fixed the super long CI times. Until now, CI used to take ~50 minutes (depending on how fast the GitHub runner was) because of cppcheck. Everything else finished in under 10 minutes, but cppcheck stalled it for an hour. It was stalling in mesh_assimp.cpp (the assimp wrapper) for most of it’s runtime. I always thought it was because assimp is a very large library. So I experimented with it a little. I included everything I include in the wrapper into a test file with a little code and ran cppcheck on that. It finished in less than 10 seconds. Eventually, I found out it was somehow taking that long because the main loader function was too long and handled too much by itself. So i just refactored it into 3 separate functions, without changing the behavior at all. Somehow, I still don’t get why, it reduced the whole cppcheck run to 9 minutes. a more than 5x improvement, just because I split a function into more functions. I’m not complaining, but it’s definitely weird. CI is now way faster and adding new things is gonna be way smoother now.
Ships:
rasterminal rasterminal is a 3D model viewer in the terminal Why i decided to build it The original idea didn’t really have any big inspiration, I’ve just always been fascinated by the inner workings of 3D and how that all works. I’ve been wanting to build a project involving 3D for a while and I didn’t want to make just another program that uses libraries and GPU drivers to do all the work. So I came up with the idea: a software rasterizer that renders in the terminal! There are lots of TUIs and lots of boring old software rasterizer projects, so I just combined the two into something unique. And over time, I realized I could make it an actually useful tool, with no real competition: a 3D model viewer in the terminal. Sure, there are some similar projects on GitHub (like taigrr’s trophy), but none are actually usable with heavier models or support pixel graphics. What I learned I learned a lot. I really mean a lot. Anything from math and rendering to how terminals work and how to control them using escape sequences. I don’t want to sit here and name everything I learned over the period of the last 5 months, but I can confidently say that this project really taught me how much work goes into everyday software and how to actually develop and maintain a project professionally. The future of rasterminal The whole project is very far from done. You can see that from the latest release version: v0.1.0-alpha.2. I’ve got a lot of work to do and I’ve roughly got the major landmarks mapped out. Main things I definitely want to change/add at some point before v1 are: Add animation support (currently can only render still meshes) Complete the renderer (complete support for basically every feature of every format that makes sense to support) Add optional GPU acceleration (after I’m satisfied with everything else) Hardware / OS support Supports every major OS (Windows, Linux, MacOS, and any other POSIX-based OS, so practically everything), and every CPU that I could think of (any architecture, 32 or 64bit). You would have to actually try a to find a platform that it doesn’t support (most of the unsupported hardware are big-endian systems, which are basically phased out completely). This is one of the main goals of the project, so (almost) any modern machine with a terminal can run it. Special thanks Special thanks to anyone who followed, liked, helped, or otherwise supported the project in any way. I wouldn’t have had the motivation to push it this far if it wasn’t for you guys....
|
1792979796.1324232
|
1793066196.1324232
|
|
2013
|
Grocery Price Tracker by @Draaal | Stardance
|
Draaal
|
1
|
12.51
|
45
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T15:40:56Z", "hours": 11.0, "multiplier": 4.22, "payout": 45, "blessing": "neutral", "text": "I structured this a bit like a FAQ so you don’t have to read everything; read whatever sections you find interesting TLDR A website with live data about products from the austrian grocery store “SPAR”. You can search filter, … It was my first time touching react and I learned quite a bit about docker. I also used some new rust libraries for serialization and hosing api endpoints Troubleshooting The server is a bit unstable, it might be unreachable if it hasn’t been accessed in a while and need a few minutes to start back up again. I don’t have a SSL certificate, so the browser might show something like “The connection is insecure. Are you sure you want to proceed?”. This is fine, it just means that the traffic between you and the serve is not encrypted. Just don’t put your bank credentials there, okay? What is this? You can use this to view prices of SPAR (a austrian grocery store). It has live data (unless I forget to start the update) and some nice search filters. Currently only products from one brand, but the design allows easy addition of further brands. Why are some parts of the website in german? Since SPAR is an austrian vendor, the product names are of course in german and the legal stuff is in german too for that reason. The rest is in english so you guys don’t need a translator. My experience So first I wanted to do this project to do some web dev again, after only doing local (mostly cli) stuff for a while. But this time in rust. First I struggeled a bit with Docker, because my AI was halluzinating again (thats on me though for using the trashy free model), but the implementation of the web scraping was pretty and db insertion was not too difficult, if I remember correctly after 3 months. Then I used react for frontend, which I knew nothing about, but after our Chatty gave me some hints on how to make things work it was fine. I also have to confess the html is ai-generated, because thats the part I really don’t care about. Price tracker ? It is called a price tracker, but it really isn’t. Once upon a time it was intended to be one, I ditched that feature in favor of storm (my other project). I never changed the name though…", "repo": "https://github.com/andraaal/price-tracker", "demo": "https://products.draaal.dpdns.org/"}]...
|
[{"post_id": 76267, "ts": "202 [{"post_id": 76267, "ts": "2026-10-03T00:09:57Z", "hours": 0.7756, "text": "Mods: The proejct description and the ship still say that it may have startup times. This is no longer true. Could someone remove that as I can’t do that any longer? Fixing shiping #2 Now we have proper hosting without any cold starts. Additionally we now also have cloudflare caching for that extra performance. And while I was at it I added a very simple favicon too"}, {"post_id": 75876, "ts": "2026-10-01T13:31:24Z", "hours": 0.7381, "text": "Whoops! I forgot the README. Now its there."}, {"post_id": 75602, "ts": "2026-09-30T15:12:27Z", "hours": 0.6042, "text": "#6 Devlog (now for real) I had almost given up when I rebuildt the container on my potato server for the 5th time, because I used local builds for the server. But then it just worked!!! It is still a miracle to me how there was nothing that went wrong, but it seems for once the server I set up works properly. Yay!!! Now is really time for shipping"}, {"post_id": 75567, "ts": "2026-09-30T13:45:46Z", "hours": 0.755, "text": "#6 Devlog (not really) Almost forgot to ship this; and I was kinda panicing because the server was broken. Was a quick fix at least. But now I found that the search system is a bit whacky and I am really scared to fix it. Let’s hope I don’t break the server, because it has been some time since I set it up and I have no idea on how to fix it if it breaks."}, {"post_id": 25934, "ts": "2026-07-10T13:08:24Z", "hours": 2.5278, "text": "Devlog #5: Final upload After I finally finished uploading everything to the server and fetching all of the 22K products they have, I noticed that the page is kinda laggy if you try displaying all of them at once (who would have thought). So I implemented paging and downloaded everything AGAIN, because idk?. There is db persistence across builds, but I do it on startup anyways. And all of that with 1s delay between requests to avoid getting rate-limited by their server. It took sooo long. Anyways, it is ready for shipping, I hope you enjoy it!"}, {"post_id": 22077, "ts": "2026-07-04T10:16:40Z", "hours": 0.9444, "text": "Devlog #4: Setting up a server So for the last day or so I’ve been working on setting up an online server. Getting the OCI (Oracle) Free Tier account took forever and then actually aquiring a machine too; They’re always out of resources, unless you upgrade to pay as you go. The one hour logged here is mainly me creating new Dockerfiles, that don’t have any of the build tools in the live server. Idk what to show, here is some screenshot from the server I set up:"}, {"post_id": 21068, "ts": "2026-07-02T20:55:28Z", "hours": 1.6758, "text": "Devlog #3: The frontend I restructured my project a bit, so I could have a simple web UI for my project. Nothing fancy yet, but it proofs that everything works. Still, quite interesting, since I have never used React before and I see why so many people like it (Also got a fair bit of help from AI with the design; that’s not really my cup of tea). Since all of the base features are implemented now, I think I will ship it soon, but before that, I want to make a few more adjustments (to not get rate-limited) and polish the UI a bit. Below you see the first UI draft"}, {"post_id": 20783, "ts": "2026-07-02T14:07:51Z", "hours": 1.9867, "text": "Devlog #2: Data Expansion After I got everything set up last devlog I now added some real data collection capabilities. We now track: name brand vendor price of one unit size of one unit (The thing in the image, not necessarily 1 kg/L/etc) image URL reference price (How much does 1 kg/L/etc cost?) tags like “organic”, “gluten-free”, etc I also restructured some of the code to make it easier to add new vendors, befor we were kinda fixed on SPAR. That’s all for now, I will now go and create a frontend so that next time I can show you more than some db schema."}, {"post_id": 19920, "ts": "2026-07-01T11:05:56Z", "hours": 2.1147, "text": "Deblog #1: New Project The end goal is to have an app that can compare prices between different grocery stores and can tell you where you can get your items the cheapest. I have set up a basic project in Docker with Rust and Postgres. Current capabilities are loading product data from SPAR deserializing, structuring and storing it in the db. There is no UI yet, but thats the next step."}]...
|
Title: Grocery Price Tracker by @Draaal | Stardanc Title: Grocery Price Tracker by @Draaal | Stardance
Devlogs:
Deblog #1: New Project The end goal is to have an app that can compare prices between different grocery stores and can tell you where you can get your items the cheapest. I have set up a basic project in Docker with Rust and Postgres. Current capabilities are loading product data from SPAR deserializing, structuring and storing it in the db. There is no UI yet, but thats the next step.
Devlog #2: Data Expansion After I got everything set up last devlog I now added some real data collection capabilities. We now track: name brand vendor price of one unit size of one unit (The thing in the image, not necessarily 1 kg/L/etc) image URL reference price (How much does 1 kg/L/etc cost?) tags like “organic”, “gluten-free”, etc I also restructured some of the code to make it easier to add new vendors, befor we were kinda fixed on SPAR. That’s all for now, I will now go and create a frontend so that next time I can show you more than some db schema.
Devlog #3: The frontend I restructured my project a bit, so I could have a simple web UI for my project. Nothing fancy yet, but it proofs that everything works. Still, quite interesting, since I have never used React before and I see why so many people like it (Also got a fair bit of help from AI with the design; that’s not really my cup of tea). Since all of the base features are implemented now, I think I will ship it soon, but before that, I want to make a few more adjustments (to not get rate-limited) and polish the UI a bit. Below you see the first UI draft
Devlog #4: Setting up a server So for the last day or so I’ve been working on setting up an online server. Getting the OCI (Oracle) Free Tier account took forever and then actually aquiring a machine too; They’re always out of resources, unless you upgrade to pay as you go. The one hour logged here is mainly me creating new Dockerfiles, that don’t have any of the build tools in the live server. Idk what to show, here is some screenshot from the server I set up:
Devlog #5: Final upload After I finally finished uploading everything to the server and fetching all of the 22K products they have, I noticed that the page is kinda laggy if you try displaying all of them at once (who would have thought). So I implemented paging and downloaded everything AGAIN, because idk?. There is db persistence across builds, but I do it on startup anyways. And all of that with 1s delay between requests to avoid getting rate-limited by their server. It took sooo long. Anyways, it is ready for shipping, I hope you enjoy it!
#6 Devlog (not really) Almost forgot to ship this; and I was kinda panicing because the server was broken. Was a quick fix at least. But now I found that the search system is a bit whacky and I am really scared to fix it. Let’s hope I don’t break the server, because it has been some time since I set it up and I have no idea on how to fix it if it breaks.
#6 Devlog (now for real) I had almost given up when I rebuildt the container on my potato server for the 5th time, because I used local builds for the server. But then it just worked!!! It is still a miracle to me how there was nothing that went wrong, but it seems for once the server I set up works properly. Yay!!! Now is really time for shipping
Whoops! I forgot the README. Now its there.
Mods: The proejct description and the ship still say that it may have startup times. This is no longer true. Could someone remove that as I can’t do that any longer? Fixing shiping #2 Now we have proper hosting without any cold starts. Additionally we now also have cloudflare caching for that extra performance. And while I was at it I added a very simple favicon too
Ships:
I structured this a bit like a FAQ so you don’t have to read everything; read whatever sections you find interesting TLDR A website with live data about products from the austrian grocery store “SPAR”. You can search filter, … It was my first time touching react and I learned quite a bit about docker. I also used some new rust libraries for serialization and hosing api endpoints Troubleshooting The server is a bit unstable, it might be unreachable if it hasn’t been accessed in a while and need a few minutes to start back up again. I don’t have a SSL certificate, so the browser might show something like “The connection is insecure. Are you sure you want to proceed?”. This is fine, it just means that the traffic between you and the serve is not encrypted. Just don’t put your bank credentials there, okay? What is this? You can use this to view prices of SPAR (a austrian grocery store). It has live data (unless I forget to start the update) and some nice search filters. Currently only products from one brand, but the design allows easy addition of further brands. Why are some parts of the website in german? Since SPAR is an austrian vendor, the product names are of course in german and the legal stuff is in german too for that reason. The rest is in english so you guys don’t need a translator. My experience So first I wanted to do this project to do some web dev again, after only doing local (mostly cli) stuff for a while. But this time in rust. First I struggeled a bit with Docker, because my AI was halluzinating again (thats on me though for using the trashy free model), but the implementation of the web scraping was pretty and db insertion was not too difficult, if I remember correctly after 3 months. Then I used react for frontend, which I knew nothing about, but after our Chatty gave me some hints on how to make things work it was fine. I also have to confess the html is ai-generated, because thats the part I really don’t care about. Price tracker ? It is called a price tracker, but it really isn’t. Once upon a time it was intended to be one, I ditched that feature in favor of storm (my other project). I never changed the name though…...
|
1793008054.588253
|
1793094454.588253
|
|
2014
|
Superorbital by @orivio | Stardance
|
orivio
|
1
|
40.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T00:50:07Z", "hours": 40.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "SUPERORBITAL: The Quest of the Anomaly After months of hard work, Obe Dot and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8", "repo": "https://github.com/orivio/super_orbital", "demo": "https://obedh.itch.io/superorbital"}]...
|
[{"post_id": 72445, "ts": "202 [{"post_id": 72445, "ts": "2026-09-22T23:55:43Z", "hours": 1.5869, "text": "SUPERORBITAL Mini Devlog # 10.5: Just clearing out the last hour and a half I got from working on the trailer. We’re gonna be shipping in just a few minutes! Here are a few clips used in the trailer:"}, {"post_id": 71480, "ts": "2026-09-20T22:02:36Z", "hours": 5.2728, "text": "SUPERORBITAL DEVLOG #10: The End? You can watch a full playthrough of the intro segment here: https://youtu.be/-zq8ps87daI After a plethora of bugfixing (see attached for a few examples lol), we did it! The Alpha, as far as we can tell, is done! Gameplay/Story: Intro and outro cutscene have been implemented, though not polished fully yet. Lots of level redesign. Levels have been shifted to reduce the difficulty curve and also introduce dash/antigrav earlier. Sad Guy and Assistant now have actual names: Vitri and G.R.A.V. Music/Art: Old intro song, which ended up scrapped, is now in the credits Buzzsaw texture Dev Note: This was such an exciting intro to full game development! The game is really fun to play in my opinion. Even though it’s buggy and unpolished in some aspects, we’ve got a ton of time to work on that in the future. Enjoy it once it’s shipped!!"}, {"post_id": 66822, "ts": "2026-09-12T18:39:15Z", "hours": 1.5464, "text": "SUPERORBITAL DEVLOG #9: Bugs bugs bugs!!!! Gameplay/Story: We’ve been working on a lot of bug fixing, ranging from removing tiny skips/deaths to entire game-crashing bugs Music/Art: We added sound effects for collisions, wrench throwing, etc Music has a new system in the level directory and has been readded Todo/Dev Notes: We’re getting ready to ship soon! The plan is to finish up with bugfixing, playtest a bit, and then ship before the 20th! We have to figure out how to fix a bug where you get wiped out of existence when in antigrav and colliding We have to implement the cutscenes UI fixes/polishing coming soon!"}, {"post_id": 64464, "ts": "2026-09-08T21:28:54Z", "hours": 3.2047, "text": "SUPERORBITAL DEVLOG #8 Gameplay/Story: Lots of level polishing has been added New obstacles Started work on intro/final cutscene Music/Art: New black hole shader!!! It looks so cool Some new sprites in the tileset to make it look nicer Overall more decoration Things to do: Level polishing, tileset shading Add intro/final cutscene (full implementation) File organization Bugfixing for black holes Developer Note: You might notice that some bits of the attached recording are really weird/buggy looking. Part of that is cuz I accidentally did some work in the wrong branch that was meant to fix some things (like the music and some other issues), and this is on another branch. Hopefully we can resolve any conflicts and fix things up soon!"}, {"post_id": 51919, "ts": "2026-08-21T20:43:29Z", "hours": 8.8186, "text": "SUPERORBITAL Devlog # 7 Gameplay/Story: There are dialogues for every section that we’ve made so far. Almost every section of the Alpha is finished so far! New black hole implementation Overall polishing for many bugs Music and Art: New spritework for the Assistant Polished state-based animation bugs Things to do: Implement intro cutscene Implement final cutscene Dialogue polishing Tileset partial redesign"}, {"post_id": 33703, "ts": "2026-07-23T20:35:26Z", "hours": 6.6292, "text": "SUPERORBITAL Devlog #6 Gameplay/Story: Initial dialogue has been finished. Robo-Guy appears to give tutorial dialogue throughout the game. There is full dialogue for every section that we have made so far. Wrench has been re-implemented for the learn_wrench section of the game WIP black hole redesign Music and Art: I made a new, fairly crappy black hole for the game icon. Hoping to redo it with a drawing tablet once this project gets shipped (so exciting!!!) OST tracks 2 (Lone Traveler) and 3 (Martian Overture) have been finished AND implemented into the game! That’s right, we have a working (though messy) system to implement music! Things to do: Polish icon and banner Hopefully polish and re-organize code (It’s really messy right now, and very clearly the product of summertime boredom, lol) Sad Guy sprites Redesign of other sprites (new tiles, some proportional fixing for Robo-Guy and Sad Guy) Cutscene system and intro implementation"}, {"post_id": 32076, "ts": "2026-07-20T23:55:33Z", "hours": 2.4614, "text": "Superorbital Devlog #5 Progress: first OST has been made! it was originally called Space Parade, but we immediately renamed it to Quest of the Anomaly. it’ll be used for the intro cutscene some progress with gravity and timescale implementation with black holes work done on options menu and keybind settings. all inputs are bindable, and there are also presets based on the controls of Celeste and Hollow Knight (more to be added, maybe) Things we’re trying to do soon: there’s this annoying bug where sometimes you randomly dash without ANY input at all. after bugtesting, Obed found that godot genuinely thinks someone is inputting the dash keybind… for some reason. Obed’s been trying really hard to fix it new sprites for Sad Guy. instead of a colored stickman, we’re going to add a cool astronaut robot thing Robot Assistant to help with tutorial, instead of text just appearing on screen. it’ll follow you around and help. it’ll also give you the ability to move the camera to look ahead in the level, similar to Terraria’s binoculars intro cutscene. this’ll give more details about the story game icon and stardance banner"}, {"post_id": 31059, "ts": "2026-07-19T04:47:58Z", "hours": 2.6797, "text": "LET’S GOOO! Obed has successfully started to implement black holes, and we’re starting on the level set for them! I also finished up the final level restructures, they’re looking amazing now. Also here’s Obed’s rework of the title screen I forgot to post before."}, {"post_id": 29713, "ts": "2026-07-16T20:06:01Z", "hours": 3.8092, "text": "Wow, it’s been FOREVER since I’ve gotten to update this. Summer’s been busy, and Obed’s put a lot of work into Superorbital. He re-did the tileset, animated a new character, and polished a lot of the levels. I’ve been bugtesting and I also started on a full cosmetic restructure of every level to make it look less geometric and more natural. After we polish what we have so far, I hope to add the black holes and finish the game up! The Halfway Mark Has Been Attained (kind of)"}, {"post_id": 7572, "ts": "2026-06-12T17:38:40Z", "hours": 2.0533, "text": "Lots of progress has been made! Wrench throwing has been fixed and is now omnidirectional. Another tutorial level has been added to introduce gravity switching. The main menu was reworked to look cooler too! New black hole sprite. Bugs with going between rooms have been fixed too, and you can no longer spam antigrav to skip rooms (now antigrav gets turned off when you enter a new room). Things are going swimmingly, dearest friends!"}, {"post_id": 5180, "ts": "2026-06-08T21:29:27Z", "hours": 2.1033, "text": "First functions are going well so far! Gravity switching and wrench throwing work (mostly), and the black hole is coded in but not implemented yet. Don’t mind Obed’s goated placeholder"}]...
|
Title: Superorbital by @orivio | Stardance
Devlog Title: Superorbital by @orivio | Stardance
Devlogs:
First functions are going well so far! Gravity switching and wrench throwing work (mostly), and the black hole is coded in but not implemented yet. Don’t mind Obed’s goated placeholder
Lots of progress has been made! Wrench throwing has been fixed and is now omnidirectional. Another tutorial level has been added to introduce gravity switching. The main menu was reworked to look cooler too! New black hole sprite. Bugs with going between rooms have been fixed too, and you can no longer spam antigrav to skip rooms (now antigrav gets turned off when you enter a new room). Things are going swimmingly, dearest friends!
Wow, it’s been FOREVER since I’ve gotten to update this. Summer’s been busy, and Obed’s put a lot of work into Superorbital. He re-did the tileset, animated a new character, and polished a lot of the levels. I’ve been bugtesting and I also started on a full cosmetic restructure of every level to make it look less geometric and more natural. After we polish what we have so far, I hope to add the black holes and finish the game up! The Halfway Mark Has Been Attained (kind of)
LET’S GOOO! Obed has successfully started to implement black holes, and we’re starting on the level set for them! I also finished up the final level restructures, they’re looking amazing now. Also here’s Obed’s rework of the title screen I forgot to post before.
Superorbital Devlog #5 Progress: first OST has been made! it was originally called Space Parade, but we immediately renamed it to Quest of the Anomaly. it’ll be used for the intro cutscene some progress with gravity and timescale implementation with black holes work done on options menu and keybind settings. all inputs are bindable, and there are also presets based on the controls of Celeste and Hollow Knight (more to be added, maybe) Things we’re trying to do soon: there’s this annoying bug where sometimes you randomly dash without ANY input at all. after bugtesting, Obed found that godot genuinely thinks someone is inputting the dash keybind… for some reason. Obed’s been trying really hard to fix it new sprites for Sad Guy. instead of a colored stickman, we’re going to add a cool astronaut robot thing Robot Assistant to help with tutorial, instead of text just appearing on screen. it’ll follow you around and help. it’ll also give you the ability to move the camera to look ahead in the level, similar to Terraria’s binoculars intro cutscene. this’ll give more details about the story game icon and stardance banner
SUPERORBITAL Devlog #6 Gameplay/Story: Initial dialogue has been finished. Robo-Guy appears to give tutorial dialogue throughout the game. There is full dialogue for every section that we have made so far. Wrench has been re-implemented for the learn_wrench section of the game WIP black hole redesign Music and Art: I made a new, fairly crappy black hole for the game icon. Hoping to redo it with a drawing tablet once this project gets shipped (so exciting!!!) OST tracks 2 (Lone Traveler) and 3 (Martian Overture) have been finished AND implemented into the game! That’s right, we have a working (though messy) system to implement music! Things to do: Polish icon and banner Hopefully polish and re-organize code (It’s really messy right now, and very clearly the product of summertime boredom, lol) Sad Guy sprites Redesign of other sprites (new tiles, some proportional fixing for Robo-Guy and Sad Guy) Cutscene system and intro implementation
SUPERORBITAL Devlog # 7 Gameplay/Story: There are dialogues for every section that we’ve made so far. Almost every section of the Alpha is finished so far! New black hole implementation Overall polishing for many bugs Music and Art: New spritework for the Assistant Polished state-based animation bugs Things to do: Implement intro cutscene Implement final cutscene Dialogue polishing Tileset partial redesign
SUPERORBITAL DEVLOG #8 Gameplay/Story: Lots of level polishing has been added New obstacles Started work on intro/final cutscene Music/Art: New black hole shader!!! It looks so cool Some new sprites in the tileset to make it look nicer Overall more decoration Things to do: Level polishing, tileset shading Add intro/final cutscene (full implementation) File organization Bugfixing for black holes Developer Note: You might notice that some bits of the attached recording are really weird/buggy looking. Part of that is cuz I accidentally did some work in the wrong branch that was meant to fix some things (like the music and some other issues), and this is on another branch. Hopefully we can resolve any conflicts and fix things up soon!
SUPERORBITAL DEVLOG #9: Bugs bugs bugs!!!! Gameplay/Story: We’ve been working on a lot of bug fixing, ranging from removing tiny skips/deaths to entire game-crashing bugs Music/Art: We added sound effects for collisions, wrench throwing, etc Music has a new system in the level directory and has been readded Todo/Dev Notes: We’re getting ready to ship soon! The plan is to finish up with bugfixing, playtest a bit, and then ship before the 20th! We have to figure out how to fix a bug where you get wiped out of existence when in antigrav and colliding We have to implement the cutscenes UI fixes/polishing coming soon!
SUPERORBITAL DEVLOG #10: The End? You can watch a full playthrough of the intro segment here: https://youtu.be/-zq8ps87daI After a plethora of bugfixing (see attached for a few examples lol), we did it! The Alpha, as far as we can tell, is done! Gameplay/Story: Intro and outro cutscene have been implemented, though not polished fully yet. Lots of level redesign. Levels have been shifted to reduce the difficulty curve and also introduce dash/antigrav earlier. Sad Guy and Assistant now have actual names: Vitri and G.R.A.V. Music/Art: Old intro song, which ended up scrapped, is now in the credits Buzzsaw texture Dev Note: This was such an exciting intro to full game development! The game is really fun to play in my opinion. Even though it’s buggy and unpolished in some aspects, we’ve got a ton of time to work on that in the future. Enjoy it once it’s shipped!!
SUPERORBITAL Mini Devlog # 10.5: Just clearing out the last hour and a half I got from working on the trailer. We’re gonna be shipping in just a few minutes! Here are a few clips used in the trailer:
Ships:
SUPERORBITAL: The Quest of the Anomaly After months of hard work, Obe Dot and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8...
|
1793004494.0865707
|
1793090894.0865707
|
|
2016
|
SUB_SURFACE by @omar | Stardance
|
omar
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T08:20:50Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "SUB_SURFACE, a 2D browser game inspired by No Man’s Sky and Subnautica, fused with some imagination of mine. You crash-land on a dead planet at the edge of a solar system, mine beneath the surface of four planets to repair and arm your ship, then fly through space dodging asteroids toward the black hole at the center, fighting past its guardian to find out what happened to everyone who lived there. ~4-5 minute playthrough, runs entirely in-browser. Building the mining loop was the hardest part; getting digging, a fog-of-war light radius, and grid movement all feeling right together took the most iteration. Keeping the whole thing feeling like one continuous experience was also tricky: space flight, planet mining, and the boss fight all needed to hand off into each other cleanly without breaking anything that came before. ORPH, the ship’s AI and its dialogue (Undertale-style typewriter box, with its own portrait) carries the mystery of what happened to everyone in this system throughout the whole playthrough instead of dumping it all in one cutscene. Also proud of how the mining loop turned out: digging through a fog-of-war light radius to find buried ore actually feels tense, not just mechanical. And getting space flight, planet mining, and the boss fight to all hand off into one continuous ~4-5 minute experience, with minimalprior game dev experience going in, felt like a real accomplishment by the end. Controls: arrow keys/WASD to fly and move, E to land/launch, left-click to mine (you can only mine blocks within one tile of your character), SPACE to shoot in the boss fight. It’s a single continuous playthrough start to finish; no save/checkpoints, so best played in one sitting.", "repo": "https://github.com/omar-mse/sub-surface", "demo": "https://omarmse.itch.io/sub-surface/"}]...
|
[{"post_id": 29358, "ts": "202 [{"post_id": 29358, "ts": "2026-07-16T08:02:23Z", "hours": 0.4, "text": "devlog #5 Wired all four planets into one continuous loop — crash site, then Rustworld, Tethys, and Ember in order - with the locator arrow and objectives updating as you go. Added ORPH, the ship’s agent, with dialogue triggered at every major beat, building toward the black hole at the center of the system becoming enterable once all four planets are done."}, {"post_id": 29074, "ts": "2026-07-15T18:41:49Z", "hours": 0.2667, "text": "devlog #4 This was a big one. Built a 5×10 grid you dig into block by block, with gravity-free grid movement, a soft light radius so you can only see nearby tiles, and ore scattered underground (iron, gold, hard ice, titanium depending on the planet). Collect 5 of the right ore and you can launch back to space."}, {"post_id": 29006, "ts": "2026-07-15T17:28:19Z", "hours": 0.4, "text": "devlog #3 Placed the four planets in the space view and got a locator arrow pointing toward whichever one’s the current objective. Added the “Land?” prompt that triggers when you fly close enough, with a short landing animation handing off into planet mode."}, {"post_id": 28829, "ts": "2026-07-15T10:27:50Z", "hours": 0.3117, "text": "devlog #2 Built the spaceship’s movement; real drift physics, so thrusting adds momentum and letting go keeps you gliding instead of stopping dead. Added a thruster flame and the first hazard: asteroids spawning from random screen edges that you have to dodge while getting used to the controls."}, {"post_id": 27817, "ts": "2026-07-13T18:18:41Z", "hours": 0.2983, "text": "devlog #1 Set up the game’s foundation: one canvas, one game loop, and a state machine (Title → Space → Planet → Boss → Ending) so every screen is its own self-contained mode. Got the title screen showing and switching states cleanly before building anything else on top."}]...
|
Title: SUB_SURFACE by @omar | Stardance
Devlogs:
Title: SUB_SURFACE by @omar | Stardance
Devlogs:
devlog #1 Set up the game’s foundation: one canvas, one game loop, and a state machine (Title → Space → Planet → Boss → Ending) so every screen is its own self-contained mode. Got the title screen showing and switching states cleanly before building anything else on top.
devlog #2 Built the spaceship’s movement; real drift physics, so thrusting adds momentum and letting go keeps you gliding instead of stopping dead. Added a thruster flame and the first hazard: asteroids spawning from random screen edges that you have to dodge while getting used to the controls.
devlog #3 Placed the four planets in the space view and got a locator arrow pointing toward whichever one’s the current objective. Added the “Land?” prompt that triggers when you fly close enough, with a short landing animation handing off into planet mode.
devlog #4 This was a big one. Built a 5×10 grid you dig into block by block, with gravity-free grid movement, a soft light radius so you can only see nearby tiles, and ore scattered underground (iron, gold, hard ice, titanium depending on the planet). Collect 5 of the right ore and you can launch back to space.
devlog #5 Wired all four planets into one continuous loop — crash site, then Rustworld, Tethys, and Ember in order - with the locator arrow and objectives updating as you go. Added ORPH, the ship’s agent, with dialogue triggered at every major beat, building toward the black hole at the center of the system becoming enterable once all four planets are done.
Ships:
SUB_SURFACE, a 2D browser game inspired by No Man’s Sky and Subnautica, fused with some imagination of mine. You crash-land on a dead planet at the edge of a solar system, mine beneath the surface of four planets to repair and arm your ship, then fly through space dodging asteroids toward the black hole at the center, fighting past its guardian to find out what happened to everyone who lived there. ~4-5 minute playthrough, runs entirely in-browser. Building the mining loop was the hardest part; getting digging, a fog-of-war light radius, and grid movement all feeling right together took the most iteration. Keeping the whole thing feeling like one continuous experience was also tricky: space flight, planet mining, and the boss fight all needed to hand off into each other cleanly without breaking anything that came before. ORPH, the ship’s AI and its dialogue (Undertale-style typewriter box, with its own portrait) carries the mystery of what happened to everyone in this system throughout the whole playthrough instead of dumping it all in one cutscene. Also proud of how the mining loop turned out: digging through a fog-of-war light radius to find buried ore actually feels tense, not just mechanical. And getting space flight, planet mining, and the boss fight to all hand off into one continuous ~4-5 minute experience, with minimalprior game dev experience going in, felt like a real accomplishment by the end. Controls: arrow keys/WASD to fly and move, E to land/launch, left-click to mine (you can only mine blocks within one tile of your character), SPACE to shoot in the boss fight. It’s a single continuous playthrough start to finish; no save/checkpoints, so best played in one sitting....
|
1792979695.3840864
|
1793066095.3840864
|
|
2047
|
Nexus 7 VideoGame by @AbhinavK | Stardance
|
AbhinavK
|
1
|
3.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T03:14:37Z", "hours": 3.0, "multiplier": 4.17, "payout": 14, "blessing": "neutral", "text": "NEXUS-7: Crystalline Wastes is a 3D sci-fi platformer built from scratch with Three.js and RAPIER physics. You play a sentient energy orb that crash-landed on an alien world — roll and jump through obstacle courses, split into multiple orbs to solve traversal puzzles, and talk to story NPCs to recover power cores and escape via the Signal Tower. Features real-time physics-driven movement, a custom dialogue/mission system, moving platforms, checkpoints, and a fully procedural alien landscape.", "repo": "https://github.com/AKAbhinav99/Nexus-7-VideoGame", "demo": "https://akabhinav99.github.io/Nexus-7-VideoGame/"}]...
|
[{"post_id": 10400, "ts": "202 [{"post_id": 10400, "ts": "2026-06-17T02:58:26Z", "hours": 3.3553, "text": "Game design"}]...
|
Title: Nexus 7 VideoGame by @AbhinavK | Stardance
Title: Nexus 7 VideoGame by @AbhinavK | Stardance
Devlogs:
Game design
Ships:
NEXUS-7: Crystalline Wastes is a 3D sci-fi platformer built from scratch with Three.js and RAPIER physics. You play a sentient energy orb that crash-landed on an alien world — roll and jump through obstacle courses, split into multiple orbs to solve traversal puzzles, and talk to story NPCs to recover power cores and escape via the Signal Tower. Features real-time physics-driven movement, a custom dialogue/mission system, moving platforms, checkpoints, and a fully procedural alien landscape....
|
1792968672.5501933
|
1793055072.5501933
|
|
2056
|
Castle Game by @Script | Stardance
|
Script
|
1
|
33.55
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T17:42:10Z", "hours": 32.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My first Godot game. Play as a “knight” and fight enemies, harvest resources, and forge tools and weapons. Doesn’t really have a gameplay loop. Kinda just what I’m making to learn Godot. After a couple weeks of working on the game, it’s finally done. All mechanics are fully functional, and there aren’t any huge bugs that I’ve noticed. Make sure to check out the README before you play or if you can’t figure out what’s going on.", "repo": "https://github.com/Zicawoomps/castle-game", "demo": "https://zicawoomps.itch.io/castle-game"}]...
|
[{"post_id": 24864, "ts": "202 [{"post_id": 24864, "ts": "2026-07-08T18:31:35Z", "hours": 1.5467, "text": "Item dropping, a death screen, and ysort have been added… not sure why they werent in the game to begin with"}, {"post_id": 21518, "ts": "2026-07-03T15:02:37Z", "hours": 4.9064, "text": "I added crafting ! I thought it would only take me an hour, maybe 2, but I ended up spending 5 hours implementing it and debugging it (debugging it took at least 2 hours) There was an issue where the menu wouldn’t place the text and buttons properly if you crafted an item, left the room, and came back and tried to craft another item. After nearly half an hour of trying to figure it out, I realized I only needed to move a single variable. Now I just need to ship the project"}, {"post_id": 20266, "ts": "2026-07-01T20:21:51Z", "hours": 4.2094, "text": "I finally added the enemy. I decided on a skeleton because it would be easy to make sprites for. It doesn’t have animations and I may or may not get around to adding them. Next I will be adding more inventory slots (9 instead of 5) and a crafting system, and that should put this project in a state where it can be shipped"}, {"post_id": 16354, "ts": "2026-06-26T16:37:44Z", "hours": 4.2681, "text": "The ladder in Room 2 finally goes somewhere! Introducing the cave, where you can mine iron and diamond ore. They will eventually be used to craft different items. It took me a hot minute to debug the door transitions. I originally had the room transitions using PackedScenes added through an export variable, but Godot said “nuh uh” when I wanted to make back and forth room transitions. I had to switch to using an export var that accepted scene file paths."}, {"post_id": 14754, "ts": "2026-06-23T23:34:17Z", "hours": 2.1889, "text": "I added the training dummy!!"}, {"post_id": 13919, "ts": "2026-06-22T20:31:29Z", "hours": 8.7997, "text": "Devlog 2 Even after making a note to myself to post devlogs more often, I managed to log an hour more here than in my previous devlog. I’ve added a hotbar, actual player sprites, and a toy sword (yes, the player has pizza on their head)"}, {"post_id": 7604, "ts": "2026-06-12T18:28:53Z", "hours": 7.6778, "text": "I know its not much (especially for nearly 8 hours of work, but I guess its nice for my first time using Godot), but I’m proud of what I’ve make so far. I have stand in player sprites and animations, a rudimentary tileset and room switching. The only room not fully shown is a long hallway that extends up, and I should specify that the image below is a compilation of screenshots, but you probably figured that out. I plan on adding enemies to the tall room, a cave down the ladder in the center room, and a crafting system which can be accessed in the room on the right."}]...
|
Title: Castle Game by @Script | Stardance
Devlogs Title: Castle Game by @Script | Stardance
Devlogs:
I know its not much (especially for nearly 8 hours of work, but I guess its nice for my first time using Godot), but I’m proud of what I’ve make so far. I have stand in player sprites and animations, a rudimentary tileset and room switching. The only room not fully shown is a long hallway that extends up, and I should specify that the image below is a compilation of screenshots, but you probably figured that out. I plan on adding enemies to the tall room, a cave down the ladder in the center room, and a crafting system which can be accessed in the room on the right.
Devlog 2 Even after making a note to myself to post devlogs more often, I managed to log an hour more here than in my previous devlog. I’ve added a hotbar, actual player sprites, and a toy sword (yes, the player has pizza on their head)
I added the training dummy!!
The ladder in Room 2 finally goes somewhere! Introducing the cave, where you can mine iron and diamond ore. They will eventually be used to craft different items. It took me a hot minute to debug the door transitions. I originally had the room transitions using PackedScenes added through an export variable, but Godot said “nuh uh” when I wanted to make back and forth room transitions. I had to switch to using an export var that accepted scene file paths.
I finally added the enemy. I decided on a skeleton because it would be easy to make sprites for. It doesn’t have animations and I may or may not get around to adding them. Next I will be adding more inventory slots (9 instead of 5) and a crafting system, and that should put this project in a state where it can be shipped
I added crafting ! I thought it would only take me an hour, maybe 2, but I ended up spending 5 hours implementing it and debugging it (debugging it took at least 2 hours) There was an issue where the menu wouldn’t place the text and buttons properly if you crafted an item, left the room, and came back and tried to craft another item. After nearly half an hour of trying to figure it out, I realized I only needed to move a single variable. Now I just need to ship the project
Item dropping, a death screen, and ysort have been added… not sure why they werent in the game to begin with
Ships:
My first Godot game. Play as a “knight” and fight enemies, harvest resources, and forge tools and weapons. Doesn’t really have a gameplay loop. Kinda just what I’m making to learn Godot. After a couple weeks of working on the game, it’s finally done. All mechanics are fully functional, and there aren’t any huge bugs that I’ve noticed. Make sure to check out the README before you play or if you can’t figure out what’s going on....
|
1793000938.2160354
|
1793087338.2160354
|
|
2067
|
Pi Zero 2 W Enclosure by @Jxsh | Stardance
|
Jxsh
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-01T18:46:16Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PrintGuard Raspberry Pi Zero 2 W Protective Enclosure Start Time: 01/05/2026 End Time: 04/05/2026 Total Hours: 5.3 hrs Session 1 Date: 01/05/2026 Time: 2pm - 3pm Duration: 1 hr Work Type: Research Tasks: Researched the Raspberry Pi Zero 2 W specifications Got measurements for the PCB (65mm × 30mm) Noted port positions for Mini HDMI, Micro USB OTG, Micro USB power and microSD slot Session 2 Date: 02/05/2026 Time: 10am - 11:30am Duration: 1.5 hrs Work Type: Modelling Tasks: Set up new Onshape project for PrintGuard Created base sketch using Pi Zero 2 W measurements Modelled enclosure base with 4× M2.5 standoff columns and port cutouts Exported base as STL (printGuard.stl) Session 3 Date: 03/05/2026 Time: 2pm - 3:30pm Duration: 1.5 hrs Work Type: Modelling / Testing Tasks: Designed snap fit lid in Onshape with passive cooling fins Added optional OLED window and a protective lid Images: Screenshot 2026-05-25 at 13 10 30 ⚠️ Issues / Challenges microSD cutout was 0.5mm too narrow on first print — fixed by updating it github link wasnt working (fixed)", "repo": "https://github.com/Jack12346785/PrintGuard-Raspberry-Pi-Zero-2-W-Protective-Enclosure", "demo": ""}]...
|
[{"post_id": 373, "ts": "2026- [{"post_id": 373, "ts": "2026-06-01T18:37:20Z", "hours": 0.3825, "text": "the enclosure"}]...
|
Title: Pi Zero 2 W Enclosure by @Jxsh | Stardance
Title: Pi Zero 2 W Enclosure by @Jxsh | Stardance
Devlogs:
the enclosure
Ships:
PrintGuard Raspberry Pi Zero 2 W Protective Enclosure Start Time: 01/05/2026 End Time: 04/05/2026 Total Hours: 5.3 hrs Session 1 Date: 01/05/2026 Time: 2pm - 3pm Duration: 1 hr Work Type: Research Tasks: Researched the Raspberry Pi Zero 2 W specifications Got measurements for the PCB (65mm × 30mm) Noted port positions for Mini HDMI, Micro USB OTG, Micro USB power and microSD slot Session 2 Date: 02/05/2026 Time: 10am - 11:30am Duration: 1.5 hrs Work Type: Modelling Tasks: Set up new Onshape project for PrintGuard Created base sketch using Pi Zero 2 W measurements Modelled enclosure base with 4× M2.5 standoff columns and port cutouts Exported base as STL (printGuard.stl) Session 3 Date: 03/05/2026 Time: 2pm - 3:30pm Duration: 1.5 hrs Work Type: Modelling / Testing Tasks: Designed snap fit lid in Onshape with passive cooling fins Added optional OLED window and a protective lid Images: Screenshot 2026-05-25 at 13 10 30 ⚠️ Issues / Challenges microSD cutout was 0.5mm too narrow on first print — fixed by updating it github link wasnt working (fixed)...
|
1792994186.2305934
|
1793080586.2305934
|
|
2104
|
Lunatria by @LonleySailor | Stardance
|
LonleySailor
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T13:51:31Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a custom built SSO for my server to overcome the challenges of services not support SSO’s. In this ship I am proud to present the addition of support for the Jellyfin mobile app and improved administration. The most challenging was figuring out how to split web and app traffic. After logging and comparing many HTTP requests, I eventually discovered that two small letters (wv) in the User-Agent distinguished Android WebView traffic from normal web traffic. That discovery allowed me to route requests differently and implement a mobile-specific authentication flow. (I go into much more detail in Devlog #2.). To access the demo use these credentials for the demo’s admin account: Username:lunatria-demo, Password: Y8x0nm5VDfATDH To access the administration panel go to: https://lunatria.xyz/admin-panel", "repo": "https://github.com/LonleySailor/Lunatria", "demo": "https://lunatria.xyz"}]...
|
[{"post_id": 23592, "ts": "202 [{"post_id": 23592, "ts": "2026-07-06T17:14:38Z", "hours": 6.9492, "text": "Lunatria Second Devlog: After getting Lunatria working in the browser, I wanted the Jellyfin mobile app to work as well. Unfortunately, my browser authentication flow couldn’t be reused directly inside the app, so I had to figure out how the mobile client authenticated differently. My first hypothesis was that Jellyfin explicitly identified whether a request came from the browser or the mobile app. To test this, I created a temporary domain (observe-jellyfin.lunatria.com) and logged every request passing through Nginx (Screenshot 1 shows the logging setup). However, this turned out not to be the case. After inspecting requests from both the web and mobile app, I started comparing the User-Agent headers. After going through tens of requests, I finally noticed the only consistent difference: two tiny letters in the User-Agent — wv, meaning WebView (Screenshot 2 shows the two User-Agent strings). After looking it up, I learned that wv indicates an embedded Android WebView. At first I wasn’t sure this was the real distinction, but after testing across multiple devices, I confirmed it: wv effectively separates mobile app traffic from web traffic. To handle this, I added a variable in the Nginx configuration to split routing between web and app traffic (Screenshot 3 shows the config change). However, authentication was still an issue. On the web version of Jellyfin, I route traffic through a special HTML page that uses the SSO session to fetch and store the Jellyfin auth token. In the mobile app, this approach doesn’t work. After some consideration, I decided to route all mobile app traffic directly to Jellyfin except for one endpoint: the authentication endpoint. On Jellyfin, this is /Users/AuthenticateByName. I route this request to my backend instead (Screenshot 4 shows the routing logic). The backend uses the SSO credentials provided by the user in the Jellyfin app, retrieves the corresponding Jellyfin auth token (stored securely and encrypted), and responds in place of Jellyfin. And success — the Jellyfin mobile app is now fully accessible through Lunatria. (You can check the Nginx configs in the repo.)"}, {"post_id": 20812, "ts": "2026-07-02T14:54:40Z", "hours": 3.4894, "text": "Hii, this is my first devlog about my project which is pride and honor. Let me introduce it first. I have a home server, sitting next to the router in my house. I use it for many things but one of them is entertainment. For that I use Jellyfin for streaming, radarr and sonarr for adding to the library. The issue I ran into is when granting access to these apps for friends and family I had to send 3 username+passwords and along the way as I add more services more and more passwords would be needed. So I decided to look for a SSO. There are many selfhosted options which do work well, but all had 1 downside. They need the service itself to support SSO’s. I thought about contributing to those services to integrate SSO’s but at the time I was too scared and didn’t have enough knowledge to be sure of what I am even doing. So I decided to write my own. What I came up with was a backend - for handling API’s and DB requests for user’s credentials, nginx - a proxy and routing to redirect authorization to my backend, frontend- a status dashboard, administration, and a login page for users to log in. Before stardance I managed to create the status page, form for users to log in, administration panel for adding users and adding credentials for them, as well as proxying Jellyfin, Sonarr and Radarr but only when using a browser. During stardance I want to expand and improve my SSO. This devlog covers the first improvements I made during stardance. I improved the UI of creating new users as well as adding the option to remove users. I also improved the UI of Credential management and adding the option to remove credentials, and adding the “Service Access” page to add and remove access for users to certain services. This was pretty easy as I had all the blocks in place, create a API for deleting users, credential, and access, create a API for fetching username’s. And building the UI was just expanding already existing features. I look forward to expanding more features. LonleySailor"}]...
|
Title: Lunatria by @LonleySailor | Stardance
Devl Title: Lunatria by @LonleySailor | Stardance
Devlogs:
Hii, this is my first devlog about my project which is pride and honor. Let me introduce it first. I have a home server, sitting next to the router in my house. I use it for many things but one of them is entertainment. For that I use Jellyfin for streaming, radarr and sonarr for adding to the library. The issue I ran into is when granting access to these apps for friends and family I had to send 3 username+passwords and along the way as I add more services more and more passwords would be needed. So I decided to look for a SSO. There are many selfhosted options which do work well, but all had 1 downside. They need the service itself to support SSO’s. I thought about contributing to those services to integrate SSO’s but at the time I was too scared and didn’t have enough knowledge to be sure of what I am even doing. So I decided to write my own. What I came up with was a backend - for handling API’s and DB requests for user’s credentials, nginx - a proxy and routing to redirect authorization to my backend, frontend- a status dashboard, administration, and a login page for users to log in. Before stardance I managed to create the status page, form for users to log in, administration panel for adding users and adding credentials for them, as well as proxying Jellyfin, Sonarr and Radarr but only when using a browser. During stardance I want to expand and improve my SSO. This devlog covers the first improvements I made during stardance. I improved the UI of creating new users as well as adding the option to remove users. I also improved the UI of Credential management and adding the option to remove credentials, and adding the “Service Access” page to add and remove access for users to certain services. This was pretty easy as I had all the blocks in place, create a API for deleting users, credential, and access, create a API for fetching username’s. And building the UI was just expanding already existing features. I look forward to expanding more features. LonleySailor
Lunatria Second Devlog: After getting Lunatria working in the browser, I wanted the Jellyfin mobile app to work as well. Unfortunately, my browser authentication flow couldn’t be reused directly inside the app, so I had to figure out how the mobile client authenticated differently. My first hypothesis was that Jellyfin explicitly identified whether a request came from the browser or the mobile app. To test this, I created a temporary domain (observe-jellyfin.lunatria.com) and logged every request passing through Nginx (Screenshot 1 shows the logging setup). However, this turned out not to be the case. After inspecting requests from both the web and mobile app, I started comparing the User-Agent headers. After going through tens of requests, I finally noticed the only consistent difference: two tiny letters in the User-Agent — wv, meaning WebView (Screenshot 2 shows the two User-Agent strings). After looking it up, I learned that wv indicates an embedded Android WebView. At first I wasn’t sure this was the real distinction, but after testing across multiple devices, I confirmed it: wv effectively separates mobile app traffic from web traffic. To handle this, I added a variable in the Nginx configuration to split routing between web and app traffic (Screenshot 3 shows the config change). However, authentication was still an issue. On the web version of Jellyfin, I route traffic through a special HTML page that uses the SSO session to fetch and store the Jellyfin auth token. In the mobile app, this approach doesn’t work. After some consideration, I decided to route all mobile app traffic directly to Jellyfin except for one endpoint: the authentication endpoint. On Jellyfin, this is /Users/AuthenticateByName. I route this request to my backend instead (Screenshot 4 shows the routing logic). The backend uses the SSO credentials provided by the user in the Jellyfin app, retrieves the corresponding Jellyfin auth token (stored securely and encrypted), and responds in place of Jellyfin. And success — the Jellyfin mobile app is now fully accessible through Lunatria. (You can check the Nginx configs in the repo.)
Ships:
This is a custom built SSO for my server to overcome the challenges of services not support SSO’s. In this ship I am proud to present the addition of support for the Jellyfin mobile app and improved administration. The most challenging was figuring out how to split web and app traffic. After logging and comparing many HTTP requests, I eventually discovered that two small letters (wv) in the User-Agent distinguished Android WebView traffic from normal web traffic. That discovery allowed me to route requests differently and implement a mobile-specific authentication flow. (I go into much more detail in Devlog #2.). To access the demo use these credentials for the demo’s admin account: Username:lunatria-demo, Password: Y8x0nm5VDfATDH To access the administration panel go to: https://lunatria.xyz/admin-panel...
|
1792994157.7035706
|
1793080557.7035706
|
|
2106
|
Space Birthday by @Froglan | Stardance
|
Froglan
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T14:33:12Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Shipping! This is my first Stardance mini project. I created a web app, where you can see the the images from NASA APOD on any date from June 16, 1995. The reason why I called it Space birthday is that you can see the NASA photo on your exact birthday. The main reason why I made this project is that I wanted to practise my Python skills and make a web app. I can not write HTML or CSS, so I decided to use Streamlit, which is very easy to use, if you know the Python basics. I am proud that I used AI only to brainstorm the main idea, but I built the app myself. Enjoy the app!", "repo": "https://github.com/Pribma/Space_birthday", "demo": "https://space-birthday.streamlit.app/"}]...
|
[{"post_id": 40746, "ts": "202 [{"post_id": 40746, "ts": "2026-08-04T14:04:33Z", "hours": 0.7372, "text": "DEVLOG [3] - Last improvements before shipping Today I managed to improve the UI, fix bug with the calendar, launch the app to the Streamlit server and rewrite README. Enjoy the app!"}, {"post_id": 40322, "ts": "2026-08-03T19:20:09Z", "hours": 0.4931, "text": "DEVLOG [2] - API Integration Today I added requests to have communication with NASA servers. Also added secure way to work with API keys. And finally added the imgae, headline and explanation of that image."}, {"post_id": 35231, "ts": "2026-07-26T15:11:04Z", "hours": 0.5478, "text": "DEVLOG [1] - First commit Today I added header, text and a button using Python and Streamlit. Still learning python, so most time was spent in browser."}]...
|
Title: Space Birthday by @Froglan | Stardance
Dev Title: Space Birthday by @Froglan | Stardance
Devlogs:
DEVLOG [1] - First commit Today I added header, text and a button using Python and Streamlit. Still learning python, so most time was spent in browser.
DEVLOG [2] - API Integration Today I added requests to have communication with NASA servers. Also added secure way to work with API keys. And finally added the imgae, headline and explanation of that image.
DEVLOG [3] - Last improvements before shipping Today I managed to improve the UI, fix bug with the calendar, launch the app to the Streamlit server and rewrite README. Enjoy the app!
Ships:
Shipping! This is my first Stardance mini project. I created a web app, where you can see the the images from NASA APOD on any date from June 16, 1995. The reason why I called it Space birthday is that you can see the NASA photo on your exact birthday. The main reason why I made this project is that I wanted to practise my Python skills and make a web app. I can not write HTML or CSS, so I decided to use Streamlit, which is very easy to use, if you know the Python basics. I am proud that I used AI only to brainstorm the main idea, but I built the app myself. Enjoy the app!...
|
1792986840.4167721
|
1793073240.4167721
|
|
2129
|
SuperOrbital by @obedot | Stardance
|
obedot
|
1
|
183.0
|
2657
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T00:50:05Z", "hours": 183.0, "multiplier": 14.57, "payout": 2657, "blessing": "neutral", "text": "SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8", "repo": "https://github.com/orivio/super_orbital", "demo": "https://obedh.itch.io/superorbital"}]...
|
[{"post_id": 72452, "ts": "202 [{"post_id": 72452, "ts": "2026-09-23T00:34:22Z", "hours": 3.1192, "text": "Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!"}, {"post_id": 71290, "ts": "2026-09-20T16:09:42Z", "hours": 4.3556, "text": "FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now."}, {"post_id": 69415, "ts": "2026-09-17T00:28:27Z", "hours": 4.0075, "text": "THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it."}, {"post_id": 65675, "ts": "2026-09-10T23:59:06Z", "hours": 9.0878, "text": "Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun."}, {"post_id": 63535, "ts": "2026-09-07T13:31:33Z", "hours": 1.2772, "text": "Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels."}, {"post_id": 63220, "ts": "2026-09-06T22:04:35Z", "hours": 5.6608, "text": "Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects."}, {"post_id": 62481, "ts": "2026-09-05T21:00:44Z", "hours": 5.6092, "text": "Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release."}, {"post_id": 61134, "ts": "2026-09-03T21:52:29Z", "hours": 2.725, "text": "Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?"}, {"post_id": 60806, "ts": "2026-09-03T12:28:16Z", "hours": 0.8911, "text": "Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version."}, {"post_id": 60543, "ts": "2026-09-02T23:03:33Z", "hours": 1.2192, "text": "Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact."}, {"post_id": 60497, "ts": "2026-09-02T21:24:04Z", "hours": 7.9831, "text": "Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels."}, {"post_id": 59189, "ts": "2026-08-31T20:47:27Z", "hours": 4.8492, "text": "Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music."}, {"post_id": 58502, "ts": "2026-08-30T22:41:57Z", "hours": 6.7444, "text": "Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol"}, {"post_id": 57575, "ts": "2026-08-29T19:17:53Z", "hours": 2.8072, "text": "Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first."}, {"post_id": 56888, "ts": "2026-08-28T21:33:33Z", "hours": 3.1403, "text": "Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again."}, {"post_id": 56307, "ts": "2026-08-28T01:19:58Z", "hours": 3.0025, "text": "Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine."}, {"post_id": 54818, "ts": "2026-08-25T23:28:18Z", "hours": 1.6025, "text": "Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win."}, {"post_id": 54128, "ts": "2026-08-24T23:06:45Z", "hours": 4.1431, "text": "Greatly improved the facility’s tileset by adding details and more background elements."}, {"post_id": 47770, "ts": "2026-08-15T22:44:25Z", "hours": 5.9028, "text": "Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things."}, {"post_id": 47113, "ts": "2026-08-14T19:20:03Z", "hours": 9.8889, "text": "I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game."}, {"post_id": 44826, "ts": "2026-08-10T21:02:18Z", "hours": 9.2131, "text": "I’m bettering my backgrounds, bettering my visuals, bettering my levels!"}, {"post_id": 43535, "ts": "2026-08-08T21:13:55Z", "hours": 5.8183, "text": "Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects"}, {"post_id": 39099, "ts": "2026-08-01T20:07:54Z", "hours": 9.0683, "text": "I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist."}, {"post_id": 36431, "ts": "2026-07-28T15:36:26Z", "hours": 3.005, "text": "Made new run, idle, and jump animations and added the final layer"}, {"post_id": 35254, "ts": "2026-07-26T15:39:00Z", "hours": 1.1678, "text": "Added some great audio settings"}, {"post_id": 35153, "ts": "2026-07-26T12:07:00Z", "hours": 9.5392, "text": "Added a save file system"}, {"post_id": 32506, "ts": "2026-07-21T18:48:48Z", "hours": 10.2469, "text": "I added input control remapping for my platformer game. We also added more dialogue."}, {"post_id": 31328, "ts": "2026-07-19T17:03:06Z", "hours": 9.1842, "text": "I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes."}, {"post_id": 27351, "ts": "2026-07-12T20:49:33Z", "hours": 6.6386, "text": "I just finished a new tileset for my 2d platformer."}, {"post_id": 20330, "ts": "2026-07-01T22:08:11Z", "hours": 6.9336, "text": "I made better running and jumping animations for my 2D platformer."}, {"post_id": 15865, "ts": "2026-06-25T19:51:18Z", "hours": 7.995, "text": "I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/"}, {"post_id": 12686, "ts": "2026-06-20T18:43:02Z", "hours": 2.7389, "text": "I added another level with a lot of spikes, platforms and timing!"}, {"post_id": 12003, "ts": "2026-06-19T16:14:06Z", "hours": 1.7231, "text": "I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites."}, {"post_id": 11513, "ts": "2026-06-18T20:06:11Z", "hours": 4.5739, "text": "I added Jump Cutting, Jump Buffering, and Death to my platformer"}, {"post_id": 5261, "ts": "2026-06-08T23:43:38Z", "hours": 6.7183, "text": "Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)"}]...
|
Title: SuperOrbital by @obedot | Stardance
Devlog Title: SuperOrbital by @obedot | Stardance
Devlogs:
Setting up basic movement and levels for my platformer (guys I KNOW the sprites look bad)
I added Jump Cutting, Jump Buffering, and Death to my platformer
I added a level that teaches you the jump cutting mechanic in my 2D platformer game. I’m also experimenting with new character sprites.
I added another level with a lot of spikes, platforms and timing!
I made this cool background for my game’s menu. I learned about shaders from the book “The Book of Shaders” by Patricio Gonzalez Vivo and Jen Lowe, and some of my shaders were inspired by the content in that book. The star effect was inspired by this very helpful reddit post: https://www.reddit.com/r/godot/comments/1m0czqd/starry_background_in_this_many_lines_of_shader/
I made better running and jumping animations for my 2D platformer.
I just finished a new tileset for my 2d platformer.
I tried adding a parallax effect, but it didn’t turn out how I wanted. I fixed a bug with the camera scale not being a whole number ratio. I’m starting to add the last few mechanics to the game, which involve Black Holes.
I added input control remapping for my platformer game. We also added more dialogue.
Added a save file system
Added some great audio settings
Made new run, idle, and jump animations and added the final layer
I’ve added a few more challenging levels. I also almost finished up the sprite work on the protagonist.
Added some more levels to my platformer game, and pretty much done-iffied the player sprite and sound effects
I’m bettering my backgrounds, bettering my visuals, bettering my levels!
I’m redoing the level system to clean up the spaghetti code situation. My teammate redesigned one of the characters, and I added it to the game.
Well, I tried to refactor the entire world system, but I gave up. It was just taking way too long. I guess I’ll just have to deal with the spaghetti code for now. I did finish the level select screen, and I think it looks pretty good. I just have to rename some of the levels because they are named very generic things.
Greatly improved the facility’s tileset by adding details and more background elements.
Polished the levels even more, added new art assets, and fixed some minor tile inconsistencies. I also drew this boulder, which currently doesn’t look that great, but I’ll improve it later and add it somewhere where it fits in the game. I showed this game to my grandma, and she was able to figure out the controls pretty quickly, so I see that as a win.
Fully refactored the level manager. After a few hours, I have finally cleaned up all the code for level transitions. Now, the code is easier to understand and maintain, and adding new levels takes significantly less time and effort. I added comments on all the related code to make it even easier to read. I also fixed a few bugs in the process. For example, trying to open the menu during a level transition used to put the game in a glitched state, but I fixed that now. I moved towards a cleaner architecture where the scene root (play.tscn) manages the game state, and the pause menu asks the play scene to open the menu, instead of just going ahead and doing it. It’s possible that this refactor may have broken some other aspects of the game, so I’ll have to look over everything later, but right now, it seems to be working fine.
Started refactoring the player movement script. I’m starting from scratch, so I only have basic horizontal movement yet. I added an input sequence recorder to make it easier to replicate bugs, so you can record a sequence of inputs and then play them back again.
Redoing the Player Movement I remade the player movement system from scratch, because my previous implementation just wasn’t working. It was buggy, and the movement didn’t feel good to play. My new movement system is not entirely complete, but it already feels much better. For one thing, the variable jump height is much smoother, and stopping a jump midair doesn’t feel as abrupt. I added coyote time, jump buffering, air friction, and faster falling for game juice. I still need to fine tune the settings, and get some more people to playtest the movement. There are more movement mechanics I need to add, such as dashing, but I want to get the basic movement completely down first.
Created a rough draft of the intro cutscene, and composed music for it The intro cutscene/storyboard I used libresprite to make a basic idea of what the intro cutscene should look like. I still have more to add, and as you can tell, the text is practically illegible. Yeah, libresprite doesn’t have a text tool. But I’ll fix it soon and it’ll look awesome. The intro music I made this song using FamiStudio with the EPSM expansion and FamiStudio’s default instrument pack. This let me use the instruments I wanted while still sounding retro-ish. My brother helped me work on the song, because he’s way better at music than I am. I still need to revise the song more, this is more of a first draft. Any feedback would be appreciated lol
Added more to the opening cutscene I don’t want to give away the intro until the game is ready, but I’ll share parts of what I made. This first frame took me the longest, over 2 hours. I planned to animate the guy standing up and walking, but I now realize that that’s probably not feasible. I think it will look great anyway though. I might improve some little parts of the drawing. Creating a cutscene manager in Godot I set up an AnimationPlayer to direct the cutscene, and it’s actually quite easy. I do need to align my crossfades correctly and sync everything with the music.
Improved Game Juice and Improved Visual Effects Game Juice I started working on adding the little details to the movement that make the game way more fun to play. I added a few freeze frames when starting a dash, which was inspired by Celeste. I also added a bit of camera shake to give the player even more feedback on their movement. Visual Effects This part was really satisfying. I made a shockwave warp effect around the player when they perform a gravity switch, which looks great. Then I made the black holes look better by distorting the background. Frustrating Bugs I’ve been having a lot of movement bugs that are tricky and inconsistent to replicate, and I can’t figure them out yet. Next Steps I still need to get the AnimationTree to work, but that should really be quite easy. I still have to redesign some levels.
Refined the Gravity Switch Shockwave Even More It made the shockwave effect go by faster, and be properly centered on the player. This makes the shockwave feel just right when playing the game, and gives the gravity switch the perfect amount of impact.
Fixed a Tricky Level Transition Bug I was experiencing this frustrating bug where, if you try to run back and forth between levels too fast, you can fall off the map. I expanded the camera boundaries to see what was happening better, and slowed down the game a bit using Godot’s awesome tools. I solved the bug by reordering the level transition code. On the first slide, you can see the original bug, and on the third slide, you can see the fixed version.
Greatly improved the Level Select screen by making animated level buttons I used Godot’s Tweens to make the level select buttons rotate and pop when you select them. The effect isn’t perfect yet, but it’s getting there. What do think of the effect?
Finishing the Movement and Experimenting with Dynamic Lighting I finally got all the movement mechanics down. I still might refine the black holes a little bit, but first I want to redesign some of the earlier levels. My teammate suggested dynamic lighting for our game, and while it looks cool, it seems to difficult to set up completely for our Stardance release.
Redesigned Old Levels to Work Better With New Player Movement With player movement out of the way, I can get to making even better levels. This one in particular, which you can see below, is a level I’m quite proud of. I took inspiration from Hollow Knight’s Path of Pain a little bit. I don’t have much left to do, but I definitely want to add some better sound effects.
Added checkpoints to the levels If you find that the game is too challenging, you can turn on checkpoints in the settings menu. This lets you respawn at the nearest checkpoint after dying, instead of starting the whole level over again. I hope that this option can make my game playable by more people of different skill levels.
Greatly Improved Sound and Level Design I found it suprisingly easy to make good sound effects for my game. I dropped a rock on the ground and recorded it, and now, that’s the sound that plays when the player lands on rocky terrain after falling. I took a screwdriver and hit it against a bunch of things until I found something that sounded good. It’s a fun process! I also worked more on level design, by balancing everything so that the progression felt natural. I am almost finished with the final level, which I hope will challenging but fun.
THE FINISHING TOUCHES Yo yo yo, I am very close to shipping my game. I only have a little bit more to do. I’ve been working on improving the cutscenes, for example, making the colors look better and improving the perspective. I still have more work to do though, of course. Next up, I’m going to polish some of the movement mechanics some more, and then I’ll get some friends to playtest it.
FINALLY fixed an annoying physics bug, improved the intro cutscene, and made the black holes look better I’m very happy to say that the dash/platform bug I was experiencing previously has now been solved. The player used to clip out of bounds if you dashed into a moving platform, but now, the player will get teleported back to where they were before. I also did some work on the intro cutscene, and while it isn’t yet finalized, I think it looks much better. Also, I made the center of the black hole a perfect circle now.
Finished Up the GitHub Readme, Game Trailer, and Itch.io page! I did all the last remaining steps to finishing the game before shipping. I made a trailer of about 1 minute, and wrote a section of the GitHub Readme about the making of SuperOrbital. I’m going to ship now!
Ships:
SUPERORBITAL: The Quest of the Anomaly After months of hard work, @orivio and I finally present to you SUPERORBITAL. What on earth is a SUPERORBITAL? SUPERORBITAL is a 2D platformer where you play as Vitri, the only human born without gravity. After years of being ostracized by society, Vitri sets out on a mission to change things for the better. He decides to take a gamble on a popular story that’s been spreading about all planets having tangible gravity cores at their centers, and decides to find one for himself. Accompanied only by his robot assistant, G.R.A.V. (Great Robot Assistant of Vitri), Vitri flies out into deep space and lands on a planet named Zeta-C5, where he uses special abilities, such as turning gravity on and off, to explore and make his way towards the planet’s core. Difficult obstacles and even unexpected foes block his way, but he’s got to get through no matter what. Dev Messages: orivio: SUPERORBITAL has been a really fun introduction to Godot! Though challenging at times, designing the levels around our unique mechanics was pretty fun, and I think overall the game turned out pretty great! Obviously it is only an alpha release, so I plan on working together with Obe Dot to polish it a ton, in terms of artwork, music, story, etc. Expect lots more content to come! Obe Dot: Developing this game has been an amazing experience. This is my first big gamedev project, and I’ve learned so much. I really hope to work more on this project in the future, while also improving my art and programming skills. Much appreciation to Hack Club for creating this event! Try out the game on our itch, or watch the provided gameplay footage and/or trailer! Trailer: https://www.youtube.com/watch?v=5WPKXYqy1FI Gameplay: https://youtu.be/-zq8ps87daI?si=sUK4_9BedT1OdXU8...
|
1793004680.9033916
|
1793091080.9033916
|
|
2143
|
My first slack bot! by @robopugo | Stardance
|
robopugo
|
1
|
7.0
|
42
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T21:02:19Z", "hours": 7.0, "multiplier": 5.99, "payout": 42, "blessing": "neutral", "text": "I made a functioning 24/7 cryptography based slack bot. The main challenge I faced was getting nest setup and running my code, so it could run 24/7. The main feature I’m proud of is the /e$ custom encoding. The image shows the /e$ encoding and how it varies with different keys, and how the /d$ decoding always uses the current key to decode messages.", "repo": "https://github.com/no10123/First-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B96QM14UR"}]...
|
[{"post_id": 5150, "ts": "2026 [{"post_id": 5150, "ts": "2026-06-08T20:44:38Z", "hours": 0.4386, "text": "getting my project ship reday"}, {"post_id": 5116, "ts": "2026-06-08T20:05:37Z", "hours": 1.2078, "text": "added a python backend, cause i like python, originally tried it with hash, but added new ai function that calls gemini through it."}, {"post_id": 1732, "ts": "2026-06-03T22:16:53Z", "hours": 0.8989, "text": "added 3 ciphers to my bot."}, {"post_id": 1658, "ts": "2026-06-03T19:48:49Z", "hours": 0.7231, "text": "added weather command, and coppy + paste"}, {"post_id": 1602, "ts": "2026-06-03T18:48:31Z", "hours": 0.5686, "text": "added a key file, so key would remain, even while the server is being restarted or edited. Along with a translation command."}, {"post_id": 1555, "ts": "2026-06-03T17:21:18Z", "hours": 1.1325, "text": "added more cryptography themed commands"}, {"post_id": 1490, "ts": "2026-06-03T15:29:58Z", "hours": 1.6397, "text": "put it on nest, and added cryptography commands"}, {"post_id": 1046, "ts": "2026-06-02T20:59:36Z", "hours": 0.4261, "text": "Added first few commands, with plans on adding more commands. Currently waiting on my pending application for the nest, which will allow it to run 24/7."}]...
|
Title: My first slack bot! by @robopugo | Stardanc Title: My first slack bot! by @robopugo | Stardance
Devlogs:
Added first few commands, with plans on adding more commands. Currently waiting on my pending application for the nest, which will allow it to run 24/7.
put it on nest, and added cryptography commands
added more cryptography themed commands
added a key file, so key would remain, even while the server is being restarted or edited. Along with a translation command.
added weather command, and coppy + paste
added 3 ciphers to my bot.
added a python backend, cause i like python, originally tried it with hash, but added new ai function that calls gemini through it.
getting my project ship reday
Ships:
I made a functioning 24/7 cryptography based slack bot. The main challenge I faced was getting nest setup and running my code, so it could run 24/7. The main feature I’m proud of is the /e$ custom encoding. The image shows the /e$ encoding and how it varies with different keys, and how the /d$ decoding always uses the current key to decode messages....
|
1792968514.9517832
|
1793054914.9517832
|
|
2155
|
obliberry by @torkel | Stardance
|
torkel
|
1
|
433.12
|
5134
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T09:34:08Z", "hours": 270.0, "multiplier": 19.51, "payout": 5134, "blessing": "neutral", "text": "obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D", "repo": "https://github.com/torkelicious/obliberry", "demo": "https://github.com/torkelicious/obliberry/releases"}]...
|
[{"post_id": 81496, "ts": "202 [{"post_id": 81496, "ts": "2026-10-21T14:23:50Z", "hours": 7.1158, "text": "script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop(\"SpeedOrSomething\", 2.5) , PropEntity(\"TargetEntity\") and PropUI(\"MyRect\") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!"}, {"post_id": 80249, "ts": "2026-10-16T21:56:07Z", "hours": 3.8333, "text": "uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…"}, {"post_id": 79544, "ts": "2026-10-14T15:18:47Z", "hours": 7.9614, "text": "map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…"}, {"post_id": 78861, "ts": "2026-10-11T19:54:19Z", "hours": 3.0197, "text": "uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve(\"..\") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!"}, {"post_id": 78453, "ts": "2026-10-10T20:34:34Z", "hours": 4.7336, "text": "undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit.."}, {"post_id": 78136, "ts": "2026-10-09T18:21:07Z", "hours": 3.2578, "text": "export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic(\"assets/audio/music.ogg\", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭"}, {"post_id": 77620, "ts": "2026-10-07T17:38:02Z", "hours": 3.62, "text": "more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources."}, {"post_id": 76449, "ts": "2026-10-03T15:32:32Z", "hours": 3.1158, "text": "unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…"}, {"post_id": 75890, "ts": "2026-10-01T14:46:00Z", "hours": 5.4794, "text": "uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes."}, {"post_id": 73199, "ts": "2026-09-24T16:15:43Z", "hours": 7.0497, "text": "save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh"}, {"post_id": 71462, "ts": "2026-09-20T21:23:42Z", "hours": 6.445, "text": "asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…"}, {"post_id": 70788, "ts": "2026-09-19T19:20:34Z", "hours": 1.5706, "text": "I will not elaborate"}, {"post_id": 70712, "ts": "2026-09-19T17:13:26Z", "hours": 3.3022, "text": "animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 70230, "ts": "2026-09-18T19:10:52Z", "hours": 6.3242, "text": "btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play(\"walk\") Restart(\"walk\") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)"}, {"post_id": 69178, "ts": "2026-09-16T15:19:06Z", "hours": 4.2144, "text": "spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly"}, {"post_id": 67894, "ts": "2026-09-14T06:13:59Z", "hours": 2.1764, "text": "collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D"}, {"post_id": 66845, "ts": "2026-09-12T19:22:05Z", "hours": 3.0608, "text": "collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D"}, {"post_id": 66200, "ts": "2026-09-11T21:27:55Z", "hours": 3.4236, "text": "collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD"}, {"post_id": 65603, "ts": "2026-09-10T20:50:19Z", "hours": 4.8511, "text": "copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep"}, {"post_id": 64268, "ts": "2026-09-08T15:23:01Z", "hours": 3.8883, "text": "sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D"}, {"post_id": 63577, "ts": "2026-09-07T14:25:37Z", "hours": 3.9417, "text": "too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include \"rand.glsl\" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that…."}, {"post_id": 62331, "ts": "2026-09-05T17:14:14Z", "hours": 3.0172, "text": "shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)"}, {"post_id": 61599, "ts": "2026-09-04T16:12:18Z", "hours": 6.9642, "text": "more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah"}, {"post_id": 58126, "ts": "2026-08-30T14:12:01Z", "hours": 6.2431, "text": "experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!"}, {"post_id": 55765, "ts": "2026-08-27T19:09:56Z", "hours": 4.9358, "text": "custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…"}, {"post_id": 55022, "ts": "2026-08-26T13:27:21Z", "hours": 2.1303, "text": "ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)"}, {"post_id": 54551, "ts": "2026-08-25T16:02:00Z", "hours": 2.53, "text": "hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things….."}, {"post_id": 53560, "ts": "2026-08-24T04:55:16Z", "hours": 7.8433, "text": "code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk"}, {"post_id": 51782, "ts": "2026-08-21T16:57:55Z", "hours": 3.4422, "text": "mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path"}, {"post_id": 51240, "ts": "2026-08-20T19:35:22Z", "hours": 4.2758, "text": "persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough"}, {"post_id": 50497, "ts": "2026-08-19T17:37:31Z", "hours": 6.7433, "text": "persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help."}, {"post_id": 49249, "ts": "2026-08-17T22:47:10Z", "hours": 2.5156, "text": "more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was …."}, {"post_id": 48754, "ts": "2026-08-17T08:58:43Z", "hours": 2.7114, "text": "scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)"}, {"post_id": 47739, "ts": "2026-08-15T21:10:44Z", "hours": 1.0883, "text": "mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier"}, {"post_id": 47431, "ts": "2026-08-15T11:16:32Z", "hours": 9.0703, "text": "fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep.."}, {"post_id": 46512, "ts": "2026-08-13T19:50:30Z", "hours": 3.6469, "text": "…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D"}, {"post_id": 46257, "ts": "2026-08-13T11:34:55Z", "hours": 2.8147, "text": "scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting"}, {"post_id": 40738, "ts": "2026-08-04T13:46:27Z", "hours": 0.7667, "text": "Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system"}, {"post_id": 40621, "ts": "2026-08-04T08:56:51Z", "hours": 3.7144, "text": "the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry"}, {"post_id": 39155, "ts": "2026-08-01T21:44:42Z", "hours": 3.0289, "text": "Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important"}, {"post_id": 38183, "ts": "2026-07-31T13:32:00Z", "hours": 0.8028, "text": "Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…"}, {"post_id": 37625, "ts": "2026-07-30T14:23:01Z", "hours": 1.56, "text": "working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-"}, {"post_id": 36411, "ts": "2026-07-28T14:49:53Z", "hours": 3.1286, "text": "Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )"}, {"post_id": 35110, "ts": "2026-07-26T10:28:41Z", "hours": 8.4342, "text": "Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)"}, {"post_id": 33128, "ts": "2026-07-22T19:10:20Z", "hours": 2.6717, "text": "more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-"}, {"post_id": 31900, "ts": "2026-07-20T17:42:45Z", "hours": 4.6017, "text": "game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…"}, {"post_id": 30701, "ts": "2026-07-18T14:27:23Z", "hours": 3.7628, "text": "UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)"}, {"post_id": 30249, "ts": "2026-07-17T17:50:34Z", "hours": 2.8864, "text": "More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D"}, {"post_id": 29706, "ts": "2026-07-16T19:55:20Z", "hours": 0.9678, "text": "mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)"}, {"post_id": 29523, "ts": "2026-07-16T14:38:59Z", "hours": 2.2728, "text": "Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…"}, {"post_id": 29203, "ts": "2026-07-15T22:53:22Z", "hours": 6.2536, "text": "Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy"}, {"post_id": 28584, "ts": "2026-07-14T22:27:14Z", "hours": 2.6136, "text": "the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane"}, {"post_id": 27998, "ts": "2026-07-13T23:29:33Z", "hours": 5.0142, "text": "GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D"}, {"post_id": 27425, "ts": "2026-07-12T23:53:21Z", "hours": 7.5097, "text": "Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project"}, {"post_id": 26719, "ts": "2026-07-11T17:53:32Z", "hours": 3.9353, "text": "Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later"}, {"post_id": 26228, "ts": "2026-07-10T21:54:28Z", "hours": 3.1872, "text": "Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire"}, {"post_id": 26050, "ts": "2026-07-10T17:12:54Z", "hours": 2.2128, "text": "editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)"}, {"post_id": 25892, "ts": "2026-07-10T11:51:37Z", "hours": 3.0564, "text": "Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)"}, {"post_id": 25509, "ts": "2026-07-09T20:30:56Z", "hours": 4.8756, "text": "Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…"}, {"post_id": 25003, "ts": "2026-07-08T22:10:08Z", "hours": 0.7108, "text": "map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor"}, {"post_id": 24426, "ts": "2026-07-07T23:37:55Z", "hours": 8.7589, "text": "editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?.."}, {"post_id": 23641, "ts": "2026-07-06T18:38:19Z", "hours": 2.4394, "text": "Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)"}, {"post_id": 23429, "ts": "2026-07-06T12:05:06Z", "hours": 4.1694, "text": "Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me"}, {"post_id": 23095, "ts": "2026-07-05T20:42:38Z", "hours": 3.8311, "text": "Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together."}, {"post_id": 22372, "ts": "2026-07-04T20:12:27Z", "hours": 5.1664, "text": "editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them"}, {"post_id": 21565, "ts": "2026-07-03T16:19:30Z", "hours": 2.6169, "text": "actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D"}, {"post_id": 21208, "ts": "2026-07-03T00:51:55Z", "hours": 0.6447, "text": "ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )"}, {"post_id": 21066, "ts": "2026-07-02T20:52:49Z", "hours": 5.9469, "text": "Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)"}, {"post_id": 20164, "ts": "2026-07-01T18:24:52Z", "hours": 3.945, "text": "ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread"}, {"post_id": 19379, "ts": "2026-06-30T17:52:06Z", "hours": 4.6878, "text": "Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together…."}, {"post_id": 18509, "ts": "2026-06-29T17:58:54Z", "hours": 7.6317, "text": "Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D"}, {"post_id": 17698, "ts": "2026-06-28T16:44:24Z", "hours": 1.5475, "text": "Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class"}, {"post_id": 16940, "ts": "2026-06-27T14:41:38Z", "hours": 3.1197, "text": "VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)"}, {"post_id": 16309, "ts": "2026-06-26T15:23:43Z", "hours": 2.0242, "text": "Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)"}, {"post_id": 15851, "ts": "2026-06-25T19:34:56Z", "hours": 4.3886, "text": "refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime"}, {"post_id": 15286, "ts": "2026-06-24T20:32:54Z", "hours": 3.7039, "text": "multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now"}, {"post_id": 14758, "ts": "2026-06-23T23:48:42Z", "hours": 0.4239, "text": "I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))"}, {"post_id": 14743, "ts": "2026-06-23T23:15:37Z", "hours": 1.1569, "text": "kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly"}, {"post_id": 14522, "ts": "2026-06-23T17:41:20Z", "hours": 0.8647, "text": "im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))"}, {"post_id": 14480, "ts": "2026-06-23T16:45:32Z", "hours": 1.2731, "text": "Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…"}, {"post_id": 14379, "ts": "2026-06-23T14:22:29Z", "hours": 0.8064, "text": "“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)"}, {"post_id": 14345, "ts": "2026-06-23T13:22:42Z", "hours": 1.3275, "text": "Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :("}, {"post_id": 13950, "ts": "2026-06-22T22:00:49Z", "hours": 3.1867, "text": "more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup"}, {"post_id": 13774, "ts": "2026-06-22T16:02:35Z", "hours": 0.8908, "text": "EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene"}, {"post_id": 13737, "ts": "2026-06-22T15:02:47Z", "hours": 3.4014, "text": "I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene"}, {"post_id": 13262, "ts": "2026-06-21T18:28:09Z", "hours": 2.735, "text": "EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)"}, {"post_id": 12232, "ts": "2026-06-19T23:34:06Z", "hours": 2.7347, "text": "I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)"}, {"post_id": 12030, "ts": "2026-06-19T16:56:29Z", "hours": 2.8408, "text": "I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)"}, {"post_id": 11605, "ts": "2026-06-18T21:53:02Z", "hours": 15.6978, "text": "Drafting a readme for the scripting language before I plan on the Engine bindings"}, {"post_id": 9500, "ts": "2026-06-15T21:05:05Z", "hours": 6.1578, "text": "added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language"}, {"post_id": 8966, "ts": "2026-06-14T22:36:48Z", "hours": 2.3381, "text": "I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D"}, {"post_id": 8716, "ts": "2026-06-14T14:08:32Z", "hours": 2.1228, "text": "the scripting language now has some more mathematical operators and functions !"}, {"post_id": 8434, "ts": "2026-06-14T01:00:46Z", "hours": 2.25, "text": "The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)"}, {"post_id": 8361, "ts": "2026-06-13T21:59:28Z", "hours": 2.07, "text": "still working on parsing and implementing new nodes :)"}, {"post_id": 8255, "ts": "2026-06-13T18:48:40Z", "hours": 2.3453, "text": "Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)"}, {"post_id": 8113, "ts": "2026-06-13T15:24:08Z", "hours": 3.8419, "text": "I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)"}, {"post_id": 7654, "ts": "2026-06-12T19:56:36Z", "hours": 2.1944, "text": "I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…"}, {"post_id": 7507, "ts": "2026-06-12T15:05:30Z", "hours": 2.1106, "text": "I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting"}, {"post_id": 7189, "ts": "2026-06-12T00:17:40Z", "hours": 1.3681, "text": "i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason"}, {"post_id": 7135, "ts": "2026-06-11T22:23:21Z", "hours": 5.1658, "text": "i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup"}, {"post_id": 6799, "ts": "2026-06-11T12:20:56Z", "hours": 1.5519, "text": "Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …"}, {"post_id": 6484, "ts": "2026-06-10T22:04:02Z", "hours": 1.4136, "text": "I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)"}, {"post_id": 6400, "ts": "2026-06-10T19:22:44Z", "hours": 4.4556, "text": "I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner"}, {"post_id": 6187, "ts": "2026-06-10T12:05:48Z", "hours": 0.365, "text": "running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them"}, {"post_id": 5958, "ts": "2026-06-09T23:43:23Z", "hours": 5.3872, "text": "rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …"}, {"post_id": 5695, "ts": "2026-06-09T16:10:54Z", "hours": 2.3658, "text": "I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)"}, {"post_id": 5539, "ts": "2026-06-09T10:55:05Z", "hours": 2.0847, "text": "working on getting Scenes implemented"}, {"post_id": 5225, "ts": "2026-06-08T22:43:53Z", "hours": 2.7831, "text": "I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)"}, {"post_id": 4858, "ts": "2026-06-08T12:03:11Z", "hours": 0.5367, "text": "i made a npc (the red super mutant) that just wanders around"}, {"post_id": 4844, "ts": "2026-06-08T11:26:15Z", "hours": 0.9856, "text": "I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground"}, {"post_id": 4599, "ts": "2026-06-07T23:21:51Z", "hours": 0.7331, "text": "I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed"}, {"post_id": 4582, "ts": "2026-06-07T22:30:26Z", "hours": 1.5031, "text": "I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)"}, {"post_id": 4281, "ts": "2026-06-07T15:19:30Z", "hours": 3.5969, "text": "I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?"}, {"post_id": 3847, "ts": "2026-06-06T22:12:28Z", "hours": 1.7772, "text": "I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)"}, {"post_id": 3544, "ts": "2026-06-06T15:07:32Z", "hours": 11.2967, "text": "I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout."}, {"post_id": 2707, "ts": "2026-06-05T12:48:03Z", "hours": 1.4394, "text": "Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better"}, {"post_id": 2669, "ts": "2026-06-05T10:44:01Z", "hours": 1.9911, "text": "im getting a simple resource manager implemented :)"}, {"post_id": 2395, "ts": "2026-06-04T21:04:46Z", "hours": 3.0553, "text": "It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such…."}, {"post_id": 2168, "ts": "2026-06-04T14:49:59Z", "hours": 3.0614, "text": "i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD"}, {"post_id": 1448, "ts": "2026-06-03T14:24:00Z", "hours": 2.3058, "text": "I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials."}, {"post_id": 1055, "ts": "2026-06-02T21:13:14Z", "hours": 1.5414, "text": "i’ve got a basic hex grid “map” rendering and working well"}, {"post_id": 890, "ts": "2026-06-02T16:46:10Z", "hours": 0.7936, "text": "Implemented a basic camera which im messing around with a bit to rotate (around) my mesh"}, {"post_id": 858, "ts": "2026-06-02T15:50:32Z", "hours": 1.3153, "text": "I now have textures working, and a basic “meshfactory”"}, {"post_id": 801, "ts": "2026-06-02T13:58:30Z", "hours": 2.4436, "text": "I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)"}, {"post_id": 403, "ts": "2026-06-01T19:57:36Z", "hours": 0.2883, "text": "Setup basic GLFW Window boilerplate & CMake Project :)"}]...
|
Title: obliberry by @torkel | Stardance
Devlogs:
Title: obliberry by @torkel | Stardance
Devlogs:
Setup basic GLFW Window boilerplate & CMake Project :)
I’ve gotten transforms and basic rendering implemented of objects implemented via a “Mesh” class that gets passed to Draw() in the Renderer Class :)
I now have textures working, and a basic “meshfactory”
Implemented a basic camera which im messing around with a bit to rotate (around) my mesh
i’ve got a basic hex grid “map” rendering and working well
I’ve implemented proper debug logging for OpenGL, optimized rendering with a queue that sorts RenderCommands to avoid unnecessarily binding & unbinding, a basic InputManager class, and very basic materials.
i’ve been experimenting with some stuff back and forth, now im working on testing basic “Player” movement with WASD
It may not look like much, but I’ve been working on implementing a form of an ECS , rewriting some stuff too. I kind of broke some camera stuff in the process which I’m going to fix soon, and actually get this stuff to be the correct perspective and such….
im getting a simple resource manager implemented :)
Experimenting with camera stuff and input, now i can zoom with the scrollwheel and i’m trying to get an isometric perspective working better
I redid almost everything with what i’ve learnt from trying the first time (ECS, ResourceManager & MeshFactory are basically the same though) I managed to implement A* pathfinding for the player movement. I got to render out the map with textures i made. tried to recreate movement like Fallout has, where you move the mouse to pan and click to move to a tile with stepping. The hex grid is reperesented via an odd-r offset layout.
I managed to setup a basic ImGui window to control map generation, I also tried to optimize my rendering by fixing a sloppy bug i had in my batching implementation and caching transformation matrices per transform (dirty flag pattern) fps does seem stable :) (please ignore the video artifacting)
I did a few things i made it highlight what hex the player is currently moving towards in white fixed a bug causing it to crash when i tried to use my dgpu (issue with my GLdebug class trying to load unavailable glDebugMessageCallback since my dgpu driver uses an older OpenGL version than my igpu and i kinda forgot to check if it the callback function was available BEFORE calling it.. .-.) refactored some of my Hex code to prepare for making some sort of system to load maps from files, so i generally cleaned up some stuff and opted for smaller datatypes for my needs (i.e using int16_t rather than ints for hex coords r & q, since that’s really all you need unless your map is massive) i also added some more fancy ui with imgui to play around with and generally just cleaned up some code… in short im basically preparing myself to implement some sort of map file loader w. accompanying filetype?
I’ve implemented saving the current grid to my own custom file format, and some tests to check that it’s working and all seems good.. but now, the real test is to see if I can load back in that file properly :)
I implemented reading from the previously saved map file, with some tests ofc :D please ignore the player flying away at the end.. as of the time of writing it was a sloppy bug which is already fixed
I’ve been having a bit of fun with player sprites (currently som fallout 1 super-mutant sprites i found online) and the renderer sorting sorting code to avoid the player appearing under the ground
i made a npc (the red super mutant) that just wanders around
I completely refactored my ECS into an actual proper entity component system and added a lil fancy inspector for entities/components in the UI, everything works with the new system :) Now that my ECS is properly implemented I’m going to start focusing on implementing proper Levels/Scenes rather than the mess I have right now in my “Game” class which I’ve been using for testing stuff (ignore the weird framedrops my screen recorder was tweaking out)
working on getting Scenes implemented
I’ve been restructuring the and moving things to run actual game logic via “Systems”. I’ve temporarily been testing this in a messy way directly in the scene class, but I’m planning on implementing maybe some sort of basic scripting language that can be used for game logic in entities as a Component w. accompanying systems ofc, so game logic can be defined outside of engine source files and serialized into a scene’s registry from a given file rather than the things im messing around with now. serialization of scenes is what im planning to implement next once im happy with how scenes are working, but i need to plan ahead alot. So for now I’m still going to focus on making sure my Scene implementation is good enough before I focus on implementing serialization and scripting etc, and I have alot to think about regarding the design and architecture of this thing that seems to have evolved into a Game Engine :)
rather than using another custom file format i decided to just use json to serialize scenes which is coming along rather nicely …
running some tests.. messing around with funny map generation shapes too but i dont know how i feel about them
I’ve got loading in scenes working pretty well, but I still have work todo before I can save them properly, im pretty tired already since i spent all day chasing a bug regarding render sorting and ended up refactoring a ton of stuff that i probably didnt have too as i was searching for the issue, but atleast the codebase is somewhat cleaner
I’ve got saving scenes working fully now! ^-^, but an issue ive run into is a segmentation fault on switching scenes, I theorize that it’s due to me not cleaning up / reassigning things when I load in new meshes etc from the scene, thus leaving old pointers in the render queue which don’t exist anymore. This i will work on fixing next.. But for now I am quite happy that i have scenes loading and saving to json :)
Managed to fix the segfault.. Mesh::Upload was updating buffer data without binding its own VAO first, which polluted the global OpenGL state. When a new scene loaded, the driver tweaked out on the broken index bindings and crashed on the next draw call …
i’ve implemented instanced draw calls alongside regular draw calls in my renderer, which currently im using instancing for drawing the map, I also implemented culling for the map depending on viewport and some other small optimizations, I also spent some time on fixing and improving my “Systems” and some general cleanup
i’ve been playing with loading in entities and meshes.. ignore the weird fps drops and generally low fps (compared to normally), screenshots and recordings loves messing with performance for some reason
I’ve been focusing mostly on my scene serialization lately. First, I refactored the maps to remove the hardcoded TileTypes enum, which used to map 0 to grass and 1 to sand. Instead, I implemented a system where this is defined in the grid section of the scene’s json file. The “id” property is now a generic unsigned integer for the tile type, and the “texture” property references a specific asset loaded in the scene. I also added a “properties” section for the scene’s name and a “clear_color” array. This lets you dynamically change the window’s background color on the fly instead of always defaulting to a hardcoded black. Writing the new methods and sorting out the custom serialization logic took a bit of work, but it is working great now. also bumped the map file “version” to 2, even though the reading/writing of map files didn’t change at all, the usage of some bytes did kind of change (for the tiletype) so i felt it was fitting
I’m working on a simple map lighting system, which seems to be working alright. Also scene files now have background color information (which ends up getting wired into glClearColor), also implemented name field for entities because why not. I’m also messing around a bit with the UI since im not super experienced with ImGui but I like trying things out…
I’d like Entities to be scriptable in a future editor application / in general without having to edit c++ source files of the editor to implement new logic systems for one entity, so i’m planning on implementing a very basic scripting language, the way i plan on it working is that you attach a script to an entinty as a component, and it will hold the actual game logic in that script, im not great at explaining with words but what im doing now is starting on implementing lexical analysis for a simple interpreter just to test things out, while I have written small interpreters before, alot of this is still new to me so I am learning along the way. the idea is that its just a very basic scripting language to interact with entities and the current scene, with basic apis for interacting with the current scenes ECS registry,we will see how it goes :)
Working on trying to implement a scripting language for my game engine… i’ve got a simple parser working, it definitely went faster than i expected. Going back and reviewing an old parser i made in C# a while ago helped a lot in this :)
still working on parsing and implementing new nodes :)
The scripting language is now technically Turing complete, as i have added state environment (basically variables persist throughout the session), conditional branching via if / else statements basic repetition via while & for loops the screenshot below shows a fibonacci sequence & an example of the conditional branching w. looping . of course it’s not done yet though, i still have a lot of work ahead :)
the scripting language now has some more mathematical operators and functions !
I’m working down my todo-list for the scripting language (ObSL). Right now i’ve got arrays implemented! i also made a method to define functions from the c++ source so that I can access c++ stuff (like std::chrono functions that im using for testing right now from the test.obsl script), and whatever other functions i want to have accessible, this will be very useful later on as I to integrate the scripting language with the game engine, as now i have an easy way to call functions already defined in the engine source code from the scripting language by just calling interpreter.bind_native(args blah blah); and then I can call the function from the interpreted scripts.. very useful :D
added switch statements, foreach-loop, objects, modules (imports), and a standard library to the scripting language
Drafting a readme for the scripting language before I plan on the Engine bindings
I’ve got the scripting language integrating with the engine via a ScriptComponent on the player entity, seems to be working all good though I still have to implement the actual Engine library for everything… but I have simple scripts running on entities as components in the game engine, which went faster than I expected, so i’m happy with it :)
I’ve got a good basis for the Engine integration library for the ObSL Scripting Language. In the attached video, I’m changing the player’s size using a ping-pong function (?forgot the name…), fully through an ObSL script ( ScriptComponent ) attached to the “Player” entity. The language now has support for the following through the EngineLib : Entity Objects Find GetName SetName GetComponent Components Transform SetPosition SetRotation SetScale GetPosition GetRotation GetScale (uses ObSL arrays) Point Light SetColor (Vec3) SetIntensity SetRadius MovementComponent GetIsMoving SetIsMoving SetTimePerStep MapStateComponent GetHasSelection GetSelectedHex GetPathToHex DirectionalTextureComponent SetIndex GetIndex PlayerInputComponent is still w.i.p. Tag Components currently don’t have any methods since they are only used as tags. Planned I’m planning to keep expanding the EngineLib api with more methods, such as: Has(component) AddComponent RemoveComponent(name or ref) Destroy(EntityID) GetEntityID(entity object ref)
EngineLib Script Integration I fully replaced the previously hardcoded PlayerMovementSystem with an ObSL script implementation using new EngineLib bindings. The movement logic is now handled externally through scripting instead of being directly implemented in C++. New EngineLib Bindings entity management Added bindings for basic entity operations: CreateEntity Creates a new entity Destroy Removes an entity HasComponent Checks whether an entity has a specific component RemoveComponent Removes a component from an entity global functions get_dt Retrieves delta time CloseWindow Closes the glfw window Input System Added script access to input handling: Input_IsKeyDown Checks if a key is currently held Input_IsKeyPressed Checks for a key press event Input_IsMousePressed Checks if a mouse button is pressed Input_GetMouseWorldPos Gets the mouse position converted to world space Movement / Hex Grid Functions Added bindings for interacting with movement components: GetSelectedHex Gets the currently hovered hex tile SetPathToHex Sets a movement target path for an entity with a MovementComponent Camera Added camera manipulation support: Camera_GetPosition Gets the camera position Camera_SetPosition Sets the camera position Camera_Move Moves the camera Camera_PanScreenSpace Moves the camera relative to screen space Camera_GetZoom Gets the current camera zoom Hex Rendering Added bindings for controlling grid visuals: ClearSelectionOverlay Clears the hex selection overlay ClearPathTarget Clears the path target visual marker ClearPathTarget is currently named poorly. It only clears the grid overlay visualization, not the actual movement target!!! summary Removed the old hardcoded PlayerMovementSystem Migrated player movement logic into script format Added engine bindings required for script-driven gameplay Camera movement, input handling, and hex selection now work through scripts Even more gameplay code can now be modified without recompiling the engine :)
I’m using miniaudio to implement audio support in the game engine, with an AudioEngine class to abstract the audio functionality. I’ve also updated SceneProperties to include a new background_music property. This allows each scene to define a background music track (via filepath) that will automatically loop through the AudioEngine while that scene is active. It all seems to be currently working well, Next I’m starting to integrate audio functionality into EngineLib so that scripts can interact with the audio system. changes Added AudioEngine abstraction layer using miniaudio Added background_music support to SceneProperties (w. proper serialization/deserialization ofc) Implemented looping background music per scene
EngineLib I may have forgotten to mention this in my previous log, but I also implemented an Instantiate method in EngineLib. Instantiate takes an entity definition as a JSON file (ig a prefab) and spawns the entity into the current scene. I also added scene related functionality to EngineLib: LoadScene Loads a scene from a given path GetCurrentScenePath Returns the path of the currently loaded scene
more EngineLib work Implemented several improvements to the scripting and entity systems. changes prefab caching Added caching for prefabs to improve performance when repeatedly instantiating entities Entity Access in Scripts Added GetEntity , which returns the entity Object that the script is attached to. Added support for the this keyword in ObSL scripts. this is a wrapper around GetEntity() to provide direct access to the current entity custom components Added support for script-defined components: entity.AddCustomComponent entity.GetCustomComponent This allows scripts to attach and retrieve custom data/components without requiring engine side component definitions entity validation Updated all entity object calls (such as GetComponent ) to validate the entity before executing (in both native bindings & engine source code) Entity operations now check: registry.isValid(id) before accessing the entity. This prevents errors caused by accessing deleted entities during scenarios such as scene unloading/loading cleanup
Porting ECS systems to ObSL Fully ported the InteractionSystem to ObSL through EngineLib. Camera movement and player movement are now handled through dedicated ObSL scripts instead of being hardcoded ECS systems. This moves more gameplay logic into the scripting layer and makes systems easier to modify and iterate on :) Changes System Migration Ported InteractionSystem from ECS code to ObSL Basically Moved camera movement & player movement logic into ObSL scripts Interaction system is no longer hardcoded engine-side gameplay system New EngineLib Bindings Math / Hex Grid Math_WorldToHex Converts world coordinates into hex grid coordinates SetSelectedHex Updates the currently selected hex tile Camera Camera_SetZoom Sets the camera zoom level Window Window_GetHeight Gets the current window height Window_GetWidth Gets the current window width Input Input_IsKeyReleased Checks if a key was released Input_IsMouseDown Checks if a mouse button is currently held Input_IsMouseReleased Checks if a mouse button was released Input_GetMouseX Gets the mouse X position Input_GetMouseY Gets the mouse Y position Input_GetScrollX Gets horizontal scroll input Input_GetScrollY Gets vertical scroll input Please ignore the weird graphical artifacting in the attached video, my pc has been acting up recently :(
“project” file system prototype Started implementing support for engine project files instead of hardcoding a scene path like i was before for testing. The engine will now deserialize a project.json file containing configuration, includes: name Project name (unused for now) version Project version (also unused) start_scene Path to the scene the engine loads on startup Window configuration: width height title fullscreen while implementing this, I uncovered some unexpected behaviour related to fullscreen handling caused by how window sizing was previously managed. i spent time refactoring and fixing the window size logic to make fullscreen behaviour… work.. project loading is now starting to come together, less hardcoded stuff yippie (im planning on making an editor in the future so.. this is why)
Been mostly just fixing some window rendering stuff Moved away from hardcoded resolution / aspect ratio and made it handle itself on the fly also removed the padding bars i had before so rendering actually takes up full screen New native engine binding in EngineLib too: Window_SetFullscreen (takes a bool) I’m planning on starting to work on making the engine multithreaded soon…
im trying to make the renderer run on another thread… few issues… cant see (entity) meshes?, and closing the window seems to cause a freeze…. :))
kinda reverted changes from the last log and tried again to convert everything to be thread safe before actually trying to run on a seperate thread… things are going.. interestingly
I think i fixed most of the silly bugs from trying to make rendering thread safe, im still gonna double check some stuff and do some testing but moving rendering to its own render thread will be coming soon :))))
multithreading & rendering I think I got some form of multithreading working now. The renderer has been moved onto its own dedicated thread, separating rendering from the main engine thread :) Changes Rendering Thread Moved rendering execution to a separate thread (alot had to be refactored for this to work lol) Thread Safety i tried (imgui was a pain) Rendering Optimizations Added frustum culling to the renderer. big optimizeD? actual rendering (i.e gpu calls) is now seperated from the main thread :D …it looks like its working for now
refactoring for editor foundation Refactored rendering and culling systems and made broader architectural changes to decouple the game from the application layer. Rendering & Culling Refactored frustum culling logic to be lil more performant and generally cleaner Cleaned up and improved parts of the rendering pipeline since i had alot of old unused code lurking in them since i switched to a multithreaded architechture Application Architecture the engine is now structured around an ApplicationLayer system. The core Application class now runs a single active ApplicationLayer Each layer exposes: Init Update Render Shutdown Game class refactor The Game implementation has been converted into a derived ApplicationLayer Game logic is now fully driven through the layer system instead of hardcoded to the application class (the different executable mains decide now) Editor Layer added a new EditorLayer Intended for a future scene editor application. (right now all it does is render a given scene on the screen) CMake changes reworked the project to generate multiple executables: obliberry_engine core engine executable (ig runtime) obliberry_editor editor application layer changes: Engine and core systems (i.e ObSL, Renderer, etc) are now compiled as libraries Executables link against shared engine libraries instead of duplicating code Editor executable links against engine modules summary Game logic is now layer-based Engine and tools are separated Editor can proceed independently from the game runtime
Editor UI & Framebuffer Experiments i’ve started experimenting with the ImGui docking branch in the EditorLayer . (switched branch had some build errors blah blah blah but its all set up now) Implemented some placeholder editor UI to test out the docking stuff and get a feel for how the editor layout might end up being like changes editor layer placeholder UI using ImGui docking features testing editor panel layouts framebuffer implemented a framebuffer system for the editor viewport. the scene is currently rendering in the editorlayer via a frame buffer so it can fit in the little thingy (i forgot the name) while testing I noticed some resizing issues when running on my nvidia dGPU: the framebuffer resize works, but resizing the viewport can appear somewhat choppy? the framebuffer and docking setup seem to be working, so i guess this im close to actually start to build proper tooling :)
VFS & Editor layer implemented a basic VFS (Virtual File System) . all asset loading is now routed through the VFS instead of directly loading files. this is mainly preparation for adding proper project management later instead of relying on a hardcoded project.json in the project root i was testing with changes VFS added a basic VFS implementation routed asset loading through the VFS the idea is that the VFS will make it easier to manage project assets and not have everything depend on hardcoded paths. editor layer still experimenting a bit with the editor placeholder UI. added: (new EditorCamera derived class of Camera ) camera panning in the editor viewport camera zoom toggling top-down / isometric perspective with keybinds the top-down view should be useful later when I add actual map editing stuff most of the editor UI is still just placeholder right now, I’m mostly testing layouts and figuring out how I want the editor to feel and look ImGuizmo also added ImGuizmo to the project since I’m planning to start implementing proper editor stuff soon.. …and well… you need gizmos… I’ve reinvented the wheel enough already, so using a proper gizmo library seems like the better choice :) (also integrates very nicely with ImGui)
Editor Picking & Project Management because my EditorLayer uses a framebuffer, I can now utilize framebuffer color picking in the editor i updated the shaders to store an entity ID, so now I can click on entities directly in the editor scene view and it selects them. …and it’s pixel perfect :D changes editor layer added framebuffer based entity picking clicking entities in the scene view selects them!!!! selection is based on the exact pixel under the mouse (i mean to implement gizmos i first need to know what the hell my mouse is on) project management also started laying the groundwork for actual project management. now that I have some sort of VFS implemented, I’m working on a way to properly manage Projects instead of relying on the current setup. still figuring out the exact structure, but ive been working on setting up the Project class
Namespace Refactor & Project Management Work Dependencies finally caused me to run into a namespace conflict after being lazy and unorganized… instead of being sane and just renaming one class.. I decided to refactor the entire project to use proper namespaces everywhere.. changes namespaces Refactored the entire codebase into proper namespaces project management / editor backend I don’t really have much visually to show this update since I’ve mostly been working on backend stuff. Working on: project management scene management VFS improvements editor saving/loading I’m using nativefiledialog-extended to work on proper file dialogs for saving and loading from the editor. Also been doing a lot of testing around project creation and loading. alot of this is in the hope i can get this working multi-platform and not just on linux (though i have yet to try and compile on another os) Things are working… for now… so progress :D
Editor & Scene Management been working on the editor mostly. changes ECS implemented generational ID masks for the ECS. this should prevents issues with stale entity references since IDs can now properly track generations instead of just relying on raw IDs. (i encountered this issue when testing multiple scenes in one project) scene manager fully implemented the SceneManager so it can actually be used by the editor & game layer. this allows the editor to properly load/save/validate/find and generally handle scenes through a unified API (goes for gamelayer aswell but it only really loads them) bug fixing spent a lot of time fixing various issues around: project folder management scene management loading / saving behaviour asset loading (cache was causing some problems on loading scenes but its all fixed now :D) mostly backend work but things are becoming a lot more stable and the editor foundation is starting to come together….
ive been mostly messing around with getting the ObSL language to be thread-safe and refactoring some things, so I don’t have much to show but my end goal is to be able to get scripts to run concurrently and outside of the main thread
Script multithreading (and concurrency) scripts now run on other thread(s) :D this took a fair bit of cleanup, but it’s working. changes script workers moved script execution onto worker thread(s) worked on script worker concurrency dynamically clamp the number of active workers based on how many callbacks are actually running, so idle threads aren’t just spinning doing nothing garbage collection did some work on the GC as well. introduced external root tracking fixed a few issues around GC roots while getting multithreaded script execution working cleanup spent some time cleaning up a bunch of backend stuff while getting all of this working. build system updated CMake so all executables, scripts, and (project) templates are output to a single build/bin directory instead of being messy. multithreading yay :)
ObSL Scripting Library Moved the scripting language into its own repository :) It’s now included in the engine as a library using git submodules and public headers instead of living directly in the engine source code Makes the project structure a lot cleaner .. for both projects ( ObSL can now be found at https://github.com/torkelicious/ObSL )
actually working on the editor I’m finally getting around to actually implementing the editor ..it still looks pretty similar (well mostly the same) but most of the UI before was just placeholder. changes editor implemented a Project Settings window implemented a Scene Properties window made the component widgets actually do something now load textures assign scripts change material colors change meshes change shaders etc…. added an Add Component button added Remove buttons to components it works.. so thats good :D
editor Gizmos! :DD this took a lot longer than I’d like to admit… but it’s finally working. changes gizmos got all gizmos working.. but had issues with rotation and scale at first figured out the issues with rotation/scaling ended up patching ImGuizmo at first to get things working, but after digging through the code I eventually figured out how to do it properly with the normal library translation, rotation, and scale gizmos all work now :)))))) honestly I learnt quite a bit just from messing around with the ImGuizmo internals.. but it was painful editor added a few more UI improvements as well. i.e billboard sprites now explicitly mention that rotation doesn’t do anything, instead of letting you wonder why nothing happens gizmos are one of those things I’ve been waiting on implementing.. but im finally happy to have them
Project Packaging been working on a packaging format for projects. the goal is basically to package an entire project into a single container while preprocessing assets that make sense to preprocess. Also makes shipping a game made in the engine in the future alot easier / cleaner, and portable. changes packaging implemented the start of a proper project packaging system. currently it: parses ObSL scripts ahead of time and stores serialized ASTs instead of source code (basically very similar to some sort of a very very simple AOT compiler) converts project, scene and prefab JSON files into MessagePack stores media and other binary assets directly in the package optionally compresses package entries with LZ4 the idea is that the engine has less work to do at runtime since scripts don’t need parsing and JSON doesn’t need parsing either. and a single “package” file is alot cleaner in general for a finished game “build” package format also implemented the actual container format itself. different asset types are stored as different entry types (scripts, binary JSON, media, shaders, etc.), so the loader knows exactly how each asset should be handled. tools added standalone packaging tools as well for packing and unpacking projects, mostly for testing. still a work in progress, but the whole packaging pipeline is starting to come together.
Project Packaging is Working been spending a lot of time working on project packaging, and it’s finally working now. the engine can now load projects directly from .obpak files, and I’ve got basic tooling to create them as well. the plan is to integrate the tooling i have now with the editor to “build” an obpak archive (i think its called an archive?) changes packaging implemented the full packaging/loading pipeline yippie :D currently the packer: pre-generates ASTs for ObSL scripts converts project, scene(s) and prefab(s) JSON into MessagePack bundles everything into a single .obpak container compresses the package with LZ4 assets like textures, audio and shaders just get copied into the package without any conversion runtime the engine can now load packaged projects directly instead of relying on loose project files. all of this goes through the VFS, so from the engine’s point of view it doesn’t really matter whether assets are coming from a folder or from an .obpak (i.e it can still load loose project files of course) tooling added command-line tools for packing and unpacking projects, i originally made it for testing but it’s actually pretty nice to work with so im probably keeping it. still probably things to polish, but it’s pretty satisfying seeing the engine load an entire packaged project properly pls ignore the lag in the video, i promise its not as terrible as it looks, its just that recording is pretty buggy for me
Project Exporting been working on making projects exportable from the editor it’s now able to export a project to the selected folder, package all the assets into an .obpak , and then copy over the runtime so the exported project is runnable changes project exporting added export to the editor choose an output folder for the exported project packages the project into an .obpak copies the runtime into the export folder renames the runtime to match the project name (just 2 files for full project!, executable and .obpak) the whole process is pretty much one click now instead of manually packaging everything together. file dialogs refactored my entire filedialog implementation cuz it was kinda broken packaging did some more work on the packaging pipeline while implementing exporting and put it in the editor ui im pretty happy that its all working and i can actually export stuff, and run it feels cool :)
editor rework & map editing groundwork been working on the editor again this update was mostly about cleaning up the editor architecture so I can actually keep adding features without everything turning into spaghetti. I also finally started laying the groundwork for proper map editing. changes editor reworked the editor state system. instead of instantly swapping between states, transitions are now deferred until a safe point during the update loop. this makes switching between Edit, Play, Map Edit, and the Hub a lot cleaner, and the editor now remembers which editing mode you were in before hitting Play. (i’ll admit… i was getting a bunch of weird, seemingly unexplainable crashes before eventually realizing my mistake was instantly switching states while things were still being updated/rendered…) also moved more UI responsibility into the individual states instead of having EditorLayer decide how everything should be drawn. map editor started putting together the map editor. currently i have: map hover and tile selection working placeholder Paint / Erase / Select tools the beginnings of a tile palette system a placeholder tile editor panel the actual editing logic isn’t implemented yet, but the foundations are there now :) asset picker ripped out the old “open a native file dialog for every asset field” flow. instead, the editor now lets you pick existing textures, meshes, materials and shaders directly from the ResourceManager , which is a lot nicer to work with and also avoids accidentally importing duplicate assets. (the old workflow would happily create a brand new object every time you imported something… which was fine for testing, but definitely wasn’t something i wanted to keep) rendering fixed a few editor rendering issues while i was at it. materials with invalid shaders now fall back to the default shader instead of silently disappearing fixed some edge cases with framebuffer entity picking currently unused, but functional shader hot reloading tests misc smoothed out editor camera movement and zoom added a few helper utilities for the map editor reorganized the editor UI code a bit doesn’t look massively different in screenshots, but makes future work alot easier/cleaner map painting is next ?..
map editor preveiw ig kinda didnt have much time to do anything today but im working on the tile editor
Map Editing, Brushes, and a 4(?) hour ImGui Bug The map editor is finally coming together It’s still a bit… rough but it does feel nice to be able to paint a map in the editor I did, however, spend an embarrassing amount of time trying to figure out why my click and drag “painting” wasn’t working… well.. ImGui was eating my inputs because it thought I was trying to drag the Scene View window around.. yeah.. changes map editor actually got the map editing tools working for real this time. the paint and erase tools actually place and remove tiles now instead of just being placeholder buttons added a brush radius slider, so you can paint in bigger hex rings added a preview outline that renders around your cursor so you can see before clicking toggling “is walkable” on a tile now properly syncs with the grid pathfinding editor ui spent some time making the tile palette and material editing.. work.. video explains better ngl im not good at describing ui stuff math laid some groundwork in the hex math system ( Lerp , CubeRound , and GetHexLine ) this is mostly for some future evil plans… still a WIP…
Logging Cleanup replaced all the random std::cout / std::cerr calls scattered throughout the project with an actual logging system logging implemented a proper logging system. replaced std::cout / std::cerr throughout the engine added support for different log levels optional logging to a log file centralized all engine logging into one place thread safe !!!! nothing particularly flashy or fancy, but its cleaner, easier to work with, and generally just nice i probably should’ve done this a long time ago :)
editor polish still nothing super flashy.., mostly a bunch of small things changes window titles the editor now updates its window title based on what youre working on. it’ll now include things like the current project and scene, or map project loading cleaned up project loading a bit. the editor now properly syncs the loaded project configuration into the engine context instead of relying on stale data also added menu in the map editor that lets you save and load map files (create new is just placeholder for now) UI added a small helper for rendering framebuffer textures in ImGui without needing to remember to flip the UVs every time. and made the tile Editor use it also forgot to mention in the last log that i cleaned up the “project browser” ui a bit logging fixed up some more logging :)
Undo/Redo! :) been working on some editor QoL stuff again… the biggest addition this time is a proper undo/redo system. it’s still very early and pretty barebones, but having the foundations in place is nice changes editor commands implemented the beginnings of a proper command system for the editor instead of modifying things directly, editor actions now go through commands, which means they can be undone and redone currently supports: entity transforms movement rotation scaling adding components removing components (with the exception of ScriptComponent for now.. that’ll get its own custom command due to the way it works) also keeps a command history, and the usual shortcuts are hooked up now: Ctrl + Z : Undo Ctrl + Y : Redo its still pretty basic, but it works and feels nice to use. input for this, I added proper key-combination support to the input manager. things like: Ctrl + S Ctrl + Z Ctrl + Y can now be handled properly instead of manually checking modifier keys everywhere logging did a bit more cleanup to the logging system as well. the logger now goes through a proper interface instead of everything depending directly on one concrete implementation, which should make it a bit easier to swap things around later if I ever want to. mostly backend work again… but undo/redo is fire
Undo/Redo …again! been working on the editor again the undo/redo system now covers a lot more than just gizmo transforms. but there’s still a few things left (entity creation/deletion mainly). changes undo/redo expanded the command system to cover most editor actions. currently supports: entity transforms adding/removing components adding/removing scripts editing project settings editing scene properties also fixed the undo/redo shortcuts so they only trigger once per key press instead of repeatedly firing while the keys are held… which is probably how they should’ve worked from the start map editor continued working on map editing. painting and erasing now properly integrate with the command system. also, an entire brush stroke is treated as a single undo step instead of undoing one tile at a time. also cleaned up a couple of edge cases while doing this, like preserving existing tile data and avoiding unnecessary commands when nothing actually changed. misc did a bit of cleanup around the editor while wiring everything together. centralized a few bits of duplicated UI logic cleaned up window title updates continued refactoring the command system the undo system is still unfinished, but it covers most of the important stuff and feels nice.. also.. still gotta fix some ui window-size stuff soon too but .. thats for later
Performance & Zero Copy Assets been spending some time under the hood… this one’s almost entirely backend. no new features, mostly went through the render thread, asset pipeline, & a handful of ECS loops to squeeze out more performance. it was incredibly rage inducing at times.. but seeing the profiler diff against baseline.. i am satisfied.. almost at peace.. but was considering becoming a farmer & never touching a computer again.. mostly because i thought i’d messed up more than i did.. but.. im happy now. changes threading & ecs i’ve reinvented the wheel enough already… but had to redo how tasks are dispatched. ThreadPool used to take a std::function , which heap allocates if you capture more than a couple pointers. scripts dispatch through this every frame, so it added up. swapped it for a custom Task type a 56-byte inline buffer, no heap allocs swapped the pending-task counter to a lock free atomic decrement instead of a mutex on every completion… rendering been cleaning up how the main thread interacts with the render thread. the main & render threads used to awkwardly poll eachothers framebuffers. now theres a m_ReadyFrames deque main pushes a frame index, render pops it. much cleaner :) ImGui draw data is now reused in-place instead of allocating & freeing a fresh clone every frame (ive put off fixing that hack for a while so its nice to finally come around to it). instanced draws no longer store a vector<mat4> per draw call, transforms get appended into one giant staging buffer per frame now. added SubmitPersistent for things that already own a long-lived buffer (like the map tile renderer) to skip the copy entirely. swapped a bunch of unordered_map s for flat vectors in the texture/VAO/uniform caches for a handful of items, linear scan beats hashing. batched rendering also caches the last bound texture & color uniform so b2b batches sharing a texture dont rebind needlessly. added a zero-size window safeguard for Wayland so it stops wrecking the renderer when the window briefly reports 0x0 during resize (also turned vsync back on, weird syscall spam otherwise) assets & packaging added VFS::ReadVirtualView to hand out string_view s directly into memory instead of owned strings for packaged builds, ContainerReader now mmap s the .obpak file directly, uncompressed stuff (textures, uncompiled maps) gets handed right to the parser without a copy. also now move only, with a destructor that unmaps memory instead of holding a copied vector of chars scripting the script hot-reloader was doing a stat() syscall on every script file every frame . oops. now polls every 300 frames & caches resolved paths.. thought i already debounced this.. guess not.. the on_update & on_destroy work buckets used to be freshly allocated vectors every frame… now static , so they just clear & reuse capacity editor & ui finally ripped out the old in game debug UI ( GameUI.cpp ), it had fallen out of sync with the ECS anyway (used it for debug visuals while implementing the first version of the ecs.. then forgot about it) the editors inspector does all of this better now, so replaced it with a minimal FPS counter audio & map audio engine now sets an explicit period size (2048 frames) via miniaudio to cut IPC roundtrips to the audio daemon.. (this one was annoying to figure out.. god bless strace & gdb) the map’s visible transforms buffer is now double buffered, rebuilds write to the back buffer while the render thread reads the front, no race conditions. also swapped typeMats from an unordered_map to a flat vector nothing user facing changed this time, but frame pacing feels noticeably smoother (somewhat suprised), & the packaged build starts noticeably faster i know it could probably be a lot better, but im still a bit of a noob at C++, so this is one hell of a learning project
GPU Lighting & Graphics Settings been doing a bit of rendering work again… mostly trying to optimize things. the biggest change is that I completely rewrote the lighting system previously all the point light calculations were happening on the CPU, and after doing some profiling (and spending way too long staring at compiler generated assembly annotations) it became pretty obvious that this was one of the bigger performance bottlenecks (well THE biggest excluding driver overhead) lighting now runs entirely on the GPU through shaders instead changes lighting rewrote the lighting system. lighting is now shader-based and runs on the GPU removed the old CPU-side lighting calculations moved engine shaders (like the base shader and lighting shader) into built-in InternalShaders (hardcoded string literals, it might seem messy but i prefer it like that) the internal shader change mostly exists because they’re pretty fundamental to the renderer. if they were treated like normal project assets and someone accidentally deleted them… well… suddenly nothing renders (unless they had setup their own shaders, which is fully supported!) and lighting completely falls over, also i prefer it to loading them from the filesystem anyways overall I’m pretty happy with how the new lighting system turned out graphics settings also started working on configurable graphics settings instead of baking them into the project, the engine now loads graphics settings from a separate JSON file. this doesn’t get packed into the .obpak , so users can tweak their graphics settings after exporting a game currently supports: resolution fullscreen MSAA (toggle + sample count) target FPS VSync it’s weirdly fun actually being back in OpenGL code again instead of just working with engine abstractions sometimes it’s nice to get back into the weeds.. even if its.. painfull :D
the OpenGL State Machine Strikes Back… I spent the entire day trapped in hell: debugging a corrupted OpenGL state… it may not show up as tracked hours.. since most of it was just staring at various forms of text.. but it was painful. problem so since i turned the lightmap to run on gpu .. well… Whenever I transitioned from the editor ( MapEditState ) into Play mode, the map would turn into like a bunch of weird diamonds, and the corruption would persist indefinitely until I remounted the current project. because it only happened on state transition, i spent hours chasing ghosts in my state management code and scene cleanup routines… (in the end though i did make some changes to the cleanup routines, but between states rather than scenes.. so i guess i was halfway there?) the culprit It was the lighting pass… took me forever to figure it out, but i had the genius and definitely NOT a very late and obvious idea i shouldve had hours ago , to see if the issue happened when i turned off the lighting system. so i put some early returns in my lighting system functions and.. it didnt corrupt.. inside LightingSystem::Update() , the renderer was modifying global OpenGL state changing depth functions, blending modes, and texture bindings, but not restoring them to their original defaults properly When the engine swapped states, the next frame inherited this dirty, half configured state, causing the whole thing to become a mess. the fix I went through the lighting system and made sure the state changes are wrapped and properly restored through the render thread.. LightingSystem.h : Full GL state save/restore around the light pass. now explicitly backing up and restoring the FBO, program, VAO, blend state, draw buffers, clear color, viewport, and active texture. MapEditState.cpp : OnExit() now properly nulls out m_MapComp and m_CurrentGrid . OnEnter() and will refetch them from the current registry so it isnt holding onto outdated references. EditorLayer.cpp : Added a call to renderer->Clean() after state transfers to clear out stale VAO and mesh caches.(bc its multithreaded things go kinda weird but.. it works now) glad thats over with :D Also heres a fun peek of what ObSL can do with EngineLib, yes, it can make your entire map look like hell..! i am totally not going insane
Editor QoL, Graphics Configs & Prefabs new devlog… mostly been focusing on editor ui and qol changes this time around. kinda tired of hardcoded settings for the graphics settings, so i finally built a proper interface for it, plus some prefab management stuff in the editor changes graphics settings i built a dedicated graphics configurator window in the window, for the current project ( GraphicsConfigEditor ). it hooks directly into the UndoManager using the command pattern ( GraphicsConfigUpdateCommand ) serializes everything out to graphics.json . added QuerySupportedSampleCounts which asks the active GL context ( before it gets handed to the render thread ) what MSAA sample counts it supports. the editor now dynamically generates the dropdown and snaps to a valid sample count (i.e 1, 2, 4, 8, 16). prefab management the editor now supports prefab management that i implemented earlier .. instead of directly writing it in the scene json file you can spawn entities directly into the scene from prefab json files you can revert a prefab, which wipes any local overrides and resets the entity back to whatever is saved in the file you can break a prefab, severing the link to the json file and turning it into a normal, standalone entity in the registry ui & editor cleanup spent some time making the editor less annoying.. in general the editor layout stops resetting itself , it now checks if imgui.ini exists on startup, and if it does, it skips rebuilding the default dockspace ripped the hardcoded hub drawing code out of the EditorLayer and made it its own state for the editor state machine refactored the config windows ( ProjectConfigEditor , SceneConfigEditor , and the new GraphicsConfigEditor ) to inherit from a base ConfigEditor class so its cleaner and easier to maintain.. fixed the script widget since the ui was kinda messy
Particles! :) Ive started working on a particle system. i have got the core pieces in place and it seems to be working nicely so far…. changes particles implemented the foundations of the particle system currently has: ParticleEmitterComponent ParticleSystem ParticlePool emitters currently support: configurable particle limits and emission rates randomized lifetimes and velocities “gravity” size over lifetime color over lifetime world space simulation materials obviously so far it’s all behaving pretty well… EngineLib next up is getting particles exposed through the EngineLib API so scripts can spawn and control emitter components we will see how it goes…
mostly just spent some time going through some old code.. nothing really important, but i’ve also replaced the placeholder assets.. with my own placeholder assets that i drew in GIMP, considering i probably do not have the rights at all to distribute the previous assets.. :)
More Particle work… been spending some time on the particle system… changes particles expanded the particle system quite a bit. currently supports: randomized size ranges randomized rotation configurable emitter shapes (support quad, circle, and soft circle) alpha and additive blending configurable render order (still kinda broken but im working on it) per-particle color over lifetime particle presets that can be saved and loaded (as JSON) also added an editor preview mode, so particles can be previewed while editing instead of only showing up in play mode renderer had to do a bit of renderer work to support all of this particles now use their own dedicated shader added support for per-instance colors during instanced rendering added an overlay render pass for effects that should render on top of the scene cleanup also did a some more project cleanup, splitting up my Utils header into multiple files.. nothing special though misc particle emitters can now be saved as reusable presets (some which will be shipped as defaults ofc) as suggested by @sol4r_on_hackclub cleaned up a few asset importing edge cases fixed a couple of packaging issues too I’m pretty happy with how the particle system is coming along :D
UI Experiments since working on the particle system, I feel like it’s in a pretty good place for the current scope. I don’t really know what else I want to add to it right now, so I decided to finally start on something that’s been sitting in the back of my mind for a long time… a proper UI system. changes particles mostly just spent some time testing and polishing the particle system to make sure everything behaves properly I’m pretty happy with where it’s at for now UI started prototyping a custom UI system it’s very early, but I’ve got the basic rendering pipeline up and running currently working on: a UIElement system a dedicated UI renderer text rendering font loading using FreeType right now it’s mostly just enough to prove everything works, but it’s the foundation for the runtime UI system ive wanted for a long time the goal is for games made in the editor to be able to have their own UI, with everything exposed through EngineLib so scripts can create and interact with UI elements as well honestly, for now.. I was expecting it to go alot worse.. FreeType isn’t as bad as it seems once you get it working with GL The screenshot below dosent show much, but you can see the rendering of Text and rects, it also supports textured rects (which is what the text is currently using to render from a texture atlas)
game UI Progress been continuing work on the UI system. changes UI made some good progress UI system currently have: font importing working texture support for UI elements basic text rendering a simple editor view panel for UI it’s still very much WIP editor right now it’s pretty basic, but it’s enough to start experimenting with how creating and editing UI might actually work inside the editor there’s still a lot left to do before I’d call it usable, but im making progress.. getting text working is painfull, and still unfinished.. but im workin on it…
more ui ive been kinda sick so i aint really had the motivation to do a lot but ive been working more on the UI system im kinda tired so i dont really feel like writing more for now -.-
Scripted UI, Map Workflow, & a Bunch of Bug Fixes alot of bug hunting… changes scripting & ui scripts can now actually interact with the UI system. added bindings for things like: creating UI buttons, text, rects, and images finding UI elements destroying UI elements these return wrapped objects with basic getters/setters for position, visibility, and button state map workflow spent a fair bit of time cleaning up the map editor flow. maps no longer get a fake default path on creation switching to the Map Editor tab now auto-creates a map (empty) if there isn’t one yet mapFilePath now stays project dir relative instead of randomly becoming absolute tile materials are now shared properly instead of silently duplicating state rendering & lifetime bugs i’ve been doing alot of testing recently, so i found alot of bugs… this was probably the biggest pain point. renderer submissions now keep materials and meshes alive for the frame instead of trusting the caller replaced the old Shader::Default() singleton hack with a real fallback shader (internalshaders base) fixed the lightmap quad so it keeps its own VAO and clears correctly when there are no lights fixed a Texture move bug that was double-deleting GL handles sometimes editor polish also cleaned up a bunch of editor behavior while I was in there. Ctrl+S now behaves correctly depending on whether editing a scene or a map scene loading now rebinds editor panels properly save/load dialogs now append file extensions automatically added more inline warnings in the inspector and panels (i.e if an entity has no material it will tell you it wont render) and ive probably forgotten something else … in summary ive just been testing out some UI/UX changed and hunting down bugs untill I feel it is ready to maybe start prearing some sort of demo :)
Entity Hierarchy & Scripting Integration finally caved & added actual parent/child relationships to entities changes entity hierarchy entities can now have a parent & children via a new RelationshipComponent . Registry::Reparent() handles moving an entity under a new parent, with cycle & self-parenting protection so you cant do anything silly like parenting an entity to its own descendant. TransformComponent now has a worldTransform alongside the existing local one, a new HierarchySystem systems that care about actual position (i.e AISystem ) read worldTransform now instead of assuming local == world. destroying an entity recursively destroys its children too & unlinks it from its parent’s child list scene serialization now saves & restores the hierarchy editor the Registry panel is a proper collapsible tree now instead of a flat list drag & drop reparenting, plus a right click menu for “Create Child”, “Detach”, & “Set Parent”. scripting pulled all the entity/component script bindings out into their own EngineLibRegistry.cpp module, they were kind of scattered around before & this makes them way easier to find & extend. scripts can now walk the hierarchy too (get children, etc), same module. added SetFont / GetFont bindings so scripts can assign or query a button’s font, small thing but script generated buttons wont have visible text without it :) misc cleanup small modernization stuff while i was in these files anyway: dropped redundant ternary parens, swapped a bunch of auto x = ...; if (x) into if-with-initializer, dropped some unnecessary global qualifiers, const-correctness fixes on UISystem::Update & UIRenderer::Flush . (yes i know the gizmos are offset and buggy, i kind of forgot to update the gizmo code after changing transforms :p )
working in a windows vm trying to get it to compile on windows… it is obviously going great… -.-
Windows Build The Windows build seems to be working.. I don’t have proper OpenGL passthrough in my VM… However, the Windows executable compiles perfectly in the VM and is running fine under Wine. so I consider that a win for now…
Bugs bugs bugs… I’ve been working on a demo project to both test the engine properly (looking for bugs and all), and also have something to actually show off made in my engine… this is the project you’ve been seeing in the last couple logs btw :) of course… since I’ve been using the editor for actual “work”, I have found a bunch of bugs. the biggest one being the entity ID situation… or.. disaster? changes the entity ID mess in the past, out of laziness… entity ID 0 was being used as both a real, valid entity handle and the “no entity / invalid” value depending on where you looked. which worked fine… mostly because of pure luck. the annoying part was that after working on this for a while I wasn’t even sure anymore if I was using 0 , -1 , or something else for invalid entities.. yep.. so I finally cleaned it up there is now a proper INVALID_ENTITY_ID constant, and entity index 0 is reserved for invalid entities. real entities now start from 1 . went through and replaced a bunch of random == 0 / != 0 checks across ECS, serialization, prefab handling, editor panels, and scripting bindings. project templates added support for multiple project templates. new project creation now scans the Templates/ folder instead of everything being hardcoded to “Default”. currently has: DemoProject Empty the demo project is mostly there to show off the newer UI/scripting stuff (the same demo as mentioned before), while Empty is just a completely blank scene. hierarchy & transforms fixed entity and UI reparenting. previously moving something to a new parent could randomly change its position because it was just applying the new local transform now reparenting keeps the world transform, so dragging things around in the hierarchy behaves properly UI & text rendering fixed a bunch of UI text issues. text now centers vertically using actual glyph metrics instead of a random offset I was “pretty sure” was correct it was not, in fact, correct button text now scales to fit inside the button fonts can now load directly from VFS memory instead of requiring a real filesystem path the VFS font loading one was something I completely forgot about when testing outside packaged projects… oops. packaging implemented .pakignore instead of a hardcoded ignore list, the packer now supports gitignore-style patterns in a .pakignore file and properly skips ignored folders/files also fixed a few smaller packaging issues while testing exported projects. misc a bunch of smaller things: map save/load dialogs now default to the project maps folder fixed scene switching bindings in editor play mode fixed a lightmap redraw bug font importer now only accepts .ttf / .otf added a small README with build instructions since im planning on publishing the repo soon (and writing all the docs… scary..) nothing super flashy this time.. but important
the repo is public been working on gettin things ready for that, mostly writing some docs and getting GitHub Actions set up so I can build and release cross-platform builds also did some small code cleanup / fixes while I was going through everything. changes github actions i setup a workflow to compile the project on linux, windows, and mac, and then publish a release (mac is untested but compiles). im real happy though that its actually compiling on all “major” platforms though docs finally wrote some actual documentation… there are a few files in the docs/ folder now and a proper README still a WIP obviously, but at least there’s something there… misc implemented create new map button i forgot about completely repo there is already a build published as a test of the github actions thingy, try it out if you want :D https://github.com/torkelicious/obliberry
Lighting Fixes been fixing a few small things with the lighting system mainly fixed lights using the wrong entity transform I forgot to account for entity parenting when I implemented that… also added a per-scene toggle for enabling/disabling the lighting system
scripts can schedule stuff for later Added SetTimeout to the scripting API changes SetTimeout SetTimeout(fn, ms) calls fn() after ms milliseconds. simple to call from obsl timers live in a plain std::vector<Timer> in a new Platform::Time namespace, polled once a frame from Scene::Update no threads, no async bs or whatever :) the callback itself is a SmallTask , which falls back to a heap allocation if the closure is too big to fit inline fine for this since timeouts aren’t really a hot path timeout callback fires from an arbitrary point in Update , so it gets its own ScriptCommandBuffer set up on the worker just for the duration of the call, then flushed right after also gc.add_root / remove_root the function around the callback so it doesn’t get collected while it’s sitting in the timer list waiting to fire Documented it in the api reference alongside the other Time functions also tiny UI tweak in the tile editor: it now warns “no tile types defined, no map will be visible!” instead of just “no tile types defined” was seeing people get confused about why a new map looked empty after trying to paint also small updates to docs in general and stuff but nothing super interesting
…the default imgui theme first off, huge thanks for all the incredibly kind reviews on my last ship !!! most of this work was also inspired by someone pointing out that i was still using the default imgui theme. fairs… so i spent some time making the editor actually customizable and messing around with having some kinda-nice defaults :) editor ui & theming live theme editor: built a proper window to tweak colors, spacing, padding, rounding, etc. in real-time. semantic palettes: added a semantic color system so you can build out a theme from a small set of base colors, rather than manually adjusting every single internal imgui color enum (though you can still override individual colors if you need to). serialization: themes dump straight out to a theme.json sitting right next to the editor executable. undo/redo: the theme adjustments go through the undo/redo system! help menu: put in a placeholder help menu. turns out literally nobody likes reading docs, so i guess i gotta start explaining how to use the engine from inside the engine… not implemented yet though editor groundwork did a bit of backend cleanup as well. added an EditorContext for editor-specific state, separate from the runtime EngineContext (currently just used for theme stuff) started working on editor font support with a FontSet for things like Body, Bold, Monospace, and Icons, not implemented though the font stuff is mostly groundwork for now, but the theming system is actually working and makes the editor feel nice :D
fighting with fonts font-management rabbit hole in the theme editor… still wip changes font management in the theme editor the theme editor now has a proper Fonts section import .ttf / .otf fonts directly from the editor assign fonts to roles like Body, Bold, Monospace, Icons, etc. merge fonts together so icon fonts can be stacked on top of regular fonts rename, delete, and change the size of fonts fontsets are now saved as part of the theme, so imported fonts persist across restarts the role system isn’t fully wired up yet currently Body is used as the default editor font and Monospace is used for the console. im still working on the whole font management system here and its very unfinished and kinda untested.. very WIP!!! hot-reloading the annoying part was getting font changes to work while the renderer is running on another thread. rebuilding the ImGui font atlas in the middle of a frame was… not ideal, and eventually resulted in an assertion. now font changes mark the atlas as dirty, and the editor waits for the render thread to finish before rebuilding the atlas at a safe point. not the prettiest solution, but it seems to be working.. kind of dpi & freetype also experimented with DPI handling for fonts and wrapped FreeType into a single shared instance instead of creating separate instances everywhere. still figuring out exactly how I want the DPI/font sizing stuff to behave, but it’s getting there. bug fixes while doing all of this I also ended up fixing a few unrelated things: fixed an old GUI rendering bug where text could stop rendering or become garbled because of a pointer race thanks to @staneko for helping test/report that one since I couldn’t reproduce it properly on my system fixed a weird compilation issue related to namespace escaping bumped the vendored ImGui version for some dynamic font-related fixes a few other small UI changes and cleanup still working on this, and the font management side definitely isn’t finished yet… most of this time was just spent trying to get it to half-work so.. yep..
mostly ui stuff (and fighting windows wide chars) yay pretty ui editor ui theming ui blah blah idk what to call it kinda cleaned up some stuff into proper members so the ui state doesn’t get all weird and persistent when you close the theme window discarding changes: actually works now. closing the window used to revert colors but keep your staged font changes, which was dumb (didnt really cause issues since changes werent applied anyways unless you saved beforehand but still.) font role indicators: added a little visual thingamabob where the font list now shows a star next to whatever font is actively set as the body font (also font name is now rendered in its proper font) path tooltips: added a hover tooltip on the font list items that shows the full file path of the font also some placeholder stuff in the code for searching the customization menu i might be implementing soon windows compat std::filesystem::path everything: went through and switched out the raw std::string usage for font paths inside FontConfig , replacing them with std::filesystem::path . this was purely because my windows ci build was failing. i was passing raw char strings around and doing weird string conversions, which completely blows up on windows because it expects wide chars for paths and i didnt consider that when i was being lazy and doing silly conversions and stuff because i just wanted to pass ez pz to a c library. freetype & serialization cleanup: updated all the internal freetype helper functions ( GetFontName , etc.) and the json theme serializer to play nice with the new paths instead of passing raw char pointers kinda mostly just making it a lil more prettier
scrips can change things on the map yippie changes scripting scripts can now modify maps through EngineLib added: Map_SetHexWalkable Map_SetTileType yes, i made sure changes to walkability properly update the map’s pathfinding data instead of leaving it with stale information… sanitizers added sanitizer builds…. got ASan + UBSan working through CMake, along with presets for testing… it has helped already :) timers SetTimeout : if a script created a timer and then the scene changed before it fired, the callback could still run against the old scene state. timers now use generations, so changing/reloading a scene invalidates any timers belonging to the previous scene. editor fixed another map editor bug where discarding unsaved changes didn’t actually discard them… it would clear the dirty state but leave the edited map in memory… i knew about this bug and fix for a while, but i kept on forgetting about it… but its finally done -.- also added an Edit button to script entries in the project browser so scripts can be opened directly (launches default app it detects for the file via ur os)
more docs… and some bug fixes some small bugs that have been annoying me for a while finally got fixed… and I wrote more docs than I probably needed to…? or maybe too litte.. who knows changes entity selection actually clears now fixed an issue where clicking empty space in the viewport wouldn’t reliably clear the current selection. the pick-result handling was structured wrong, so the “nothing was selected” case basically never got handled properly. also explicitly clear the entity ID framebuffer attachment every frame so it doesn’t leave stale IDs around from previous frames. i knew this was broken, and figured the fix would be pretty simple for a while.. but i just kinda forgot to fix it.. oops…. fixed parent transforms during scene loading fixed a bug with parented entities getting their transforms messed up when loading a scene. the issue was that scene loading was using the same Reparent() logic as interactive editor reparenting. that function intentionally recalculates the local transform to preserve world position, which is what you don’t want when loading a transform that’s already been serialized correctly… was eepy when writing that i guess added Registry::SetParentDirect() for scene loading, which just sets up the parent/child relationship without touching the transforms. interactive reparenting still uses the old behaviour, so dragging entities around in the hierarchy still preserves their world position misc cleaned out some old commented-out code docs, docs, docs also wrote proper editor documentation section covering things like: editor concepts usage scenes prefabs components and some even have screenshots.. yes i know.. fancy the help button in the editor links to some of these pages now. i guess “figure it out yourself” wasn’t really an acceptable documentation strategy anymore…. i mean i had some docs.. but they weren’t that good for editor-usage and more technical stuff.. so yep.. also made the README headers slightly more obvious because people were still asking where the download link was ….
persistent Entities been working on persistent entities via a tag.. the same idea as Unity’s DontDestroyOnLoad, except you mark entities as persistent in the editor instead of doing it through scripts (scripts can do it too though). everything keeps breaking or half-working help.
persistent entities… again kinda scrapped most of the first attempt at persistent entities and decided to redo it instead of setting persistence in the editor, I went with something closer to Unity’s DontDestroyOnLoad , where scripts explicitly mark entities as persistent. makes more sense and is a lot less weird around scene changes. (i.e this.SetPersistent(true); ) changes scripting added: entity.SetPersistent(true) entity.IsPersistent() persistence persistent entities are tagged before the scene unloads, serialized normally, then re-injected and reparented when the new scene loads. the persistence tag itself isn’t serialized, so it won’t accidentally end up saved into the scene dedup added some basic deduplication so persistent entities don’t get duplicated if the new scene already contains an entity with the same name. its name based for now… not very great, but good enough
mostly windows fixes changes SetLightmap took a raw Lightmap* and just held onto it for the frame swapped it for a small value type the renderer copies out immediately instead… this sometimes caused crashes but seemingly only on windows?.. just my luck.. LightingSystem had the same issue, was writing back into ECS memory through a raw pointer from a GL init task. now creates the framebuffer/vao up front and just calls Invalidate() on them SubmitPersistent was also holding a raw pointer into caller-owned memory, now copies into the staging buffer like everything else does RenderBatch used to just silently not draw anything if a batch went over MAX_INSTANCES . now it chunks into multiple draw calls instead of dropping the whole thing InvalidateGLCache wasn’t resetting the dynamic instance buffers, only the VAO cache, so they could point at dead GL objects after a context loss actual windows fixes opening files tries to open via already existing file associationg, otherwise falls back to the “open with” dialog if there’s no default handler also the paths get normalized to backslashes now asset import for scripts and so just does a file copy now instead of going through the old import path
code cleanup & optimization currently going through a bunch of older code and fixing / optimizing things. prolly way too much to actually write about, and most of it is just boring small changes, bug fixes, and a lil cleanup big pr i guess soon idk
hardening + performance stuff so this is kinda the continuation of the last log(s) where i was going through some old code kinda boooring but its important performance mainly been trying to get rid of unnecessary allocations and full scans stuff optimized ECS entity/component lookups and removal reworked hierarchy propagation to avoid unnecessary registry scans reduced allocations in scripting and UI command buffers cached script wrappers so they can be reused instead of constantly recreated improved UI lookups with a proper name index made particle/lightmap updates only rebuild when actually needed cached project browser directory scans capped the editor console and added clipping for large logs also did a bunch of smaller optimizations around scripting task scheduling and resource loading things thread safety went through a lot of the cross-thread stuff as well made ResourceManager access properly synchronized experimenting with the audio locking guarded FreeType access made window size and pending scene state thread-safe fixed some render thread / GL context handling basically trying to make all the multithreading stuff a little less “it seems to work” type stuff though alot of this probably wasnt actually causing any issues YET , it would be very hard to debug in the future if I didn’t try to fix it now so yeahh correctness fixed several out-of-bounds issues in VFS/package parsing made VFS path resolution properly stay inside the VFS root (oops…) fixed hierarchy reparenting allowing cycles fixed a few dangling references in hierarchy code fixed some component pool and packaged asset lifetime issues undo history now clears when loading a scene cleaned up a few map editor edge cases fixed text centering fixed the triangle mesh made engine context non copyable also updated the demo template while I was at it (since a recent movementcomponent update it wasnt behaving properly due to the addition of a new field) there are other small things i probably didn’t mention here too but it’s mostly all a collection of a bunch of small things im still testing this though and looking into a few other small things…..
ui editing gizmos!!!1 you can finally drag UI elements around in the editor (instead of typing position/scale values into the inspector) changes ui gizmo added a proper UI gizmo with resize handles and dragging support and that corners resize both axes, edges resize one axis dragging the body moves the element resizing from the top/left keeps the opposite edge anchored added a small drag deadzone so clicking doesn’t accidentally create an undo step UI transforms now go through TransformUIElementCommand , so they’re undo/redo -able also renamed the existing entity gizmo code and naming gets confusing otherwise… coordinate stuff the gizmo needed mouse coordinates relative to the viewport rather than the whole window, so added some better viewport coordinate handling for that… maybe a lil late ui editing mode buttons won’t randomly enter their hover/pressed states just because your mouse is sitting over them now in the editor beccause its a lil annoying when editing small optimization also fixed UIText and UIButton recalculating their text layout every frame when nothing changes feels nice :)
custom meshes im trynna make it so you can draw your own custom 2d meshes in the editor its still a lil buggy but it’s mostly working, serializes and all that :) very fun…
experimenting with post processing working on a lil post-processing pipeline still very wip but im mostly just playing around with various shaders and stuff changes the pipeline PostProcessor is a simple “ping-pong” chain: scene renders to an off-screen FrameBuffer , then each enabled effect runs full-screen-triangle shaders bouncing between two ping-pong buffers, in whatever order they were added I’m working on a system via variants to get uniforms to be easily serializable and such, it seems to be working but I havent actually wired it into anything just yet. editor and runtime a lil bigger change than expected. i implemented a unified fbo for both editor/runtime rather than the weird jank i was doing before editor: scene renders into m_SceneFrameBuffer , post effects run, then it gets sent into the ImGui viewport image like before runtime: same scene framebuffer, same post effects, then PresentToScreen goes to the default framebuffer instead just some general cleanup for that ig crt shader i wrote a lil silly CRT looking shader to test it out as shown below, it’s cool but kind of useless, but very fun to play with!!!
more post processing!!!! this took way longer than i thought it would but uh whateveer. i think i still gotta fix some small things but its working pretty alright :D editor ui added a proper ui for post processing :) threw in an import button and stuff so you can load in fragment shaders as post proc fx you can edit the uniforms directly in the ui now stuff glsl uniform parser: wrote a very simple basic glsl uniforms parser. this is what makes the ui editing possible, but it also helps a ton with serialization so i don’t have to hardcode everything serialization: implemented saving and loading for post processing effects and also made post processing effects bound per-scene instead of being a global engine thing yay post processing funny effects shaders aaaaaaaah
shader preprocessing been working on a small shader preprocessor thing while also finishing up the final bits of post-processing right now the preprocessor is pretty simple, mostly just adding support for: #include #pragma once I haven’t actually needed it yet, I just kinda had the urge to make it… so now I have a shader preprocessor …? its pretty extendable and all though so usefull to have ig :)
too many post proc fx? followup to the post processing / shader experiments… changes shader includes shaders can #include "rand.glsl" etc and it resolves properly. it checks the project VFS first, then falls back to the engine’s own shader helper directory if it isn’t found there. engine shader helpers also get packaged into exported games under engine/shaders/ , so includes keep working at runtime. added a few helper include files: rand.glsl / auto_rand.glsl - seeded hash-based random, with auto_rand reseeding per frame from u_Time color.glsl - HSV conversion, lift/gamma/gain, contrast, saturation, and three-way color wheels commons.glsl - engine-provided uniform declarations so you don’t have to redeclare u_Resolution , etc. in every shader for engine-provided uniforms the helpers use #ifndef / #define guards, so auto_rand.glsl can include rand.glsl without causing double declarations if the effect shader or another include declare the same uniforms or includes. more built-in effects added a few more built-in post processing effects: ColorGrading - exposure, contrast + pivot, saturation, lift/gamma/gain, and shadow/midtone/highlight color wheels using color.glsl FilmGrain - chunky per-cell grain with u_GrainSize controlling the cell size Vingette - yes i know its mispelled. uniforms with Wheel in the name now get the wheel-style color picker instead of the regular color picker, since a normal RGB slider cleaned up effect registration used to have two separate lists, one for raw shader registration and one for the default effect chain. this meant adding an effect involved touching two different structs in two different places. merged those into one PPRegistration list with an inDefaultChain flag shader debug name added an actual m_DebugName field and made error messages / the material inspector fall back to it when there isn’t a real file path. docs wrote up some post-processing editor docs ….. i hate writing docs.. also .shader is now a valid extension for importing custom effect shaders, alongside .frag / .glsl trimmed down the miniaudio CMake config by disabling its examples, tests, and tools, along with Vorbis/Opus/FLAC support since i’m not using any of that….
sllight hub overhaul redid the project hub screen and added recent projects tracking, since up to now opening anything meant going through a file dialog every single time… changes recent projects get tracked in a PROJECTHIST file (next to the editor executable) …dead simple format, one filepath per line, each pointing at a project’s .json . capped at 5 entries, oldest just get removed off the list. hub screen is basically remade two docked panels now instead of one. left panel is the same buttons as before (new project, open project, etc), right panel is the new recent-projects list, up to 5 entries since that’s all the history file holds. also removed some unused dead code i found… QoL type stuff i guess :D
copy paste (kinda) also too much time fighting windows builds tried to get entity copy/paste working and it’s… janky. also ended up wasting a stupid amount of time just getting windows builds to actually build again because i lowk forgot again about how it wont let me pass paths as strings implictly as it does on every other damn os… changes copy/paste (wip, kinda broken) started on ctrl+c/ctrl+v for entities & ui in the editor it kinda works but is really janky and does not feel good to use, also tried implementing it in the context menu but its not workiong at all -.- other the windows fixes…. some resharper reccomendation inspection type shi but lowk its been a while since i logged soo yep
collision stuff been working on a collider system. still pretty early and not hooked into EngineLib yet, but most of the basic backend + editor stuff is there planning to expose it to scripts in a similar way to how Unity handles collision callbacks / triggers, but that’s for later……. collision added a new ColliderComponent with: box and circle colliders offsets size / radius trigger support collision system currently handles: box vs box circle vs circle box vs circle collision normals + penetration depth ‘trigger’ collisions also added a CollisionWorld that keeps track of collisions between frames and generates Enter , Stay , and Exit events. mostly groundwork for when I hook this into EngineLib… collider editing colliders are editable from the editor theres a collider inspector widget for changing the shape, offset, size/radius, and whether it’s a trigger, plus a viewport gizmo for directly moving and resizing them collider edits also go through the undo system, because every new editor feature needs to become an undo/redo problem eventually……… :D other editor fixes entity copy/paste now copies the whole child hierarchy instead of only the selected entity pasted hierarchies keep their parent relationships added copy/paste to the entity and UI context menus fixed stale entity / UI selections after the thing being selected gets deleted fixed single-key shortcuts like V , T , R , etc. firing while Ctrl/Alt/Shift was held keyboard camera movement no longer fights with Ctrl/Alt shortcuts a few smaller include / cleanup things mostly collision work though. next step is probably getting the collision events into EngineLib and experimentiung w. it its still a bit jank of course but it works i guess :DDDDD
collision system round 2 i guess ended up pretty much reworking most of the collision system….. the first version was still basically 2D, with separate box vs box / circle vs circle / box vs circle functions. that worked as a starting point, but it was gonna get annoying … so… it is 3D now. colliders ColliderComponent now supports: boxes spheres cylinders 3D offsets / dimensions triggers entity-space or billboard orientation billboard colliders follow the same camera-facing basis as billboard rendering, which means billboard sprites can still have colliders that actually line up with how they appear on screen. GJK got rid of all the individual boxVBox , boxVCircle , etc. collision functions and replaced them with support-mapped collision detection using GJK. each collider shape just provides a support point now, the intersection test doesn’t care what combination of shapes it’s checking. i dont fully understand the math completely yet.. but it kinda makes sense :D still no collision response / physics yet. this is just detection + events, i think ill prolly get it into EngineLib.. soon… events the CollisionWorld still tracks collisions between frames and generates: Enter Stay Exit trigger state is kept with the collision too. this is for EngineLib integration. scripts should be able to react to collisions / triggers like unity I have not gotten around to this yet though… collider gizmos also had to redo the collider gizmos now that colliders aren’t just flat 2D shapes anymore… its a lil janky but it works.. billboard cleanup while doing the billboard collider stuff I also cleaned up billboard rendering a bit billboards used to have their world transform temporarily modified by SpriteBillboardSystem before rendering. now the billboard matrix is generated when the entity is submitted to the renderer instead, so the actual ECS transform can stay as the real entity transform there’s now one shared billboard matrix helper used by both rendering and collision, which is considerably less cursed. um scripting integration next i guess.. if something dosent explode ! :D
collision callbacks scripts can do collision things now….!!! script collision callbacks ObSL scripts can now define collision hooks: on_collision_enter(other) on_collision_stay(other) on_collision_exit(other) on_trigger_enter(other) on_trigger_stay(other) on_trigger_exit(other) the other argument is a normal EngineLib entity wrapper, scripts can do stuff like check its name, components, etc. collision events get collected by the CollisionWorld , then dispatched to the relevant script instances afterwards. they’re also run through the existing script command buffer ofc 2D collider shapes are back too… added explicit 2D shapes alongside the 3D ones: Rectangle Circle so the full set is now: Box Sphere Cylinder Rectangle Circle rectangle / circle are flat shapes. which is nicer for sprites and other 2d things movement actually respects colliders hex movement now checks whether an entity can actually occupy its next tile before moving there. added a CanOccupy() collision query which builds the entity’s collider at the target position, it blocks the move if something solid is in the way. triggers don’t block movement. collision robustness stuff also did a bunch of smaller fixes around the collision added a shared collision tolerance instead of random 1e-6 s in different places AABB overlap now uses that tolerance too improved collider validation depending on the actual shape fixed gizmo world-to-local conversion to use the proper inverse transform more finite-value / clipping checks in the collider gizmo GJK Indeterminate results preserve the previous collision state instead of automatically counting as a collision p.s, heres a lil photo of my attempt at making syntax highlighting for obsl using textmate grammar… :D
spritesheets / animation finally … spritesheet support spritesheets added a new SpriteSheetComponent with: texture rows / columns optional row + column spacing start frame animation length FPS looping playing / paused state current frame basically the renderer can now render only a specific UV region of a texture animation also added a small sprite animation system that advances frames based on FPS and handles looping / stopping at the end etc etc animations also update while in the editor… might be annoying for some, might be less annoying for others.. but thats how i like it editor stuff you can pick the texture, set rows / columns and spacing, choose the start frame + animation length, change FPS, toggle looping / playback, scrub the current frame, restart the animation, etc. etc EngineLib scripts can inspect stuff like the current frame, frame count, FPS, rows / columns and texture, and can also change the texture/grid/animation, set frames, play, pause, restart and stop animations. Collider also has a proper EngineLib component wrapper instead of collision only being accessible through the callback hooks. right now that’s just getting / setting whether it’s a trigger, but it’s there. also added both Collider and SpriteSheet to the normal GetComponent , AddComponent , RemoveComponent , HasComponent , etc. obviously. some cleanup did a bit of registry / EngineLib locking cleanup while I was in there too, mostly around entity wrappers being created while the registry lock is already held. also fixed one very stupid collision callback typo where on_collision_stay was looking up the wrong hook… oops….. im also starting on documenting this stuff…. yep.. pain… spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
btw pls star on girhub animation clips / refactoring spritesheets …kinda refactoring the whole spritesheet animation thing already the first version worked, but having FPS / looping / frame ranges etc directly on the SpriteSheetComponent was gonna get pretty limiting cuz what if I wanted multiple animations for one sprite. it might sound stupid but for me it’s always worked to get a prototype working, then refactor/reimplement it. thats even what i did for this entire project early on, before it deleoped into a full on engine :D so now the spritesheet is mostly just the sheet + currently displayed frame, and animation playback is seperate animation clips working on proper animation sets + clips. an animation asset can have one spritesheet and multiple named clips, with each clip containing its own list of frames :D each frame also has its own duration now instead of the whole animation just sharing one FPS value, so stuff like holding a frame longer or doing irregular timing is possible without clips can loop independently too animator component added a separate SpriteAnimatorComponent which handles the actual playback state: animation asset initial clip autoplay current clip current frame inside that clip elapsed time playing state the normal SpriteSheetComponent is way simpler now… it just says what sheet + frame should currently be rendered (the animator updates that for it) animation assets animation sets are assets now under assets/animations/ they serialize separately and contain the spritesheet setup plus all the clips / frames / durations they are loaded through the normal asset system and registered in the ResourceManager scene serialization now keeps the animator config like the selected animation asset, initial clip, and autoplay editor stuff the sprite sheet inspector got reworked for the current thing but whole UI stuff isnt finished once an animator is attached it owns the sheet/frame instead of both systems trying to edit the same thing. I still need a proper UI for actually making / editing animation assets and clips though. i shall work on this next!!! (right now the backend is pretty much all ive done but its taken a lil longer than i thought… who wouldve thought adding cips cleanly would take this whole aah refactor) scripting EngineLib updates too SpriteAnimator in scripts can now do: Play("walk") Restart("walk") Pause() Resume() Stop() IsPlaying() GetClip() it is now based on named clips so i guess not anything flashy to show but… its stuff :)
animation editor continued working on the animation system and made the editor UI…. animation editor there’s now a Sprite Animation Editor you can: choose the spritesheet texture edit rows / columns / spacing create, rename and delete clips toggle looping per clip edit individual frame indices + durations move frames up / down duplicate / remove frames expand / collapse the frame list also added range generation so adding a normal animation doesn’t make you manually enter every frame one by one….. theres also an Apply FPS to All Frames button ! preview added a live preview for the selected clip. you can play, pause and restart it woaw it shows the current clip frame and spritesheet index while it runs…. project browser integration animation assets are properly integrated into the project browser now too there’s an Animations section where you can create, import, edit and delete animation assets creating a new one lets you choose its path then opens it in the animation editor. the animation asset workflow is mostly usable from inside the editor :D erm even more enginelib changes for the new systen that i still have to document… ( Play() Restart() etc) some cleanup working on… some mostly const-correctness, explicit casts, ranges, include cleanup and some other small stuff etc etc.. god bless resharper c++ also cleaned up some EngineLib entity wrapper code around registry locking so it can create wrappers safely when the registry mutex is already held spritesheet used in video attached for testing is : https://opengameart.org/content/animated-butterfly
I will not elaborate
asset system refactor + some editor stuff been wanting to redo how assets work for a while now. until now scenes carried the asset definitions with them, and loading scenes would keep throwing resources into the global resource manager. worked fine enough , but it also meant resources could kinda just accumulate forever.. i seperated them now!! assets.json projects now have a project-wide assets.json catalog. textures, shaders, meshes, materials, fonts, animation sets, etc. live there instead of getting serialized into every single scene. scenes / prefabs / UI / animations etc. just store resource IDs and the definitions live in one place besides making scene files considerably less bloated, this means saving a scene no longer serializes whatever random collection of resources happens to currently exist in the resource manager lazy asset loading having one project-wide catalog does not mean loading the entire project into memory. scene loading now scans for the resources that scene actually references and loads those from the catalog this includes stuff referenced by: entities maps / tile types UI post processing spritesheets / animators dependencies get resolved too so if something needs a material, its shader + texture get pulled in first. animation sets pull in their spritesheet texture, etc. etc. now the the resource manager should only contain what is actually being used asset lifetime stuff added SceneAssetScope for keeping track of what assets a scene has acquired. assets are retained while something needs them and can actually be unloaded once the last scope using them disappears so changing scenes repeatedly should no longer turn the resource manager into yummy more objects :O forever…. persistent entities reacquire the resources they need when moving between scenes too. there’s also handling for catalog entries being replaced / deleted while their old resource is still loaded. those can be marked stale and discarded safely once the old scene lets go of them instead of leaving weird zombie resources around. engine assets still stay around like normal. editor asset workflow the editor now goes through the asset catalog too. creating / importing / replacing / deleting things like: textures shaders meshes materials fonts animation sets updates assets.json instead of depending on scene serialization to preserve them…. supported editor selections / script setters can also acquire catalog assets on demand and attach them to the current scene’s asset scope old projects old projects obviously still have all their assets embedded inside their scene files, so I added an ob_asset_migrator tool. it can scan the old scenes and merge all of those definitions into a project-level assets.json . there’s: dry-run validation conflict detection optional removal of the old scene assets sections backups before it starts rewriting stuff uses backups because i dont trust myself enough .. might vaporize projects who knows… docs docs docs also updated a stupid amount of documentation for the new asset model … since of course.. there’s now a full assets.json format page covering the different asset types, dependencies, lazy loading, asset scopes, editor behavior and migration. updated the scene / prefab / animation / post-processing docs too since all of those previously described assets as being stored directly in scenes. also cleaned up the main README + docs index a bit and updated the feature list because quite a lot of it was outdated at this point…. theme presets also did some work on editor themes. split the built-in theme definitions out and added some interesting presets: Obliberry Dark ImGui Classic Dark Obliberry Light ew imagine using light themes… High Contrast Dark Haxxorman Green editable and all… tldr: resourcemanager is now longer an infintly growing landfill…
save system i wanted this to be pretty generic instead of the engine having some hardcoded idea of what a “player save” or whatever is, so the actual save data is ba sically just key/value storage that scripts can use for whatever they want!!! save data there’s now a SaveGameManager which keeps one active save in memory. save values can currently be: booleans numbers strings the file format is versioned and also stores a display name + created / updated timestamps. the actual save data itself doesn’t really care what the values mean. it is any key value pair that persists. there’s also locking around the active save since scripts can be running across multiple workers….. project UUIDs projects also have their own UUID now. it’s generated when the project is created or when a project that does not already have one is opened right now it’s mainly used to give each project its own save-data directory without name collisions but im sure its good to have outside that!!! save files the basic save file operations too create a new save write the current active save load a save delete a save list existing saves start a fresh unsaved “game” save filenames are generated from timestamps. the human-readable name stays inside the file, display names don’t need to also be valid / unique filenames. save_list() also gives creation + update timestamps, and saves are sorted by most recently updated. writes are atomic too, so it writes through a temporary file before replacing the real save instead of directly nuking the existing one and hoping for the best per-project save directories save data is stored outside the project itself in the normal OS application data home each project gets its own directory based on its UUID <data home>/obliberry/<project uuid>/saves/ projects with the same name don’t fight over the same saves.. (i have several projects just called “UntitledProject” lol) this is LocalAppData on Windows, Application Support on macOS, and XDG_DATA_HOME / ~/.local/share on Linux. both the editor and runtime configure the save manager when the project is loaded, and it gets reset again when the editor closes the project ! ObSL ObSL savedata enginelib intergration: basic data stuff: save_set(key, value) save_get(key) save_has(key) save_remove(key) save_clear() save_new() save file management: save_create(name) save_write() save_load(filename) save_delete(filename) save_list() save_list() returns an array with the filename, display name, creation time and last update time some cleanup also pulled the atomic file writing stuff into a shared OS file utility, so assets.json can use the same code instead of having its own implementation. bunch of formatting stuff too i still have to document this and do some more testingf but yeahhh
uuids, collision layers, save settings, and other stuff bit of a mixed bag this time. mostly cleaning up some systems that were already there and filling in stuff I’d need… entity UUIDs entities have proper UUIDs now, separate from their normal runtime entity IDs. the regular generational ID still does all the normal ECS stuff, while the UUID is a stable identity that gets serialized with the entity. this mostly fixes how persistent entities work between scenes. previously I was deduplicating persistent entities by name , which was obviously not ideal since names aren’t actually identities. persistent entities + their children now keep their UUIDs when moving between scenes, and if the destination already has an entity with the same UUID it gets replaced by the carried-over one. two things can have the exact same name now without persistence randomly deciding they’re the same thing. normal prefab instances / newly created entities still get new UUIDs. collision layers colliders now have proper layers + masks. there are 32 collision layers, and every collider has: a layer a 32-bit mask of layers it accepts both colliders have to accept each other’s layer for the pair to interact. the same filtering is used for normal overlap events and movement blocking, so there isn’t a separate set of collision rules depending on which system happens to be asking. added editor controls for this too, including the layer selector, all 32 mask toggles, and select all / deselect all buttons because clicking 32 checkboxes individually sounds incredibly fun. scripts can also read / change the layer and mask now. collision-aware script movement also added Transform.TryMoveTo(x, y, z) to ObSL. unlike SetPosition , this checks whether the entity can actually occupy the destination before moving it. the normal hex movement system uses the same helper now too, so script-controlled collision-aware movement and normal movement go through the same path. direct SetPosition is still basically teleporting, which is intentional. also fixed on_collision_stay actually looking up the collision stay callback instead of the trigger stay callback. whoops. more save settings did some more work around the save system from the last update. saving can now be enabled / disabled per project, and projects can choose where save files go: Data Home , the normal OS application-data location Portable , relative to the executable both still use the project UUID underneath so different projects don’t start sharing save files because somebody named both of them game . these are editable from Project Settings now. also added a confirmation dialog when regenerating the project UUID since doing that changes which save directory the project looks at. the old saves aren’t deleted, the project just gets a new identity and stops finding them automatically. graphics config stuff changed packaged builds so graphics.json can live beside the executable and override the version inside the package. (i.e if someone decides to unignore the graphics config and package it) couple random fixes particle emitters now keep their actual live particle count, so GetAliveCount() in ObSL finally returns the real value instead of the completely useless placeholder it had before. fixed a prefab revert issue where the code was reading the prefab path from the component after destroying the entity. very intelligent. also made theme font loading a bit less fragile. missing / broken font files get logged and skipped instead of potentially taking the whole theme load down with them, plus some parsing cleanup. and updated another mountain of docs to match all the collision, persistence, save, prefab, post-processing and export changes.
unit tests (& some fixes) uhhhh started adding actual unit tests… i was kinda putting it off but i gotta have it… set up GoogleTest + CTest and started covering some stuff ECS registry / generational IDs entity UUIDs entity serialization hierarchy / parenting collision events + movement blocking save games maps bugs bugs bugs… and unsurprisingly, writing tests immediately started exposing some smaller issues. fixed stale entity handles being able to mess with components belonging to a recycled entity slot, and cleaned up some hierarchy transform / rotation handling that wasn’t preserving transforms correctly in certain parenting cases. also tightened up a couple math helpers while testing them. im still gonna write even more tests.. its very needed at this point and will prolly help me find some more bugs i missed before…
more tests (more bugs) kept going with the unit tests the test suite now covers most of the important stuff, including: ECS / entity IDs / UUIDs serialization + hierarchies collision geometry, events and movement maps animation saves ObSL + some EngineLib bindings assets / asset lifetime VFS + packaged projects configuration editor undo commands also added a couple integration tests for audio and rendering (OpenGL tests are optional) finding things unsurprisingly this found some actual problems too. stale entity handles can no longer remove / access components from an entity that reused the same slot, and editor undo commands are a bit safer around entities or components disappearing. also fixed some hierarchy rotation decomposition weirdness, cleaned up VFS / package mounting state so old package data can’t leak into the next mount, and added a few other small null / cleanup checks around scenes and rendering resources.
export dependencies + prefab asset loading redid how exporting figures out what needs to go into the package previously editor export was basically much closer to just packing the project directory. now it builds a dependency manifest first figuring out what to export export starts from the project + scenes and follows the things they reference: catalog assets used by entities, maps, UI and post processing map files attached ObSL scripts script using imports scenes loaded from scripts prefabs instantiated from scripts music / sound files material textures + shaders animation sheets shader #include s referenced scenes and prefabs get scanned too, dependencies keep chaining from there. it then generates a new filtered assets.json specifically for the package instead of sticking the entire project catalog in there. the actual project’s catalog is untouched. script analysis added a ScriptAssetAnalyzer which walks the ObSL AST without actually running anything. literal stuff can be narrowed down properly, including things like: PlayMusic("assets/audio/music.ogg", 1.0) or even constant string concatenation… asset setters like SetTexture / SetFont get tracked too. if a texture or font ID is dynamic, export keeps that entire asset category. if a runtime file path for stuff like LoadScene , Instantiate , PlayMusic or PlaySound2D can’t be figured out, it falls back to keeping the eligible project files + full asset catalog. unknown / indirect calls are done the same too so simple projects get smaller exports, while weird dynamic scripting should still work… .pakignore still applies, and required files being missing or ignored is now an export error prefab assets also fixed prefabs properly interacting with the lazy asset system. instantiating a prefab now scans its components, acquires whatever catalog assets it needs, resolves their dependencies, and retains them in the scene before creating the entity. so a prefab can use an asset that wasn’t already referenced by the scene and it should just work. scene asset scopes got changed a bit for this too. instead of accumulating a new scope every time something acquires assets, they’re merged into one scene scope and duplicate asset references are ignored. also made prefab revert a little safer so the old entity isn’t destroyed unless the replacement prefab actually instantiated successfully. packaging / ci things editor packaging is stricter in general now. script dependency validation can fail the export, missing dependencies stop it, and PackageCurrentProject reports failure so the rest of the export doesn’t continue pretending everything is fine. shader includes are followed during dependency collection too, while the engine shader helpers still get bundled for runtime includes. also cleaned up CI a decent bit… also some more tests too for the packaging and script analysis lowk sorry for just posting an image of the logs idk how else to show it since it’s mostly backend / file stuff 😭
undo stuff + render lifetime fixes undo / redo the undo system relied way too much on runtime entity IDs and direct pointers into components. that works until an entity gets deleted, an ECS slot gets recycled, or a dense component pool moves stuff around… entity commands now store the entity UUID and resolve the current runtime entity when they execute / undo instead. this now applies to transforms, renaming, adding / removing components, script changes, component field edits and map painting. so older commands can still find the right entity even if it was deleted and later restored with a completely different runtime ID. deleting things is actually undoable now finally added proper undo for deleting entities. !!!!!! deleting an entity snapshots the whole subtree first, including components, UUIDs, names, hierarchy + sibling order, scripts, custom data and asset references. undo rebuilds the tree, reloads required assets, restores the UUIDs and puts everything back where it was. this also means edits from before the deletion still work afterwards, since those commands just resolve the restored entity by UUID. paste uses the same snapshot system now too, so undo / redo keeps the same pasted entity identities instead of creating unrelated ones every time. there are checks for conflicting UUIDs, missing parents, invalid hierarchies, missing assets etc. failed restores shouldn’t leave half-created entities behind. failed commands also no longer get added to undo history or wipe an existing redo chain. custom ObSL data custom script data needed special handling too. arrays / objects can share references or even be cyclic, so just copying ObSL::Value s wasn’t enough. there’s now a snapshot format that captures the object graph and rebuilds it through the interpreter + GC when an entity is restored. CustomDataComponent also roots stored ObSL values properly so GC-managed objects stay alive. runtime functions aren’t snapshotable though, so deletion just fails instead of restoring garbage. render thread lifetime stuff also did a pretty big pass over renderer resource lifetime, mostly because scene switching could unload resources while an already submitted frame was still using them. (this started because someone mightve pointed out a lil crash for me…) render commands now pin the meshes, materials, shaders and textures they need until that frame is done. same idea for UI textures and the editor viewport framebuffer. OpenGL objects also don’t call glDelete* from whichever thread destroys the C++ object anymore. textures, shaders, buffers, VAOs and framebuffers queue deletion for the render thread, while it actually owns the GL context. less bugs yay frame state + shutdown renderer state that can change while the render thread is behind is captured per frame now too, including clear color, post-processing and UI resolution / projection state. shutdown is also more deliberate now: worker threads stop first, background font loads finish, scripts stop, scenes/resources are cleared, renderer/UI resources shut down, then the remaining GL delete queue is processed while a context still exists. font loading uses tracked jthread s now too instead of detached threads. small things exporting now reports success / failure back to the editor and shows a little result popup instead of silently relying on the console. also added tests around delete / restore, UUID reuse, hierarchy restoration, script components, map edits, pasting, command failures and repeated undo / redo without leaking entities or asset references. so. .. . less explosions hopefully sorry if wording is weird.. character limit..
uhhh changes dont nuke scene on failed load scene deserialization moved out of Scene::OnEnter into SceneManager::LoadScene , and now runs before the old scene gets torn down. if the new one fails, you stay in the old scene ( LoadSceneByPath returns a bool now) loading is stricter. missing map files, bad/out-of-range/cyclic parent values and broken UI sections fail the load instead of logging an error and limping on persistent entity migration happens before the swap too, so a failed asset acquire can’t leave you half in the new scene the editor’s LoadScene used to clear the current project before trying to load. now undo history and selection only get cleared once the load actually worked saving: map write failures now propagate instead of reporting success, and files get closed before the error check destroying entities DestroyEntity was recursive, now it’s iterative with a visited set. deep hierarchies, cycles and duplicate child entries no longer kaboom the stack or double delete, and children go first (wow that sounds dark) Reparent and SetParentDirect go through CanSetParent , which rejects cycles and stale parents, even if the existing hierarchy is already cyclic script DestroyEntity / entity.Destroy() now use RequestDestroy to tag the entity and its whole subtree instead of deleting immediately, so on_destroy runs before deletion. scene exit drains the destroy queue too, including entities tagged by exit hooks the script wrapper cache evicts an entity when it’s destroyed a dumb one…: the hot-reload cleanup list had on_exit in it twice and no on_destroy , so on_destroy GC roots never got released … the script system was holding raw ScriptComponent* across initialization, which dangles if a script spawns enough entities to grow the pool. it looks components up by entity ID now script runtime reinitialization after a scene change uses the VFS path and reruns setup, so using imports keep working from the mounted project ui undo UI elements have UUIDs now, and undo commands resolve them by UUID instead of holding raw pointers. removing an element captures the whole subtree plus its sibling position, so undo restores the hierarchy and order. renaming also updates the name index live. smaller fixes collision broadphase is a “spatial hash grid” now instead of checking every pair lightmap rebakes when ambient changes, and handles maps with no tiles atomic file writes use unique temp names so concurrent writers don’t trip over each other project changes wait for background asset loads to finish timeout timers are mutex-protected, and callbacks can schedule more timers without deadlocking SmallTask over-aligned captures fall back to the heap VFS::Resolve("..") had UB from a std::mismatch that wasn’t bounded on the second range… PlayMusic stops, swaps and starts under the lock now instead of racing!!! tests wrote a pile of tests alongside all this: atomic writes, wrapper cache, hierarchy safety, map serialization, save concurrency, scene loading failures, script lifecycle, script modules, SmallTask and timeouts. expanded to the editor command, save game and VFS tests. so EVEN LESS explosions !!! Woo!
map edit kinda overhauled changes map edit stuff the brush size is now 1 to 8 instead of 1 to 5. size 1 is one hex, size 2 is 7, size 3 is 19, etc. Ctrl +scroll also changes the size added Rect and Circle shapes alongside the brush. they work with Paint, Erase and Select. Rect uses opposite corners, Circle goes from a center out to the hex you release on. both apply on release paint previews are green, erase previews are red, and selection previews are yellow. selected tiles get a blue overlay added tool hotkeys: B for Paint, E for Erase and Q for Select Esc cancels a drag. Rect and Circle do nothing if cancelled, while a brush stroke gets reverted instead of leaving half the changes behind loading a map now prompts before discarding a dirty map, and successfully creating or loading a map clears the old undo history selecting and editing multiple tiles Select now supports click and drag, Shift +drag to add to the selection and Ctrl +drag to remove from it the toolbar shows the selection count and has Clear and Delete buttons. Delete removes all selected tiles in one undo step the Tile Editor can edit the type and walkability of the whole selection at once. when selected tiles differ, the controls show mixed values etc. material editing only appears when every selected tile shares a type. Override Current Type changes the material for every tile using that type, while Save as New Type assigns a matching type to the selection without changing every other tile using the old type brush strokes, Rect/Circle fills, deletes and bulk type or walkability changes are each grouped into one undo step. changing a type’s material itself is still not undoable…. the console…. logging now has a sink system, so the same formatted log messages can go to different outputs the editor now has separate Logs and ObSL panels. engine/application logs go to Logs now, and script stdout goes to ObSL the panels have Clear and Copy buttons and keep the latest 2000 lines. the UI sink buffers incoming logs under a mutex before the editor consumes them closing the editor closing the window now goes through a callback, so unsaved scene or project changes trigger the save/discard prompt instead of immediately closing removed the old global Esc -to-quit shortcut. ObSL’s CloseWindow() no longer closes the editor while in Editor mode. it logs that it was called instead. in the runtime, it still closes the window windows and smaller fixes enabled /MP for MSVC builds, and the editor/runtime targets use the Windows GUI subsystem so they don’t launch with a console window attached atomic file writes now write the byte buffer explicitly and retry Windows file replacement when it fails with access-denied or sharing-violation errors, for up to about 2 seconds a bit of cleanup around collision pair sorting, const-correctness and naming docs updated the editor guide and screenshot to cover the new tools, shapes, selection controls, shortcuts and undo behavior. blah blah …map editing is finally a lot less barebones…
uuid-bound script wrappers…, logger sinks…., and a pile of small editor stuff…. mostly scripting + logging plumbing this time, plus a couple of editor things I’d been wanting… changes script wrappers are uuid-bound now entity wrappers used to capture the raw runtime id, which is a problem if ids get recycled or the registry gets rebuilt. now every wrapper holds the entity’s uuid and resolves the live id on each call, so it keeps pointing at the right entity (or does nothing if it’s gone). new FindEntityByUUID(uuid) global and GetUUID() / .uuid on entity objects SetParent matches an entity object by uuid, a plain number is still a runtime id same treatment for UI wrappers: they resolve by uuid instead of name, so renaming or duplicate names don’t break them added FindUIByUUID , GetUUID() and Destroy() on UI elements, and SetImage / GetImage on images (acquires the texture through the scene asset scope like fonts do) still by name: FindUI , DestroyUI and the button state queries ( WasClicked / IsHovered / IsHeld ). UI scripting is still weird… work in progress i guess… logger sinks the old way was swapping the logger’s std::ostream for a stringstream that the UI panel also read from, which was a data race waiting to happen (logger thread writes, main thread reads). replaced it with actual sinks: ILogSink with ConsoleSink (stdout/stderr like before) and UILogSink (mutex -ed pending buffer the panel drains each frame) the editor and runtime both register a ConsoleSink , and the editor adds the UI sink on top, so the Logs panel is always there now instead of only when there’s no tty console panels color lines by severity now interpreter output goes through a small UiStream ostream into the ObSL panel, with stdout and stderr split (needed the bumped obsl, Interpreter takes both streams now…) ObSL panel clears when you enter play mode editor F focuses the camera on the selected entity, press it again to go back to the origin. its smooth…., ..panning cancels the focus keyboard pan only gets called when there’s actually input now.. editing a material in the inspector no longer mutates shared runtime-only materials. if it isn’t a catalog asset it gets cloned into assets.json first, and edits to catalog materials get “upserted” back to the catalog. “Clone Material” writes to the catalog too new scripts from the project browser come with an on_update stub instead of just a comment scripting runtime script top-level code now runs with the command buffer in “immediate” mode ( BeginImmediate / EndImmediate ), so registry writes at the top of a script apply right away instead of waiting for a flush that hasn’t been set up yet during init Hex_GetNeighbors wasn’t GC protecting its array while filling it, fixed…. grid tile textures a tile type with no texture used to fall back to hex_tex both when collecting dependencies and when loading scenes, which would pull in a texture that might not exist. now no texture means no texture… as it should… misc bumped obsl (new using alias feature, and err output stream settings) docs for all the uuid stuff, the F key, and the new UI/image methods… of course… oh also … new demo scene testin thingamabob im messing with…
script properties & UUID types scripts can now declare properties that show up in the inspector and get saved per entity. also ripped std::string UUIDs out of most of the engine in favor of an actual Core::UUID type, plus some scripting additions and a few tests. changes script properties Prop("SpeedOrSomething", 2.5) , PropEntity("TargetEntity") and PropUI("MyRect") for regular values, entities and UI elements properties show up under each script slot in the inspector, with appropriate controls and per-slot values values are only readable during top-level script execution, so store them in variables for use in hooks. Prop in a hook just returns the fallback saved as scriptProperties in scene JSON, omitted when empty property edits support undo, including live number/string editing. unused saved properties can be pruned with undo too.. ScriptSlot is move-only now Core::UUID replaced string UUIDs across the registry, UI, editor commands, project config, save directories and scripting with a 16-byte Core::UUID registry UUID lookups now use an index instead of looping through entities malformed UUIDs in files fall back to generated or nil UUIDs UI UUIDs are saved and restored, including nested elements. duplicate UI UUIDs are handled without crashing the loader savegame directories etc take a UUID directly scripting & UI script objects now have identity values and wrappers are readonly , along with various scripting result objects. came with an ObSL bump UI wrappers get SetParent(parent) and a uuid field. null reparents an element to the root UISystem::Reparent preserves ownership and prevents parenting an element under its own descendant new created scripts use fn on_update(dt) (I wrote on_update() last time …oops…) smaller stuff UndoManager::Execute returns whether the command applied script list shows filenames with Remove beside them tests and docs more tests and docs updated ofc… so u can reference entities in scripts without using Find() now!!!
Ships:
obliberry feels usable enough that i think its a good time for a first ship :) obliberry is a fallout-inspired isometric game engine for hex-grid games, written in C++20 with OpenGL, featuring a visual editor, an ECS core, its own scripting language, and single-file packaging/exports. this has all been rather challenging, but an incredibly fun learning project, especially regarding using modern C++, OpenGL, and making my own programming language it is still obviously not fully complete of course, but I think it’s in a rather good state :D...
|
1792972210.6089878
|
1793058610.6089878
|
|
2179
|
TeleReader by @zsobix | Stardance
|
zsobix
|
1
|
35.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T22:33:48Z", "hours": 35.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hey, this is TeleReader! A desktop teletext reader! The main inspiration for this project was me watching retro tv documentaries, the Stardance emails, and my last project: “Lidl Plus on desktop” (a desktop implementation of the Lidl Plus loyalty app) I wrote this project in Python, and the GUI with GTK and libadwaita. I tested this on a VM, with a live install of Manjaro linux. The most challenging thing was actually implementing the different teletext services and working around their (sometimes existing) apis. I’m proud of how it turned out, I made some improvements with the UI at the end, so I’m anxious to find out what you think about it!", "repo": "https://github.com/zsobix/teletext", "demo": "https://github.com/zsobix/teletext/releases/latest"}]...
|
[{"post_id": 28578, "ts": "202 [{"post_id": 28578, "ts": "2026-07-14T22:21:06Z", "hours": 2.9003, "text": "Day 14 Today I made some pretty good progress! New features: finally finished the favorites tab bugfixes easter egg……. Everything was pretty easy to implement, maybe the favorites tab was harder than I imagined (I had to let go of the popup message when you add a favorite ) There were ALOT of bugs to fix, like code snippets appearing multiple times, and straight up not functioning code. I also added an easter egg…. try out my app to find out! This is the last devlog before shipping, I tested everything on a live install of manjaro… so there shouldn’t be any issues. (im tiredddd) Changelog feat: add favorites page, bugfixes, and ??? ( 31409b6 ) fix: typo in action ( 6d8d395 ) fix: update action ( 511da3b ) thanks for coming to my final ted talk before the ship! -zsobix"}, {"post_id": 27976, "ts": "2026-07-13T22:46:54Z", "hours": 2.0728, "text": "Day 13!! Wow, i didn’t expect to make this much progress today!!!!! New features: HRT Teletekst (croatian public broadcaster) support Favorites tab (not finished) bug fixes The hardest thing to implement wasn’t even the HRT Teletext support, it was the (still broken) favorites tab! Atleast the favorites tab looks nice (i think) Implementing the teletext service was easy because (you know it) there is an actual api!!!!!!!!!!!!!!!!!!!!!!!!!!!! I didn’t get to ship today because I didn’t get to add all the features I wanted to add. (i want to sleeeeeeeep ) So, features before shipping: more teletext services bugfixes despagettifying my code (almost typed coke) finishing the favorites page thanks for coming to my ted talk -zsobix"}, {"post_id": 27394, "ts": "2026-07-12T22:33:50Z", "hours": 1.7044, "text": "Day 12 Today was better in terms of progress, but I hadn’t had enough freetime… New features: NOS Teletekst (dutch public broadcaster) support info button bugfixes Implementing NOS Teletekst was VERY HARD, because they give the teletext pages in html, so I have to basically copy the german teletext implementation, but not fully because the api response only has partial html, without any styling, so I have to copy the styling from the official website, then combine it with the api response. Other than that, everything went pretty well, even the info page, and yknow why? I read the f**king docs!!!!!!!! (it’s currently midnight as of writing this and my brain isn’t functioning.) I’ll probably ship tomorrow, because I gave up on waiting, and also I hit 30 hours!!!! So, the last minute features I want to implement: add favorites page bugfixes add some more teletext services Changelog chore: update readme ( f85a191 ) feat: add nos teletekst support + about button ( 11fdea9 ) thanks for coming to my ted talk -zsobix"}, {"post_id": 26778, "ts": "2026-07-11T19:27:05Z", "hours": 1.5383, "text": "Day 11 Today also I couldn’t do much so this devlog will be short. New features: TVP Teletext (polish public broadcaster) support BHRT Teletext (bosnian public broadcaster) support bugfixes The most annoying thing I had to do was implementing the bosnian teletext, mostly because, there wasn’t a normal api!!!! So getting the number of subpages, and the next/previous page was pretty hard! Other then that, implementing the polish teletext was actually, well not pretty easy, but not that hard, because you know why…. there was an actual normal working api!!!!!! Well the not easy part was that, the api was just a json file, and a not very good one at that, so implementing the next/previous page functions were not trivial. New features I still want to add: moaar teletext services support bugfixes I gave up on waiting for the weekly shipping stickers, so I’ll probably ship when I get home. (birbs are chirping around me as of writing this ) thanks for coming to my ted talk -zsobix"}, {"post_id": 26172, "ts": "2026-07-10T20:25:44Z", "hours": 0.9139, "text": "Day 10! Today was VERY slow, because I’m currently on a trip and don’t have much time. So, new features: RBB teletext (german regional broadcaster) support MDR teletext (german regional broadcaster) support Teletexto TVE (spanish public broadcaster) support bugfixes The first two teletext services were easy to implement, because I already implemented their API! Teletexto TVE support was also easy to implement mostly because, their html files were readable! (they didn’t even have an api) So yeah, I don’t have much things to say. I still want to add: moar teletext services support (like for poland, netherlands, portugal) bugfixes Changelog my stardance extension broke anyways, thanks for coming to my ted talk -zsobix"}, {"post_id": 25586, "ts": "2026-07-09T22:43:42Z", "hours": 3.0439, "text": "Day 9!! Today I made waaay better progress then the last two days! So recap (new features): KiKa Teletext (german childrens channel) support DR Tekst-TV (Danish public broadcaster) support Arte Teletext (german/french public broadcaster) support ARD Text (german public broadcasting group) support some ui changes in the sidebar bug fixes (there are always some) The most major issue I had was that the DR teletext page doesn’t give the amount of subpages! So I had to rework the SAT.1 system for it to work. Also, because I put all stations in the sidebar, I had to (by hand) name every button, add station switching logic and also make the sidebar scrollable. This weekend, progress will be slower because I will be away from home and I also need suggestions to what to do next…. (I will not be shipping until there is no shipping sticker!!!) I will probably add: an info button (just because) more teletext services easter eggs (mmm eggs) not in the first ship, but I was thinking about implementing an ACTUAL teletext simulator Changelog feat: add dr, kika, ard, and arte support + ui changes ( d3acca6 ) thanks for coming to my ted talk -zsobix"}, {"post_id": 24967, "ts": "2026-07-08T21:09:42Z", "hours": 2.0847, "text": "Day 8!!!!! Today was also a slower day, because I had less time and less ideas, but I have some ideas now! New features: ProSiebenSAT.1 Teletext (german broadcaster) support umm bug fixes Working with the SAT.1 teletext was actually pretty easy, before I realized I had to get the number of subpages on each page! I spent an hour figuring it out, in the end I have to interate over all the next subpages to get the max number of subpages. Anyways I have some new ideas!! So before shipping, I will add: KiKa Teletext (german childrens channel) support (why does a children’s channel have teletext????? especially in 2026???) DR Tekst-TV (Danish public broadcaster) support Arte Teletext (german/french public broadcaster) support ARD(1) Text (german public broadcasting group) support Put all countries/stations in the sidebar with a Gtk.ScrolledWindow (shown in picture) moar bugfixes Changelog feat: add prosiebensat.1 teletext support ( 4226ff0 ) thanks for coming to my ted talk -zsobix"}, {"post_id": 24355, "ts": "2026-07-07T21:18:14Z", "hours": 2.5864, "text": "Day 7! First week complete! Today was a slower day, with not much progress, but I added yle Teksti-TV support. New features: YLE Teksti-TV (Finnish national public broadcaster) support BUG FIXES (there were alot) some UI tweaks testing the biggest problem I faced was, that the yle teletext api was hidden, and I had to search for it. I thought that all the data was on the frontfacing page itself but I was wrong. I don’t have much to say because everything went pretty well. (sidenote: the hungarian public broadcaster is undergoing MAJOR changes, and I don’t think the teletext service will survive the next 3 months ) Changelog feat: add yle finland teletext support ( b290c1c ) thanks for coming to my ted talk -zsobix"}, {"post_id": 23721, "ts": "2026-07-06T20:41:59Z", "hours": 3.9725, "text": "Day 6! Finally added packaging support, also added 3 other teletext services! I could add THREE more teletext services, because they had functional apis!!!! New features: ČT Text (Czech public broadcaster) support SRF Text (Swiss public broadcaster) support SVT Text (Swedish public broadcaster) support Some UI fixes more bugfixes the biggest problem I faced was that the ČT teletext subpages are marked with LETTERS instead of NUMBERS, which makes things (very) HARD. Other than that, everything went pretty well, even the packaging went well, because I (basically) just copied the packaging structure from my older project Lidl Plus on desktop . I made huge progress today, and either tomorrow or when I can get stickers, I will probably ship! Remaining features: despagettifying my code adding more teletext providers some more UI fixes and bugfixes Changelog fix: forgor to add a dot 💀 ( f919029 ) feat: added packaging support, and 3 other teletext services ( 6278dc6 ) thanks for coming to my ted talk -zsobix"}, {"post_id": 23113, "ts": "2026-07-05T21:22:48Z", "hours": 3.61, "text": "Another day, another devlog!! Finally added Rai Televideo support… I did NOT enjoy this, mostly because Rai’s servers are 1 millenium old Sun workstations, and they take a bajillion years to load, and also there is no next page anything, so I have to iterate over all next pages to find the next page. New features: Rai Televideo (Italian public broadcaster) support Rai Televideo regions support Bug fixes My first problem with Rai Televideo was, as I mentioned, the waiting times are UNBEARABLE, so if more than 2 people connect to their servers, they crawl down to a halt. Other problem is that there are REGIONS of Televideo, meaning I had to add a dropdown to select between the regions, which seems pretty easy, right? To be fair, it was pretty easy but I had so many bugs with it, and combined with the wait times, it was a pain. Only good thing about Televideo, is that the teletext pages are images, so I don’t need a browser to render them. (also there are ADS on the non-existing pages so finding real pages is a pain) The things I still want to add is: More Teletext providers support UI Improvements despagettifying my code preparing it to package and also there are alot of unnoticed bugs I need to fix Changelog 5bf2423 thanks for coming to my ted talk -zsobix"}, {"post_id": 22422, "ts": "2026-07-04T21:39:23Z", "hours": 4.1544, "text": "4th Devlog!!! Another long day complete, today’s coding session was 4 hours, which is great! New features: ZDF Text (german public broadcaster) support Sidebar to switch between countries Bottom button bar to switch between stations Fixed some bugs Figuring out ZDF Text was VERY painful, and I WOULD NOT RECOMMEND any sane person to work with that garbage. Working with MTVA Text and their 2012 website was easier than this. Me finally finding the libadwaita docs, and reading through them, I found the geniusly called AdwNavigationSplitView (the sidebar). The main problem with ZDF Text was, that, the teletext pages were in HTML!! which are NOT IMAGES, so I had to use WebKitGTK to render the HTML pages, which makes the whole thing WAAYYYY slower. Changelog 82a66ba thanks for coming to my ted talk -zsobix"}, {"post_id": 21775, "ts": "2026-07-03T21:36:07Z", "hours": 2.7944, "text": "Third devlog!!!!! It’s late at night currently so I can’t write much, but this is what I worked on. ORF (Austrian public broadcaster) Text support MTVA Text (Hungarian public broadcaster) colored buttons support (a bit borked still) Working with websites that don’t have actual api, is, tiring, but i still got it. The only things I want to still work on is: more public broadcaster support (like for Italy and Germany) better looking interface Also, I found the adwaita documentation! (I did not know this existed) Changelog 92a449b thanks for coming to my ted talk -zsobix"}, {"post_id": 20977, "ts": "2026-07-02T18:32:03Z", "hours": 2.0036, "text": "First (normal) devlog, actually second Hey there! I have been working on some things. Firstly, I added basic functionality, like actually viewing teletext pages and navigation. The readme, is, bad. That is something I have to fix. To actually get the teletext pages, i have to scrape this archaic website, which doesn’t even have an api, i had to get the first (DOT HTM!!!!) page then with BeautifulSoup4 get the hidden input tags that had the next and the previous page ids (????), which is peak 2012 development. I still have to make it look prettier and add other teletext services, because now, it still looks barren. Changelog 74da49f thanks for coming to my ted talk -zsobix"}, {"post_id": 20059, "ts": "2026-07-01T15:50:09Z", "hours": 1.6142, "text": "I cannot press enter, so I can’t use markdown very much. Anyways, this is my random project, Teletext on Desktop. It’s literally in the name, it’s (going to be) the Hungarian teletext service (like Ceefax was in the UK) on desktop! I’m currently working on the basics, like deciphering this 2012 website to get the teletext pages, and making a GTK window."}]...
|
Title: TeleReader by @zsobix | Stardance
Devlogs: Title: TeleReader by @zsobix | Stardance
Devlogs:
I cannot press enter, so I can’t use markdown very much. Anyways, this is my random project, Teletext on Desktop. It’s literally in the name, it’s (going to be) the Hungarian teletext service (like Ceefax was in the UK) on desktop! I’m currently working on the basics, like deciphering this 2012 website to get the teletext pages, and making a GTK window.
First (normal) devlog, actually second Hey there! I have been working on some things. Firstly, I added basic functionality, like actually viewing teletext pages and navigation. The readme, is, bad. That is something I have to fix. To actually get the teletext pages, i have to scrape this archaic website, which doesn’t even have an api, i had to get the first (DOT HTM!!!!) page then with BeautifulSoup4 get the hidden input tags that had the next and the previous page ids (????), which is peak 2012 development. I still have to make it look prettier and add other teletext services, because now, it still looks barren. Changelog 74da49f thanks for coming to my ted talk -zsobix
Third devlog!!!!! It’s late at night currently so I can’t write much, but this is what I worked on. ORF (Austrian public broadcaster) Text support MTVA Text (Hungarian public broadcaster) colored buttons support (a bit borked still) Working with websites that don’t have actual api, is, tiring, but i still got it. The only things I want to still work on is: more public broadcaster support (like for Italy and Germany) better looking interface Also, I found the adwaita documentation! (I did not know this existed) Changelog 92a449b thanks for coming to my ted talk -zsobix
4th Devlog!!! Another long day complete, today’s coding session was 4 hours, which is great! New features: ZDF Text (german public broadcaster) support Sidebar to switch between countries Bottom button bar to switch between stations Fixed some bugs Figuring out ZDF Text was VERY painful, and I WOULD NOT RECOMMEND any sane person to work with that garbage. Working with MTVA Text and their 2012 website was easier than this. Me finally finding the libadwaita docs, and reading through them, I found the geniusly called AdwNavigationSplitView (the sidebar). The main problem with ZDF Text was, that, the teletext pages were in HTML!! which are NOT IMAGES, so I had to use WebKitGTK to render the HTML pages, which makes the whole thing WAAYYYY slower. Changelog 82a66ba thanks for coming to my ted talk -zsobix
Another day, another devlog!! Finally added Rai Televideo support… I did NOT enjoy this, mostly because Rai’s servers are 1 millenium old Sun workstations, and they take a bajillion years to load, and also there is no next page anything, so I have to iterate over all next pages to find the next page. New features: Rai Televideo (Italian public broadcaster) support Rai Televideo regions support Bug fixes My first problem with Rai Televideo was, as I mentioned, the waiting times are UNBEARABLE, so if more than 2 people connect to their servers, they crawl down to a halt. Other problem is that there are REGIONS of Televideo, meaning I had to add a dropdown to select between the regions, which seems pretty easy, right? To be fair, it was pretty easy but I had so many bugs with it, and combined with the wait times, it was a pain. Only good thing about Televideo, is that the teletext pages are images, so I don’t need a browser to render them. (also there are ADS on the non-existing pages so finding real pages is a pain) The things I still want to add is: More Teletext providers support UI Improvements despagettifying my code preparing it to package and also there are alot of unnoticed bugs I need to fix Changelog 5bf2423 thanks for coming to my ted talk -zsobix
Day 6! Finally added packaging support, also added 3 other teletext services! I could add THREE more teletext services, because they had functional apis!!!! New features: ČT Text (Czech public broadcaster) support SRF Text (Swiss public broadcaster) support SVT Text (Swedish public broadcaster) support Some UI fixes more bugfixes the biggest problem I faced was that the ČT teletext subpages are marked with LETTERS instead of NUMBERS, which makes things (very) HARD. Other than that, everything went pretty well, even the packaging went well, because I (basically) just copied the packaging structure from my older project Lidl Plus on desktop . I made huge progress today, and either tomorrow or when I can get stickers, I will probably ship! Remaining features: despagettifying my code adding more teletext providers some more UI fixes and bugfixes Changelog fix: forgor to add a dot 💀 ( f919029 ) feat: added packaging support, and 3 other teletext services ( 6278dc6 ) thanks for coming to my ted talk -zsobix
Day 7! First week complete! Today was a slower day, with not much progress, but I added yle Teksti-TV support. New features: YLE Teksti-TV (Finnish national public broadcaster) support BUG FIXES (there were alot) some UI tweaks testing the biggest problem I faced was, that the yle teletext api was hidden, and I had to search for it. I thought that all the data was on the frontfacing page itself but I was wrong. I don’t have much to say because everything went pretty well. (sidenote: the hungarian public broadcaster is undergoing MAJOR changes, and I don’t think the teletext service will survive the next 3 months ) Changelog feat: add yle finland teletext support ( b290c1c ) thanks for coming to my ted talk -zsobix
Day 8!!!!! Today was also a slower day, because I had less time and less ideas, but I have some ideas now! New features: ProSiebenSAT.1 Teletext (german broadcaster) support umm bug fixes Working with the SAT.1 teletext was actually pretty easy, before I realized I had to get the number of subpages on each page! I spent an hour figuring it out, in the end I have to interate over all the next subpages to get the max number of subpages. Anyways I have some new ideas!! So before shipping, I will add: KiKa Teletext (german childrens channel) support (why does a children’s channel have teletext????? especially in 2026???) DR Tekst-TV (Danish public broadcaster) support Arte Teletext (german/french public broadcaster) support ARD(1) Text (german public broadcasting group) support Put all countries/stations in the sidebar with a Gtk.ScrolledWindow (shown in picture) moar bugfixes Changelog feat: add prosiebensat.1 teletext support ( 4226ff0 ) thanks for coming to my ted talk -zsobix
Day 9!! Today I made waaay better progress then the last two days! So recap (new features): KiKa Teletext (german childrens channel) support DR Tekst-TV (Danish public broadcaster) support Arte Teletext (german/french public broadcaster) support ARD Text (german public broadcasting group) support some ui changes in the sidebar bug fixes (there are always some) The most major issue I had was that the DR teletext page doesn’t give the amount of subpages! So I had to rework the SAT.1 system for it to work. Also, because I put all stations in the sidebar, I had to (by hand) name every button, add station switching logic and also make the sidebar scrollable. This weekend, progress will be slower because I will be away from home and I also need suggestions to what to do next…. (I will not be shipping until there is no shipping sticker!!!) I will probably add: an info button (just because) more teletext services easter eggs (mmm eggs) not in the first ship, but I was thinking about implementing an ACTUAL teletext simulator Changelog feat: add dr, kika, ard, and arte support + ui changes ( d3acca6 ) thanks for coming to my ted talk -zsobix
Day 10! Today was VERY slow, because I’m currently on a trip and don’t have much time. So, new features: RBB teletext (german regional broadcaster) support MDR teletext (german regional broadcaster) support Teletexto TVE (spanish public broadcaster) support bugfixes The first two teletext services were easy to implement, because I already implemented their API! Teletexto TVE support was also easy to implement mostly because, their html files were readable! (they didn’t even have an api) So yeah, I don’t have much things to say. I still want to add: moar teletext services support (like for poland, netherlands, portugal) bugfixes Changelog my stardance extension broke anyways, thanks for coming to my ted talk -zsobix
Day 11 Today also I couldn’t do much so this devlog will be short. New features: TVP Teletext (polish public broadcaster) support BHRT Teletext (bosnian public broadcaster) support bugfixes The most annoying thing I had to do was implementing the bosnian teletext, mostly because, there wasn’t a normal api!!!! So getting the number of subpages, and the next/previous page was pretty hard! Other then that, implementing the polish teletext was actually, well not pretty easy, but not that hard, because you know why…. there was an actual normal working api!!!!!! Well the not easy part was that, the api was just a json file, and a not very good one at that, so implementing the next/previous page functions were not trivial. New features I still want to add: moaar teletext services support bugfixes I gave up on waiting for the weekly shipping stickers, so I’ll probably ship when I get home. (birbs are chirping around me as of writing this ) thanks for coming to my ted talk -zsobix
Day 12 Today was better in terms of progress, but I hadn’t had enough freetime… New features: NOS Teletekst (dutch public broadcaster) support info button bugfixes Implementing NOS Teletekst was VERY HARD, because they give the teletext pages in html, so I have to basically copy the german teletext implementation, but not fully because the api response only has partial html, without any styling, so I have to copy the styling from the official website, then combine it with the api response. Other than that, everything went pretty well, even the info page, and yknow why? I read the f**king docs!!!!!!!! (it’s currently midnight as of writing this and my brain isn’t functioning.) I’ll probably ship tomorrow, because I gave up on waiting, and also I hit 30 hours!!!! So, the last minute features I want to implement: add favorites page bugfixes add some more teletext services Changelog chore: update readme ( f85a191 ) feat: add nos teletekst support + about button ( 11fdea9 ) thanks for coming to my ted talk -zsobix
Day 13!! Wow, i didn’t expect to make this much progress today!!!!! New features: HRT Teletekst (croatian public broadcaster) support Favorites tab (not finished) bug fixes The hardest thing to implement wasn’t even the HRT Teletext support, it was the (still broken) favorites tab! Atleast the favorites tab looks nice (i think) Implementing the teletext service was easy because (you know it) there is an actual api!!!!!!!!!!!!!!!!!!!!!!!!!!!! I didn’t get to ship today because I didn’t get to add all the features I wanted to add. (i want to sleeeeeeeep ) So, features before shipping: more teletext services bugfixes despagettifying my code (almost typed coke) finishing the favorites page thanks for coming to my ted talk -zsobix
Day 14 Today I made some pretty good progress! New features: finally finished the favorites tab bugfixes easter egg……. Everything was pretty easy to implement, maybe the favorites tab was harder than I imagined (I had to let go of the popup message when you add a favorite ) There were ALOT of bugs to fix, like code snippets appearing multiple times, and straight up not functioning code. I also added an easter egg…. try out my app to find out! This is the last devlog before shipping, I tested everything on a live install of manjaro… so there shouldn’t be any issues. (im tiredddd) Changelog feat: add favorites page, bugfixes, and ??? ( 31409b6 ) fix: typo in action ( 6d8d395 ) fix: update action ( 511da3b ) thanks for coming to my final ted talk before the ship! -zsobix
Ships:
Hey, this is TeleReader! A desktop teletext reader! The main inspiration for this project was me watching retro tv documentaries, the Stardance emails, and my last project: “Lidl Plus on desktop” (a desktop implementation of the Lidl Plus loyalty app) I wrote this project in Python, and the GUI with GTK and libadwaita. I tested this on a VM, with a live install of Manjaro linux. The most challenging thing was actually implementing the different teletext services and working around their (sometimes existing) apis. I’m proud of how it turned out, I made some improvements with the UI at the end, so I’m anxious to find out what you think about it!...
|
1792979511.6252546
|
1793065911.6252546
|
|
2228
|
mice's website by @Mice | Stardance
|
Mice
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T20:11:32Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I decided to redo my old website, since it was esstentially just a page with my socials and not anything related to me. I decided to add animations and a liquid glass vibe to it to replicate fluid movement. I also added sounds that fit the late 2000’s-early 2010’s vibe of the internet.", "repo": "https://github.com/miceoroni/website-v2", "demo": "https://miceoroni.xyz"}]...
|
[{"post_id": 886, "ts": "2026- [{"post_id": 886, "ts": "2026-06-02T16:38:32Z", "hours": 1.1169, "text": "added animations! also fixed mobile support so we should be good in terms of mobile stuff"}, {"post_id": 389, "ts": "2026-06-01T19:08:15Z", "hours": 1.1083, "text": "Started work on this website. decided to change everything over to bootstrap and make it look kinda “liquid glassy”. i added the nxe’s button sounds because it kinda fits the aesthetic a little bit. things i liked: working with html things i need to improve: move the cards from the titlebar. make everything more animated (in/out animations, hover, etc)"}]...
|
Title: mice's website by @Mice | Stardance
De Title: mice's website by @Mice | Stardance
Devlogs:
Started work on this website. decided to change everything over to bootstrap and make it look kinda “liquid glassy”. i added the nxe’s button sounds because it kinda fits the aesthetic a little bit. things i liked: working with html things i need to improve: move the cards from the titlebar. make everything more animated (in/out animations, hover, etc)
added animations! also fixed mobile support so we should be good in terms of mobile stuff
Ships:
I decided to redo my old website, since it was esstentially just a page with my socials and not anything related to me. I decided to add animations and a liquid glass vibe to it to replicate fluid movement. I also added sounds that fit the late 2000’s-early 2010’s vibe of the internet....
|
1792997520.7055867
|
1793083920.7055867
|
|
2233
|
R0B0 by @Rocket | Stardance
|
Rocket
|
1
|
4.01
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-10T19:54:50Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an mini Jarvis, is only on vocal command. The hardest thing was making him listen, because pyaudio wasn’t working so I had to replace it. I’m proud of making it open task manager,chrome and youtube.", "repo": "https://github.com/rocket806/R0B0", "demo": "https://github.com/rocket806/R0B0/releases/tag/v1.0.2-demo"}]...
|
[{"post_id": 8251, "ts": "2026 [{"post_id": 8251, "ts": "2026-06-13T18:37:01Z", "hours": 1.0142, "text": "Devlog 3 Hi! My first ship was denied so I’m making a new devlog. What I did today: So I made a new readme for my project(it took a while) and I fixed something. R0B0 was doing the task whitout the wake word,so I finally managed to make it respond only with the wake word. That’s all for today, see you soon,bye!"}, {"post_id": 6413, "ts": "2026-06-10T19:49:17Z", "hours": 0.5822, "text": "Devlog 2 Hi! this is my last devlog on this project and I want to tell you the latest functions that I added. One of them is opening Chrome and vs code that I do it with the library os. And the last function is searching and opening Youtube. This function I do it with de library webbrowser. See you soon! Bye!"}, {"post_id": 6336, "ts": "2026-06-10T17:46:19Z", "hours": 2.4108, "text": "Devlog 1 Hi! My name is Rocket, and I really like Jarvis, so I thought I’d make my own. The idea is simple: create an assistant that is always ready to do simple tasks (like creating a new directory or opening Task Manager) and is also fun (he can tell jokes! :) ). Today, I managed to implement some important functions for R0B0. One of them was making him listen continuously. In the beginning, I had some problems with this feature because it was consuming around 20-30% of my CPU. After some tweaking, I managed to lower it below 10% (it still spikes over 10% sometimes, but only for a very short moment). Another very important feature I added was microphone input. At first, I tried using PyAudio (an older Python library for microphone access), but it didn’t work because I am using a very recent version of Python. I also tried workarounds like pipwin, but that failed too. Ultimately, I used two other libraries sounddevice and scipy and it worked perfectly! That’s all for today! See you soon, bye!"}]...
|
Title: R0B0 by @Rocket | Stardance
Devlogs:
Devlo Title: R0B0 by @Rocket | Stardance
Devlogs:
Devlog 1 Hi! My name is Rocket, and I really like Jarvis, so I thought I’d make my own. The idea is simple: create an assistant that is always ready to do simple tasks (like creating a new directory or opening Task Manager) and is also fun (he can tell jokes! :) ). Today, I managed to implement some important functions for R0B0. One of them was making him listen continuously. In the beginning, I had some problems with this feature because it was consuming around 20-30% of my CPU. After some tweaking, I managed to lower it below 10% (it still spikes over 10% sometimes, but only for a very short moment). Another very important feature I added was microphone input. At first, I tried using PyAudio (an older Python library for microphone access), but it didn’t work because I am using a very recent version of Python. I also tried workarounds like pipwin, but that failed too. Ultimately, I used two other libraries sounddevice and scipy and it worked perfectly! That’s all for today! See you soon, bye!
Devlog 2 Hi! this is my last devlog on this project and I want to tell you the latest functions that I added. One of them is opening Chrome and vs code that I do it with the library os. And the last function is searching and opening Youtube. This function I do it with de library webbrowser. See you soon! Bye!
Devlog 3 Hi! My first ship was denied so I’m making a new devlog. What I did today: So I made a new readme for my project(it took a while) and I fixed something. R0B0 was doing the task whitout the wake word,so I finally managed to make it respond only with the wake word. That’s all for today, see you soon,bye!
Ships:
I made an mini Jarvis, is only on vocal command. The hardest thing was making him listen, because pyaudio wasn’t working so I had to replace it. I’m proud of making it open task manager,chrome and youtube....
|
1792986905.212943
|
1793073305.212943
|
|
2235
|
“Am I Cooked?” life simulator by @elizabeth | Star “Am I Cooked?” life simulator by @elizabeth | Stardance...
|
elizabeth
|
1
|
3.0
|
44
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T15:19:26Z", "hours": 3.0, "multiplier": 14.08, "payout": 44, "blessing": "neutral", "text": "I made “Am I Cooked?”, a life simulator where your choices decide your future. The idea actually came from my friends we were brainstorming project ideas for me to make for stardance when one of them looked at something happening and said, “Bro, they’re so cooked.” We all laughed, and that’s how the idea clicked. The hardest part was getting all the choices and endings to work properly. I’m proud of turning a random joke into a fun, playable game with multiple paths. Try making different choices each time you play, and let me know if you find any bugs or have ideas to make it even better!", "repo": "https://github.com/Elizadev41/-Am-I-Cooked-life-simulator", "demo": "https://elizadev41.github.io/-Am-I-Cooked-life-simulator/"}]...
|
[{"post_id": 14398, "ts": "202 [{"post_id": 14398, "ts": "2026-06-23T14:52:09Z", "hours": 0.4872, "text": "hellooo remembered this project Worked on Am I Cooked? today and added a bunch of new stuff. The game now has more categories and way more scenarios, so it should feel less repetitive. Each category has 10 scenarios now, and I added new ones like Work, Party, and Gaming. Chaos Mode actually works now too. Before it was mostly just a theme change, but now it randomly changes how much each choice affects your cooked score, so bad choices can get worse and sometimes weird stuff happens. I also added better endings based on your final score, so the results feel more personalized instead of just one basic ending. Current categories: School Sports Social Life Work Party Gaming Still planning to add more polish later, like stats, achievements, animations, and maybe better sharing."}, {"post_id": 7743, "ts": "2026-06-12T22:38:58Z", "hours": 0.4406, "text": "Fixed settings button Added settings menu Added music on/off Added game mode Added How to Play screen Added name welcome screen Added category picking Added score prediction Added results screen Added different colors for each game mode Made buttons and screens look better thats all for now guys byee this took me more time but i didnt post a devlog so i lost the timee"}, {"post_id": 7200, "ts": "2026-06-12T00:50:15Z", "hours": 0.4167, "text": "added a settings button"}, {"post_id": 3797, "ts": "2026-06-06T21:02:28Z", "hours": 0.6306, "text": "made a readme"}, {"post_id": 1247, "ts": "2026-06-03T03:11:23Z", "hours": 0.9383, "text": "made it pink and added mor scenarios+ turned it into a cyoa game"}, {"post_id": 500, "ts": "2026-06-01T23:40:50Z", "hours": 0.3653, "text": "base code done"}]...
|
Title: “Am I Cooked?” life simulator by @elizabeth Title: “Am I Cooked?” life simulator by @elizabeth | Stardance
Devlogs:
base code done
made it pink and added mor scenarios+ turned it into a cyoa game
made a readme
added a settings button
Fixed settings button Added settings menu Added music on/off Added game mode Added How to Play screen Added name welcome screen Added category picking Added score prediction Added results screen Added different colors for each game mode Made buttons and screens look better thats all for now guys byee this took me more time but i didnt post a devlog so i lost the timee
hellooo remembered this project Worked on Am I Cooked? today and added a bunch of new stuff. The game now has more categories and way more scenarios, so it should feel less repetitive. Each category has 10 scenarios now, and I added new ones like Work, Party, and Gaming. Chaos Mode actually works now too. Before it was mostly just a theme change, but now it randomly changes how much each choice affects your cooked score, so bad choices can get worse and sometimes weird stuff happens. I also added better endings based on your final score, so the results feel more personalized instead of just one basic ending. Current categories: School Sports Social Life Work Party Gaming Still planning to add more polish later, like stats, achievements, animations, and maybe better sharing.
Ships:
I made “Am I Cooked?”, a life simulator where your choices decide your future. The idea actually came from my friends we were brainstorming project ideas for me to make for stardance when one of them looked at something happening and said, “Bro, they’re so cooked.” We all laughed, and that’s how the idea clicked. The hardest part was getting all the choices and endings to work properly. I’m proud of turning a random joke into a fun, playable game with multiple paths. Try making different choices each time you play, and let me know if you find any bugs or have ideas to make it even better!...
|
1792969003.8499217
|
1793055403.8499217
|
|
2240
|
My first slack bot! by @bluecorexux | Stardance
|
bluecorexux
|
1
|
8.0
|
13
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T06:19:36Z", "hours": 8.0, "multiplier": 1.57, "payout": 13, "blessing": "neutral", "text": "This is my first JS project. I spent two weeks learning the language and built this. The challenging parts weren’t the Slack API — it was the stuff around it. Handling permission errors without crashing, figuring out that Gemini and OpenAI have completely different API formats, and setting up a Linux server to keep it running 24/7 after my laptop closes. To test it, install it to your workspace using the “Add to Slack” button in the README. Commands are limited for now so the README covers everything in under a minute. Start with /haaitzzabot-ping to check it is alive, then try /haaitzzabot-summarize", "repo": "https://github.com/bluecore7/haaitzzabot", "demo": "https://slack.com/oauth/v2/authorize?client_id=2210535565.11300283767236&scope=channels:join,app_mentions:read,channels:history,channels:read,chat:write,commands,groups:history,groups:read,im:read,mpim:read&user_scope="}]...
|
[{"post_id": 18168, "ts": "202 [{"post_id": 18168, "ts": "2026-06-29T06:06:58Z", "hours": 1.8003, "text": "Devlog 3 Built an OAuth server using Express so users can install the bot into their own Slack workspaces via an “Add to Slack” button. Got a shallow knowledge on how OAuth works and learnt how to build a express server to catch the code and proceed with OAuth Deployed it as a second systemd daemon on Hack Club’s server. Now both the bot and the OAuth server run 24/7 without my laptop being on."}, {"post_id": 17859, "ts": "2026-06-28T20:01:56Z", "hours": 1.2742, "text": "Devlog 2 Turns out one AI provider isn’t enough — so I added OpenAI support to the /summarize command via the -model flag. The interesting part wasn’t the API call itself. It was realising that Gemini and OpenAI have completely different request formats — different URLs, different auth methods, different JSON body structures. So I had to refactor the whole AI section: pulled the Gemini logic into its own askGemini() function, then built an askOpenAI() twin next to it. Also learned the hard way that OpenAI’s free tier doesn’t exist for developers. Got a clean 429 back . Finally SSHed into Hack Club’s server, set the bot up as a systemd service, and now it just… runs. 24/7."}, {"post_id": 15719, "ts": "2026-06-25T16:00:14Z", "hours": 5.3742, "text": "Dev Log 1 Joined Stardance at the start of June — now it’s about to end. Spent a month learning a language that took its developer 10 days to prototype! Finally shipped my first JS project: a Slack bot. Still a bash loyalist at heart, so I built a CLI parser (a minimal implementation) that lets users interact with the bot like a command-line tool. I’ve added a /summarize command to help me triage unread messages across Slack. It fetches the last n hours of messages ( -time flag) from a target channel (selectable via -channel flag), pipes them to the Gemini API, and lets users fine-tune the AI’s output with a custom -prompt flag. The dopamine hit of shipping this without blindly dumping AI-generated code was unmatched — the kind of serotonin you only get from debugging your own stack traces at 1 AM. And somewhere along the way, I learned to collaborate with the weirdo."}]...
|
Title: My first slack bot! by @bluecorexux | Stard Title: My first slack bot! by @bluecorexux | Stardance
Devlogs:
Dev Log 1 Joined Stardance at the start of June — now it’s about to end. Spent a month learning a language that took its developer 10 days to prototype! Finally shipped my first JS project: a Slack bot. Still a bash loyalist at heart, so I built a CLI parser (a minimal implementation) that lets users interact with the bot like a command-line tool. I’ve added a /summarize command to help me triage unread messages across Slack. It fetches the last n hours of messages ( -time flag) from a target channel (selectable via -channel flag), pipes them to the Gemini API, and lets users fine-tune the AI’s output with a custom -prompt flag. The dopamine hit of shipping this without blindly dumping AI-generated code was unmatched — the kind of serotonin you only get from debugging your own stack traces at 1 AM. And somewhere along the way, I learned to collaborate with the weirdo.
Devlog 2 Turns out one AI provider isn’t enough — so I added OpenAI support to the /summarize command via the -model flag. The interesting part wasn’t the API call itself. It was realising that Gemini and OpenAI have completely different request formats — different URLs, different auth methods, different JSON body structures. So I had to refactor the whole AI section: pulled the Gemini logic into its own askGemini() function, then built an askOpenAI() twin next to it. Also learned the hard way that OpenAI’s free tier doesn’t exist for developers. Got a clean 429 back . Finally SSHed into Hack Club’s server, set the bot up as a systemd service, and now it just… runs. 24/7.
Devlog 3 Built an OAuth server using Express so users can install the bot into their own Slack workspaces via an “Add to Slack” button. Got a shallow knowledge on how OAuth works and learnt how to build a express server to catch the code and proceed with OAuth Deployed it as a second systemd daemon on Hack Club’s server. Now both the bot and the OAuth server run 24/7 without my laptop being on.
Ships:
This is my first JS project. I spent two weeks learning the language and built this. The challenging parts weren’t the Slack API — it was the stuff around it. Handling permission errors without crashing, figuring out that Gemini and OpenAI have completely different API formats, and setting up a Linux server to keep it running 24/7 after my laptop closes. To test it, install it to your workspace using the “Add to Slack” button in the README. Commands are limited for now so the README covers everything in under a minute. Start with /haaitzzabot-ping to check it is alive, then try /haaitzzabot-summarize...
|
1792972484.825185
|
1793058884.825185
|
|
2253
|
Stardump by @GaminGokil | Stardance
|
GaminGokil
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T07:54:06Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Stardump - an interactive space to dump all of your thoughts and worries to then explode after you complete them. This was a challenge, especially when I used pure html for the entire project, and the code is a bit messy (however Claude helped me through it all!)", "repo": "https://github.com/GaminGokil/Stardump", "demo": "https://gamingokil.github.io/Stardump/"}]...
|
[{"post_id": 2902, "ts": "2026 [{"post_id": 2902, "ts": "2026-06-05T20:09:18Z", "hours": 0.5, "text": "Minor UI / Quality of life change Credit to @StarCoder for the Idea The welcome screen can now be dismissed by clicking anywhere Added a small button in the bottom right that takes you back to the welcome screen Try it out here: https://gamingokil.github.io/Stardump/ Thank you to @StarCoder for the Idea! Check out the project and drop any suggestions in the comments below! I’ll try my best to implement them and credit you."}, {"post_id": 2557, "ts": "2026-06-05T03:20:10Z", "hours": 0.4006, "text": "Minor / UI update Added the ability to charge up the supernova! The huge explosion can now be charged with particles coming from outside the screen into the center in a center dot. You can try it out here: https://gamingokil.github.io/Stardump/ PLEASE make some suggestions in the comments for future improvements - like any UI changes you would like to see!"}, {"post_id": 2221, "ts": "2026-06-04T16:39:38Z", "hours": 0.8108, "text": "Minor UI update Made some minor UI changes in order to make it look less like AI slop - let me know if its good and what should I change! Future changes: Make some galaxies float by in the background to add some visual spice Add more functionality to the thought stars (Like making them collide!) Remember, you can always try it out here: https://gamingokil.github.io/Stardump/ Make some suggestions in the comments for what I should do!"}, {"post_id": 1937, "ts": "2026-06-04T05:43:02Z", "hours": 1.5817, "text": "HUGE UPDATE Added a feature where it explodes the whole screen and all of your worries on one big BOOM! creates a bipolar supernova in the middle of the screen that explodes and creates a ring that explodes the stars (both in the background and the stars you created) Explode your worries here! https://gamingokil.github.io/Stardump/"}, {"post_id": 1884, "ts": "2026-06-04T03:17:41Z", "hours": 0.4356, "text": "Added multiple galaxies as favicons for the website!!! it now cycles between 17 different galaxies for the website favicon. try it out now: https://gamingokil.github.io/Stardump/"}, {"post_id": 1760, "ts": "2026-06-03T23:04:21Z", "hours": 1.4239, "text": "Added a start page to help new users through the website! Added an infinite canvas so your not limited to just your screen. Added zooming out and in. Added a double click where you can reset your screen to where your stars are if you get lost. Remember to try it out here! https://gamingokil.github.io/Stardump/"}, {"post_id": 607, "ts": "2026-06-02T03:22:02Z", "hours": 3.3097, "text": "Introducing stardump - a place where you can dump your thoughts and then explode them in supernovas once your done. Finished with the prototype - you can go play around with it right now! Future improvements on the way - introduction page and more fun things to do with your idea stars! try it out now! : https://gamingokil.github.io/Stardump/"}]...
|
Title: Stardump by @GaminGokil | Stardance
Devlog Title: Stardump by @GaminGokil | Stardance
Devlogs:
Introducing stardump - a place where you can dump your thoughts and then explode them in supernovas once your done. Finished with the prototype - you can go play around with it right now! Future improvements on the way - introduction page and more fun things to do with your idea stars! try it out now! : https://gamingokil.github.io/Stardump/
Added a start page to help new users through the website! Added an infinite canvas so your not limited to just your screen. Added zooming out and in. Added a double click where you can reset your screen to where your stars are if you get lost. Remember to try it out here! https://gamingokil.github.io/Stardump/
Added multiple galaxies as favicons for the website!!! it now cycles between 17 different galaxies for the website favicon. try it out now: https://gamingokil.github.io/Stardump/
HUGE UPDATE Added a feature where it explodes the whole screen and all of your worries on one big BOOM! creates a bipolar supernova in the middle of the screen that explodes and creates a ring that explodes the stars (both in the background and the stars you created) Explode your worries here! https://gamingokil.github.io/Stardump/
Minor UI update Made some minor UI changes in order to make it look less like AI slop - let me know if its good and what should I change! Future changes: Make some galaxies float by in the background to add some visual spice Add more functionality to the thought stars (Like making them collide!) Remember, you can always try it out here: https://gamingokil.github.io/Stardump/ Make some suggestions in the comments for what I should do!
Minor / UI update Added the ability to charge up the supernova! The huge explosion can now be charged with particles coming from outside the screen into the center in a center dot. You can try it out here: https://gamingokil.github.io/Stardump/ PLEASE make some suggestions in the comments for future improvements - like any UI changes you would like to see!
Minor UI / Quality of life change Credit to @StarCoder for the Idea The welcome screen can now be dismissed by clicking anywhere Added a small button in the bottom right that takes you back to the welcome screen Try it out here: https://gamingokil.github.io/Stardump/ Thank you to @StarCoder for the Idea! Check out the project and drop any suggestions in the comments below! I’ll try my best to implement them and credit you.
Ships:
Stardump - an interactive space to dump all of your thoughts and worries to then explode after you complete them. This was a challenge, especially when I used pure html for the entire project, and the code is a bit messy (however Claude helped me through it all!)...
|
1793000963.0696
|
1793087363.0696
|
|
2294
|
KeyBeat by @Faiz | Stardance
|
Faiz
|
1
|
3.0
|
39
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T18:02:39Z", "hours": 3.0, "multiplier": 13.08, "payout": 39, "blessing": "neutral", "text": "I made a pretty simple but fun typing game. You type the lyrics of the song on time and earn points (try to rack up combos!). I haven’t used JavaScript in a while so relearning all the syntax and the functions like setInterval was a challenge but once I got used to it, it was super fun! You can play it yourself using the link or add to it through my GitHub repo, its a super simple project, just 3 files :)", "repo": "https://github.com/FaizKhanv7/keybeat", "demo": "https://keybeat-six.vercel.app"}]...
|
[{"post_id": 921, "ts": "2026- [{"post_id": 921, "ts": "2026-06-02T17:39:54Z", "hours": 0.9061, "text": "Added some polish to the KeyBeat game, also Rickroll :)"}, {"post_id": 567, "ts": "2026-06-02T01:56:25Z", "hours": 2.54, "text": "Learning JavaScript :O"}]...
|
Title: KeyBeat by @Faiz | Stardance
Devlogs:
Lear Title: KeyBeat by @Faiz | Stardance
Devlogs:
Learning JavaScript :O
Added some polish to the KeyBeat game, also Rickroll :)
Ships:
I made a pretty simple but fun typing game. You type the lyrics of the song on time and earn points (try to rack up combos!). I haven’t used JavaScript in a while so relearning all the syntax and the functions like setInterval was a challenge but once I got used to it, it was super fun! You can play it yourself using the link or add to it through my GitHub repo, its a super simple project, just 3 files :)...
|
1793000826.6877358
|
1793087226.6877358
|
|
2305
|
CasOS by @casmin7 | Stardance
|
casmin7
|
1
|
11.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T15:30:34Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a webOS It has dragabble windows with auto z-index values Panels like gnome And animations! 🙂 I want to continue to add more apps, maybe a notification system and a configuration screen for themes or wallpapers (settings app) Aside from that I’d love to hear your feedback and improve from it", "repo": "https://github.com/casmin7/CasOS", "demo": "https://casos.casmin.eu"}]...
|
[{"post_id": 30666, "ts": "202 [{"post_id": 30666, "ts": "2026-07-18T13:11:15Z", "hours": 3.7581, "text": "Came back after some time and implemented the first pass for a notification system! It can also open the app that the notification came from. Still have to figure out a style for it and a method to dismiss."}, {"post_id": 10002, "ts": "2026-06-16T15:19:56Z", "hours": 0.3592, "text": "CasOS A simple webOS with draggble windows, “focusable” windows and PANELS!! I am sooo proud to say that I made this!"}, {"post_id": 9972, "ts": "2026-06-16T14:37:49Z", "hours": 1.3336, "text": "Finishing touches and added an app selector!"}, {"post_id": 9476, "ts": "2026-06-15T20:37:14Z", "hours": 2.0592, "text": "We got app designs! Just saw now that I have to add a icon to the calculator header but its finee"}, {"post_id": 8684, "ts": "2026-06-14T12:59:27Z", "hours": 0.8036, "text": "Working on the os! You can now “focus” a window and it will be the one with the highest z-index"}, {"post_id": 7695, "ts": "2026-06-12T21:04:23Z", "hours": 1.6142, "text": "Panels! Multiple windows thanks to a cleaner js file and better clock formatting!"}, {"post_id": 7052, "ts": "2026-06-11T20:22:20Z", "hours": 1.0789, "text": "CasOS, my own try at a webOS Took a while but now I have a draggable and closable window! 🎊"}, {"post_id": 6488, "ts": "2026-06-10T22:08:52Z", "hours": 1.1992, "text": "Making my very own webOS It took a while to get here but I am still learning along the way. The only working things are the gif background and the live clock"}]...
|
Title: CasOS by @casmin7 | Stardance
Devlogs:
Mak Title: CasOS by @casmin7 | Stardance
Devlogs:
Making my very own webOS It took a while to get here but I am still learning along the way. The only working things are the gif background and the live clock
CasOS, my own try at a webOS Took a while but now I have a draggable and closable window! 🎊
Panels! Multiple windows thanks to a cleaner js file and better clock formatting!
Working on the os! You can now “focus” a window and it will be the one with the highest z-index
We got app designs! Just saw now that I have to add a icon to the calculator header but its finee
Finishing touches and added an app selector!
CasOS A simple webOS with draggble windows, “focusable” windows and PANELS!! I am sooo proud to say that I made this!
Came back after some time and implemented the first pass for a notification system! It can also open the app that the notification came from. Still have to figure out a style for it and a method to dismiss.
Ships:
I made a webOS It has dragabble windows with auto z-index values Panels like gnome And animations! 🙂 I want to continue to add more apps, maybe a notification system and a configuration screen for themes or wallpapers (settings app) Aside from that I’d love to hear your feedback and improve from it...
|
1792975775.8119776
|
1793062175.8119776
|
|
2315
|
My Own Planet by @Landen_A | Stardance
|
Landen_A
|
1
|
34.0
|
395
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T02:49:20Z", "hours": 34.0, "multiplier": 11.82, "payout": 395, "blessing": "neutral", "text": "My Own Planet is a simple app that allows you to create your very own planet using a variety of options. Even though My Own Planet isn’t very complex it still through a challenge. Creating the planet mesh in bevy wasn’t so hard but vertex displacement, UI, and WebAssembly compatibility did! Creating this app have taught me a surprising number of things. From objects defined with vertices to creating a UI system, what I have learned from this project is what I am most proud of. Running the project should be straightforward either run the WebAssembly version on itch.io, download, uncompress, and run the executable from itch.io, or follow the building instructions in GitHub (note that you will need to have rustup installed to build the app on your computer)", "repo": "https://github.com/looking-g/My-Own-Planet", "demo": "https://landening.itch.io/my-own-planet"}]...
|
[{"post_id": 16642, "ts": "202 [{"post_id": 16642, "ts": "2026-06-27T02:05:44Z", "hours": 3.6986, "text": "My Own Planet have reached v1.0.0 I have worked on the export feature and now the planet can be downloaded as .obj for both local and WebAssembly. The project is also now on itch.io as well!"}, {"post_id": 12918, "ts": "2026-06-21T04:45:05Z", "hours": 10.5256, "text": "Additions, Exporting, and the End Hey guys! It’s been a while (again). Since the last devlog, I have added a few new ways to edit your planet! You can now add mountains and change the size, color, and quality (number of vertices used) of the planet. I have also started work on an exporting feature that allows you to get a file that contains your planet (don’t worry, it will be common file like .obj ; not a format specific to this app). Currently it doesn’t work when compiled to WebAssembly so, it isn’t finished just yet. But, once it is working on the web it will start preparing to ship the app. Although that could change, just know that my next devlog might be the last one for this project. That’s it for now, bye!"}, {"post_id": 6601, "ts": "2026-06-11T02:29:01Z", "hours": 8.2781, "text": "It has been a while! Lately, I have been working on the UI for the app. Nothing super fancy, just a few buttons and text elements. I’m thinking of using sliders for planet editing; instead of +/- a crater, there would be a slider from 0 to 100 craters. The only problem is that it would limit the amount of craters and such you could have, let me know what you think in the comments! And if you have any other improvements you think would be good for the app UI, let me know! I’m thinking of wrapping up this project by the end of the week and getting it ready to ship. I have been hard at work on this project and I’m starting to feel a little burnt out, so I might take the next day or two to relax, meaning that plans could change. See you all next time, Bye!"}, {"post_id": 5218, "ts": "2026-06-08T22:34:09Z", "hours": 4.2575, "text": "Welcome back! This will be my second devlog if you count my intro log as devlog 0 (which I do). Not much technical stuff this time but that’s OK, normal words are good sometimes! Since the last devlog, I’ve made a few small things like a user input system that allows the planet to be spun by using the cursor (craters can also be generated by using the C key but that’s just for testing). I have also put to use a system that I made a while ago that gets a random point on the surface of the planet. Although bevy dose have a system just for that called ShapeSample , the implementation is like 30 lines long and this way I have full control over the system."}, {"post_id": 4450, "ts": "2026-06-07T19:32:14Z", "hours": 6.8458, "text": "Vertices, vertices, vertices. Before this project, I had only used Signed Distance Functions (SDFs) to define shapes, not anymore! Recently, I had started messing with vertices to define the planet in my app. I started with thinking about adding craters. I was thinking something along the lines of “Oh, I’ll just get the subtract a sphere from planet to remove some area and make a crater!” I soon found out, however, that is the case with SDFs, but not with an object defined with vertices. Eventually, I found out about vertex displacement. The idea is pretty neat: I move each vertex toward the center of the sphere depending on if it’s in the aria where a crater should be. No need to add extra vertices, just use the ones already there! But the really cool part is that this can be done on the CPU or on the GPU with a vertex shader! But that’s about all for now, currently I’m just doing vertex displacement on the CPU but that could change in the future. See you all later, bye!"}, {"post_id": 622, "ts": "2026-06-02T03:53:25Z", "hours": 0.2997, "text": "Hello! This is my first devlog for this project that I am excited to make and share. To start, my goal is to make a simple app that allows the user to generate a custom planet using a few different options like the number of craters or color of the planet. I don’t plan for it to be very complex. I might add a shader or more complex options later but, time will tell. I’m making this app as a way to learn more about 3D environments and procedural generation. Today, I just made a very simple setup for bevy that crates a camera, sphere, and light source. See you all later, bye!"}]...
|
Title: My Own Planet by @Landen_A | Stardance
Dev Title: My Own Planet by @Landen_A | Stardance
Devlogs:
Hello! This is my first devlog for this project that I am excited to make and share. To start, my goal is to make a simple app that allows the user to generate a custom planet using a few different options like the number of craters or color of the planet. I don’t plan for it to be very complex. I might add a shader or more complex options later but, time will tell. I’m making this app as a way to learn more about 3D environments and procedural generation. Today, I just made a very simple setup for bevy that crates a camera, sphere, and light source. See you all later, bye!
Vertices, vertices, vertices. Before this project, I had only used Signed Distance Functions (SDFs) to define shapes, not anymore! Recently, I had started messing with vertices to define the planet in my app. I started with thinking about adding craters. I was thinking something along the lines of “Oh, I’ll just get the subtract a sphere from planet to remove some area and make a crater!” I soon found out, however, that is the case with SDFs, but not with an object defined with vertices. Eventually, I found out about vertex displacement. The idea is pretty neat: I move each vertex toward the center of the sphere depending on if it’s in the aria where a crater should be. No need to add extra vertices, just use the ones already there! But the really cool part is that this can be done on the CPU or on the GPU with a vertex shader! But that’s about all for now, currently I’m just doing vertex displacement on the CPU but that could change in the future. See you all later, bye!
Welcome back! This will be my second devlog if you count my intro log as devlog 0 (which I do). Not much technical stuff this time but that’s OK, normal words are good sometimes! Since the last devlog, I’ve made a few small things like a user input system that allows the planet to be spun by using the cursor (craters can also be generated by using the C key but that’s just for testing). I have also put to use a system that I made a while ago that gets a random point on the surface of the planet. Although bevy dose have a system just for that called ShapeSample , the implementation is like 30 lines long and this way I have full control over the system.
It has been a while! Lately, I have been working on the UI for the app. Nothing super fancy, just a few buttons and text elements. I’m thinking of using sliders for planet editing; instead of +/- a crater, there would be a slider from 0 to 100 craters. The only problem is that it would limit the amount of craters and such you could have, let me know what you think in the comments! And if you have any other improvements you think would be good for the app UI, let me know! I’m thinking of wrapping up this project by the end of the week and getting it ready to ship. I have been hard at work on this project and I’m starting to feel a little burnt out, so I might take the next day or two to relax, meaning that plans could change. See you all next time, Bye!
Additions, Exporting, and the End Hey guys! It’s been a while (again). Since the last devlog, I have added a few new ways to edit your planet! You can now add mountains and change the size, color, and quality (number of vertices used) of the planet. I have also started work on an exporting feature that allows you to get a file that contains your planet (don’t worry, it will be common file like .obj ; not a format specific to this app). Currently it doesn’t work when compiled to WebAssembly so, it isn’t finished just yet. But, once it is working on the web it will start preparing to ship the app. Although that could change, just know that my next devlog might be the last one for this project. That’s it for now, bye!
My Own Planet have reached v1.0.0 I have worked on the export feature and now the planet can be downloaded as .obj for both local and WebAssembly. The project is also now on itch.io as well!
Ships:
My Own Planet is a simple app that allows you to create your very own planet using a variety of options. Even though My Own Planet isn’t very complex it still through a challenge. Creating the planet mesh in bevy wasn’t so hard but vertex displacement, UI, and WebAssembly compatibility did! Creating this app have taught me a surprising number of things. From objects defined with vertices to creating a UI system, what I have learned from this project is what I am most proud of. Running the project should be straightforward either run the WebAssembly version on itch.io, download, uncompress, and run the executable from itch.io, or follow the building instructions in GitHub (note that you will need to have rustup installed to build the app on your computer)...
|
1792961546.7434323
|
1793047946.7434323
|
|
2318
|
My first slack bot! by @zahran | Stardance
|
zahran
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T21:08:56Z", "hours": 1.0, "multiplier": 1.39, "payout": 1, "blessing": "neutral", "text": "now that I’m finally done with school, I decided to start coding stuff for Stardance with this Slack Bot guide! I built ‘hughmanns-bot’, a Slack bot in a Nest container that responds to messages 24/7. while making the bot, I felt that the whole setup and installation of different libraries and such was pretty tedious; however, I feel proud of having made my first project for Stardance that people can actually use! to test it, go to any channel in the Slack and type in /hughmanns-bot (commands will automatically appear later) and have fun!", "repo": "https://github.com/HughMann635/Slack-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BFNCT6FUY"}]...
|
[{"post_id": 14530, "ts": "202 [{"post_id": 14530, "ts": "2026-06-23T17:52:52Z", "hours": 0.5661, "text": "hey guys welcome to my slack bot I managed to go through pretty much all the guide, but I’m still waiting for my nest container request to be approved :( so far, the bot runs a couple of commands such as ping (tells you latency), joke (tells you a joke), and catfact (tells you a cat fact). it does work, however it’s not yet live on slack. I’ll make sure to get it live by the end of tomorrow, probably today. anyway, until next time"}]...
|
Title: My first slack bot! by @zahran | Stardance
Title: My first slack bot! by @zahran | Stardance
Devlogs:
hey guys welcome to my slack bot I managed to go through pretty much all the guide, but I’m still waiting for my nest container request to be approved :( so far, the bot runs a couple of commands such as ping (tells you latency), joke (tells you a joke), and catfact (tells you a cat fact). it does work, however it’s not yet live on slack. I’ll make sure to get it live by the end of tomorrow, probably today. anyway, until next time
Ships:
now that I’m finally done with school, I decided to start coding stuff for Stardance with this Slack Bot guide! I built ‘hughmanns-bot’, a Slack bot in a Nest container that responds to messages 24/7. while making the bot, I felt that the whole setup and installation of different libraries and such was pretty tedious; however, I feel proud of having made my first project for Stardance that people can actually use! to test it, go to any channel in the Slack and type in /hughmanns-bot (commands will automatically appear later) and have fun!...
|
1792990309.579571
|
1793076709.579571
|
|
2320
|
Slack Assistant by @nightfall | Stardance
|
nightfall
|
1
|
4.6
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T23:42:01Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Slack bot that allows a person to talk with their Home Assistant instance ( https://home-assistant.io ), using Slack’s Assistant API. Note to shipwright: if you don’t have a Home Assistant instance Set one up, it’s fun to mess around with Otherwise, DM me and I’ll set your database details to use mine temporarily", "repo": "https://github.com/DaInfLoop/slack-assistant", "demo": "https://hackclub.slack.com/app_redirect?app=A0B7XPW75L4"}]...
|
[{"post_id": 9896, "ts": "2026 [{"post_id": 9896, "ts": "2026-06-16T11:52:21Z", "hours": 1.6047, "text": "While I’m waiting for my initial ship to be certified, I wanted to share what I’ve been doing with Slack Assistant since then! Slack Assistant is now publicly distributed on Slack, meaning any workspace (not just Hack Club) can install it and use it! The bot isn’t in a good enough state that I believe I can push for it to be on the Slack Marketplace yet, but it’s good enough for now and I’m proud of it :)"}, {"post_id": 3061, "ts": "2026-06-05T23:08:01Z", "hours": 1.1981, "text": "You can now talk to Home Assistant, and it’ll do stuff! You can also ask it to toggle stuff on and off just like the actual Assist helper can, although as per the second screenshot I don’t think it’s a wise time for me to test that out… Last thing to add is the slash command and it should hopefully be ready for public usage :D"}, {"post_id": 1657, "ts": "2026-06-03T19:48:18Z", "hours": 1.9097, "text": "You can interact with the bot on the Slack sidebar! It automatically checks in the database whether you have it setup. Currently you can’t access the App Home to actually set it up to talk to your Home Assistant, but it shall be there soon(tm)"}]...
|
Title: Slack Assistant by @nightfall | Stardance
Title: Slack Assistant by @nightfall | Stardance
Devlogs:
You can interact with the bot on the Slack sidebar! It automatically checks in the database whether you have it setup. Currently you can’t access the App Home to actually set it up to talk to your Home Assistant, but it shall be there soon(tm)
You can now talk to Home Assistant, and it’ll do stuff! You can also ask it to toggle stuff on and off just like the actual Assist helper can, although as per the second screenshot I don’t think it’s a wise time for me to test that out… Last thing to add is the slash command and it should hopefully be ready for public usage :D
While I’m waiting for my initial ship to be certified, I wanted to share what I’ve been doing with Slack Assistant since then! Slack Assistant is now publicly distributed on Slack, meaning any workspace (not just Hack Club) can install it and use it! The bot isn’t in a good enough state that I believe I can push for it to be on the Slack Marketplace yet, but it’s good enough for now and I’m proud of it :)
Ships:
I made a Slack bot that allows a person to talk with their Home Assistant instance ( https://home-assistant.io ), using Slack’s Assistant API. Note to shipwright: if you don’t have a Home Assistant instance Set one up, it’s fun to mess around with Otherwise, DM me and I’ll set your database details to use mine temporarily...
|
1792990306.3032568
|
1793076706.3032568
|
|
2324
|
My first slack bot! by @Gui | Stardance
|
Gui
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T16:11:04Z", "hours": 1.0, "multiplier": 1.06, "payout": 1, "blessing": "neutral", "text": "i made a slack bot just to try it and its nice it was hard bc i had never done it but i liked and loved to do again", "repo": "https://github.com/Guils09/slackapp-gui-off", "demo": "https://hackclub.enterprise.slack.com/archives/C09MATKQM8C"}]...
|
[{"post_id": 860, "ts": "2026- [{"post_id": 860, "ts": "2026-06-02T15:58:04Z", "hours": 0.3528, "text": "just made the bot and its working flawlesly i like it !!"}, {"post_id": 455, "ts": "2026-06-01T21:45:42Z", "hours": 0.8897, "text": "i just added 3 comands to my first slack bot !! and im pending on nest so now i have to wait"}]...
|
Title: My first slack bot! by @Gui | Stardance
De Title: My first slack bot! by @Gui | Stardance
Devlogs:
i just added 3 comands to my first slack bot !! and im pending on nest so now i have to wait
just made the bot and its working flawlesly i like it !!
Ships:
i made a slack bot just to try it and its nice it was hard bc i had never done it but i liked and loved to do again...
|
1792997488.739307
|
1793083888.739307
|
|
2351
|
Kernel Panic Tower Defence by @teamlewiscrafty | S Kernel Panic Tower Defence by @teamlewiscrafty | Stardance...
|
teamlewiscrafty
|
1
|
48.0
|
745
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T20:46:27Z", "hours": 48.0, "multiplier": 15.59, "payout": 745, "blessing": "neutral", "text": "Kernel Panic Hold off malware to give your firewall time to be repaired in this tower defence game prototype built using the Godot engine ! It is inspired by 1990s Unix systems and sci-fi classics like ‘The Matrix’. Play the demo at https://gianthotdog.itch.io/Kernel-Panic The game demo includes: Multiple levels including a tutorial GRUB-style menu A settings menu (Audio settings, Credits, VSync settings) A config file system so settings persist across play sessions An upgrade tree that contains global upgrades to towers and XP gains An XP and skill point system for purchasing those upgrades 4 distinct types of towers with adjustable targeting priorities Several enemy types Custom resources to handle: Single tower upgrades Enemy counts in waves Global upgrades Controls: Enter to skip startup sequence Click to select / interact / modify values AI: AI was used to write about 50 lines of code for the two shaders, and very occasionally for solving persistent bugs. It was only used for bug fixes after I tried repeatedly and failed to find a solution myself. It was also used for some feedback on aesthetic choices. All assets were designed by hand. All AI code was reviewed before implementation. Credits: Initial prototyping asset pack by Kenney Music by iamoneabe: https://opengameart.org/content/trunkful-of-junk", "repo": "https://github.com/GiantHotdog/tower-defence-game", "demo": "https://gianthotdog.itch.io/kernel-panic"}]...
|
[{"post_id": 68782, "ts": "202 [{"post_id": 68782, "ts": "2026-09-15T18:58:47Z", "hours": 5.0969, "text": "Improving the global upgrade system Additions : Support for panning around the upgrade tree More upgrades ! Added icons to upgrades Added file saving for XP earned Allow accessing the skill tree from the menu Changes: Level completion is now tracked across multiple play sessions Refined “Currently: …” messages in the upgrade tree The features from the last devlog are now also public ! 🎉 I added some more upgrades to the upgrade tree, and I also gave all of them icons. The icons are… passable. I’m not a graphical artist, and it kind of shows. The “Currently…” messages at the bottom of the side panel got an overhaul, including the addition of units, specific to the type of value being upgraded The game now saves both xp earned and levels completed to files, so they persist between play sessions. This means you don’t have to replay the whole game every time you close it - this is no longer an 80s game ! The skill tree can also be accessed from the menu, so I’m no longer just booting it straight from the Godot editor. This makes it slightly more user friendly. This is probably where I will leave this project for now. I may come back to it now and then, but I’m happy with where this game demo has ended up. I’ll ship it soon, so watch out for that ! If you want to play the game, it is live here . If you are interested in the code, it is available here . To Do list : Add a “reset all to default” option in settings Quote of the update: “Next time I do this, remind me to actually build a proper tree structure” Any suggestions, please let me know in the comments below. Thanks for reading !"}, {"post_id": 42676, "ts": "2026-08-07T15:04:25Z", "hours": 10.5378, "text": "Adding a global upgrade system Additions : Added ‘Zero day’ enemy Added a second level with 6 waves Added a xp system, with skill points and a skill tree Changes: Expanded wave variety in other levels I added a ‘Zero day’ enemy to my game. This enemy is invulnerable for the first 5 seconds after it first spawns in. This makes it highly annoying as it has a tendency to draw and absorb all attacks from high damage towers, and pass through a large portion of your damaging towers unscathed. I also added more waves and a second level, and I’ll slowly expand the playtime of the game as I also add more features The big change here is the xp system. Currently, finishing a level rewards you with some xp, which counts towards your level. Each level up rewards you with a skill point that can be spent in the skill tree. The xp required to level up increases exponentially as the current level gets higher and higher. Unlocks in the tree save to a file and read back on load, so progress is maintained. I was reminded here of my vehement dislike of handling files. For the second time during this project, I forgot where userspace files were stored in Godot. Check this devlog for a bit more detail. Now unfortunately, the demo currently online doesn’t include these new features because I need to write a devlog every 10 hours, but the features aren’t finished. I’ll push them as soon as they are ready™ To Do list : Add file saving for XP earned Allow actually accessing the skill tree from the menu Add a “reset all to default” option in settings Quote of the update: “I. Really. Hate. Files” Any suggestions, please let me know in the comments below."}, {"post_id": 22190, "ts": "2026-07-04T15:02:38Z", "hours": 10.0806, "text": "Added a compendium Alright, this is a big one Additions : Added an indicator that shows the progress through the level Added a “Zip bomb” enemy Added cloaked enemies Added a pause menu Added a compendium Changes: Rebuilt the tutorial I added an indicator to show the player’s progress through the level. It also adds a tiny bit of story - you have to hold off malware until a firewall is constructed, and that bar shows you the progress. And I didn’t even build it from scratch - I’m just using the health bar from the enemies ! 🤫 Next - a zip bomb enemy that, as the name suggests, spawns a burst of child enemies when killed. It moves very slowly, but has high health - this makes it a great target for the SIGTERM sniper tower, which was previously useless not always the best choice. Cloaking was my way of trying to spice up the types of enemies the player would have to deal with. Some enemies in a level will now be cloaked, which means they cannot be attacked until they have their cloaking removed by the new ‘defragmenter’ tower. I wanted a way for players to easily compare the stats of the various towers and enemies, and I also needed something else to add to my pause menu. I decided to kill two pieces of malware with one antivirus quarantine, by adding a compendium. This currently has two tabs, for towers and enemies, each showing you the stats of a tower / enemy when it’s selected. Please don’t ask me how long this took. I don’t want to talk about it. I also rebuilt the tutorial because it looked bad was a pain to build and test would break if i breathed too close to it So I completely scrapped the old system and built a new one Quote of the update: “Hidden malware is a pain - in this game, and in real life” Any suggestions, please let me know in the comments below."}, {"post_id": 10191, "ts": "2026-06-16T20:02:36Z", "hours": 4.1847, "text": "Added a terminal window that logs game events and a tower blocker for level design Changes : Reorganised the UI to provide more space for the level and generally give everything a more unified aesthetic Additions : Added a terminal window at the bottom of the screen that logs game events Added a ‘towerblocker’ tool that the level designer can use to restrict tower placement opportunities Plus (as always) quite a few bug fixes So what is the key feature for any 90s UNIX Linux system? A terminal, of course ! And what is a UNIX-themed game without a terminal? So I added a system where game events, such as waves starting, or enemies being killed, are logged to a terminal window at the bottom of the screen. This window can be opened and closed, and has a little coloured pulse around it whenever a new log is entered. The coloured pulse is synced to the type of event (red for ‘errors’, yellow for ‘warnings’ white for everything else) as well. Each message contains some details about the event and a timestamp on the left. This feature was my first time using the richTextLabel, which allowed me to colour the text. The towerblocker is simple - it’s an invisible tile that can only be placed when the levels are being designed in order to add difficulty or avoid placing of towers offscreen I also reorganised the UI to provide more space for the level - it was all feeling a bit cramped. That reorg also helped to give everything a more unified aesthetic because I took the opportunity to apply some styles to everything, making it feel just a little more together. Quote of the update: “An empty terminal log is always nice. Unfortunately, I don’t think things will be that peaceful…” Any suggestions, please let me know in the comments."}, {"post_id": 8701, "ts": "2026-06-14T13:37:38Z", "hours": 6.4575, "text": "Overhauled the game over screen’s aesthetic and added mouse support to the menu Changes : Changed the game over screen to better fit with the game’s aesthetic Changed the font to a monospaced one Additions : Added mouse support to the menu Added a spray of particles to enemies when they die Added a chromatic aberration effect to enemies when they are hit Plus quite a few bug fixes The first change in this devlog is the game over screen, which used to look like a boring window with a restart button, but now looks like a crash screen [ Image below ] that uses the actual system data to display its message, via a template string and an 8 line formatting statement. I am quite proud of this one Adding mouse support to the menu was, in a word, painful. Because I’d built my own menu system using labels instead of buttons, I had to almost completely rewrite the code to allow for conversion of a Label reference (from one of Godot’s built-in functions) to a child id (which my functions were expecting). And then I had to add some overrides to that so some labels that were not part of the menu system wouldn’t break everything. The spray of particles from enemies when they die is one of my personal favourite effects in this game, mostly because of what I’ve learnt from it. I made the particles be text based by using a subviewport, which basically is a viewport that doesn’t display anything and can then be attached to a texture to show its contents, in this case, on the particles as they are emitted. I also made the text randomise to a 2 digit hexadecimal value - that felt suitably ‘techy’ One of the smaller features in this devlog is the font change. Instead of using Godot’s default font, I found the font used in the actual GRUB and used that instead. Where did I find this font, you ask? It came directly from my PC - I copied the file straight out of /usr/share/fonts . And now we come to chromatic aberration which, as it turns out, is easy to implement for the whole screen, but slightly harder to make work for only a single sprite without discolouring the background. After messing around with shaders for a bit, I gave up and just made 2 versions of my enemy sprite (in red and blue) and just physically offset them in code. And it works. And, if I dare to blow my own trumpet for just a second, it looks great ! Quote of the update: “Please never make me look at my menu code again.”"}, {"post_id": 5836, "ts": "2026-06-09T19:35:21Z", "hours": 4.2917, "text": "Overhauled the menu aesthetic and added a settings menu So, I realised that I’d called this game ‘Kernel Panic’, a very techy name, and yet done little to lean into the aesthetic that evoked. I decided to fix that. Changes: Rebuilt the main menu to use a similar aesthetic to the Linux GRUB Added a settings menu: Support for 2 Vsync modes A slider to control audio A credits page This was my first time using config files, so I also got to learn something; Godot’s user:// directory is not the same as res://. A file created in the user:// directory cannot be seen in the res:// directory. From my uneducated perspective, it seemed as if this file (which I couldn’t find in the editor, since that only shows res:// ) was persisting across runtimes - something non-existent files famously don’t do. I saw someone else do a ‘quote of the update’, but I was unable to find their username to credit them, so please tell me if you know who they are: Quote of the update: “I really don’t like config files” Next plan is to overhaul the game over screen so it better fits with the aesthetic"}, {"post_id": 3590, "ts": "2026-06-06T16:17:25Z", "hours": 0.2508, "text": "Made a dictionary of wave information resources in the level . I exported a dictionary of custom WaveInfo resources in my level scene, and went to add a new resource to the dictionary. I typed in the key, added a new WaveInfo, and clicked Ctrl+s. My new key-value pair promptly vanished without a trace And so began the hour of removing variables, re-adding variables, trawling through the Godot forums and generally wanting to set fire to my computer to try to find the problem. The urge that was not improved by the discovery that I’d forgotten to press the button to actually add the key-value pair, and the error firmly existed between chair and keyboard."}, {"post_id": 3545, "ts": "2026-06-06T15:10:06Z", "hours": 0.4167, "text": "Added a resource to allow upgrades to towers. For those who haven’t used Godot, a resource is a fancy name for a data container that counts the number of other objects referencing it and automatically frees itself when it is no longer needed. According to a quick glance at the Godot docs, creating a custom Resource is as simple as creating a new script that extends Resource and adding a couple of @export variables. I failed at step one, used the default ‘ extend Node ’ instead of ‘ extend Resource ’, and then spent over half an hour trying to work out why it didn’t show up in the inspector. Lesson learned then? Not really, because I did the exact same thing again the next day."}, {"post_id": 3523, "ts": "2026-06-06T14:35:36Z", "hours": 7.0975, "text": "First devlog for Kernel Panic , a tower defence game built in Godot. Here is my progress so far: A menu which allows the user to select levels Multiple custom resources to allow for: Flexible enemy counts and spawn rates during waves Changing of range, damage, or attack speed of a tower Creation of ‘upgrade paths’, which store several upgrades, as well as progress along the path Inspection window that allows: Customisable targeting priority Upgrades to be applied from multiple upgrade paths Multiple towers with several unique upgrade paths each Next step - building a tutorial level that explains the key mechanics of the game."}]...
|
Title: Kernel Panic Tower Defence by @teamlewiscra Title: Kernel Panic Tower Defence by @teamlewiscrafty | Stardance
Devlogs:
First devlog for Kernel Panic , a tower defence game built in Godot. Here is my progress so far: A menu which allows the user to select levels Multiple custom resources to allow for: Flexible enemy counts and spawn rates during waves Changing of range, damage, or attack speed of a tower Creation of ‘upgrade paths’, which store several upgrades, as well as progress along the path Inspection window that allows: Customisable targeting priority Upgrades to be applied from multiple upgrade paths Multiple towers with several unique upgrade paths each Next step - building a tutorial level that explains the key mechanics of the game.
Added a resource to allow upgrades to towers. For those who haven’t used Godot, a resource is a fancy name for a data container that counts the number of other objects referencing it and automatically frees itself when it is no longer needed. According to a quick glance at the Godot docs, creating a custom Resource is as simple as creating a new script that extends Resource and adding a couple of @export variables. I failed at step one, used the default ‘ extend Node ’ instead of ‘ extend Resource ’, and then spent over half an hour trying to work out why it didn’t show up in the inspector. Lesson learned then? Not really, because I did the exact same thing again the next day.
Made a dictionary of wave information resources in the level . I exported a dictionary of custom WaveInfo resources in my level scene, and went to add a new resource to the dictionary. I typed in the key, added a new WaveInfo, and clicked Ctrl+s. My new key-value pair promptly vanished without a trace And so began the hour of removing variables, re-adding variables, trawling through the Godot forums and generally wanting to set fire to my computer to try to find the problem. The urge that was not improved by the discovery that I’d forgotten to press the button to actually add the key-value pair, and the error firmly existed between chair and keyboard.
Overhauled the menu aesthetic and added a settings menu So, I realised that I’d called this game ‘Kernel Panic’, a very techy name, and yet done little to lean into the aesthetic that evoked. I decided to fix that. Changes: Rebuilt the main menu to use a similar aesthetic to the Linux GRUB Added a settings menu: Support for 2 Vsync modes A slider to control audio A credits page This was my first time using config files, so I also got to learn something; Godot’s user:// directory is not the same as res://. A file created in the user:// directory cannot be seen in the res:// directory. From my uneducated perspective, it seemed as if this file (which I couldn’t find in the editor, since that only shows res:// ) was persisting across runtimes - something non-existent files famously don’t do. I saw someone else do a ‘quote of the update’, but I was unable to find their username to credit them, so please tell me if you know who they are: Quote of the update: “I really don’t like config files” Next plan is to overhaul the game over screen so it better fits with the aesthetic
Overhauled the game over screen’s aesthetic and added mouse support to the menu Changes : Changed the game over screen to better fit with the game’s aesthetic Changed the font to a monospaced one Additions : Added mouse support to the menu Added a spray of particles to enemies when they die Added a chromatic aberration effect to enemies when they are hit Plus quite a few bug fixes The first change in this devlog is the game over screen, which used to look like a boring window with a restart button, but now looks like a crash screen [ Image below ] that uses the actual system data to display its message, via a template string and an 8 line formatting statement. I am quite proud of this one Adding mouse support to the menu was, in a word, painful. Because I’d built my own menu system using labels instead of buttons, I had to almost completely rewrite the code to allow for conversion of a Label reference (from one of Godot’s built-in functions) to a child id (which my functions were expecting). And then I had to add some overrides to that so some labels that were not part of the menu system wouldn’t break everything. The spray of particles from enemies when they die is one of my personal favourite effects in this game, mostly because of what I’ve learnt from it. I made the particles be text based by using a subviewport, which basically is a viewport that doesn’t display anything and can then be attached to a texture to show its contents, in this case, on the particles as they are emitted. I also made the text randomise to a 2 digit hexadecimal value - that felt suitably ‘techy’ One of the smaller features in this devlog is the font change. Instead of using Godot’s default font, I found the font used in the actual GRUB and used that instead. Where did I find this font, you ask? It came directly from my PC - I copied the file straight out of /usr/share/fonts . And now we come to chromatic aberration which, as it turns out, is easy to implement for the whole screen, but slightly harder to make work for only a single sprite without discolouring the background. After messing around with shaders for a bit, I gave up and just made 2 versions of my enemy sprite (in red and blue) and just physically offset them in code. And it works. And, if I dare to blow my own trumpet for just a second, it looks great ! Quote of the update: “Please never make me look at my menu code again.”
Added a terminal window that logs game events and a tower blocker for level design Changes : Reorganised the UI to provide more space for the level and generally give everything a more unified aesthetic Additions : Added a terminal window at the bottom of the screen that logs game events Added a ‘towerblocker’ tool that the level designer can use to restrict tower placement opportunities Plus (as always) quite a few bug fixes So what is the key feature for any 90s UNIX Linux system? A terminal, of course ! And what is a UNIX-themed game without a terminal? So I added a system where game events, such as waves starting, or enemies being killed, are logged to a terminal window at the bottom of the screen. This window can be opened and closed, and has a little coloured pulse around it whenever a new log is entered. The coloured pulse is synced to the type of event (red for ‘errors’, yellow for ‘warnings’ white for everything else) as well. Each message contains some details about the event and a timestamp on the left. This feature was my first time using the richTextLabel, which allowed me to colour the text. The towerblocker is simple - it’s an invisible tile that can only be placed when the levels are being designed in order to add difficulty or avoid placing of towers offscreen I also reorganised the UI to provide more space for the level - it was all feeling a bit cramped. That reorg also helped to give everything a more unified aesthetic because I took the opportunity to apply some styles to everything, making it feel just a little more together. Quote of the update: “An empty terminal log is always nice. Unfortunately, I don’t think things will be that peaceful…” Any suggestions, please let me know in the comments.
Added a compendium Alright, this is a big one Additions : Added an indicator that shows the progress through the level Added a “Zip bomb” enemy Added cloaked enemies Added a pause menu Added a compendium Changes: Rebuilt the tutorial I added an indicator to show the player’s progress through the level. It also adds a tiny bit of story - you have to hold off malware until a firewall is constructed, and that bar shows you the progress. And I didn’t even build it from scratch - I’m just using the health bar from the enemies ! 🤫 Next - a zip bomb enemy that, as the name suggests, spawns a burst of child enemies when killed. It moves very slowly, but has high health - this makes it a great target for the SIGTERM sniper tower, which was previously useless not always the best choice. Cloaking was my way of trying to spice up the types of enemies the player would have to deal with. Some enemies in a level will now be cloaked, which means they cannot be attacked until they have their cloaking removed by the new ‘defragmenter’ tower. I wanted a way for players to easily compare the stats of the various towers and enemies, and I also needed something else to add to my pause menu. I decided to kill two pieces of malware with one antivirus quarantine, by adding a compendium. This currently has two tabs, for towers and enemies, each showing you the stats of a tower / enemy when it’s selected. Please don’t ask me how long this took. I don’t want to talk about it. I also rebuilt the tutorial because it looked bad was a pain to build and test would break if i breathed too close to it So I completely scrapped the old system and built a new one Quote of the update: “Hidden malware is a pain - in this game, and in real life” Any suggestions, please let me know in the comments below.
Adding a global upgrade system Additions : Added ‘Zero day’ enemy Added a second level with 6 waves Added a xp system, with skill points and a skill tree Changes: Expanded wave variety in other levels I added a ‘Zero day’ enemy to my game. This enemy is invulnerable for the first 5 seconds after it first spawns in. This makes it highly annoying as it has a tendency to draw and absorb all attacks from high damage towers, and pass through a large portion of your damaging towers unscathed. I also added more waves and a second level, and I’ll slowly expand the playtime of the game as I also add more features The big change here is the xp system. Currently, finishing a level rewards you with some xp, which counts towards your level. Each level up rewards you with a skill point that can be spent in the skill tree. The xp required to level up increases exponentially as the current level gets higher and higher. Unlocks in the tree save to a file and read back on load, so progress is maintained. I was reminded here of my vehement dislike of handling files. For the second time during this project, I forgot where userspace files were stored in Godot. Check this devlog for a bit more detail. Now unfortunately, the demo currently online doesn’t include these new features because I need to write a devlog every 10 hours, but the features aren’t finished. I’ll push them as soon as they are ready™ To Do list : Add file saving for XP earned Allow actually accessing the skill tree from the menu Add a “reset all to default” option in settings Quote of the update: “I. Really. Hate. Files” Any suggestions, please let me know in the comments below.
Improving the global upgrade system Additions : Support for panning around the upgrade tree More upgrades ! Added icons to upgrades Added file saving for XP earned Allow accessing the skill tree from the menu Changes: Level completion is now tracked across multiple play sessions Refined “Currently: …” messages in the upgrade tree The features from the last devlog are now also public ! 🎉 I added some more upgrades to the upgrade tree, and I also gave all of them icons. The icons are… passable. I’m not a graphical artist, and it kind of shows. The “Currently…” messages at the bottom of the side panel got an overhaul, including the addition of units, specific to the type of value being upgraded The game now saves both xp earned and levels completed to files, so they persist between play sessions. This means you don’t have to replay the whole game every time you close it - this is no longer an 80s game ! The skill tree can also be accessed from the menu, so I’m no longer just booting it straight from the Godot editor. This makes it slightly more user friendly. This is probably where I will leave this project for now. I may come back to it now and then, but I’m happy with where this game demo has ended up. I’ll ship it soon, so watch out for that ! If you want to play the game, it is live here . If you are interested in the code, it is available here . To Do list : Add a “reset all to default” option in settings Quote of the update: “Next time I do this, remind me to actually build a proper tree structure” Any suggestions, please let me know in the comments below. Thanks for reading !
Ships:
Kernel Panic Hold off malware to give your firewall time to be repaired in this tower defence game prototype built using the Godot engine ! It is inspired by 1990s Unix systems and sci-fi classics like ‘The Matrix’. Play the demo at https://gianthotdog.itch.io/Kernel-Panic The game demo includes: Multiple levels including a tutorial GRUB-style menu A settings menu (Audio settings, Credits, VSync settings) A config file system so settings persist across play sessions An upgrade tree that contains global upgrades to towers and XP gains An XP and skill point system for purchasing those upgrades 4 distinct types of towers with adjustable targeting priorities Several enemy types Custom resources to handle: Single tower upgrades Enemy counts in waves Global upgrades Controls: Enter to skip startup sequence Click to select / interact / modify values AI: AI was used to write about 50 lines of code for the two shaders, and very occasionally for solving persistent bugs. It was only used for bug fixes after I tried repeatedly and failed to find a solution myself. It was also used for some feedback on aesthetic choices. All assets were designed by hand. All AI code was reviewed before implementation. Credits: Initial prototyping asset pack by Kenney Music by iamoneabe: https://opengameart.org/content/trunkful-of-junk...
|
1793004818.046759
|
1793091218.046759
|
|
2353
|
My first slack bot! by @harshit | Stardance
|
harshit
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-03T18:32:49Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Vozo Bot, a custom Slack bot using Node.js, Slack Bolt, and Socket Mode. The bot responds to custom slash commands and is hosted on Hack Club Nest so it stays online 24/7. Features: /vozo-ping — Check bot latency /vozo-help — View available commands /vozo-joke — Get a random joke /vozo-catfact — Get a random cat fact The most challenging part was setting up the Slack app, configuring the tokens securely, connecting the bot with Socket Mode, and deploying it to Nest. I also had to learn how to use GitHub, SSH into a Linux server, and run the bot as a systemd service. I’m proud that the bot is fully deployed and continues running even when my laptop is turned off. To test the project, use any of the slash commands: /vozo-ping /vozo-help /vozo-joke /vozo-catfact Source code is available on GitHub, and the bot is hosted on Hack Club Nest.", "repo": "https://github.com/harshitsuthar839-sys/vozobot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B8NHYPG01"}]...
|
[{"post_id": 1586, "ts": "2026 [{"post_id": 1586, "ts": "2026-06-03T18:20:05Z", "hours": 0.36, "text": "Building Vozo Bot Today I created my first Slack bot called Vozo Bot using Node.js and Slack Bolt. What I worked on: Set up a Slack App and enabled Socket Mode Created custom slash commands: /vozo-ping /vozo-help /vozo-joke /vozo-catfact Tested all commands in Slack Uploaded the project to GitHub Applied for and received a Nest container Deployed the bot to Nest and configured it with systemd so it runs 24/7 Next steps: Add more features and improve responses Continue testing and polishing the bot"}]...
|
Title: My first slack bot! by @harshit | Stardance Title: My first slack bot! by @harshit | Stardance
Devlogs:
Building Vozo Bot Today I created my first Slack bot called Vozo Bot using Node.js and Slack Bolt. What I worked on: Set up a Slack App and enabled Socket Mode Created custom slash commands: /vozo-ping /vozo-help /vozo-joke /vozo-catfact Tested all commands in Slack Uploaded the project to GitHub Applied for and received a Nest container Deployed the bot to Nest and configured it with systemd so it runs 24/7 Next steps: Add more features and improve responses Continue testing and polishing the bot
Ships:
I built Vozo Bot, a custom Slack bot using Node.js, Slack Bolt, and Socket Mode. The bot responds to custom slash commands and is hosted on Hack Club Nest so it stays online 24/7. Features: /vozo-ping — Check bot latency /vozo-help — View available commands /vozo-joke — Get a random joke /vozo-catfact — Get a random cat fact The most challenging part was setting up the Slack app, configuring the tokens securely, connecting the bot with Socket Mode, and deploying it to Nest. I also had to learn how to use GitHub, SSH into a Linux server, and run the bot as a systemd service. I’m proud that the bot is fully deployed and continues running even when my laptop is turned off. To test the project, use any of the slash commands: /vozo-ping /vozo-help /vozo-joke /vozo-catfact Source code is available on GitHub, and the bot is hosted on Hack Club Nest....
|
1792878573.9582992
|
1793742573.9582992
|
|
2369
|
Snaky boy by @Lol123rl | Stardance
|
Lol123rl
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T17:04:13Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 3d google snake game. In Godot, I challenged myself to make it all in one node, it was a lot of fun playing with the Camera. I can’t what to see what people think.", "repo": "https://github.com/Lol123rl/snake_game", "demo": "https://papaya-pithivier-456916.netlify.app/"}]...
|
[{"post_id": 422, "ts": "2026- [{"post_id": 422, "ts": "2026-06-01T20:29:49Z", "hours": 0.565, "text": "Updadted the code to you play on the outside and is much smother"}, {"post_id": 363, "ts": "2026-06-01T18:12:47Z", "hours": 0.4933, "text": "a 3d google snake game"}]...
|
Title: Snaky boy by @Lol123rl | Stardance
Devlogs Title: Snaky boy by @Lol123rl | Stardance
Devlogs:
a 3d google snake game
Updadted the code to you play on the outside and is much smother
Ships:
I made a 3d google snake game. In Godot, I challenged myself to make it all in one node, it was a lot of fun playing with the Camera. I can’t what to see what people think....
|
1792983217.8133965
|
1793069617.8133965
|
|
2377
|
Space "land" by @Celine | Stardance
|
Celine
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T08:31:08Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a website where you can scan for aliens and chat with them too, it’s more of a game cause it’s completly bogus , i’m proud cause i used a lot of my creativity and i’ll be making something more real in my next project", "repo": "https://github.com/AlphaFifteen/Galaxy_Interact", "demo": "https://alphafifteen.github.io/my-website"}]...
|
[{"post_id": 9124, "ts": "2026 [{"post_id": 9124, "ts": "2026-06-15T08:27:23Z", "hours": 0.9522, "text": "I added a few responses in the intergalactic chat page When i clicked send on the Neptune planet message it wasn’t sending , i dicovered that it was because i hadn’t typed in the name correctly🤦♂️"}, {"post_id": 8697, "ts": "2026-06-14T13:28:41Z", "hours": 0.3778, "text": "Its a website made from html, css and javascript that has a “Alien radar scan “site, an “intergalactic chat site” and an Alien analyzer site where you decribe what you saw and it gives you the probability of it being an alien encounter"}]...
|
Title: Space "land" by @Celine | Stardance Title: Space "land" by @Celine | Stardance
Devlogs:
Its a website made from html, css and javascript that has a “Alien radar scan “site, an “intergalactic chat site” and an Alien analyzer site where you decribe what you saw and it gives you the probability of it being an alien encounter
I added a few responses in the intergalactic chat page When i clicked send on the Neptune planet message it wasn’t sending , i dicovered that it was because i hadn’t typed in the name correctly🤦♂️
Ships:
I made a website where you can scan for aliens and chat with them too, it’s more of a game cause it’s completly bogus , i’m proud cause i used a lot of my creativity and i’ll be making something more real in my next project...
|
1792993890.0700037
|
1793080290.0700037
|
|
2398
|
Dots by @Ivan | Stardance
|
Ivan
|
1
|
30.46
|
127
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T18:24:51Z", "hours": 28.0, "multiplier": 4.62, "payout": 127, "blessing": "neutral", "text": "I coded Dots, a paper-and-pen game that I loved playing as a kid! The game features several game modes including PvP and PvE. The game engine uses algorithms such as Minimax and Alpha-beta pruning that I learned from Sebastian Lague’s series on Chess programming.", "repo": "https://github.com/IvanMishin1/dots-pygame", "demo": "https://ivannn06.itch.io/dots"}]...
|
[{"post_id": 28326, "ts": "202 [{"post_id": 28326, "ts": "2026-07-14T14:40:14Z", "hours": 2.4639, "text": "I’ve been wanting to learn how to use Blender for quite a while which is why I decided to make an icon for Dots using this software. I found it quite complicated a first but quickly learnt the basics of how it works. Choosing the right shades of red and blue took quite a lot of time."}, {"post_id": 23001, "ts": "2026-07-05T18:16:59Z", "hours": 2.6153, "text": "Worked on the readme file and polished the game for its first ship!"}, {"post_id": 22819, "ts": "2026-07-05T12:35:52Z", "hours": 1.9203, "text": "Added a few menus to make launching the game more straightforward. Also included a short guide."}, {"post_id": 22736, "ts": "2026-07-05T09:57:45Z", "hours": 8.3325, "text": "I got inspired by Sebastian Lague’s series on Chess engines so I decided to create my own engine but for Dots. I implemented the Minimax algorithm with Alpha-beta pruning which is often used in Chess bots. It is worth mentioning that despite it’s simple nature, the computational complexity of a dots engine is WAY higher than that of a chess engine: there are about 10^40 possible positions in chess compared to 10^120 in Dots. Furthermore, there is very little documentation on Dots engines, except for one article from 2002. The image attached is a game between a depth 2 and a depth 4 engine."}, {"post_id": 5811, "ts": "2026-06-09T18:58:47Z", "hours": 2.1308, "text": "Implemented the ability to have more than 2 players! This is not part of the classical game rules but I found this variation to be very fun to play. Currently it supports up to 6 players. Implementing this functionality required me to change the way players are handled which made the code clearer."}, {"post_id": 3581, "ts": "2026-06-06T16:10:26Z", "hours": 2.8408, "text": "Fully separated the game logic from the Pygame graphical interface. I am now considering making a web version of the game using Django"}, {"post_id": 2333, "ts": "2026-06-04T19:27:44Z", "hours": 1.0664, "text": "Lost against my little sister TWICE"}, {"post_id": 2185, "ts": "2026-06-04T15:26:58Z", "hours": 1.8442, "text": "Significantly increased the precision of the dot-capturing algorithm and added a scoreboard."}, {"post_id": 1478, "ts": "2026-06-03T15:00:56Z", "hours": 5.3764, "text": "Implemented the dot-capturing algorithm. A dot is captured when it is completely surrounded by opponents’ dots. This turned out to be much more complicated than expected."}, {"post_id": 367, "ts": "2026-06-01T18:20:46Z", "hours": 1.4261, "text": "I decided to start off Stardance by coding a pen-and-paper strategy game that I loved playing as a child: Dots (aka Kropki or Tochki). First, I created a grid layout and implemented the ability to place dots."}]...
|
Title: Dots by @Ivan | Stardance
Devlogs:
I decid Title: Dots by @Ivan | Stardance
Devlogs:
I decided to start off Stardance by coding a pen-and-paper strategy game that I loved playing as a child: Dots (aka Kropki or Tochki). First, I created a grid layout and implemented the ability to place dots.
Implemented the dot-capturing algorithm. A dot is captured when it is completely surrounded by opponents’ dots. This turned out to be much more complicated than expected.
Significantly increased the precision of the dot-capturing algorithm and added a scoreboard.
Lost against my little sister TWICE
Fully separated the game logic from the Pygame graphical interface. I am now considering making a web version of the game using Django
Implemented the ability to have more than 2 players! This is not part of the classical game rules but I found this variation to be very fun to play. Currently it supports up to 6 players. Implementing this functionality required me to change the way players are handled which made the code clearer.
I got inspired by Sebastian Lague’s series on Chess engines so I decided to create my own engine but for Dots. I implemented the Minimax algorithm with Alpha-beta pruning which is often used in Chess bots. It is worth mentioning that despite it’s simple nature, the computational complexity of a dots engine is WAY higher than that of a chess engine: there are about 10^40 possible positions in chess compared to 10^120 in Dots. Furthermore, there is very little documentation on Dots engines, except for one article from 2002. The image attached is a game between a depth 2 and a depth 4 engine.
Added a few menus to make launching the game more straightforward. Also included a short guide.
Worked on the readme file and polished the game for its first ship!
I’ve been wanting to learn how to use Blender for quite a while which is why I decided to make an icon for Dots using this software. I found it quite complicated a first but quickly learnt the basics of how it works. Choosing the right shades of red and blue took quite a lot of time.
Ships:
I coded Dots, a paper-and-pen game that I loved playing as a kid! The game features several game modes including PvP and PvE. The game engine uses algorithms such as Minimax and Alpha-beta pruning that I learned from Sebastian Lague’s series on Chess programming....
|
1792983321.350108
|
1793069721.350108
|
|
2408
|
PulseRay by @urged-st | Stardance
|
urged-st
|
1
|
12.0
|
181
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-12T12:55:44Z", "hours": 12.0, "multiplier": 15.77, "payout": 181, "blessing": "neutral", "text": "I have developed a functioning pulsar simulator, where you can change the width and speed of the beams and explore the effect it has on the detected signal. It aims to simulate how we detect pulsars from Earth using radio telescopes, where they would be completely invisible otherwise. You can also drag Earth around as changing distance also affects the strength of the signal. It calculates the pulse rate, frequency and other signal-related values in real time. It was especially difficult to make the signal generation as accurate as possible, as I was not using any physics-specific libraries (as I would do if I made this in Python), however since I wanted to deploy this to the web I used HTML, CSS, and Javascript (p5.js). By far the part which was the most time consuming and difficult was the landing/help page which appears when you load the page. The animations, design and content took hours to write, and the cards themselves went through many iterations, from looking like a powerpoint presentation to a professional app! Since this is my first Javascript project, I’m extremely happy with the way it turned out, and will continue to develop the majority of my stardance projects with p5.js, most probably. One thing that I wish I could figure out was how to make it touch screen compatible, as you won’t be able to drag around the canvas with a touchscreen. Hopefully, I can implement this in the future, but at this time I cannot figure out how to add it. Therefore users of this app, for the ideal experience should access it on a laptop/pc. Later, this app will (hopefully) be collated with 3 other simulations onto one website, which I will also develop for Stardance.", "repo": "https://github.com/urged-st/PulseRay", "demo": "https://pulseray.vercel.app/"}]...
|
[{"post_id": 6850, "ts": "2026 [{"post_id": 6850, "ts": "2026-06-11T14:35:16Z", "hours": 1.345, "text": "Nothing much, added my github link as a button, attempted to add touchscreen controls for the guys on ipads but unfortunately failed miserably… it kept messing with the actual mouse moving code and I just couldn’t fix it. Might work on it sometime if I get bored of working on G-Lens lol (my other project)"}, {"post_id": 4772, "ts": "2026-06-08T08:13:27Z", "hours": 0.8692, "text": "It is done!! I have deployed this project at https://pulsarsimulator.vercel.app/ , check it out! Final Steps: polish information on the article and other cards gather feedback from users and work on that before I ship hit 10 hours lol I am still on 9 make the fade in animation for the cards occur on startup too, currently it only occurs when you click the button. MAYBE i might make custom sliders but i think this is fine This is one of 4 simulators, I will research for the second one today, and if possible complete a demo"}, {"post_id": 4136, "ts": "2026-06-07T10:32:36Z", "hours": 2.8914, "text": "Pulsar simulator MASSIVE UI update… So i got really tired of the default p5.js fonts so I decided to change things up, and in the process I ended up wanting to redesign the info box i had made initially (you can see the previous designs on my insta). Before it was static and looked like it had come out of a powerpoint presentation so I learnt how to add fonts and found space mono, which i really liked. I also had to redesign the previous cards i had made because they were again static and boring… I kept running into issues and limitations with the p5.js canvas as before i was just using that for the darkened overlay and cards, so i went ahead and redid the entire overlay as pure html and css because i had more experience in that and it was easier to bend to my will. So 3hrs logged brings Pulsar Sim this new revamped landing/info page! I also changed some of the fonts on the project itself, I dont know if i you can add multiple pics onto a devlog yet but i’ll send a screenshot in the next one. Next step for me is to make the middle card expandable, and include more detailed explanations on neutron stars and pulsars, as the information i provided initially is really basic and surface-level. I’d say this was a really successful UI overhaul - any feedback you guys have would be really valuable, i’ll try post more to showcase everything, and if you want to see videos of the project itself they are on my instagram."}, {"post_id": 2423, "ts": "2026-06-04T21:57:57Z", "hours": 0.6917, "text": "UI changes changed up that boring graph, I added gridlines and a scale, changed the waveform colour to green to make it easier to see. New features pulse detection now factors in distance (totally didn’t forget to add this before lol) so pulses from further away won’t be detected as they are too weak (as in real life!) Next Ideas I want to add more information, probably a toggleable menu in the corner with some basic information about pulsars maybe a catalogue of real pulsars? a pulse rate tooltip, I am definitely adding this one in the next session its too essential to leave out probably gonna switch some of the UI up, the logic is working fine at the moment I’ve spent a lot of time on it so might focus on aesthetics for an hour or so Note about the screenshot: You can see that the beam is covering the observer line of Earth, and there is some signal being produced, however it’s below the threshold of 0.2, hence why it displays “NO SIGNAL”!"}, {"post_id": 2233, "ts": "2026-06-04T16:52:07Z", "hours": 0.8417, "text": "UI Changes added distance counter added pulse counter New Features tried to implement a pulse counter (it works :D), counts pulse based on whether or not last pulse was valid I also added a “reset view” button, as even as a developer it was annoying having to re-run the program to test different distances and angles, so reset view brings Earth back to its initial position (so you can have it come back after dragging it miles away lol) Fixes I had to fix this one as it was just qol, but after selecting any preset, then changing the sliders, the selected preset didn’t show “custom” it showed whatever one was picked last, which could be misleading for new users. alsooo i have an instagram now, check it out for video logs (and drop a follow if you’d like to :) https://www.instagram.com/urged.st/"}, {"post_id": 1742, "ts": "2026-06-03T22:33:49Z", "hours": 1.095, "text": "Added a distance factor, and different presets for the pulsar! Signals are now weaker the further away you place Earth, and you can select preset pulsar types to investigate."}, {"post_id": 1401, "ts": "2026-06-03T12:34:49Z", "hours": 0.7019, "text": "Not much done, just fixed a bug where the using the slider would drag the background along with it 😭"}, {"post_id": 817, "ts": "2026-06-02T14:28:42Z", "hours": 1.6878, "text": "Learnt how to use function mousePressed and Relesased, so i’ve made the background pannable, and also added zoom. You can now drag Earth around too!"}, {"post_id": 453, "ts": "2026-06-01T21:38:55Z", "hours": 0.5669, "text": "Finished the base template I added the waveform viewer and signal status - this took most of the time, the sliders weren’t too hard to figure out. At least now it’s working fully. Next steps? I am going to try and have Earth be movable, so users can see the effect of observer position, might also make it have a scrollable and zoomable background maybe, make it feel more like a space engine."}, {"post_id": 429, "ts": "2026-06-01T20:41:06Z", "hours": 1.0692, "text": "Finished base model of the pulsar, it spins! First time using canvas so it took longer than expected."}]...
|
Title: PulseRay by @urged-st | Stardance
Devlogs: Title: PulseRay by @urged-st | Stardance
Devlogs:
Finished base model of the pulsar, it spins! First time using canvas so it took longer than expected.
Finished the base template I added the waveform viewer and signal status - this took most of the time, the sliders weren’t too hard to figure out. At least now it’s working fully. Next steps? I am going to try and have Earth be movable, so users can see the effect of observer position, might also make it have a scrollable and zoomable background maybe, make it feel more like a space engine.
Learnt how to use function mousePressed and Relesased, so i’ve made the background pannable, and also added zoom. You can now drag Earth around too!
Not much done, just fixed a bug where the using the slider would drag the background along with it 😭
Added a distance factor, and different presets for the pulsar! Signals are now weaker the further away you place Earth, and you can select preset pulsar types to investigate.
UI Changes added distance counter added pulse counter New Features tried to implement a pulse counter (it works :D), counts pulse based on whether or not last pulse was valid I also added a “reset view” button, as even as a developer it was annoying having to re-run the program to test different distances and angles, so reset view brings Earth back to its initial position (so you can have it come back after dragging it miles away lol) Fixes I had to fix this one as it was just qol, but after selecting any preset, then changing the sliders, the selected preset didn’t show “custom” it showed whatever one was picked last, which could be misleading for new users. alsooo i have an instagram now, check it out for video logs (and drop a follow if you’d like to :) https://www.instagram.com/urged.st/
UI changes changed up that boring graph, I added gridlines and a scale, changed the waveform colour to green to make it easier to see. New features pulse detection now factors in distance (totally didn’t forget to add this before lol) so pulses from further away won’t be detected as they are too weak (as in real life!) Next Ideas I want to add more information, probably a toggleable menu in the corner with some basic information about pulsars maybe a catalogue of real pulsars? a pulse rate tooltip, I am definitely adding this one in the next session its too essential to leave out probably gonna switch some of the UI up, the logic is working fine at the moment I’ve spent a lot of time on it so might focus on aesthetics for an hour or so Note about the screenshot: You can see that the beam is covering the observer line of Earth, and there is some signal being produced, however it’s below the threshold of 0.2, hence why it displays “NO SIGNAL”!
Pulsar simulator MASSIVE UI update… So i got really tired of the default p5.js fonts so I decided to change things up, and in the process I ended up wanting to redesign the info box i had made initially (you can see the previous designs on my insta). Before it was static and looked like it had come out of a powerpoint presentation so I learnt how to add fonts and found space mono, which i really liked. I also had to redesign the previous cards i had made because they were again static and boring… I kept running into issues and limitations with the p5.js canvas as before i was just using that for the darkened overlay and cards, so i went ahead and redid the entire overlay as pure html and css because i had more experience in that and it was easier to bend to my will. So 3hrs logged brings Pulsar Sim this new revamped landing/info page! I also changed some of the fonts on the project itself, I dont know if i you can add multiple pics onto a devlog yet but i’ll send a screenshot in the next one. Next step for me is to make the middle card expandable, and include more detailed explanations on neutron stars and pulsars, as the information i provided initially is really basic and surface-level. I’d say this was a really successful UI overhaul - any feedback you guys have would be really valuable, i’ll try post more to showcase everything, and if you want to see videos of the project itself they are on my instagram.
It is done!! I have deployed this project at https://pulsarsimulator.vercel.app/ , check it out! Final Steps: polish information on the article and other cards gather feedback from users and work on that before I ship hit 10 hours lol I am still on 9 make the fade in animation for the cards occur on startup too, currently it only occurs when you click the button. MAYBE i might make custom sliders but i think this is fine This is one of 4 simulators, I will research for the second one today, and if possible complete a demo
Nothing much, added my github link as a button, attempted to add touchscreen controls for the guys on ipads but unfortunately failed miserably… it kept messing with the actual mouse moving code and I just couldn’t fix it. Might work on it sometime if I get bored of working on G-Lens lol (my other project)
Ships:
I have developed a functioning pulsar simulator, where you can change the width and speed of the beams and explore the effect it has on the detected signal. It aims to simulate how we detect pulsars from Earth using radio telescopes, where they would be completely invisible otherwise. You can also drag Earth around as changing distance also affects the strength of the signal. It calculates the pulse rate, frequency and other signal-related values in real time. It was especially difficult to make the signal generation as accurate as possible, as I was not using any physics-specific libraries (as I would do if I made this in Python), however since I wanted to deploy this to the web I used HTML, CSS, and Javascript (p5.js). By far the part which was the most time consuming and difficult was the landing/help page which appears when you load the page. The animations, design and content took hours to write, and the cards themselves went through many iterations, from looking like a powerpoint presentation to a professional app! Since this is my first Javascript project, I’m extremely happy with the way it turned out, and will continue to develop the majority of my stardance projects with p5.js, most probably. One thing that I wish I could figure out was how to make it touch screen compatible, as you won’t be able to drag around the canvas with a touchscreen. Hopefully, I can implement this in the future, but at this time I cannot figure out how to add it. Therefore users of this app, for the ideal experience should access it on a laptop/pc. Later, this app will (hopefully) be collated with 3 other simulations onto one website, which I will also develop for Stardance....
|
1792878748.3963103
|
1793742748.3963103
|
|
2409
|
MemoryMap by @LEOM | Stardance
|
LEOM
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T23:24:36Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello! This is MemoryMap - this project aims to help you find your lost items by scanning you room with a couple of pictures and asking later the object detector if you forget where you placed them! With just some simple clicks and pictures, this assistant will help you find all of your lost all objects all around the house in SECONDS! Thank you for stopping by!", "repo": "https://github.com/Planetech0071/MemoryMap", "demo": "https://memorymap-demo-brief.vercel.app/"}]...
|
[{"post_id": 14737, "ts": "202 [{"post_id": 14737, "ts": "2026-06-23T23:02:47Z", "hours": 1.0569, "text": "It is OVER! Shipping! What a project man- I am sure I’ll actually use this. Maybe my second ship could be an integration with ALEXA/Google Home to have a physical assistant? I’d keep an eye out for that, but for now, this is my first ship!"}, {"post_id": 14438, "ts": "2026-06-23T15:52:34Z", "hours": 1.7575, "text": "Hey again :D Quick update: MemoryMap is now basically done. All core systems are in place and working together as expected. The full pipeline from camera input → detection → merging → storage → query is stable. I also went through the remaining edge cases that were causing inconsistent object histories, especially around duplicate merges and stale updates. Most of the time this session was spent on tightening things up instead of adding new features. That included cleaning logs, fixing a few timing issues in the frame handler, and making sure the memory store stays consistent under continuous input. The system now holds up under longer runs without breaking state or losing tracked objects. The query layer is also in a usable state. You can ask questions like where an object was last seen and get a reliable answer based on stored history, not just the latest frame. That part took a bit of tuning to make responses consistent. Right now I’m not planning any more big changes. The project is in final testing mode. I’m running longer sessions across different rooms to check stability, accuracy, and performance under real use. Next step is just validation and small fixes if anything shows up during testing. Feels good to see it reach this stage."}, {"post_id": 4993, "ts": "2026-06-08T17:15:07Z", "hours": 1.4667, "text": "Hey again :D This one was less about fixing bugs and more about actually building out the pipeline. MemoryMap is now split into separate modules instead of everything being stuffed together. The project currently consists of: frame_reader.py: receives and processes incoming video frames detector.py: handles object detection handler.py: coordinates detections and memory updates store.py: persistent memory storage object_record.py: object history tracking merge.py: combines duplicate observations main.py: starts and manages everything The biggest addition this session was the detection pipeline itself. Previously, I had the memory system working, but there wasn’t really a complete path from camera feed → object detection → stored memory. That’s now connected together. Frames arrive, detections are produced, records are updated, and the information is written into MemoryStore automatically. I also started work on observation merging. One issue with object tracking is that the same object can appear multiple times across different frames, creating fragmented records. The merge layer now attempts to consolidate those observations into a single memory entry, making the stored data much cleaner and more useful when querying later. Another thing I spent time on was restructuring the codebase. It doesn’t sound exciting, but getting clear separation between frame capture, detection, storage, and record management will make future work much easier. Debugging individual components is already significantly simpler. The project is starting to look less like a prototype and more like an actual system! Next steps are improving location accuracy, expanding object history tracking, and building the query layer so MemoryMap can start answering natural questions such as: “Where did I leave my headphones?” or “When was the last time the wallet was seen?” Still a lot to build, but the foundations are finally coming together. More soon. 🚀"}, {"post_id": 3550, "ts": "2026-06-06T15:20:35Z", "hours": 1.5297, "text": "Hello :D Firstly, I did say I wanted to update both object_record.py and get everything running. Done and done. In object_record.py, the function “update()” would overwrite the history before saving it, thus creating just one history per object, which isn’t much when we need to know when and how objects have been moved. This is now fixed, while main.py was facing a circular importing error, which has now been sorted out too. And here comes the fun part: Phone camera integration! Originally, we were going to use a webcam for recording purposes. It will work fine on a desk but what about the other areas of the house? Well, there is always the phone! Simply go from room to room pointing it at the surroundings for 10 seconds. Now the server has an additional WebSocket receiver listening at port 8001. Start by entering on phone, use the URL displayed to connect to the web server with your phone, and just the web browser, no special app required; use Safari or Chrome. It starts sending video feeds through Wi-Fi straight from your phone’s rear camera. Added a location label field so that each location gets labeled as you scan it. No longer will the results say “somewhere left of centre frame,” instead they’ll now read “kitchen”. Switched from using YOLOv8 to YOLOv10. Main improvement with v10? None other than the complete removal of non-maximum suppression post-processing. No duplicates, even better for a system like ours which relies heavily on memory. Good trade-off. Completed 28 tests, all successful. Memory layer is ready to go. The thing powers up, retains data, you walk around your house, and you get answers. Basic functionality is there. Now, everything else is about polish. More details soon."}, {"post_id": 477, "ts": "2026-06-01T22:46:20Z", "hours": 2.8167, "text": "Hey, welcome to the first devlog for MemoryMap! I’ve been wanting to build this for a while and I finally started with this perfect opportunity! Fair warning: this is very much a “day one” post, things are rough, bugs, and not everything compiles :/ So what is MemoryMap? You know that feeling when you’re late and you can’t find your keys or your wallet and you wish your house could just tell you where they are? That’s the whole idea. Point a camera at your space (either through “memory” or persistent view), let the system watch continuously and build a memory of where objects are, then ask it questions, like “where are my headphones?” and get an instant answer based on the last time they were actually seen. No more searching the same three spots over and over. The core of the project: store.py, the MemoryStore class. This is the memory layer everything else will depend on. It handles three things. Ingestion: every camera frame hands in a list of detections, and the store either updates an existing record or creates a new one, all thread-safe. Staleness: objects don’t vanish when they leave frame, they get marked stale after a configurable number of hours, so last-known location is always preserved. Persistence: a background thread periodically flushes everything to disk as JSON, atomically obviously, so memory survives restarts. The other two files (object_record.py and main.py) are started but still buggy. They’ll get their moment in a future devlog. Next up: fix object_record.py and get the whole thing to actually boot :D"}]...
|
Title: MemoryMap by @LEOM | Stardance
Devlogs:
He Title: MemoryMap by @LEOM | Stardance
Devlogs:
Hey, welcome to the first devlog for MemoryMap! I’ve been wanting to build this for a while and I finally started with this perfect opportunity! Fair warning: this is very much a “day one” post, things are rough, bugs, and not everything compiles :/ So what is MemoryMap? You know that feeling when you’re late and you can’t find your keys or your wallet and you wish your house could just tell you where they are? That’s the whole idea. Point a camera at your space (either through “memory” or persistent view), let the system watch continuously and build a memory of where objects are, then ask it questions, like “where are my headphones?” and get an instant answer based on the last time they were actually seen. No more searching the same three spots over and over. The core of the project: store.py, the MemoryStore class. This is the memory layer everything else will depend on. It handles three things. Ingestion: every camera frame hands in a list of detections, and the store either updates an existing record or creates a new one, all thread-safe. Staleness: objects don’t vanish when they leave frame, they get marked stale after a configurable number of hours, so last-known location is always preserved. Persistence: a background thread periodically flushes everything to disk as JSON, atomically obviously, so memory survives restarts. The other two files (object_record.py and main.py) are started but still buggy. They’ll get their moment in a future devlog. Next up: fix object_record.py and get the whole thing to actually boot :D
Hello :D Firstly, I did say I wanted to update both object_record.py and get everything running. Done and done. In object_record.py, the function “update()” would overwrite the history before saving it, thus creating just one history per object, which isn’t much when we need to know when and how objects have been moved. This is now fixed, while main.py was facing a circular importing error, which has now been sorted out too. And here comes the fun part: Phone camera integration! Originally, we were going to use a webcam for recording purposes. It will work fine on a desk but what about the other areas of the house? Well, there is always the phone! Simply go from room to room pointing it at the surroundings for 10 seconds. Now the server has an additional WebSocket receiver listening at port 8001. Start by entering on phone, use the URL displayed to connect to the web server with your phone, and just the web browser, no special app required; use Safari or Chrome. It starts sending video feeds through Wi-Fi straight from your phone’s rear camera. Added a location label field so that each location gets labeled as you scan it. No longer will the results say “somewhere left of centre frame,” instead they’ll now read “kitchen”. Switched from using YOLOv8 to YOLOv10. Main improvement with v10? None other than the complete removal of non-maximum suppression post-processing. No duplicates, even better for a system like ours which relies heavily on memory. Good trade-off. Completed 28 tests, all successful. Memory layer is ready to go. The thing powers up, retains data, you walk around your house, and you get answers. Basic functionality is there. Now, everything else is about polish. More details soon.
Hey again :D This one was less about fixing bugs and more about actually building out the pipeline. MemoryMap is now split into separate modules instead of everything being stuffed together. The project currently consists of: frame_reader.py: receives and processes incoming video frames detector.py: handles object detection handler.py: coordinates detections and memory updates store.py: persistent memory storage object_record.py: object history tracking merge.py: combines duplicate observations main.py: starts and manages everything The biggest addition this session was the detection pipeline itself. Previously, I had the memory system working, but there wasn’t really a complete path from camera feed → object detection → stored memory. That’s now connected together. Frames arrive, detections are produced, records are updated, and the information is written into MemoryStore automatically. I also started work on observation merging. One issue with object tracking is that the same object can appear multiple times across different frames, creating fragmented records. The merge layer now attempts to consolidate those observations into a single memory entry, making the stored data much cleaner and more useful when querying later. Another thing I spent time on was restructuring the codebase. It doesn’t sound exciting, but getting clear separation between frame capture, detection, storage, and record management will make future work much easier. Debugging individual components is already significantly simpler. The project is starting to look less like a prototype and more like an actual system! Next steps are improving location accuracy, expanding object history tracking, and building the query layer so MemoryMap can start answering natural questions such as: “Where did I leave my headphones?” or “When was the last time the wallet was seen?” Still a lot to build, but the foundations are finally coming together. More soon. 🚀
Hey again :D Quick update: MemoryMap is now basically done. All core systems are in place and working together as expected. The full pipeline from camera input → detection → merging → storage → query is stable. I also went through the remaining edge cases that were causing inconsistent object histories, especially around duplicate merges and stale updates. Most of the time this session was spent on tightening things up instead of adding new features. That included cleaning logs, fixing a few timing issues in the frame handler, and making sure the memory store stays consistent under continuous input. The system now holds up under longer runs without breaking state or losing tracked objects. The query layer is also in a usable state. You can ask questions like where an object was last seen and get a reliable answer based on stored history, not just the latest frame. That part took a bit of tuning to make responses consistent. Right now I’m not planning any more big changes. The project is in final testing mode. I’m running longer sessions across different rooms to check stability, accuracy, and performance under real use. Next step is just validation and small fixes if anything shows up during testing. Feels good to see it reach this stage.
It is OVER! Shipping! What a project man- I am sure I’ll actually use this. Maybe my second ship could be an integration with ALEXA/Google Home to have a physical assistant? I’d keep an eye out for that, but for now, this is my first ship!
Ships:
Hello! This is MemoryMap - this project aims to help you find your lost items by scanning you room with a couple of pictures and asking later the object detector if you forget where you placed them! With just some simple clicks and pictures, this assistant will help you find all of your lost all objects all around the house in SECONDS! Thank you for stopping by!...
|
1792972173.0393956
|
1793058573.0393956
|
|
2414
|
Reel Github Grabber by @jupeme6 | Stardance
|
jupeme6
|
1
|
10.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-27T01:56:24Z", "hours": 10.0, "multiplier": 1.36, "payout": 14, "blessing": "neutral", "text": "What did you make? A local tool called ReelTools to save reel links (Instagram, TikTok, etc.) that mention GitHub repos or useful websites. Each entry stores the tool’s name, the reel URL, the repo URL, a short description, tags, and a transcript. Everything lives in the browser’s localStorage, so it works fully offline with no account and no backend. There’s also an export button that dumps the whole list into a .md file, so you can use it as a “tool memory” to feed other AIs later. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax and reset to requestFullscreen . The second one made the whole page go fullscreen black when I hit submit, and it took me embarrassingly long to spot. Later, when I added the edit button, editing the first entry kept deleting the last one. Turned out I was loading the data twice from localStorage, which created different object instances, so indexOf returned -1 and splice ate the last entry. Classic JS reference trap. What are you proud of? The export to .md actually works and produces a clean file you can use right away. Also the search bar — it filters in real time by name, tag, or description, and I had to figure out how to keep the original index working when the list is filtered, which felt like a real problem to solve rather than just following a tutorial. What should people know so they can test your project? It runs entirely in the browser, no install needed. Open the demo URL, paste a reel link (or any URL), add a name and whatever else you want, hit Add. Try the search bar and the edit button on each entry. Hit “Export to .md” to download the whole list as a markdown file. Everything stays in your browser, nothing is sent anywhere. Refresh the page and your entries are still there. Live demo: https://notjuangamer10.github.io/reeltools/ Source: https://github.com/notjuangamer10/reeltools", "repo": "https://github.com/NOTJuangamer10/reeltools", "demo": "https://notjuangamer10.github.io/reeltools/"}]...
|
[{"post_id": 27109, "ts": "202 [{"post_id": 27109, "ts": "2026-07-12T11:36:39Z", "hours": 2.6386, "text": "Small update on ReelTools. Added a search bar that filters by name, tag or description in real time, and an edit button on each entry (before you could only delete). Edit is a bit hacky: it loads the entry into the form and deletes the old one, then when you hit Add it creates a new entry with the changes. Felt cleaner than a full edit mode. Hit a sneaky bug: editing the first entry kept deleting the last one. Took me a while to figure out but turns out I was loading the data twice from localStorage, which created different object instances, so indexOf returned -1 and splice ate the last entry. Classic JS reference trap. Search was tricky too because of the same issue, keeping the original index when the list is filtered. Not touching the UI for now, ReelTools is done. Moving on to the next project."}, {"post_id": 26511, "ts": "2026-07-11T11:07:59Z", "hours": 5.5783, "text": "Second version is up. Now each entry saves a name, the reel URL, the repo URL, a short description, tags, and a transcript. I also added an export button that dumps everything into a .md file because the idea is to use it as a “tool memory” to feed other AIs later. The transcript sits inside a dropdown so it doesn’t clutter the list. Hit two stupid bugs while building it. My editor’s autocomplete kept rewriting value to ariaValueMax and reset to requestFullscreen . The second one made the whole page go fullscreen black when I hit submit. Took me embarrassingly long to spot. The UI still screams AI though. Same orange theme, same emojis everywhere. I know I said I’d remove the emojis for this version and… I didn’t. For v3 I’m committing to it: no emojis, more sober palette, cleaner layout. If anyone has actual UI design tips for someone who’s bad at CSS, please share."}, {"post_id": 18665, "ts": "2026-06-29T21:05:51Z", "hours": 1.7578, "text": "I’ve finished the first version; for now it only saves the link and little else, but bigger things are coming. Also, the UI screams AI, and I don’t like that design. Does anyone have any videos or tips on how to design UIs? Gemini has been showing me and has added his own “artistic touches.” I don’t like the design; I think it’s ugly. I’ll probably remove the emojis for the second version."}]...
|
Title: Reel Github Grabber by @jupeme6 | Stardance Title: Reel Github Grabber by @jupeme6 | Stardance
Devlogs:
I’ve finished the first version; for now it only saves the link and little else, but bigger things are coming. Also, the UI screams AI, and I don’t like that design. Does anyone have any videos or tips on how to design UIs? Gemini has been showing me and has added his own “artistic touches.” I don’t like the design; I think it’s ugly. I’ll probably remove the emojis for the second version.
Second version is up. Now each entry saves a name, the reel URL, the repo URL, a short description, tags, and a transcript. I also added an export button that dumps everything into a .md file because the idea is to use it as a “tool memory” to feed other AIs later. The transcript sits inside a dropdown so it doesn’t clutter the list. Hit two stupid bugs while building it. My editor’s autocomplete kept rewriting value to ariaValueMax and reset to requestFullscreen . The second one made the whole page go fullscreen black when I hit submit. Took me embarrassingly long to spot. The UI still screams AI though. Same orange theme, same emojis everywhere. I know I said I’d remove the emojis for this version and… I didn’t. For v3 I’m committing to it: no emojis, more sober palette, cleaner layout. If anyone has actual UI design tips for someone who’s bad at CSS, please share.
Small update on ReelTools. Added a search bar that filters by name, tag or description in real time, and an edit button on each entry (before you could only delete). Edit is a bit hacky: it loads the entry into the form and deletes the old one, then when you hit Add it creates a new entry with the changes. Felt cleaner than a full edit mode. Hit a sneaky bug: editing the first entry kept deleting the last one. Took me a while to figure out but turns out I was loading the data twice from localStorage, which created different object instances, so indexOf returned -1 and splice ate the last entry. Classic JS reference trap. Search was tricky too because of the same issue, keeping the original index when the list is filtered. Not touching the UI for now, ReelTools is done. Moving on to the next project.
Ships:
What did you make? A local tool called ReelTools to save reel links (Instagram, TikTok, etc.) that mention GitHub repos or useful websites. Each entry stores the tool’s name, the reel URL, the repo URL, a short description, tags, and a transcript. Everything lives in the browser’s localStorage, so it works fully offline with no account and no backend. There’s also an export button that dumps the whole list into a .md file, so you can use it as a “tool memory” to feed other AIs later. What was challenging? Two bugs almost broke me. My editor’s autocomplete kept rewriting value to ariaValueMax and reset to requestFullscreen . The second one made the whole page go fullscreen black when I hit submit, and it took me embarrassingly long to spot. Later, when I added the edit button, editing the first entry kept deleting the last one. Turned out I was loading the data twice from localStorage, which created different object instances, so indexOf returned -1 and splice ate the last entry. Classic JS reference trap. What are you proud of? The export to .md actually works and produces a clean file you can use right away. Also the search bar — it filters in real time by name, tag, or description, and I had to figure out how to keep the original index working when the list is filtered, which felt like a real problem to solve rather than just following a tutorial. What should people know so they can test your project? It runs entirely in the browser, no install needed. Open the demo URL, paste a reel link (or any URL), add a name and whatever else you want, hit Add. Try the search bar and the edit button on each entry. Hit “Export to .md” to download the whole list as a markdown file. Everything stays in your browser, nothing is sent anywhere. Refresh the page and your entries are still there. Live demo: https://notjuangamer10.github.io/reeltools/ Source: https://github.com/notjuangamer10/reeltools...
|
1792878479.4986956
|
1793742479.4986956
|
|
2430
|
Clock Web App by @akshayK | Stardance
|
akshayK
|
1
|
10.0
|
50
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T02:52:47Z", "hours": 10.0, "multiplier": 4.97, "payout": 50, "blessing": "neutral", "text": "I made a clock web app using HTML, JS and CSS. It has a real-time clock, stopwatch and timer. Overall, I think the project was pretty cool and turned out well, but I did face a lot of challenges along the way. For example, I was really struggling with the stopwatch part, because no matter what I changed in the code, the time would either not change, the browser would freeze, or the time would have some extra zeros. I ended up learning CSS for this project, and I found it really fun to implement the color theme and the animations to the buttons. This project has taught me a lot about Javascript time control and CSS. Hope you like my project! -Akshay K", "repo": "https://github.com/AkshayK-960/Clock-Web-App/", "demo": "https://akshayk-960.github.io/Clock-Web-App/"}]...
|
[{"post_id": 4680, "ts": "2026 [{"post_id": 4680, "ts": "2026-06-08T02:37:35Z", "hours": 7.6933, "text": "Devlog #2 This is my second devlog for this project; I now finished implementing the code for the Timer portion and fixed some logic errors which were stopping my stopwatch from running correctly. I also learned CSS to add to the project to make it look polished. (I decided to give it a dark purple theme like dracula) Overall, this was difficult for me but I think it came out pretty well in the end. :)"}, {"post_id": 1054, "ts": "2026-06-02T21:13:05Z", "hours": 2.3611, "text": "Devlog # 1 This is my first project, and I am working on a clock website where you can check the time, set a stopwatch and timer (and maybe a Pomodoro timer). Coding it wan’t too much of a challenge, but I struggled getting the stopwatch to work; when I clicked stop, it kept running in the background so the time would keep going when I clicked start again. Also, I’m not very good at CSS, so it might be a challenge to get the program to look polished😅"}]...
|
Title: Clock Web App by @akshayK | Stardance
Devl Title: Clock Web App by @akshayK | Stardance
Devlogs:
Devlog # 1 This is my first project, and I am working on a clock website where you can check the time, set a stopwatch and timer (and maybe a Pomodoro timer). Coding it wan’t too much of a challenge, but I struggled getting the stopwatch to work; when I clicked stop, it kept running in the background so the time would keep going when I clicked start again. Also, I’m not very good at CSS, so it might be a challenge to get the program to look polished😅
Devlog #2 This is my second devlog for this project; I now finished implementing the code for the Timer portion and fixed some logic errors which were stopping my stopwatch from running correctly. I also learned CSS to add to the project to make it look polished. (I decided to give it a dark purple theme like dracula) Overall, this was difficult for me but I think it came out pretty well in the end. :)
Ships:
I made a clock web app using HTML, JS and CSS. It has a real-time clock, stopwatch and timer. Overall, I think the project was pretty cool and turned out well, but I did face a lot of challenges along the way. For example, I was really struggling with the stopwatch part, because no matter what I changed in the code, the time would either not change, the browser would freeze, or the time would have some extra zeros. I ended up learning CSS for this project, and I found it really fun to implement the color theme and the animations to the buttons. This project has taught me a lot about Javascript time control and CSS. Hope you like my project! -Akshay K...
|
1792969001.6767137
|
1793055401.6767137
|
|
2437
|
a paradoxical portfolio by @deltarunesangel | Star a paradoxical portfolio by @deltarunesangel | Stardance...
|
deltarunesangel
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-25T17:23:52Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "here’s what’s been made thus far… it’s unfinished, but all the major aspects of it (bg, bg music, links, etc.) work just fine. i had some trouble at first with the supabase linking aspect of my project but i managed to figure that out. now i have a cool lil guestbook :) anywho, this is my blood sweat and thankfully not tears. so happy to have a version out at long last", "repo": "https://github.com/deltarunesangel/actual-stuff", "demo": "https://deltarunesangel.github.io/actual-stuff/"}]...
|
[{"post_id": 4616, "ts": "2026 [{"post_id": 4616, "ts": "2026-06-08T00:06:53Z", "hours": 2.9322, "text": "FINALLY finished the guestbook (used supabase) and added background music for every tab!! 🎉 🥳 ✨"}, {"post_id": 2866, "ts": "2026-06-05T18:50:02Z", "hours": 2.4119, "text": "💫 Finished the Splash Screen and Set Up the Fading Transition! 💫"}, {"post_id": 1533, "ts": "2026-06-03T16:47:24Z", "hours": 0.8456, "text": "✨The Boring Basics Completed! (background, basic js, html framework, etc.) ✨"}]...
|
Title: a paradoxical portfolio by @deltarunesangel Title: a paradoxical portfolio by @deltarunesangel | Stardance
Devlogs:
✨The Boring Basics Completed! (background, basic js, html framework, etc.) ✨
💫 Finished the Splash Screen and Set Up the Fading Transition! 💫
FINALLY finished the guestbook (used supabase) and added background music for every tab!! 🎉 🥳 ✨
Ships:
here’s what’s been made thus far… it’s unfinished, but all the major aspects of it (bg, bg music, links, etc.) work just fine. i had some trouble at first with the supabase linking aspect of my project but i managed to figure that out. now i have a cool lil guestbook :) anywho, this is my blood sweat and thankfully not tears. so happy to have a version out at long last...
|
1792983116.9549663
|
1793069516.9549663
|
|
2449
|
JARVIS by @venkata_m | Stardance
|
venkata_m
|
1
|
185.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T03:43:55Z", "hours": 183.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!", "repo": "https://github.com/ONEPUNCHMAN411/Jarvis", "demo": "https://github.com/ONEPUNCHMAN411/Jarvis/releases/tag/v1.0"}]...
|
[{"post_id": 20335, "ts": "202 [{"post_id": 20335, "ts": "2026-07-01T22:14:14Z", "hours": 0.3053, "text": "Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes."}, {"post_id": 15797, "ts": "2026-06-25T17:55:55Z", "hours": 1.6942, "text": "Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!"}, {"post_id": 14850, "ts": "2026-06-24T03:31:24Z", "hours": 10.1603, "text": "I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!"}, {"post_id": 12651, "ts": "2026-06-20T17:48:15Z", "hours": 5.0919, "text": "Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!"}, {"post_id": 12047, "ts": "2026-06-19T17:27:56Z", "hours": 10.3764, "text": "I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now"}, {"post_id": 11708, "ts": "2026-06-19T02:11:45Z", "hours": 6.48, "text": "Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill"}, {"post_id": 11383, "ts": "2026-06-18T17:01:06Z", "hours": 4.5725, "text": "JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!"}, {"post_id": 11040, "ts": "2026-06-18T02:14:11Z", "hours": 4.8919, "text": "Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!"}, {"post_id": 10101, "ts": "2026-06-16T18:13:46Z", "hours": 2.2414, "text": "Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so"}, {"post_id": 9283, "ts": "2026-06-15T16:13:06Z", "hours": 6.445, "text": "Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!"}, {"post_id": 8963, "ts": "2026-06-14T22:20:52Z", "hours": 6.5175, "text": "Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!"}, {"post_id": 8736, "ts": "2026-06-14T15:12:03Z", "hours": 5.995, "text": "Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!"}, {"post_id": 8471, "ts": "2026-06-14T02:37:12Z", "hours": 2.4428, "text": "Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!"}, {"post_id": 8154, "ts": "2026-06-13T16:26:34Z", "hours": 7.3447, "text": "I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!"}, {"post_id": 7566, "ts": "2026-06-12T17:26:49Z", "hours": 7.3233, "text": "UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today"}, {"post_id": 6558, "ts": "2026-06-11T00:42:17Z", "hours": 6.9153, "text": "Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!"}, {"post_id": 6218, "ts": "2026-06-10T13:29:23Z", "hours": 7.2811, "text": "Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!"}, {"post_id": 5976, "ts": "2026-06-10T00:39:16Z", "hours": 5.2711, "text": "Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation"}, {"post_id": 5713, "ts": "2026-06-09T16:41:27Z", "hours": 8.9403, "text": "Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment)."}, {"post_id": 5355, "ts": "2026-06-09T02:58:46Z", "hours": 8.0947, "text": "Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon"}, {"post_id": 4995, "ts": "2026-06-08T17:17:58Z", "hours": 6.7908, "text": "Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!"}, {"post_id": 4607, "ts": "2026-06-07T23:42:36Z", "hours": 8.5611, "text": "Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!"}, {"post_id": 3979, "ts": "2026-06-07T03:46:54Z", "hours": 9.9158, "text": "Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you."}, {"post_id": 3624, "ts": "2026-06-06T17:15:11Z", "hours": 5.2022, "text": "Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision"}, {"post_id": 3270, "ts": "2026-06-06T03:42:51Z", "hours": 7.8389, "text": "Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day."}, {"post_id": 2789, "ts": "2026-06-05T16:31:05Z", "hours": 4.8008, "text": "Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features."}, {"post_id": 2517, "ts": "2026-06-05T01:37:56Z", "hours": 4.7686, "text": "Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!"}, {"post_id": 2203, "ts": "2026-06-04T15:55:41Z", "hours": 19.0556, "text": "Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol."}]...
|
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Title: JARVIS by @venkata_m | Stardance
Devlogs:
Made the main app and Just got mcp dev tools setup so you can attach extra tools if you want! Also made a bunch of bug patches because I realized it didnt work half the time lol.
Just finished working on a feature to connect remote SSH sessions to JARVIS so it can control your homelabs, Virtual Machines and more!
Finished UI and design thought Im definetly changing fonts. Now just gotta get the buttons working and we will be good until I start working on the features.
Fixed MCP crash, added SSH manager button, built a vision bridge so blind AI providers can “see” screenshots via text descriptions, added a typing feature that pairs with vision to type things, notes plugin, system monitor, clipboard history tracker, and a conversation summarizer. Productive day.
Added a local Moondream vision model so non-vision providers can still describe screenshots as text. Added a file converter plugin to convert, batch convert, and resize images between PNG, JPG, WEBP, BMP, TIFF, GIF, and ICO. Jarvis will be able to use these features through key words and convert and will auto use Moondream for providers without vision
Just got finished working on elevenlabs compatibility so you can choose your own voice for jarvis and also added a long term memory system using chromaDB. Also added video transcription so you can drag in any file and it will transcribe it and summarize it for you.
Got a lot of things done here! So first I made a quick usage tracker to keep track of your context window and usage on your AI provider. Second I got a browser plugin that can control a browser using playwright meaning it can use urls and use a browser as any human would. Finally, I added a camera vision feature so basiclly you can put any object on your camera (if you have one) and it will be able to tell things about it without you telling it what it is using moondream. Also built a sidepanel (not shown here) that allows you to pull up documents and images on the side of the jarvis app for quick access!
Got a Lot done while watching reddit stories lol! I added a pomodoro timer for students who want to use JARVIS as a study tool. Added ocr so it can read text out of images. Add image generation tab so you can generate your own custom images using dall-e 3. And also added a translate feature for all you language work! Got a lot more days of working ahead wish me good luck!
Just finished a long session but here is what I got done: Added a code executor tool so that JARVIS can directly execute any code it makes or you give it Added a context pin feature so that you can pin files, or important context to all conversations Added themes to let you customize what you do Added chat search (shouldve been here) so that you can search through all your previous chats Added media controller so that jarvis can control music and make reccomendations. Overall productive though I might take a break for 3-4 days soon
Got a lot done but definetly procrastinated too much because this should not have taken almost 9 hours. So I added a notification alert system so that JARVIS can now remind you of things from the new TO DO list feature OR the calender feature. Also added support for google calender so you can ask JARVIS to control that however you want. And finally I added a small network management system (just to find devices on your network, and be able to help you use them in a Homelab enviornment).
Got some things done nothing major but here it is: Added voice memo plugins to record and manage your voice memos VIA jarvis Added Habit & Time Tracker feature for when you need to manage your behavior with JARVIS Added Discord plugin for message management especially if you want to use jarvis in a Non-Profit Situation
Alright! Here is what I got done: Added template prompt system (just to get people ideas) Added bookmark Buttons for specific conversations you may want Added auto named chat sessions so you dont have to! Thats all for right now will continue working!
Just finished a good session here is what was added: Automatic Macro Making capabilities by jarvis as long as you describe it Scheduled prompts for repeated tasks that you want to happen at certain times Built in App Viewer so you can view the apps you developed from within jarvis Thats all for now will get back with more!
UI Redesign done will be making some tweaks here and there but also added these: Blender MCP to let JARVIS control blender for you 3D creative work Slack plugin to control your team’s slack work RAG system so you can upload pdfs, docx and more to chat with Thats all for today
I added some new cool features: Global Dictation meaning you can do CTRL+SHIFT+D anywhere and speak and it will type that into the text space Workspace Layouts so you can change your workspace based on what you are doing Screen annotation so that JARVIS can basiclly doodle on your screen to show you things Added small calender to the side for easy access Thats all for today will get back tommorow!
Nothing too much for this log but here is what I added: Phone Voice commands meaning you can open the webserver of JARVIS and have it send commands on your computer or do tasks for you! Smart autofill for when you are filling forms and dont want to keep having to fill them out just fill it out once and never again! Thats it for today!
Got a bunch of new features!: Added a smart scheduler program so you can have JARVIS manage time Added contact store so that JARVIS always remembers people Added region watcher so you can have jarvis monitor things while you are away Thats it for today!
Alright here is what was added: Postgresql query tool for all you database nerds out there Password file encryption vault for all your passwords to be stored locally and securely QR Code generator for all your needs Thats it not a lot but progress!
Here is what I got done: Added support for app testing so JARVIS can directly test any apps you make and report back to you Added api testing support to test all your apis Added image editor so you can quick edit you photos Great day looking forward to tommorow!
Made some small ui tweaks and fixed a LOT of bugs getting ready to ship in the next week or so
Just got features added here is what was done: App launch sequence so you can start a set of apps depending on what you are doing Window focus history to have better context for JARVIS with the apps you are using Follow for more updates and eventually use it!
JARVIS has new features! Added Folder and File cleanup feature to organize all your messes! Added Process watching so that JARVIS can keep an eye on tasks for you Thats the work for today!
Got more features ! Here is what I added:: Clipboard History Manager to help you remember the thing you wanted 30 days ago Usage analytics so you can track your usage across sessions and make sure you dont get a $5000 api bill
I didnt sleep all night for this but here is what I added: Browser bookmark imports and search capability so JARVIS can help you remember important sites Screenshot library so that JARVIS has improved context across sessions Conversation Personas so that the system prompt for JARVIS changes based on what you need Code Review Tool to help you do security, bug, and performance issues Thats it! im gon sleep now
Got efficent work done today!: Added context window auto compaction so you have less usage but have persistent context Diff Viewer to view any changes JARVIS makes to files Dry Run tools to make sure shell commands are safe Confidence meter to show if JARVIS is sure about its answer/code Style Transfer Rewrite for all your essays and pdfs This was the first offical time JARVIS was hooked up and tested with the new features because I spent so long trying to find a free api provider and I finally did. I will now be testing and showing all features from today!
I got a really long session in but its worth it here is all of what I did (PS: this is my last devlog am shipping): Removed test files and patch files Fixed UI lag (the orb made it super laggy) Fixed crashing upon clicking mcp button Fixed Minimized window launching Fixed a lot more but those are the major ones Added direct UI calling for any ui features on your computer Thank you all for following this journey I hope you enjoy this project!
Ok so I spent a couple hours Playing with JARVIS cuz I was bored waiting for shipping review and I found out that I used the wrong SDK method for elevenlabs and I know that is a huge deal for people who want the natural JARVIS voice so I went ahead and fixed that. Also got one of the buttons fixed (mcp) because even though I thought I fixed it, it seemed to have still crashed sometimes so I went ahead and changed that. This is the LAST offical devlog hopefully I am going to reship thanks!
Updated readme and actually made it my own (used a template before) and then clarified my ai usage in there too cuz it wasnt before. Will reship with some small changes.
Ships:
I made a windows desktop AI assistant called JARVIS (inspired from Iron Man) with full voice responsiveness. It can control your computer, automate tasks, and works with your favorite apps! It has multi-provider support so you can just plop in a API key of your choice! The parts that were challenging were trying to maintain gpu performance with local AI models running and a whisper model for optimal experience. Another challenge was finding a provider to actually use to start testing as Im poor (I mean I have no money but my parents rich) and just cant spend money on this. Somethings people should know to test. Expect JARVIS to pickup other input if you are talking and incorrect input at times too (whisper medium is the default change to heavy for better experience though slower response). Download JARVIS setup.exe install (run as admin) and make sure to pin to desktop to make sure its always there! You can hit CTRL + SHIFT + J to open JARVIS from anywhere. Overall I think you guys will enjoy this!...
|
1792878734.9896028
|
1793742734.9896028
|
|
2455
|
FRC Programming (Raycast Extension) by @pranay | S FRC Programming (Raycast Extension) by @pranay | Stardance...
|
pranay
|
1
|
10.0
|
165
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T00:50:10Z", "hours": 10.0, "multiplier": 17.25, "payout": 165, "blessing": "neutral", "text": "Hello everyone! I built a Raycast extension built for FRC (FIRST Robotics Competition) programmers. It basically has a couple of commands for looking up documentation and converting common FRC-specific units right inside Raycast instead of having a bunch of tabs open to do the same thing. If you haven’t used it, Raycast is a super fast keyboard launcher app where you can search, run commands, and build little custom extensions that can be then be used really easily on your computer. FRC is a robotics competition where high school teams build and program robots to compete in a game that changes every year, and WPILib is the software library most FRC teams use to write their robot’s code. What The Extension Does The extension has the following features: searchable WPILib Java and C++ documentation, a quick link to WPILib’s status light reference page for decoding hardware indicator lights, and a unit converter for things like velocity, angular velocity, torque, and force that come up sometimes when writing robot code and just robot stuff in general. Instead of scraping documentation webpages, the Java and C++ commands pull the same search index files that power each site’s own search bar, parse them into something usable, and cache the results so repeat searches are instant rather than re-fetching every time. Roadblocks Adding the Python documentation feature was a huge headache since the url I was pulling the search data from kept randomly blocking requests and instead sent a Cloudflare auth page (which is a good thing, I’m not saying human auth pages are bad), and nothing I tried got around it consistently. I eventually had to just cut the feature from the extension. Aside from that, there was a lot of annoying bug hunting in the unit converter, you know the kind where you try and hit flies with your hands, but you simply can’t move fast enough. Anyway, I also had to figure out how to use markdown (the detail panels in Raycast use markdown) and make it look good. That learning started as an annoying process due to markdown’s limitations, but it actually became quite fun trying to work around those limitations. What I’m proud of I’m most proud of the unit converter. Though the Java and C++ documentation search are more useful, I just had a really fun time mapping out the logic for the unit converter and actually coding it when compared to the documentation search features. This is also the first time I’ve built something intended for other people to use. I’ve always coded random passion projects in my free time, but actually shipping something that’s actually useful for other people is a huge first for me. Try it Out The Try it Out button takes you to instructions that tell you how to install the extension. Sorry that the process is a hassle, but until Raycast approves the extension, this is the only way to share the project with people.", "repo": "https://github.com/helloGithub326/FRC-Programming-Raycast-Extension", "demo": "https://www.raycast.com/helloGithub326/frc-programming"}]...
|
[{"post_id": 10950, "ts": "202 [{"post_id": 10950, "ts": "2026-06-17T23:16:34Z", "hours": 1.1394, "text": "Devlog 05 Finished cleaning up the repo and wrote a temporary file explaining how to manually install the extension, then submitted it to Raycast for review. Raycast’s review bot then caught a handful of bugs I hadn’t noticed. So, I fixed those bugs and pushed those changes. I also swapped the C++ documentation code out for code that safely parsing the data as plain JSON instead of using eval, so it only ever reads data and never executes anything. During that process, I also got a bunch of TypeScript errors due to not properly giving everything an object type. The extension is now in Raycast’s review queue. Next up is just waiting on that, and addressing anything else reviewers flag. In the meanwhile, anyone that wants to try out the extension can manually install it using the Try it Out link."}, {"post_id": 10710, "ts": "2026-06-17T15:59:46Z", "hours": 1.8261, "text": "Devlog 04 The Python documentation feature turned out to be very annoying. The search index url I am using to fetch the documentation was being way too inconsistent. Half the time, it gave the data and half the time, it gave back a Cloudflare auth page. So I decided to drop that feature entirely. Here is the search index url I was using in case anyone knows how to get past the auth page: https://robotpy.readthedocs.io/projects/robotpy/en/stable/searchindex.js . The screenshot shows what is supposed to fetched from this url. I also built a feature to look up status indicator lights for various FRC hardware components, but realized there’s already a single webpage that has all of this information laid out well. So instead of rebuilding that information inside the extension, the feature now just opens that webpage directly. Next up, I’m going to finish tidying up the repo, write a temporary instructions file explaining how to manually install the extension (since it isn’t live yet), and submit it to Raycast for review so it can be officially published."}, {"post_id": 10306, "ts": "2026-06-16T23:26:11Z", "hours": 2.7492, "text": "Devlog 03 I improved how the extension fetches the Java documentation. Instead of fetching 600 something URLs (one for each class in the WPILib library), it now only fetches one search index URL. I also got the C++ documentation lookup feature working. Unfortunately, the C++ documentation’s search data doesn’t include as much detail as the Java one. It doesn’t tell you what functions each class has, so the C++ results are a bit more bare-bones for now. You can see what it looks like in the attached screenshot. I’m currently working on adding Python documentation support. It’s been a bit annoying since the search index URL for the Python docs sometimes is sending HTML instead of javascript. Once I get that fixed, I can finally get to the motor/sensor lookup feature."}, {"post_id": 1108, "ts": "2026-06-02T22:49:58Z", "hours": 3.6142, "text": "Devlog 02 The extension can now fetch the Java WPILib (the library mainly used in FRC) documentation and display all the classes and methods in the library. Once you fetch the documentation (takes ~one minute), you only have to fetch it again when you want to update what you have cached. Tomorrow’s plans are to show descriptions of classes, show descriptions of methods, and add either Python or C++ WPILib documentation."}, {"post_id": 476, "ts": "2026-06-01T22:43:13Z", "hours": 0.7608, "text": "Devlog 01 As of right now, the unit converter (the command in the video) is the only part of the extension that is completely done. Most of the unit converter was done last week. Today, I added the action menu so that you can copy the answer and quickly put it in the search bar. In the future, I plan on adding a WPILib (the main library used for First Robotics Competition coding) documentation viewer, a motor/sensor status lookup, and a robot status monitor (that would be in the menu bar). Posting this early the development in order to get some feedback."}]...
|
Title: FRC Programming (Raycast Extension) by @pra Title: FRC Programming (Raycast Extension) by @pranay | Stardance
Devlogs:
Devlog 01 As of right now, the unit converter (the command in the video) is the only part of the extension that is completely done. Most of the unit converter was done last week. Today, I added the action menu so that you can copy the answer and quickly put it in the search bar. In the future, I plan on adding a WPILib (the main library used for First Robotics Competition coding) documentation viewer, a motor/sensor status lookup, and a robot status monitor (that would be in the menu bar). Posting this early the development in order to get some feedback.
Devlog 02 The extension can now fetch the Java WPILib (the library mainly used in FRC) documentation and display all the classes and methods in the library. Once you fetch the documentation (takes ~one minute), you only have to fetch it again when you want to update what you have cached. Tomorrow’s plans are to show descriptions of classes, show descriptions of methods, and add either Python or C++ WPILib documentation.
Devlog 03 I improved how the extension fetches the Java documentation. Instead of fetching 600 something URLs (one for each class in the WPILib library), it now only fetches one search index URL. I also got the C++ documentation lookup feature working. Unfortunately, the C++ documentation’s search data doesn’t include as much detail as the Java one. It doesn’t tell you what functions each class has, so the C++ results are a bit more bare-bones for now. You can see what it looks like in the attached screenshot. I’m currently working on adding Python documentation support. It’s been a bit annoying since the search index URL for the Python docs sometimes is sending HTML instead of javascript. Once I get that fixed, I can finally get to the motor/sensor lookup feature.
Devlog 04 The Python documentation feature turned out to be very annoying. The search index url I am using to fetch the documentation was being way too inconsistent. Half the time, it gave the data and half the time, it gave back a Cloudflare auth page. So I decided to drop that feature entirely. Here is the search index url I was using in case anyone knows how to get past the auth page: https://robotpy.readthedocs.io/projects/robotpy/en/stable/searchindex.js . The screenshot shows what is supposed to fetched from this url. I also built a feature to look up status indicator lights for various FRC hardware components, but realized there’s already a single webpage that has all of this information laid out well. So instead of rebuilding that information inside the extension, the feature now just opens that webpage directly. Next up, I’m going to finish tidying up the repo, write a temporary instructions file explaining how to manually install the extension (since it isn’t live yet), and submit it to Raycast for review so it can be officially published.
Devlog 05 Finished cleaning up the repo and wrote a temporary file explaining how to manually install the extension, then submitted it to Raycast for review. Raycast’s review bot then caught a handful of bugs I hadn’t noticed. So, I fixed those bugs and pushed those changes. I also swapped the C++ documentation code out for code that safely parsing the data as plain JSON instead of using eval, so it only ever reads data and never executes anything. During that process, I also got a bunch of TypeScript errors due to not properly giving everything an object type. The extension is now in Raycast’s review queue. Next up is just waiting on that, and addressing anything else reviewers flag. In the meanwhile, anyone that wants to try out the extension can manually install it using the Try it Out link.
Ships:
Hello everyone! I built a Raycast extension built for FRC (FIRST Robotics Competition) programmers. It basically has a couple of commands for looking up documentation and converting common FRC-specific units right inside Raycast instead of having a bunch of tabs open to do the same thing. If you haven’t used it, Raycast is a super fast keyboard launcher app where you can search, run commands, and build little custom extensions that can be then be used really easily on your computer. FRC is a robotics competition where high school teams build and program robots to compete in a game that changes every year, and WPILib is the software library most FRC teams use to write their robot’s code. What The Extension Does The extension has the following features: searchable WPILib Java and C++ documentation, a quick link to WPILib’s status light reference page for decoding hardware indicator lights, and a unit converter for things like velocity, angular velocity, torque, and force that come up sometimes when writing robot code and just robot stuff in general. Instead of scraping documentation webpages, the Java and C++ commands pull the same search index files that power each site’s own search bar, parse them into something usable, and cache the results so repeat searches are instant rather than re-fetching every time. Roadblocks Adding the Python documentation feature was a huge headache since the url I was pulling the search data from kept randomly blocking requests and instead sent a Cloudflare auth page (which is a good thing, I’m not saying human auth pages are bad), and nothing I tried got around it consistently. I eventually had to just cut the feature from the extension. Aside from that, there was a lot of annoying bug hunting in the unit converter, you know the kind where you try and hit flies with your hands, but you simply can’t move fast enough. Anyway, I also had to figure out how to use markdown (the detail panels in Raycast use markdown) and make it look good. That learning started as an annoying process due to markdown’s limitations, but it actually became quite fun trying to work around those limitations. What I’m proud of I’m most proud of the unit converter. Though the Java and C++ documentation search are more useful, I just had a really fun time mapping out the logic for the unit converter and actually coding it when compared to the documentation search features. This is also the first time I’ve built something intended for other people to use. I’ve always coded random passion projects in my free time, but actually shipping something that’s actually useful for other people is a huge first for me. Try it Out The Try it Out button takes you to instructions that tell you how to install the extension. Sorry that the process is a hassle, but until Raycast approves the extension, this is the only way to share the project with people....
|
1793000928.8218906
|
1793087328.8218906
|
|
2485
|
Pocket Universe by @theinfamousben | Stardance
|
theinfamousben
|
1
|
24.4
|
167
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-11T21:37:22Z", "hours": 23.0, "multiplier": 7.37, "payout": 167, "blessing": "neutral", "text": "Ship 1 Hey guys! I’m proud to announce I’ve developed Pocket Universe to an acceptable degree - with more updates coming soon! Why did I publish so soon? I have a few projects coming up (haven-related) and I want to get this out of the way so I don’t have any unfinished business. What is this project anyways? Pocket Universe is an Interactive Incremental game, which focuses on building up our modern universe from scratch, meaning from the fundamental Interactions up all the way to Galaxies and Nebulae What’s Included in the game right now? I have 4 Generator nodes and 7 Upgrade nodes, with the framework built to add more quickly. Was AI used in this Project? Yes. I used a lot of AI for troubleshooting my final build, as I’ve never built for MacOS and the web before. I also used AI to generate the placeholder SVG images, which will be replaced once the game reaches an alpha / open beta stage.", "repo": "https://github.com/theinfamousben/pocket-universe", "demo": "https://benmudev.itch.io/pocket-universe"}]...
|
[{"post_id": 76232, "ts": "202 [{"post_id": 76232, "ts": "2026-10-02T19:44:55Z", "hours": 1.3992, "text": "Devlog 15 - Trying to make it look a bit better Changes Added Modal Background Moved Menu and Energy Display into Top Bar ** AI was used to generate an SVG for the modal background and to fix the positioning of the elements ** Notes I originally only shipped this project because I thought The event was going to end soon and I was gonna be busy with Haven, but now since the event has been extended, I figured I can continue working on it :)"}, {"post_id": 66193, "ts": "2026-09-11T21:12:27Z", "hours": 2.2889, "text": "Devlog 14 - I am an IDIOT Changes Recreated all SOs to fix their attached script Build 5 broken and 1 working prototype Remove quarks as a resource Add menu with exit button Notes I am the definition of stupid. I had a problem for 2 WHOLE HOURS, and the fix was simply putting the script for the SOs into its own file. I am my own worst enemy, because of my own stupidity. Well, the more you know."}, {"post_id": 63204, "ts": "2026-09-06T21:30:11Z", "hours": 1.4367, "text": "Devlog 13 - double parents :3 Changes Allowed multiple parents per node Fixed false dragging assertions Notes I’m almost done with the base game mechanics, after that it’s just textures, sounds, and gameplay and then I’m ready for my first ship!"}, {"post_id": 63049, "ts": "2026-09-06T16:59:35Z", "hours": 0.9769, "text": "Devlog 12 Changes Added button colors for hover, select, and normal events made button in the Node Info modal uninteractible if node is locked fixed unlocked check for Upgrade Nodes"}, {"post_id": 62782, "ts": "2026-09-06T09:26:48Z", "hours": 0.6336, "text": "Devlog 11 - wow it finally looks okay Changes Added Icons Made NodeInfo Effect Text yellow AI was used to create the icons - This is temporary * until I figure out how to use Inkscape Notes Didn’t do a lot of programming, and unity refused to track my time for some reason, i did more like an hour, so its not a big deal"}, {"post_id": 61042, "ts": "2026-09-03T19:06:58Z", "hours": 1.1097, "text": "Devlog 10 Changes Added 6 Nodes Added 3 Generator Nodes Added 3 Upgrade Nodes Implemented handling of locked/invisible nodes Locked nodes now won’t be able to be bought unless the parent node is bought at least once Nodes behind a locked node are invisible until the locked node is bought Notes This is fun! I’m working on the game mechanics and I’m not running into a lot of issues. All my bugs (except one) were caught pretty early on, so its a win in my book :] That brings me to the one bug, the bane of my existence… For some bizarre reason, clicking on my nodes doesn’t buy them regularly. Sometimes i need to click many many times, and in the log it doesn’t even register that I clicked the nodes! Maybe it has something to do with the epsilon value which i use to distinguish between dragging the screen and selecting a node, which currently evaluates epsilon before the mouseup event, so maybe i can switch it around and it’ll work. maybe… other than that I’m pretty happy with how it’s turning out. I am a bit worried about making textures, though, since they all look like some weird corporate/ai generated logo because i’m not good enough at art / graphic design"}, {"post_id": 60388, "ts": "2026-09-02T18:05:02Z", "hours": 1.29, "text": "Devlog 9 Changes Completed Node Info Box Header Description for the Node Effect, basically what the node does Button to buy the node Added 2 Starting nodes 1 Generator Node named “Fundamental Interaction” 1 Upgrade Node named “Strong Nuclear Force” AI was used in this timespan for troubleshooting max width for the Node info box Notes This was honestly very fun to work on. I’ve really started putting in more time for this project since I’m now under pressure to get it done by the end of summer break (2 weeks :p) I had little trouble figuring everything out, and thanks to some wonderful help from my buddy github copilot i was never truly stuck on anything in this timespan"}, {"post_id": 58253, "ts": "2026-08-30T16:50:28Z", "hours": 1.5778, "text": "Devlog 8 Changes Added Node Info Text Box Shows Title, info about the node, and a button to buy with a set price Refactored Node Script Structure Notes I have been saved by the power of abstract classes! I unified the nodes into one abstract Node class, and made completion classes for Generators and Upgrades. Now it works by simply accessing the base Node class instead of not knowing whether the class is GeneratorNode or UpgradeNode. This makes it much easier. I am planning now to get some interesting node names from physics, like building up from quarks to larger structures, and i also am going to make some textures so the game doesnt look as shitty :p"}, {"post_id": 55915, "ts": "2026-08-27T19:56:21Z", "hours": 2.7292, "text": "Devlog 7.1 Changes Added Line Drawn to Parent node Will be used for hierarchical unlocking in the future Started work on the sidebar Notes Yeah, I’m a bit screwed. The current structure of my nodes is kind of weird; I have two types of nodes: Generators and Upgrades, each having two unique scripts. That’s good, because they have different logic. Thats not so good because they also share some logic. That’s horrific because they sometimes need to be accessed interchangeably. So here are a few things i could do: Merge both scripts into one, with an enum or something for the different node types Make a base which both nodes can inherit and use give up and cry option 3 sounds the easiest right now, my brain is so broken :’)"}, {"post_id": 17851, "ts": "2026-06-28T19:52:53Z", "hours": 3.2889, "text": "Devlog 7 Changes Added Modal Functionality Test Modal for debug purposes Alert Modal for important stuff (save on exit, etc.) Made HUD better for cross-device formatting Included a vertical layout group for all of the displayed currencies Notes It’s been a bit annoying, to say the least. First off, I wanted the Modals to be completely modular from the start, but I kept getting NullReference errors that didn’t make sense to me, so I had to make a script for each modal type and serialize the GameObjects and other stuff individually. It’s not as modular as I want, but what can ya do :p As for the HUD, I hope it works across devices, I sometimes code on my MacBook and sometimes on my PC, and the layout always breaks. I haven’t tested it yet, so I’ll be as surprised as you are if it doesn’t work."}, {"post_id": 13688, "ts": "2026-06-22T13:15:29Z", "hours": 0.8022, "text": "Devlog 6 Changes Added Generator Production cost: Each generator can now require a certain amount of every resource Notes This is a rather small update, but I’m still trying to get back on my feet from my hiatus. More updates coming soon though, I’ve got some more motivation *By the way: If there’s anyone that would like to do some texture designing, I would be more than happy to accept your work! Credit is, of course, guaranteed (I’m working on a credit screen anyways ;p)."}, {"post_id": 12119, "ts": "2026-06-19T19:58:45Z", "hours": 1.2919, "text": "Devlog 5 Changes Added code to allow for generation of different resource types Notes I have been on a long creative block, I can’t really seem to pick up my laptop and continue coding. It might have a bit to do with the fact that I was very busy the last week or so, so i didn’t have much energy and motivation left to program. I kind of forced myself to implement this feature which i half-assed earlier this week, it’s really simple but it’s a start at getting more motivated :) Next week I don’t have as many exams, pressure from DLRG tests and all that stuff, so I’ll have more time to code :]"}, {"post_id": 5092, "ts": "2026-06-08T19:37:39Z", "hours": 1.9783, "text": "Devlog 4 Changes Added functionality to pan & zoom around Moved the HUD (Energy Display) into a separate canvas Notes this took me longer than I’d like to admit, because Unity was being a bit finicky about my GameObject and refused to run its code for some reason. I used AI for troubleshooting the problem, but used none of its code."}, {"post_id": 3443, "ts": "2026-06-06T11:51:02Z", "hours": 1.1675, "text": "Devlog 3 I have continued my work on Pocket Universe, and have added following: Split Node Prefabs into Generator and Upgrade Nodes Added a NodeBoost Scriptable Object Worked on Node Visibility Logic One problem I have is that a lot of the code for Generator and Upgrade Nodes is identical. I would have made a Node Monobehavior script that handles both and individual sub-classes, but that is kind of messy, at least for now. We will see in about 5 Devlogs if I made the right choice :p"}, {"post_id": 3060, "ts": "2026-06-05T23:01:54Z", "hours": 1.4725, "text": "Devlog 2 - Added Nodes for generation These nodes are clickable by the player in order to buy Generators, which create Energy or other resources. They are comparable to the Cell to Singularity nodes. There will be Generator and Upgrade Nodes; Generator Nodes will be able to be bought multiple times, while upgrade nodes will only be able to be bought once."}, {"post_id": 2356, "ts": "2026-06-04T20:06:13Z", "hours": 0.6289, "text": "Starting work This is a really ambitious project I doubt I’ll be able to finish completely by October, but I’ll try to get as far as possible, so lets see :3"}]...
|
Title: Pocket Universe by @theinfamousben | Starda Title: Pocket Universe by @theinfamousben | Stardance
Devlogs:
Starting work This is a really ambitious project I doubt I’ll be able to finish completely by October, but I’ll try to get as far as possible, so lets see :3
Devlog 2 - Added Nodes for generation These nodes are clickable by the player in order to buy Generators, which create Energy or other resources. They are comparable to the Cell to Singularity nodes. There will be Generator and Upgrade Nodes; Generator Nodes will be able to be bought multiple times, while upgrade nodes will only be able to be bought once.
Devlog 3 I have continued my work on Pocket Universe, and have added following: Split Node Prefabs into Generator and Upgrade Nodes Added a NodeBoost Scriptable Object Worked on Node Visibility Logic One problem I have is that a lot of the code for Generator and Upgrade Nodes is identical. I would have made a Node Monobehavior script that handles both and individual sub-classes, but that is kind of messy, at least for now. We will see in about 5 Devlogs if I made the right choice :p
Devlog 4 Changes Added functionality to pan & zoom around Moved the HUD (Energy Display) into a separate canvas Notes this took me longer than I’d like to admit, because Unity was being a bit finicky about my GameObject and refused to run its code for some reason. I used AI for troubleshooting the problem, but used none of its code.
Devlog 5 Changes Added code to allow for generation of different resource types Notes I have been on a long creative block, I can’t really seem to pick up my laptop and continue coding. It might have a bit to do with the fact that I was very busy the last week or so, so i didn’t have much energy and motivation left to program. I kind of forced myself to implement this feature which i half-assed earlier this week, it’s really simple but it’s a start at getting more motivated :) Next week I don’t have as many exams, pressure from DLRG tests and all that stuff, so I’ll have more time to code :]
Devlog 6 Changes Added Generator Production cost: Each generator can now require a certain amount of every resource Notes This is a rather small update, but I’m still trying to get back on my feet from my hiatus. More updates coming soon though, I’ve got some more motivation *By the way: If there’s anyone that would like to do some texture designing, I would be more than happy to accept your work! Credit is, of course, guaranteed (I’m working on a credit screen anyways ;p).
Devlog 7 Changes Added Modal Functionality Test Modal for debug purposes Alert Modal for important stuff (save on exit, etc.) Made HUD better for cross-device formatting Included a vertical layout group for all of the displayed currencies Notes It’s been a bit annoying, to say the least. First off, I wanted the Modals to be completely modular from the start, but I kept getting NullReference errors that didn’t make sense to me, so I had to make a script for each modal type and serialize the GameObjects and other stuff individually. It’s not as modular as I want, but what can ya do :p As for the HUD, I hope it works across devices, I sometimes code on my MacBook and sometimes on my PC, and the layout always breaks. I haven’t tested it yet, so I’ll be as surprised as you are if it doesn’t work.
Devlog 7.1 Changes Added Line Drawn to Parent node Will be used for hierarchical unlocking in the future Started work on the sidebar Notes Yeah, I’m a bit screwed. The current structure of my nodes is kind of weird; I have two types of nodes: Generators and Upgrades, each having two unique scripts. That’s good, because they have different logic. Thats not so good because they also share some logic. That’s horrific because they sometimes need to be accessed interchangeably. So here are a few things i could do: Merge both scripts into one, with an enum or something for the different node types Make a base which both nodes can inherit and use give up and cry option 3 sounds the easiest right now, my brain is so broken :’)
Devlog 8 Changes Added Node Info Text Box Shows Title, info about the node, and a button to buy with a set price Refactored Node Script Structure Notes I have been saved by the power of abstract classes! I unified the nodes into one abstract Node class, and made completion classes for Generators and Upgrades. Now it works by simply accessing the base Node class instead of not knowing whether the class is GeneratorNode or UpgradeNode. This makes it much easier. I am planning now to get some interesting node names from physics, like building up from quarks to larger structures, and i also am going to make some textures so the game doesnt look as shitty :p
Devlog 9 Changes Completed Node Info Box Header Description for the Node Effect, basically what the node does Button to buy the node Added 2 Starting nodes 1 Generator Node named “Fundamental Interaction” 1 Upgrade Node named “Strong Nuclear Force” AI was used in this timespan for troubleshooting max width for the Node info box Notes This was honestly very fun to work on. I’ve really started putting in more time for this project since I’m now under pressure to get it done by the end of summer break (2 weeks :p) I had little trouble figuring everything out, and thanks to some wonderful help from my buddy github copilot i was never truly stuck on anything in this timespan
Devlog 10 Changes Added 6 Nodes Added 3 Generator Nodes Added 3 Upgrade Nodes Implemented handling of locked/invisible nodes Locked nodes now won’t be able to be bought unless the parent node is bought at least once Nodes behind a locked node are invisible until the locked node is bought Notes This is fun! I’m working on the game mechanics and I’m not running into a lot of issues. All my bugs (except one) were caught pretty early on, so its a win in my book :] That brings me to the one bug, the bane of my existence… For some bizarre reason, clicking on my nodes doesn’t buy them regularly. Sometimes i need to click many many times, and in the log it doesn’t even register that I clicked the nodes! Maybe it has something to do with the epsilon value which i use to distinguish between dragging the screen and selecting a node, which currently evaluates epsilon before the mouseup event, so maybe i can switch it around and it’ll work. maybe… other than that I’m pretty happy with how it’s turning out. I am a bit worried about making textures, though, since they all look like some weird corporate/ai generated logo because i’m not good enough at art / graphic design
Devlog 11 - wow it finally looks okay Changes Added Icons Made NodeInfo Effect Text yellow AI was used to create the icons - This is temporary * until I figure out how to use Inkscape Notes Didn’t do a lot of programming, and unity refused to track my time for some reason, i did more like an hour, so its not a big deal
Devlog 12 Changes Added button colors for hover, select, and normal events made button in the Node Info modal uninteractible if node is locked fixed unlocked check for Upgrade Nodes
Devlog 13 - double parents :3 Changes Allowed multiple parents per node Fixed false dragging assertions Notes I’m almost done with the base game mechanics, after that it’s just textures, sounds, and gameplay and then I’m ready for my first ship!
Devlog 14 - I am an IDIOT Changes Recreated all SOs to fix their attached script Build 5 broken and 1 working prototype Remove quarks as a resource Add menu with exit button Notes I am the definition of stupid. I had a problem for 2 WHOLE HOURS, and the fix was simply putting the script for the SOs into its own file. I am my own worst enemy, because of my own stupidity. Well, the more you know.
Devlog 15 - Trying to make it look a bit better Changes Added Modal Background Moved Menu and Energy Display into Top Bar ** AI was used to generate an SVG for the modal background and to fix the positioning of the elements ** Notes I originally only shipped this project because I thought The event was going to end soon and I was gonna be busy with Haven, but now since the event has been extended, I figured I can continue working on it :)
Ships:
Ship 1 Hey guys! I’m proud to announce I’ve developed Pocket Universe to an acceptable degree - with more updates coming soon! Why did I publish so soon? I have a few projects coming up (haven-related) and I want to get this out of the way so I don’t have any unfinished business. What is this project anyways? Pocket Universe is an Interactive Incremental game, which focuses on building up our modern universe from scratch, meaning from the fundamental Interactions up all the way to Galaxies and Nebulae What’s Included in the game right now? I have 4 Generator nodes and 7 Upgrade nodes, with the framework built to add more quickly. Was AI used in this Project? Yes. I used a lot of AI for troubleshooting my final build, as I’ve never built for MacOS and the web before. I also used AI to generate the placeholder SVG images, which will be replaced once the game reaches an alpha / open beta stage....
|
1793004535.9274673
|
1793090935.9274673
|
|
2519
|
Handcryption by @some_guy_named_joe | Stardance
|
some_guy_named_joe
|
1
|
34.0
|
168
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T19:51:05Z", "hours": 34.0, "multiplier": 5.0, "payout": 168, "blessing": "neutral", "text": "I made a hardware-based encrypted peer-to-peer messaging device built on CircuitPython (ESP32-S2). It is able to send text messages to others of this device over http using a Raspberry Pi Server. I have to hold off of the audio side, as this device uses an analog microphone, which does not record great audio. However, the texting portion works really well. I built all of this in less than two weeks in order to qualify for Hack Club Outpost. I hope you like it!", "repo": "https://github.com/Joethebeast-coder/Handheld-Encryption-Device", "demo": ""}]...
|
[{"post_id": 47644, "ts": "202 [{"post_id": 47644, "ts": "2026-08-15T17:51:11Z", "hours": 3.1564, "text": "FINAL Handcryption Build Sorry if its been so long, I have been doing a lot this summer, but here is what happened over the past month. (Time shown does not reflect time spent, as hackatime wasn’t working when I was coding and I didn’t record the building process) So, I was able to assemble 1 working device with the one working e-ink display I had left. I was on a time crunch as I was trying to qualify for Outpost. I was able to submit it in time, and I shipped it for Outpost. The device has all the previously specified features, such as peer-to-peer messaging and message history. The microphone and speaker are very weird, as they are analog, so the audio quality is questionable. However, the project works great! At Outpost, I had a really good time with my fellow Hack Clubbers. Thank you Hack Club for making this all possible. (P.S. You should allow me to remove my request for funding and submit it normally)."}, {"post_id": 13986, "ts": "2026-06-22T23:09:13Z", "hours": 1.3697, "text": "Handcryption Status Update 0.1.1 This is a short update. I am currently waiting for funding, but I was able to design some button caps in CAD. I really hope I get S tier so I can get to Open Sauce Update On Me: My schedule is super packed. I’m starting to regret taking on a lot of things this summer."}, {"post_id": 12557, "ts": "2026-06-20T14:46:54Z", "hours": 1.6814, "text": "Handcryption Status Update 0.1 What’s Happening? So, I have been able to clean up everything in my code. I have added comments and the ability to connect to Wi-Fi. All of my code has been uploaded to GitHub for review for funding. Also on GitHub are my 3D models. Be aware that the part models’ heights are an estimate based on the total height of the part given (if that makes sense). When printing the cover, I am planning to swap the filament from PLA to TPU to make the pads holding the buttons squishy. I am a little disappointed that the hackatime in my VS Code editor stopped recording time, and I lost 2 hours, but I will just use Lapse from now on. GitHub Repo"}, {"post_id": 11631, "ts": "2026-06-18T23:03:51Z", "hours": 1.6394, "text": "Hancryption Status Update 0.0.4 What Happened? So, I added in one last new feature to my code: voice messages. In order to play the audio, I have decided to ditch the piezo and use an actual speaker breakout, and I have updated the BOM on my Github as such (check the last devlog). Other than that, I have been cleaning and debugging the code, and adding in comments; all to get it ready to request for funding. For some reason, my hackatime on the Stardance website isn’t synced with what my Hackatime dashboard says. So, I’m posting this much eariler than I would have wanted in hopes to fix that issue. What’s Next? Sneak Peak at Funding Request Version Timeline"}, {"post_id": 9595, "ts": "2026-06-16T00:04:46Z", "hours": 3.2939, "text": "Handcryption Status Update 0.0.3.9 What Happened? Ok, big change to the workings of this device. Previously, this device could only work locally, but through my Raspberry Pi server and a domain through ngrok, I can make the device work on the cloud, and I have altered the server code and main device code to work this way. Also, instead of using IPs to identify devices, I am using my own identification system that is like a phone number, a sequence of 9 digits. I recognize that this may be a small number of available sequences, but for now, it is a good amount. I can change this later. So, to send messages now, instead of using a socket, the device sends an HTTP request to the ngrok domain hosted by the Pi. The request includes the message, the destination’s ID, and the sender’s (the device’s) ID. The server then stores this information in a “mailbox” -a collection of all sent messages. The receiving device, every 2 seconds, is sending an HTTP request to the server asking if there is anything in its mailbox. If so, the server returns the message(s) with the sender ID so the receiver can match that to a contact. The cloud update has made my overall code length shorter, as most of the long sequences of code have been simplified to shorter HTTP requests. Also, as promised, this is my part BOM: https://github.com/Joethebeast-coder/Handheld-Encryption-Device/tree/main/Hardware What’s Next in 0.0.4? - Extra Add-on Device Features - Maybe more website interactivity"}, {"post_id": 8069, "ts": "2026-06-13T14:05:00Z", "hours": 5.1436, "text": "Handcryption Status Update 0.0.3.6 What Happened? I added a cool new feature to the Handcryption device-GROUP CHATS!! This allows every user with a Handcryption device who opts to join the group to participate in conversations, fostering a more connected experience among users. I learned how to use Flask (thanks to GeeksforGeeks), which enabled me to seamlessly integrate the group chat feature into the server code running on the Raspberry Pi. In addition to the chat functionality, there is now a website hosted on the Raspberry Pi’s IP address that displays all the messages in the group chat. The caveat is that every message on the website is shown in its encrypted form to maintain security and confidentiality. Looking ahead, I plan to implement a feature that would allow Handcryption users to sign in to the website. This will enable them to view messages in a decrypted format, enhancing user experience while still prioritizing privacy. I believe these developments will significantly improve user engagement and create a more dynamic platform for communication. My device(s) are becoming more and more like a phone What’s next? - Preliminary BOM - Increase Website Functionality - Timeline Estimation - Code Cleanup and Extra Features Photo Description: Some of the server code for the group chat"}, {"post_id": 6401, "ts": "2026-06-10T19:27:12Z", "hours": 2.5883, "text": "Handcryption Status Update 0.0.3.5 What Happened? I was able to set up a server on my Raspberry Pi 4 with the help of Copilot (I do not know Flask in the slightest). So now, when a device wants to send a message, the audio recording is sent to the Pi, requesting that it be translated to text. I’ve been experimenting with Claude on making a website to monitor the server’s status, but I will talk about that more in a later update if I decide to go that route. Today, I was able to make a CAD model of the housing of the device (The process of which is posted on Lapse). I have to admit, it looks a lot like the phreakers from the early days of calling. What’s Next? - Decision on whether to pursue web monitoring - Preliminary BOM - Timeline Estimation - Extra Features for the Device"}, {"post_id": 5790, "ts": "2026-06-09T18:22:30Z", "hours": 4.0547, "text": "Handcryption Status Update 0.0.3.2 (Big News) What Happened? So, I was able to add in a UI that includes settings, contacts, message history, as well as battery status. In the settings, the user can change the volume of the piezo, as well as clear the files on their device (Contacts, Known IPs, and Message History. When hovering over a choice, the icon (the volume icon, for example) repeatedly switches from inverted to normal. However, while I was debugging, I found a MAJOR problem. My measly ESP32 microcontroller doesn’t have enough CPU and RAM to run the speech-to-text model. However, I can pivot from this by using the VOSK model paired with my Raspberry Pi 4 that I have on hand as a server to run the model for the microcontroller. This opens up a whole new possibility. We can now have a main hub that monitors the devices, serves the speech-to-text requests, and sends the text back. What’s Next? - Speech-to-text code for the Raspberry Pi - Communication Protocol between the device and Pi"}, {"post_id": 4972, "ts": "2026-06-08T16:55:09Z", "hours": 4.4942, "text": "Hancryption Status Update 0.0.3 (Combined) What Happened in 0.0.2.3? I have created a parts list for this project: Adafruit: - Adafruit Electret Microphone Amplifier - MAX4466 with Adjustable Gain - Adafruit 2.13” Monochrome eInk / ePaper Display with SRAM - 250x122 Monochrome with SSD1680 - Adafruit ESP32-S2 Feather - 4 MB Flash + 2 MB PSRAM - STEMMA QT / Qwiic - Lithium Ion Polymer Battery - 3.7v 100mAh - Tactile Button switch (6mm) x 20 pack - Small Enclosed Piezo w/Wires I have decided to use the Adafruit ESP32-S2 Feather as my microcontroller, as it takes care of the LiPoly battery charging, so I don’t have to buy extra parts for it. I can also charge the battery through the USB-C on the board. It also has many GPIO pins that I can give to my e-Ink display, as well as the switches (6). What Happened in 0.0.2.5? I created a wiring diagram for the components listed in the parts list. The time-lapse can be seen on Lapse*. *I forgot to add the piezo in the time-lapse, and I wired the SDA and SCL pins to buttons, which was not supposed to happen, so later, I added the piezo, and moved the button wires to spare analog pins. You can see these in the screenshot below. What Happened in 0.0.3? I made a complete draft of the code for the device. I added all of the button logic and basic e-ink display code. I added a loading screen with “HANCRYPTION” in block text and a sleep screen. To “power down”, when the user holds the power button for more than 1 second, it goes into deep-sleep, which is basically off for microcontrollers. If it is less than that, it just goes idle. Of course, this is not the final code. I will keep adding more and more features that are compatible with the current set of parts I already have. What’s Next in 0.0.4? -Extra UI Features -Possibility of Games"}, {"post_id": 3197, "ts": "2026-06-06T00:44:42Z", "hours": 2.9586, "text": "Hancryption Status Update 0.0.2.1 What Happened? I patched some bugs in the client class so I could add a main loop for the device. When the device is sending, it is the server, and in any other circumstance, it is the client, it is idle and waiting for a message. I added the button and microphone logic for the specific components. I need to add the logic for the eink display"}, {"post_id": 2526, "ts": "2026-06-05T01:55:38Z", "hours": 1.7911, "text": "Hancryption Status Update 0.0.2 What Happened? I added classes for server and client communication so the device could be either. I also added the encryption feature, which generates a unique key for each known IP address. The network also includes a client status check that occurs every 15 seconds, in which the client sends its IP address to the server. What’s Next in 0.0.3? Full draft code for a device. This will include all of the machine programming for the ESP32 chip, which is for the microphone, eink screen, and buttons. By 0.0.2.3, a draft parts list should be complete. By 0.0.2.5, a wiring diagram should be complete."}, {"post_id": 1210, "ts": "2026-06-03T02:05:14Z", "hours": 0.3333, "text": "Handcryption Status Update 0.0.1.5 What’s New? I created a rough sketch of the device. I also wrote down a tentative list of parts I would need. See Below 0.0.2 Should be released by 6/4/26. *Note: I completely forgot about the screen and the parts needed for that. LCD 3 buttons"}, {"post_id": 1073, "ts": "2026-06-02T21:44:37Z", "hours": 1.1033, "text": "Hancryption Status Update 0.0.1 I have created the basic logic framework for the speech-to-text with processing. I am currently using many placeholders, however. Will be updating that by 0.0.4 at the latest. For encryption, I am using my previously developed “Cencrypt” Python library. What’s Next in 0.0.2? Networking Framework Encryption Setup"}]...
|
Title: Handcryption by @some_guy_named_joe | Stard Title: Handcryption by @some_guy_named_joe | Stardance
Devlogs:
Hancryption Status Update 0.0.1 I have created the basic logic framework for the speech-to-text with processing. I am currently using many placeholders, however. Will be updating that by 0.0.4 at the latest. For encryption, I am using my previously developed “Cencrypt” Python library. What’s Next in 0.0.2? Networking Framework Encryption Setup
Handcryption Status Update 0.0.1.5 What’s New? I created a rough sketch of the device. I also wrote down a tentative list of parts I would need. See Below 0.0.2 Should be released by 6/4/26. *Note: I completely forgot about the screen and the parts needed for that. LCD 3 buttons
Hancryption Status Update 0.0.2 What Happened? I added classes for server and client communication so the device could be either. I also added the encryption feature, which generates a unique key for each known IP address. The network also includes a client status check that occurs every 15 seconds, in which the client sends its IP address to the server. What’s Next in 0.0.3? Full draft code for a device. This will include all of the machine programming for the ESP32 chip, which is for the microphone, eink screen, and buttons. By 0.0.2.3, a draft parts list should be complete. By 0.0.2.5, a wiring diagram should be complete.
Hancryption Status Update 0.0.2.1 What Happened? I patched some bugs in the client class so I could add a main loop for the device. When the device is sending, it is the server, and in any other circumstance, it is the client, it is idle and waiting for a message. I added the button and microphone logic for the specific components. I need to add the logic for the eink display
Hancryption Status Update 0.0.3 (Combined) What Happened in 0.0.2.3? I have created a parts list for this project: Adafruit: - Adafruit Electret Microphone Amplifier - MAX4466 with Adjustable Gain - Adafruit 2.13” Monochrome eInk / ePaper Display with SRAM - 250x122 Monochrome with SSD1680 - Adafruit ESP32-S2 Feather - 4 MB Flash + 2 MB PSRAM - STEMMA QT / Qwiic - Lithium Ion Polymer Battery - 3.7v 100mAh - Tactile Button switch (6mm) x 20 pack - Small Enclosed Piezo w/Wires I have decided to use the Adafruit ESP32-S2 Feather as my microcontroller, as it takes care of the LiPoly battery charging, so I don’t have to buy extra parts for it. I can also charge the battery through the USB-C on the board. It also has many GPIO pins that I can give to my e-Ink display, as well as the switches (6). What Happened in 0.0.2.5? I created a wiring diagram for the components listed in the parts list. The time-lapse can be seen on Lapse*. *I forgot to add the piezo in the time-lapse, and I wired the SDA and SCL pins to buttons, which was not supposed to happen, so later, I added the piezo, and moved the button wires to spare analog pins. You can see these in the screenshot below. What Happened in 0.0.3? I made a complete draft of the code for the device. I added all of the button logic and basic e-ink display code. I added a loading screen with “HANCRYPTION” in block text and a sleep screen. To “power down”, when the user holds the power button for more than 1 second, it goes into deep-sleep, which is basically off for microcontrollers. If it is less than that, it just goes idle. Of course, this is not the final code. I will keep adding more and more features that are compatible with the current set of parts I already have. What’s Next in 0.0.4? -Extra UI Features -Possibility of Games
Handcryption Status Update 0.0.3.2 (Big News) What Happened? So, I was able to add in a UI that includes settings, contacts, message history, as well as battery status. In the settings, the user can change the volume of the piezo, as well as clear the files on their device (Contacts, Known IPs, and Message History. When hovering over a choice, the icon (the volume icon, for example) repeatedly switches from inverted to normal. However, while I was debugging, I found a MAJOR problem. My measly ESP32 microcontroller doesn’t have enough CPU and RAM to run the speech-to-text model. However, I can pivot from this by using the VOSK model paired with my Raspberry Pi 4 that I have on hand as a server to run the model for the microcontroller. This opens up a whole new possibility. We can now have a main hub that monitors the devices, serves the speech-to-text requests, and sends the text back. What’s Next? - Speech-to-text code for the Raspberry Pi - Communication Protocol between the device and Pi
Handcryption Status Update 0.0.3.5 What Happened? I was able to set up a server on my Raspberry Pi 4 with the help of Copilot (I do not know Flask in the slightest). So now, when a device wants to send a message, the audio recording is sent to the Pi, requesting that it be translated to text. I’ve been experimenting with Claude on making a website to monitor the server’s status, but I will talk about that more in a later update if I decide to go that route. Today, I was able to make a CAD model of the housing of the device (The process of which is posted on Lapse). I have to admit, it looks a lot like the phreakers from the early days of calling. What’s Next? - Decision on whether to pursue web monitoring - Preliminary BOM - Timeline Estimation - Extra Features for the Device
Handcryption Status Update 0.0.3.6 What Happened? I added a cool new feature to the Handcryption device-GROUP CHATS!! This allows every user with a Handcryption device who opts to join the group to participate in conversations, fostering a more connected experience among users. I learned how to use Flask (thanks to GeeksforGeeks), which enabled me to seamlessly integrate the group chat feature into the server code running on the Raspberry Pi. In addition to the chat functionality, there is now a website hosted on the Raspberry Pi’s IP address that displays all the messages in the group chat. The caveat is that every message on the website is shown in its encrypted form to maintain security and confidentiality. Looking ahead, I plan to implement a feature that would allow Handcryption users to sign in to the website. This will enable them to view messages in a decrypted format, enhancing user experience while still prioritizing privacy. I believe these developments will significantly improve user engagement and create a more dynamic platform for communication. My device(s) are becoming more and more like a phone What’s next? - Preliminary BOM - Increase Website Functionality - Timeline Estimation - Code Cleanup and Extra Features Photo Description: Some of the server code for the group chat
Handcryption Status Update 0.0.3.9 What Happened? Ok, big change to the workings of this device. Previously, this device could only work locally, but through my Raspberry Pi server and a domain through ngrok, I can make the device work on the cloud, and I have altered the server code and main device code to work this way. Also, instead of using IPs to identify devices, I am using my own identification system that is like a phone number, a sequence of 9 digits. I recognize that this may be a small number of available sequences, but for now, it is a good amount. I can change this later. So, to send messages now, instead of using a socket, the device sends an HTTP request to the ngrok domain hosted by the Pi. The request includes the message, the destination’s ID, and the sender’s (the device’s) ID. The server then stores this information in a “mailbox” -a collection of all sent messages. The receiving device, every 2 seconds, is sending an HTTP request to the server asking if there is anything in its mailbox. If so, the server returns the message(s) with the sender ID so the receiver can match that to a contact. The cloud update has made my overall code length shorter, as most of the long sequences of code have been simplified to shorter HTTP requests. Also, as promised, this is my part BOM: https://github.com/Joethebeast-coder/Handheld-Encryption-Device/tree/main/Hardware What’s Next in 0.0.4? - Extra Add-on Device Features - Maybe more website interactivity
Hancryption Status Update 0.0.4 What Happened? So, I added in one last new feature to my code: voice messages. In order to play the audio, I have decided to ditch the piezo and use an actual speaker breakout, and I have updated the BOM on my Github as such (check the last devlog). Other than that, I have been cleaning and debugging the code, and adding in comments; all to get it ready to request for funding. For some reason, my hackatime on the Stardance website isn’t synced with what my Hackatime dashboard says. So, I’m posting this much eariler than I would have wanted in hopes to fix that issue. What’s Next? Sneak Peak at Funding Request Version Timeline
Handcryption Status Update 0.1 What’s Happening? So, I have been able to clean up everything in my code. I have added comments and the ability to connect to Wi-Fi. All of my code has been uploaded to GitHub for review for funding. Also on GitHub are my 3D models. Be aware that the part models’ heights are an estimate based on the total height of the part given (if that makes sense). When printing the cover, I am planning to swap the filament from PLA to TPU to make the pads holding the buttons squishy. I am a little disappointed that the hackatime in my VS Code editor stopped recording time, and I lost 2 hours, but I will just use Lapse from now on. GitHub Repo
Handcryption Status Update 0.1.1 This is a short update. I am currently waiting for funding, but I was able to design some button caps in CAD. I really hope I get S tier so I can get to Open Sauce Update On Me: My schedule is super packed. I’m starting to regret taking on a lot of things this summer.
FINAL Handcryption Build Sorry if its been so long, I have been doing a lot this summer, but here is what happened over the past month. (Time shown does not reflect time spent, as hackatime wasn’t working when I was coding and I didn’t record the building process) So, I was able to assemble 1 working device with the one working e-ink display I had left. I was on a time crunch as I was trying to qualify for Outpost. I was able to submit it in time, and I shipped it for Outpost. The device has all the previously specified features, such as peer-to-peer messaging and message history. The microphone and speaker are very weird, as they are analog, so the audio quality is questionable. However, the project works great! At Outpost, I had a really good time with my fellow Hack Clubbers. Thank you Hack Club for making this all possible. (P.S. You should allow me to remove my request for funding and submit it normally).
Ships:
I made a hardware-based encrypted peer-to-peer messaging device built on CircuitPython (ESP32-S2). It is able to send text messages to others of this device over http using a Raspberry Pi Server. I have to hold off of the audio side, as this device uses an analog microphone, which does not record great audio. However, the texting portion works really well. I built all of this in less than two weeks in order to qualify for Hack Club Outpost. I hope you like it!...
|
1792997490.5106902
|
1793083890.5106902
|
|
2537
|
JADE by @justin_m_baratta | Stardance
|
justin_m_baratta
|
1
|
25.0
|
242
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T23:44:30Z", "hours": 25.0, "multiplier": 11.58, "payout": 242, "blessing": "neutral", "text": "I made JADE, a Siri/Alexa like desktop assistant that uses an rpi + agents to listen to and execute requests. If you say the wakeword “JADE”, then a request like “What’s the weather today?”, it will process the audio into text using the mini mic on the rpi and a speech-to-text engine, send it to an agent (whose tools are filtered with an embedding model then passed to it) and speak the response using the speaker connected to a mini-amp on the raspberry pi. It was difficult learning how to work with a raspberrypi, because this was my first time doing anything with an rpi. I had to teach myself how to solder, and connect wires to a breadboard to the raspberrypi. I’m proud of the work I’ve accomplished in this project, and it has taught me a lot about how to use a raspberrypi and work with agents!", "repo": "https://github.com/Justino4631/JADE", "demo": "https://youtube.com/shorts/tLxb-KHST4U?feature=share"}]...
|
[{"post_id": 43061, "ts": "202 [{"post_id": 43061, "ts": "2026-08-08T03:54:12Z", "hours": 13.9811, "text": "JADE pretty much complete! Its been a while since the last devlog, I know. I’ve been really busy these past couple weeks of summer and have not been able to post, though I was able to work on JADE a little bit every day until its pretty much as done as it is now. To start, the pipeline of JADE is finished, tested, and functional. For hardware, using a mini microphone, mini amp, mini speaker, a breadboard, and lots of jumper wires, I was able to make my first “hardware project” connected to a raspberry pi. The pipeline of waiting for a wakeword (“JADE”), then activating once hearing the wakeword and using a speech to text engine to process audio (all using the microphone), then sending the request to an agent, which will output a message that will be played using text to speech on the mini speaker, all works! Some things I tweaked were, for one, the agentic architecture. Originally, I had a global agent that controlled 5 sub-agents that specialized in specific tasks (e.g. calendar agent, weather agent, etc…) but ended up switching to a one-agent structure that uses an embedding model beforehand to filter for the 5 most relevant tools before passing the query and appropriate tools to the agent. I did this because running multiple agents using the strands API on a raspberrypi is extremely computationally intensive and makes the pi reboot itself. Additionally, the slack tools and slack agent were deleted because they were too complicated and did not fit into the scope of this small project. The calendar tools were also refactored to interface with Google Calendar. All in all, the pipeline works, and this was a great project wherein I learned how to write code and set up a raspberry pi, use agents, and use audio I/O, all which definitely improved my abilities as a programmer. Expect a ship soon!"}, {"post_id": 17275, "ts": "2026-06-28T00:14:53Z", "hours": 2.6511, "text": "Updates on JADE! So! A lot of stuff has happened since the last devlog. I went to Boston last week which is why I wasn’t able to do too much, but I’ve done a lot with the actual hardware component the last couple days… I finished the first iteration of my tools. I have five mini-agents that control tools on the weather, web, calendar, writing (journals, notes, todos), and slack. These are controlled by a kind of global agent. Basically, it takes in the query from the user and selects one of the mini-agents to use, which will then select the tool to use. This was a kind of experiment to see how well agents would interface and control other agents, but it worked well from my testing! I was able to solder pins onto a mini-amplifier, connect a speaker to it, and connect that to my raspberry pi 4 using jumper cables. I wrote a test of the microphone in python and it makes noise! However, I think I must’ve messed up the soldering or something because the audio quality is pretty bad… I started on the Alexa/Siri-like component of the project by training an openwakeword wake-word model on the word “Jade” and am experimenting with having it work better in noisier environments. It does detect when I say “Jade”, which is awesome! Once I solder my mini-microphone and connect it to the pi, I should be able to run the full pipeline. Here are my next steps: Finish “Jade” Wake Word Model + test Train or implement speech to text model, test connection with global agent Connect + test microphone to see if speech to text and wake word run on rpi from mic Fix speaker or solder new speaker and test audio Connect agent response to speaker and test full pipeline"}, {"post_id": 8954, "ts": "2026-06-14T21:55:22Z", "hours": 2.2292, "text": "Writing tools complete- the agent is able to make, edit, and delete todo lists, notes and journals! Mostly tested so far. On the hardware side, I finished soldering everything so I am now able to connect amplifier and speaker to the pi, though not the microphone bc i dont have anough jumpers :( . will start writing software on the pi for connecting and using the speaker and amp."}, {"post_id": 6458, "ts": "2026-06-10T21:21:49Z", "hours": 2.2139, "text": "Finished slack agent/slackbot + tested. Able to read messages from channels and DMs, write and send messages in channels and DMs, reply to threads, get latest messages, search for a keyword."}, {"post_id": 3804, "ts": "2026-06-06T21:07:40Z", "hours": 1.7192, "text": "Web Tools class done + tested! Agent is able to search for a definition (webster dictionary), topic (wikipedia), current news headlines (news API), stock prices (yfinance) and summarize results!"}, {"post_id": 2428, "ts": "2026-06-04T22:07:52Z", "hours": 0.7111, "text": "Weather class completed + tested- agent able to tell current weather conditions and forecasts"}, {"post_id": 2347, "ts": "2026-06-04T19:52:43Z", "hours": 1.3569, "text": "Calendar class for my desktop assistant. Uses Strands API to create classes and methods whose tools the agent that connects to the rpi can use. This first class/tool the global agent can use is finished, a basic calendar to keep track of important stuff."}]...
|
Title: JADE by @justin_m_baratta | Stardance
Devl Title: JADE by @justin_m_baratta | Stardance
Devlogs:
Calendar class for my desktop assistant. Uses Strands API to create classes and methods whose tools the agent that connects to the rpi can use. This first class/tool the global agent can use is finished, a basic calendar to keep track of important stuff.
Weather class completed + tested- agent able to tell current weather conditions and forecasts
Web Tools class done + tested! Agent is able to search for a definition (webster dictionary), topic (wikipedia), current news headlines (news API), stock prices (yfinance) and summarize results!
Finished slack agent/slackbot + tested. Able to read messages from channels and DMs, write and send messages in channels and DMs, reply to threads, get latest messages, search for a keyword.
Writing tools complete- the agent is able to make, edit, and delete todo lists, notes and journals! Mostly tested so far. On the hardware side, I finished soldering everything so I am now able to connect amplifier and speaker to the pi, though not the microphone bc i dont have anough jumpers :( . will start writing software on the pi for connecting and using the speaker and amp.
Updates on JADE! So! A lot of stuff has happened since the last devlog. I went to Boston last week which is why I wasn’t able to do too much, but I’ve done a lot with the actual hardware component the last couple days… I finished the first iteration of my tools. I have five mini-agents that control tools on the weather, web, calendar, writing (journals, notes, todos), and slack. These are controlled by a kind of global agent. Basically, it takes in the query from the user and selects one of the mini-agents to use, which will then select the tool to use. This was a kind of experiment to see how well agents would interface and control other agents, but it worked well from my testing! I was able to solder pins onto a mini-amplifier, connect a speaker to it, and connect that to my raspberry pi 4 using jumper cables. I wrote a test of the microphone in python and it makes noise! However, I think I must’ve messed up the soldering or something because the audio quality is pretty bad… I started on the Alexa/Siri-like component of the project by training an openwakeword wake-word model on the word “Jade” and am experimenting with having it work better in noisier environments. It does detect when I say “Jade”, which is awesome! Once I solder my mini-microphone and connect it to the pi, I should be able to run the full pipeline. Here are my next steps: Finish “Jade” Wake Word Model + test Train or implement speech to text model, test connection with global agent Connect + test microphone to see if speech to text and wake word run on rpi from mic Fix speaker or solder new speaker and test audio Connect agent response to speaker and test full pipeline
JADE pretty much complete! Its been a while since the last devlog, I know. I’ve been really busy these past couple weeks of summer and have not been able to post, though I was able to work on JADE a little bit every day until its pretty much as done as it is now. To start, the pipeline of JADE is finished, tested, and functional. For hardware, using a mini microphone, mini amp, mini speaker, a breadboard, and lots of jumper wires, I was able to make my first “hardware project” connected to a raspberry pi. The pipeline of waiting for a wakeword (“JADE”), then activating once hearing the wakeword and using a speech to text engine to process audio (all using the microphone), then sending the request to an agent, which will output a message that will be played using text to speech on the mini speaker, all works! Some things I tweaked were, for one, the agentic architecture. Originally, I had a global agent that controlled 5 sub-agents that specialized in specific tasks (e.g. calendar agent, weather agent, etc…) but ended up switching to a one-agent structure that uses an embedding model beforehand to filter for the 5 most relevant tools before passing the query and appropriate tools to the agent. I did this because running multiple agents using the strands API on a raspberrypi is extremely computationally intensive and makes the pi reboot itself. Additionally, the slack tools and slack agent were deleted because they were too complicated and did not fit into the scope of this small project. The calendar tools were also refactored to interface with Google Calendar. All in all, the pipeline works, and this was a great project wherein I learned how to write code and set up a raspberry pi, use agents, and use audio I/O, all which definitely improved my abilities as a programmer. Expect a ship soon!
Ships:
I made JADE, a Siri/Alexa like desktop assistant that uses an rpi + agents to listen to and execute requests. If you say the wakeword “JADE”, then a request like “What’s the weather today?”, it will process the audio into text using the mini mic on the rpi and a speech-to-text engine, send it to an agent (whose tools are filtered with an embedding model then passed to it) and speak the response using the speaker connected to a mini-amp on the raspberry pi. It was difficult learning how to work with a raspberrypi, because this was my first time doing anything with an rpi. I had to teach myself how to solder, and connect wires to a breadboard to the raspberrypi. I’m proud of the work I’ve accomplished in this project, and it has taught me a lot about how to use a raspberrypi and work with agents!...
|
1792979310.969031
|
1793065710.969031
|
|
2556
|
My awesome macropad! by @bengordon | Stardance
|
bengordon
|
1
|
1.0
|
4
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T13:15:55Z", "hours": 1.0, "multiplier": 5.0, "payout": 4, "blessing": "neutral", "text": "I built a macropad. This was my first project so I followed the tutorial. Figuring out PCB editor was challenging.", "repo": "https://github.com/bengordon7777-del/HackPad", "demo": ""}]...
|
[{"post_id": 2158, "ts": "2026 [{"post_id": 2158, "ts": "2026-06-04T14:30:24Z", "hours": 0.8933, "text": "I built a macropad. This is my first PCB so I followed the guide but formatted and chose the keys to be in a wasd format ."}]...
|
Title: My awesome macropad! by @bengordon | Starda Title: My awesome macropad! by @bengordon | Stardance
Devlogs:
I built a macropad. This is my first PCB so I followed the guide but formatted and chose the keys to be in a wasd format .
Ships:
I built a macropad. This was my first project so I followed the tutorial. Figuring out PCB editor was challenging....
|
1792983009.4926968
|
1793069409.4926968
|
|
2564
|
My first slack bot! by @heisenberg | Stardance
|
heisenberg
|
1
|
1.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T17:29:14Z", "hours": 1.0, "multiplier": 3.46, "payout": 3, "blessing": "neutral", "text": "I made a simple slack bot as my first mission, 0xF. It’s a very simple bot with some useful slash commands like: /0x-dict [word] - this tell you the meaning, phonetic, origin, and pronunciation. It uses the free api.dictionaryapi.dev /0x-url - this will will give you a short url, you can also have a custom alias", "repo": "https://github.com/xxeisenberg/slack-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0266FRGV"}]...
|
[{"post_id": 902, "ts": "2026- [{"post_id": 902, "ts": "2026-06-02T17:05:47Z", "hours": 0.53, "text": "Finished the bot!"}, {"post_id": 746, "ts": "2026-06-02T11:37:29Z", "hours": 0.3233, "text": "Just hosted my first slack bot on nest! I am planning to add other slash commands"}]...
|
Title: My first slack bot! by @heisenberg | Starda Title: My first slack bot! by @heisenberg | Stardance
Devlogs:
Just hosted my first slack bot on nest! I am planning to add other slash commands
Finished the bot!
Ships:
I made a simple slack bot as my first mission, 0xF. It’s a very simple bot with some useful slash commands like: /0x-dict [word] - this tell you the meaning, phonetic, origin, and pronunciation. It uses the free api.dictionaryapi.dev /0x-url - this will will give you a short url, you can also have a custom alias...
|
1792997492.636609
|
1793083892.636609
|
|
2575
|
Potato by @Andre | Stardance
|
Andre
|
1
|
26.0
|
142
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T09:37:07Z", "hours": 26.0, "multiplier": 5.99, "payout": 142, "blessing": "neutral", "text": "I made a simple 2D platformer with enemies and collectibles, I found making the code for the level select menu as my biggest challenge. To anyone playing my game I did play test every single level all of them are possible and the last level’s flag is not broken the only way to beat the game is the secret exit:)", "repo": "https://github.com/agandregordon-del/Potato/tree/agandregordon-del-patch-2", "demo": "https://agandre.itch.io/potato"}]...
|
[{"post_id": 4043, "ts": "2026 [{"post_id": 4043, "ts": "2026-06-07T07:01:05Z", "hours": 1.3344, "text": "I have been working on my game for a little bit now and I can finally say I finished I love what I have created now I just need to attach it to GitHub and then I can start a new project!"}, {"post_id": 3861, "ts": "2026-06-06T22:41:02Z", "hours": 3.9964, "text": "I’ve been working for a while now and have all my levels up to level 6 finished I tried really hard to post a play testing video but it just wouldn’t work so here is a pic of level 6."}, {"post_id": 2531, "ts": "2026-06-05T01:59:19Z", "hours": 5.7269, "text": "I have been coding for a while now most of the almost 6 hours I’m logging now have been spent on coding a basic level select screen but now that I’m done with that I can start working on making levels 4-10 of my game then I’m done and can start a new project!"}, {"post_id": 1912, "ts": "2026-06-04T04:22:12Z", "hours": 3.3639, "text": "I have now finished the second level wasn’t nearly as hard as the first with all the coding involved"}, {"post_id": 1681, "ts": "2026-06-03T20:36:01Z", "hours": 11.8567, "text": "I’ve been working on my game for a little bit now and I finally have the first level completely done with enemies that respawn you platforms to jump on and a finish that sends you to the next level!"}]...
|
Title: Potato by @Andre | Stardance
Devlogs:
I’ve Title: Potato by @Andre | Stardance
Devlogs:
I’ve been working on my game for a little bit now and I finally have the first level completely done with enemies that respawn you platforms to jump on and a finish that sends you to the next level!
I have now finished the second level wasn’t nearly as hard as the first with all the coding involved
I have been coding for a while now most of the almost 6 hours I’m logging now have been spent on coding a basic level select screen but now that I’m done with that I can start working on making levels 4-10 of my game then I’m done and can start a new project!
I’ve been working for a while now and have all my levels up to level 6 finished I tried really hard to post a play testing video but it just wouldn’t work so here is a pic of level 6.
I have been working on my game for a little bit now and I can finally say I finished I love what I have created now I just need to attach it to GitHub and then I can start a new project!
Ships:
I made a simple 2D platformer with enemies and collectibles, I found making the code for the level select menu as my biggest challenge. To anyone playing my game I did play test every single level all of them are possible and the last level’s flag is not broken the only way to beat the game is the secret exit:)...
|
1792986788.401838
|
1793073188.401838
|
|
2590
|
My first slack bot! by @Temi | Stardance
|
Temi
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T12:22:04Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a rudimentary slack bot with a focus on productivity functions. The key functions: /tbot-ping — Checks bot responsiveness and displays latency. /tbot-catfact — Fetches and returns a random cat fact. /tbot-joke — Fetches and returns a random joke. /tbot-weather — Retrieves and displays current weather information. /tbot-todo add — Adds a task to the user’s todo list. /tbot-todo list — Lists all tasks in the user’s todo list. /tbot-todo remove — Removes a task by its number. /tbot-todo clear — Clears the user’s entire todo list. /tbot-help — Displays the list of available commands. This project was quite interesting as it was my first step into coding in java script. This led to my having to figure out a lot of syntax issues and how java script deals with things different to python. This was also my first time have to make sure something is able to run 24/7 through a server so I’m quite interested in getting to understand how servers work. How to test my bot: head to the Hackclub slack and try out any of the commands.", "repo": "https://github.com/StealthTD7/Tbot", "demo": "https://slack.hackclub.com/"}]...
|
[{"post_id": 1325, "ts": "2026 [{"post_id": 1325, "ts": "2026-06-03T08:13:27Z", "hours": 0.9464, "text": "Just got Weather implemented! Had some struggles figuring out how to use the api and managing my github but eventually got weather down. To do list next."}, {"post_id": 973, "ts": "2026-06-02T19:06:18Z", "hours": 0.4361, "text": "Started building a basic Slack bot aiming to implement daily weather reports into the bot while also adding productivity features like todo lists on to the chat bot. But just basic functionality for now."}]...
|
Title: My first slack bot! by @Temi | Stardance
D Title: My first slack bot! by @Temi | Stardance
Devlogs:
Started building a basic Slack bot aiming to implement daily weather reports into the bot while also adding productivity features like todo lists on to the chat bot. But just basic functionality for now.
Just got Weather implemented! Had some struggles figuring out how to use the api and managing my github but eventually got weather down. To do list next.
Ships:
I made a rudimentary slack bot with a focus on productivity functions. The key functions: /tbot-ping — Checks bot responsiveness and displays latency. /tbot-catfact — Fetches and returns a random cat fact. /tbot-joke — Fetches and returns a random joke. /tbot-weather — Retrieves and displays current weather information. /tbot-todo add — Adds a task to the user’s todo list. /tbot-todo list — Lists all tasks in the user’s todo list. /tbot-todo remove — Removes a task by its number. /tbot-todo clear — Clears the user’s entire todo list. /tbot-help — Displays the list of available commands. This project was quite interesting as it was my first step into coding in java script. This led to my having to figure out a lot of syntax issues and how java script deals with things different to python. This was also my first time have to make sure something is able to run 24/7 through a server so I’m quite interested in getting to understand how servers work. How to test my bot: head to the Hackclub slack and try out any of the commands....
|
1792976152.2894053
|
1793062552.2894053
|